aiwcli 0.15.5 → 0.17.0

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 (435) hide show
  1. package/README.md +108 -1124
  2. package/bin/run.js +0 -4
  3. package/dist/capabilities/branch/adapters.d.ts +2 -0
  4. package/dist/capabilities/branch/adapters.js +21 -0
  5. package/dist/capabilities/branch/contracts.d.ts +57 -0
  6. package/dist/capabilities/branch/contracts.js +1 -0
  7. package/dist/capabilities/branch/control-plane.d.ts +2 -0
  8. package/dist/capabilities/branch/control-plane.js +343 -0
  9. package/dist/capabilities/branch/runtime-core.d.ts +5 -0
  10. package/dist/capabilities/branch/runtime-core.js +36 -0
  11. package/dist/capabilities/installation/control-plane/clean-command.d.ts +41 -0
  12. package/dist/capabilities/installation/control-plane/clean-command.js +196 -0
  13. package/dist/capabilities/installation/control-plane/clear-command.d.ts +162 -0
  14. package/dist/capabilities/installation/control-plane/clear-command.js +1249 -0
  15. package/dist/capabilities/installation/control-plane/init-command.d.ts +81 -0
  16. package/dist/capabilities/installation/control-plane/init-command.js +449 -0
  17. package/dist/capabilities/launch/contracts.d.ts +86 -0
  18. package/dist/capabilities/launch/contracts.js +1 -0
  19. package/dist/capabilities/launch/control-plane/execute-launch.d.ts +2 -0
  20. package/dist/capabilities/launch/control-plane/execute-launch.js +261 -0
  21. package/dist/capabilities/launch/runtime-core/launch-decisions.d.ts +82 -0
  22. package/dist/capabilities/launch/runtime-core/launch-decisions.js +202 -0
  23. package/dist/capabilities/launch/runtime-core/launch-options.d.ts +14 -0
  24. package/dist/capabilities/launch/runtime-core/launch-options.js +69 -0
  25. package/dist/cli/base-command.d.ts +18 -0
  26. package/dist/cli/base-command.js +55 -0
  27. package/dist/commands/branch.d.ts +1 -21
  28. package/dist/commands/branch.js +25 -417
  29. package/dist/commands/clean.d.ts +1 -41
  30. package/dist/commands/clean.js +1 -196
  31. package/dist/commands/clear.d.ts +1 -161
  32. package/dist/commands/clear.js +1 -1121
  33. package/dist/commands/init/index.d.ts +1 -98
  34. package/dist/commands/init/index.js +4 -478
  35. package/dist/commands/launch.d.ts +32 -12
  36. package/dist/commands/launch.js +107 -166
  37. package/dist/lib/claude-settings-types.d.ts +31 -19
  38. package/dist/lib/config.js +1 -2
  39. package/dist/lib/context/context-formatter.d.ts +74 -0
  40. package/dist/lib/context/context-formatter.js +493 -0
  41. package/dist/lib/context/context-selector.d.ts +42 -0
  42. package/dist/lib/context/context-selector.js +451 -0
  43. package/dist/lib/context/context-store.d.ts +100 -0
  44. package/dist/lib/context/context-store.js +644 -0
  45. package/dist/lib/context/plan-manager.d.ts +54 -0
  46. package/dist/lib/context/plan-manager.js +282 -0
  47. package/dist/lib/context/task-tracker.d.ts +44 -0
  48. package/dist/lib/context/task-tracker.js +146 -0
  49. package/dist/lib/core-ide-base.d.ts +4 -0
  50. package/dist/lib/core-ide-base.js +77 -0
  51. package/dist/lib/core-installer.d.ts +5 -0
  52. package/dist/lib/core-installer.js +33 -0
  53. package/dist/lib/debug.d.ts +0 -10
  54. package/dist/lib/debug.js +0 -10
  55. package/dist/lib/env-sanitizer.d.ts +25 -0
  56. package/dist/lib/env-sanitizer.js +46 -0
  57. package/dist/lib/errors.d.ts +0 -13
  58. package/dist/lib/errors.js +0 -15
  59. package/dist/lib/git-exclude-manager.d.ts +2 -2
  60. package/dist/lib/git-exclude-manager.js +3 -3
  61. package/dist/lib/hooks/context-monitor-logic.d.ts +6 -0
  62. package/dist/lib/hooks/context-monitor-logic.js +25 -0
  63. package/dist/lib/hooks/hook-utils.d.ts +143 -0
  64. package/dist/lib/hooks/hook-utils.js +620 -0
  65. package/dist/lib/hooks/prompt-binding-logic.d.ts +7 -0
  66. package/dist/lib/hooks/prompt-binding-logic.js +50 -0
  67. package/dist/lib/hooks/session-end-logic.d.ts +5 -0
  68. package/dist/lib/hooks/session-end-logic.js +51 -0
  69. package/dist/lib/hooks-merger.js +25 -19
  70. package/dist/lib/ide-path-resolver.d.ts +19 -7
  71. package/dist/lib/ide-path-resolver.js +25 -9
  72. package/dist/lib/install-state.d.ts +34 -0
  73. package/dist/lib/install-state.js +154 -0
  74. package/dist/lib/json-io.d.ts +12 -0
  75. package/dist/lib/json-io.js +30 -0
  76. package/dist/lib/lsp-patch.d.ts +12 -0
  77. package/dist/lib/lsp-patch.js +156 -0
  78. package/dist/lib/multiplexer.d.ts +65 -0
  79. package/dist/lib/multiplexer.js +38 -0
  80. package/dist/lib/multiplexers/psmux.d.ts +55 -0
  81. package/dist/lib/multiplexers/psmux.js +324 -0
  82. package/dist/lib/multiplexers/tmux.d.ts +36 -0
  83. package/dist/lib/multiplexers/tmux.js +221 -0
  84. package/dist/lib/multiplexers/wezterm.d.ts +38 -0
  85. package/dist/lib/multiplexers/wezterm.js +225 -0
  86. package/dist/lib/mux-utils.d.ts +6 -0
  87. package/dist/lib/mux-utils.js +36 -0
  88. package/dist/lib/paths.d.ts +2 -2
  89. package/dist/lib/paths.js +2 -2
  90. package/dist/lib/platform-commands.d.ts +27 -0
  91. package/dist/lib/platform-commands.js +49 -0
  92. package/dist/lib/prompt-file-manager.d.ts +23 -0
  93. package/dist/lib/prompt-file-manager.js +41 -0
  94. package/dist/lib/runtime/agent-launcher.d.ts +67 -0
  95. package/dist/lib/runtime/agent-launcher.js +262 -0
  96. package/dist/lib/runtime/aiw-cli.d.ts +39 -0
  97. package/dist/lib/runtime/aiw-cli.js +76 -0
  98. package/dist/lib/runtime/atomic-write.d.ts +19 -0
  99. package/dist/lib/runtime/atomic-write.js +121 -0
  100. package/dist/lib/runtime/cli-args.d.ts +58 -0
  101. package/dist/lib/runtime/cli-args.js +200 -0
  102. package/dist/lib/runtime/constants.d.ts +56 -0
  103. package/dist/lib/runtime/constants.js +230 -0
  104. package/dist/lib/runtime/executable-policy.d.ts +16 -0
  105. package/dist/lib/runtime/executable-policy.js +57 -0
  106. package/dist/lib/runtime/git-state.d.ts +9 -0
  107. package/dist/lib/runtime/git-state.js +59 -0
  108. package/dist/lib/runtime/inference.d.ts +37 -0
  109. package/dist/lib/runtime/inference.js +251 -0
  110. package/dist/lib/runtime/lint-dispatch.d.ts +40 -0
  111. package/dist/lib/runtime/lint-dispatch.js +285 -0
  112. package/dist/lib/runtime/logger.d.ts +66 -0
  113. package/dist/lib/runtime/logger.js +201 -0
  114. package/dist/lib/runtime/models.d.ts +20 -0
  115. package/dist/lib/runtime/models.js +20 -0
  116. package/dist/lib/runtime/platform-adapter.d.ts +7 -0
  117. package/dist/lib/runtime/platform-adapter.js +21 -0
  118. package/dist/lib/runtime/preflight.d.ts +24 -0
  119. package/dist/lib/runtime/preflight.js +65 -0
  120. package/dist/lib/runtime/sentinel-ipc.d.ts +14 -0
  121. package/dist/lib/runtime/sentinel-ipc.js +67 -0
  122. package/dist/lib/runtime/state-io.d.ts +31 -0
  123. package/dist/lib/runtime/state-io.js +179 -0
  124. package/dist/lib/runtime/stop-words.d.ts +20 -0
  125. package/dist/lib/runtime/stop-words.js +150 -0
  126. package/dist/lib/runtime/subprocess-utils.d.ts +29 -0
  127. package/dist/lib/runtime/subprocess-utils.js +96 -0
  128. package/dist/lib/runtime/tmux-preflight.d.ts +13 -0
  129. package/dist/lib/runtime/tmux-preflight.js +78 -0
  130. package/dist/lib/runtime/utils.d.ts +62 -0
  131. package/dist/lib/runtime/utils.js +192 -0
  132. package/dist/lib/schemas.d.ts +250 -0
  133. package/dist/lib/schemas.js +216 -0
  134. package/dist/lib/sentinel-manager.d.ts +32 -0
  135. package/dist/lib/sentinel-manager.js +62 -0
  136. package/dist/lib/sentinel-wrapper.d.ts +10 -0
  137. package/dist/lib/sentinel-wrapper.js +29 -0
  138. package/dist/lib/settings-hierarchy.js +3 -20
  139. package/dist/lib/shell-adapters/bash-adapter.d.ts +18 -0
  140. package/dist/lib/shell-adapters/bash-adapter.js +69 -0
  141. package/dist/lib/shell-adapters/index.d.ts +5 -0
  142. package/dist/lib/shell-adapters/index.js +7 -0
  143. package/dist/lib/shell-adapters/powershell-adapter.d.ts +18 -0
  144. package/dist/lib/shell-adapters/powershell-adapter.js +62 -0
  145. package/dist/lib/shell-adapters/shell-adapter.d.ts +45 -0
  146. package/dist/lib/shell-adapters/shell-adapter.js +5 -0
  147. package/dist/lib/shell-quoting.d.ts +5 -0
  148. package/dist/lib/shell-quoting.js +17 -0
  149. package/dist/lib/spawn-errors.d.ts +9 -0
  150. package/dist/lib/spawn-errors.js +29 -0
  151. package/dist/lib/spawn.js +5 -11
  152. package/dist/lib/spinner.d.ts +0 -5
  153. package/dist/lib/spinner.js +0 -16
  154. package/dist/lib/template-installer.d.ts +14 -5
  155. package/dist/lib/template-installer.js +40 -38
  156. package/dist/lib/template-resolver.d.ts +6 -7
  157. package/dist/lib/template-resolver.js +26 -21
  158. package/dist/lib/template-settings-reconstructor.d.ts +7 -2
  159. package/dist/lib/template-settings-reconstructor.js +76 -45
  160. package/dist/lib/terminal-strategy.d.ts +12 -0
  161. package/dist/lib/terminal-strategy.js +55 -0
  162. package/dist/lib/terminal.d.ts +34 -4
  163. package/dist/lib/terminal.js +192 -119
  164. package/dist/lib/tmux-pane-placement.d.ts +17 -0
  165. package/dist/lib/tmux-pane-placement.js +58 -0
  166. package/dist/lib/tmux-primitives.d.ts +3 -0
  167. package/dist/lib/tmux-primitives.js +11 -0
  168. package/dist/lib/tmux-session.d.ts +32 -0
  169. package/dist/lib/tmux-session.js +87 -0
  170. package/dist/lib/tty-detection.js +1 -1
  171. package/dist/lib/types.d.ts +168 -0
  172. package/dist/lib/types.js +6 -0
  173. package/dist/lib/version.d.ts +1 -1
  174. package/dist/lib/version.js +1 -1
  175. package/dist/lib/windsurf-hooks-hierarchy.js +6 -23
  176. package/dist/platform/launch.d.ts +11 -0
  177. package/dist/platform/launch.js +11 -0
  178. package/dist/templates/CLAUDE.md +30 -40
  179. package/dist/templates/cc-native/.claude/settings.json +26 -36
  180. package/dist/templates/cc-native/CC-NATIVE-README.md +1 -1
  181. package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +20 -12
  182. package/dist/templates/cc-native/_cc-native/cc-native.config.json +2 -6
  183. package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +39 -59
  184. package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +9 -11
  185. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_subagent.ts +2 -2
  186. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +4 -5
  187. package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +4 -4
  188. package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +2 -27
  189. package/dist/templates/cc-native/_cc-native/hooks/validate_task_prompt.ts +7 -7
  190. package/dist/templates/cc-native/_cc-native/lib-ts/.mocharc.json +9 -0
  191. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/aggregate-agents.test.ts +118 -0
  192. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/artifacts.test.ts +234 -0
  193. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/cc-native-state.test.ts +170 -0
  194. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/cli-output-parser.test.ts +73 -0
  195. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/config.test.ts +64 -0
  196. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/constants.test.ts +40 -0
  197. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/debug.test.ts +42 -0
  198. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/exports.test.ts +58 -0
  199. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/helpers.ts +107 -0
  200. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/add-plan-context.hook.test.ts +97 -0
  201. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/plan-questions.hook.test.ts +81 -0
  202. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/plan-review.hook.test.ts +71 -0
  203. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/json-parser.test.ts +99 -0
  204. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/orchestrator-agent.test.ts +288 -0
  205. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/orchestrator.test.ts +48 -0
  206. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/reviewers.test.ts +32 -0
  207. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/state.test.ts +124 -0
  208. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/verdict.test.ts +93 -0
  209. package/dist/templates/cc-native/_cc-native/lib-ts/agent-selection.ts +163 -0
  210. package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +6 -14
  211. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/format.ts +597 -599
  212. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/index.ts +26 -26
  213. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/tracker.ts +106 -107
  214. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/write.ts +118 -119
  215. package/dist/templates/cc-native/_cc-native/lib-ts/artifacts.ts +21 -0
  216. package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +17 -16
  217. package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +132 -10
  218. package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +1 -1
  219. package/dist/templates/cc-native/_cc-native/lib-ts/constants.ts +6 -6
  220. package/dist/templates/cc-native/_cc-native/lib-ts/corroboration.ts +119 -0
  221. package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +2 -3
  222. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/graduation.ts +132 -132
  223. package/dist/templates/cc-native/_cc-native/lib-ts/index.ts +88 -86
  224. package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +5 -6
  225. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/orchestrator.ts +70 -70
  226. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/output-builder.ts +130 -121
  227. package/dist/templates/cc-native/_cc-native/lib-ts/package-lock.json +1679 -0
  228. package/dist/templates/cc-native/_cc-native/lib-ts/package.json +24 -0
  229. package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +5 -5
  230. package/dist/templates/cc-native/_cc-native/lib-ts/plan-enhancement.ts +1 -6
  231. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/plan-questions.ts +101 -101
  232. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/review-pipeline.ts +511 -543
  233. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/__tests__/agent-providers.test.ts +262 -0
  234. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/agent.ts +71 -85
  235. package/dist/templates/{_shared/lib-ts/agent-exec → cc-native/_cc-native/lib-ts/reviewers/base}/base-agent.ts +138 -150
  236. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/index.ts +12 -12
  237. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/claude-agent.ts +66 -57
  238. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/codex-agent.ts +185 -200
  239. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/gemini-agent.ts +39 -40
  240. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/orchestrator-claude-agent.ts +196 -225
  241. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/schemas.ts +201 -201
  242. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/types.ts +21 -23
  243. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/__tests__/hyde.test.ts +365 -0
  244. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/__tests__/ollama-client.test.ts +223 -0
  245. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/embedding-indexer.ts +12 -16
  246. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/hyde.ts +3 -2
  247. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/index.ts +31 -31
  248. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +7 -8
  249. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/ollama-client.ts +7 -9
  250. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +16 -19
  251. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-indexer.ts +37 -41
  252. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-loader.ts +33 -43
  253. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-searcher.ts +20 -20
  254. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +9 -10
  255. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/vector-store.ts +3 -4
  256. package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +50 -126
  257. package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +20 -22
  258. package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +2 -2
  259. package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +14 -89
  260. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/verdict.ts +72 -72
  261. package/dist/templates/cc-native/_cc-native/plan-review/CLAUDE.md +38 -1
  262. package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/agent-selection.test.ts +345 -0
  263. package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/preflight.test.ts +344 -0
  264. package/dist/templates/cc-native/_cc-native/plan-review/lib/agent-selection.ts +38 -16
  265. package/dist/templates/cc-native/_cc-native/plan-review/lib/preflight.ts +56 -26
  266. package/dist/templates/cc-native/_cc-native/scripts/council_debate.ts +242 -0
  267. package/dist/templates/cc-native/_cc-native/scripts/council_debate_simple.ts +294 -0
  268. package/dist/templates/cc-native/_cc-native/{plan-review/workflows → workflows}/specdev.md +9 -9
  269. package/dist/templates/core/.claude/skills/codex/SKILL.md +25 -0
  270. package/dist/templates/core/.claude/skills/devin/SKILL.md +25 -0
  271. package/dist/templates/core/.claude/skills/handoff/SKILL.md +11 -0
  272. package/dist/templates/core/.claude/skills/handoff-resume/SKILL.md +11 -0
  273. package/dist/templates/core/.claude/skills/meta-plan/SKILL.md +13 -0
  274. package/dist/templates/core/.codex/skills/codex/SKILL.md +13 -0
  275. package/dist/templates/core/.codex/skills/devin/SKILL.md +19 -0
  276. package/dist/templates/core/.codex/skills/handoff/SKILL.md +11 -0
  277. package/dist/templates/core/.codex/skills/handoff-resume/SKILL.md +11 -0
  278. package/dist/templates/core/.codex/skills/meta-plan/SKILL.md +13 -0
  279. package/dist/templates/core/.devin/AGENTS.md +5 -0
  280. package/dist/templates/core/.devin/config.json +12 -0
  281. package/dist/templates/core/.devin/skills/codex/SKILL.md +19 -0
  282. package/dist/templates/core/.devin/skills/devin/SKILL.md +13 -0
  283. package/dist/templates/core/.devin/skills/handoff/SKILL.md +11 -0
  284. package/dist/templates/core/.devin/skills/handoff-resume/SKILL.md +11 -0
  285. package/dist/templates/core/.devin/skills/meta-plan/SKILL.md +13 -0
  286. package/dist/templates/core/.windsurf/workflows/handoff-resume.md +9 -0
  287. package/dist/templates/{_shared → core}/.windsurf/workflows/handoff.md +1 -1
  288. package/dist/templates/{_shared → core}/.windsurf/workflows/meta-plan.md +1 -1
  289. package/dist/templates/core/hooks-ts/_utils/git-state.ts +2 -0
  290. package/dist/templates/{_shared → core}/hooks-ts/archive_plan.ts +15 -44
  291. package/dist/templates/core/hooks-ts/codex_explorer.ts +160 -0
  292. package/dist/templates/{_shared → core}/hooks-ts/context_monitor.ts +23 -55
  293. package/dist/templates/{_shared → core}/hooks-ts/file-suggestion.ts +5 -22
  294. package/dist/templates/{_shared → core}/hooks-ts/lint_after_edit.ts +7 -9
  295. package/dist/templates/core/hooks-ts/pre_compact.ts +36 -0
  296. package/dist/templates/{_shared → core}/hooks-ts/session_end.ts +38 -78
  297. package/dist/templates/{_shared → core}/hooks-ts/session_start.ts +5 -5
  298. package/dist/templates/core/hooks-ts/task_create_capture.ts +32 -0
  299. package/dist/templates/{_shared → core}/hooks-ts/task_update_capture.ts +9 -24
  300. package/dist/templates/core/hooks-ts/user_prompt_submit.ts +46 -0
  301. package/dist/templates/{_shared → core}/lib-ts/CLAUDE.md +27 -16
  302. package/dist/templates/{_shared → core}/lib-ts/context/CLAUDE.md +9 -6
  303. package/dist/templates/{_shared → core}/lib-ts/context/context-formatter.ts +16 -21
  304. package/dist/templates/{_shared → core}/lib-ts/context/context-selector.ts +8 -6
  305. package/dist/templates/{_shared → core}/lib-ts/context/context-store.ts +59 -20
  306. package/dist/templates/{_shared → core}/lib-ts/context/plan-manager.ts +19 -15
  307. package/dist/templates/{_shared → core}/lib-ts/context/task-tracker.ts +3 -3
  308. package/dist/templates/core/lib-ts/hooks/context-monitor-logic.ts +32 -0
  309. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/hooks}/hook-utils.ts +179 -41
  310. package/dist/templates/core/lib-ts/hooks/prompt-binding-logic.ts +80 -0
  311. package/dist/templates/core/lib-ts/hooks/session-end-logic.ts +82 -0
  312. package/dist/templates/core/lib-ts/package.json +19 -0
  313. package/dist/templates/core/lib-ts/runtime/agent-launcher.ts +369 -0
  314. package/dist/templates/core/lib-ts/runtime/aiw-cli.ts +108 -0
  315. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/atomic-write.ts +12 -7
  316. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/cli-args.ts +24 -8
  317. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/constants.ts +326 -324
  318. package/dist/templates/core/lib-ts/runtime/executable-policy.ts +89 -0
  319. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/git-state.ts +6 -4
  320. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/inference.ts +60 -23
  321. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/lint-dispatch.ts +25 -23
  322. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/logger.ts +32 -29
  323. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/models.ts +9 -2
  324. package/dist/templates/core/lib-ts/runtime/platform-adapter.ts +33 -0
  325. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/preflight.ts +4 -3
  326. package/dist/templates/core/lib-ts/runtime/sentinel-ipc.ts +91 -0
  327. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/state-io.ts +20 -11
  328. package/dist/templates/core/lib-ts/runtime/stop-words.ts +185 -0
  329. package/dist/templates/core/lib-ts/runtime/subprocess-utils.ts +147 -0
  330. package/dist/templates/core/lib-ts/runtime/tmux-preflight.ts +93 -0
  331. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/utils.ts +34 -4
  332. package/dist/templates/core/lib-ts/schemas.ts +233 -0
  333. package/dist/templates/{_shared → core}/lib-ts/templates/formatters.ts +7 -5
  334. package/dist/templates/{_shared → core}/lib-ts/templates/plan-context.ts +2 -1
  335. package/dist/templates/{_shared → core}/lib-ts/tsconfig.json +3 -1
  336. package/dist/templates/{_shared → core}/lib-ts/types.ts +78 -77
  337. package/dist/templates/core/scripts/resolve-run.ts +93 -0
  338. package/dist/templates/{_shared → core}/scripts/resolve_context.ts +3 -3
  339. package/dist/templates/{_shared → core}/scripts/status_line.ts +26 -21
  340. package/dist/templates/core/skills/codex/CLAUDE.md +83 -0
  341. package/dist/templates/{_shared → core}/skills/codex/SKILL.md +27 -18
  342. package/dist/templates/{_shared → core}/skills/codex/lib/codex-watcher.ts +79 -113
  343. package/dist/templates/{_shared → core}/skills/codex/scripts/launch-codex.ts +134 -148
  344. package/dist/templates/{_shared → core}/skills/codex/scripts/watch-codex.ts +6 -4
  345. package/dist/templates/core/skills/devin/CLAUDE.md +122 -0
  346. package/dist/templates/core/skills/devin/SKILL.md +73 -0
  347. package/dist/templates/core/skills/devin/lib/devin-watcher.ts +300 -0
  348. package/dist/templates/core/skills/devin/scripts/launch-devin.ts +258 -0
  349. package/dist/templates/{_shared → core}/skills/handoff-system/CLAUDE.md +436 -433
  350. package/dist/templates/{_shared → core}/skills/handoff-system/lib/document-generator.ts +9 -7
  351. package/dist/templates/{_shared → core}/skills/handoff-system/lib/handoff-reader.ts +6 -4
  352. package/dist/templates/{_shared → core}/skills/handoff-system/scripts/resume_handoff.ts +10 -8
  353. package/dist/templates/{_shared → core}/skills/handoff-system/scripts/save_handoff.ts +12 -10
  354. package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff-resume.md +2 -2
  355. package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff.md +6 -5
  356. package/dist/templates/{_shared → core}/skills/meta-plan/CLAUDE.md +2 -1
  357. package/dist/templates/{_shared → core}/skills/meta-plan/workflows/meta-plan.md +8 -7
  358. package/oclif.manifest.json +89 -13
  359. package/package.json +13 -12
  360. package/dist/lib/base-command.d.ts +0 -114
  361. package/dist/lib/base-command.js +0 -153
  362. package/dist/lib/env-compat.d.ts +0 -18
  363. package/dist/lib/env-compat.js +0 -23
  364. package/dist/lib/stdin.d.ts +0 -48
  365. package/dist/lib/stdin.js +0 -60
  366. package/dist/templates/_shared/.claude/settings.json +0 -120
  367. package/dist/templates/_shared/.claude/skills/codex/SKILL.md +0 -35
  368. package/dist/templates/_shared/.claude/skills/handoff/SKILL.md +0 -13
  369. package/dist/templates/_shared/.claude/skills/handoff-resume/SKILL.md +0 -13
  370. package/dist/templates/_shared/.claude/skills/meta-plan/SKILL.md +0 -43
  371. package/dist/templates/_shared/.codex/workflows/codex.md +0 -11
  372. package/dist/templates/_shared/.codex/workflows/handoff.md +0 -226
  373. package/dist/templates/_shared/.codex/workflows/meta-plan.md +0 -347
  374. package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +0 -2
  375. package/dist/templates/_shared/hooks-ts/pre_compact.ts +0 -49
  376. package/dist/templates/_shared/hooks-ts/task_create_capture.ts +0 -48
  377. package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +0 -93
  378. package/dist/templates/_shared/lib-ts/agent-exec/backends/headless.ts +0 -33
  379. package/dist/templates/_shared/lib-ts/agent-exec/backends/index.ts +0 -6
  380. package/dist/templates/_shared/lib-ts/agent-exec/backends/tmux.ts +0 -119
  381. package/dist/templates/_shared/lib-ts/agent-exec/execution-backend.ts +0 -50
  382. package/dist/templates/_shared/lib-ts/agent-exec/index.ts +0 -6
  383. package/dist/templates/_shared/lib-ts/agent-exec/structured-output.ts +0 -166
  384. package/dist/templates/_shared/lib-ts/base/launchers/tmux-launcher.ts +0 -173
  385. package/dist/templates/_shared/lib-ts/base/launchers/window-launcher.ts +0 -93
  386. package/dist/templates/_shared/lib-ts/base/launchers/wt-launcher.ts +0 -64
  387. package/dist/templates/_shared/lib-ts/base/pane-launcher.ts +0 -55
  388. package/dist/templates/_shared/lib-ts/base/sentinel-ipc.ts +0 -87
  389. package/dist/templates/_shared/lib-ts/base/stop-words.ts +0 -184
  390. package/dist/templates/_shared/lib-ts/base/subprocess-utils.ts +0 -249
  391. package/dist/templates/_shared/lib-ts/base/tmux-driver.ts +0 -341
  392. package/dist/templates/_shared/lib-ts/base/tmux-pane-placement.ts +0 -78
  393. package/dist/templates/_shared/lib-ts/package.json +0 -20
  394. package/dist/templates/_shared/scripts/resolve-run.ts +0 -62
  395. package/dist/templates/_shared/skills/codex/CLAUDE.md +0 -70
  396. package/dist/templates/cc-native/_cc-native/CLAUDE.md +0 -73
  397. package/dist/templates/cc-native/_cc-native/artifacts/CLAUDE.md +0 -64
  398. package/dist/templates/cc-native/_cc-native/lib-ts/CLAUDE.md +0 -70
  399. package/dist/templates/cc-native/_cc-native/plan-review/CODING-STANDARDS-CHECKLIST.md +0 -75
  400. package/dist/templates/cc-native/_cc-native/plan-review/agents/CLAUDE.md +0 -143
  401. package/dist/templates/cc-native/_cc-native/plan-review/agents/PLAN-ORCHESTRATOR.md +0 -213
  402. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-questions/PLAN-QUESTIONER.md +0 -70
  403. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-EVOLUTION.md +0 -62
  404. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-PATTERNS.md +0 -61
  405. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-STRUCTURE.md +0 -62
  406. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ASSUMPTION-TRACER.md +0 -56
  407. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CLARITY-AUDITOR.md +0 -53
  408. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-FEASIBILITY.md +0 -66
  409. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-GAPS.md +0 -70
  410. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-ORDERING.md +0 -62
  411. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CONSTRAINT-VALIDATOR.md +0 -72
  412. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-ADR-VALIDATOR.md +0 -61
  413. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-SCALE-MATCHER.md +0 -64
  414. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DEVILS-ADVOCATE.md +0 -56
  415. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DOCUMENTATION-PHILOSOPHY.md +0 -86
  416. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HANDOFF-READINESS.md +0 -59
  417. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HIDDEN-COMPLEXITY.md +0 -58
  418. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/INCREMENTAL-DELIVERY.md +0 -66
  419. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-DEPENDENCY.md +0 -62
  420. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-FMEA.md +0 -66
  421. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-PREMORTEM.md +0 -71
  422. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-REVERSIBILITY.md +0 -74
  423. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SCOPE-BOUNDARY.md +0 -77
  424. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SIMPLICITY-GUARDIAN.md +0 -62
  425. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SKEPTIC.md +0 -68
  426. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-BEHAVIOR-AUDITOR.md +0 -61
  427. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-CHARACTERIZATION.md +0 -71
  428. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-FIRST-VALIDATOR.md +0 -61
  429. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-PYRAMID-ANALYZER.md +0 -61
  430. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-COSTS.md +0 -67
  431. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-STAKEHOLDERS.md +0 -65
  432. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-COVERAGE.md +0 -74
  433. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-STRENGTH.md +0 -69
  434. package/dist/templates/cc-native/_cc-native/plan-review/lib/corroboration.ts +0 -172
  435. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/base/base-agent.ts +0 -7
@@ -1,29 +1,21 @@
1
1
  /**
2
- * Abstract base class for CLI-based agent subprocess invocations.
3
- * Lives in _shared so all templates can use it. Provider-specific
4
- * implementations (Claude, Codex, Gemini) extend this class.
5
- *
6
- * Execution strategy is injected via ExecutionBackend (default: HeadlessBackend).
7
- * Debug logging is injectable via AgentDebugLogger (default: no-op).
2
+ * Abstract base class for CLI-based agent reviewers.
3
+ * Implements template method pattern for subprocess execution flow.
4
+ * Provider-specific implementations (Claude, Codex, Gemini) extend this class.
8
5
  */
9
6
 
10
- import { logDebug, logInfo, logWarn, logError } from "../base/logger.js";
11
- import { getInternalSubprocessEnv, findExecutable, normalizePathForCli } from "../base/subprocess-utils.js";
12
- import { HeadlessBackend } from "./backends/headless.js";
13
- import type { ExecutionBackend, ExecutionResult, AgentDebugLogger } from "./execution-backend.js";
14
- import type { AgentConfig } from "../types.js";
15
-
16
- // Re-export for consumers
17
- export type { ExecutionResult, AgentDebugLogger };
18
-
19
- /** Configuration object for BaseCliAgent construction. */
20
- export interface AgentExecutionConfig {
21
- agent: AgentConfig;
22
- schema: Record<string, unknown>;
23
- timeout: number;
24
- contextPath?: string;
25
- sessionName?: string;
26
- debugLogger?: AgentDebugLogger;
7
+ import { logDebug, logInfo, logWarn, logError } from "../../../../_core/lib-ts/runtime/logger.js";
8
+ import { getInternalSubprocessEnv, findExecutable, execFileAsync } from "../../../../_core/lib-ts/runtime/subprocess-utils.js";
9
+ import { debugLog, debugRaw } from "../../debug.js";
10
+ import type { AgentConfig } from "../../types.js";
11
+
12
+ /** Result from execFileAsync */
13
+ export interface ExecResult {
14
+ stdout: string;
15
+ stderr: string;
16
+ exitCode: number | null;
17
+ signal: string | null;
18
+ killed: boolean;
27
19
  }
28
20
 
29
21
  /**
@@ -34,70 +26,133 @@ export interface AgentExecutionConfig {
34
26
  */
35
27
  export abstract class BaseCliAgent<T> {
36
28
  protected agent: AgentConfig;
37
- protected backend: ExecutionBackend;
38
- protected contextPath?: string;
39
- protected debugLogger?: AgentDebugLogger;
40
29
  protected schema: Record<string, unknown>;
41
- protected sessionName: string;
42
30
  protected timeout: number;
31
+ protected contextPath?: string;
32
+ protected sessionName: string;
43
33
 
44
34
  constructor(
45
- config: AgentExecutionConfig,
46
- backend?: ExecutionBackend,
35
+ agent: AgentConfig,
36
+ schema: Record<string, unknown>,
37
+ timeout: number,
38
+ contextPath?: string,
39
+ sessionName = "unknown",
47
40
  ) {
48
- this.agent = config.agent;
49
- this.schema = config.schema;
50
- this.timeout = config.timeout;
51
- this.contextPath = config.contextPath;
52
- this.sessionName = config.sessionName ?? "unknown";
53
- this.debugLogger = config.debugLogger;
54
- this.backend = backend ?? new HeadlessBackend();
41
+ this.agent = agent;
42
+ this.schema = schema;
43
+ this.timeout = timeout;
44
+ this.contextPath = contextPath;
45
+ this.sessionName = sessionName;
55
46
  }
56
47
 
57
- /** Build the command-line arguments for the CLI */
58
- protected abstract buildCliArgs(): string[];
48
+ /**
49
+ * Template method - orchestrates the review flow.
50
+ * Subclasses override abstract methods to customize behavior.
51
+ */
52
+ async review(plan: string): Promise<T> {
53
+ // 1. Find CLI executable
54
+ const cliPath = this.findCli();
55
+ if (!cliPath) {
56
+ return this.makeSkipResult(`${this.getCliName()} CLI not found on PATH`);
57
+ }
58
+
59
+ logDebug(this.agent.name, `Found ${this.getCliName()} CLI at: ${cliPath}`);
60
+
61
+ // 2. Build prompt and args (provider-specific)
62
+ const prompt = this.buildPrompt(plan);
63
+ const args = this.buildCliArgs();
64
+
65
+ logInfo(this.agent.name, `Running ${this.getCliName()} with model: ${this.agent.model}, timeout: ${this.timeout}s`);
66
+
67
+ // 3. Execute subprocess
68
+ const env = getInternalSubprocessEnv();
69
+ const result = await execFileAsync(cliPath, args, {
70
+ input: prompt,
71
+ timeout: this.timeout * 1000,
72
+ env: env as Record<string, string>,
73
+ maxBuffer: 10 * 1024 * 1024,
74
+ shell: process.platform === "win32",
75
+ });
76
+
77
+ // 4. Handle timeout
78
+ if (result.killed || result.signal === "SIGTERM") {
79
+ return this.handleTimeout();
80
+ }
81
+
82
+ // 5. Extract output (provider-specific)
83
+ const { raw, err } = this.extractOutput(result);
84
+
85
+ // 6. Handle exit errors
86
+ if (!raw && !err && result.exitCode !== 0) {
87
+ return this.handleExitError(result);
88
+ }
89
+
90
+ // 7. Log subprocess results
91
+ this.logSubprocessResult(result, raw, err);
92
+
93
+ // 8. Parse JSON output (provider-specific)
94
+ const obj = this.parseOutput(raw, result);
95
+
96
+ // 9. Log parsed result
97
+ this.logParsedResult(obj);
98
+
99
+ // 10. Coerce to result type T (provider-specific)
100
+ const coerced = this.coerceResult(obj, raw, err);
101
+
102
+ // 11. Cleanup (optional override)
103
+ await this.cleanup();
104
+
105
+ return coerced;
106
+ }
59
107
 
60
108
  // ─── Abstract Methods (Subclass Implements) ────────────────────────────
61
109
 
110
+ /** Get the CLI executable name (e.g., "claude", "codex") */
111
+ protected abstract getCliName(): string;
112
+
62
113
  /** Build the stdin prompt for the CLI */
63
114
  protected abstract buildPrompt(plan: string): string;
64
115
 
65
- /** Optional cleanup after subprocess execution */
66
- protected async cleanup(): Promise<void> {
67
- // Default: no-op. Subclasses override if needed (e.g., Codex temp files).
68
- }
116
+ /** Build the command-line arguments for the CLI */
117
+ protected abstract buildCliArgs(): string[];
118
+
119
+ /** Parse JSON from CLI output */
120
+ protected abstract parseOutput(raw: string, result: ExecResult): Record<string, unknown> | null;
69
121
 
70
122
  /** Coerce parsed JSON into the result type T */
71
123
  protected abstract coerceResult(obj: Record<string, unknown> | null, raw: string, err: string): T;
72
124
 
73
- /** Extract stdout/stderr from subprocess result. Override for file-based output (Codex). */
74
- protected extractOutput(result: ExecutionResult): { raw: string; err: string } {
75
- return {
76
- raw: result.stdout.trim(),
77
- err: result.stderr.trim(),
78
- };
79
- }
125
+ // ─── Template Methods (Subclass Can Override) ──────────────────────────
80
126
 
81
127
  /** Find the CLI executable. Override for custom search logic. */
82
128
  protected findCli(): string | null {
83
129
  return findExecutable(this.getCliName());
84
130
  }
85
131
 
86
- // ─── Template Methods (Subclass Can Override) ──────────────────────────
87
-
88
- /** Get the CLI executable name (e.g., "claude", "codex") */
89
- protected abstract getCliName(): string;
132
+ /** Extract stdout/stderr from subprocess result. Override for file-based output (Codex). */
133
+ protected extractOutput(result: ExecResult): { raw: string; err: string } {
134
+ return {
135
+ raw: result.stdout.trim(),
136
+ err: result.stderr.trim(),
137
+ };
138
+ }
90
139
 
91
140
  /** Get default error message for coerceToReview */
92
141
  protected getDefaultErrorMessage(): string {
93
142
  return `Retry or check ${this.getCliName()} configuration.`;
94
143
  }
95
144
 
96
- /** Handle non-zero exit with no output */
97
- protected handleExitError(result: ExecutionResult): T {
98
- const msg = `${this.agent.name} failed to run (exit ${result.exitCode})`;
99
- logError(this.agent.name, `Process exited with code ${result.exitCode} and no output`);
100
- return this.makeErrorResult("error", msg);
145
+ /** Optional cleanup after subprocess execution */
146
+ protected async cleanup(): Promise<void> {
147
+ // Default: no-op. Subclasses override if needed (e.g., Codex temp files).
148
+ }
149
+
150
+ // ─── Shared Infrastructure ──────────────────────────────────────────────
151
+
152
+ /** Create skip result when CLI not found */
153
+ protected makeSkipResult(reason: string): T {
154
+ logWarn(this.agent.name, reason);
155
+ return this.makeErrorResult("skip", reason);
101
156
  }
102
157
 
103
158
  /** Handle timeout scenario */
@@ -107,39 +162,29 @@ export abstract class BaseCliAgent<T> {
107
162
  return this.makeErrorResult("error", `${this.agent.name} timed out after ${this.timeout}s`);
108
163
  }
109
164
 
110
- // ─── Shared Infrastructure ──────────────────────────────────────────────
111
-
112
- /** Log parsed JSON result */
113
- protected logParsedResult(obj: Record<string, unknown> | null): void {
114
- if (this.contextPath && obj) {
115
- this.debugLogger?.log(this.contextPath, this.sessionName, `agent:${this.agent.name}`, "parsed_result", {
116
- parsed_keys: Object.keys(obj),
117
- verdict: obj.verdict ?? null,
118
- has_summary: Boolean(obj.summary),
119
- issues_count: Array.isArray(obj.issues) ? (obj.issues as unknown[]).length : 0,
120
- });
121
- }
122
-
123
- if (obj) {
124
- logInfo(this.agent.name, `Parsed JSON successfully, verdict: ${obj.verdict ?? "N/A"}`);
125
- } else {
126
- logWarn(this.agent.name, "Failed to parse JSON from output");
127
- }
165
+ /** Handle non-zero exit with no output */
166
+ protected handleExitError(result: ExecResult): T {
167
+ const msg = `${this.agent.name} failed to run (exit ${result.exitCode})`;
168
+ logError(this.agent.name, `Process exited with code ${result.exitCode} and no output`);
169
+ return this.makeErrorResult("error", msg);
128
170
  }
129
171
 
172
+ /** Construct a T for error/skip/timeout scenarios. Subclasses define shape. */
173
+ protected abstract makeErrorResult(type: "skip" | "error", message: string): T;
174
+
130
175
  /** Log subprocess execution results */
131
- protected logSubprocessResult(result: ExecutionResult, raw: string, err: string): void {
176
+ protected logSubprocessResult(result: ExecResult, raw: string, err: string): void {
132
177
  logDebug(this.agent.name, `Exit code: ${result.exitCode}`);
133
178
  logDebug(this.agent.name, `stdout length: ${raw.length} chars`);
134
179
  if (err) logDebug(this.agent.name, `stderr: ${err.slice(0, 500)}`);
135
180
 
136
181
  // Debug logging
137
182
  if (this.contextPath) {
138
- this.debugLogger?.raw(this.contextPath, this.sessionName, `agent:${this.agent.name}`, "stdout", raw);
183
+ debugRaw(this.contextPath, this.sessionName, `agent:${this.agent.name}`, "stdout", raw);
139
184
  if (err) {
140
- this.debugLogger?.raw(this.contextPath, this.sessionName, `agent:${this.agent.name}`, "stderr", err);
185
+ debugRaw(this.contextPath, this.sessionName, `agent:${this.agent.name}`, "stderr", err);
141
186
  }
142
- this.debugLogger?.log(this.contextPath, this.sessionName, `agent:${this.agent.name}`, "subprocess_info", {
187
+ debugLog(this.contextPath, this.sessionName, `agent:${this.agent.name}`, "subprocess_info", {
143
188
  exit_code: result.exitCode,
144
189
  stdout_len: raw.length,
145
190
  stderr_len: err.length,
@@ -152,78 +197,21 @@ export abstract class BaseCliAgent<T> {
152
197
  if (raw) logDebug(this.agent.name, `stdout preview: ${raw.slice(0, 500)}`);
153
198
  }
154
199
 
155
- /** Construct a T for error/skip/timeout scenarios. Subclasses define shape. */
156
- protected abstract makeErrorResult(type: "skip" | "error", message: string): T;
157
-
158
- /** Create skip result when CLI not found */
159
- protected makeSkipResult(reason: string): T {
160
- logWarn(this.agent.name, reason);
161
- return this.makeErrorResult("skip", reason);
162
- }
163
-
164
- /** Parse JSON from CLI output */
165
- protected abstract parseOutput(raw: string, result: ExecutionResult): Record<string, unknown> | null;
166
-
167
- /**
168
- * Template method - orchestrates the review flow.
169
- * Subclasses override abstract methods to customize behavior.
170
- */
171
- async review(plan: string): Promise<T> {
172
- // 1. Find CLI executable
173
- const cliPath = this.findCli();
174
- if (!cliPath) {
175
- return this.makeSkipResult(`${this.getCliName()} CLI not found on PATH`);
176
- }
177
-
178
- logDebug(this.agent.name, `Found ${this.getCliName()} CLI at: ${cliPath}`);
179
-
180
- // 2. Build prompt and args (provider-specific)
181
- const prompt = this.buildPrompt(plan);
182
- const args = this.buildCliArgs();
183
-
184
- logInfo(this.agent.name, `Running ${this.getCliName()} with model: ${this.agent.model}, timeout: ${this.timeout}s`);
185
-
186
- // 3. Execute via backend
187
- const env = getInternalSubprocessEnv();
188
- const normalizedCliPath = normalizePathForCli(cliPath);
189
- const result = await this.backend.execute({
190
- cliPath: normalizedCliPath,
191
- args,
192
- input: prompt,
193
- env: env as Record<string, string>,
194
- timeoutMs: this.timeout * 1000,
195
- maxBuffer: 10 * 1024 * 1024,
196
- shell: process.platform === "win32",
197
- });
198
-
199
- // 4. Handle timeout
200
- if (result.killed || result.signal === "SIGTERM") {
201
- return this.handleTimeout();
200
+ /** Log parsed JSON result */
201
+ protected logParsedResult(obj: Record<string, unknown> | null): void {
202
+ if (this.contextPath && obj) {
203
+ debugLog(this.contextPath, this.sessionName, `agent:${this.agent.name}`, "parsed_result", {
204
+ parsed_keys: Object.keys(obj),
205
+ verdict: obj.verdict ?? null,
206
+ has_summary: Boolean(obj.summary),
207
+ issues_count: Array.isArray(obj.issues) ? (obj.issues as unknown[]).length : 0,
208
+ });
202
209
  }
203
210
 
204
- // 5. Extract output (provider-specific)
205
- const { raw, err } = this.extractOutput(result);
206
-
207
- // 6. Handle exit errors
208
- if (!raw && !err && result.exitCode !== 0) {
209
- return this.handleExitError(result);
211
+ if (obj) {
212
+ logInfo(this.agent.name, `Parsed JSON successfully, verdict: ${obj.verdict ?? "N/A"}`);
213
+ } else {
214
+ logWarn(this.agent.name, "Failed to parse JSON from output");
210
215
  }
211
-
212
- // 7. Log subprocess results
213
- this.logSubprocessResult(result, raw, err);
214
-
215
- // 8. Parse JSON output (provider-specific)
216
- const obj = this.parseOutput(raw, result);
217
-
218
- // 9. Log parsed result
219
- this.logParsedResult(obj);
220
-
221
- // 10. Coerce to result type T (provider-specific)
222
- const coerced = this.coerceResult(obj, raw, err);
223
-
224
- // 11. Cleanup (optional override)
225
- await this.cleanup();
226
-
227
- return coerced;
228
216
  }
229
217
  }
@@ -1,12 +1,12 @@
1
- /**
2
- * Reviewers package — re-exports all reviewer implementations.
3
- * See cc-native-plan-review-spec.md §4.9
4
- */
5
-
6
- export { AgentReviewer, runAgentReview } from "./agent.js";
7
- export { BaseCliAgent, type AgentExecutionConfig, type AgentDebugLogger } from "./base/base-agent.js";
8
- export { ClaudeAgent } from "./providers/claude-agent.js";
9
- export { CodexAgent } from "./providers/codex-agent.js";
10
- export { GeminiAgent } from "./providers/gemini-agent.js";
11
- export type { Reviewer, ReviewerResult, ReviewOptions } from "./types.js";
12
- export { makeResult } from "./types.js";
1
+ /**
2
+ * Reviewers package — re-exports all reviewer implementations.
3
+ * See cc-native-plan-review-spec.md §4.9
4
+ */
5
+
6
+ export type { Reviewer, ReviewerResult, ReviewOptions } from "./types.js";
7
+ export { makeResult } from "./types.js";
8
+ export { AgentReviewer, runAgentReview } from "./agent.js";
9
+ export { BaseCliAgent } from "./base/base-agent.js";
10
+ export { ClaudeAgent } from "./providers/claude-agent.js";
11
+ export { CodexAgent } from "./providers/codex-agent.js";
12
+ export { GeminiAgent } from "./providers/gemini-agent.js";
@@ -1,57 +1,66 @@
1
- /**
2
- * Claude CLI agent reviewer implementation.
3
- * Uses claude CLI with --json-schema and --system-prompt flags.
4
- */
5
-
6
- import { buildCliInvocation, reviewSpec } from "../../../../../_shared/lib-ts/base/cli-args.js";
7
- import type { ExecutionResult } from "../../../../../_shared/lib-ts/agent-exec/execution-backend.js";
8
- import { parseCliOutput } from "../../../../lib-ts/cli-output-parser.js";
9
- import { coerceToReview } from "../../../../lib-ts/json-parser.js";
10
- import type { ReviewerResult } from "../../../../lib-ts/types.js";
11
- import { BaseCliAgent } from "../base/base-agent.js";
12
- import { AGENT_REVIEW_PROMPT_PREFIX } from "../schemas.js";
13
- import { makeResult } from "../types.js";
14
-
15
- /**
16
- * Claude CLI-based agent reviewer.
17
- * Extends BaseCliAgent with Claude-specific prompt and argument handling.
18
- */
19
- export class ClaudeAgent extends BaseCliAgent<ReviewerResult> {
20
- protected buildCliArgs(): string[] {
21
- const fullPrompt = this.agent.system_prompt
22
- ? AGENT_REVIEW_PROMPT_PREFIX + "\n\n---\n\n" + this.agent.system_prompt
23
- : undefined;
24
-
25
- return buildCliInvocation(
26
- reviewSpec("claude", this.agent.model, this.schema, fullPrompt),
27
- ).args;
28
- }
29
-
30
- protected buildPrompt(plan: string): string {
31
- return `IMMEDIATELY call StructuredOutput with your review of the plan below.
32
- Do NOT output any text before calling StructuredOutput.
33
-
34
- PLAN:
35
- <<<
36
- ${plan}
37
- >>>
38
- `;
39
- }
40
-
41
- protected coerceResult(obj: Record<string, unknown> | null, raw: string, err: string): ReviewerResult {
42
- const [ok, verdict, norm] = coerceToReview(obj, this.getDefaultErrorMessage());
43
- return makeResult(this.agent.name, ok, verdict, norm, raw, err);
44
- }
45
-
46
- protected getCliName(): string {
47
- return "claude";
48
- }
49
-
50
- protected makeErrorResult(type: "skip" | "error", message: string): ReviewerResult {
51
- return makeResult(this.agent.name, false, type, {}, "", message);
52
- }
53
-
54
- protected parseOutput(raw: string, _result: ExecutionResult): Record<string, unknown> | null {
55
- return parseCliOutput(raw, ["verdict", "summary"]);
56
- }
57
- }
1
+ /**
2
+ * Claude CLI agent reviewer implementation.
3
+ * Uses claude CLI with --json-schema and --system-prompt flags.
4
+ */
5
+
6
+ import { shellQuoteWin } from "../../../../_core/lib-ts/runtime/subprocess-utils.js";
7
+ import { parseCliOutput } from "../../cli-output-parser.js";
8
+ import { coerceToReview } from "../../json-parser.js";
9
+ import type { ReviewerResult } from "../../types.js";
10
+ import { AGENT_REVIEW_PROMPT_PREFIX } from "../schemas.js";
11
+ import { makeResult } from "../types.js";
12
+ import { BaseCliAgent } from "../base/base-agent.js";
13
+
14
+ /**
15
+ * Claude CLI-based agent reviewer.
16
+ * Extends BaseCliAgent with Claude-specific prompt and argument handling.
17
+ */
18
+ export class ClaudeAgent extends BaseCliAgent<ReviewerResult> {
19
+ protected getCliName(): string {
20
+ return "claude";
21
+ }
22
+
23
+ protected buildPrompt(plan: string): string {
24
+ return `IMMEDIATELY call StructuredOutput with your review of the plan below.
25
+ Do NOT output any text before calling StructuredOutput.
26
+
27
+ PLAN:
28
+ <<<
29
+ ${plan}
30
+ >>>
31
+ `;
32
+ }
33
+
34
+ protected buildCliArgs(): string[] {
35
+ const schemaJson = JSON.stringify(this.schema);
36
+ const cmdArgs = [
37
+ "--model", this.agent.model,
38
+ "--output-format", "json",
39
+ "--json-schema", shellQuoteWin(schemaJson),
40
+ "--max-turns", "3",
41
+ "--setting-sources", process.platform === "win32" ? '""' : "",
42
+ "-p",
43
+ "--no-session-persistence", // Prevent subprocess from creating session records
44
+ ];
45
+
46
+ if (this.agent.system_prompt) {
47
+ const fullPrompt = AGENT_REVIEW_PROMPT_PREFIX + "\n\n---\n\n" + this.agent.system_prompt;
48
+ cmdArgs.push("--system-prompt", shellQuoteWin(fullPrompt));
49
+ }
50
+
51
+ return cmdArgs;
52
+ }
53
+
54
+ protected parseOutput(raw: string, _result: unknown): Record<string, unknown> | null {
55
+ return parseCliOutput(raw, ["verdict", "summary"]);
56
+ }
57
+
58
+ protected coerceResult(obj: Record<string, unknown> | null, raw: string, err: string): ReviewerResult {
59
+ const [ok, verdict, norm] = coerceToReview(obj, this.getDefaultErrorMessage());
60
+ return makeResult(this.agent.name, ok, verdict, norm, raw, err);
61
+ }
62
+
63
+ protected makeErrorResult(type: "skip" | "error", message: string): ReviewerResult {
64
+ return makeResult(this.agent.name, false, type, {}, "", message);
65
+ }
66
+ }