prjct-cli 0.10.9 → 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.
@@ -1,34 +1,275 @@
1
1
  ---
2
- allowed-tools: [Read, Write, Bash, GetTimestamp, GetDate]
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
- ## Think First
11
- Before creating feature, analyze:
12
- 1. Is this a simple or complex feature?
13
- 2. What files/components will be affected?
14
- 3. Are there dependencies or blockers?
15
- 4. Should I create a /p:spec first?
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
- ## Flow
18
+ ## Step 1: Read Config
18
19
 
19
- 1. **Value**: Impact/effort/timing → do_now/defer/blocked
20
- 2. **Roadmap**: Add to `planning/roadmap.md` (30 days max)
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
- **No params**: Show 6 categories (UI/Performance/Features/Quality/Bugs/Docs)
23
+ IF file not found:
24
+ OUTPUT: "No prjct project. Run /p:init first."
25
+ STOP
26
26
 
27
- ## Data
27
+ ## Step 2: Handle No Parameters
28
28
 
29
- Session: `{"ts":"{GetTimestamp()}","type":"feature_add","name":"{f}","tasks":{n},"impact":"{h/m/l}","effort":"{Xh}"}`
30
- Roadmap: `- [ ] {feature} ({n} tasks, {Xh}) - {GetDate()}`
29
+ IF no feature description provided:
30
+ OUTPUT interactive menu:
31
+ ```
32
+ What kind of feature?
31
33
 
32
- ## Response
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
- `✅ {feature} | Impact: {impact} | {n} tasks | Starting #{1}`
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, GetTimestamp, GetDate]
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
- ## Think First
11
- Before shipping, verify:
12
- 1. Are there uncommitted changes to include?
13
- 2. What version bump is needed (patch/minor/major)?
14
- 3. Is the feature actually complete?
15
- 4. Should tests run first?
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
- ## Workflow (non-blocking)
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
- ## Data
26
- Session: `{"ts":"{GetTimestamp()}","type":"feature_ship","name":"{f}","agent":"{a}","version":"{v}"}`
18
+ READ: `.prjct/prjct.config.json`
19
+ EXTRACT: `projectId`
27
20
 
28
- Commit footer:
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
- ## Response
35
- `🚀 {feature} | {agent} | {time} | v{version} | Next: compact`
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
+ ```