@speclife/cli 0.6.3 → 0.8.0
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/package.json +1 -1
- package/templates/commands/start.md +146 -16
package/package.json
CHANGED
|
@@ -21,8 +21,10 @@ Create a new branch for a change, optionally in a worktree for parallel work.
|
|
|
21
21
|
## Usage
|
|
22
22
|
|
|
23
23
|
```
|
|
24
|
-
/speclife start <description> #
|
|
25
|
-
/speclife start <description> in a branch #
|
|
24
|
+
/speclife start <description> # New proposal, worktree (default)
|
|
25
|
+
/speclife start <description> in a branch # New proposal, branch-only
|
|
26
|
+
/speclife start "resume <change-id>" # Resume existing proposal, worktree
|
|
27
|
+
/speclife start "implement <change-id>" # Resume if exists, create if not
|
|
26
28
|
/speclife start # Interactive
|
|
27
29
|
```
|
|
28
30
|
|
|
@@ -32,7 +34,21 @@ Set up a workspace for a new change with proper git branch.
|
|
|
32
34
|
|
|
33
35
|
## Mode Detection
|
|
34
36
|
|
|
35
|
-
Parse the input for workflow hints:
|
|
37
|
+
Parse the input for workflow hints in this order:
|
|
38
|
+
|
|
39
|
+
### 1. Resume Intent Detection
|
|
40
|
+
|
|
41
|
+
| Phrase in input | Meaning |
|
|
42
|
+
|-----------------|---------|
|
|
43
|
+
| "resume <change-id>", "continue <change-id>", "pick up <change-id>" | **Resume existing proposal** (error if not found) |
|
|
44
|
+
| "implement <change-id>" | **Resume if exists**, create new if not |
|
|
45
|
+
|
|
46
|
+
Examples:
|
|
47
|
+
- `"resume fix-release-and-init"` → resume mode, change-id = `fix-release-and-init`
|
|
48
|
+
- `"continue working on add-oauth-login"` → resume mode, change-id = `add-oauth-login`
|
|
49
|
+
- `"implement fix-email-validation"` → try resume, fallback to new
|
|
50
|
+
|
|
51
|
+
### 2. Worktree Mode Detection
|
|
36
52
|
|
|
37
53
|
| Phrase in input | Mode |
|
|
38
54
|
|-----------------|------|
|
|
@@ -40,18 +56,53 @@ Parse the input for workflow hints:
|
|
|
40
56
|
| "in a worktree", "with worktree", "parallel" | **Worktree** |
|
|
41
57
|
| Neither | **Worktree** (default) |
|
|
42
58
|
|
|
43
|
-
|
|
59
|
+
### 3. Parsing Order
|
|
60
|
+
|
|
61
|
+
1. Check for resume keywords → extract change-id
|
|
62
|
+
2. Check for mode keywords → determine worktree/branch
|
|
63
|
+
3. Strip workflow hints → derive description (new proposals only)
|
|
64
|
+
|
|
65
|
+
Examples:
|
|
66
|
+
- `"resume fix-bug in a branch"` → resume mode, branch-only
|
|
67
|
+
- `"implement oauth with worktree"` → resume/new mode, worktree
|
|
44
68
|
|
|
45
69
|
## Steps
|
|
46
70
|
|
|
47
|
-
### 1.
|
|
71
|
+
### 1. Check for Resume Intent
|
|
72
|
+
|
|
73
|
+
Parse input for resume keywords (`resume`, `continue`, `pick up`, `implement`):
|
|
74
|
+
|
|
75
|
+
**If resume intent detected:**
|
|
76
|
+
```bash
|
|
77
|
+
CHANGE_ID=<extracted-from-input> # e.g., "fix-release-and-init"
|
|
78
|
+
PROPOSAL_DIR="openspec/changes/${CHANGE_ID}"
|
|
79
|
+
|
|
80
|
+
if [[ ! -d "$PROPOSAL_DIR" ]]; then
|
|
81
|
+
echo "❌ Proposal '${CHANGE_ID}' not found"
|
|
82
|
+
echo ""
|
|
83
|
+
echo "Available proposals:"
|
|
84
|
+
ls -1 openspec/changes/ | grep -v archive
|
|
85
|
+
exit 1
|
|
86
|
+
fi
|
|
87
|
+
|
|
88
|
+
echo "✓ Found existing proposal at ${PROPOSAL_DIR}/"
|
|
89
|
+
# Skip to step 3 (create branch/worktree)
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**If "implement" keyword and proposal doesn't exist:**
|
|
93
|
+
- Continue as new proposal (steps 2-5)
|
|
94
|
+
|
|
95
|
+
**If no resume intent:**
|
|
96
|
+
- Continue to step 2
|
|
97
|
+
|
|
98
|
+
### 2. Derive change-id (New Proposals Only)
|
|
48
99
|
|
|
49
100
|
Convert description to kebab-case:
|
|
50
101
|
- "Add user authentication" → `add-user-auth`
|
|
51
102
|
- Prefix with verb: add-, fix-, update-, remove-, refactor-
|
|
52
103
|
- Keep it short (3-5 words max)
|
|
53
104
|
|
|
54
|
-
###
|
|
105
|
+
### 3. Create branch/worktree
|
|
55
106
|
|
|
56
107
|
**Branch-only mode:**
|
|
57
108
|
```bash
|
|
@@ -68,15 +119,17 @@ speclife worktree create <change-id>
|
|
|
68
119
|
- Creates branch `spec/<change-id>`
|
|
69
120
|
- Parallel changes possible
|
|
70
121
|
|
|
71
|
-
###
|
|
122
|
+
### 4. Scaffold proposal (New Proposals Only)
|
|
123
|
+
|
|
124
|
+
**Skip this step if resuming an existing proposal.**
|
|
72
125
|
|
|
73
126
|
Invoke `/openspec-proposal` with the description (minus workflow hints)
|
|
74
127
|
- Creates `openspec/changes/<change-id>/proposal.md`
|
|
75
128
|
- Creates `openspec/changes/<change-id>/tasks.md`
|
|
76
129
|
|
|
77
|
-
###
|
|
130
|
+
### 5. Report and STOP
|
|
78
131
|
|
|
79
|
-
**Branch-only:**
|
|
132
|
+
**New Proposal - Branch-only:**
|
|
80
133
|
```
|
|
81
134
|
✓ Derived change-id: add-oauth-login
|
|
82
135
|
✓ Created branch spec/add-oauth-login
|
|
@@ -85,32 +138,95 @@ Invoke `/openspec-proposal` with the description (minus workflow hints)
|
|
|
85
138
|
Next: Review the proposal, then run `/openspec-apply` to implement.
|
|
86
139
|
```
|
|
87
140
|
|
|
88
|
-
**Worktree:**
|
|
141
|
+
**New Proposal - Worktree:**
|
|
89
142
|
```
|
|
90
143
|
✓ Derived change-id: add-oauth-login
|
|
91
144
|
✓ Created worktree at worktrees/add-oauth-login/
|
|
92
145
|
✓ Created branch spec/add-oauth-login
|
|
93
146
|
✓ Scaffolded proposal at openspec/changes/add-oauth-login/
|
|
94
147
|
|
|
95
|
-
|
|
148
|
+
⚠️ IMPORTANT: You must work from the worktree directory!
|
|
149
|
+
|
|
150
|
+
Next steps:
|
|
151
|
+
1. Switch to worktree: cd worktrees/add-oauth-login/
|
|
152
|
+
2. Invoke /openspec-apply from there
|
|
153
|
+
|
|
154
|
+
🚨 CRITICAL: All file edits MUST happen in:
|
|
155
|
+
worktrees/add-oauth-login/openspec/...
|
|
156
|
+
worktrees/add-oauth-login/packages/...
|
|
157
|
+
|
|
158
|
+
NOT in the main repo paths!
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
**Resume Proposal - Branch-only:**
|
|
162
|
+
```
|
|
163
|
+
✓ Found existing proposal at openspec/changes/fix-release-and-init/
|
|
164
|
+
✓ Created branch spec/fix-release-and-init
|
|
165
|
+
ℹ️ Proposal already defined - ready to implement
|
|
166
|
+
|
|
167
|
+
Next: Run `/openspec-apply` to implement tasks.
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**Resume Proposal - Worktree:**
|
|
171
|
+
```
|
|
172
|
+
✓ Found existing proposal at openspec/changes/fix-release-and-init/
|
|
173
|
+
✓ Created worktree at worktrees/fix-release-and-init/
|
|
174
|
+
✓ Created branch spec/fix-release-and-init
|
|
175
|
+
ℹ️ Proposal already defined - ready to implement
|
|
176
|
+
|
|
177
|
+
Next: cd worktrees/fix-release-and-init/ then run `/openspec-apply`.
|
|
96
178
|
```
|
|
97
179
|
|
|
98
180
|
**⛔ STOP HERE.** Do NOT proceed to implementation. Wait for user to:
|
|
99
|
-
1. Review the proposal
|
|
100
|
-
2.
|
|
181
|
+
1. Review the proposal (if new)
|
|
182
|
+
2. Switch to worktree directory (if worktree mode)
|
|
183
|
+
3. Invoke `/openspec-apply` or `/speclife implement`
|
|
101
184
|
|
|
102
185
|
## Examples
|
|
103
186
|
|
|
187
|
+
**New proposals:**
|
|
104
188
|
```
|
|
105
189
|
User: /speclife start "Add OAuth login support"
|
|
106
|
-
→ Creates worktree (default)
|
|
190
|
+
→ Creates worktree (default), scaffolds new proposal
|
|
107
191
|
|
|
108
192
|
User: /speclife start "Add OAuth login" in a branch
|
|
109
|
-
→ Creates branch only,
|
|
193
|
+
→ Creates branch only, scaffolds new proposal
|
|
110
194
|
|
|
111
195
|
User: /speclife start "fix login bug" branch only
|
|
112
|
-
→ Creates branch only
|
|
196
|
+
→ Creates branch only, scaffolds new proposal
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
**Resume existing proposals:**
|
|
200
|
+
```
|
|
201
|
+
User: /speclife start "resume fix-release-and-init"
|
|
202
|
+
→ Creates worktree, uses existing proposal
|
|
203
|
+
|
|
204
|
+
User: /speclife start "continue working on add-oauth-login"
|
|
205
|
+
→ Creates worktree, uses existing proposal
|
|
206
|
+
|
|
207
|
+
User: /speclife start "pick up fix-email-validation in a branch"
|
|
208
|
+
→ Creates branch only, uses existing proposal
|
|
113
209
|
|
|
210
|
+
User: /speclife start "implement add-user-auth"
|
|
211
|
+
→ If proposal exists: resumes it
|
|
212
|
+
→ If not: creates new proposal
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
**Error case:**
|
|
216
|
+
```
|
|
217
|
+
User: /speclife start "resume nonexistent-change"
|
|
218
|
+
|
|
219
|
+
Agent:
|
|
220
|
+
❌ Proposal 'nonexistent-change' not found
|
|
221
|
+
|
|
222
|
+
Available proposals:
|
|
223
|
+
fix-release-and-init
|
|
224
|
+
add-oauth-login
|
|
225
|
+
fix-email-validation
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Interactive:**
|
|
229
|
+
```
|
|
114
230
|
User: /speclife start
|
|
115
231
|
→ Prompts: "Describe your change" then "Worktree (default) or branch-only?"
|
|
116
232
|
```
|
|
@@ -138,8 +254,22 @@ User: /speclife start
|
|
|
138
254
|
|
|
139
255
|
## Notes
|
|
140
256
|
|
|
257
|
+
### General
|
|
141
258
|
- Branch name is always `spec/<change-id>` regardless of mode
|
|
142
259
|
- If branch exists, error and suggest using existing
|
|
143
260
|
- Branch-only: uncommitted changes carry over (stash if needed)
|
|
144
261
|
- Worktree: clean checkout from main
|
|
145
262
|
- To switch modes later, use `/speclife convert`
|
|
263
|
+
|
|
264
|
+
### Resume Behavior
|
|
265
|
+
- Resume keywords: `resume`, `continue`, `pick up`, `implement`
|
|
266
|
+
- Proposals must exist in `openspec/changes/<change-id>/`
|
|
267
|
+
- Archived proposals are not searched (move from archive first if needed)
|
|
268
|
+
- Resume skips `/openspec-proposal` scaffolding
|
|
269
|
+
- "implement" keyword tries resume first, creates new if not found
|
|
270
|
+
- Combine with mode: "resume X in a branch" or "resume X with worktree"
|
|
271
|
+
|
|
272
|
+
### Next Steps
|
|
273
|
+
- After creating new proposal: Review, refine, then `/openspec-apply`
|
|
274
|
+
- After resuming proposal: Directly run `/openspec-apply` to implement tasks
|
|
275
|
+
- Both workflows converge at implementation phase
|