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,44 +1,64 @@
1
- import { execSync } from 'node:child_process';
2
- import { basename } from 'node:path';
1
+ import { existsSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import * as os from 'node:os';
3
3
  import { Flags } from '@oclif/core';
4
- import BaseCommand from '../lib/base-command.js';
5
- import { ProcessSpawnError } from '../lib/errors.js';
6
- import { spawnProcess } from '../lib/spawn.js';
7
- import { launchTerminal } from '../lib/terminal.js';
8
- import { checkVersionCompatibility, getClaudeCodeVersion } from '../lib/version.js';
9
- import { EXIT_CODES } from '../types/index.js';
4
+ import { executeLaunch } from '../capabilities/launch/control-plane/execute-launch.js';
5
+ import BaseCommand from '../cli/base-command.js';
10
6
  /**
11
- * Launch Claude Code or Codex with AIW configuration.
7
+ * Launch Claude Code, Codex, or Devin with AIW configuration.
12
8
  *
13
9
  * Spawns Claude Code CLI with --dangerously-skip-permissions flag,
14
- * or Codex CLI with --yolo flag, enabling unattended execution.
15
- * Designed for AIW hook system safety guardrails (requires aiw setup).
16
- * Supports multiple parallel sessions.
10
+ * Codex CLI with --yolo flag, or Devin CLI with --permission-mode dangerous,
11
+ * enabling unattended execution. Supports multiple parallel sessions.
12
+ *
13
+ * ## Multiplexer-first launch (preferred)
14
+ *
15
+ * When a terminal multiplexer is available (psmux on Windows, tmux on Unix),
16
+ * the launch flow is:
17
+ * - **Inside an existing session** → split a new pane in the current session
18
+ * - **Outside any session** → create a new multiplexer session with the REPL
19
+ *
20
+ * This gives persistent sessions, pane splitting, and scrollback.
21
+ * Use `--no-tmux` to bypass the multiplexer and launch inline.
22
+ *
23
+ * ## Inline fallback
24
+ *
25
+ * When no multiplexer is available (or `--no-tmux` is set), the REPL launches
26
+ * directly in the current terminal.
27
+ *
28
+ * ## Install multiplexer
29
+ * - Windows: `winget install psmux` (native ConPTY multiplexer)
30
+ * - Unix: `apt install tmux` / `brew install tmux`
17
31
  */
18
32
  export default class LaunchCommand extends BaseCommand {
19
- static description = 'Launch Claude Code or Codex with AIW configuration (sandbox disabled, tmux-first by default)\n\n' +
33
+ static description = 'Launch Claude Code, Codex, or Devin with AIW configuration (sandbox disabled, tmux-first; Windows opens mintty window first with inline fallback)\n\n' +
20
34
  'FLAGS\n' +
21
35
  ' --codex/-c: Launch Codex instead of Claude Code (uses --yolo flag)\n' +
36
+ ' --devin/-e: Launch Devin CLI instead of Claude Code (uses --permission-mode dangerous)\n' +
22
37
  ' --new/-n: Open a new terminal in the current directory and launch there\n' +
23
38
  ' --no-tmux/-t: Launch directly in current shell instead of auto-launching tmux\n' +
24
- ' --tmux-session/-s: tmux session name to reuse when auto-launching tmux (default is fresh session per launch)\n\n' +
39
+ ' --tmux-session/-s: tmux session name to reuse when auto-launching tmux\n' +
40
+ ' --prompt/-p: Initial prompt to pass to the AI REPL at startup\n' +
41
+ ' --wait: Block until launched pane exits (for scripted callers)\n' +
42
+ ' --json: JSON output (paneId, backend, exitCode, sentinel)\n' +
43
+ ' --split: Split direction when in tmux (auto|h|v, default: auto)\n' +
44
+ ' --env: Extra env vars as JSON string\n' +
45
+ ' --prompt-path: Path to prompt file for REPL-mode tools\n\n' +
25
46
  'EXIT CODES\n' +
26
47
  ' 0 Success - AI assistant launched and exited successfully\n' +
27
48
  ' 1 General error - unexpected runtime failure\n' +
28
49
  ' 2 Invalid usage - check your arguments and flags\n' +
29
- ' 3 Environment error - CLI not found (install Claude Code from https://claude.ai/download, Codex from npm)';
50
+ ' 3 Environment error - CLI not found (install Claude Code from https://claude.ai/download, Codex from npm, Devin from https://cli.devin.ai)';
30
51
  static examples = [
31
52
  '<%= config.bin %> <%= command.id %> # Auto-launches tmux with a fresh session when not already in tmux',
32
53
  '<%= config.bin %> <%= command.id %> --codex # Launch Codex with --yolo flag',
33
- '<%= config.bin %> <%= command.id %> -c # Short form for --codex',
54
+ '<%= config.bin %> <%= command.id %> --devin # Launch Devin CLI with --permission-mode dangerous',
34
55
  '<%= config.bin %> <%= command.id %> --new # Launch in a new terminal window',
35
- '<%= config.bin %> <%= command.id %> -n # Short form for --new',
36
- '<%= config.bin %> <%= command.id %> --codex --new # Launch Codex in new terminal',
37
56
  '<%= config.bin %> <%= command.id %> --no-tmux # Run directly in current shell',
38
57
  '<%= config.bin %> <%= command.id %> --tmux-session aiw-main # Reuse/attach explicit tmux session name',
58
+ '<%= config.bin %> <%= command.id %> --prompt "Fix the login bug" # Launch with initial prompt',
59
+ '<%= config.bin %> <%= command.id %> --wait --json # Block until pane exits, output JSON result',
60
+ '<%= config.bin %> <%= command.id %> --split h # Force horizontal split in tmux',
39
61
  '<%= config.bin %> <%= command.id %> --debug # Enable verbose logging',
40
- '# Check exit code in Bash\n<%= config.bin %> <%= command.id %>\necho $?',
41
- '# Check exit code in PowerShell\n<%= config.bin %> <%= command.id %>\necho $LASTEXITCODE',
42
62
  ];
43
63
  static flags = {
44
64
  ...BaseCommand.baseFlags,
@@ -46,6 +66,21 @@ export default class LaunchCommand extends BaseCommand {
46
66
  char: 'c',
47
67
  description: 'Launch Codex instead of Claude Code (uses --yolo flag for full auto mode)',
48
68
  default: false,
69
+ exclusive: ['devin'],
70
+ }),
71
+ devin: Flags.boolean({
72
+ char: 'e',
73
+ description: 'Launch Devin CLI instead of Claude Code (uses --permission-mode dangerous)',
74
+ default: false,
75
+ exclusive: ['codex'],
76
+ }),
77
+ env: Flags.string({
78
+ description: 'Extra env vars as JSON object string (e.g. \'{"FOO":"bar"}\')',
79
+ required: false,
80
+ }),
81
+ json: Flags.boolean({
82
+ description: 'JSON output (paneId, backend, exitCode, sentinel)',
83
+ default: false,
49
84
  }),
50
85
  new: Flags.boolean({
51
86
  char: 'n',
@@ -57,159 +92,65 @@ export default class LaunchCommand extends BaseCommand {
57
92
  description: 'Launch directly in current shell instead of auto-launching tmux',
58
93
  default: false,
59
94
  }),
95
+ prompt: Flags.string({
96
+ char: 'p',
97
+ description: 'Initial prompt to pass to the AI REPL at startup',
98
+ required: false,
99
+ }),
100
+ 'prompt-file': Flags.string({
101
+ description: 'Path to file containing initial prompt (internal)',
102
+ required: false,
103
+ hidden: true,
104
+ }),
105
+ 'spawned-window': Flags.boolean({
106
+ description: 'Internal: marks launch as re-entered in a spawned terminal window',
107
+ required: false,
108
+ hidden: true,
109
+ default: false,
110
+ }),
111
+ 'prompt-path': Flags.string({
112
+ description: 'Path to prompt file for REPL-mode tools',
113
+ required: false,
114
+ }),
115
+ split: Flags.string({
116
+ description: 'Split direction when in multiplexer (auto|horizontal|vertical, default: auto)',
117
+ options: ['auto', 'horizontal', 'vertical'],
118
+ required: false,
119
+ }),
60
120
  'tmux-session': Flags.string({
61
121
  char: 's',
62
122
  description: 'tmux session name to reuse when auto-launching tmux (default: new aiw-<current-dir>-<unique> session)',
63
123
  required: false,
64
124
  }),
125
+ wait: Flags.boolean({
126
+ description: 'Block until launched pane exits; output result',
127
+ default: false,
128
+ }),
65
129
  };
66
130
  async run() {
67
131
  const { flags } = await this.parse(LaunchCommand);
68
- // Determine which CLI to launch
69
- const useCodex = flags.codex;
70
- const cliCommand = useCodex ? 'codex' : 'claude';
71
- const cliArgs = useCodex ? ['--yolo'] : ['--dangerously-skip-permissions'];
72
- const launchFlag = useCodex ? '--codex' : '';
73
- const disableTmux = flags['no-tmux'];
74
- const insideTmux = Boolean(process.env.TMUX);
75
- const interactiveTty = Boolean(process.stdin.isTTY && process.stdout.isTTY);
76
- const shouldAutoTmux = !flags.new && !disableTmux && !insideTmux && interactiveTty;
77
- // Handle --new flag: launch in a new terminal
78
- if (flags.new) {
79
- const cwd = process.cwd();
80
- this.debug(`Launching new terminal in: ${cwd}`);
81
- const launchCmd = useCodex ? 'aiw launch --codex' : 'aiw launch';
82
- const result = await launchTerminal({
83
- cwd,
84
- command: launchCmd,
85
- debugLog: (msg) => this.debug(msg),
86
- });
87
- if (!result.success) {
88
- this.error(`Failed to launch new terminal: ${result.error}`, { exit: EXIT_CODES.GENERAL_ERROR });
89
- }
90
- this.log(`New terminal launched with aiw launch${launchFlag ? ` ${launchFlag}` : ''}`);
91
- return;
92
- }
93
- // Normal launch flow
94
- let exitCode;
95
- try {
96
- // Version check only applies to Claude Code (not Codex)
97
- if (useCodex) {
98
- this.debug('Launching Codex with --yolo flag');
99
- }
100
- else {
101
- // Check Claude Code version compatibility (non-blocking)
102
- const version = await getClaudeCodeVersion();
103
- const versionCheck = checkVersionCompatibility(version);
104
- // Debug logging: show version information
105
- this.debug(`Claude Code version: ${versionCheck.version ?? 'unknown'}`);
106
- this.debug(`Compatibility status: ${versionCheck.compatible ? 'compatible' : 'incompatible'}`);
107
- // Non-blocking warning for incompatibility or unknown version
108
- if (versionCheck.warning) {
109
- this.warn(versionCheck.warning);
110
- }
111
- }
112
- // Spawn AI CLI with sandbox permissions disabled
113
- // AIW hook system provides safety guardrails
114
- // Continue launch regardless of version check result (graceful degradation)
115
- if (shouldAutoTmux && this.isTmuxAvailable()) {
116
- const shellCommand = this.buildTmuxShellCommand(cliCommand, cliArgs);
117
- const sessionFromFlag = flags['tmux-session']?.trim();
118
- if (sessionFromFlag && sessionFromFlag.length > 0) {
119
- const sessionName = this.sanitizeTmuxSessionName(sessionFromFlag);
120
- this.logInfo(`Launching in tmux session: ${sessionName} (reuse/attach)`);
121
- exitCode = await spawnProcess('tmux', ['new-session', '-A', '-s', sessionName, shellCommand]);
122
- }
123
- else {
124
- const sessionBase = `aiw-${basename(process.cwd())}`;
125
- const sessionName = this.buildUniqueTmuxSessionName(sessionBase);
126
- this.logInfo(`Launching in new tmux session: ${sessionName}`);
127
- exitCode = await spawnProcess('tmux', ['new-session', '-s', sessionName, shellCommand]);
128
- }
129
- }
130
- else if (shouldAutoTmux && this.isWindowsTerminalAvailable()) {
131
- this.logInfo('tmux unavailable; launching in Windows Terminal split pane');
132
- exitCode = await spawnProcess('wt', ['split-pane', '--', cliCommand, ...cliArgs]);
133
- }
134
- else {
135
- if (shouldAutoTmux) {
136
- this.logInfo('No pane launcher available. Launching directly.');
137
- }
138
- else if (disableTmux) {
139
- this.debug('tmux launch disabled via --no-tmux');
140
- }
141
- else if (insideTmux) {
142
- this.debug('Already inside tmux; launching directly in current pane');
143
- this.enableTmuxMouseIfPossible();
144
- }
145
- else if (!interactiveTty) {
146
- this.debug('Non-interactive terminal detected; launching directly');
147
- }
148
- exitCode = await spawnProcess(cliCommand, cliArgs);
149
- }
150
- }
151
- catch (error) {
152
- if (error instanceof ProcessSpawnError) {
153
- // Actionable error message (already includes installation link)
154
- this.error(error.message, { exit: EXIT_CODES.ENVIRONMENT_ERROR });
155
- }
156
- // Unexpected error
157
- this.error('Unexpected launch failure.', { exit: EXIT_CODES.GENERAL_ERROR });
158
- }
159
- // Pass through Claude Code's exit code (outside try-catch to avoid catching exit)
160
- this.exit(exitCode);
161
- }
162
- buildTmuxShellCommand(command, args) {
163
- const launchCommand = [command, ...args].map((part) => this.shellQuote(part)).join(' ');
164
- return `tmux set-option -g mouse on >/dev/null 2>&1 || true; exec ${launchCommand}`;
165
- }
166
- isTmuxAvailable() {
167
- try {
168
- const cmd = process.platform === 'win32' ? 'where tmux' : 'which tmux';
169
- execSync(cmd, { stdio: 'ignore' });
170
- return true;
171
- }
172
- catch {
173
- return false;
174
- }
175
- }
176
- isWindowsTerminalAvailable() {
177
- if (process.platform !== 'win32')
178
- return false;
179
- try {
180
- execSync('where wt', { stdio: 'ignore' });
181
- return true;
182
- }
183
- catch {
184
- return false;
185
- }
186
- }
187
- sanitizeTmuxSessionName(input) {
188
- const trimmed = input.trim().toLowerCase();
189
- const safe = trimmed
190
- .replaceAll(/[^a-z0-9_-]/g, '-')
191
- .replaceAll(/-+/g, '-')
192
- .replaceAll(/^[-_]+|[-_]+$/g, '');
193
- return safe || 'aiw';
194
- }
195
- buildUniqueTmuxSessionName(base) {
196
- const safeBase = this.sanitizeTmuxSessionName(base);
197
- const timestamp = Date.now().toString(36);
198
- const pid = process.pid.toString(36);
199
- return this.sanitizeTmuxSessionName(`${safeBase}-${timestamp}-${pid}`);
200
- }
201
- enableTmuxMouseIfPossible() {
202
- if (!this.isTmuxAvailable())
203
- return;
204
- try {
205
- execSync('tmux set-option -g mouse on', { stdio: 'ignore' });
206
- this.debug('Enabled tmux mouse support (set-option -g mouse on)');
207
- }
208
- catch {
209
- this.debug('Could not enable tmux mouse support automatically');
210
- }
211
- }
212
- shellQuote(input) {
213
- return `'${input.replaceAll("'", `'"'"'`)}'`;
132
+ await executeLaunch({
133
+ cwd: process.cwd(),
134
+ flags: flags,
135
+ interactiveTty: Boolean(process.stdin.isTTY && process.stdout.isTTY),
136
+ platform: process.platform,
137
+ readPromptFile: (filePath) => (existsSync(filePath) ? readFileSync(filePath, 'utf8') : undefined),
138
+ }, {
139
+ host: {
140
+ debug: (message, ...args) => this.debug([message, ...args.map(String)].join(' ')),
141
+ error: (input, options) => this.error(input, options),
142
+ exit: (code) => this.exit(code),
143
+ log: (message) => this.log(message),
144
+ logInfo: (message) => this.logInfo(message),
145
+ logWarning: (message) => this.logWarning(message),
146
+ warn: (input) => this.warn(input),
147
+ },
148
+ now: () => Date.now(),
149
+ pid: process.pid,
150
+ tempDir: os.tmpdir(),
151
+ writePromptFile(filePath, content) {
152
+ writeFileSync(filePath, content, { encoding: 'utf8', mode: 0o600 });
153
+ },
154
+ });
214
155
  }
215
156
  }
@@ -8,6 +8,8 @@
8
8
  export interface HookCommand {
9
9
  /** If true, runs in background without blocking */
10
10
  async?: boolean;
11
+ /** If false, hook failure will not block tool execution */
12
+ blockOnFail?: boolean;
11
13
  /** Command to execute */
12
14
  command: string;
13
15
  /** Optional timeout in seconds */
@@ -15,14 +17,31 @@ export interface HookCommand {
15
17
  /** Type of hook action */
16
18
  type: 'command';
17
19
  }
20
+ /**
21
+ * Hook prompt configuration
22
+ */
23
+ export interface HookPrompt {
24
+ /** If true, runs in background without blocking */
25
+ async?: boolean;
26
+ /** Prompt text shown to the model */
27
+ prompt: string;
28
+ /** Optional timeout in seconds */
29
+ timeout?: number;
30
+ /** Type of hook action */
31
+ type: 'prompt';
32
+ }
33
+ /**
34
+ * Hook action configuration
35
+ */
36
+ export type HookAction = HookCommand | HookPrompt;
18
37
  /**
19
38
  * Hook matcher configuration
20
39
  */
21
40
  export interface HookMatcher {
22
41
  /** Array of hook commands to execute */
23
- hooks: HookCommand[];
42
+ hooks: HookAction[];
24
43
  /** Tool name pattern to match (regex supported) */
25
- matcher: string;
44
+ matcher?: string;
26
45
  /** Execute only once per session */
27
46
  once?: boolean;
28
47
  }
@@ -52,20 +71,6 @@ export type EnabledPlugins = Record<string, boolean>;
52
71
  * Environment variables configuration
53
72
  */
54
73
  export type EnvConfig = Record<string, string>;
55
- /**
56
- * Method installation tracking metadata
57
- */
58
- interface MethodTracking {
59
- /** IDEs configured for this method */
60
- ides?: string[];
61
- /** ISO timestamp when method was installed */
62
- installedAt: string;
63
- }
64
- /**
65
- * Methods tracking object
66
- * Maps method names to their installation metadata
67
- */
68
- export type MethodsConfig = Record<string, MethodTracking>;
69
74
  /**
70
75
  * Complete Claude Code settings.json structure
71
76
  */
@@ -76,16 +81,24 @@ export interface ClaudeSettings {
76
81
  enabledPlugins?: EnabledPlugins;
77
82
  /** Environment variables */
78
83
  env?: EnvConfig;
84
+ /** File suggestion command configuration */
85
+ fileSuggestion?: {
86
+ command: string;
87
+ type: 'command';
88
+ };
79
89
  /** Hook configurations */
80
90
  hooks?: HooksConfig;
81
- /** Installed methods tracking */
82
- methods?: MethodsConfig;
83
91
  /** Default model to use */
84
92
  model?: string;
85
93
  /** Tool permissions */
86
94
  permissions?: Permissions;
87
95
  /** Spinner tips enabled */
88
96
  spinnerTipsEnabled?: boolean;
97
+ /** Status line command configuration */
98
+ statusLine?: {
99
+ command: string;
100
+ type: 'command';
101
+ };
89
102
  }
90
103
  /**
91
104
  * Settings file types in hierarchy
@@ -102,4 +115,3 @@ export interface SettingsLocation {
102
115
  /** Type of settings file */
103
116
  type: SettingsFileType;
104
117
  }
105
- export {};
@@ -2,7 +2,6 @@ import { existsSync } from 'node:fs';
2
2
  import { homedir } from 'node:os';
3
3
  import { join } from 'node:path';
4
4
  import { debug } from './debug.js';
5
- import { getAiwDir as getAiwDirFromEnv } from './env-compat.js';
6
5
  import { ConfigNotFoundError } from './errors.js';
7
6
  /**
8
7
  * Resolve AI Workflow CLI home directory.
@@ -10,7 +9,7 @@ import { ConfigNotFoundError } from './errors.js';
10
9
  */
11
10
  export function getAiwDir() {
12
11
  // Try env var first, then default
13
- const envHome = getAiwDirFromEnv();
12
+ const envHome = process.env['AIW_DIR'];
14
13
  if (envHome) {
15
14
  return envHome;
16
15
  }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Formatting module for context display output.
3
+ * See SPEC.md §11
4
+ *
5
+ * All functions accept a ContextState with fields:
6
+ * id, summary, mode, last_active, plan_path, handoff_path,
7
+ * tasks[], last_session, session_ids, status, method, tags
8
+ */
9
+ import type { ContextState } from "../types.js";
10
+ /**
11
+ * Get bracketed display string for mode, or empty for idle.
12
+ * See SPEC.md §11.2
13
+ */
14
+ export declare function getModeDisplay(mode: string): string;
15
+ /**
16
+ * Format ISO timestamp as '2 hours ago', 'yesterday', etc.
17
+ * See SPEC.md §11.3
18
+ */
19
+ export declare function formatRelativeTime(isoTimestamp: string | null): string;
20
+ /**
21
+ * Build restore sections from last_session, tasks, and plan_path.
22
+ * See SPEC.md §11.4
23
+ */
24
+ export declare function buildRestoreSections(ctx: ContextState, projectRoot?: string, inlinePlan?: boolean): string;
25
+ /**
26
+ * Format output when resuming a context with a pending handoff.
27
+ * See SPEC.md §11.5
28
+ */
29
+ export declare function formatHandoffContinuation(ctx: ContextState, projectRoot?: string): string;
30
+ /**
31
+ * Build lightweight orientation for external agents (Codex, etc.).
32
+ * Tells the agent where the context folder and key paths are — no session state.
33
+ */
34
+ export declare function buildExternalAgentContext(ctx: ContextState, projectRoot: string): string;
35
+ /**
36
+ * Format output for pending plan implementation (mode=has_plan).
37
+ * See SPEC.md §11.6
38
+ */
39
+ export declare function formatPlanContinuation(ctx: ContextState, projectRoot?: string): string;
40
+ /**
41
+ * Format output for ongoing implementation (mode=active).
42
+ * See SPEC.md §11.7
43
+ */
44
+ export declare function formatActiveContinuation(ctx: ContextState, projectRoot?: string): string;
45
+ /**
46
+ * Format list of contexts for display.
47
+ * See SPEC.md §11.8
48
+ */
49
+ export declare function formatContextList(contexts: ContextState[]): string;
50
+ /**
51
+ * Format notification for a newly created context.
52
+ * See SPEC.md §11.9
53
+ */
54
+ export declare function formatContextCreated(ctx: ContextState): string;
55
+ /**
56
+ * Format system reminder: lightweight (per-prompt) or rich (first-bind restore).
57
+ * See SPEC.md §11.10
58
+ */
59
+ export declare function formatActiveContextReminder(ctx: ContextState, projectRoot?: string, includeRestore?: boolean): string;
60
+ /**
61
+ * Format the boxed picker shown on stderr when blocking for selection.
62
+ * See SPEC.md §11.11
63
+ */
64
+ export declare function formatContextPickerStderr(contexts: ContextState[]): string;
65
+ /**
66
+ * Format feedback about caret command operations performed.
67
+ * See SPEC.md §11.12
68
+ */
69
+ export declare function formatCommandFeedback(endedContexts: ContextState[], selectedContext: ContextState | null): string;
70
+ /**
71
+ * Build a markdown inventory of resources available in the context folder.
72
+ * Returns null if the context folder doesn't exist yet (brand new context).
73
+ */
74
+ export declare function buildContextInventory(state: ContextState, projectRoot: string): string | null;