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
@@ -0,0 +1,89 @@
1
+ import { execSync } from 'node:child_process'
2
+ import type { ExecSyncOptionsWithStringEncoding } from 'node:child_process'
3
+
4
+ import { commandLookupBinary, isWindowsPlatform } from './platform-adapter.js'
5
+
6
+ export type WindowsLookupProfile = 'cmdOrExeFirst' | 'exeThenExtensionlessThenCmd'
7
+
8
+ export function parseLookupLines(stdout: string): string[] {
9
+ return stdout
10
+ .trim()
11
+ .split(/\r?\n/)
12
+ .map((line) => line.trim())
13
+ .filter(Boolean)
14
+ }
15
+
16
+ export function pickWindowsPath(lines: string[], profile: WindowsLookupProfile): null | string {
17
+ if (lines.length === 0) return null
18
+
19
+ if (profile === 'cmdOrExeFirst') {
20
+ return lines.find((line) => /\.(cmd|exe)$/i.test(line)) ?? lines[0] ?? null
21
+ }
22
+
23
+ return lines.find((line) => /\.exe$/i.test(line))
24
+ ?? lines.find((line) => !/\.(cmd|ps1)$/i.test(line))
25
+ ?? lines.find((line) => /\.cmd$/i.test(line))
26
+ ?? lines[0]
27
+ ?? null
28
+ }
29
+
30
+ export function selectLookupPath(
31
+ lines: string[],
32
+ platform: NodeJS.Platform = process.platform,
33
+ windowsProfile: WindowsLookupProfile = 'cmdOrExeFirst',
34
+ ): null | string {
35
+ if (lines.length === 0) return null
36
+ if (!isWindowsPlatform(platform)) return lines[0] ?? null
37
+ return pickWindowsPath(lines, windowsProfile)
38
+ }
39
+
40
+ export function resolveExecutable(
41
+ name: string,
42
+ options?: {
43
+ platform?: NodeJS.Platform | undefined
44
+ timeoutMs?: number | undefined
45
+ windowsHide?: boolean | undefined
46
+ windowsProfile?: undefined | WindowsLookupProfile
47
+ },
48
+ ): null | string {
49
+ const platform = options?.platform ?? process.platform
50
+ const lines = lookupExecutables(name, {
51
+ platform,
52
+ timeoutMs: options?.timeoutMs,
53
+ windowsHide: options?.windowsHide,
54
+ })
55
+ return selectLookupPath(lines, platform, options?.windowsProfile ?? 'cmdOrExeFirst')
56
+ }
57
+
58
+ export function isCommandAvailable(
59
+ name: string,
60
+ platform: NodeJS.Platform = process.platform,
61
+ ): boolean {
62
+ return resolveExecutable(name, { platform }) !== null
63
+ }
64
+
65
+ export function lookupExecutables(
66
+ name: string,
67
+ options?: {
68
+ platform?: NodeJS.Platform | undefined
69
+ timeoutMs?: number | undefined
70
+ windowsHide?: boolean | undefined
71
+ },
72
+ ): string[] {
73
+ const platform = options?.platform ?? process.platform
74
+ const lookupBin = commandLookupBinary(platform)
75
+ const cmd = `${lookupBin} ${name}`
76
+
77
+ try {
78
+ return parseLookupLines(execSync(cmd, {
79
+ encoding: 'utf8',
80
+ stdio: ['pipe', 'pipe', 'pipe'],
81
+ shell: true,
82
+ timeout: options?.timeoutMs ?? 3000,
83
+ windowsHide: options?.windowsHide ?? true,
84
+ } as unknown as ExecSyncOptionsWithStringEncoding))
85
+ } catch {
86
+ return []
87
+ }
88
+ }
89
+
@@ -4,13 +4,13 @@ import { execFileSync } from "node:child_process";
4
4
  * Capture current git state for session snapshots.
5
5
  * All fields are optional — failures are silently ignored.
6
6
  */
7
- export function getGitState(projectRoot: string): Record<string, any> {
8
- const gitState: Record<string, any> = {};
7
+ export function getGitState(projectRoot: string): Record<string, unknown> {
8
+ const gitState: Record<string, unknown> = {};
9
9
  const isWin = process.platform === "win32";
10
10
  const opts = {
11
11
  cwd: projectRoot,
12
12
  timeout: 5000,
13
- encoding: "utf-8" as const,
13
+ encoding: "utf8" as const,
14
14
  stdio: ["pipe", "pipe", "pipe"] as ["pipe", "pipe", "pipe"],
15
15
  shell: isWin,
16
16
  };
@@ -45,7 +45,7 @@ export function getGitState(projectRoot: string): Record<string, any> {
45
45
  export function getGitStatusShort(projectRoot?: string): string {
46
46
  try {
47
47
  const result = execFileSync("git", ["status", "--short"], {
48
- encoding: "utf-8",
48
+ encoding: "utf8",
49
49
  timeout: 5000,
50
50
  stdio: ["pipe", "pipe", "pipe"],
51
51
  ...(projectRoot ? { cwd: projectRoot } : {}),
@@ -56,3 +56,5 @@ export function getGitStatusShort(projectRoot?: string): string {
56
56
  return "(git status unavailable)";
57
57
  }
58
58
  }
59
+
60
+
@@ -7,9 +7,8 @@
7
7
  import { execFileSync } from "node:child_process";
8
8
 
9
9
  import { logDebug, logWarn } from "./logger.js";
10
- import { STOP_WORDS } from "./stop-words.js";
10
+ import { filterStopWords } from "./stop-words.js";
11
11
  import type { InferenceResult } from "../types.js";
12
- import { execFileAsync } from "./subprocess-utils.js";
13
12
  import {
14
13
  buildCliInvocation,
15
14
  inferenceSpec,
@@ -19,6 +18,7 @@ import {
19
18
  TIER_TIMEOUTS,
20
19
  } from "./cli-args.js";
21
20
  import { CODEX_MODELS } from "./models.js";
21
+ import { execFileAsync } from "./subprocess-utils.js";
22
22
 
23
23
  const CONTEXT_ID_PRIMARY_MODEL = CODEX_MODELS.spark;
24
24
 
@@ -35,7 +35,6 @@ export function inference(
35
35
  ): InferenceResult {
36
36
  const startTime = Date.now();
37
37
  const modelInput = options?.model ?? level;
38
- const model = resolveModel(modelInput);
39
38
  const timeoutSec = timeout ?? (isModelTier(modelInput) ? getTierTimeout(modelInput) : TIER_TIMEOUTS.fast);
40
39
  const fullPrompt = `${systemPrompt}\n\n${userPrompt}`;
41
40
 
@@ -55,7 +54,7 @@ export function inference(
55
54
  {
56
55
  timeout: timeoutSec * 1000,
57
56
  env: invocation.env,
58
- encoding: "utf-8",
57
+ encoding: "utf8",
59
58
  stdio: ["pipe", "pipe", "pipe"],
60
59
  shell: isWin,
61
60
  },
@@ -67,10 +66,17 @@ export function inference(
67
66
  output: stdout.trim(),
68
67
  latency_ms: latencyMs,
69
68
  };
70
- } catch (error: any) {
69
+ } catch (error: unknown) {
71
70
  const latencyMs = Date.now() - startTime;
71
+ const execError = error as {
72
+ code?: string;
73
+ killed?: boolean;
74
+ status?: number;
75
+ stderr?: unknown;
76
+ stdout?: unknown;
77
+ };
72
78
 
73
- if (error.code === "ETIMEDOUT" || error.killed) {
79
+ if (execError.code === "ETIMEDOUT" || execError.killed) {
74
80
  return {
75
81
  success: false,
76
82
  output: "",
@@ -79,7 +85,7 @@ export function inference(
79
85
  };
80
86
  }
81
87
 
82
- if (error.code === "ENOENT") {
88
+ if (execError.code === "ENOENT") {
83
89
  return {
84
90
  success: false,
85
91
  output: "",
@@ -89,11 +95,11 @@ export function inference(
89
95
  }
90
96
 
91
97
  // Non-zero exit code
92
- if (error.status !== undefined && error.status !== 0) {
98
+ if (execError.status !== undefined && execError.status !== 0) {
93
99
  return {
94
100
  success: false,
95
- output: (error.stdout ?? "").toString().trim(),
96
- error: (error.stderr ?? "").toString().trim() || `Exit code: ${error.status}`,
101
+ output: String(execError.stdout ?? "").trim(),
102
+ error: String(execError.stderr ?? "").trim() || `Exit code: ${execError.status}`,
97
103
  latency_ms: latencyMs,
98
104
  };
99
105
  }
@@ -137,7 +143,7 @@ export function generateSemanticSummary(
137
143
  summary = summary.replace(/[.!?]+$/, "");
138
144
 
139
145
  // Filter stop words
140
- summary = filterStopWords(summary);
146
+ summary = filterStopWords(summary).toLowerCase();
141
147
 
142
148
  const words = summary.split(/\s+/);
143
149
  if (words.length < 6 || words.length > 12) return null;
@@ -182,12 +188,12 @@ Respond with ONLY a JSON object: {"slug": "your 8-12 word phrase here"}`;
182
188
 
183
189
  /**
184
190
  * Generate a 5-12 word context ID slug from a user prompt.
185
- * Uses 5.3 Codex Spark first, then falls back to current fast tier for resilience.
191
+ * Uses Codex Spark first, then falls back to current fast tier for resilience.
186
192
  * See SPEC.md §6.3
187
193
  */
188
194
  export function generateContextIdSlug(
189
195
  prompt: string,
190
- timeout = 3,
196
+ timeout = 8,
191
197
  ): string | null {
192
198
  const truncated = prompt.slice(0, 500);
193
199
 
@@ -294,14 +300,45 @@ export async function inferenceAsync(
294
300
  return { success: true, output: result.stdout.trim(), latency_ms: latencyMs };
295
301
  }
296
302
 
297
- /**
298
- * Filter stop words from text.
299
- * See SPEC.md §6.4
300
- */
301
- function filterStopWords(text: string): string {
302
- return text
303
- .toLowerCase()
304
- .split(/\s+/)
305
- .filter((w) => !STOP_WORDS.has(w) && w.length > 1)
306
- .join(" ");
303
+ export async function codexInferAsync(
304
+ prompt: string,
305
+ model: string,
306
+ options?: { sandbox?: string; timeout?: number },
307
+ ): Promise<InferenceResult> {
308
+ const startTime = Date.now();
309
+ const args = ["exec", "--model", model, "--json"];
310
+ if (options?.sandbox) {
311
+ args.push("--sandbox", options.sandbox);
312
+ }
313
+
314
+ const result = await execFileAsync(
315
+ "codex",
316
+ args,
317
+ {
318
+ env: process.env,
319
+ input: prompt,
320
+ timeout: (options?.timeout ?? 30) * 1000,
321
+ },
322
+ );
323
+
324
+ const latencyMs = Date.now() - startTime;
325
+ if (result.killed) {
326
+ return { success: false, output: "", error: `Timeout after ${options?.timeout ?? 30}s`, latency_ms: latencyMs };
327
+ }
328
+ if (result.exitCode !== 0) {
329
+ return {
330
+ success: false,
331
+ output: result.stdout.trim(),
332
+ error: result.stderr.trim() || `Exit code: ${result.exitCode}`,
333
+ latency_ms: latencyMs,
334
+ };
335
+ }
336
+
337
+ return {
338
+ success: true,
339
+ output: result.stdout.trim(),
340
+ latency_ms: latencyMs,
341
+ };
307
342
  }
343
+
344
+
@@ -4,8 +4,9 @@
4
4
  * See root CLAUDE.md for template sync targets.
5
5
  */
6
6
 
7
+ import {spawnSync} from 'node:child_process'
7
8
  import * as fs from "node:fs";
8
- import * as path from "node:path";
9
+ import path from "node:path";
9
10
 
10
11
  import { logDebug, logWarn } from "./logger.js";
11
12
  import { findExecutable } from "./subprocess-utils.js";
@@ -35,14 +36,14 @@ export interface LintError {
35
36
 
36
37
  function parseBiomeOutput(stdout: string, _stderr: string, _exitCode: number): LintError[] {
37
38
  try {
38
- const data = JSON.parse(stdout);
39
- const diagnostics: any[] = data?.diagnostics ?? [];
39
+ const data = JSON.parse(stdout) as { diagnostics?: any[] };
40
+ const diagnostics = data.diagnostics ?? [];
40
41
  return diagnostics.map((d) => ({
41
42
  line: d.location?.span?.start?.line ?? d.location?.sourceCode?.lineIndex ?? 0,
42
43
  column: d.location?.span?.start?.character ?? undefined,
43
44
  severity: d.severity === "error" || d.severity === "fatal" ? "error" as const : "warning" as const,
44
45
  message: typeof d.description === "string" ? d.description : (d.message ?? "Unknown issue"),
45
- rule: d.category ?? undefined,
46
+ ...(d.category ? {rule: d.category} : {}),
46
47
  }));
47
48
  } catch {
48
49
  return [];
@@ -51,13 +52,13 @@ function parseBiomeOutput(stdout: string, _stderr: string, _exitCode: number): L
51
52
 
52
53
  function parseRuffOutput(stdout: string, _stderr: string, _exitCode: number): LintError[] {
53
54
  try {
54
- const items: any[] = JSON.parse(stdout);
55
+ const items = JSON.parse(stdout) as any[];
55
56
  return items.map((item) => ({
56
57
  line: item.location?.row ?? 0,
57
58
  column: item.location?.column ?? undefined,
58
59
  severity: "error" as const,
59
60
  message: item.message ?? "Unknown issue",
60
- rule: item.code ?? undefined,
61
+ ...(item.code ? {rule: item.code} : {}),
61
62
  }));
62
63
  } catch {
63
64
  return [];
@@ -66,14 +67,14 @@ function parseRuffOutput(stdout: string, _stderr: string, _exitCode: number): Li
66
67
 
67
68
  function parseShellcheckOutput(stdout: string, _stderr: string, _exitCode: number): LintError[] {
68
69
  try {
69
- const data = JSON.parse(stdout);
70
- const comments: any[] = data?.comments ?? [];
70
+ const data = JSON.parse(stdout) as { comments?: any[] };
71
+ const comments = data.comments ?? [];
71
72
  return comments.map((c) => ({
72
73
  line: c.line ?? 0,
73
74
  column: c.column ?? undefined,
74
75
  severity: c.level === "error" ? "error" as const : "warning" as const,
75
76
  message: c.message ?? "Unknown issue",
76
- rule: c.code ? `SC${c.code}` : undefined,
77
+ ...(c.code ? {rule: `SC${c.code}`} : {}),
77
78
  }));
78
79
  } catch {
79
80
  return [];
@@ -82,14 +83,14 @@ function parseShellcheckOutput(stdout: string, _stderr: string, _exitCode: numbe
82
83
 
83
84
  function parseRubocopOutput(stdout: string, _stderr: string, _exitCode: number): LintError[] {
84
85
  try {
85
- const data = JSON.parse(stdout);
86
- const offenses: any[] = data?.files?.[0]?.offenses ?? [];
86
+ const data = JSON.parse(stdout) as { files?: Array<{ offenses?: any[] }> };
87
+ const offenses = data.files?.[0]?.offenses ?? [];
87
88
  return offenses.map((o) => ({
88
89
  line: o.location?.line ?? 0,
89
90
  column: o.location?.column ?? undefined,
90
91
  severity: o.severity === "error" || o.severity === "fatal" ? "error" as const : "warning" as const,
91
92
  message: o.message ?? "Unknown issue",
92
- rule: o.cop_name ?? undefined,
93
+ ...(o.cop_name ? {rule: o.cop_name} : {}),
93
94
  }));
94
95
  } catch {
95
96
  return [];
@@ -108,7 +109,7 @@ function parseCppcheckOutput(_stdout: string, stderr: string, _exitCode: number)
108
109
  column: parseInt(m[3]!, 10),
109
110
  severity: m[4] === "error" ? "error" : "warning",
110
111
  message: m[5]!,
111
- rule: m[6],
112
+ ...(m[6] ? {rule: m[6]} : {}),
112
113
  });
113
114
  }
114
115
  }
@@ -117,14 +118,14 @@ function parseCppcheckOutput(_stdout: string, stderr: string, _exitCode: number)
117
118
 
118
119
  function parseEslintOutput(stdout: string, _stderr: string, _exitCode: number): LintError[] {
119
120
  try {
120
- const files: any[] = JSON.parse(stdout);
121
- const messages: any[] = files?.[0]?.messages ?? [];
121
+ const files = JSON.parse(stdout) as Array<{ messages?: any[] }>;
122
+ const messages = files[0]?.messages ?? [];
122
123
  return messages.map((m) => ({
123
124
  line: m.line ?? 0,
124
125
  column: m.column ?? undefined,
125
126
  severity: m.severity === 2 ? "error" as const : "warning" as const,
126
127
  message: m.message ?? "Unknown issue",
127
- rule: m.ruleId ?? undefined,
128
+ ...(m.ruleId ? {rule: m.ruleId} : {}),
128
129
  }));
129
130
  } catch {
130
131
  return [];
@@ -275,17 +276,16 @@ export function runLinter(
275
276
  const args = config.buildArgs(filePath);
276
277
 
277
278
  try {
278
- // eslint-disable-next-line no-undef -- Bun runtime global
279
- const result = (Bun as any).spawnSync([binary, ...args], {
279
+ const result = spawnSync(binary, args, {
280
280
  cwd: projectRoot,
281
281
  timeout: 8000, // 8s soft limit (10s hook timeout is the hard kill)
282
- stdout: "pipe",
283
- stderr: "pipe",
282
+ stdio: 'pipe',
283
+ encoding: 'utf8',
284
284
  });
285
285
 
286
- const {exitCode} = result;
287
- const stdout = result.stdout?.toString() ?? "";
288
- const stderr = result.stderr?.toString() ?? "";
286
+ const exitCode = result.status ?? 1;
287
+ const stdout = result.stdout ?? "";
288
+ const stderr = result.stderr ?? "";
289
289
 
290
290
  // Exit 0 = clean
291
291
  if (exitCode === 0) return { errors: [] };
@@ -337,3 +337,5 @@ export function formatLintErrors(
337
337
 
338
338
  return lines.join("\n");
339
339
  }
340
+
341
+
@@ -20,7 +20,7 @@
20
20
  */
21
21
 
22
22
  import * as fs from "node:fs";
23
- import * as path from "node:path";
23
+ import path from "node:path";
24
24
 
25
25
  const LEVELS: Record<string, number> = {
26
26
  debug: 0,
@@ -29,7 +29,8 @@ const LEVELS: Record<string, number> = {
29
29
  error: 3,
30
30
  };
31
31
 
32
- const MAX_LOG_LINES = 10_000; // Max lines in global log before pruning
32
+ const MAX_LOG_BYTES = 2_000_000; // 2MB threshold before pruning
33
+ let _prunedThisProcess = false;
33
34
 
34
35
  // Module-level session ID cache
35
36
  let _cachedSessionId: string | null = null;
@@ -89,7 +90,7 @@ export function hookLog(
89
90
  message: string,
90
91
  opts?: {
91
92
  component?: string;
92
- data?: any;
93
+ data?: unknown;
93
94
  traceback_str?: string;
94
95
  stderr?: boolean;
95
96
  },
@@ -121,7 +122,7 @@ export function hookLog(
121
122
  // Build JSONL entry
122
123
  const now = new Date();
123
124
  const ts = now.toISOString().replace("Z", "").slice(0, 23);
124
- const entry: Record<string, any> = {
125
+ const entry: Record<string, unknown> = {
125
126
  ts,
126
127
  level: levelLower,
127
128
  hook: hookName,
@@ -148,42 +149,41 @@ export function hookLog(
148
149
  const dir = path.dirname(logPath);
149
150
  fs.mkdirSync(dir, { recursive: true });
150
151
 
151
- // Line-count guard: prune to last MAX_LOG_LINES
152
- try {
153
- if (fs.existsSync(logPath)) {
154
- const content = fs.readFileSync(logPath, "utf-8");
155
- const lines = content.split(/\r?\n/);
156
- if (lines.length > MAX_LOG_LINES) {
157
- fs.writeFileSync(
158
- logPath,
159
- lines.slice(lines.length - MAX_LOG_LINES).join("\n"),
160
- "utf-8",
161
- );
152
+ // Size-based prune: runs at most once per bun process
153
+ if (!_prunedThisProcess) {
154
+ _prunedThisProcess = true;
155
+ try {
156
+ const stat = fs.statSync(logPath);
157
+ if (stat.size > MAX_LOG_BYTES) {
158
+ const content = fs.readFileSync(logPath, "utf8");
159
+ const pruneTarget = Math.floor(content.length * 0.1);
160
+ const keepFrom = content.indexOf("\n", pruneTarget);
161
+ if (keepFrom > 0) {
162
+ fs.writeFileSync(logPath, content.slice(keepFrom + 1), "utf8");
163
+ }
162
164
  }
163
- }
164
- } catch {
165
- // ignore
165
+ } catch { /* file doesn't exist yet — fine */ }
166
166
  }
167
167
 
168
- fs.appendFileSync(logPath, line, "utf-8");
168
+ fs.appendFileSync(logPath, line, "utf8");
169
169
  } catch {
170
170
  // Never crash
171
171
  }
172
172
  }
173
173
 
174
- export function logDebug(hookName: string, message: string, opts?: Record<string, any>): void {
174
+ export function logDebug(hookName: string, message: string, opts?: Record<string, unknown>): void {
175
175
  hookLog("debug", hookName, message, opts);
176
176
  }
177
177
 
178
- export function logInfo(hookName: string, message: string, opts?: Record<string, any>): void {
178
+ export function logInfo(hookName: string, message: string, opts?: Record<string, unknown>): void {
179
179
  hookLog("info", hookName, message, opts);
180
180
  }
181
181
 
182
- export function logWarn(hookName: string, message: string, opts?: Record<string, any>): void {
182
+ export function logWarn(hookName: string, message: string, opts?: Record<string, unknown>): void {
183
183
  hookLog("warn", hookName, message, opts);
184
184
  }
185
185
 
186
- export function logError(hookName: string, message: string, opts?: Record<string, any>): void {
186
+ export function logError(hookName: string, message: string, opts?: Record<string, unknown>): void {
187
187
  hookLog("error", hookName, message, opts);
188
188
  }
189
189
 
@@ -191,7 +191,7 @@ export function logError(hookName: string, message: string, opts?: Record<string
191
191
  * Log an error that SHOULD be visible to user/model via stderr.
192
192
  * Use for real problems needing attention, not routine diagnostics.
193
193
  */
194
- export function logBlocking(hookName: string, message: string, opts?: Record<string, any>): void {
194
+ export function logBlocking(hookName: string, message: string, opts?: Record<string, unknown>): void {
195
195
  hookLog("error", hookName, message, { ...opts, stderr: true });
196
196
  }
197
197
 
@@ -204,14 +204,14 @@ export function logDiagnostic(
204
204
  phase: string,
205
205
  summary: string,
206
206
  opts?: {
207
- inputs?: any;
208
- decision?: any;
209
- reasoning?: any;
207
+ inputs?: unknown;
208
+ decision?: unknown;
209
+ reasoning?: unknown;
210
210
  component?: string;
211
- data?: any;
211
+ data?: unknown;
212
212
  },
213
213
  ): void {
214
- const diagData: Record<string, any> = { phase };
214
+ const diagData: Record<string, unknown> = { phase };
215
215
  if (opts?.inputs !== undefined) diagData.inputs = opts.inputs;
216
216
  if (opts?.decision !== undefined) diagData.decision = opts.decision;
217
217
  if (opts?.reasoning !== undefined) diagData.reasoning = opts.reasoning;
@@ -245,3 +245,6 @@ export function logHookError(
245
245
  stderr: true,
246
246
  });
247
247
  }
248
+
249
+
250
+
@@ -11,6 +11,13 @@ export const CLAUDE_MODELS = {
11
11
 
12
12
  export const CODEX_MODELS = {
13
13
  spark: "gpt-5.3-codex-spark",
14
- codex: "gpt-5.3-codex",
15
- gpt: "gpt-5.2",
14
+ codex: "gpt-5.4",
15
+ gpt: "gpt-5.4",
16
+ } as const;
17
+
18
+ export const DEVIN_MODELS = {
19
+ swe: "swe",
20
+ gpt: "gpt",
21
+ opus: "opus",
22
+ sonnet: "sonnet",
16
23
  } as const;
@@ -0,0 +1,33 @@
1
+ export type TmuxColorMode = 'c256' | 'truecolor'
2
+
3
+ export function isWindowsPlatform(platform: NodeJS.Platform = process.platform): boolean {
4
+ return platform === 'win32'
5
+ }
6
+
7
+ export function isNonWindowsPlatform(platform: NodeJS.Platform = process.platform): boolean {
8
+ return !isWindowsPlatform(platform)
9
+ }
10
+
11
+ export function commandLookupBinary(platform: NodeJS.Platform = process.platform): 'where.exe' | 'which' {
12
+ return isWindowsPlatform(platform) ? 'where.exe' : 'which'
13
+ }
14
+
15
+ export function shouldUseShell(platform: NodeJS.Platform = process.platform): boolean {
16
+ return isWindowsPlatform(platform)
17
+ }
18
+
19
+ export function resolveTmuxColorModeForPlatform(
20
+ _platform?: NodeJS.Platform,
21
+ ): TmuxColorMode {
22
+ // Always truecolor — Windows now uses psmux (native ConPTY) which supports truecolor natively.
23
+ // The c256 degradation was only needed for tmux-via-MSYS2-bash.
24
+ return 'truecolor'
25
+ }
26
+
27
+ export function applyTmuxLaunchEnv(
28
+ envVars: Record<string, string>,
29
+ _platform?: NodeJS.Platform,
30
+ ): Record<string, string> {
31
+ // Always inject truecolor — psmux on Windows and tmux on Unix both support it.
32
+ return { COLORTERM: 'truecolor', ...envVars }
33
+ }
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Shared preflight health check for provider+model availability.
3
- * Extracted from plan-review/lib/preflight.ts for reuse by any hook.
3
+ * Extracted from plan-review/lib/preflight.ts for reuse by unknown hook.
4
4
  *
5
5
  * Validates that a CLI tool + model combo works by running a minimal "ping" request.
6
6
  */
@@ -89,10 +89,11 @@ export async function checkProviderModel(
89
89
 
90
90
  logDebug(hook, `${provider}:${model} passed (${latencyMs}ms)`);
91
91
  return { provider, model, available: true, latencyMs };
92
- } catch (err) {
92
+ } catch (error_) {
93
93
  const latencyMs = Date.now() - start;
94
- const error = err instanceof Error ? err.message : String(err);
94
+ const error = error_ instanceof Error ? error_.message : String(error_);
95
95
  logWarn(hook, `${provider}:${model} exception: ${error}`);
96
96
  return { provider, model, available: false, latencyMs, error };
97
97
  }
98
98
  }
99
+