prizmkit 1.0.126 → 1.0.128
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/bin/create-prizmkit.js +1 -1
- package/bundled/VERSION.json +3 -3
- package/bundled/dev-pipeline/lib/common.sh +29 -4
- package/bundled/dev-pipeline/run-bugfix.sh +4 -1
- package/bundled/dev-pipeline/run.sh +6 -3
- package/bundled/skills/_metadata.json +8 -5
- package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +72 -51
- package/bundled/skills/dev-pipeline-launcher/SKILL.md +74 -98
- package/package.json +1 -1
- package/src/external-skills.js +57 -28
package/bin/create-prizmkit.js
CHANGED
|
@@ -36,7 +36,7 @@ program
|
|
|
36
36
|
.option('--no-pipeline', 'Disable dev-pipeline')
|
|
37
37
|
.option('--rules <preset>', 'Rules preset: recommended, minimal, or none', 'recommended')
|
|
38
38
|
.option('--ai-cli <command>', 'AI CLI executable command (e.g. cbc, claude, claude-internal)')
|
|
39
|
-
.option('--external-skills <names>', 'Comma-separated external skill names to install (e.g. find-
|
|
39
|
+
.option('--external-skills <names>', 'Comma-separated external skill names to install (e.g. find-skills,impeccable)')
|
|
40
40
|
.option('--non-interactive', 'Skip interactive prompts (requires --platform)')
|
|
41
41
|
.option('--dry-run', 'Show what would be created without making changes')
|
|
42
42
|
.action(async (directory = '.', options) => {
|
package/bundled/VERSION.json
CHANGED
|
@@ -43,6 +43,10 @@ try:
|
|
|
43
43
|
with open('.prizmkit/config.json') as f:
|
|
44
44
|
d = json.load(f)
|
|
45
45
|
v = d.get('ai_cli', '')
|
|
46
|
+
if not v:
|
|
47
|
+
p = d.get('platform', '')
|
|
48
|
+
if p == 'claude': v = 'claude'
|
|
49
|
+
elif p == 'codebuddy': v = 'cbc'
|
|
46
50
|
if v: print(v)
|
|
47
51
|
except: pass
|
|
48
52
|
" 2>/dev/null || true)
|
|
@@ -50,20 +54,20 @@ except: pass
|
|
|
50
54
|
_raw_cli="$_config_ai_cli"
|
|
51
55
|
elif [[ -n "${CODEBUDDY_CLI:-}" ]]; then
|
|
52
56
|
_raw_cli="$CODEBUDDY_CLI"
|
|
53
|
-
elif command -v cbc &>/dev/null; then
|
|
54
|
-
_raw_cli="cbc"
|
|
55
57
|
elif command -v claude &>/dev/null; then
|
|
56
58
|
_raw_cli="claude"
|
|
59
|
+
elif command -v cbc &>/dev/null; then
|
|
60
|
+
_raw_cli="cbc"
|
|
57
61
|
else
|
|
58
62
|
echo "ERROR: No AI CLI found. Install CodeBuddy (cbc) or Claude Code (claude)." >&2
|
|
59
63
|
exit 1
|
|
60
64
|
fi
|
|
61
65
|
elif [[ -n "${CODEBUDDY_CLI:-}" ]]; then
|
|
62
66
|
_raw_cli="$CODEBUDDY_CLI"
|
|
63
|
-
elif command -v cbc &>/dev/null; then
|
|
64
|
-
_raw_cli="cbc"
|
|
65
67
|
elif command -v claude &>/dev/null; then
|
|
66
68
|
_raw_cli="claude"
|
|
69
|
+
elif command -v cbc &>/dev/null; then
|
|
70
|
+
_raw_cli="cbc"
|
|
67
71
|
else
|
|
68
72
|
echo "ERROR: No AI CLI found. Install CodeBuddy (cbc) or Claude Code (claude)." >&2
|
|
69
73
|
exit 1
|
|
@@ -84,6 +88,27 @@ except: pass
|
|
|
84
88
|
export PRIZMKIT_PLATFORM="$PLATFORM"
|
|
85
89
|
}
|
|
86
90
|
|
|
91
|
+
# prizm_detect_subagents <session_log>
|
|
92
|
+
#
|
|
93
|
+
# Scan session log for subagent spawns and log the result.
|
|
94
|
+
# Uses grep -q for early exit on first match.
|
|
95
|
+
# Requires: USE_STREAM_JSON (from detect_stream_json_support)
|
|
96
|
+
prizm_detect_subagents() {
|
|
97
|
+
local session_log="$1"
|
|
98
|
+
[[ -f "$session_log" ]] || return 0
|
|
99
|
+
|
|
100
|
+
local has_subagent=false
|
|
101
|
+
if [[ "$USE_STREAM_JSON" == "true" ]]; then
|
|
102
|
+
grep -q '"name"[[:space:]]*:[[:space:]]*"Agent"' "$session_log" 2>/dev/null && has_subagent=true
|
|
103
|
+
else
|
|
104
|
+
grep -qE '(Tool: Agent|"tool":\s*"Agent"|tool_use.*Agent|subagent_type)' "$session_log" 2>/dev/null && has_subagent=true
|
|
105
|
+
fi
|
|
106
|
+
|
|
107
|
+
if [[ "$has_subagent" == true ]]; then
|
|
108
|
+
log_info "Subagent calls detected in session"
|
|
109
|
+
fi
|
|
110
|
+
}
|
|
111
|
+
|
|
87
112
|
# Common dependency check (jq + python3 + optional CLI in PATH)
|
|
88
113
|
# Args:
|
|
89
114
|
# $1 - cli command (optional)
|
|
@@ -215,7 +215,7 @@ spawn_and_wait_session() {
|
|
|
215
215
|
if [[ -n "$dirty_files" ]]; then
|
|
216
216
|
log_info "Auto-committing remaining session artifacts..."
|
|
217
217
|
git -C "$project_root" add -A 2>/dev/null || true
|
|
218
|
-
git -C "$project_root" commit --no-verify --amend --no-edit
|
|
218
|
+
git -C "$project_root" commit --no-verify --amend --no-edit 2>/dev/null \
|
|
219
219
|
|| git -C "$project_root" commit --no-verify -m "chore($bug_id): include remaining session artifacts" 2>/dev/null \
|
|
220
220
|
|| true
|
|
221
221
|
fi
|
|
@@ -224,6 +224,9 @@ spawn_and_wait_session() {
|
|
|
224
224
|
|
|
225
225
|
log_info "Session result: $session_status"
|
|
226
226
|
|
|
227
|
+
# Subagent detection
|
|
228
|
+
prizm_detect_subagents "$session_log"
|
|
229
|
+
|
|
227
230
|
# Update bug status
|
|
228
231
|
python3 "$SCRIPTS_DIR/update-bug-status.py" \
|
|
229
232
|
--bug-list "$bug_list" \
|
|
@@ -216,7 +216,7 @@ spawn_and_wait_session() {
|
|
|
216
216
|
uncommitted=$(git -C "$project_root" status --porcelain 2>/dev/null | head -1 || true)
|
|
217
217
|
if [[ -n "$uncommitted" ]]; then
|
|
218
218
|
log_warn "Session exited cleanly but produced no commits (uncommitted changes found) — auto-committing..."
|
|
219
|
-
git -C "$project_root" add -
|
|
219
|
+
git -C "$project_root" add -A 2>/dev/null || true
|
|
220
220
|
if git -C "$project_root" commit --no-verify -m "chore($feature_id): auto-commit session work" 2>/dev/null; then
|
|
221
221
|
log_info "Auto-commit succeeded"
|
|
222
222
|
session_status="success"
|
|
@@ -239,8 +239,8 @@ spawn_and_wait_session() {
|
|
|
239
239
|
dirty_files=$(git -C "$project_root" status --porcelain 2>/dev/null || true)
|
|
240
240
|
if [[ -n "$dirty_files" ]]; then
|
|
241
241
|
log_info "Auto-committing remaining session artifacts..."
|
|
242
|
-
git -C "$project_root" add -
|
|
243
|
-
git -C "$project_root" commit --no-verify --amend --no-edit
|
|
242
|
+
git -C "$project_root" add -A 2>/dev/null || true
|
|
243
|
+
git -C "$project_root" commit --no-verify --amend --no-edit 2>/dev/null \
|
|
244
244
|
|| git -C "$project_root" commit --no-verify -m "chore($feature_id): include remaining session artifacts" 2>/dev/null \
|
|
245
245
|
|| true
|
|
246
246
|
fi
|
|
@@ -249,6 +249,9 @@ spawn_and_wait_session() {
|
|
|
249
249
|
|
|
250
250
|
log_info "Session result: $session_status"
|
|
251
251
|
|
|
252
|
+
# Subagent detection
|
|
253
|
+
prizm_detect_subagents "$session_log"
|
|
254
|
+
|
|
252
255
|
# Write lightweight session summary for post-session inspection
|
|
253
256
|
local feature_slug
|
|
254
257
|
feature_slug=$(python3 -c "
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "1.0.
|
|
2
|
+
"version": "1.0.128",
|
|
3
3
|
"skills": {
|
|
4
4
|
"prizm-kit": {
|
|
5
5
|
"description": "Full-lifecycle dev toolkit. Covers spec-driven development, Prizm context docs, code quality, debugging, deployment, and knowledge management.",
|
|
@@ -328,12 +328,15 @@
|
|
|
328
328
|
]
|
|
329
329
|
},
|
|
330
330
|
{
|
|
331
|
-
"name": "
|
|
332
|
-
"description": "UI/UX design
|
|
333
|
-
"repo": "
|
|
331
|
+
"name": "impeccable",
|
|
332
|
+
"description": "Production-grade UI/UX design skills (21 skills: frontend-design, adapt, animate, polish, etc.)",
|
|
333
|
+
"repo": "pbakaus/impeccable",
|
|
334
|
+
"installAll": true,
|
|
334
335
|
"tags": [
|
|
335
336
|
"design",
|
|
336
|
-
"frontend"
|
|
337
|
+
"frontend",
|
|
338
|
+
"ui",
|
|
339
|
+
"ux"
|
|
337
340
|
]
|
|
338
341
|
}
|
|
339
342
|
]
|
|
@@ -111,61 +111,100 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
111
111
|
--action status 2>/dev/null
|
|
112
112
|
```
|
|
113
113
|
|
|
114
|
-
4. **
|
|
115
|
-
- **(1) Foreground in session (recommended)**: Pipeline runs in the current session via `run-bugfix.sh run`. Visible output and direct error feedback.
|
|
116
|
-
- **(2) Background daemon**: Pipeline runs fully detached via `launch-bugfix-daemon.sh`. Survives session closure. Use only when user explicitly requests background execution.
|
|
117
|
-
- **(3) Manual — show commands**: Display the exact commands the user can run themselves. No execution.
|
|
114
|
+
4. **Present all runtime options**: Show the user a complete options summary before launching. Present each option with its default, so the user can confirm or override.
|
|
118
115
|
|
|
119
|
-
|
|
116
|
+
**Runtime Options:**
|
|
120
117
|
|
|
121
|
-
|
|
118
|
+
| Option | Default | Description |
|
|
119
|
+
|--------|---------|-------------|
|
|
120
|
+
| **Execution mode** | Foreground | (1) Foreground — visible output (2) Background daemon — survives session closure (3) Manual — show commands only |
|
|
121
|
+
| **Verbose logging** | On | Detailed AI session logs including tool calls and subagent activity |
|
|
122
|
+
| **Max retries** | 3 | Max retry attempts per failed bug |
|
|
123
|
+
| **Session timeout** | None | Per-bug timeout in seconds (e.g. `3600` = 1 hour) |
|
|
124
|
+
| **Bug filter** | All | Run specific bugs: `B-001:B-005` (range), `B-001,B-003` (list), or mixed `B-001,B-005:B-010` |
|
|
125
|
+
|
|
126
|
+
Default to Foreground + Verbose On if user doesn't specify.
|
|
127
|
+
|
|
128
|
+
**Environment variable mapping** (for natural language → env var translation):
|
|
129
|
+
|
|
130
|
+
| User says | Environment variable |
|
|
131
|
+
|-----------|---------------------|
|
|
132
|
+
| "timeout 2 hours" | `SESSION_TIMEOUT=7200` |
|
|
133
|
+
| "max 5 retries" | `MAX_RETRIES=5` |
|
|
134
|
+
| "no verbose" / "quiet" | `VERBOSE=0` |
|
|
135
|
+
| "heartbeat every 60s" | `HEARTBEAT_INTERVAL=60` |
|
|
136
|
+
|
|
137
|
+
Example presentation to user:
|
|
138
|
+
```
|
|
139
|
+
Bugfix pipeline will process N bugs with these settings:
|
|
140
|
+
- Execution: Foreground (recommended)
|
|
141
|
+
- Verbose: On (subagent detection enabled)
|
|
142
|
+
- Max retries: 3
|
|
143
|
+
- Timeout: none
|
|
144
|
+
- Bugs: all (by severity order)
|
|
145
|
+
|
|
146
|
+
Want to change any options, or launch with these defaults?
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Execution mode details:**
|
|
150
|
+
|
|
151
|
+
**Foreground (recommended)**: Pipeline runs in the current session via `run-bugfix.sh run`. Provides visible output and direct error feedback.
|
|
152
|
+
```bash
|
|
153
|
+
VERBOSE=1 dev-pipeline/run-bugfix.sh run bug-fix-list.json
|
|
154
|
+
```
|
|
155
|
+
With all options:
|
|
122
156
|
```bash
|
|
123
|
-
|
|
157
|
+
VERBOSE=1 MAX_RETRIES=5 SESSION_TIMEOUT=3600 \
|
|
158
|
+
dev-pipeline/run-bugfix.sh run bug-fix-list.json
|
|
124
159
|
```
|
|
125
160
|
|
|
126
|
-
**
|
|
161
|
+
**Background daemon**: Pipeline runs fully detached via `launch-bugfix-daemon.sh`. Survives session closure. Use only when user explicitly requests background execution.
|
|
127
162
|
```bash
|
|
128
|
-
dev-pipeline/launch-bugfix-daemon.sh start bug-fix-list.json
|
|
163
|
+
dev-pipeline/launch-bugfix-daemon.sh start bug-fix-list.json --env "VERBOSE=1"
|
|
129
164
|
```
|
|
130
|
-
|
|
165
|
+
With all options:
|
|
131
166
|
```bash
|
|
132
|
-
|
|
167
|
+
dev-pipeline/launch-bugfix-daemon.sh start bug-fix-list.json \
|
|
168
|
+
--env "VERBOSE=1 MAX_RETRIES=5"
|
|
133
169
|
```
|
|
134
|
-
Note: Pipeline runs fully detached. Survives session closure.
|
|
135
170
|
|
|
136
|
-
**
|
|
171
|
+
**Manual — show commands**: Display the exact commands the user can run themselves. Print commands and stop. Do not execute anything.
|
|
137
172
|
```
|
|
138
173
|
# To run in foreground (recommended):
|
|
139
|
-
dev-pipeline/run-bugfix.sh run bug-fix-list.json
|
|
174
|
+
VERBOSE=1 dev-pipeline/run-bugfix.sh run bug-fix-list.json
|
|
140
175
|
|
|
141
176
|
# To run in background (detached):
|
|
142
|
-
dev-pipeline/launch-bugfix-daemon.sh start bug-fix-list.json
|
|
177
|
+
dev-pipeline/launch-bugfix-daemon.sh start bug-fix-list.json --env "VERBOSE=1"
|
|
143
178
|
|
|
144
179
|
# To check status:
|
|
145
180
|
dev-pipeline/run-bugfix.sh status bug-fix-list.json
|
|
146
181
|
```
|
|
147
182
|
|
|
148
|
-
5. **Ask user to confirm**: "Ready to launch the bugfix pipeline
|
|
183
|
+
5. **Ask user to confirm**: "Ready to launch the bugfix pipeline with the above settings?"
|
|
149
184
|
|
|
150
|
-
6. **Launch**
|
|
185
|
+
6. **Launch** with the assembled command from step 4.
|
|
151
186
|
|
|
152
|
-
7. **
|
|
153
|
-
```bash
|
|
154
|
-
dev-pipeline/launch-bugfix-daemon.sh status
|
|
155
|
-
```
|
|
187
|
+
7. **Post-launch** (depends on execution mode):
|
|
156
188
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
This runs in background so you can continue interacting with the user.
|
|
189
|
+
**If foreground**: Pipeline runs to completion in the terminal. After it finishes:
|
|
190
|
+
- Summarize results: total bugs, fixed, failed, skipped
|
|
191
|
+
- If all fixed: each bug session has already run `prizmkit-retrospective` (structural sync) internally. Ask user what's next.
|
|
192
|
+
- If some failed: show failed bug IDs and suggest `retry-bug.sh <B-XXX>` or `reset-bug.sh <B-XXX> --clean --run`
|
|
162
193
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
194
|
+
**If background daemon**:
|
|
195
|
+
1. Verify launch:
|
|
196
|
+
```bash
|
|
197
|
+
dev-pipeline/launch-bugfix-daemon.sh status
|
|
198
|
+
```
|
|
199
|
+
2. Start log monitoring — Use the Bash tool with `run_in_background: true`:
|
|
200
|
+
```bash
|
|
201
|
+
tail -f dev-pipeline/bugfix-state/pipeline-daemon.log
|
|
202
|
+
```
|
|
203
|
+
3. Report to user:
|
|
204
|
+
- Pipeline PID
|
|
205
|
+
- Log file location
|
|
206
|
+
- "You can ask me 'bugfix status' or 'show fix logs' at any time"
|
|
207
|
+
- "Closing this session will NOT stop the pipeline"
|
|
169
208
|
|
|
170
209
|
---
|
|
171
210
|
|
|
@@ -236,25 +275,7 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
236
275
|
|
|
237
276
|
---
|
|
238
277
|
|
|
239
|
-
#### Intent E:
|
|
240
|
-
|
|
241
|
-
When user specifies custom settings, map to environment variables:
|
|
242
|
-
|
|
243
|
-
| User says | Environment variable |
|
|
244
|
-
|-----------|---------------------|
|
|
245
|
-
| "timeout 2 hours" | `SESSION_TIMEOUT=7200` |
|
|
246
|
-
| "max 5 retries" | `MAX_RETRIES=5` |
|
|
247
|
-
| "verbose mode" | `VERBOSE=1` |
|
|
248
|
-
| "heartbeat every 60s" | `HEARTBEAT_INTERVAL=60` |
|
|
249
|
-
|
|
250
|
-
Pass via `--env`:
|
|
251
|
-
```bash
|
|
252
|
-
dev-pipeline/launch-bugfix-daemon.sh start bug-fix-list.json --env "SESSION_TIMEOUT=7200 MAX_RETRIES=5 VERBOSE=1"
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
---
|
|
256
|
-
|
|
257
|
-
#### Intent F: Retry Single Bug
|
|
278
|
+
#### Intent E: Retry Single Bug
|
|
258
279
|
|
|
259
280
|
When user says "retry B-001":
|
|
260
281
|
|
|
@@ -105,80 +105,103 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
105
105
|
--action status 2>/dev/null
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
4. **
|
|
109
|
-
- **(1) Foreground in session (recommended)**: Pipeline runs in the current session via `run.sh run`. Visible output and direct error feedback.
|
|
110
|
-
- **(2) Background daemon**: Pipeline runs fully detached via `launch-daemon.sh`. Survives session closure. Use only when user explicitly requests background execution.
|
|
111
|
-
- **(3) Manual — show commands**: Display the exact commands the user can run themselves. No execution.
|
|
108
|
+
4. **Present all runtime options**: Show the user a complete options summary before launching. Present each option with its default, so the user can confirm or override.
|
|
112
109
|
|
|
113
|
-
|
|
110
|
+
**Runtime Options:**
|
|
114
111
|
|
|
115
|
-
|
|
112
|
+
| Option | Default | Description |
|
|
113
|
+
|--------|---------|-------------|
|
|
114
|
+
| **Execution mode** | Foreground | (1) Foreground — visible output (2) Background daemon — survives session closure (3) Manual — show commands only |
|
|
115
|
+
| **Critic review** | Off | Adversarial review after planning & implementation. Increases time ~5-10 min/feature |
|
|
116
|
+
| **Verbose logging** | On | Detailed AI session logs including tool calls and subagent activity |
|
|
117
|
+
| **Max retries** | 3 | Max retry attempts per failed feature |
|
|
118
|
+
| **Session timeout** | None | Per-feature timeout in seconds (e.g. `3600` = 1 hour) |
|
|
119
|
+
| **Feature filter** | All | Run specific features: `F-001:F-005` (range), `F-001,F-003` (list), or mixed `F-001,F-005:F-010` |
|
|
120
|
+
|
|
121
|
+
Default to Foreground + Verbose On if user doesn't specify. Default Critic to Off unless features have `estimated_complexity: "high"` or above.
|
|
122
|
+
|
|
123
|
+
**Environment variable mapping** (for natural language → env var translation):
|
|
124
|
+
|
|
125
|
+
| User says | Environment variable |
|
|
126
|
+
|-----------|---------------------|
|
|
127
|
+
| "timeout 2 hours" | `SESSION_TIMEOUT=7200` |
|
|
128
|
+
| "max 5 retries" | `MAX_RETRIES=5` |
|
|
129
|
+
| "no verbose" / "quiet" | `VERBOSE=0` |
|
|
130
|
+
| "heartbeat every 60s" | `HEARTBEAT_INTERVAL=60` |
|
|
131
|
+
| "enable critic review" | `ENABLE_CRITIC=true` |
|
|
132
|
+
|
|
133
|
+
Example presentation to user:
|
|
134
|
+
```
|
|
135
|
+
Pipeline will process N features with these settings:
|
|
136
|
+
- Execution: Foreground (recommended)
|
|
137
|
+
- Critic: Off
|
|
138
|
+
- Verbose: On (subagent detection enabled)
|
|
139
|
+
- Max retries: 3
|
|
140
|
+
- Timeout: none
|
|
141
|
+
- Features: all
|
|
142
|
+
|
|
143
|
+
Want to change any options, or launch with these defaults?
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
**Execution mode details:**
|
|
147
|
+
|
|
148
|
+
**Foreground (recommended)**: Pipeline runs in the current session via `run.sh run`. Provides visible output and direct error feedback.
|
|
116
149
|
```bash
|
|
117
|
-
dev-pipeline/run.sh run feature-list.json
|
|
150
|
+
VERBOSE=1 dev-pipeline/run.sh run feature-list.json
|
|
118
151
|
```
|
|
119
|
-
|
|
152
|
+
With all options:
|
|
120
153
|
```bash
|
|
121
|
-
|
|
122
|
-
|
|
154
|
+
VERBOSE=1 ENABLE_CRITIC=true MAX_RETRIES=5 SESSION_TIMEOUT=3600 \
|
|
155
|
+
dev-pipeline/run.sh run feature-list.json --features F-001:F-005
|
|
123
156
|
```
|
|
124
157
|
|
|
125
|
-
**
|
|
158
|
+
**Background daemon**: Pipeline runs fully detached via `launch-daemon.sh`. Survives session closure. Use only when user explicitly requests background execution.
|
|
126
159
|
```bash
|
|
127
|
-
dev-pipeline/launch-daemon.sh start feature-list.json
|
|
160
|
+
dev-pipeline/launch-daemon.sh start feature-list.json --env "VERBOSE=1"
|
|
128
161
|
```
|
|
129
|
-
With
|
|
162
|
+
With all options:
|
|
130
163
|
```bash
|
|
131
|
-
dev-pipeline/launch-daemon.sh start feature-list.json --features F-001:F-005
|
|
164
|
+
dev-pipeline/launch-daemon.sh start feature-list.json --features F-001:F-005 \
|
|
165
|
+
--env "VERBOSE=1 ENABLE_CRITIC=true MAX_RETRIES=5"
|
|
132
166
|
```
|
|
133
|
-
Note: Pipeline runs fully detached. Survives session closure.
|
|
134
167
|
|
|
135
|
-
**
|
|
168
|
+
**Manual — show commands**: Display the exact commands the user can run themselves. Print commands and stop. Do not execute anything.
|
|
136
169
|
```
|
|
137
170
|
# To run in foreground (recommended):
|
|
138
|
-
dev-pipeline/run.sh run feature-list.json
|
|
171
|
+
VERBOSE=1 dev-pipeline/run.sh run feature-list.json
|
|
139
172
|
|
|
140
173
|
# To run in background (detached):
|
|
141
|
-
dev-pipeline/launch-daemon.sh start feature-list.json
|
|
174
|
+
dev-pipeline/launch-daemon.sh start feature-list.json --env "VERBOSE=1"
|
|
142
175
|
|
|
143
176
|
# To check status:
|
|
144
177
|
dev-pipeline/run.sh status feature-list.json
|
|
145
178
|
```
|
|
146
179
|
|
|
147
|
-
5. **Ask
|
|
148
|
-
Present the choice:
|
|
149
|
-
- **(a) No — standard pipeline (default)**: No adversarial review. Faster execution, lower token cost.
|
|
150
|
-
- **(b) Yes — enable Critic review**: Adds adversarial challenge after planning and implementation. Challenges plan fitness and code integration quality. Increases pipeline time by ~5-10 minutes per feature.
|
|
151
|
-
|
|
152
|
-
Default to (a). Only suggest (b) if features have `estimated_complexity: "high"` or above.
|
|
153
|
-
|
|
154
|
-
If user chooses (b), prepend `ENABLE_CRITIC=true` to the launch command in step 6.
|
|
155
|
-
|
|
156
|
-
6. **Ask user to confirm**: "Ready to launch the pipeline? It will process N features."
|
|
180
|
+
5. **Ask user to confirm**: "Ready to launch the pipeline with the above settings?"
|
|
157
181
|
|
|
158
|
-
|
|
159
|
-
- Foreground: `ENABLE_CRITIC=true dev-pipeline/run.sh run feature-list.json`
|
|
160
|
-
- Background: `dev-pipeline/launch-daemon.sh start feature-list.json --env "ENABLE_CRITIC=true"`
|
|
161
|
-
- If user specified environment overrides:
|
|
162
|
-
```bash
|
|
163
|
-
dev-pipeline/launch-daemon.sh start feature-list.json --env "SESSION_TIMEOUT=7200 MAX_RETRIES=5"
|
|
164
|
-
```
|
|
182
|
+
6. **Launch** with the assembled command from step 4.
|
|
165
183
|
|
|
166
|
-
|
|
167
|
-
```bash
|
|
168
|
-
dev-pipeline/launch-daemon.sh status
|
|
169
|
-
```
|
|
184
|
+
7. **Post-launch** (depends on execution mode):
|
|
170
185
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
This runs in background so you can continue interacting with the user.
|
|
186
|
+
**If foreground**: Pipeline runs to completion in the terminal. After it finishes:
|
|
187
|
+
- Summarize results: total features, succeeded, failed, skipped
|
|
188
|
+
- If all succeeded: each feature session has already run `prizmkit-retrospective` internally. Ask user what's next.
|
|
189
|
+
- If some failed: show failed feature IDs and suggest `retry-feature.sh <F-XXX>` or `reset-feature.sh <F-XXX> --clean --run`
|
|
176
190
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
191
|
+
**If background daemon**:
|
|
192
|
+
1. Verify launch:
|
|
193
|
+
```bash
|
|
194
|
+
dev-pipeline/launch-daemon.sh status
|
|
195
|
+
```
|
|
196
|
+
2. Start log monitoring — Use the Bash tool with `run_in_background: true`:
|
|
197
|
+
```bash
|
|
198
|
+
tail -f dev-pipeline/state/pipeline-daemon.log
|
|
199
|
+
```
|
|
200
|
+
3. Report to user:
|
|
201
|
+
- Pipeline PID
|
|
202
|
+
- Log file location
|
|
203
|
+
- "You can ask me 'pipeline status' or 'show logs' at any time"
|
|
204
|
+
- "Closing this session will NOT stop the pipeline"
|
|
182
205
|
|
|
183
206
|
---
|
|
184
207
|
|
|
@@ -249,54 +272,7 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
249
272
|
|
|
250
273
|
---
|
|
251
274
|
|
|
252
|
-
#### Intent E:
|
|
253
|
-
|
|
254
|
-
When user specifies custom settings, map to environment variables:
|
|
255
|
-
|
|
256
|
-
| User says | Environment variable |
|
|
257
|
-
|-----------|---------------------|
|
|
258
|
-
| "timeout 2 hours" | `SESSION_TIMEOUT=7200` |
|
|
259
|
-
| "max 5 retries" | `MAX_RETRIES=5` |
|
|
260
|
-
| "verbose mode" | `VERBOSE=1` |
|
|
261
|
-
| "heartbeat every 60s" | `HEARTBEAT_INTERVAL=60` |
|
|
262
|
-
| "enable critic review" | `ENABLE_CRITIC=true` env var (or `--critic` for single feature) |
|
|
263
|
-
|
|
264
|
-
Pass via `--env`:
|
|
265
|
-
```bash
|
|
266
|
-
dev-pipeline/launch-daemon.sh start feature-list.json --env "SESSION_TIMEOUT=7200 MAX_RETRIES=5 VERBOSE=1"
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
---
|
|
270
|
-
|
|
271
|
-
#### Intent F: Run Subset of Features
|
|
272
|
-
|
|
273
|
-
When user says "run only F-001 to F-005", "only build features 1 through 5":
|
|
274
|
-
|
|
275
|
-
```bash
|
|
276
|
-
dev-pipeline/run.sh run feature-list.json --features F-001:F-005
|
|
277
|
-
```
|
|
278
|
-
|
|
279
|
-
When user says "run F-001, F-003, and F-007", "only build these three features":
|
|
280
|
-
|
|
281
|
-
```bash
|
|
282
|
-
dev-pipeline/run.sh run feature-list.json --features F-001,F-003,F-007
|
|
283
|
-
```
|
|
284
|
-
|
|
285
|
-
Mixed format (IDs + ranges):
|
|
286
|
-
|
|
287
|
-
```bash
|
|
288
|
-
dev-pipeline/run.sh run feature-list.json --features F-001,F-005:F-010
|
|
289
|
-
```
|
|
290
|
-
|
|
291
|
-
Background daemon with feature filter:
|
|
292
|
-
|
|
293
|
-
```bash
|
|
294
|
-
dev-pipeline/launch-daemon.sh start feature-list.json --features F-001:F-005
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
---
|
|
298
|
-
|
|
299
|
-
#### Intent G: Retry Single Feature Node
|
|
275
|
+
#### Intent E: Retry Single Feature Node
|
|
300
276
|
|
|
301
277
|
When user says "retry F-003":
|
|
302
278
|
|
|
@@ -341,4 +317,4 @@ Notes:
|
|
|
341
317
|
- **Single instance**: Only one pipeline can run at a time. The PID file prevents duplicates.
|
|
342
318
|
- **Pipeline coexistence**: Feature and bugfix pipelines use separate state directories (`state/` vs `bugfix-state/`), so they can run simultaneously without conflict.
|
|
343
319
|
- **State preservation**: Stopping and restarting the pipeline resumes from where it left off -- completed features are not re-run.
|
|
344
|
-
- **HANDOFF**: After pipeline completes all features,
|
|
320
|
+
- **HANDOFF**: After pipeline completes all features, each session has already run `prizmkit-retrospective` internally. Ask user what's next.
|
package/package.json
CHANGED
package/src/external-skills.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* External Skills Installer
|
|
3
3
|
*
|
|
4
|
-
* Delegates to `npx skills add <repo> --skill <name> --yes` to fetch
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* Delegates to `npx skills add <repo> [--skill <name>] --yes` to fetch skills.
|
|
5
|
+
* Supports two modes:
|
|
6
|
+
* - Single skill: `--skill <name>` selects one skill from a repo
|
|
7
|
+
* - Install all: installs all skills from a repo (e.g. pbakaus/impeccable)
|
|
8
|
+
*
|
|
9
|
+
* When run non-interactively (stdio: 'pipe'), npx skills writes canonical
|
|
10
|
+
* .agents/skills/<name>/SKILL.md files. We copy those to the selected
|
|
11
|
+
* platform dir(s), then clean up .agents/ and skills-lock.json.
|
|
9
12
|
*/
|
|
10
13
|
|
|
11
14
|
import { execSync } from 'node:child_process';
|
|
@@ -14,8 +17,9 @@ import fs from 'fs-extra';
|
|
|
14
17
|
|
|
15
18
|
/**
|
|
16
19
|
* @param {Object} skill - Skill definition from external_skills.known
|
|
17
|
-
* skill.repo
|
|
18
|
-
* skill.name
|
|
20
|
+
* skill.repo {string} - GitHub short ref (e.g. "pbakaus/impeccable") or full URL
|
|
21
|
+
* skill.name {string} - Skill name (used for display / single-skill mode)
|
|
22
|
+
* skill.installAll {boolean} - If true, install all skills from the repo
|
|
19
23
|
* @param {string} platform - 'claude' | 'codebuddy' | 'both'
|
|
20
24
|
* @param {string} projectRoot - Target project root
|
|
21
25
|
* @param {boolean} dryRun
|
|
@@ -25,35 +29,60 @@ export async function installExternalSkill(skill, platform, projectRoot, dryRun)
|
|
|
25
29
|
throw new Error(`Skill "${skill.name}" has no repo URL defined`);
|
|
26
30
|
}
|
|
27
31
|
|
|
28
|
-
|
|
32
|
+
// installAll: install entire repo (all skills), otherwise install single skill by name
|
|
33
|
+
const cmd = skill.installAll
|
|
34
|
+
? `npx skills add ${skill.repo} --yes`
|
|
35
|
+
: `npx skills add ${skill.repo} --skill ${skill.name} --yes`;
|
|
29
36
|
|
|
30
37
|
if (dryRun) {
|
|
31
|
-
const targets = getTargetDirs(platform, projectRoot)
|
|
32
|
-
.map(d => path.relative(projectRoot, path.join(d, skill.name, 'SKILL.md')));
|
|
33
38
|
console.log(` [dry-run] ${cmd}`);
|
|
34
|
-
|
|
39
|
+
if (skill.installAll) {
|
|
40
|
+
console.log(` [dry-run] → all skills from ${skill.repo}`);
|
|
41
|
+
} else {
|
|
42
|
+
const targets = getTargetDirs(platform, projectRoot)
|
|
43
|
+
.map(d => path.relative(projectRoot, path.join(d, skill.name, 'SKILL.md')));
|
|
44
|
+
for (const t of targets) console.log(` [dry-run] → ${t}`);
|
|
45
|
+
}
|
|
35
46
|
return;
|
|
36
47
|
}
|
|
37
48
|
|
|
38
|
-
// stdio: 'pipe' → npx skills runs non-interactively
|
|
39
|
-
execSync(cmd, { cwd: projectRoot, stdio: 'pipe', timeout:
|
|
49
|
+
// stdio: 'pipe' → npx skills runs non-interactively
|
|
50
|
+
execSync(cmd, { cwd: projectRoot, stdio: 'pipe', timeout: 120000 });
|
|
40
51
|
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
52
|
+
const agentsSkillsDir = path.join(projectRoot, '.agents', 'skills');
|
|
53
|
+
|
|
54
|
+
if (skill.installAll) {
|
|
55
|
+
// Repo-level install: copy ALL skill dirs from .agents/skills/ to platform dirs
|
|
56
|
+
if (!await fs.pathExists(agentsSkillsDir)) {
|
|
57
|
+
throw new Error(`npx skills did not produce .agents/skills/ for repo ${skill.repo}`);
|
|
58
|
+
}
|
|
59
|
+
const skillDirs = (await fs.readdir(agentsSkillsDir, { withFileTypes: true }))
|
|
60
|
+
.filter(d => d.isDirectory())
|
|
61
|
+
.map(d => d.name);
|
|
62
|
+
|
|
63
|
+
for (const targetDir of getTargetDirs(platform, projectRoot)) {
|
|
64
|
+
for (const skillName of skillDirs) {
|
|
65
|
+
const srcDir = path.join(agentsSkillsDir, skillName);
|
|
66
|
+
const destDir = path.join(targetDir, skillName);
|
|
67
|
+
await fs.remove(destDir).catch(() => {});
|
|
68
|
+
await fs.copy(srcDir, destDir);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
} else {
|
|
72
|
+
// Single-skill install
|
|
73
|
+
const canonicalSkillMd = path.join(agentsSkillsDir, skill.name, 'SKILL.md');
|
|
74
|
+
if (!await fs.pathExists(canonicalSkillMd)) {
|
|
75
|
+
throw new Error(`npx skills did not produce .agents/skills/${skill.name}/SKILL.md`);
|
|
76
|
+
}
|
|
45
77
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
await fs.remove(skillDir).catch(() => {});
|
|
55
|
-
await fs.ensureDir(skillDir);
|
|
56
|
-
await fs.writeFile(path.join(skillDir, 'SKILL.md'), content);
|
|
78
|
+
const content = await fs.readFile(canonicalSkillMd, 'utf8');
|
|
79
|
+
|
|
80
|
+
for (const targetDir of getTargetDirs(platform, projectRoot)) {
|
|
81
|
+
const skillDir = path.join(targetDir, skill.name);
|
|
82
|
+
await fs.remove(skillDir).catch(() => {});
|
|
83
|
+
await fs.ensureDir(skillDir);
|
|
84
|
+
await fs.writeFile(path.join(skillDir, 'SKILL.md'), content);
|
|
85
|
+
}
|
|
57
86
|
}
|
|
58
87
|
|
|
59
88
|
// Clean up npx skills artifacts after copying
|