prizmkit 1.1.57 → 1.1.60

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.
Files changed (188) hide show
  1. package/bin/create-prizmkit.js +8 -6
  2. package/bundled/VERSION.json +3 -3
  3. package/bundled/adapters/codex/agent-adapter.js +38 -0
  4. package/bundled/adapters/codex/paths.js +27 -0
  5. package/bundled/adapters/codex/rules-adapter.js +30 -0
  6. package/bundled/adapters/codex/settings-adapter.js +27 -0
  7. package/bundled/adapters/codex/skill-adapter.js +65 -0
  8. package/bundled/adapters/codex/team-adapter.js +37 -0
  9. package/bundled/dev-pipeline/.env.example +2 -1
  10. package/bundled/dev-pipeline/README.md +10 -7
  11. package/bundled/dev-pipeline/lib/common.sh +278 -37
  12. package/bundled/dev-pipeline/run-bugfix.sh +10 -61
  13. package/bundled/dev-pipeline/run-feature.sh +10 -78
  14. package/bundled/dev-pipeline/run-recovery.sh +10 -46
  15. package/bundled/dev-pipeline/run-refactor.sh +10 -61
  16. package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +17 -7
  17. package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +9 -3
  18. package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +9 -3
  19. package/bundled/dev-pipeline/scripts/utils.py +6 -4
  20. package/bundled/dev-pipeline-windows/.env.example +28 -0
  21. package/bundled/dev-pipeline-windows/README.md +30 -0
  22. package/bundled/dev-pipeline-windows/SCHEMA_ANALYSIS.md +525 -0
  23. package/bundled/dev-pipeline-windows/assets/feature-list-example.json +146 -0
  24. package/bundled/dev-pipeline-windows/assets/prizm-dev-team-integration.md +138 -0
  25. package/bundled/dev-pipeline-windows/launch-bugfix-daemon.ps1 +9 -0
  26. package/bundled/dev-pipeline-windows/launch-feature-daemon.ps1 +9 -0
  27. package/bundled/dev-pipeline-windows/launch-refactor-daemon.ps1 +9 -0
  28. package/bundled/dev-pipeline-windows/lib/common.ps1 +432 -0
  29. package/bundled/dev-pipeline-windows/lib/daemon.ps1 +140 -0
  30. package/bundled/dev-pipeline-windows/lib/pipeline.ps1 +446 -0
  31. package/bundled/dev-pipeline-windows/lib/reset.ps1 +87 -0
  32. package/bundled/dev-pipeline-windows/reset-bug.ps1 +9 -0
  33. package/bundled/dev-pipeline-windows/reset-feature.ps1 +9 -0
  34. package/bundled/dev-pipeline-windows/reset-refactor.ps1 +9 -0
  35. package/bundled/dev-pipeline-windows/run-bugfix.ps1 +9 -0
  36. package/bundled/dev-pipeline-windows/run-feature.ps1 +9 -0
  37. package/bundled/dev-pipeline-windows/run-recovery.ps1 +76 -0
  38. package/bundled/dev-pipeline-windows/run-refactor.ps1 +9 -0
  39. package/bundled/dev-pipeline-windows/scripts/check-session-status.py +228 -0
  40. package/bundled/dev-pipeline-windows/scripts/cleanup-logs.py +192 -0
  41. package/bundled/dev-pipeline-windows/scripts/detect-stuck.py +530 -0
  42. package/bundled/dev-pipeline-windows/scripts/generate-bootstrap-prompt.py +1737 -0
  43. package/bundled/dev-pipeline-windows/scripts/generate-bugfix-prompt.py +685 -0
  44. package/bundled/dev-pipeline-windows/scripts/generate-recovery-prompt.py +805 -0
  45. package/bundled/dev-pipeline-windows/scripts/generate-refactor-prompt.py +763 -0
  46. package/bundled/dev-pipeline-windows/scripts/init-bugfix-pipeline.py +316 -0
  47. package/bundled/dev-pipeline-windows/scripts/init-dev-team.py +134 -0
  48. package/bundled/dev-pipeline-windows/scripts/init-pipeline.py +380 -0
  49. package/bundled/dev-pipeline-windows/scripts/init-refactor-pipeline.py +399 -0
  50. package/bundled/dev-pipeline-windows/scripts/parse-stream-progress.py +388 -0
  51. package/bundled/dev-pipeline-windows/scripts/patch-completion-notes.py +191 -0
  52. package/bundled/dev-pipeline-windows/scripts/update-bug-status.py +864 -0
  53. package/bundled/dev-pipeline-windows/scripts/update-checkpoint.py +173 -0
  54. package/bundled/dev-pipeline-windows/scripts/update-feature-status.py +1501 -0
  55. package/bundled/dev-pipeline-windows/scripts/update-refactor-status.py +1073 -0
  56. package/bundled/dev-pipeline-windows/scripts/utils.py +542 -0
  57. package/bundled/dev-pipeline-windows/templates/agent-prompts/critic-plan-challenge.md +7 -0
  58. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-fix.md +7 -0
  59. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-implement.md +30 -0
  60. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-resume.md +5 -0
  61. package/bundled/dev-pipeline-windows/templates/agent-prompts/reviewer-review.md +7 -0
  62. package/bundled/dev-pipeline-windows/templates/bootstrap-prompt.md +46 -0
  63. package/bundled/dev-pipeline-windows/templates/bootstrap-tier1.md +43 -0
  64. package/bundled/dev-pipeline-windows/templates/bootstrap-tier2.md +43 -0
  65. package/bundled/dev-pipeline-windows/templates/bootstrap-tier3.md +43 -0
  66. package/bundled/dev-pipeline-windows/templates/bug-fix-list-schema.json +263 -0
  67. package/bundled/dev-pipeline-windows/templates/bugfix-bootstrap-prompt.md +320 -0
  68. package/bundled/dev-pipeline-windows/templates/feature-list-schema.json +237 -0
  69. package/bundled/dev-pipeline-windows/templates/refactor-bootstrap-prompt.md +331 -0
  70. package/bundled/dev-pipeline-windows/templates/refactor-list-schema.json +270 -0
  71. package/bundled/dev-pipeline-windows/templates/sections/ac-verification-checklist.md +13 -0
  72. package/bundled/dev-pipeline-windows/templates/sections/checkpoint-system.md +91 -0
  73. package/bundled/dev-pipeline-windows/templates/sections/context-budget-rules.md +33 -0
  74. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-agent.md +10 -0
  75. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-full.md +12 -0
  76. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-lite.md +7 -0
  77. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-agent.md +8 -0
  78. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-full.md +9 -0
  79. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-lite.md +6 -0
  80. package/bundled/dev-pipeline-windows/templates/sections/failure-capture.md +21 -0
  81. package/bundled/dev-pipeline-windows/templates/sections/feature-context.md +31 -0
  82. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification-auto.md +72 -0
  83. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification-opencli.md +63 -0
  84. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification.md +62 -0
  85. package/bundled/dev-pipeline-windows/templates/sections/phase-commit-full.md +71 -0
  86. package/bundled/dev-pipeline-windows/templates/sections/phase-commit.md +64 -0
  87. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-agent-suffix.md +23 -0
  88. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-base.md +24 -0
  89. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-lite-suffix.md +12 -0
  90. package/bundled/dev-pipeline-windows/templates/sections/phase-critic-plan-full.md +53 -0
  91. package/bundled/dev-pipeline-windows/templates/sections/phase-critic-plan.md +32 -0
  92. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-agent.md +37 -0
  93. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-full.md +50 -0
  94. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-lite.md +52 -0
  95. package/bundled/dev-pipeline-windows/templates/sections/phase-plan-agent.md +27 -0
  96. package/bundled/dev-pipeline-windows/templates/sections/phase-plan-lite.md +27 -0
  97. package/bundled/dev-pipeline-windows/templates/sections/phase-review-agent.md +27 -0
  98. package/bundled/dev-pipeline-windows/templates/sections/phase-review-full.md +29 -0
  99. package/bundled/dev-pipeline-windows/templates/sections/phase-specify-plan-full.md +77 -0
  100. package/bundled/dev-pipeline-windows/templates/sections/phase0-init.md +13 -0
  101. package/bundled/dev-pipeline-windows/templates/sections/phase0-test-baseline.md +23 -0
  102. package/bundled/dev-pipeline-windows/templates/sections/session-context.md +5 -0
  103. package/bundled/dev-pipeline-windows/templates/sections/subagent-timeout-recovery.md +6 -0
  104. package/bundled/dev-pipeline-windows/templates/sections/test-failure-recovery-agent.md +67 -0
  105. package/bundled/dev-pipeline-windows/templates/sections/test-failure-recovery-lite.md +58 -0
  106. package/bundled/dev-pipeline-windows/templates/session-status-schema.json +83 -0
  107. package/bundled/skills/_metadata.json +1 -1
  108. package/bundled/skills/app-planner/SKILL.md +26 -18
  109. package/bundled/skills/app-planner/references/architecture-decisions.md +9 -5
  110. package/bundled/skills/app-planner/references/frontend-design-guide.md +1 -1
  111. package/bundled/skills/feature-planner/SKILL.md +9 -2
  112. package/bundled/skills/prizmkit-init/SKILL.md +7 -6
  113. package/bundled/skills/recovery-workflow/scripts/detect-recovery-state.py +2 -0
  114. package/bundled/skills-windows/app-planner/SKILL.md +639 -0
  115. package/bundled/skills-windows/app-planner/assets/app-design-guide.md +101 -0
  116. package/bundled/skills-windows/app-planner/references/architecture-decisions.md +52 -0
  117. package/bundled/skills-windows/app-planner/references/brainstorm-guide.md +101 -0
  118. package/bundled/skills-windows/app-planner/references/frontend-design-guide.md +71 -0
  119. package/bundled/skills-windows/app-planner/references/project-brief-guide.md +82 -0
  120. package/bundled/skills-windows/app-planner/references/red-team-checklist.md +40 -0
  121. package/bundled/skills-windows/app-planner/references/rules/backend/derivation-rules.md +609 -0
  122. package/bundled/skills-windows/app-planner/references/rules/backend/fixed-rules.md +285 -0
  123. package/bundled/skills-windows/app-planner/references/rules/backend/question-bank.md +249 -0
  124. package/bundled/skills-windows/app-planner/references/rules/backend/template.md +173 -0
  125. package/bundled/skills-windows/app-planner/references/rules/database/derivation-rules.md +373 -0
  126. package/bundled/skills-windows/app-planner/references/rules/database/fixed-rules.md +211 -0
  127. package/bundled/skills-windows/app-planner/references/rules/database/question-bank.md +184 -0
  128. package/bundled/skills-windows/app-planner/references/rules/database/template.md +158 -0
  129. package/bundled/skills-windows/app-planner/references/rules/frontend/derivation-rules.md +810 -0
  130. package/bundled/skills-windows/app-planner/references/rules/frontend/fixed-rules.md +188 -0
  131. package/bundled/skills-windows/app-planner/references/rules/frontend/question-bank.md +302 -0
  132. package/bundled/skills-windows/app-planner/references/rules/frontend/template.md +320 -0
  133. package/bundled/skills-windows/app-planner/references/rules/mobile/derivation-rules.md +639 -0
  134. package/bundled/skills-windows/app-planner/references/rules/mobile/fixed-rules.md +290 -0
  135. package/bundled/skills-windows/app-planner/references/rules/mobile/question-bank.md +232 -0
  136. package/bundled/skills-windows/app-planner/references/rules/mobile/template.md +175 -0
  137. package/bundled/skills-windows/bug-fix-workflow/SKILL.md +415 -0
  138. package/bundled/skills-windows/bug-planner/SKILL.md +395 -0
  139. package/bundled/skills-windows/bug-planner/assets/bug-confirmation-template.md +43 -0
  140. package/bundled/skills-windows/bug-planner/references/critic-and-verification.md +44 -0
  141. package/bundled/skills-windows/bug-planner/references/error-recovery.md +73 -0
  142. package/bundled/skills-windows/bug-planner/references/input-formats.md +53 -0
  143. package/bundled/skills-windows/bug-planner/references/schema-validation.md +25 -0
  144. package/bundled/skills-windows/bug-planner/references/severity-rules.md +16 -0
  145. package/bundled/skills-windows/bug-planner/scripts/validate-bug-list.py +322 -0
  146. package/bundled/skills-windows/bugfix-pipeline-launcher/SKILL.md +380 -0
  147. package/bundled/skills-windows/feature-pipeline-launcher/SKILL.md +441 -0
  148. package/bundled/skills-windows/feature-pipeline-launcher/scripts/preflight-check.py +462 -0
  149. package/bundled/skills-windows/feature-planner/SKILL.md +401 -0
  150. package/bundled/skills-windows/feature-planner/assets/evaluation-guide.md +64 -0
  151. package/bundled/skills-windows/feature-planner/assets/planning-guide.md +214 -0
  152. package/bundled/skills-windows/feature-planner/references/browser-interaction.md +59 -0
  153. package/bundled/skills-windows/feature-planner/references/completeness-review.md +57 -0
  154. package/bundled/skills-windows/feature-planner/references/decomposition-patterns.md +75 -0
  155. package/bundled/skills-windows/feature-planner/references/error-recovery.md +90 -0
  156. package/bundled/skills-windows/feature-planner/references/incremental-feature-planning.md +112 -0
  157. package/bundled/skills-windows/feature-planner/references/new-project-planning.md +85 -0
  158. package/bundled/skills-windows/feature-planner/scripts/validate-and-generate.py +1029 -0
  159. package/bundled/skills-windows/feature-workflow/SKILL.md +531 -0
  160. package/bundled/skills-windows/prizmkit-init/SKILL.md +356 -0
  161. package/bundled/skills-windows/prizmkit-init/assets/project-brief-template.md +82 -0
  162. package/bundled/skills-windows/prizmkit-init/references/config-schema.md +68 -0
  163. package/bundled/skills-windows/prizmkit-init/references/rules/layer-detection.md +41 -0
  164. package/bundled/skills-windows/prizmkit-init/references/tech-stack-catalog.md +13 -0
  165. package/bundled/skills-windows/prizmkit-init/references/update-supplement.md +9 -0
  166. package/bundled/skills-windows/recovery-workflow/SKILL.md +456 -0
  167. package/bundled/skills-windows/recovery-workflow/evals/evals.json +46 -0
  168. package/bundled/skills-windows/recovery-workflow/scripts/detect-recovery-state.py +544 -0
  169. package/bundled/skills-windows/refactor-pipeline-launcher/SKILL.md +406 -0
  170. package/bundled/skills-windows/refactor-planner/SKILL.md +540 -0
  171. package/bundled/skills-windows/refactor-planner/assets/planning-guide.md +292 -0
  172. package/bundled/skills-windows/refactor-planner/references/behavior-preservation.md +301 -0
  173. package/bundled/skills-windows/refactor-planner/references/refactor-scoping-guide.md +221 -0
  174. package/bundled/skills-windows/refactor-planner/scripts/validate-and-generate-refactor.py +858 -0
  175. package/bundled/skills-windows/refactor-workflow/SKILL.md +503 -0
  176. package/package.json +3 -2
  177. package/src/clean.js +73 -2
  178. package/src/config.js +159 -50
  179. package/src/detect-platform.js +16 -8
  180. package/src/external-skills.js +26 -19
  181. package/src/index.js +31 -9
  182. package/src/manifest.js +6 -2
  183. package/src/metadata.js +43 -5
  184. package/src/platforms.js +36 -0
  185. package/src/prompts.js +31 -6
  186. package/src/runtimes.js +20 -0
  187. package/src/scaffold.js +314 -110
  188. package/src/upgrade.js +81 -41
@@ -120,12 +120,141 @@ prizm_log_bootstrap_prompt() {
120
120
 
121
121
  # Detect AI CLI + platform.
122
122
  # Priority:
123
- # AI_CLI env > .prizmkit/config.json > CODEBUDDY_CLI > auto-detect(cbc/claude) > error
123
+ # AI_CLI env > .prizmkit/config.json ai_cli > manifest/config platform > CODEBUDDY_CLI
124
+ # > installed PrizmKit platform artifacts > PATH auto-detect > error
124
125
  #
125
126
  # Exports:
126
127
  # CLI_CMD
127
128
  # PLATFORM
128
129
  # PRIZMKIT_PLATFORM
130
+ _prizm_json_value() {
131
+ local json_file="$1"
132
+ local key="$2"
133
+ [[ -f "$json_file" ]] || return 0
134
+ JSON_FILE="$json_file" JSON_KEY="$key" python3 - <<'PY' 2>/dev/null || true
135
+ import json
136
+ import os
137
+
138
+ try:
139
+ with open(os.environ["JSON_FILE"], encoding="utf-8") as fh:
140
+ data = json.load(fh)
141
+ value = data.get(os.environ["JSON_KEY"], "")
142
+ if value is not None and value != "":
143
+ print(value)
144
+ except Exception:
145
+ pass
146
+ PY
147
+ }
148
+
149
+ _prizm_normalize_platform() {
150
+ printf '%s' "$1" | tr '[:upper:]' '[:lower:]'
151
+ }
152
+
153
+ _prizm_concrete_platform() {
154
+ case "$(_prizm_normalize_platform "$1")" in
155
+ codex|claude|codebuddy) printf '%s\n' "$(_prizm_normalize_platform "$1")" ;;
156
+ esac
157
+ }
158
+
159
+ _prizm_cli_names_for_platform() {
160
+ case "$(_prizm_normalize_platform "$1")" in
161
+ codex) printf '%s\n' codex ;;
162
+ claude) printf '%s\n' claude ;;
163
+ codebuddy) printf '%s\n' cbc ;;
164
+ both) printf '%s\n' claude cbc ;;
165
+ all) printf '%s\n' codex claude cbc ;;
166
+ esac
167
+ }
168
+
169
+ _prizm_expected_cli_text() {
170
+ _prizm_cli_names_for_platform "$1" | awk 'BEGIN { sep="" } { printf "%s%s", sep, $0; sep=", " } END { if (sep != "") print "" }'
171
+ }
172
+
173
+ _prizm_resolve_cli_name() {
174
+ local cli_name="$1"
175
+ if [[ "$cli_name" == "cbc" && -n "${CODEBUDDY_CLI:-}" ]]; then
176
+ printf '%s\n' "$CODEBUDDY_CLI"
177
+ return 0
178
+ fi
179
+ if command -v "$cli_name" &>/dev/null; then
180
+ printf '%s\n' "$cli_name"
181
+ return 0
182
+ fi
183
+ return 1
184
+ }
185
+
186
+ _prizm_cli_for_platform() {
187
+ local platform="$1"
188
+ local cli_name cli_cmd
189
+ while IFS= read -r cli_name; do
190
+ [[ -n "$cli_name" ]] || continue
191
+ cli_cmd="$(_prizm_resolve_cli_name "$cli_name" || true)"
192
+ if [[ -n "$cli_cmd" ]]; then
193
+ printf '%s\n' "$cli_cmd"
194
+ return 0
195
+ fi
196
+ done < <(_prizm_cli_names_for_platform "$platform")
197
+ return 1
198
+ }
199
+
200
+ _prizm_known_platform_from_cli() {
201
+ local cli_cmd="$1"
202
+ local cli_token="${cli_cmd%%[[:space:]]*}"
203
+ cli_token="${cli_token#\"}" ; cli_token="${cli_token%\"}"
204
+ cli_token="${cli_token#\'}" ; cli_token="${cli_token%\'}"
205
+ local cli_name="${cli_token##*/}"
206
+ if [[ "$cli_name" == *"claude"* ]]; then
207
+ printf '%s\n' claude
208
+ elif [[ "$cli_name" == *"codex"* ]]; then
209
+ printf '%s\n' codex
210
+ elif [[ "$cli_name" == *"cbc"* || "$cli_name" == *"codebuddy"* ]]; then
211
+ printf '%s\n' codebuddy
212
+ else
213
+ return 1
214
+ fi
215
+ }
216
+
217
+ _prizm_platform_from_cli() {
218
+ local cli_cmd="$1"
219
+ if ! _prizm_known_platform_from_cli "$cli_cmd"; then
220
+ printf '%s\n' codebuddy
221
+ fi
222
+ }
223
+
224
+ _prizm_session_platform() {
225
+ local cli_platform
226
+ cli_platform="$(_prizm_known_platform_from_cli "$CLI_CMD" || true)"
227
+ if [[ -n "$cli_platform" ]]; then
228
+ printf '%s\n' "$cli_platform"
229
+ return 0
230
+ fi
231
+
232
+ local platform="${PRIZMKIT_PLATFORM:-${PLATFORM:-}}"
233
+ case "$(_prizm_normalize_platform "$platform")" in
234
+ codex|claude|codebuddy) printf '%s\n' "$(_prizm_normalize_platform "$platform")" ;;
235
+ *) _prizm_platform_from_cli "$CLI_CMD" ;;
236
+ esac
237
+ }
238
+
239
+ _prizm_project_platform_for_cli() {
240
+ local cli_cmd="$1"
241
+ local manifest_platform="$2"
242
+ local config_platform="$3"
243
+ local cli_platform
244
+ cli_platform="$(_prizm_known_platform_from_cli "$cli_cmd" || true)"
245
+ if [[ -n "$cli_platform" ]]; then
246
+ printf '%s\n' "$cli_platform"
247
+ elif [[ -n "${PRIZMKIT_PLATFORM:-}" ]]; then
248
+ printf '%s\n' "$PRIZMKIT_PLATFORM"
249
+ elif [[ -n "$(_prizm_concrete_platform "$manifest_platform")" ]]; then
250
+ _prizm_concrete_platform "$manifest_platform"
251
+ elif [[ -n "$(_prizm_concrete_platform "$config_platform")" ]]; then
252
+ _prizm_concrete_platform "$config_platform"
253
+ else
254
+ printf '%s\n' codebuddy
255
+ fi
256
+ }
257
+
129
258
  prizm_detect_cli_and_platform() {
130
259
  # Load .env from .prizmkit/.env if it exists (does not override existing env vars)
131
260
  if [[ -n "${PRIZMKIT_DIR:-}" ]]; then
@@ -133,61 +262,173 @@ prizm_detect_cli_and_platform() {
133
262
  fi
134
263
 
135
264
  local _raw_cli=""
265
+ local _config_ai_cli=""
266
+ local _config_platform=""
267
+ local _manifest_platform=""
268
+ local _installed_cli=""
269
+ local _platform_cli=""
270
+ local _platform_cli_names=""
271
+
272
+ if [[ -n "${PRIZMKIT_DIR:-}" ]]; then
273
+ _config_ai_cli="$(_prizm_json_value "$PRIZMKIT_DIR/config.json" ai_cli)"
274
+ _config_platform="$(_prizm_json_value "$PRIZMKIT_DIR/config.json" platform)"
275
+ _manifest_platform="$(_prizm_json_value "$PRIZMKIT_DIR/manifest.json" platform)"
276
+ fi
277
+
278
+ _detect_installed_platform_cli() {
279
+ if [[ -f "$PROJECT_ROOT/.codex/agents/prizm-dev-team-dev.toml" || -f "$PROJECT_ROOT/.agents/skills/prizm-kit/SKILL.md" ]] && command -v codex &>/dev/null; then
280
+ echo "codex"
281
+ elif [[ -f "$PROJECT_ROOT/.claude/commands/prizm-kit.md" ]] && command -v claude &>/dev/null; then
282
+ echo "claude"
283
+ elif [[ -f "$PROJECT_ROOT/.codebuddy/agents/prizm-dev-team-dev.md" || -f "$PROJECT_ROOT/.codebuddy/skills/prizm-kit/SKILL.md" ]]; then
284
+ _prizm_resolve_cli_name cbc || true
285
+ fi
286
+ }
136
287
 
137
288
  if [[ -n "${AI_CLI:-}" ]]; then
138
289
  _raw_cli="$AI_CLI"
139
- elif [[ -f "$PRIZMKIT_DIR/config.json" ]]; then
140
- _config_ai_cli=$(python3 -c "
141
- import json, sys
142
- try:
143
- with open('$PRIZMKIT_DIR/config.json') as f:
144
- d = json.load(f)
145
- v = d.get('ai_cli', '')
146
- if not v:
147
- p = d.get('platform', '')
148
- if p == 'claude': v = 'claude'
149
- elif p == 'codebuddy': v = 'cbc'
150
- if v: print(v)
151
- except: pass
152
- " 2>/dev/null || true)
153
- if [[ -n "$_config_ai_cli" ]]; then
154
- _raw_cli="$_config_ai_cli"
155
- elif [[ -n "${CODEBUDDY_CLI:-}" ]]; then
156
- _raw_cli="$CODEBUDDY_CLI"
157
- elif command -v claude &>/dev/null; then
158
- _raw_cli="claude"
159
- elif command -v cbc &>/dev/null; then
160
- _raw_cli="cbc"
161
- else
162
- echo "ERROR: No AI CLI found. Install CodeBuddy (cbc) or Claude Code (claude)." >&2
290
+ elif [[ -n "$_config_ai_cli" ]]; then
291
+ _raw_cli="$_config_ai_cli"
292
+ elif [[ -n "$_manifest_platform" ]]; then
293
+ _platform_cli="$(_prizm_cli_for_platform "$_manifest_platform" || true)"
294
+ _platform_cli_names="$(_prizm_cli_names_for_platform "$_manifest_platform")"
295
+ if [[ -n "$_platform_cli" ]]; then
296
+ _raw_cli="$_platform_cli"
297
+ elif [[ -n "$_platform_cli_names" ]]; then
298
+ echo "ERROR: Installed PrizmKit platform '$_manifest_platform' requires one of: $(_prizm_expected_cli_text "$_manifest_platform"). Install it or set AI_CLI." >&2
163
299
  exit 1
164
300
  fi
165
- elif [[ -n "${CODEBUDDY_CLI:-}" ]]; then
301
+ elif [[ -n "$_config_platform" ]]; then
302
+ _platform_cli="$(_prizm_cli_for_platform "$_config_platform" || true)"
303
+ _platform_cli_names="$(_prizm_cli_names_for_platform "$_config_platform")"
304
+ if [[ -n "$_platform_cli" ]]; then
305
+ _raw_cli="$_platform_cli"
306
+ elif [[ -n "$_platform_cli_names" ]]; then
307
+ echo "ERROR: Configured PrizmKit platform '$_config_platform' requires one of: $(_prizm_expected_cli_text "$_config_platform"). Install it or set AI_CLI." >&2
308
+ exit 1
309
+ fi
310
+ fi
311
+
312
+ if [[ -z "$_raw_cli" && -n "${CODEBUDDY_CLI:-}" ]]; then
166
313
  _raw_cli="$CODEBUDDY_CLI"
167
- elif command -v claude &>/dev/null; then
314
+ fi
315
+ if [[ -z "$_raw_cli" ]]; then
316
+ _installed_cli="$(_detect_installed_platform_cli || true)"
317
+ if [[ -n "$_installed_cli" ]]; then
318
+ _raw_cli="$_installed_cli"
319
+ fi
320
+ fi
321
+ if [[ -z "$_raw_cli" ]] && command -v claude &>/dev/null; then
168
322
  _raw_cli="claude"
169
- elif command -v cbc &>/dev/null; then
323
+ elif [[ -z "$_raw_cli" ]] && command -v cbc &>/dev/null; then
170
324
  _raw_cli="cbc"
171
- else
172
- echo "ERROR: No AI CLI found. Install CodeBuddy (cbc) or Claude Code (claude)." >&2
325
+ elif [[ -z "$_raw_cli" ]] && command -v codex &>/dev/null; then
326
+ _raw_cli="codex"
327
+ elif [[ -z "$_raw_cli" ]]; then
328
+ echo "ERROR: No AI CLI found. Install CodeBuddy (cbc), Claude Code (claude), or Codex (codex)." >&2
173
329
  exit 1
174
330
  fi
175
331
 
176
332
  CLI_CMD="$_raw_cli"
177
333
 
178
- if [[ -n "${PRIZMKIT_PLATFORM:-}" ]]; then
179
- PLATFORM="$PRIZMKIT_PLATFORM"
180
- elif [[ "$_raw_cli" == *"claude"* ]]; then
181
- PLATFORM="claude"
182
- else
183
- PLATFORM="codebuddy"
184
- fi
334
+ PLATFORM="$(_prizm_project_platform_for_cli "$_raw_cli" "$_manifest_platform" "$_config_platform")"
185
335
 
186
336
  export CLI_CMD
187
337
  export PLATFORM
188
338
  export PRIZMKIT_PLATFORM="$PLATFORM"
189
339
  }
190
340
 
341
+ # Start an AI CLI session in the background.
342
+ # Usage: prizm_start_ai_session <prompt_path> <log_path> <model>
343
+ # Sets PRIZM_AI_PID to the spawned process PID. Do not call this function via
344
+ # command substitution; the background process must remain a child of the
345
+ # runner shell so wait/heartbeat/trap handling works correctly.
346
+ PRIZM_AI_PID=""
347
+ prizm_start_ai_session() {
348
+ local prompt_path="$1"
349
+ local log_path="$2"
350
+ local model="${3:-}"
351
+
352
+ unset CLAUDECODE 2>/dev/null || true
353
+
354
+ local session_platform
355
+ session_platform="$(_prizm_session_platform)"
356
+
357
+ case "$session_platform" in
358
+ claude)
359
+ local claude_args=(-p "$(cat "$prompt_path")" --dangerously-skip-permissions)
360
+ if [[ "$VERBOSE" == "1" || "$USE_STREAM_JSON" == "true" ]]; then
361
+ claude_args+=(--verbose)
362
+ fi
363
+ if [[ "$USE_STREAM_JSON" == "true" ]]; then
364
+ claude_args+=(--output-format stream-json)
365
+ fi
366
+ if [[ -n "$model" ]]; then
367
+ claude_args+=(--model "$model")
368
+ fi
369
+ "$CLI_CMD" "${claude_args[@]}" > "$log_path" 2>&1 &
370
+ ;;
371
+ codex)
372
+ local codex_args=(--ask-for-approval never --sandbox danger-full-access exec --cd "$PROJECT_ROOT" --skip-git-repo-check)
373
+ if [[ -n "$model" ]]; then
374
+ codex_args+=(--model "$model")
375
+ fi
376
+ "$CLI_CMD" "${codex_args[@]}" - < "$prompt_path" > "$log_path" 2>&1 &
377
+ ;;
378
+ *)
379
+ local cb_args=(--print -y)
380
+ if [[ "$VERBOSE" == "1" ]]; then
381
+ cb_args+=(--verbose)
382
+ fi
383
+ if [[ "$USE_STREAM_JSON" == "true" ]]; then
384
+ cb_args+=(--output-format stream-json)
385
+ fi
386
+ if [[ -n "$model" ]]; then
387
+ cb_args+=(--model "$model")
388
+ fi
389
+ "$CLI_CMD" "${cb_args[@]}" < "$prompt_path" > "$log_path" 2>&1 &
390
+ ;;
391
+ esac
392
+ PRIZM_AI_PID=$!
393
+ }
394
+
395
+ # Run an AI CLI session synchronously.
396
+ # Usage: prizm_run_ai_session <prompt_path> <log_path> <model>
397
+ prizm_run_ai_session() {
398
+ local prompt_path="$1"
399
+ local log_path="$2"
400
+ local model="${3:-}"
401
+
402
+ unset CLAUDECODE 2>/dev/null || true
403
+
404
+ local session_platform
405
+ session_platform="$(_prizm_session_platform)"
406
+
407
+ case "$session_platform" in
408
+ claude)
409
+ local claude_args=(-p "$(cat "$prompt_path")" --dangerously-skip-permissions)
410
+ if [[ -n "$model" ]]; then
411
+ claude_args+=(--model "$model")
412
+ fi
413
+ "$CLI_CMD" "${claude_args[@]}" > "$log_path" 2>&1
414
+ ;;
415
+ codex)
416
+ local codex_args=(--ask-for-approval never --sandbox danger-full-access exec --cd "$PROJECT_ROOT" --skip-git-repo-check)
417
+ if [[ -n "$model" ]]; then
418
+ codex_args+=(--model "$model")
419
+ fi
420
+ "$CLI_CMD" "${codex_args[@]}" - < "$prompt_path" > "$log_path" 2>&1
421
+ ;;
422
+ *)
423
+ local cb_args=(--print -y)
424
+ if [[ -n "$model" ]]; then
425
+ cb_args+=(--model "$model")
426
+ fi
427
+ "$CLI_CMD" "${cb_args[@]}" < "$prompt_path" > "$log_path" 2>&1
428
+ ;;
429
+ esac
430
+ }
431
+
191
432
  # prizm_detect_subagents <session_log>
192
433
  #
193
434
  # Scan session log for subagent spawns, count them, and log the result.
@@ -16,9 +16,9 @@ set -euo pipefail
16
16
  # Environment Variables:
17
17
  # MAX_RETRIES Max retries per bug (default: 3)
18
18
  # SESSION_TIMEOUT Session timeout in seconds (default: 0 = no limit)
19
- # AI_CLI AI CLI command name (auto-detected: cbc or claude)
19
+ # AI_CLI AI CLI command name (auto-detected: cbc, claude, or codex)
20
20
  # CODEBUDDY_CLI Legacy alias for AI_CLI (deprecated, use AI_CLI instead)
21
- # PRIZMKIT_PLATFORM Force platform: 'codebuddy' or 'claude' (auto-detected)
21
+ # PRIZMKIT_PLATFORM Platform hint for custom AI_CLI wrappers: codebuddy, claude, or codex
22
22
  # VERBOSE Set to 1 to enable --verbose on AI CLI
23
23
  # HEARTBEAT_INTERVAL Heartbeat log interval in seconds (default: 30)
24
24
  # STALE_KILL_THRESHOLD Auto-kill session after N seconds of no progress (default: 900)
@@ -92,56 +92,19 @@ spawn_and_wait_session() {
92
92
  local session_log="$session_dir/logs/session.log"
93
93
  local progress_json="$session_dir/logs/progress.json"
94
94
 
95
- local verbose_flag=""
96
- if [[ "$VERBOSE" == "1" ]]; then
97
- verbose_flag="--verbose"
98
- fi
99
-
100
- local stream_json_flag=""
101
- if [[ "$USE_STREAM_JSON" == "true" ]]; then
102
- stream_json_flag="--output-format stream-json"
103
- # claude-internal requires --verbose when using stream-json with -p/--print
104
- verbose_flag="--verbose"
105
- fi
106
-
107
- local model_flag=""
95
+ local effective_model=""
108
96
  if [[ -n "$item_model" ]]; then
109
- model_flag="--model $item_model"
97
+ effective_model="$item_model"
110
98
  elif [[ -n "${MODEL:-}" ]]; then
111
- model_flag="--model $MODEL"
99
+ effective_model="$MODEL"
112
100
  fi
113
101
 
114
- # Unset CLAUDECODE to prevent "nested session" error when launched from
115
- # within an existing Claude Code session (e.g. via launch-bugfix-daemon.sh).
116
- unset CLAUDECODE 2>/dev/null || true
117
-
118
102
  # Log bootstrap prompt in test mode
119
103
  prizm_log_bootstrap_prompt "$bootstrap_prompt" "$bug_id"
120
104
 
121
- case "$CLI_CMD" in
122
- *claude*)
123
- # Claude Code: prompt via -p, --dangerously-skip-permissions for auto-accept
124
- "$CLI_CMD" \
125
- -p "$(cat "$bootstrap_prompt")" \
126
- --dangerously-skip-permissions \
127
- $verbose_flag \
128
- $stream_json_flag \
129
- $model_flag \
130
- > "$session_log" 2>&1 &
131
- ;;
132
- *)
133
- # CodeBuddy (cbc) and others: prompt via stdin, -y for auto-accept
134
- "$CLI_CMD" \
135
- --print \
136
- -y \
137
- $verbose_flag \
138
- $stream_json_flag \
139
- $model_flag \
140
- < "$bootstrap_prompt" \
141
- > "$session_log" 2>&1 &
142
- ;;
143
- esac
144
- local cli_pid=$!
105
+ local cli_pid
106
+ prizm_start_ai_session "$bootstrap_prompt" "$session_log" "$effective_model"
107
+ cli_pid="$PRIZM_AI_PID"
145
108
 
146
109
  # Start progress parser (no-op if stream-json not supported)
147
110
  start_progress_parser "$session_log" "$progress_json" "$SCRIPTS_DIR"
@@ -1004,21 +967,7 @@ DEPLOY_PROMPT_EOF
1004
967
  log_info "Deploy prompt: $deploy_prompt"
1005
968
  log_info "Deploy log: $deploy_session_dir/logs/session.log"
1006
969
 
1007
- case "$CLI_CMD" in
1008
- *claude*)
1009
- "$CLI_CMD" \
1010
- -p "$(cat "$deploy_prompt")" \
1011
- --dangerously-skip-permissions \
1012
- > "$deploy_session_dir/logs/session.log" 2>&1
1013
- ;;
1014
- *)
1015
- "$CLI_CMD" \
1016
- --print \
1017
- -y \
1018
- < "$deploy_prompt" \
1019
- > "$deploy_session_dir/logs/session.log" 2>&1
1020
- ;;
1021
- esac
970
+ prizm_run_ai_session "$deploy_prompt" "$deploy_session_dir/logs/session.log"
1022
971
  local deploy_exit=$?
1023
972
 
1024
973
  if [[ $deploy_exit -eq 0 ]]; then
@@ -1252,7 +1201,7 @@ show_help() {
1252
1201
  echo " MODEL Default AI model (overridden by per-bug model in bug list)"
1253
1202
  echo " PIPELINE_MODE Default pipeline mode: lite|standard|full (overridden by --mode)"
1254
1203
  echo " ENABLE_CRITIC Enable/disable critic: true|false|1|0 (overridden by --critic/--no-critic)"
1255
- echo " AI_CLI AI CLI command name (auto-detected: cbc or claude)"
1204
+ echo " AI_CLI AI CLI command name (auto-detected: cbc, claude, or codex)"
1256
1205
  echo " VERBOSE Set to 1 for verbose AI CLI output"
1257
1206
  echo " HEARTBEAT_INTERVAL Heartbeat log interval in seconds (default: 30)"
1258
1207
  echo " STALE_KILL_THRESHOLD Auto-kill session after N seconds of no progress (default: 900)"
@@ -19,7 +19,7 @@ set -euo pipefail
19
19
  # SESSION_TIMEOUT Session timeout in seconds (default: 0 = no limit)
20
20
  # AI_CLI AI CLI command name (override; also readable from .prizmkit/config.json)
21
21
  # CODEBUDDY_CLI Legacy alias for AI_CLI (deprecated, use AI_CLI instead)
22
- # PRIZMKIT_PLATFORM Force platform: 'codebuddy' or 'claude' (auto-detected)
22
+ # PRIZMKIT_PLATFORM Platform hint for custom AI_CLI wrappers: codebuddy, claude, or codex
23
23
  # MODEL AI model to use (e.g. claude-opus-4.6, claude-sonnet-4.6, claude-haiku-4.5)
24
24
  # VERBOSE Set to 1 to enable --verbose on AI CLI (shows subagent output)
25
25
  # HEARTBEAT_INTERVAL Heartbeat log interval in seconds (default: 30)
@@ -105,53 +105,10 @@ spawn_and_wait_session() {
105
105
  local session_log="$session_dir/logs/session.log"
106
106
  local progress_json="$session_dir/logs/progress.json"
107
107
 
108
- # Spawn AI CLI session
109
- local verbose_flag=""
110
- if [[ "$VERBOSE" == "1" ]]; then
111
- verbose_flag="--verbose"
112
- fi
113
-
114
- local stream_json_flag=""
115
- if [[ "$USE_STREAM_JSON" == "true" ]]; then
116
- stream_json_flag="--output-format stream-json"
117
- # claude-internal requires --verbose when using stream-json with -p/--print
118
- verbose_flag="--verbose"
119
- fi
120
-
121
- local model_flag=""
122
108
  local effective_model="${feature_model:-$MODEL}"
123
- if [[ -n "$effective_model" ]]; then
124
- model_flag="--model $effective_model"
125
- fi
126
-
127
- # Unset CLAUDECODE to prevent "nested session" error when launched from
128
- # within an existing Claude Code session (e.g. via launch-feature-daemon.sh).
129
- unset CLAUDECODE 2>/dev/null || true
130
-
131
- case "$CLI_CMD" in
132
- *claude*)
133
- # Claude Code: prompt via -p argument, --dangerously-skip-permissions for auto-accept
134
- "$CLI_CMD" \
135
- -p "$(cat "$bootstrap_prompt")" \
136
- --dangerously-skip-permissions \
137
- $verbose_flag \
138
- $stream_json_flag \
139
- $model_flag \
140
- > "$session_log" 2>&1 &
141
- ;;
142
- *)
143
- # CodeBuddy (cbc) and others: prompt via stdin
144
- "$CLI_CMD" \
145
- --print \
146
- -y \
147
- $verbose_flag \
148
- $stream_json_flag \
149
- $model_flag \
150
- < "$bootstrap_prompt" \
151
- > "$session_log" 2>&1 &
152
- ;;
153
- esac
154
- local cbc_pid=$!
109
+ local cbc_pid
110
+ prizm_start_ai_session "$bootstrap_prompt" "$session_log" "$effective_model"
111
+ cbc_pid="$PRIZM_AI_PID"
155
112
 
156
113
  # Start progress parser (no-op if stream-json not supported)
157
114
  start_progress_parser "$session_log" "$progress_json" "$SCRIPTS_DIR"
@@ -1231,21 +1188,7 @@ DEPLOY_PROMPT_EOF
1231
1188
  log_info "Deploy prompt: $deploy_prompt"
1232
1189
  log_info "Deploy log: $deploy_session_dir/logs/session.log"
1233
1190
 
1234
- case "$CLI_CMD" in
1235
- *claude*)
1236
- "$CLI_CMD" \
1237
- -p "$(cat "$deploy_prompt")" \
1238
- --dangerously-skip-permissions \
1239
- > "$deploy_session_dir/logs/session.log" 2>&1
1240
- ;;
1241
- *)
1242
- "$CLI_CMD" \
1243
- --print \
1244
- -y \
1245
- < "$deploy_prompt" \
1246
- > "$deploy_session_dir/logs/session.log" 2>&1
1247
- ;;
1248
- esac
1191
+ prizm_run_ai_session "$deploy_prompt" "$deploy_session_dir/logs/session.log"
1249
1192
  local deploy_exit=$?
1250
1193
 
1251
1194
  if [[ $deploy_exit -eq 0 ]]; then
@@ -1465,7 +1408,7 @@ show_help() {
1465
1408
  echo "Environment Variables:"
1466
1409
  echo " MAX_RETRIES Max retries per feature (default: 3)"
1467
1410
  echo " SESSION_TIMEOUT Session timeout in seconds (default: 0 = no limit)"
1468
- echo " AI_CLI AI CLI command name (auto-detected: cbc or claude)"
1411
+ echo " AI_CLI AI CLI command name (auto-detected: cbc, claude, or codex)"
1469
1412
  echo " MODEL AI model ID (e.g. claude-opus-4.6, claude-sonnet-4.6, claude-haiku-4.5)"
1470
1413
  echo " HEARTBEAT_INTERVAL Heartbeat log interval in seconds (default: 30)"
1471
1414
  echo " STALE_KILL_THRESHOLD Auto-kill session after N seconds of no progress (default: 900)"
@@ -1553,23 +1496,12 @@ case "${1:-run}" in
1553
1496
 
1554
1497
  test_prompt="What AI assistant/platform are you and what model are you running? Reply in one line, e.g. \"I'm Claude Code Claude Opnus x.x\".No extra text."
1555
1498
 
1556
- local_model_flag=""
1557
- if [[ -n "$MODEL" ]]; then
1558
- local_model_flag="--model $MODEL"
1559
- fi
1560
-
1561
1499
  # Run headless query with 30s timeout (background + kill pattern for macOS)
1562
1500
  tmpfile=$(mktemp)
1501
+ prompt_file=$(mktemp)
1502
+ printf '%s\n' "$test_prompt" > "$prompt_file"
1563
1503
  (
1564
- unset CLAUDECODE
1565
- case "$CLI_CMD" in
1566
- *claude*)
1567
- "$CLI_CMD" -p "$test_prompt" --dangerously-skip-permissions --no-session-persistence $local_model_flag > "$tmpfile" 2>/dev/null
1568
- ;;
1569
- *)
1570
- echo "$test_prompt" | "$CLI_CMD" --print -y $local_model_flag > "$tmpfile" 2>/dev/null
1571
- ;;
1572
- esac
1504
+ prizm_run_ai_session "$prompt_file" "$tmpfile" "$MODEL"
1573
1505
  ) &
1574
1506
  query_pid=$!
1575
1507
  ( sleep 30 && kill "$query_pid" 2>/dev/null ) &
@@ -1579,7 +1511,7 @@ case "${1:-run}" in
1579
1511
  wait "$timer_pid" 2>/dev/null || true
1580
1512
 
1581
1513
  model_reply=$(cat "$tmpfile" 2>/dev/null | head -3)
1582
- rm -f "$tmpfile"
1514
+ rm -f "$tmpfile" "$prompt_file"
1583
1515
 
1584
1516
  if [[ -z "$model_reply" ]]; then
1585
1517
  model_reply="(no response — CLI may require auth or is unavailable)"