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
@@ -6,9 +6,9 @@
6
6
  *
7
7
  * ## Supported Platforms
8
8
  * - **Windows**: Windows Terminal (wt.exe) with PowerShell 7 (pwsh) fallback to PowerShell 5.1
9
- * - **macOS**: Terminal.app via AppleScript
9
+ * - **macOS**: Terminal.app via `open` + temporary `.command` script
10
10
  * - **WSL**: Windows Terminal (wt.exe) via wsl.exe, falls back to Linux emulators
11
- * - **Linux**: gnome-terminal, konsole, xterm, x-terminal-emulator (in order of preference)
11
+ * - **Linux**: x-terminal-emulator, gnome-terminal, konsole, xterm (in order of preference)
12
12
  *
13
13
  * ## Usage
14
14
  * ```typescript
@@ -27,38 +27,77 @@
27
27
  *
28
28
  * @module lib/terminal
29
29
  */
30
- import { execSync, spawn } from 'node:child_process';
31
- /**
32
- * Return a copy of process.env with Claude Code nesting-detection vars removed.
33
- *
34
- * Claude Code sets CLAUDECODE and CLAUDE_CODE_ENTRYPOINT when running. Child
35
- * processes that inherit these vars are blocked from launching their own Claude
36
- * Code instance ("cannot launch claude within claude").
37
- *
38
- * Source of truth: packages/cli/src/templates/_shared/lib-ts/base/subprocess-utils.ts
39
- * getInternalSubprocessEnv() if Claude Code adds more nesting-detection vars
40
- * in a future release, add them here too.
41
- */
42
- function cleanTerminalEnv() {
43
- const env = { ...process.env };
44
- delete env['CLAUDECODE'];
45
- delete env['CLAUDE_CODE_ENTRYPOINT'];
46
- return env;
30
+ import { spawn } from 'node:child_process';
31
+ import { existsSync, writeFileSync } from 'node:fs';
32
+ import { tmpdir } from 'node:os';
33
+ import path from 'node:path';
34
+ import { sanitizedProcessEnv as cleanClaudeEnv } from './env-sanitizer.js';
35
+ import { isCommandAvailable } from './runtime/executable-policy.js';
36
+ import { isWindowsPlatform } from './runtime/platform-adapter.js';
37
+ import { findMsysBash } from './runtime/tmux-preflight.js';
38
+ import { escapeSingleQuotedPath } from './shell-quoting.js';
39
+ import { defaultShell, detectPowerShell, findAvailableLinuxTerminal, isWSL, resolveWindowsTerminalStrategy, } from './terminal-strategy.js';
40
+ /** @internal */
41
+ export function resolveTerminalPlatform(platform, isWSLResult) {
42
+ if (isWindowsPlatform(platform))
43
+ return 'windows';
44
+ if (platform === 'darwin')
45
+ return 'darwin';
46
+ if (isWSLResult)
47
+ return 'wsl';
48
+ return 'linux';
47
49
  }
48
- /**
49
- * Detect which PowerShell is available on Windows.
50
- * Prefers PowerShell 7 (pwsh) over legacy PowerShell.
51
- *
52
- * @returns 'pwsh' if PowerShell 7 is available, 'powershell' otherwise
53
- */
54
- function detectPowerShell() {
55
- try {
56
- execSync('where pwsh', { stdio: 'ignore' });
57
- return 'pwsh';
58
- }
59
- catch {
60
- return 'powershell';
61
- }
50
+ /** @internal */
51
+ export function buildMacTerminalScriptContent(cwd, command, shellPath = defaultShell()) {
52
+ const escapedPath = escapeSingleQuotedPath(cwd, 'bash');
53
+ const escapedShell = escapeSingleQuotedPath(shellPath, 'bash');
54
+ const fullCommand = `cd '${escapedPath}' && ${command}; exec '${escapedShell}' -l`;
55
+ const escapedCommand = escapeSingleQuotedPath(fullCommand, 'bash');
56
+ return `#!/bin/sh
57
+ exec '${escapedShell}' -lc '${escapedCommand}'
58
+ `;
59
+ }
60
+ /** @internal */
61
+ export function buildMacTerminalSpawnArgs(scriptPath) {
62
+ return {
63
+ command: 'open',
64
+ args: ['-a', 'Terminal', scriptPath],
65
+ };
66
+ }
67
+ /** @internal */
68
+ export function buildWindowsTerminalSpawnArgs(cwd, command, powershellCmd) {
69
+ return {
70
+ command: 'wt',
71
+ args: ['-d', cwd, powershellCmd, '-NoExit', '-Command', command],
72
+ };
73
+ }
74
+ /** @internal */
75
+ export function buildPowerShellFallbackSpawnArgs(cwd, command, powershellCmd) {
76
+ const escapedPath = escapeSingleQuotedPath(cwd, 'powershell');
77
+ const psCommand = `Start-Process ${powershellCmd} -ArgumentList '-NoExit','-Command',"cd '${escapedPath}'; ${command}"`;
78
+ return {
79
+ command: powershellCmd,
80
+ args: ['-Command', psCommand],
81
+ };
82
+ }
83
+ /** @internal */
84
+ export function buildLinuxTerminalSpawnArgs(cwd, command, terminalInfo) {
85
+ const escapedPath = escapeSingleQuotedPath(cwd, 'bash');
86
+ const fullCommand = `cd '${escapedPath}' && ${command}`;
87
+ return {
88
+ command: terminalInfo.cmd,
89
+ args: terminalInfo.getArgs(fullCommand),
90
+ };
91
+ }
92
+ /** @internal */
93
+ export function buildWSLTerminalSpawnArgs(cwd, command) {
94
+ const escapedPath = escapeSingleQuotedPath(cwd, 'bash');
95
+ const shell = defaultShell();
96
+ const shellCmd = `cd '${escapedPath}' && ${command}; exec ${shell}`;
97
+ return {
98
+ command: 'wt.exe',
99
+ args: ['wsl.exe', '--', shell, '-c', shellCmd],
100
+ };
62
101
  }
63
102
  /**
64
103
  * Launch PowerShell fallback when Windows Terminal is not available.
@@ -70,13 +109,12 @@ function detectPowerShell() {
70
109
  */
71
110
  async function launchPowerShellFallback(cwd, command, powershellCmd, debugLog) {
72
111
  return new Promise((resolve) => {
73
- const escapedPath = cwd.replaceAll("'", "''");
74
- const psCommand = `Start-Process ${powershellCmd} -ArgumentList '-NoExit','-Command',"cd '${escapedPath}'; ${command}"`;
75
- debugLog?.(`Launching PowerShell fallback with command: ${psCommand}`);
76
- const terminal = spawn(powershellCmd, ['-Command', psCommand], {
112
+ const spawnArgs = buildPowerShellFallbackSpawnArgs(cwd, command, powershellCmd);
113
+ debugLog?.(`Launching PowerShell fallback with command: ${spawnArgs.args[1]}`);
114
+ const terminal = spawn(spawnArgs.command, spawnArgs.args, {
77
115
  detached: true,
78
116
  stdio: 'ignore',
79
- env: cleanTerminalEnv(),
117
+ env: cleanClaudeEnv(),
80
118
  });
81
119
  terminal.on('error', (err) => {
82
120
  resolve({ success: false, error: `Failed to launch PowerShell: ${err.message}` });
@@ -90,52 +128,121 @@ async function launchPowerShellFallback(cwd, command, powershellCmd, debugLog) {
90
128
  *
91
129
  * @param cwd - Working directory
92
130
  * @param command - Command to execute
131
+ * @param shellPreference - Preferred shell for Windows launches
93
132
  * @param debugLog - Optional debug logging function
94
133
  */
95
- async function launchWindowsTerminal(cwd, command, debugLog) {
96
- const powershellCmd = detectPowerShell();
97
- debugLog?.(`Detected PowerShell: ${powershellCmd}`);
98
- return new Promise((resolve) => {
99
- const terminal = spawn('wt', ['-d', cwd, powershellCmd, '-NoExit', '-Command', command], {
100
- detached: true,
101
- stdio: 'ignore',
102
- env: cleanTerminalEnv(),
103
- });
104
- terminal.on('error', (err) => {
105
- // If wt.exe not found, try fallback to Start-Process
106
- if (err.message.includes('ENOENT')) {
107
- debugLog?.('Windows Terminal not found, using PowerShell fallback');
108
- launchPowerShellFallback(cwd, command, powershellCmd, debugLog)
109
- .then(resolve)
110
- .catch(() => resolve({ success: false, error: 'Failed to launch PowerShell fallback' }));
134
+ async function launchWindowsTerminal(cwd, command, shellPreference, debugLog) {
135
+ const powershellCmd = detectPowerShell(isCommandAvailable);
136
+ debugLog?.(`Detected PowerShell: ${powershellCmd}; shell preference: ${shellPreference}`);
137
+ const gitBashPath = findMsysBash();
138
+ const minttyPath = gitBashPath
139
+ ? path.join(path.dirname(gitBashPath), 'mintty.exe')
140
+ : null;
141
+ const hasMintty = Boolean(minttyPath && existsSync(minttyPath));
142
+ const strategyOrder = resolveWindowsTerminalStrategy(shellPreference, gitBashPath, hasMintty, powershellCmd);
143
+ const tryStrategy = async (strategy) => {
144
+ if (strategy === 'powershell-fallback') {
145
+ debugLog?.('Using PowerShell fallback launcher');
146
+ return launchPowerShellFallback(cwd, command, powershellCmd, debugLog);
147
+ }
148
+ if (strategy === 'mintty') {
149
+ if (!minttyPath || !gitBashPath) {
150
+ return { success: false, error: 'mintty or Git Bash not found' };
111
151
  }
112
- else {
113
- resolve({ success: false, error: `Failed to launch terminal: ${err.message}` });
152
+ const escapedPath = escapeSingleQuotedPath(cwd, 'bash');
153
+ const bashCmd = `cd '${escapedPath}' && ${command}; exec bash`;
154
+ debugLog?.(`Using mintty for Windows terminal: ${minttyPath}`);
155
+ return new Promise((resolve) => {
156
+ const terminal = spawn(minttyPath, [gitBashPath, '-lc', bashCmd], {
157
+ detached: true,
158
+ stdio: 'ignore',
159
+ env: cleanClaudeEnv(),
160
+ windowsHide: true,
161
+ });
162
+ terminal.on('error', (err) => {
163
+ resolve({ success: false, error: `mintty launch failed: ${err.message}` });
164
+ });
165
+ terminal.unref();
166
+ resolve({ success: true });
167
+ });
168
+ }
169
+ if (strategy === 'git-bash-in-wt') {
170
+ if (!gitBashPath) {
171
+ return { success: false, error: 'Git Bash not found' };
114
172
  }
173
+ const escapedPath = escapeSingleQuotedPath(cwd, 'bash');
174
+ const bashCmd = `cd '${escapedPath}' && ${command}; exec bash`;
175
+ debugLog?.(`Using Git Bash for Windows terminal: ${gitBashPath}`);
176
+ return new Promise((resolve) => {
177
+ const terminal = spawn('wt', ['-d', cwd, gitBashPath, '-lc', bashCmd], {
178
+ detached: true,
179
+ stdio: 'ignore',
180
+ env: cleanClaudeEnv(),
181
+ });
182
+ terminal.on('error', (err) => {
183
+ resolve({ success: false, error: `Git Bash launch via wt failed: ${err.message}` });
184
+ });
185
+ terminal.unref();
186
+ resolve({ success: true });
187
+ });
188
+ }
189
+ debugLog?.('Using Windows Terminal with PowerShell');
190
+ return new Promise((resolve) => {
191
+ const spawnArgs = buildWindowsTerminalSpawnArgs(cwd, command, powershellCmd);
192
+ const terminal = spawn(spawnArgs.command, spawnArgs.args, {
193
+ detached: true,
194
+ stdio: 'ignore',
195
+ env: cleanClaudeEnv(),
196
+ });
197
+ terminal.on('error', (err) => {
198
+ resolve({ success: false, error: `Failed to launch terminal: ${err.message}` });
199
+ });
200
+ terminal.unref();
201
+ resolve({ success: true });
115
202
  });
116
- terminal.unref();
117
- resolve({ success: true });
118
- });
203
+ };
204
+ const tryStrategies = async (index = 0) => {
205
+ const strategy = strategyOrder[index];
206
+ if (!strategy) {
207
+ return { success: false, error: 'Failed to launch Windows terminal with all available strategies' };
208
+ }
209
+ const result = await tryStrategy(strategy);
210
+ if (result.success)
211
+ return result;
212
+ debugLog?.(`Strategy ${strategy} failed: ${result.error}`);
213
+ return tryStrategies(index + 1);
214
+ };
215
+ return tryStrategies();
119
216
  }
120
217
  /**
121
- * Launch macOS Terminal.app with command.
218
+ * Launch macOS Terminal.app with a temporary `.command` script.
219
+ *
220
+ * Avoids AppleScript/Automation prompts by delegating to `open(1)` instead of
221
+ * sending Apple Events to Terminal.app.
122
222
  *
123
223
  * @param cwd - Working directory
124
224
  * @param command - Command to execute
125
225
  * @param debugLog - Optional debug logging function
126
226
  */
127
227
  async function launchMacTerminal(cwd, command, debugLog) {
228
+ const scriptPath = path.join(tmpdir(), `aiwcli-terminal-${process.pid}-${Date.now()}-${Math.random().toString(36).slice(2, 8)}.command`);
229
+ try {
230
+ writeFileSync(scriptPath, buildMacTerminalScriptContent(cwd, command), {
231
+ encoding: 'utf8',
232
+ mode: 0o700,
233
+ });
234
+ }
235
+ catch (error) {
236
+ const message = error instanceof Error ? error.message : String(error);
237
+ return { success: false, error: `Failed to prepare Terminal launch script: ${message}` };
238
+ }
128
239
  return new Promise((resolve) => {
129
- // Escape single quotes for bash context
130
- const escapedPath = cwd.replaceAll("'", String.raw `'\''`);
131
- const fullCommand = `cd '${escapedPath}' && ${command}`;
132
- // Escape double quotes and backslashes for AppleScript context
133
- const escapedCommand = fullCommand.replaceAll('\\', '\\\\').replaceAll('"', String.raw `\"`);
134
- debugLog?.(`Launching macOS Terminal with command: ${fullCommand}`);
135
- const terminal = spawn('osascript', ['-e', `tell application "Terminal" to do script "${escapedCommand}"`], {
240
+ const spawnArgs = buildMacTerminalSpawnArgs(scriptPath);
241
+ debugLog?.(`Launching macOS Terminal with script: ${scriptPath}`);
242
+ const terminal = spawn(spawnArgs.command, spawnArgs.args, {
136
243
  detached: true,
137
244
  stdio: 'ignore',
138
- env: cleanTerminalEnv(),
245
+ env: cleanClaudeEnv(),
139
246
  });
140
247
  terminal.on('error', (err) => {
141
248
  resolve({ success: false, error: `Failed to launch Terminal.app: ${err.message}` });
@@ -145,55 +252,23 @@ async function launchMacTerminal(cwd, command, debugLog) {
145
252
  });
146
253
  }
147
254
  /**
148
- * Linux terminal emulator configurations.
149
- */
150
- const LINUX_TERMINALS = [
151
- { cmd: 'gnome-terminal', getArgs: (command) => ['--', 'bash', '-c', `${command}; exec bash`] },
152
- { cmd: 'konsole', getArgs: (command) => ['-e', `bash -c "${command}; exec bash"`] },
153
- { cmd: 'xterm', getArgs: (command) => ['-e', `bash -c "${command}; exec bash"`] },
154
- { cmd: 'x-terminal-emulator', getArgs: (command) => ['-e', `bash -c "${command}; exec bash"`] },
155
- ];
156
- /**
157
- * Find the first available Linux terminal emulator.
158
- * Checks gnome-terminal, konsole, xterm, x-terminal-emulator in order.
255
+ * Launch Windows Terminal (wt.exe) from WSL, running the command inside a new shell session.
159
256
  *
160
- * @returns Terminal configuration if found, null otherwise
161
- */
162
- function findAvailableLinuxTerminal() {
163
- for (const terminal of LINUX_TERMINALS) {
164
- try {
165
- execSync(`which ${terminal.cmd}`, { stdio: 'ignore' });
166
- return terminal;
167
- }
168
- catch {
169
- // Terminal not found, try next
170
- continue;
171
- }
172
- }
173
- return null;
174
- }
175
- function isWSL() {
176
- return Boolean(process.env['WSL_DISTRO_NAME']);
177
- }
178
- /**
179
- * Launch Windows Terminal (wt.exe) from WSL, running the command inside a new bash session.
180
- *
181
- * Uses wt.exe → wsl.exe → bash so the new terminal inherits the correct WSL distro.
182
- * Claude Code nesting-detection vars are stripped via cleanTerminalEnv().
257
+ * Uses wt.exe wsl.exe $SHELL so the new terminal inherits the correct WSL distro.
258
+ * Claude Code nesting-detection vars are stripped via cleanClaudeEnv().
183
259
  *
184
260
  * @param cwd - Working directory (WSL path)
185
261
  * @param command - Command to execute
186
262
  * @param debugLog - Optional debug logging function
187
263
  */
188
264
  async function launchWSLTerminal(cwd, command, debugLog) {
189
- const escapedPath = cwd.replaceAll("'", String.raw `'\''`);
190
- const bashCmd = `cd '${escapedPath}' && ${command}; exec bash`;
191
- debugLog?.(`Launching WSL via wt.exe with command: ${bashCmd}`);
265
+ const spawnArgs = buildWSLTerminalSpawnArgs(cwd, command);
266
+ debugLog?.(`Launching WSL via wt.exe with command: ${spawnArgs.args[4]}`);
192
267
  return new Promise((resolve) => {
193
- const proc = spawn('wt.exe', ['wsl.exe', '--', 'bash', '-c', bashCmd], {
268
+ const proc = spawn(spawnArgs.command, spawnArgs.args, {
194
269
  detached: true,
195
270
  stdio: 'ignore',
196
- env: cleanTerminalEnv(),
271
+ env: cleanClaudeEnv(),
197
272
  });
198
273
  proc.on('error', (err) => {
199
274
  resolve({ success: false, error: `wt.exe failed: ${err.message}` });
@@ -212,23 +287,21 @@ async function launchWSLTerminal(cwd, command, debugLog) {
212
287
  */
213
288
  async function launchLinuxTerminal(cwd, command, debugLog) {
214
289
  // Find available terminal first (synchronous)
215
- const terminal = findAvailableLinuxTerminal();
290
+ const terminal = findAvailableLinuxTerminal(isCommandAvailable);
216
291
  if (!terminal) {
217
292
  return {
218
293
  error: 'No supported terminal emulator found. Please install gnome-terminal, konsole, or xterm.',
219
294
  success: false,
220
295
  };
221
296
  }
222
- // Escape single quotes for bash shell
223
- const escapedPath = cwd.replaceAll("'", String.raw `'\''`);
224
- const fullCommand = `cd '${escapedPath}' && ${command}`;
225
- debugLog?.(`Launching ${terminal.cmd} with command: ${fullCommand}`);
297
+ const spawnArgs = buildLinuxTerminalSpawnArgs(cwd, command, terminal);
298
+ debugLog?.(`Launching ${terminal.cmd} with command: cd '${escapeSingleQuotedPath(cwd, 'bash')}' && ${command}`);
226
299
  // Launch terminal (single async operation)
227
300
  return new Promise((resolve) => {
228
- const proc = spawn(terminal.cmd, terminal.getArgs(fullCommand), {
301
+ const proc = spawn(spawnArgs.command, spawnArgs.args, {
229
302
  detached: true,
230
303
  stdio: 'ignore',
231
- env: cleanTerminalEnv(),
304
+ env: cleanClaudeEnv(),
232
305
  });
233
306
  proc.on('error', (err) => {
234
307
  resolve({ error: `Failed to launch ${terminal.cmd}: ${err.message}`, success: false });
@@ -243,9 +316,9 @@ async function launchLinuxTerminal(cwd, command, debugLog) {
243
316
  * This function automatically detects the platform and uses the appropriate
244
317
  * terminal emulator:
245
318
  * - **Windows**: Windows Terminal (wt.exe) with PowerShell, falls back to PowerShell directly
246
- * - **macOS**: Terminal.app via AppleScript
319
+ * - **macOS**: Terminal.app via `open` + temporary `.command` script
247
320
  * - **WSL**: Windows Terminal (wt.exe) via wsl.exe, falls back to Linux terminals
248
- * - **Linux**: Tries gnome-terminal, konsole, xterm, x-terminal-emulator in order
321
+ * - **Linux**: Tries x-terminal-emulator, gnome-terminal, konsole, xterm in order
249
322
  *
250
323
  * The terminal is launched in detached mode, allowing the parent process to exit
251
324
  * without affecting the new terminal.
@@ -269,12 +342,12 @@ async function launchLinuxTerminal(cwd, command, debugLog) {
269
342
  * ```
270
343
  */
271
344
  export async function launchTerminal(options) {
272
- const { cwd, command, debugLog } = options;
345
+ const { cwd, command, debugLog, windowsShellPreference = 'default' } = options;
273
346
  const { platform } = process;
274
347
  debugLog?.(`Launching terminal in ${cwd} with command: ${command}`);
275
348
  debugLog?.(`Platform: ${platform}`);
276
- if (platform === 'win32') {
277
- return launchWindowsTerminal(cwd, command, debugLog);
349
+ if (isWindowsPlatform(platform)) {
350
+ return launchWindowsTerminal(cwd, command, windowsShellPreference, debugLog);
278
351
  }
279
352
  if (platform === 'darwin') {
280
353
  return launchMacTerminal(cwd, command, debugLog);
@@ -0,0 +1,17 @@
1
+ /**
2
+ * BSP split algorithm for tmux pane placement.
3
+ * Extracted from template core/lib-ts/base/tmux-pane-placement.ts.
4
+ */
5
+ export type TmuxSplitFlag = '-h' | '-v';
6
+ export interface TmuxPaneInfo {
7
+ active: boolean;
8
+ height: number;
9
+ paneId: string;
10
+ width: number;
11
+ }
12
+ export interface PlacementResult {
13
+ splitFlag: TmuxSplitFlag;
14
+ targetPane: string;
15
+ }
16
+ export declare function listPanes(tmuxPath: string): Promise<TmuxPaneInfo[]>;
17
+ export declare function findBestSplit(panes: TmuxPaneInfo[]): null | PlacementResult;
@@ -0,0 +1,58 @@
1
+ /**
2
+ * BSP split algorithm for tmux pane placement.
3
+ * Extracted from template core/lib-ts/base/tmux-pane-placement.ts.
4
+ */
5
+ import { execFileAsync } from './runtime/subprocess-utils.js';
6
+ const LIST_PANES_FORMAT = '#{pane_id} #{pane_width} #{pane_height} #{pane_active}';
7
+ export async function listPanes(tmuxPath) {
8
+ const result = await execFileAsync(tmuxPath, ['list-panes', '-F', LIST_PANES_FORMAT], {
9
+ timeout: 3000,
10
+ });
11
+ if (result.exitCode !== 0)
12
+ return [];
13
+ const panes = [];
14
+ for (const rawLine of result.stdout.split(/\r?\n/)) {
15
+ const line = rawLine.trim();
16
+ if (!line)
17
+ continue;
18
+ const parts = line.split(/\s+/);
19
+ if (parts.length < 4)
20
+ continue;
21
+ const paneId = parts[0] ?? '';
22
+ const width = Number.parseInt(parts[1] ?? '', 10);
23
+ const height = Number.parseInt(parts[2] ?? '', 10);
24
+ const activeRaw = parts[3] ?? '';
25
+ if (!paneId || !Number.isFinite(width) || !Number.isFinite(height))
26
+ continue;
27
+ panes.push({
28
+ paneId,
29
+ width,
30
+ height,
31
+ active: activeRaw === '1',
32
+ });
33
+ }
34
+ return panes;
35
+ }
36
+ export function findBestSplit(panes) {
37
+ if (panes.length === 0)
38
+ return null;
39
+ let best = panes[0];
40
+ let bestArea = best.width * best.height;
41
+ for (let i = 1; i < panes.length; i++) {
42
+ const pane = panes[i];
43
+ if (!pane)
44
+ continue;
45
+ const area = pane.width * pane.height;
46
+ if (area > bestArea) {
47
+ best = pane;
48
+ bestArea = area;
49
+ }
50
+ }
51
+ const CELL_ASPECT_RATIO = 2;
52
+ const visualWidth = best.width;
53
+ const visualHeight = best.height * CELL_ASPECT_RATIO;
54
+ return {
55
+ targetPane: best.paneId,
56
+ splitFlag: visualWidth >= visualHeight ? '-h' : '-v',
57
+ };
58
+ }
@@ -0,0 +1,3 @@
1
+ export { quoteForSh } from './shell-quoting.js';
2
+ /** Convert Windows path to MSYS2 POSIX path for tmux args. C:\foo\bar → /c/foo/bar */
3
+ export declare function toMsysPosixPath(winPath: string): string;
@@ -0,0 +1,11 @@
1
+ export { quoteForSh } from './shell-quoting.js';
2
+ /** Convert Windows path to MSYS2 POSIX path for tmux args. C:\foo\bar → /c/foo/bar */
3
+ export function toMsysPosixPath(winPath) {
4
+ if (process.platform !== 'win32')
5
+ return winPath;
6
+ const normalized = winPath.replaceAll('\\', '/');
7
+ const match = normalized.match(/^([A-Za-z]):\/(.*)/u);
8
+ if (!match)
9
+ return normalized;
10
+ return `/${match[1].toLowerCase()}/${match[2]}`;
11
+ }
@@ -0,0 +1,32 @@
1
+ export interface TmuxSessionOptions {
2
+ /** Prepend tmux mouse enable command (default true). */
3
+ enableMouse?: boolean;
4
+ /** Platform override for deterministic tests. */
5
+ platform?: NodeJS.Platform | undefined;
6
+ /** Optional prompt text to deliver as a positional arg via temp file. */
7
+ promptText?: string | undefined;
8
+ reattach?: boolean;
9
+ sessionName: string;
10
+ /** CLI args (e.g. ['--dangerously-skip-permissions']). */
11
+ toolArgs: string[];
12
+ /** Absolute path to tool binary (or bare command name on Unix). */
13
+ toolPath: string;
14
+ }
15
+ export type TmuxColorMode = 'c256' | 'truecolor';
16
+ export declare function buildTmuxRuntimeBootstrapCommands(platform?: NodeJS.Platform, enableMouse?: boolean): string[];
17
+ /** Color mode policy for tmux-launched sessions. */
18
+ export declare function resolveTmuxColorMode(platform?: NodeJS.Platform): TmuxColorMode;
19
+ /**
20
+ * Resolve the absolute path to a tool binary (e.g. 'claude', 'codex').
21
+ * On Windows prefers .exe, then extensionless, then .cmd.
22
+ * Returns null when the tool is not on PATH.
23
+ */
24
+ export declare function findToolPath(name: string): null | string;
25
+ /** Build the shell command string from structured options. */
26
+ export declare function buildShellCommand(opts: TmuxSessionOptions): string;
27
+ /**
28
+ * Best-effort configure tmux session: mouse, scrollback, 256-color, and truecolor.
29
+ * Batches all settings into a single tmux invocation using \; command separator.
30
+ * Unix only — Windows uses psmux (native ConPTY handles mouse/color natively).
31
+ */
32
+ export declare function configureTmuxSession(): void;
@@ -0,0 +1,87 @@
1
+ import { execSync } from 'node:child_process';
2
+ import { writeFileSync } from 'node:fs';
3
+ import * as os from 'node:os';
4
+ import path from 'node:path';
5
+ import { buildBootstrapPrompt } from './mux-utils.js';
6
+ import { resolveExecutable } from './runtime/executable-policy.js';
7
+ import { isNonWindowsPlatform, resolveTmuxColorModeForPlatform, } from './runtime/platform-adapter.js';
8
+ import { quoteForSh } from './tmux-primitives.js';
9
+ export function buildTmuxRuntimeBootstrapCommands(platform = process.platform, enableMouse = true) {
10
+ const commands = [];
11
+ if (enableMouse) {
12
+ commands.push('tmux set-option -g mouse on >/dev/null 2>&1 || true');
13
+ }
14
+ // Increase scrollback buffer from default 2000
15
+ commands.push('tmux set-option -g history-limit 50000 >/dev/null 2>&1 || true');
16
+ // Configure terminal overrides for truecolor on Unix.
17
+ // Note: default-terminal is set before session creation.
18
+ // Windows uses psmux (native ConPTY) which handles color/cursor natively.
19
+ if (isNonWindowsPlatform(platform)) {
20
+ commands.push('tmux set -a terminal-overrides ",xterm*:Tc,alacritty:Tc" >/dev/null 2>&1 || true');
21
+ }
22
+ return commands;
23
+ }
24
+ /** Color mode policy for tmux-launched sessions. */
25
+ export function resolveTmuxColorMode(platform = process.platform) {
26
+ return resolveTmuxColorModeForPlatform(platform);
27
+ }
28
+ /**
29
+ * Resolve the absolute path to a tool binary (e.g. 'claude', 'codex').
30
+ * On Windows prefers .exe, then extensionless, then .cmd.
31
+ * Returns null when the tool is not on PATH.
32
+ */
33
+ export function findToolPath(name) {
34
+ return resolveExecutable(name, { windowsProfile: 'exeThenExtensionlessThenCmd' });
35
+ }
36
+ /** Build the shell command string from structured options. */
37
+ export function buildShellCommand(opts) {
38
+ const { toolPath, toolArgs, promptText, enableMouse = true, platform = process.platform } = opts;
39
+ const colorMode = resolveTmuxColorMode(platform);
40
+ const parts = buildTmuxRuntimeBootstrapCommands(platform, enableMouse);
41
+ const cmdParts = [];
42
+ cmdParts.push(quoteForSh(toolPath));
43
+ for (const arg of toolArgs) {
44
+ cmdParts.push(quoteForSh(arg));
45
+ }
46
+ // Deliver prompt via temp file — avoids nested bash→tmux→sh quoting
47
+ if (promptText) {
48
+ const tmpFile = path.join(os.tmpdir(), `aiwcli-prompt-${Date.now()}-${process.pid}.txt`);
49
+ writeFileSync(tmpFile, promptText, { encoding: 'utf8', mode: 0o600 });
50
+ const bootstrap = buildBootstrapPrompt(tmpFile);
51
+ cmdParts.push(quoteForSh(bootstrap));
52
+ }
53
+ // Export COLORTERM only when truecolor is intentionally enabled.
54
+ if (colorMode === 'truecolor') {
55
+ parts.push('export COLORTERM=truecolor');
56
+ }
57
+ else {
58
+ parts.push('unset COLORTERM');
59
+ }
60
+ parts.push(`exec ${cmdParts.join(' ')}`);
61
+ return parts.join('; ');
62
+ }
63
+ /**
64
+ * Best-effort configure tmux session: mouse, scrollback, 256-color, and truecolor.
65
+ * Batches all settings into a single tmux invocation using \; command separator.
66
+ * Unix only — Windows uses psmux (native ConPTY handles mouse/color natively).
67
+ */
68
+ export function configureTmuxSession() {
69
+ if (!isNonWindowsPlatform())
70
+ return;
71
+ try {
72
+ execSync('tmux set-option -g mouse on \\; ' +
73
+ 'set-option -g history-limit 50000 \\; ' +
74
+ 'set -g default-terminal "tmux-256color" \\; ' +
75
+ 'set -a terminal-overrides ",xterm*:Tc,alacritty:Tc"', { stdio: 'ignore', timeout: 3000 });
76
+ }
77
+ catch {
78
+ // Fallback: tmux-256color may not be in terminfo — try screen-256color
79
+ try {
80
+ execSync('tmux set-option -g mouse on \\; ' +
81
+ 'set-option -g history-limit 50000 \\; ' +
82
+ 'set -g default-terminal "screen-256color" \\; ' +
83
+ 'set -a terminal-overrides ",xterm*:Tc,alacritty:Tc"', { stdio: 'ignore', timeout: 3000 });
84
+ }
85
+ catch { /* best-effort */ }
86
+ }
87
+ }
@@ -36,7 +36,7 @@ export function shouldUseColors(proc = process) {
36
36
  const env = proc.env ?? process.env;
37
37
  const noColor = env.NO_COLOR;
38
38
  const forceColor = env.FORCE_COLOR;
39
- // NO_COLOR takes precedence (any value disables colors)
39
+ // NO_COLOR takes precedence (unknown value disables colors)
40
40
  if (noColor !== undefined) {
41
41
  return false;
42
42
  }