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.
@@ -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-skill,uiuxpromax)')
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) => {
@@ -1,5 +1,5 @@
1
1
  {
2
- "frameworkVersion": "1.0.126",
3
- "bundledAt": "2026-03-28T02:42:16.988Z",
4
- "bundledFrom": "78687d9"
2
+ "frameworkVersion": "1.0.128",
3
+ "bundledAt": "2026-03-28T06:01:48.243Z",
4
+ "bundledFrom": "ece8a06"
5
5
  }
@@ -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 -a 2>/dev/null \
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 -u 2>/dev/null || true
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 -u 2>/dev/null || true
243
- git -C "$project_root" commit --no-verify --amend --no-edit -a 2>/dev/null \
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.126",
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": "ui-ux-pro-max",
332
- "description": "UI/UX design review and suggestions",
333
- "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill",
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. **Ask execution mode**: Present the user with a choice before launching:
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
- Default to option 1 if user says "just run it" or doesn't specify. Default to option 2 only if user explicitly says "background", "detached", or "run in background".
116
+ **Runtime Options:**
120
117
 
121
- **If option 1 (foreground)**:
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
- dev-pipeline/run-bugfix.sh run bug-fix-list.json
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
- **If option 2 (background)**:
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
- After launch, **record the decision** for traceability:
165
+ With all options:
131
166
  ```bash
132
- echo "[$(date -u +%Y-%m-%dT%H:%M:%S)] MODE=daemon PID=$(cat dev-pipeline/bugfix-state/daemon.pid 2>/dev/null) BUG_LIST=bug-fix-list.json BUGS=$(python3 -c "import json; print(len(json.load(open('bug-fix-list.json')).get('bugs',[])))")" >> .prizmkit/bugfix-pipeline-run.log
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
- **If option 3 (manual)**: Print commands and stop. Do not execute anything.
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? It will process N bugs (by severity order)."
183
+ 5. **Ask user to confirm**: "Ready to launch the bugfix pipeline with the above settings?"
149
184
 
150
- 6. **Launch** (based on chosen mode see step 4).
185
+ 6. **Launch** with the assembled command from step 4.
151
186
 
152
- 7. **Verify launch**:
153
- ```bash
154
- dev-pipeline/launch-bugfix-daemon.sh status
155
- ```
187
+ 7. **Post-launch** (depends on execution mode):
156
188
 
157
- 8. **Start log monitoring** (daemon mode only) -- Use the Bash tool with `run_in_background: true`:
158
- ```bash
159
- tail -f dev-pipeline/bugfix-state/pipeline-daemon.log
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
- 9. **Report to user**:
164
- - Execution mode chosen
165
- - Pipeline PID (daemon mode) or session status (foreground)
166
- - Log file location
167
- - "You can ask me 'bugfix status' or 'show fix logs' at any time"
168
- - (daemon mode only) "Closing this session will NOT stop the pipeline"
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: Custom Parameters
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. **Ask execution mode**: Present the user with a choice before launching:
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
- Default to option 1 if user says "just run it" or doesn't specify. Default to option 2 only if user explicitly says "background", "detached", or "run in background".
110
+ **Runtime Options:**
114
111
 
115
- **If option 1 (foreground)**:
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
- If user wants to run only specific features:
152
+ With all options:
120
153
  ```bash
121
- dev-pipeline/run.sh run feature-list.json --features F-001:F-005
122
- dev-pipeline/run.sh run feature-list.json --features F-001,F-003,F-007
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
- **If option 2 (background)**:
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 feature filter:
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
- **If option 3 (manual)**: Print commands and stop. Do not execute anything.
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 whether to enable Critic Agent** (adversarial review):
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
- 7. **Launch** (based on chosen mode from step 4, with `ENABLE_CRITIC=true` env var if chosen in step 5):
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
- 8. **Verify launch**:
167
- ```bash
168
- dev-pipeline/launch-daemon.sh status
169
- ```
184
+ 7. **Post-launch** (depends on execution mode):
170
185
 
171
- 9. **Start log monitoring** -- Use the Bash tool with `run_in_background: true`:
172
- ```bash
173
- tail -f dev-pipeline/state/pipeline-daemon.log
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
- 10. **Report to user**:
178
- - Pipeline PID
179
- - Log file location
180
- - "You can ask me 'pipeline status' or 'show logs' at any time"
181
- - "Closing this session will NOT stop the pipeline"
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: Custom Parameters
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, suggest running `prizmkit-retrospective` for `.prizm-docs/` architecture sync, or ask user what's next.
320
+ - **HANDOFF**: After pipeline completes all features, each session has already run `prizmkit-retrospective` internally. Ask user what's next.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "prizmkit",
3
- "version": "1.0.126",
3
+ "version": "1.0.128",
4
4
  "description": "Create a new PrizmKit-powered project with clean initialization — no framework dev files, just what you need.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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 the skill.
5
- * When run non-interactively (stdio: 'pipe'), npx skills only writes the canonical
6
- * .agents/skills/<name>/SKILL.md without creating any platform symlinks.
7
- * We read that file, copy it to the selected platform dir(s), then clean up
8
- * .agents/ and skills-lock.json.
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 {string} - GitHub URL
18
- * skill.name {string} - Skill name as listed in the repo
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
- const cmd = `npx skills add ${skill.repo} --skill ${skill.name} --yes`;
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
- for (const t of targets) console.log(` [dry-run] → ${t}`);
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, writes only .agents/skills/<name>/SKILL.md
39
- execSync(cmd, { cwd: projectRoot, stdio: 'pipe', timeout: 60000 });
49
+ // stdio: 'pipe' → npx skills runs non-interactively
50
+ execSync(cmd, { cwd: projectRoot, stdio: 'pipe', timeout: 120000 });
40
51
 
41
- const canonicalSkillMd = path.join(projectRoot, '.agents', 'skills', skill.name, 'SKILL.md');
42
- if (!await fs.pathExists(canonicalSkillMd)) {
43
- throw new Error(`npx skills did not produce .agents/skills/${skill.name}/SKILL.md`);
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
- const content = await fs.readFile(canonicalSkillMd, 'utf8');
47
-
48
- // Copy to selected platform dir(s)
49
- // npx skills may have created symlinks (e.g. .claude/skills/<name> -> ../../.agents/skills/<name>)
50
- // We must remove those symlinks first so we can write a real directory with the actual content.
51
- for (const targetDir of getTargetDirs(platform, projectRoot)) {
52
- const skillDir = path.join(targetDir, skill.name);
53
- // Remove any existing symlink or directory at this path before creating a real dir
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