prjct-cli 0.10.8 → 0.10.10
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/CHANGELOG.md +72 -0
- package/CLAUDE.md +121 -996
- package/core/agentic/context-builder.js +18 -17
- package/core/agentic/prompt-builder.js +70 -58
- package/package.json +1 -1
- package/templates/analysis/patterns.md +60 -0
- package/templates/commands/done.md +129 -15
- package/templates/commands/feature.md +262 -21
- package/templates/commands/ship.md +244 -23
- package/templates/commands/sync.md +256 -11
|
@@ -1,34 +1,275 @@
|
|
|
1
1
|
---
|
|
2
|
-
allowed-tools: [Read, Write, Bash
|
|
2
|
+
allowed-tools: [Read, Write, Bash]
|
|
3
3
|
description: 'Value analysis + roadmap + task breakdown + auto-start'
|
|
4
4
|
timestamp-rule: 'GetTimestamp() and GetDate() for ALL timestamps'
|
|
5
|
-
think-triggers: [explore_to_edit, complex_analysis]
|
|
6
5
|
---
|
|
7
6
|
|
|
8
|
-
# /p:feature
|
|
7
|
+
# /p:feature - Add Feature to Roadmap
|
|
9
8
|
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
## Context Variables
|
|
10
|
+
- `{projectId}`: From `.prjct/prjct.config.json`
|
|
11
|
+
- `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
|
|
12
|
+
- `{roadmapPath}`: `{globalPath}/planning/roadmap.md`
|
|
13
|
+
- `{nextPath}`: `{globalPath}/core/next.md`
|
|
14
|
+
- `{nowPath}`: `{globalPath}/core/now.md`
|
|
15
|
+
- `{memoryPath}`: `{globalPath}/memory/context.jsonl`
|
|
16
|
+
- `{feature}`: User-provided feature description
|
|
16
17
|
|
|
17
|
-
##
|
|
18
|
+
## Step 1: Read Config
|
|
18
19
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
3. **Tasks**: Break down → `core/next.md`
|
|
22
|
-
4. **Session**: Log to `planning/sessions/{YYYY-MM}/{DD}.jsonl`
|
|
23
|
-
5. **Start**: Auto-start task 1 with agent assignment
|
|
20
|
+
READ: `.prjct/prjct.config.json`
|
|
21
|
+
EXTRACT: `projectId`
|
|
24
22
|
|
|
25
|
-
|
|
23
|
+
IF file not found:
|
|
24
|
+
OUTPUT: "No prjct project. Run /p:init first."
|
|
25
|
+
STOP
|
|
26
26
|
|
|
27
|
-
##
|
|
27
|
+
## Step 2: Handle No Parameters
|
|
28
28
|
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
IF no feature description provided:
|
|
30
|
+
OUTPUT interactive menu:
|
|
31
|
+
```
|
|
32
|
+
What kind of feature?
|
|
31
33
|
|
|
32
|
-
|
|
34
|
+
1. UI/UX - Interface improvements
|
|
35
|
+
2. Performance - Speed, memory, optimization
|
|
36
|
+
3. Features - New functionality
|
|
37
|
+
4. Quality - Testing, refactoring
|
|
38
|
+
5. Bugs - Fix issues
|
|
39
|
+
6. Docs - Documentation
|
|
33
40
|
|
|
34
|
-
|
|
41
|
+
Describe your feature or choose a category.
|
|
42
|
+
```
|
|
43
|
+
WAIT for user input
|
|
44
|
+
CONTINUE with user's response as {feature}
|
|
45
|
+
|
|
46
|
+
## Step 3: Value Analysis
|
|
47
|
+
|
|
48
|
+
Analyze the feature:
|
|
49
|
+
|
|
50
|
+
### Impact Assessment
|
|
51
|
+
Based on feature description, determine:
|
|
52
|
+
|
|
53
|
+
IF affects core functionality OR user-facing:
|
|
54
|
+
{impact} = "high"
|
|
55
|
+
ELSE IF affects internal systems OR developer experience:
|
|
56
|
+
{impact} = "medium"
|
|
57
|
+
ELSE:
|
|
58
|
+
{impact} = "low"
|
|
59
|
+
|
|
60
|
+
### Effort Estimation
|
|
61
|
+
Based on complexity:
|
|
62
|
+
|
|
63
|
+
IF simple change (1-2 files, straightforward):
|
|
64
|
+
{effort} = "1-2h"
|
|
65
|
+
{taskCount} = 1-2
|
|
66
|
+
ELSE IF medium change (3-5 files, some logic):
|
|
67
|
+
{effort} = "3-4h"
|
|
68
|
+
{taskCount} = 3-4
|
|
69
|
+
ELSE IF complex change (many files, new patterns):
|
|
70
|
+
{effort} = "6-8h"
|
|
71
|
+
{taskCount} = 5-8
|
|
72
|
+
ELSE:
|
|
73
|
+
{effort} = "1d+"
|
|
74
|
+
{taskCount} = 8+
|
|
75
|
+
|
|
76
|
+
### Timing Decision
|
|
77
|
+
IF {impact} = "high" AND {effort} < "4h":
|
|
78
|
+
{timing} = "do_now"
|
|
79
|
+
ELSE IF {impact} = "high":
|
|
80
|
+
{timing} = "plan_first"
|
|
81
|
+
ELSE:
|
|
82
|
+
{timing} = "add_to_queue"
|
|
83
|
+
|
|
84
|
+
## Step 4: Task Breakdown
|
|
85
|
+
|
|
86
|
+
Break {feature} into specific, actionable tasks:
|
|
87
|
+
|
|
88
|
+
### Task Generation Rules
|
|
89
|
+
1. Each task should be completable in 30min - 2h
|
|
90
|
+
2. Tasks should be atomic (one concern each)
|
|
91
|
+
3. Order tasks by dependency (blockers first)
|
|
92
|
+
4. Include setup/research task if needed
|
|
93
|
+
5. Include testing/verification as final task
|
|
94
|
+
|
|
95
|
+
### Example Breakdown
|
|
96
|
+
For feature "add user authentication":
|
|
97
|
+
```
|
|
98
|
+
1. Research auth patterns for this stack
|
|
99
|
+
2. Setup auth middleware/routes
|
|
100
|
+
3. Implement login endpoint
|
|
101
|
+
4. Implement logout endpoint
|
|
102
|
+
5. Add session management
|
|
103
|
+
6. Write auth tests
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
GENERATE: {tasks} = list of task descriptions
|
|
107
|
+
|
|
108
|
+
## Step 5: Update Roadmap
|
|
109
|
+
|
|
110
|
+
READ: `{roadmapPath}` (create if not exists)
|
|
111
|
+
|
|
112
|
+
### Format New Entry
|
|
113
|
+
|
|
114
|
+
```markdown
|
|
115
|
+
## {GetDate()} - {feature}
|
|
116
|
+
- Impact: {impact} | Effort: {effort}
|
|
117
|
+
- Tasks: {taskCount}
|
|
118
|
+
- Status: active
|
|
119
|
+
|
|
120
|
+
### Tasks
|
|
121
|
+
1. [ ] {task1}
|
|
122
|
+
2. [ ] {task2}
|
|
123
|
+
...
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
INSERT at top (after # Roadmap header)
|
|
127
|
+
|
|
128
|
+
### Archive Old Entries
|
|
129
|
+
IF entries older than 30 days exist:
|
|
130
|
+
MOVE to: `{globalPath}/planning/archive/roadmap-{yearMonth}.md`
|
|
131
|
+
|
|
132
|
+
WRITE: `{roadmapPath}`
|
|
133
|
+
|
|
134
|
+
## Step 6: Update Priority Queue
|
|
135
|
+
|
|
136
|
+
READ: `{nextPath}` (create if not exists)
|
|
137
|
+
|
|
138
|
+
### Add Tasks to Queue
|
|
139
|
+
|
|
140
|
+
For each task in {tasks}:
|
|
141
|
+
APPEND to next.md:
|
|
142
|
+
```markdown
|
|
143
|
+
- [ ] {task} (from: {feature})
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
WRITE: `{nextPath}`
|
|
147
|
+
|
|
148
|
+
## Step 7: Auto-Start First Task
|
|
149
|
+
|
|
150
|
+
READ: `{nowPath}`
|
|
151
|
+
|
|
152
|
+
IF empty OR contains "No current task":
|
|
153
|
+
### Start First Task
|
|
154
|
+
{firstTask} = first item from {tasks}
|
|
155
|
+
|
|
156
|
+
WRITE: `{nowPath}`
|
|
157
|
+
```markdown
|
|
158
|
+
# NOW
|
|
159
|
+
|
|
160
|
+
**{firstTask}**
|
|
161
|
+
|
|
162
|
+
Feature: {feature}
|
|
163
|
+
Started: {GetTimestamp()}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
{autoStarted} = true
|
|
167
|
+
ELSE:
|
|
168
|
+
{autoStarted} = false
|
|
169
|
+
|
|
170
|
+
## Step 8: Log to Session
|
|
171
|
+
|
|
172
|
+
GET: {date} = GetDate()
|
|
173
|
+
EXTRACT: {yearMonth} = YYYY-MM from {date}
|
|
174
|
+
|
|
175
|
+
ENSURE directory:
|
|
176
|
+
BASH: `mkdir -p {globalPath}/planning/sessions/{yearMonth}`
|
|
177
|
+
|
|
178
|
+
APPEND to: `{globalPath}/planning/sessions/{yearMonth}/{date}.jsonl`
|
|
179
|
+
|
|
180
|
+
Single line (JSONL):
|
|
181
|
+
```json
|
|
182
|
+
{"ts":"{GetTimestamp()}","type":"feature_add","name":"{feature}","tasks":{taskCount},"impact":"{impact}","effort":"{effort}"}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
## Step 9: Log to Memory
|
|
186
|
+
|
|
187
|
+
APPEND to: `{memoryPath}`
|
|
188
|
+
|
|
189
|
+
Single line (JSONL):
|
|
190
|
+
```json
|
|
191
|
+
{"timestamp":"{GetTimestamp()}","action":"feature_added","feature":"{feature}","tasks":{taskCount}}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Output
|
|
195
|
+
|
|
196
|
+
SUCCESS (with auto-start):
|
|
197
|
+
```
|
|
198
|
+
✅ Added: {feature}
|
|
199
|
+
|
|
200
|
+
Impact: {impact} | Effort: {effort}
|
|
201
|
+
Tasks: {taskCount}
|
|
202
|
+
|
|
203
|
+
🎯 Started: {firstTask}
|
|
204
|
+
|
|
205
|
+
Next:
|
|
206
|
+
• Work on the task
|
|
207
|
+
• /p:done - When finished
|
|
208
|
+
• /p:next - See full queue
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
SUCCESS (without auto-start):
|
|
212
|
+
```
|
|
213
|
+
✅ Added: {feature}
|
|
214
|
+
|
|
215
|
+
Impact: {impact} | Effort: {effort}
|
|
216
|
+
Tasks: {taskCount}
|
|
217
|
+
|
|
218
|
+
⚠️ Already working on another task.
|
|
219
|
+
Tasks added to queue.
|
|
220
|
+
|
|
221
|
+
Next:
|
|
222
|
+
• /p:done - Finish current task
|
|
223
|
+
• /p:next - See queue
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
## Error Handling
|
|
227
|
+
|
|
228
|
+
| Error | Response | Action |
|
|
229
|
+
|-------|----------|--------|
|
|
230
|
+
| No config | "No prjct project" | STOP |
|
|
231
|
+
| No feature | Show category menu | WAIT |
|
|
232
|
+
| Write fails | Log warning | CONTINUE |
|
|
233
|
+
|
|
234
|
+
## Examples
|
|
235
|
+
|
|
236
|
+
### Example 1: Simple Feature
|
|
237
|
+
Input: `/p:feature add dark mode toggle`
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
✅ Added: add dark mode toggle
|
|
241
|
+
|
|
242
|
+
Impact: medium | Effort: 2-3h
|
|
243
|
+
Tasks: 3
|
|
244
|
+
|
|
245
|
+
🎯 Started: Setup theme context/state
|
|
246
|
+
|
|
247
|
+
Tasks:
|
|
248
|
+
1. Setup theme context/state
|
|
249
|
+
2. Add toggle component
|
|
250
|
+
3. Apply theme to components
|
|
251
|
+
|
|
252
|
+
Next: /p:done | /p:next
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Example 2: Complex Feature
|
|
256
|
+
Input: `/p:feature implement user authentication`
|
|
257
|
+
|
|
258
|
+
```
|
|
259
|
+
✅ Added: implement user authentication
|
|
260
|
+
|
|
261
|
+
Impact: high | Effort: 6-8h
|
|
262
|
+
Tasks: 6
|
|
263
|
+
|
|
264
|
+
🎯 Started: Research auth patterns
|
|
265
|
+
|
|
266
|
+
Tasks:
|
|
267
|
+
1. Research auth patterns
|
|
268
|
+
2. Setup auth middleware
|
|
269
|
+
3. Implement login
|
|
270
|
+
4. Implement logout
|
|
271
|
+
5. Add session management
|
|
272
|
+
6. Write auth tests
|
|
273
|
+
|
|
274
|
+
Next: /p:done | /p:next
|
|
275
|
+
```
|
|
@@ -1,35 +1,256 @@
|
|
|
1
1
|
---
|
|
2
|
-
allowed-tools: [Read, Write, Bash
|
|
3
|
-
description: 'Ship feature workflow'
|
|
4
|
-
timestamp-rule: 'GetTimestamp() and GetDate() for timestamps'
|
|
5
|
-
think-triggers: [git_decision, report_complete]
|
|
2
|
+
allowed-tools: [Read, Write, Bash]
|
|
3
|
+
description: 'Ship feature with automated workflow'
|
|
4
|
+
timestamp-rule: 'GetTimestamp() and GetDate() for ALL timestamps'
|
|
6
5
|
---
|
|
7
6
|
|
|
8
|
-
# /p:ship
|
|
7
|
+
# /p:ship - Ship Feature Workflow
|
|
9
8
|
|
|
10
|
-
##
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
## Context Variables
|
|
10
|
+
- `{projectId}`: From `.prjct/prjct.config.json`
|
|
11
|
+
- `{globalPath}`: `~/.prjct-cli/projects/{projectId}`
|
|
12
|
+
- `{shippedPath}`: `{globalPath}/progress/shipped.md`
|
|
13
|
+
- `{memoryPath}`: `{globalPath}/memory/context.jsonl`
|
|
14
|
+
- `{feature}`: User-provided feature name
|
|
16
15
|
|
|
17
|
-
##
|
|
18
|
-
1. Lint → Tests → Docs update
|
|
19
|
-
2. Version bump → CHANGELOG
|
|
20
|
-
3. Commit + push (prjct footer)
|
|
21
|
-
4. Log: `progress/sessions/{YY-MM}/{DD}.jsonl`
|
|
22
|
-
5. Update: `progress/shipped.md` (30 days)
|
|
23
|
-
6. Recommend: compact
|
|
16
|
+
## Step 1: Read Config
|
|
24
17
|
|
|
25
|
-
|
|
26
|
-
|
|
18
|
+
READ: `.prjct/prjct.config.json`
|
|
19
|
+
EXTRACT: `projectId`
|
|
27
20
|
|
|
28
|
-
|
|
21
|
+
IF file not found:
|
|
22
|
+
OUTPUT: "No prjct project. Run /p:init first."
|
|
23
|
+
STOP
|
|
24
|
+
|
|
25
|
+
## Step 2: Validate Prerequisites
|
|
26
|
+
|
|
27
|
+
BASH: `git status --porcelain`
|
|
28
|
+
|
|
29
|
+
IF output empty (no changes):
|
|
30
|
+
OUTPUT: "⚠️ No changes to ship. Make some commits first."
|
|
31
|
+
STOP
|
|
32
|
+
|
|
33
|
+
BASH: `git rev-parse --is-inside-work-tree`
|
|
34
|
+
|
|
35
|
+
IF not a git repo:
|
|
36
|
+
OUTPUT: "⚠️ Not a git repository. Initialize git first."
|
|
37
|
+
STOP
|
|
38
|
+
|
|
39
|
+
## Step 3: Quality Checks (Non-Blocking)
|
|
40
|
+
|
|
41
|
+
### Lint Check
|
|
42
|
+
BASH: `npm run lint 2>&1 || echo "LINT_SKIP"`
|
|
43
|
+
|
|
44
|
+
CAPTURE output as {lintResult}
|
|
45
|
+
|
|
46
|
+
IF contains "LINT_SKIP" OR contains "missing script":
|
|
47
|
+
{lintStatus} = "skipped"
|
|
48
|
+
ELSE IF contains "error":
|
|
49
|
+
{lintStatus} = "warnings"
|
|
50
|
+
ELSE:
|
|
51
|
+
{lintStatus} = "passed"
|
|
52
|
+
|
|
53
|
+
### Test Check
|
|
54
|
+
BASH: `npm test 2>&1 || echo "TEST_SKIP"`
|
|
55
|
+
|
|
56
|
+
CAPTURE output as {testResult}
|
|
57
|
+
|
|
58
|
+
IF contains "TEST_SKIP" OR contains "missing script":
|
|
59
|
+
{testStatus} = "skipped"
|
|
60
|
+
ELSE IF contains "failed" OR contains "FAIL":
|
|
61
|
+
{testStatus} = "failed"
|
|
62
|
+
ELSE:
|
|
63
|
+
{testStatus} = "passed"
|
|
64
|
+
|
|
65
|
+
**Note**: These are NON-BLOCKING. Continue even if they fail.
|
|
66
|
+
|
|
67
|
+
## Step 4: Version Bump
|
|
68
|
+
|
|
69
|
+
READ: `package.json`
|
|
70
|
+
EXTRACT: current version as {currentVersion}
|
|
71
|
+
|
|
72
|
+
### Determine Bump Type
|
|
73
|
+
|
|
74
|
+
BASH: `git log --oneline -10`
|
|
75
|
+
|
|
76
|
+
ANALYZE commit messages:
|
|
77
|
+
|
|
78
|
+
IF any commit contains "BREAKING" OR "major:":
|
|
79
|
+
{bumpType} = "major"
|
|
80
|
+
{newVersion} = increment X in X.Y.Z, set Y=0, Z=0
|
|
81
|
+
|
|
82
|
+
ELSE IF any commit contains "feat:" OR "feature:":
|
|
83
|
+
{bumpType} = "minor"
|
|
84
|
+
{newVersion} = increment Y in X.Y.Z, set Z=0
|
|
85
|
+
|
|
86
|
+
ELSE:
|
|
87
|
+
{bumpType} = "patch"
|
|
88
|
+
{newVersion} = increment Z in X.Y.Z
|
|
89
|
+
|
|
90
|
+
### Update package.json
|
|
91
|
+
|
|
92
|
+
READ: `package.json`
|
|
93
|
+
REPLACE: `"version": "{currentVersion}"` with `"version": "{newVersion}"`
|
|
94
|
+
WRITE: `package.json`
|
|
95
|
+
|
|
96
|
+
## Step 5: Update CHANGELOG
|
|
97
|
+
|
|
98
|
+
READ: `CHANGELOG.md` (create if not exists)
|
|
99
|
+
|
|
100
|
+
### Format New Entry
|
|
101
|
+
|
|
102
|
+
```markdown
|
|
103
|
+
## [{newVersion}] - {GetDate()}
|
|
104
|
+
|
|
105
|
+
### {feature}
|
|
106
|
+
- Shipped by prjct-cli
|
|
107
|
+
- Lint: {lintStatus}
|
|
108
|
+
- Tests: {testStatus}
|
|
29
109
|
```
|
|
110
|
+
|
|
111
|
+
INSERT at top of file (after # Changelog header)
|
|
112
|
+
|
|
113
|
+
WRITE: `CHANGELOG.md`
|
|
114
|
+
|
|
115
|
+
## Step 6: Git Commit
|
|
116
|
+
|
|
117
|
+
### Stage Changes
|
|
118
|
+
BASH: `git add .`
|
|
119
|
+
|
|
120
|
+
### Create Commit
|
|
121
|
+
BASH: `git commit -m "$(cat <<'EOF'
|
|
122
|
+
feat: Ship {feature}
|
|
123
|
+
|
|
124
|
+
- Version: {newVersion}
|
|
125
|
+
- Lint: {lintStatus}
|
|
126
|
+
- Tests: {testStatus}
|
|
127
|
+
|
|
30
128
|
🤖 Generated with [p/](https://www.prjct.app/)
|
|
31
129
|
Designed for [Claude](https://www.anthropic.com/claude)
|
|
130
|
+
EOF
|
|
131
|
+
)"`
|
|
132
|
+
|
|
133
|
+
## Step 7: Git Push
|
|
134
|
+
|
|
135
|
+
BASH: `git push 2>&1`
|
|
136
|
+
|
|
137
|
+
CAPTURE output as {pushResult}
|
|
138
|
+
|
|
139
|
+
IF contains "rejected" OR contains "failed":
|
|
140
|
+
OUTPUT: "⚠️ Push failed. Try: git pull --rebase && git push"
|
|
141
|
+
CONTINUE (don't stop)
|
|
142
|
+
|
|
143
|
+
IF contains "no upstream":
|
|
144
|
+
BASH: `git push -u origin HEAD`
|
|
145
|
+
|
|
146
|
+
## Step 8: Log to Session
|
|
147
|
+
|
|
148
|
+
GET: {date} = GetDate()
|
|
149
|
+
EXTRACT: {yearMonth} = YYYY-MM from {date}
|
|
150
|
+
|
|
151
|
+
ENSURE directory exists:
|
|
152
|
+
BASH: `mkdir -p {globalPath}/progress/sessions/{yearMonth}`
|
|
153
|
+
|
|
154
|
+
APPEND to: `{globalPath}/progress/sessions/{yearMonth}/{date}.jsonl`
|
|
155
|
+
|
|
156
|
+
Single line (JSONL):
|
|
157
|
+
```json
|
|
158
|
+
{"ts":"{GetTimestamp()}","type":"feature_ship","name":"{feature}","version":"{newVersion}","lint":"{lintStatus}","tests":"{testStatus}"}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Step 9: Update Shipped Index
|
|
162
|
+
|
|
163
|
+
READ: `{shippedPath}` (create if not exists)
|
|
164
|
+
|
|
165
|
+
### Format New Entry
|
|
166
|
+
|
|
167
|
+
```markdown
|
|
168
|
+
## {GetDate()} - {feature}
|
|
169
|
+
- Version: {newVersion}
|
|
170
|
+
- Lint: {lintStatus} | Tests: {testStatus}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
INSERT at top (after # Shipped header)
|
|
174
|
+
|
|
175
|
+
### Archive Old Entries
|
|
176
|
+
IF file has entries older than 30 days:
|
|
177
|
+
MOVE old entries to: `{globalPath}/progress/archive/shipped-{yearMonth}.md`
|
|
178
|
+
|
|
179
|
+
WRITE: `{shippedPath}`
|
|
180
|
+
|
|
181
|
+
## Step 10: Log to Memory
|
|
182
|
+
|
|
183
|
+
APPEND to: `{memoryPath}`
|
|
184
|
+
|
|
185
|
+
Single line (JSONL):
|
|
186
|
+
```json
|
|
187
|
+
{"timestamp":"{GetTimestamp()}","action":"feature_shipped","feature":"{feature}","version":"{newVersion}"}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Output
|
|
191
|
+
|
|
192
|
+
SUCCESS:
|
|
193
|
+
```
|
|
194
|
+
🚀 Shipped: {feature}
|
|
195
|
+
|
|
196
|
+
Version: {currentVersion} → {newVersion}
|
|
197
|
+
Lint: {lintStatus}
|
|
198
|
+
Tests: {testStatus}
|
|
199
|
+
Commit: {commitHash}
|
|
200
|
+
|
|
201
|
+
Next:
|
|
202
|
+
• /p:feature - Plan next feature
|
|
203
|
+
• /p:recap - See progress
|
|
204
|
+
• compact - Clean up conversation
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## Error Handling
|
|
208
|
+
|
|
209
|
+
| Error | Response | Action |
|
|
210
|
+
|-------|----------|--------|
|
|
211
|
+
| No git repo | "Not a git repository" | STOP |
|
|
212
|
+
| No changes | "No changes to ship" | STOP |
|
|
213
|
+
| Lint fails | Show warning | CONTINUE |
|
|
214
|
+
| Tests fail | Show warning | CONTINUE |
|
|
215
|
+
| Push fails | Show fix command | CONTINUE |
|
|
216
|
+
| No package.json | Skip version bump | CONTINUE |
|
|
217
|
+
|
|
218
|
+
## Examples
|
|
219
|
+
|
|
220
|
+
### Example 1: Full Success
|
|
221
|
+
```
|
|
222
|
+
🚀 Shipped: user authentication
|
|
223
|
+
|
|
224
|
+
Version: 1.2.0 → 1.3.0
|
|
225
|
+
Lint: passed
|
|
226
|
+
Tests: passed
|
|
227
|
+
Commit: abc1234
|
|
228
|
+
|
|
229
|
+
Next: /p:feature | /p:recap | compact
|
|
32
230
|
```
|
|
33
231
|
|
|
34
|
-
|
|
35
|
-
|
|
232
|
+
### Example 2: With Warnings
|
|
233
|
+
```
|
|
234
|
+
🚀 Shipped: bug fixes
|
|
235
|
+
|
|
236
|
+
Version: 1.2.0 → 1.2.1
|
|
237
|
+
Lint: warnings (non-blocking)
|
|
238
|
+
Tests: skipped
|
|
239
|
+
Commit: def5678
|
|
240
|
+
|
|
241
|
+
⚠️ Consider fixing lint warnings
|
|
242
|
+
|
|
243
|
+
Next: /p:feature | /p:recap | compact
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Example 3: No Tests/Lint
|
|
247
|
+
```
|
|
248
|
+
🚀 Shipped: documentation update
|
|
249
|
+
|
|
250
|
+
Version: 1.2.0 → 1.2.1
|
|
251
|
+
Lint: skipped (no script)
|
|
252
|
+
Tests: skipped (no script)
|
|
253
|
+
Commit: ghi9012
|
|
254
|
+
|
|
255
|
+
Next: /p:feature | /p:recap | compact
|
|
256
|
+
```
|