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
@@ -12,7 +12,8 @@
12
12
  import { execFileSync } from "node:child_process";
13
13
  import * as fs from "node:fs";
14
14
  import { homedir } from "node:os";
15
- import * as path from "node:path";
15
+ import path from "node:path";
16
+
16
17
  import type { ContextState } from "../lib-ts/types.js";
17
18
 
18
19
  // PAI infrastructure imports — graceful fallback when libs aren't available
@@ -25,7 +26,7 @@ let saveState: (id: string, state: ContextState) => void = () => {};
25
26
  let findLatestPlan: (contextId: string) => string | null = () => null;
26
27
 
27
28
  try {
28
- const hookUtils = await import("../lib-ts/base/hook-utils.js");
29
+ const hookUtils = await import("../lib-ts/hooks/hook-utils.js");
29
30
  CONTEXT_BASELINE_TOKENS = hookUtils.CONTEXT_BASELINE_TOKENS;
30
31
  } catch {
31
32
  /* PAI hook-utils not available */
@@ -52,7 +53,7 @@ try {
52
53
  // Path setup
53
54
  // ---------------------------------------------------------------------------
54
55
  const SCRIPT_DIR = path.dirname(new URL(import.meta.url).pathname);
55
- // Resolve project root from script location (.aiwcli/_shared/scripts/) so paths
56
+ // Resolve project root from script location (.aiwcli/_core/scripts/) so paths
56
57
  // work even when cwd has drifted via `cd` in a Bash tool call.
57
58
  const PROJECT_ROOT = path.resolve(SCRIPT_DIR, "..", "..", "..");
58
59
  const OUTPUT_DIR = path.join(PROJECT_ROOT, "_output");
@@ -213,19 +214,18 @@ function renderContextBar(width: number, pct: number): [string, string] {
213
214
  // Display width helper — accounts for wide Unicode and ANSI escapes
214
215
  // ---------------------------------------------------------------------------
215
216
 
216
- // biome-ignore lint/suspicious/noControlCharactersInRegex: ANSI escape stripping requires \x1b
217
- const ANSI_RE = /\x1b\[[0-9;]*m/g;
217
+ const ANSI_RE = new RegExp(`${String.raw`\u001B`}\\[[0-9;]*m`, "g");
218
218
 
219
219
  function isWideChar(cp: number): boolean {
220
220
  return (
221
- cp === 0x26c1 || // ⛁ draughts man
222
- cp === 0x23f1 || // ⏱ stopwatch
223
- (cp >= 0x2600 && cp <= 0x26ff) || // misc symbols
224
- (cp >= 0x2700 && cp <= 0x27bf) || // dingbats
225
- (cp >= 0x1f300 && cp <= 0x1faff) || // emoji
226
- (cp >= 0xfe00 && cp <= 0xfe0f) || // variation selectors
227
- (cp >= 0x4e00 && cp <= 0x9fff) || // CJK
228
- (cp >= 0x3000 && cp <= 0x303f) // CJK symbols
221
+ cp === 0x26_c1 || // ⛁ draughts man
222
+ cp === 0x23_f1 || // ⏱ stopwatch
223
+ (cp >= 0x26_00 && cp <= 0x26_ff) || // misc symbols
224
+ (cp >= 0x27_00 && cp <= 0x27_bf) || // dingbats
225
+ (cp >= 0x1_f3_00 && cp <= 0x1_fa_ff) || // emoji
226
+ (cp >= 0xfe_00 && cp <= 0xfe_0f) || // variation selectors
227
+ (cp >= 0x4e_00 && cp <= 0x9f_ff) || // CJK
228
+ (cp >= 0x30_00 && cp <= 0x30_3f) // CJK symbols
229
229
  );
230
230
  }
231
231
 
@@ -401,10 +401,10 @@ interface GitStatus {
401
401
 
402
402
  function runGit(args: string[], cwd: string, timeout = 2000): string | null {
403
403
  try {
404
- const result = execFileSync("git", args, {
404
+ const result = execFileSync("git", ["--no-optional-locks", ...args], {
405
405
  cwd,
406
406
  timeout,
407
- encoding: "utf-8",
407
+ encoding: "utf8",
408
408
  stdio: ["pipe", "pipe", "pipe"],
409
409
  windowsHide: true,
410
410
  });
@@ -687,12 +687,15 @@ function renderContextManager(
687
687
  // Note: termWidth not available here — caller truncates via main()
688
688
  switch (mode) {
689
689
  case "micro":
690
- case "nano":
690
+ case "nano": {
691
691
  return `${CTX_ACCENT}\u25C6${RESET} ${SLATE_400}${truncatedId}${RESET}${modeBadge}`;
692
- case "mini":
692
+ }
693
+ case "mini": {
693
694
  return `${CTX_ACCENT}\u25C6${RESET} ${SLATE_400}${truncatedId}${RESET}${modeBadge}${planPart}`;
694
- default:
695
+ }
696
+ default: {
695
697
  return `${CTX_ACCENT}\u25C6${RESET} ${CTX_SECONDARY}Context:${RESET} ${SLATE_300}${truncatedId}${RESET}${modeBadge}${planPart}`;
698
+ }
696
699
  }
697
700
  }
698
701
 
@@ -715,7 +718,7 @@ interface StatuslineCache {
715
718
  function loadCache(): StatuslineCache {
716
719
  try {
717
720
  if (fs.existsSync(STATUSLINE_CACHE)) {
718
- return JSON.parse(fs.readFileSync(STATUSLINE_CACHE, "utf-8"));
721
+ return JSON.parse(fs.readFileSync(STATUSLINE_CACHE, "utf8"));
719
722
  }
720
723
  } catch {
721
724
  /* ignore */
@@ -726,7 +729,7 @@ function loadCache(): StatuslineCache {
726
729
  function saveCache(cache: StatuslineCache): void {
727
730
  try {
728
731
  fs.mkdirSync(path.dirname(STATUSLINE_CACHE), { recursive: true });
729
- fs.writeFileSync(STATUSLINE_CACHE, JSON.stringify(cache, null, 2), "utf-8");
732
+ fs.writeFileSync(STATUSLINE_CACHE, JSON.stringify(cache, null, 2), "utf8");
730
733
  } catch {
731
734
  /* ignore */
732
735
  }
@@ -810,7 +813,7 @@ function main(): void {
810
813
  // Read JSON from stdin
811
814
  let inputData: StatusLineInput;
812
815
  try {
813
- inputData = JSON.parse(fs.readFileSync(0, "utf-8")) as StatusLineInput;
816
+ inputData = JSON.parse(fs.readFileSync(0, "utf8")) as StatusLineInput;
814
817
  } catch {
815
818
  inputData = {};
816
819
  }
@@ -898,3 +901,5 @@ function main(): void {
898
901
  }
899
902
 
900
903
  main();
904
+
905
+
@@ -0,0 +1,83 @@
1
+ # Codex Skill
2
+
3
+ Launch Codex CLI in a visible pane (tmux on Unix, Windows Terminal/window fallback on native Windows) and pass the prompt at process start.
4
+
5
+ ## Directory Structure
6
+
7
+ ```
8
+ codex/
9
+ ├── CLAUDE.md ← This file
10
+ ├── SKILL.md ← Skill metadata (user-invocable)
11
+ ├── lib/
12
+ │ └── codex-watcher.ts ← Reusable watch/summarize library
13
+ └── scripts/
14
+ ├── launch-codex.ts ← Single entry point (launch + optional watch)
15
+ └── watch-codex.ts ← Standalone watch mode
16
+ ```
17
+
18
+ ## Script: launch-codex.ts
19
+
20
+ > Note: This file documents template source paths (`.aiwcli/_core/...`). During installation, settings command paths are normalized to runtime `.aiwcli/_core/...`.
21
+
22
+ **Usage:**
23
+ ```bash
24
+ bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/codex/scripts/launch-codex.ts [--model <tier|id>] [--sandbox <sandbox-mode>] [--prompt <text>] [--no-yolo] [--no-watch] [--context <id>] plan
25
+ bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/codex/scripts/launch-codex.ts [--model <tier|id>] [--sandbox <sandbox-mode>] [--prompt <text>] [--no-yolo] [--no-watch] [--context <id>] --file <path>
26
+ bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/codex/scripts/launch-codex.ts [--model <tier|id>] [--sandbox <sandbox-mode>] [--prompt <text>] [--no-yolo] [--no-watch] [--context <id>] <inline text...>
27
+ ```
28
+
29
+ **Args:**
30
+ - `plan` — discover active plan via context system, build a bootstrap startup prompt that includes the plan filepath (Codex reads that file directly)
31
+ - `--file <path>` — build a bootstrap startup prompt that includes the file path (Codex reads that file directly)
32
+ - `<text...>` — join remaining args as inline prompt
33
+ - `--model <alias|tier|id>` — Aliases: `spark` → `gpt-5.3-codex-spark`, `codex` → `gpt-5.4`, `gpt` → `gpt-5.4`. Tiers: `fast`/`standard`/`smart` (resolved via `resolveModelForProvider()`). Or a full model ID.
34
+ - `--sandbox <mode>` — `read-only`, `workspace-write`, or `danger-full-access`. Default is `danger-full-access`.
35
+ - `--prompt <text>` — append extra instructions. In `plan` and `--file` modes, these are embedded into a bootstrap temp file alongside the target path.
36
+ - `--task-id <id>` — Caller-provided task ID for direct summary file lookup. If omitted, auto-generated as `<timestamp>-<pid>`. Enables the caller to know the exact summary file path without reading background task stdout.
37
+ - `--no-yolo` — Disable YOLO mode (`--dangerously-bypass-approvals-and-sandbox`).
38
+ - `--no-watch` — Disable watch/summarize mode.
39
+
40
+ **Plan discovery order:**
41
+ 1. `CLAUDE_SESSION_ID` env → `getContextBySessionId()` → `findLatestPlan(contextId)`
42
+ 2. Fallback: scan `_output/contexts/*/plans/*.md` by mtime
43
+
44
+ **Dependencies:**
45
+ - `runtime/aiw-cli.ts` — shells out to `aiw launch` for pane management (no direct tmux imports)
46
+ - `runtime/cli-args.ts` — model/sandbox/yolo CLI arg generation
47
+ - `context/*` — context lookup, formatting, plan discovery
48
+
49
+ **Watch behavior (single entry point):**
50
+ - Watch is enabled by default.
51
+ - `launch-codex.ts` launches Codex, waits for completion (pane close or sentinel), and prints a summary.
52
+ - Summary cascade:
53
+ 1. Session-file summary (`summarizeViaSessionFile`): Codex CLI Spark primary, `fast` tier (Haiku) fallback
54
+ 2. `codex exec resume <session_id>` summary (output file, then stdout/stderr parse fallback)
55
+ 3. Transcript-line fallback
56
+ 4. Static `Summary unavailable` message
57
+ - Summary persistence:
58
+ - `persistSummary()` in `agent-launcher.ts` writes to `os.tmpdir()/codex-summary-<ts>-<id>.md` (unique per run)
59
+ - Also writes to well-known path: `$TMPDIR/aiw-agent-output/<session-key>/codex-<taskId>.md`
60
+ - Task ID is caller-provided via `--task-id` or auto-generated as `<timestamp>-<pid>`
61
+ - Caller can compute the exact path via `getWellKnownSummaryPath("codex", taskId)` — no discovery needed
62
+ - Multiple concurrent agents use different task IDs, so they don't clobber each other
63
+ - Session key resolution: tmux (`$TMUX`), psmux (`psmux display-message`), exec fallback (project-root hash)
64
+ - Task ID + summary path printed early (before agent runs) so even partial stdout capture is useful
65
+ - Best-effort: logs warning on failure, stdout output still proceeds
66
+
67
+ **Design decisions:**
68
+ - Prompt is delivered at launch time (no tmux buffer paste/capture workflow)
69
+ - Pane backend detection delegated to `aiw launch` (tmux in-session only → inline exec fallback)
70
+ - `core` source only — runtime execution resolves to `.aiwcli/_core`
71
+ - Watch path is best-effort and does not change launch success semantics
72
+
73
+ ## Library: lib/codex-watcher.ts
74
+
75
+ Reusable side-effect-free watch/summarize functions used by launch flow:
76
+ - `waitForPaneClose(target, timeoutMs?)` where `target` can be tmux pane id or `{ backend, paneId, sentinelPath }`
77
+ - `summarizeViaSessionFile(sessionFile)`
78
+ - `summarizeViaResume(sessionId)`
79
+ - `summarizeFromSessionFileFallback(sessionFile)`
80
+ - `collectTranscriptLines(sessionFile)`
81
+
82
+ Constants and helper utilities are exported for reuse and testing (`POLL_INTERVAL_MS`, `SUMMARY_UNAVAILABLE_MESSAGE`, `normalizeText`, `looksLikeBadSummary`, etc.).
83
+
@@ -1,3 +1,9 @@
1
+ ---
2
+ name: codex
3
+ description: Delegate implementation to Codex sub-agents. USE WHEN codex OR send to codex OR codex implement OR hand off to codex OR launch codex OR run codex.
4
+ user-invocable: true
5
+ ---
6
+
1
7
  # /codex
2
8
 
3
9
  ## Role
@@ -9,19 +15,31 @@ The script blocks until Codex exits and prints a session summary. Run with Bash
9
15
  ## Command
10
16
 
11
17
  ```
12
- bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_shared/skills/codex/scripts/launch-codex.ts [flags] <mode>
18
+ bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/codex/scripts/launch-codex.ts [flags] <mode>
13
19
  ```
14
20
 
15
21
  **Modes:** `plan` | `--file <path>` | `<inline text...>`
16
22
 
23
+ `plan` and `--file` modes pass a filepath-first bootstrap prompt so Codex reads the file from disk instead of relying on a pasted full document.
24
+
17
25
  **Flags:**
18
26
  - `--context <id>` — Project orientation for the sub-agent. Pass when implementing a plan so Codex understands the project structure.
19
- - `--prompt <text>` — Scope the agent's work. Direct each instance to a specific plan section or task.
20
- - `--model <name>` — Aliases: `spark`, `codex`, `gpt`. Tiers: `fast`, `standard`, `smart`. Or any full model ID.
27
+ - `--prompt <text>` — Add extra instructions. In `plan`/`--file` mode, this is embedded into the bootstrap temp file with the target path.
28
+ - `--model <name>` — Aliases: `spark`, `codex`, `gpt`. Tiers: `fast`, `standard`, `smart`. Or unknown full model ID.
21
29
  - `--sandbox <mode>` — `read-only`, `workspace-write`, `danger-full-access`.
22
30
  - `--no-yolo` — Disable YOLO mode (on by default).
23
31
  - `--no-watch` — Fire-and-forget: exit immediately after launch, skip waiting for summary.
24
32
 
33
+ ## Retrieving Results
34
+
35
+ The script prints a summary to stdout and writes it to a temp file.
36
+
37
+ **Primary:** Check TaskOutput for the background task — the summary and file path are inline.
38
+
39
+ **Fallback (if TaskOutput is empty):** Look for the `[summary_file:<path>]` line in the output. If found, read that file path directly. The temp file persists independently of Claude Code's background task capture.
40
+
41
+ If neither is available, check `_output/hook-log.jsonl` for `codex-capture` or `codex-skill` entries for diagnostics.
42
+
25
43
  ## Delegation Patterns
26
44
 
27
45
  ### One-shot
@@ -29,24 +47,14 @@ bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_shared/skills/codex/scripts/launch-cod
29
47
  For small or tightly coupled plans. One sub-agent implements the whole plan.
30
48
 
31
49
  ```bash
32
- bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_shared/skills/codex/scripts/launch-codex.ts --context <ctx-id> plan
50
+ bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/codex/scripts/launch-codex.ts --context <ctx-id> plan
33
51
  ```
34
52
 
35
53
  Run with `run_in_background: true`. Wait for the summary. Review the changes.
36
54
 
37
55
  ### Parallel
38
56
 
39
- For plans with independent sections. Each sub-agent owns one section, scoped by `--prompt`.
40
-
41
- ```bash
42
- # Sub-agent A — section 1
43
- bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_shared/skills/codex/scripts/launch-codex.ts \
44
- --context <ctx-id> --prompt "Implement section 1: Extract watch logic into lib/codex-watcher.ts" plan
45
-
46
- # Sub-agent B — section 3
47
- bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_shared/skills/codex/scripts/launch-codex.ts \
48
- --context <ctx-id> --prompt "Implement section 3: Update launch-codex.ts arg parsing" plan
49
- ```
57
+ For plans with independent sections, create small section-brief files and launch one sub-agent per brief with `--file`.
50
58
 
51
59
  Run each with `run_in_background: true`. Summaries arrive as separate background task notifications. When all complete, review for conflicts between agents, then verify with tests or import checks.
52
60
 
@@ -55,10 +63,10 @@ Run each with `run_in_background: true`. Summaries arrive as separate background
55
63
  For tasks outside a plan. Pass inline text or a file path.
56
64
 
57
65
  ```bash
58
- bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_shared/skills/codex/scripts/launch-codex.ts \
66
+ bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/codex/scripts/launch-codex.ts \
59
67
  "Fix the failing test in auth.ts"
60
68
 
61
- bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_shared/skills/codex/scripts/launch-codex.ts \
69
+ bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/codex/scripts/launch-codex.ts \
62
70
  --file path/to/task-description.md
63
71
  ```
64
72
 
@@ -67,5 +75,6 @@ bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_shared/skills/codex/scripts/launch-cod
67
75
  - **Delegate implementation.** If the work involves writing code and Codex can handle it, send it to Codex.
68
76
  - **Split independent sections** into parallel sub-agents for faster execution.
69
77
  - **Pass `--context`** when implementing a plan — Codex needs project orientation to make good decisions.
70
- - **Scope with `--prompt`** when running parallel agents each sub-agent performs better when it knows exactly which section it owns.
78
+ - **Scope parallel agents with separate `--file` briefs** so each sub-agent has an explicit task boundary.
71
79
  - **Review results** when summaries arrive. Check for merge conflicts between parallel agents, then verify with `tsc --noEmit`, tests, or manual inspection.
80
+
@@ -1,29 +1,29 @@
1
1
  import * as fs from "node:fs";
2
2
  import * as os from "node:os";
3
- import * as path from "node:path";
3
+ import path from "node:path";
4
4
 
5
- import { inference } from "../../../lib-ts/base/inference.js";
6
- import { logDebug, logWarn } from "../../../lib-ts/base/logger.js";
7
- import { CODEX_MODELS } from "../../../lib-ts/base/models.js";
8
- import type { PaneBackend } from "../../../lib-ts/base/pane-launcher.js";
9
- import { execFileAsync } from "../../../lib-ts/base/subprocess-utils.js";
10
- import { getTmuxAvailability } from "../../../lib-ts/base/tmux-driver.js";
5
+ import { inference } from "../../../lib-ts/runtime/inference.js";
6
+ import { logWarn } from "../../../lib-ts/runtime/logger.js";
7
+ import { CODEX_MODELS } from "../../../lib-ts/runtime/models.js";
8
+ import { execFileAsync } from "../../../lib-ts/runtime/subprocess-utils.js";
9
+
10
+ // Re-export shared symbols that consumers import from this module
11
+ export {
12
+ type PaneWatchTarget,
13
+ looksLikeBadSummary,
14
+ persistSummary,
15
+ sleep,
16
+ waitForPaneClose,
17
+ } from "../../../lib-ts/runtime/agent-launcher.js";
18
+
19
+ import { looksLikeBadSummary } from "../../../lib-ts/runtime/agent-launcher.js";
11
20
 
12
- export const POLL_INTERVAL_MS = 2000;
13
- export const POLL_TIMEOUT_MS = 3000;
14
21
  export const SUMMARY_TIMEOUT_SEC = 8;
15
- export const RESUME_TIMEOUT_MS = 45000;
22
+ export const RESUME_TIMEOUT_MS = 45_000;
16
23
  export const MAX_TRANSCRIPT_LINES = 220;
17
24
  export const MAX_LINE_LENGTH = 500;
18
- export const WAIT_TIMEOUT_MS_DEFAULT = 14_400_000;
19
25
  export const SUMMARY_UNAVAILABLE_MESSAGE = "Codex session completed. Summary unavailable.";
20
26
 
21
- export interface PaneWatchTarget {
22
- backend?: PaneBackend;
23
- paneId?: string;
24
- sentinelPath?: string;
25
- }
26
-
27
27
  export const TRANSCRIPT_SUMMARY_PROMPT = `Summarize this Codex session transcript excerpt.
28
28
  Return 3-5 concise bullet points.
29
29
  Focus on:
@@ -43,10 +43,6 @@ Do not ask follow-up questions.
43
43
  Do not request additional input.
44
44
  If the prior session was brief, still provide a best-effort summary.`;
45
45
 
46
- export function sleep(ms: number): Promise<void> {
47
- return new Promise((resolve) => setTimeout(resolve, ms));
48
- }
49
-
50
46
  export function safeCleanup(filePath: string): void {
51
47
  try {
52
48
  if (fs.existsSync(filePath)) fs.unlinkSync(filePath);
@@ -58,7 +54,7 @@ export function safeCleanup(filePath: string): void {
58
54
  export function readTextIfExists(filePath: string): string {
59
55
  try {
60
56
  if (!filePath || !fs.existsSync(filePath)) return "";
61
- return fs.readFileSync(filePath, "utf-8").trim();
57
+ return fs.readFileSync(filePath, "utf8").trim();
62
58
  } catch {
63
59
  return "";
64
60
  }
@@ -66,16 +62,16 @@ export function readTextIfExists(filePath: string): string {
66
62
 
67
63
  export function normalizeText(text: string): string {
68
64
  return text
69
- .replace(/\r/g, "")
70
- .replace(/[\x00-\x08\x0B-\x1F\x7F]/g, "")
71
- .replace(/\s+/g, " ")
65
+ .replaceAll('\r', "")
66
+ .replaceAll(/\p{Cc}/gu, "")
67
+ .replaceAll(/\s+/g, " ")
72
68
  .trim();
73
69
  }
74
70
 
75
71
  export function getMessageContentText(content: unknown): string {
76
72
  if (!Array.isArray(content)) return "";
77
73
  return content
78
- .map((entry: any) => {
74
+ .map((entry: unknown) => {
79
75
  if (!entry || typeof entry !== "object") return "";
80
76
  if (typeof entry.text !== "string") return "";
81
77
  return entry.text;
@@ -90,11 +86,11 @@ export function collectTranscriptLines(sessionFile: string): string[] {
90
86
  const seen = new Set<string>();
91
87
 
92
88
  try {
93
- const raw = fs.readFileSync(sessionFile, "utf-8");
89
+ const raw = fs.readFileSync(sessionFile, "utf8");
94
90
  const lines = raw.split(/\r?\n/).filter((line) => line.trim().length > 0);
95
91
 
96
92
  for (const line of lines) {
97
- let parsed: any;
93
+ let parsed: unknown;
98
94
  try {
99
95
  parsed = JSON.parse(line);
100
96
  } catch {
@@ -132,99 +128,32 @@ export function collectTranscriptLines(sessionFile: string): string[] {
132
128
  return out.slice(-MAX_TRANSCRIPT_LINES);
133
129
  }
134
130
 
135
- export function looksLikeBadSummary(output: string): boolean {
136
- const normalized = output.toLowerCase();
137
- return (
138
- normalized.includes("don't see") ||
139
- normalized.includes("no output") ||
140
- normalized.includes("could you provide") ||
141
- normalized.includes("paste")
142
- );
143
- }
144
-
145
- async function waitForSentinelClose(sentinelPath: string, timeoutMs: number): Promise<void> {
146
- const deadline = Date.now() + timeoutMs;
147
- while (true) {
148
- if (fs.existsSync(sentinelPath)) return;
149
- if (Date.now() >= deadline) {
150
- logDebug("codex-capture", `watch timeout reached waiting for sentinel ${sentinelPath}`);
151
- return;
152
- }
153
-
154
- const remainingMs = deadline - Date.now();
155
- await sleep(Math.max(0, Math.min(POLL_INTERVAL_MS, remainingMs)));
156
- }
157
- }
158
-
159
- function normalizeWatchTarget(target: string | PaneWatchTarget): PaneWatchTarget {
160
- if (typeof target === "string") {
161
- return { backend: "tmux", paneId: target };
162
- }
163
- return target;
164
- }
165
-
166
- export async function waitForPaneClose(
167
- target: string | PaneWatchTarget,
168
- timeoutMs = WAIT_TIMEOUT_MS_DEFAULT,
169
- ): Promise<void> {
170
- const watch = normalizeWatchTarget(target);
171
-
172
- if (watch.sentinelPath) {
173
- await waitForSentinelClose(watch.sentinelPath, timeoutMs);
174
- return;
175
- }
176
-
177
- const backend = watch.backend ?? "tmux";
178
- const paneId = watch.paneId ?? "";
179
-
180
- if (backend !== "tmux") {
181
- logDebug("codex-capture", `No pane watcher for backend=${backend}; continuing without wait`);
182
- return;
183
- }
184
-
185
- if (!paneId) return;
186
-
187
- const tmux = getTmuxAvailability({ requireSessionEnv: false });
188
- if (!tmux.available || !tmux.tmuxPath) {
189
- logWarn("codex-capture", `tmux unavailable while watching pane ${paneId}: ${tmux.reason ?? "unknown reason"}`);
190
- return;
191
- }
192
-
193
- const deadline = Date.now() + timeoutMs;
194
- while (true) {
195
- if (Date.now() >= deadline) {
196
- logDebug("codex-capture", `watch timeout reached for pane ${paneId} after ${timeoutMs}ms`);
197
- return;
198
- }
199
-
200
- const result = await execFileAsync(tmux.tmuxPath, ["list-panes", "-a", "-F", "#{pane_id}"], {
201
- timeout: POLL_TIMEOUT_MS,
202
- });
203
-
204
- if (result.exitCode !== 0) {
205
- logDebug("codex-capture", `list-panes failed; assuming pane closed (${result.stderr.trim() || "no stderr"})`);
206
- return;
207
- }
208
-
209
- const activePaneIds = result.stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
210
- if (!activePaneIds.includes(paneId)) return;
211
-
212
- const remainingMs = deadline - Date.now();
213
- await sleep(Math.max(0, Math.min(POLL_INTERVAL_MS, remainingMs)));
214
- }
215
- }
216
-
217
- export function summarizeViaSessionFileSpark(sessionFile: string): string | null {
131
+ export async function summarizeViaSessionFile(sessionFile: string): Promise<string | null> {
218
132
  const transcriptLines = collectTranscriptLines(sessionFile);
219
133
  if (transcriptLines.length === 0) return null;
220
134
 
221
135
  const transcript = transcriptLines.join("\n");
136
+ const fullPrompt = `${TRANSCRIPT_SUMMARY_PROMPT}\n\nSession transcript excerpt:\n\n${transcript}`;
137
+
138
+ const codexResult = await execFileAsync(
139
+ "codex",
140
+ ["exec", fullPrompt, "--model", CODEX_MODELS.spark, "--json"],
141
+ { timeout: SUMMARY_TIMEOUT_SEC * 1000 },
142
+ );
143
+ if (codexResult.exitCode === 0 && codexResult.stdout.trim()) {
144
+ const output = codexResult.stdout.trim();
145
+ if (!looksLikeBadSummary(output)) return output;
146
+ }
147
+ logWarn(
148
+ "codex-capture",
149
+ `Codex Spark transcript summary failed (exit=${codexResult.exitCode}), falling back to Haiku`,
150
+ );
151
+
222
152
  const result = inference(
223
153
  TRANSCRIPT_SUMMARY_PROMPT,
224
154
  `Session transcript excerpt:\n\n${transcript}`,
225
155
  "fast",
226
156
  SUMMARY_TIMEOUT_SEC,
227
- { model: CODEX_MODELS.spark },
228
157
  );
229
158
 
230
159
  if (result.success && result.output && result.output.trim() && !looksLikeBadSummary(result.output)) {
@@ -238,6 +167,31 @@ export function summarizeViaSessionFileSpark(sessionFile: string): string | null
238
167
  return null;
239
168
  }
240
169
 
170
+ export function extractResumeSummary(text: string): string {
171
+ if (!text) return "";
172
+
173
+ const normalized = text.replaceAll("\r", "");
174
+ const marker = /(?:^|\n)codex\n/.exec(normalized);
175
+ if (!marker) return "";
176
+
177
+ const lines = normalized.slice(marker.index + marker[0].length).split("\n");
178
+ const bullets: string[] = [];
179
+ let collecting = false;
180
+
181
+ for (const rawLine of lines) {
182
+ const line = rawLine.trim();
183
+ if (!collecting && line.length === 0) continue;
184
+ if (line.startsWith("- ")) {
185
+ bullets.push(line);
186
+ collecting = true;
187
+ continue;
188
+ }
189
+ if (collecting) break;
190
+ }
191
+
192
+ return bullets.length >= 2 ? bullets.join("\n") : "";
193
+ }
194
+
241
195
  export async function summarizeViaResume(sessionId: string): Promise<string | null> {
242
196
  const outputFile = path.join(os.tmpdir(), `codex-resume-summary-${Date.now()}-${process.pid}.txt`);
243
197
 
@@ -261,7 +215,16 @@ export async function summarizeViaResume(sessionId: string): Promise<string | nu
261
215
  safeCleanup(outputFile);
262
216
 
263
217
  if (summary && !looksLikeBadSummary(summary)) return summary;
264
- logWarn("codex-capture", `codex exec resume failed for ${sessionId}: exit=${result.exitCode}, stderr=${result.stderr.trim() || "none"}`);
218
+
219
+ const stdoutSummary = extractResumeSummary(result.stdout);
220
+ if (stdoutSummary && !looksLikeBadSummary(stdoutSummary)) return stdoutSummary;
221
+
222
+ const stderrSummary = extractResumeSummary(result.stderr);
223
+ if (stderrSummary && !looksLikeBadSummary(stderrSummary)) return stderrSummary;
224
+
225
+ const stderrTrimmed = result.stderr.trim();
226
+ const stderrPreview = stderrTrimmed.length > 200 ? `${stderrTrimmed.slice(0, 200)}...` : (stderrTrimmed || "none");
227
+ logWarn("codex-capture", `codex exec resume failed for ${sessionId}: exit=${result.exitCode}, stderr=${stderrPreview}`);
265
228
  return null;
266
229
  }
267
230
 
@@ -270,3 +233,6 @@ export function summarizeFromSessionFileFallback(sessionFile: string): string |
270
233
  if (lines.length === 0) return null;
271
234
  return `Codex session completed. Transcript fallback:\n- ${lines.join("\n- ")}`;
272
235
  }
236
+
237
+
238
+