mustard-claude 3.0.1 ā 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/commands/init.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { existsSync, readdirSync } from 'fs';
|
|
2
|
-
import { mkdir, copyFile, cp } from 'fs/promises';
|
|
2
|
+
import { mkdir, copyFile, cp, writeFile } from 'fs/promises';
|
|
3
3
|
import { join, resolve, dirname } from 'path';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
|
+
import { execSync } from 'child_process';
|
|
5
6
|
import chalk from 'chalk';
|
|
6
7
|
import ora from 'ora';
|
|
7
8
|
import inquirer from 'inquirer';
|
|
@@ -101,8 +102,143 @@ export async function initCommand(options) {
|
|
|
101
102
|
count; // already counted
|
|
102
103
|
}
|
|
103
104
|
spinner.succeed(`Copied ${count} files to .claude/`);
|
|
105
|
+
// Generate mustard.json (git flow config)
|
|
106
|
+
await generateMustardJson(projectPath, options);
|
|
104
107
|
printNextSteps();
|
|
105
108
|
}
|
|
109
|
+
function detectDefaultBranch() {
|
|
110
|
+
try {
|
|
111
|
+
const ref = execSync('git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null', { encoding: 'utf-8' }).trim();
|
|
112
|
+
return ref.replace('refs/remotes/origin/', '');
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
try {
|
|
116
|
+
// Fallback: check if main or master exists
|
|
117
|
+
const branches = execSync('git branch -r', { encoding: 'utf-8' });
|
|
118
|
+
if (branches.includes('origin/main'))
|
|
119
|
+
return 'main';
|
|
120
|
+
if (branches.includes('origin/master'))
|
|
121
|
+
return 'master';
|
|
122
|
+
}
|
|
123
|
+
catch { /* not a git repo */ }
|
|
124
|
+
return 'main';
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function detectHasSubmodules() {
|
|
128
|
+
try {
|
|
129
|
+
return existsSync(join(process.cwd(), '.gitmodules'));
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function detectCurrentBranch() {
|
|
136
|
+
try {
|
|
137
|
+
return execSync('git rev-parse --abbrev-ref HEAD', { encoding: 'utf-8' }).trim();
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
function detectRemoteBranches() {
|
|
144
|
+
try {
|
|
145
|
+
const output = execSync('git branch -r --format="%(refname:short)"', { encoding: 'utf-8' });
|
|
146
|
+
return output.split('\n').filter(Boolean).map(b => b.replace('origin/', ''));
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
return [];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async function generateMustardJson(projectPath, options) {
|
|
153
|
+
const configPath = join(projectPath, 'mustard.json');
|
|
154
|
+
if (existsSync(configPath)) {
|
|
155
|
+
console.log(chalk.gray('\n mustard.json already exists ā preserved'));
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const defaultBranch = detectDefaultBranch();
|
|
159
|
+
const hasSubmodules = detectHasSubmodules();
|
|
160
|
+
const currentBranch = detectCurrentBranch();
|
|
161
|
+
const remoteBranches = detectRemoteBranches();
|
|
162
|
+
const hasDevBranch = remoteBranches.includes('dev') || remoteBranches.includes('develop');
|
|
163
|
+
console.log(chalk.bold('\nš Git Flow Configuration\n'));
|
|
164
|
+
if (currentBranch) {
|
|
165
|
+
console.log(chalk.gray(` Detected: branch=${currentBranch}, default=${defaultBranch}, submodules=${hasSubmodules}`));
|
|
166
|
+
if (hasDevBranch)
|
|
167
|
+
console.log(chalk.gray(` Found dev branch: ${remoteBranches.includes('dev') ? 'dev' : 'develop'}`));
|
|
168
|
+
console.log();
|
|
169
|
+
}
|
|
170
|
+
let config;
|
|
171
|
+
if (options.yes) {
|
|
172
|
+
// Auto-config with sensible defaults
|
|
173
|
+
const flow = {};
|
|
174
|
+
if (hasDevBranch) {
|
|
175
|
+
flow['dev_*'] = remoteBranches.includes('dev') ? 'dev' : 'develop';
|
|
176
|
+
flow[remoteBranches.includes('dev') ? 'dev' : 'develop'] = defaultBranch;
|
|
177
|
+
}
|
|
178
|
+
config = {
|
|
179
|
+
git: {
|
|
180
|
+
flow,
|
|
181
|
+
pr: { enabled: true, provider: 'github' },
|
|
182
|
+
submodules: hasSubmodules
|
|
183
|
+
}
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
// Interactive setup
|
|
188
|
+
const answers = await inquirer.prompt([
|
|
189
|
+
{
|
|
190
|
+
type: 'input',
|
|
191
|
+
name: 'production',
|
|
192
|
+
message: 'Production branch:',
|
|
193
|
+
default: defaultBranch
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
type: 'input',
|
|
197
|
+
name: 'devBranch',
|
|
198
|
+
message: 'Development branch (shared, leave empty to skip):',
|
|
199
|
+
default: hasDevBranch ? (remoteBranches.includes('dev') ? 'dev' : 'develop') : ''
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
type: 'input',
|
|
203
|
+
name: 'devPattern',
|
|
204
|
+
message: 'Personal branch pattern (glob ā dev branch):',
|
|
205
|
+
default: 'dev_*',
|
|
206
|
+
when: (a) => !!a.devBranch
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
type: 'confirm',
|
|
210
|
+
name: 'prEnabled',
|
|
211
|
+
message: 'Use Pull Requests for merging?',
|
|
212
|
+
default: true
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
type: 'list',
|
|
216
|
+
name: 'provider',
|
|
217
|
+
message: 'Git provider:',
|
|
218
|
+
choices: ['github', 'gitlab', 'bitbucket'],
|
|
219
|
+
default: 'github',
|
|
220
|
+
when: (a) => a.prEnabled
|
|
221
|
+
}
|
|
222
|
+
]);
|
|
223
|
+
const flow = {};
|
|
224
|
+
if (answers.devBranch) {
|
|
225
|
+
if (answers.devPattern) {
|
|
226
|
+
flow[answers.devPattern] = answers.devBranch;
|
|
227
|
+
}
|
|
228
|
+
flow[answers.devBranch] = answers.production;
|
|
229
|
+
}
|
|
230
|
+
config = {
|
|
231
|
+
git: {
|
|
232
|
+
flow,
|
|
233
|
+
pr: { enabled: answers.prEnabled, provider: answers.provider || 'github' },
|
|
234
|
+
submodules: hasSubmodules
|
|
235
|
+
}
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
const spinner = ora('Writing mustard.json...').start();
|
|
239
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n');
|
|
240
|
+
spinner.succeed('Created mustard.json');
|
|
241
|
+
}
|
|
106
242
|
function printNextSteps() {
|
|
107
243
|
console.log(chalk.green.bold('\nā
Done!\n'));
|
|
108
244
|
console.log(chalk.white('Next: open Claude Code and run /scan to analyze your codebase.\n'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAY,MAAM,IAAI,CAAC;AACvD,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAU,EAAE,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# /git - Git Operations
|
|
2
2
|
|
|
3
|
-
> Commit, push,
|
|
3
|
+
> Commit, push, sync, PR, and deploy. Reads `mustard.json` for branch flow. Handles monorepo (submodules) and single repo automatically.
|
|
4
4
|
|
|
5
5
|
## Trigger
|
|
6
6
|
|
|
@@ -10,10 +10,51 @@
|
|
|
10
10
|
|
|
11
11
|
| Action | Description |
|
|
12
12
|
|--------|-------------|
|
|
13
|
+
| `sync` | Pull parent branch into current branch |
|
|
13
14
|
| `commit` | Create commit (no push) |
|
|
14
|
-
| `push` |
|
|
15
|
-
| `merge` |
|
|
16
|
-
| `deploy` | Push + merge
|
|
15
|
+
| `push` | Sync + commit + push to remote |
|
|
16
|
+
| `merge` | Promote current ā parent (PR if enabled, direct merge if not) |
|
|
17
|
+
| `deploy` | Push + merge + inform about cascade |
|
|
18
|
+
|
|
19
|
+
## Configuration
|
|
20
|
+
|
|
21
|
+
Reads `mustard.json` from the **project root**. If not found, falls back to defaults.
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"git": {
|
|
26
|
+
"flow": {
|
|
27
|
+
"dev_*": "dev",
|
|
28
|
+
"dev": "main"
|
|
29
|
+
},
|
|
30
|
+
"pr": {
|
|
31
|
+
"enabled": true,
|
|
32
|
+
"provider": "github"
|
|
33
|
+
},
|
|
34
|
+
"submodules": true
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Flow Resolution
|
|
40
|
+
|
|
41
|
+
Match current branch against `flow` keys (glob patterns). First match wins.
|
|
42
|
+
|
|
43
|
+
| Current branch | Pattern matched | Parent resolved |
|
|
44
|
+
|---------------|----------------|-----------------|
|
|
45
|
+
| `dev_rubens` | `dev_*` | `dev` |
|
|
46
|
+
| `dev` | `dev` | `main` |
|
|
47
|
+
| `feature/xyz` | no match | **error**: no parent configured |
|
|
48
|
+
|
|
49
|
+
**Fallback** (no `mustard.json`): parent = default branch (`main` or `master`).
|
|
50
|
+
|
|
51
|
+
### Provider CLI
|
|
52
|
+
|
|
53
|
+
| Provider | CLI | PR command |
|
|
54
|
+
|----------|-----|------------|
|
|
55
|
+
| `github` | `gh` | `gh pr create` |
|
|
56
|
+
| `gitlab` | `glab` | `glab mr create` |
|
|
57
|
+
| `bitbucket` | `bb` | `bb pr create` (manual) |
|
|
17
58
|
|
|
18
59
|
## Behavior
|
|
19
60
|
|
|
@@ -22,7 +63,41 @@
|
|
|
22
63
|
- **Minimize Bash calls** ā chain EVERYTHING with `&&`. One Bash call per repo max.
|
|
23
64
|
- **No investigation** ā if a submodule is dirty, commit it.
|
|
24
65
|
- Submodules BEFORE parent (always).
|
|
25
|
-
- **Single repo**: skip all submodule steps ā just
|
|
66
|
+
- **Single repo**: skip all submodule steps ā just operate on the root.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Step 0 ā Resolve Parent (all actions except commit)
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
cat mustard.json 2>/dev/null
|
|
74
|
+
git rev-parse --abbrev-ref HEAD
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Match the current branch against `git.flow` patterns. Store as `$PARENT`.
|
|
78
|
+
If no match and no `mustard.json`: `$PARENT` = default branch (detect via `git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null || echo main`).
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## sync
|
|
83
|
+
|
|
84
|
+
Pull the parent branch changes into the current branch.
|
|
85
|
+
|
|
86
|
+
### Single repo / Parent repo
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
git fetch origin $PARENT && git rebase origin/$PARENT
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Monorepo ā submodules FIRST (PARALLEL, one Bash call each)
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
cd <SUBMODULE_ABSOLUTE_PATH> && git fetch origin $PARENT && git rebase origin/$PARENT
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Then parent repo (same command at root).
|
|
99
|
+
|
|
100
|
+
If rebase has conflicts ā abort rebase, report to user, STOP.
|
|
26
101
|
|
|
27
102
|
---
|
|
28
103
|
|
|
@@ -66,15 +141,21 @@ Types: feat, fix, refactor, docs, chore, test
|
|
|
66
141
|
|
|
67
142
|
## push
|
|
68
143
|
|
|
69
|
-
|
|
144
|
+
Sequential: **sync first**, then commit + push.
|
|
145
|
+
|
|
146
|
+
### Phase 1 ā Sync
|
|
147
|
+
|
|
148
|
+
Execute `sync` action. If conflicts ā STOP.
|
|
70
149
|
|
|
71
|
-
###
|
|
150
|
+
### Phase 2 ā Commit & Push
|
|
151
|
+
|
|
152
|
+
#### Submodules (PARALLEL ā monorepo only, one Bash call each)
|
|
72
153
|
|
|
73
154
|
```bash
|
|
74
155
|
cd <SUBMODULE_ABSOLUTE_PATH> && git add -A && git commit -m "<message>" && git push origin <branch>
|
|
75
156
|
```
|
|
76
157
|
|
|
77
|
-
|
|
158
|
+
#### Parent / Root (ONE Bash call)
|
|
78
159
|
|
|
79
160
|
```bash
|
|
80
161
|
git add -A && git commit -m "<message>" && git push origin <branch>
|
|
@@ -84,54 +165,93 @@ git add -A && git commit -m "<message>" && git push origin <branch>
|
|
|
84
165
|
|
|
85
166
|
## merge
|
|
86
167
|
|
|
87
|
-
|
|
168
|
+
Promote current branch into its parent. Behavior depends on `pr.enabled`.
|
|
169
|
+
|
|
170
|
+
### Step 1 ā Ensure pushed
|
|
171
|
+
|
|
172
|
+
Check if local is ahead of remote. If yes, execute `push` first.
|
|
173
|
+
|
|
174
|
+
### Step 2a ā PR mode (`pr.enabled: true`)
|
|
175
|
+
|
|
176
|
+
Create a Pull Request from current ā parent branch.
|
|
177
|
+
|
|
178
|
+
#### GitHub (`gh`)
|
|
179
|
+
|
|
180
|
+
```bash
|
|
181
|
+
gh pr create --base $PARENT --title "<title>" --body "<body>"
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
#### GitLab (`glab`)
|
|
88
185
|
|
|
89
186
|
```bash
|
|
90
|
-
|
|
187
|
+
glab mr create --target-branch $PARENT --title "<title>" --description "<body>"
|
|
91
188
|
```
|
|
92
|
-
Single repo: skip `submodule foreach`.
|
|
93
189
|
|
|
94
|
-
|
|
190
|
+
#### PR Title & Body
|
|
191
|
+
|
|
192
|
+
- Title: conventional commit style ā `<type>: <short description>`
|
|
193
|
+
- Body: auto-generated from commit log since divergence from parent:
|
|
95
194
|
|
|
96
195
|
```bash
|
|
97
|
-
|
|
196
|
+
git log $PARENT..HEAD --oneline
|
|
98
197
|
```
|
|
99
198
|
|
|
100
|
-
|
|
199
|
+
#### Monorepo Note
|
|
200
|
+
|
|
201
|
+
PRs are created at the **parent repo level only**. Submodules are committed and pushed, but PRs are not created per submodule (submodules follow parent via ref update).
|
|
202
|
+
|
|
203
|
+
### Step 2b ā Direct mode (`pr.enabled: false`)
|
|
204
|
+
|
|
205
|
+
Merge locally and push.
|
|
206
|
+
|
|
207
|
+
#### Monorepo ā submodules FIRST (PARALLEL, one Bash call each)
|
|
101
208
|
|
|
102
209
|
```bash
|
|
103
|
-
git checkout
|
|
210
|
+
cd <SUBMODULE_ABSOLUTE_PATH> && git checkout $PARENT && git pull && git merge <branch> && git push && git checkout <branch>
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
#### Parent / Root
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
git checkout $PARENT && git pull && git merge <branch> && git push && git checkout <branch>
|
|
104
217
|
```
|
|
105
218
|
|
|
106
219
|
---
|
|
107
220
|
|
|
108
221
|
## deploy
|
|
109
222
|
|
|
110
|
-
Sequential phases
|
|
223
|
+
Sequential phases. Each phase must complete before the next.
|
|
224
|
+
|
|
225
|
+
### Phase 1 ā Push
|
|
226
|
+
|
|
227
|
+
Execute `push` action (includes sync).
|
|
228
|
+
|
|
229
|
+
### Phase 2 ā Merge to parent
|
|
111
230
|
|
|
112
|
-
|
|
231
|
+
Execute `merge` action (current ā parent).
|
|
113
232
|
|
|
114
|
-
|
|
233
|
+
### Phase 3 ā Cascade (if parent ā production)
|
|
115
234
|
|
|
116
|
-
|
|
235
|
+
If `$PARENT` also has a parent in the flow (e.g., `dev` ā `main`), inform the user:
|
|
117
236
|
|
|
118
|
-
|
|
237
|
+
> Merged/PR created: `dev_rubens ā dev`. To promote `dev ā main`, switch to `dev` and run `/git deploy` again.
|
|
119
238
|
|
|
120
|
-
|
|
239
|
+
Do NOT auto-cascade ā each promotion is a deliberate decision.
|
|
121
240
|
|
|
122
241
|
---
|
|
123
242
|
|
|
124
243
|
## Cautions
|
|
125
244
|
|
|
126
|
-
- Aborts if ANY repo has merge conflicts
|
|
127
|
-
- Submodules BEFORE parent (
|
|
245
|
+
- Aborts if ANY repo has merge conflicts (sync or push)
|
|
246
|
+
- Submodules BEFORE parent (in sync, push, and commit)
|
|
128
247
|
- NEVER use `git add .` ā use `git add -A` from the correct directory
|
|
129
|
-
- If any
|
|
248
|
+
- If any operation fails, stop and report
|
|
249
|
+
- PR creation requires the provider CLI to be installed and authenticated
|
|
130
250
|
|
|
131
251
|
## Performance Budget
|
|
132
252
|
|
|
133
253
|
- **Max Task agents**: 1 per dirty submodule
|
|
134
254
|
- **Max Bash calls per agent**: 1 (all commands chained)
|
|
135
|
-
- **Max API calls total**: ā¤
|
|
255
|
+
- **Max API calls total**: ⤠12
|
|
136
256
|
|
|
137
257
|
ULTRATHINK
|