aiwcli 0.15.5 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (435) hide show
  1. package/README.md +108 -1124
  2. package/bin/run.js +0 -4
  3. package/dist/capabilities/branch/adapters.d.ts +2 -0
  4. package/dist/capabilities/branch/adapters.js +21 -0
  5. package/dist/capabilities/branch/contracts.d.ts +57 -0
  6. package/dist/capabilities/branch/contracts.js +1 -0
  7. package/dist/capabilities/branch/control-plane.d.ts +2 -0
  8. package/dist/capabilities/branch/control-plane.js +343 -0
  9. package/dist/capabilities/branch/runtime-core.d.ts +5 -0
  10. package/dist/capabilities/branch/runtime-core.js +36 -0
  11. package/dist/capabilities/installation/control-plane/clean-command.d.ts +41 -0
  12. package/dist/capabilities/installation/control-plane/clean-command.js +196 -0
  13. package/dist/capabilities/installation/control-plane/clear-command.d.ts +162 -0
  14. package/dist/capabilities/installation/control-plane/clear-command.js +1249 -0
  15. package/dist/capabilities/installation/control-plane/init-command.d.ts +81 -0
  16. package/dist/capabilities/installation/control-plane/init-command.js +449 -0
  17. package/dist/capabilities/launch/contracts.d.ts +86 -0
  18. package/dist/capabilities/launch/contracts.js +1 -0
  19. package/dist/capabilities/launch/control-plane/execute-launch.d.ts +2 -0
  20. package/dist/capabilities/launch/control-plane/execute-launch.js +261 -0
  21. package/dist/capabilities/launch/runtime-core/launch-decisions.d.ts +82 -0
  22. package/dist/capabilities/launch/runtime-core/launch-decisions.js +202 -0
  23. package/dist/capabilities/launch/runtime-core/launch-options.d.ts +14 -0
  24. package/dist/capabilities/launch/runtime-core/launch-options.js +69 -0
  25. package/dist/cli/base-command.d.ts +18 -0
  26. package/dist/cli/base-command.js +55 -0
  27. package/dist/commands/branch.d.ts +1 -21
  28. package/dist/commands/branch.js +25 -417
  29. package/dist/commands/clean.d.ts +1 -41
  30. package/dist/commands/clean.js +1 -196
  31. package/dist/commands/clear.d.ts +1 -161
  32. package/dist/commands/clear.js +1 -1121
  33. package/dist/commands/init/index.d.ts +1 -98
  34. package/dist/commands/init/index.js +4 -478
  35. package/dist/commands/launch.d.ts +32 -12
  36. package/dist/commands/launch.js +107 -166
  37. package/dist/lib/claude-settings-types.d.ts +31 -19
  38. package/dist/lib/config.js +1 -2
  39. package/dist/lib/context/context-formatter.d.ts +74 -0
  40. package/dist/lib/context/context-formatter.js +493 -0
  41. package/dist/lib/context/context-selector.d.ts +42 -0
  42. package/dist/lib/context/context-selector.js +451 -0
  43. package/dist/lib/context/context-store.d.ts +100 -0
  44. package/dist/lib/context/context-store.js +644 -0
  45. package/dist/lib/context/plan-manager.d.ts +54 -0
  46. package/dist/lib/context/plan-manager.js +282 -0
  47. package/dist/lib/context/task-tracker.d.ts +44 -0
  48. package/dist/lib/context/task-tracker.js +146 -0
  49. package/dist/lib/core-ide-base.d.ts +4 -0
  50. package/dist/lib/core-ide-base.js +77 -0
  51. package/dist/lib/core-installer.d.ts +5 -0
  52. package/dist/lib/core-installer.js +33 -0
  53. package/dist/lib/debug.d.ts +0 -10
  54. package/dist/lib/debug.js +0 -10
  55. package/dist/lib/env-sanitizer.d.ts +25 -0
  56. package/dist/lib/env-sanitizer.js +46 -0
  57. package/dist/lib/errors.d.ts +0 -13
  58. package/dist/lib/errors.js +0 -15
  59. package/dist/lib/git-exclude-manager.d.ts +2 -2
  60. package/dist/lib/git-exclude-manager.js +3 -3
  61. package/dist/lib/hooks/context-monitor-logic.d.ts +6 -0
  62. package/dist/lib/hooks/context-monitor-logic.js +25 -0
  63. package/dist/lib/hooks/hook-utils.d.ts +143 -0
  64. package/dist/lib/hooks/hook-utils.js +620 -0
  65. package/dist/lib/hooks/prompt-binding-logic.d.ts +7 -0
  66. package/dist/lib/hooks/prompt-binding-logic.js +50 -0
  67. package/dist/lib/hooks/session-end-logic.d.ts +5 -0
  68. package/dist/lib/hooks/session-end-logic.js +51 -0
  69. package/dist/lib/hooks-merger.js +25 -19
  70. package/dist/lib/ide-path-resolver.d.ts +19 -7
  71. package/dist/lib/ide-path-resolver.js +25 -9
  72. package/dist/lib/install-state.d.ts +34 -0
  73. package/dist/lib/install-state.js +154 -0
  74. package/dist/lib/json-io.d.ts +12 -0
  75. package/dist/lib/json-io.js +30 -0
  76. package/dist/lib/lsp-patch.d.ts +12 -0
  77. package/dist/lib/lsp-patch.js +156 -0
  78. package/dist/lib/multiplexer.d.ts +65 -0
  79. package/dist/lib/multiplexer.js +38 -0
  80. package/dist/lib/multiplexers/psmux.d.ts +55 -0
  81. package/dist/lib/multiplexers/psmux.js +324 -0
  82. package/dist/lib/multiplexers/tmux.d.ts +36 -0
  83. package/dist/lib/multiplexers/tmux.js +221 -0
  84. package/dist/lib/multiplexers/wezterm.d.ts +38 -0
  85. package/dist/lib/multiplexers/wezterm.js +225 -0
  86. package/dist/lib/mux-utils.d.ts +6 -0
  87. package/dist/lib/mux-utils.js +36 -0
  88. package/dist/lib/paths.d.ts +2 -2
  89. package/dist/lib/paths.js +2 -2
  90. package/dist/lib/platform-commands.d.ts +27 -0
  91. package/dist/lib/platform-commands.js +49 -0
  92. package/dist/lib/prompt-file-manager.d.ts +23 -0
  93. package/dist/lib/prompt-file-manager.js +41 -0
  94. package/dist/lib/runtime/agent-launcher.d.ts +67 -0
  95. package/dist/lib/runtime/agent-launcher.js +262 -0
  96. package/dist/lib/runtime/aiw-cli.d.ts +39 -0
  97. package/dist/lib/runtime/aiw-cli.js +76 -0
  98. package/dist/lib/runtime/atomic-write.d.ts +19 -0
  99. package/dist/lib/runtime/atomic-write.js +121 -0
  100. package/dist/lib/runtime/cli-args.d.ts +58 -0
  101. package/dist/lib/runtime/cli-args.js +200 -0
  102. package/dist/lib/runtime/constants.d.ts +56 -0
  103. package/dist/lib/runtime/constants.js +230 -0
  104. package/dist/lib/runtime/executable-policy.d.ts +16 -0
  105. package/dist/lib/runtime/executable-policy.js +57 -0
  106. package/dist/lib/runtime/git-state.d.ts +9 -0
  107. package/dist/lib/runtime/git-state.js +59 -0
  108. package/dist/lib/runtime/inference.d.ts +37 -0
  109. package/dist/lib/runtime/inference.js +251 -0
  110. package/dist/lib/runtime/lint-dispatch.d.ts +40 -0
  111. package/dist/lib/runtime/lint-dispatch.js +285 -0
  112. package/dist/lib/runtime/logger.d.ts +66 -0
  113. package/dist/lib/runtime/logger.js +201 -0
  114. package/dist/lib/runtime/models.d.ts +20 -0
  115. package/dist/lib/runtime/models.js +20 -0
  116. package/dist/lib/runtime/platform-adapter.d.ts +7 -0
  117. package/dist/lib/runtime/platform-adapter.js +21 -0
  118. package/dist/lib/runtime/preflight.d.ts +24 -0
  119. package/dist/lib/runtime/preflight.js +65 -0
  120. package/dist/lib/runtime/sentinel-ipc.d.ts +14 -0
  121. package/dist/lib/runtime/sentinel-ipc.js +67 -0
  122. package/dist/lib/runtime/state-io.d.ts +31 -0
  123. package/dist/lib/runtime/state-io.js +179 -0
  124. package/dist/lib/runtime/stop-words.d.ts +20 -0
  125. package/dist/lib/runtime/stop-words.js +150 -0
  126. package/dist/lib/runtime/subprocess-utils.d.ts +29 -0
  127. package/dist/lib/runtime/subprocess-utils.js +96 -0
  128. package/dist/lib/runtime/tmux-preflight.d.ts +13 -0
  129. package/dist/lib/runtime/tmux-preflight.js +78 -0
  130. package/dist/lib/runtime/utils.d.ts +62 -0
  131. package/dist/lib/runtime/utils.js +192 -0
  132. package/dist/lib/schemas.d.ts +250 -0
  133. package/dist/lib/schemas.js +216 -0
  134. package/dist/lib/sentinel-manager.d.ts +32 -0
  135. package/dist/lib/sentinel-manager.js +62 -0
  136. package/dist/lib/sentinel-wrapper.d.ts +10 -0
  137. package/dist/lib/sentinel-wrapper.js +29 -0
  138. package/dist/lib/settings-hierarchy.js +3 -20
  139. package/dist/lib/shell-adapters/bash-adapter.d.ts +18 -0
  140. package/dist/lib/shell-adapters/bash-adapter.js +69 -0
  141. package/dist/lib/shell-adapters/index.d.ts +5 -0
  142. package/dist/lib/shell-adapters/index.js +7 -0
  143. package/dist/lib/shell-adapters/powershell-adapter.d.ts +18 -0
  144. package/dist/lib/shell-adapters/powershell-adapter.js +62 -0
  145. package/dist/lib/shell-adapters/shell-adapter.d.ts +45 -0
  146. package/dist/lib/shell-adapters/shell-adapter.js +5 -0
  147. package/dist/lib/shell-quoting.d.ts +5 -0
  148. package/dist/lib/shell-quoting.js +17 -0
  149. package/dist/lib/spawn-errors.d.ts +9 -0
  150. package/dist/lib/spawn-errors.js +29 -0
  151. package/dist/lib/spawn.js +5 -11
  152. package/dist/lib/spinner.d.ts +0 -5
  153. package/dist/lib/spinner.js +0 -16
  154. package/dist/lib/template-installer.d.ts +14 -5
  155. package/dist/lib/template-installer.js +40 -38
  156. package/dist/lib/template-resolver.d.ts +6 -7
  157. package/dist/lib/template-resolver.js +26 -21
  158. package/dist/lib/template-settings-reconstructor.d.ts +7 -2
  159. package/dist/lib/template-settings-reconstructor.js +76 -45
  160. package/dist/lib/terminal-strategy.d.ts +12 -0
  161. package/dist/lib/terminal-strategy.js +55 -0
  162. package/dist/lib/terminal.d.ts +34 -4
  163. package/dist/lib/terminal.js +192 -119
  164. package/dist/lib/tmux-pane-placement.d.ts +17 -0
  165. package/dist/lib/tmux-pane-placement.js +58 -0
  166. package/dist/lib/tmux-primitives.d.ts +3 -0
  167. package/dist/lib/tmux-primitives.js +11 -0
  168. package/dist/lib/tmux-session.d.ts +32 -0
  169. package/dist/lib/tmux-session.js +87 -0
  170. package/dist/lib/tty-detection.js +1 -1
  171. package/dist/lib/types.d.ts +168 -0
  172. package/dist/lib/types.js +6 -0
  173. package/dist/lib/version.d.ts +1 -1
  174. package/dist/lib/version.js +1 -1
  175. package/dist/lib/windsurf-hooks-hierarchy.js +6 -23
  176. package/dist/platform/launch.d.ts +11 -0
  177. package/dist/platform/launch.js +11 -0
  178. package/dist/templates/CLAUDE.md +30 -40
  179. package/dist/templates/cc-native/.claude/settings.json +26 -36
  180. package/dist/templates/cc-native/CC-NATIVE-README.md +1 -1
  181. package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +20 -12
  182. package/dist/templates/cc-native/_cc-native/cc-native.config.json +2 -6
  183. package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +39 -59
  184. package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +9 -11
  185. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_subagent.ts +2 -2
  186. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +4 -5
  187. package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +4 -4
  188. package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +2 -27
  189. package/dist/templates/cc-native/_cc-native/hooks/validate_task_prompt.ts +7 -7
  190. package/dist/templates/cc-native/_cc-native/lib-ts/.mocharc.json +9 -0
  191. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/aggregate-agents.test.ts +118 -0
  192. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/artifacts.test.ts +234 -0
  193. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/cc-native-state.test.ts +170 -0
  194. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/cli-output-parser.test.ts +73 -0
  195. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/config.test.ts +64 -0
  196. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/constants.test.ts +40 -0
  197. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/debug.test.ts +42 -0
  198. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/exports.test.ts +58 -0
  199. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/helpers.ts +107 -0
  200. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/add-plan-context.hook.test.ts +97 -0
  201. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/plan-questions.hook.test.ts +81 -0
  202. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/plan-review.hook.test.ts +71 -0
  203. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/json-parser.test.ts +99 -0
  204. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/orchestrator-agent.test.ts +288 -0
  205. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/orchestrator.test.ts +48 -0
  206. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/reviewers.test.ts +32 -0
  207. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/state.test.ts +124 -0
  208. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/verdict.test.ts +93 -0
  209. package/dist/templates/cc-native/_cc-native/lib-ts/agent-selection.ts +163 -0
  210. package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +6 -14
  211. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/format.ts +597 -599
  212. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/index.ts +26 -26
  213. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/tracker.ts +106 -107
  214. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/write.ts +118 -119
  215. package/dist/templates/cc-native/_cc-native/lib-ts/artifacts.ts +21 -0
  216. package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +17 -16
  217. package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +132 -10
  218. package/dist/templates/cc-native/_cc-native/lib-ts/config.ts +1 -1
  219. package/dist/templates/cc-native/_cc-native/lib-ts/constants.ts +6 -6
  220. package/dist/templates/cc-native/_cc-native/lib-ts/corroboration.ts +119 -0
  221. package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +2 -3
  222. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/graduation.ts +132 -132
  223. package/dist/templates/cc-native/_cc-native/lib-ts/index.ts +88 -86
  224. package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +5 -6
  225. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/orchestrator.ts +70 -70
  226. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/output-builder.ts +130 -121
  227. package/dist/templates/cc-native/_cc-native/lib-ts/package-lock.json +1679 -0
  228. package/dist/templates/cc-native/_cc-native/lib-ts/package.json +24 -0
  229. package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +5 -5
  230. package/dist/templates/cc-native/_cc-native/lib-ts/plan-enhancement.ts +1 -6
  231. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/plan-questions.ts +101 -101
  232. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/review-pipeline.ts +511 -543
  233. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/__tests__/agent-providers.test.ts +262 -0
  234. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/agent.ts +71 -85
  235. package/dist/templates/{_shared/lib-ts/agent-exec → cc-native/_cc-native/lib-ts/reviewers/base}/base-agent.ts +138 -150
  236. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/index.ts +12 -12
  237. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/claude-agent.ts +66 -57
  238. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/codex-agent.ts +185 -200
  239. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/gemini-agent.ts +39 -40
  240. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/orchestrator-claude-agent.ts +196 -225
  241. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/schemas.ts +201 -201
  242. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/types.ts +21 -23
  243. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/__tests__/hyde.test.ts +365 -0
  244. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/__tests__/ollama-client.test.ts +223 -0
  245. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/embedding-indexer.ts +12 -16
  246. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/hyde.ts +3 -2
  247. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/index.ts +31 -31
  248. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +7 -8
  249. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/ollama-client.ts +7 -9
  250. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +16 -19
  251. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-indexer.ts +37 -41
  252. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-loader.ts +33 -43
  253. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-searcher.ts +20 -20
  254. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +9 -10
  255. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/vector-store.ts +3 -4
  256. package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +50 -126
  257. package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +20 -22
  258. package/dist/templates/cc-native/_cc-native/lib-ts/tsconfig.json +2 -2
  259. package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +14 -89
  260. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/verdict.ts +72 -72
  261. package/dist/templates/cc-native/_cc-native/plan-review/CLAUDE.md +38 -1
  262. package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/agent-selection.test.ts +345 -0
  263. package/dist/templates/cc-native/_cc-native/plan-review/lib/__tests__/preflight.test.ts +344 -0
  264. package/dist/templates/cc-native/_cc-native/plan-review/lib/agent-selection.ts +38 -16
  265. package/dist/templates/cc-native/_cc-native/plan-review/lib/preflight.ts +56 -26
  266. package/dist/templates/cc-native/_cc-native/scripts/council_debate.ts +242 -0
  267. package/dist/templates/cc-native/_cc-native/scripts/council_debate_simple.ts +294 -0
  268. package/dist/templates/cc-native/_cc-native/{plan-review/workflows → workflows}/specdev.md +9 -9
  269. package/dist/templates/core/.claude/skills/codex/SKILL.md +25 -0
  270. package/dist/templates/core/.claude/skills/devin/SKILL.md +25 -0
  271. package/dist/templates/core/.claude/skills/handoff/SKILL.md +11 -0
  272. package/dist/templates/core/.claude/skills/handoff-resume/SKILL.md +11 -0
  273. package/dist/templates/core/.claude/skills/meta-plan/SKILL.md +13 -0
  274. package/dist/templates/core/.codex/skills/codex/SKILL.md +13 -0
  275. package/dist/templates/core/.codex/skills/devin/SKILL.md +19 -0
  276. package/dist/templates/core/.codex/skills/handoff/SKILL.md +11 -0
  277. package/dist/templates/core/.codex/skills/handoff-resume/SKILL.md +11 -0
  278. package/dist/templates/core/.codex/skills/meta-plan/SKILL.md +13 -0
  279. package/dist/templates/core/.devin/AGENTS.md +5 -0
  280. package/dist/templates/core/.devin/config.json +12 -0
  281. package/dist/templates/core/.devin/skills/codex/SKILL.md +19 -0
  282. package/dist/templates/core/.devin/skills/devin/SKILL.md +13 -0
  283. package/dist/templates/core/.devin/skills/handoff/SKILL.md +11 -0
  284. package/dist/templates/core/.devin/skills/handoff-resume/SKILL.md +11 -0
  285. package/dist/templates/core/.devin/skills/meta-plan/SKILL.md +13 -0
  286. package/dist/templates/core/.windsurf/workflows/handoff-resume.md +9 -0
  287. package/dist/templates/{_shared → core}/.windsurf/workflows/handoff.md +1 -1
  288. package/dist/templates/{_shared → core}/.windsurf/workflows/meta-plan.md +1 -1
  289. package/dist/templates/core/hooks-ts/_utils/git-state.ts +2 -0
  290. package/dist/templates/{_shared → core}/hooks-ts/archive_plan.ts +15 -44
  291. package/dist/templates/core/hooks-ts/codex_explorer.ts +160 -0
  292. package/dist/templates/{_shared → core}/hooks-ts/context_monitor.ts +23 -55
  293. package/dist/templates/{_shared → core}/hooks-ts/file-suggestion.ts +5 -22
  294. package/dist/templates/{_shared → core}/hooks-ts/lint_after_edit.ts +7 -9
  295. package/dist/templates/core/hooks-ts/pre_compact.ts +36 -0
  296. package/dist/templates/{_shared → core}/hooks-ts/session_end.ts +38 -78
  297. package/dist/templates/{_shared → core}/hooks-ts/session_start.ts +5 -5
  298. package/dist/templates/core/hooks-ts/task_create_capture.ts +32 -0
  299. package/dist/templates/{_shared → core}/hooks-ts/task_update_capture.ts +9 -24
  300. package/dist/templates/core/hooks-ts/user_prompt_submit.ts +46 -0
  301. package/dist/templates/{_shared → core}/lib-ts/CLAUDE.md +27 -16
  302. package/dist/templates/{_shared → core}/lib-ts/context/CLAUDE.md +9 -6
  303. package/dist/templates/{_shared → core}/lib-ts/context/context-formatter.ts +16 -21
  304. package/dist/templates/{_shared → core}/lib-ts/context/context-selector.ts +8 -6
  305. package/dist/templates/{_shared → core}/lib-ts/context/context-store.ts +59 -20
  306. package/dist/templates/{_shared → core}/lib-ts/context/plan-manager.ts +19 -15
  307. package/dist/templates/{_shared → core}/lib-ts/context/task-tracker.ts +3 -3
  308. package/dist/templates/core/lib-ts/hooks/context-monitor-logic.ts +32 -0
  309. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/hooks}/hook-utils.ts +179 -41
  310. package/dist/templates/core/lib-ts/hooks/prompt-binding-logic.ts +80 -0
  311. package/dist/templates/core/lib-ts/hooks/session-end-logic.ts +82 -0
  312. package/dist/templates/core/lib-ts/package.json +19 -0
  313. package/dist/templates/core/lib-ts/runtime/agent-launcher.ts +369 -0
  314. package/dist/templates/core/lib-ts/runtime/aiw-cli.ts +108 -0
  315. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/atomic-write.ts +12 -7
  316. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/cli-args.ts +24 -8
  317. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/constants.ts +326 -324
  318. package/dist/templates/core/lib-ts/runtime/executable-policy.ts +89 -0
  319. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/git-state.ts +6 -4
  320. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/inference.ts +60 -23
  321. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/lint-dispatch.ts +25 -23
  322. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/logger.ts +32 -29
  323. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/models.ts +9 -2
  324. package/dist/templates/core/lib-ts/runtime/platform-adapter.ts +33 -0
  325. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/preflight.ts +4 -3
  326. package/dist/templates/core/lib-ts/runtime/sentinel-ipc.ts +91 -0
  327. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/state-io.ts +20 -11
  328. package/dist/templates/core/lib-ts/runtime/stop-words.ts +185 -0
  329. package/dist/templates/core/lib-ts/runtime/subprocess-utils.ts +147 -0
  330. package/dist/templates/core/lib-ts/runtime/tmux-preflight.ts +93 -0
  331. package/dist/templates/{_shared/lib-ts/base → core/lib-ts/runtime}/utils.ts +34 -4
  332. package/dist/templates/core/lib-ts/schemas.ts +233 -0
  333. package/dist/templates/{_shared → core}/lib-ts/templates/formatters.ts +7 -5
  334. package/dist/templates/{_shared → core}/lib-ts/templates/plan-context.ts +2 -1
  335. package/dist/templates/{_shared → core}/lib-ts/tsconfig.json +3 -1
  336. package/dist/templates/{_shared → core}/lib-ts/types.ts +78 -77
  337. package/dist/templates/core/scripts/resolve-run.ts +93 -0
  338. package/dist/templates/{_shared → core}/scripts/resolve_context.ts +3 -3
  339. package/dist/templates/{_shared → core}/scripts/status_line.ts +26 -21
  340. package/dist/templates/core/skills/codex/CLAUDE.md +83 -0
  341. package/dist/templates/{_shared → core}/skills/codex/SKILL.md +27 -18
  342. package/dist/templates/{_shared → core}/skills/codex/lib/codex-watcher.ts +79 -113
  343. package/dist/templates/{_shared → core}/skills/codex/scripts/launch-codex.ts +134 -148
  344. package/dist/templates/{_shared → core}/skills/codex/scripts/watch-codex.ts +6 -4
  345. package/dist/templates/core/skills/devin/CLAUDE.md +122 -0
  346. package/dist/templates/core/skills/devin/SKILL.md +73 -0
  347. package/dist/templates/core/skills/devin/lib/devin-watcher.ts +300 -0
  348. package/dist/templates/core/skills/devin/scripts/launch-devin.ts +258 -0
  349. package/dist/templates/{_shared → core}/skills/handoff-system/CLAUDE.md +436 -433
  350. package/dist/templates/{_shared → core}/skills/handoff-system/lib/document-generator.ts +9 -7
  351. package/dist/templates/{_shared → core}/skills/handoff-system/lib/handoff-reader.ts +6 -4
  352. package/dist/templates/{_shared → core}/skills/handoff-system/scripts/resume_handoff.ts +10 -8
  353. package/dist/templates/{_shared → core}/skills/handoff-system/scripts/save_handoff.ts +12 -10
  354. package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff-resume.md +2 -2
  355. package/dist/templates/{_shared → core}/skills/handoff-system/workflows/handoff.md +6 -5
  356. package/dist/templates/{_shared → core}/skills/meta-plan/CLAUDE.md +2 -1
  357. package/dist/templates/{_shared → core}/skills/meta-plan/workflows/meta-plan.md +8 -7
  358. package/oclif.manifest.json +89 -13
  359. package/package.json +13 -12
  360. package/dist/lib/base-command.d.ts +0 -114
  361. package/dist/lib/base-command.js +0 -153
  362. package/dist/lib/env-compat.d.ts +0 -18
  363. package/dist/lib/env-compat.js +0 -23
  364. package/dist/lib/stdin.d.ts +0 -48
  365. package/dist/lib/stdin.js +0 -60
  366. package/dist/templates/_shared/.claude/settings.json +0 -120
  367. package/dist/templates/_shared/.claude/skills/codex/SKILL.md +0 -35
  368. package/dist/templates/_shared/.claude/skills/handoff/SKILL.md +0 -13
  369. package/dist/templates/_shared/.claude/skills/handoff-resume/SKILL.md +0 -13
  370. package/dist/templates/_shared/.claude/skills/meta-plan/SKILL.md +0 -43
  371. package/dist/templates/_shared/.codex/workflows/codex.md +0 -11
  372. package/dist/templates/_shared/.codex/workflows/handoff.md +0 -226
  373. package/dist/templates/_shared/.codex/workflows/meta-plan.md +0 -347
  374. package/dist/templates/_shared/hooks-ts/_utils/git-state.ts +0 -2
  375. package/dist/templates/_shared/hooks-ts/pre_compact.ts +0 -49
  376. package/dist/templates/_shared/hooks-ts/task_create_capture.ts +0 -48
  377. package/dist/templates/_shared/hooks-ts/user_prompt_submit.ts +0 -93
  378. package/dist/templates/_shared/lib-ts/agent-exec/backends/headless.ts +0 -33
  379. package/dist/templates/_shared/lib-ts/agent-exec/backends/index.ts +0 -6
  380. package/dist/templates/_shared/lib-ts/agent-exec/backends/tmux.ts +0 -119
  381. package/dist/templates/_shared/lib-ts/agent-exec/execution-backend.ts +0 -50
  382. package/dist/templates/_shared/lib-ts/agent-exec/index.ts +0 -6
  383. package/dist/templates/_shared/lib-ts/agent-exec/structured-output.ts +0 -166
  384. package/dist/templates/_shared/lib-ts/base/launchers/tmux-launcher.ts +0 -173
  385. package/dist/templates/_shared/lib-ts/base/launchers/window-launcher.ts +0 -93
  386. package/dist/templates/_shared/lib-ts/base/launchers/wt-launcher.ts +0 -64
  387. package/dist/templates/_shared/lib-ts/base/pane-launcher.ts +0 -55
  388. package/dist/templates/_shared/lib-ts/base/sentinel-ipc.ts +0 -87
  389. package/dist/templates/_shared/lib-ts/base/stop-words.ts +0 -184
  390. package/dist/templates/_shared/lib-ts/base/subprocess-utils.ts +0 -249
  391. package/dist/templates/_shared/lib-ts/base/tmux-driver.ts +0 -341
  392. package/dist/templates/_shared/lib-ts/base/tmux-pane-placement.ts +0 -78
  393. package/dist/templates/_shared/lib-ts/package.json +0 -20
  394. package/dist/templates/_shared/scripts/resolve-run.ts +0 -62
  395. package/dist/templates/_shared/skills/codex/CLAUDE.md +0 -70
  396. package/dist/templates/cc-native/_cc-native/CLAUDE.md +0 -73
  397. package/dist/templates/cc-native/_cc-native/artifacts/CLAUDE.md +0 -64
  398. package/dist/templates/cc-native/_cc-native/lib-ts/CLAUDE.md +0 -70
  399. package/dist/templates/cc-native/_cc-native/plan-review/CODING-STANDARDS-CHECKLIST.md +0 -75
  400. package/dist/templates/cc-native/_cc-native/plan-review/agents/CLAUDE.md +0 -143
  401. package/dist/templates/cc-native/_cc-native/plan-review/agents/PLAN-ORCHESTRATOR.md +0 -213
  402. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-questions/PLAN-QUESTIONER.md +0 -70
  403. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-EVOLUTION.md +0 -62
  404. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-PATTERNS.md +0 -61
  405. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-STRUCTURE.md +0 -62
  406. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ASSUMPTION-TRACER.md +0 -56
  407. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CLARITY-AUDITOR.md +0 -53
  408. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-FEASIBILITY.md +0 -66
  409. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-GAPS.md +0 -70
  410. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-ORDERING.md +0 -62
  411. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CONSTRAINT-VALIDATOR.md +0 -72
  412. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-ADR-VALIDATOR.md +0 -61
  413. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-SCALE-MATCHER.md +0 -64
  414. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DEVILS-ADVOCATE.md +0 -56
  415. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DOCUMENTATION-PHILOSOPHY.md +0 -86
  416. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HANDOFF-READINESS.md +0 -59
  417. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HIDDEN-COMPLEXITY.md +0 -58
  418. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/INCREMENTAL-DELIVERY.md +0 -66
  419. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-DEPENDENCY.md +0 -62
  420. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-FMEA.md +0 -66
  421. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-PREMORTEM.md +0 -71
  422. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-REVERSIBILITY.md +0 -74
  423. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SCOPE-BOUNDARY.md +0 -77
  424. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SIMPLICITY-GUARDIAN.md +0 -62
  425. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SKEPTIC.md +0 -68
  426. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-BEHAVIOR-AUDITOR.md +0 -61
  427. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-CHARACTERIZATION.md +0 -71
  428. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-FIRST-VALIDATOR.md +0 -61
  429. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-PYRAMID-ANALYZER.md +0 -61
  430. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-COSTS.md +0 -67
  431. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-STAKEHOLDERS.md +0 -65
  432. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-COVERAGE.md +0 -74
  433. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-STRENGTH.md +0 -69
  434. package/dist/templates/cc-native/_cc-native/plan-review/lib/corroboration.ts +0 -172
  435. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/base/base-agent.ts +0 -7
@@ -0,0 +1,11 @@
1
+ ---
2
+ name: handoff-resume
3
+ description: Resume session from a handoff document. USE WHEN resume handoff OR continue from handoff OR restore session context OR pick up where we left off.
4
+ user-invocable: true
5
+ ---
6
+
7
+ # Handoff Resume
8
+
9
+ Load and execute the handoff resume workflow from `.aiwcli/_core/skills/handoff-system/workflows/handoff-resume.md`.
10
+
11
+ **Triggers:** "/handoff-resume", "resume handoff", "continue from handoff", "restore session", "pick up where we left off"
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: meta-plan
3
+ description: Prompt amplifier for complex problems. USE WHEN meta-plan OR chain reasoning OR dissect problem OR help me figure out the right approach.
4
+ user-invocable: true
5
+ ---
6
+
7
+ # MetaPlan -- Prompt Amplifier
8
+
9
+ Load and engage with the reasoning framework at `.aiwcli/_core/skills/meta-plan/workflows/meta-plan.md`. Apply each category as a lens for deeper analysis -- not as steps to execute.
10
+
11
+ **Triggers:** "meta-plan", "chain reasoning", "dissect problem", "help me figure out the right approach"
12
+
13
+ **Produces:** An amplified request document (problem decomposition, approaches, trade-offs, risks, recommendation). Does NOT produce implementation steps -- those are the next session's job.
@@ -0,0 +1,5 @@
1
+ # Devin Notes
2
+
3
+ On Windows, keep any filesystem paths that appear in `.devin` config text or agent instructions in forward-slash form when they are meant to be read by Devin.
4
+
5
+ Reason: raw backslash paths like `C:\tmp\foo.txt` are easy for the runtime to preserve but easy for the model-side parser to misread or de-escape. Use `C:/tmp/foo.txt` in human-readable instructions; keep native Windows paths only where a shell or PowerShell command is actually executing them.
@@ -0,0 +1,12 @@
1
+ {
2
+ "permissions": {
3
+ "allow": ["read", "edit", "grep", "glob", "exec", "mcp__*"],
4
+ "deny": [],
5
+ "ask": []
6
+ },
7
+ "read_config_from": {
8
+ "cursor": true,
9
+ "windsurf": true,
10
+ "claude": true
11
+ }
12
+ }
@@ -0,0 +1,19 @@
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
+
7
+ # Codex Workflow
8
+
9
+ Delegate work to a Codex sub-agent. The launch script handles prompt construction internally — you just run the command and pass the mode/flags.
10
+
11
+ **IMPORTANT:** Never include the launch command path, script path, or any `.aiwcli/` internal paths in the delegation prompt or inline text arguments. The script constructs Codex's prompt internally. Leaking internal paths into the prompt causes Codex to recurse.
12
+
13
+ ## Command
14
+
15
+ `bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/codex/scripts/launch-codex.ts [flags] <mode>`
16
+
17
+ **Modes:** `plan` | `--file <path>` | `<inline text...>`
18
+
19
+ **Flags:** `--model <name>`, `--sandbox <mode>`, `--context <id>`, `--prompt <text>`, `--no-yolo`, `--no-watch`
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: devin
3
+ description: "Self-reference guard: you ARE Devin. Do not invoke this skill."
4
+ user-invocable: false
5
+ ---
6
+
7
+ # Devin (Self-Reference Guard)
8
+
9
+ **You are already running as Devin.** Do not attempt to launch another Devin instance.
10
+
11
+ If asked to delegate work to Devin, you should perform the work directly — you are the Devin agent.
12
+
13
+ To delegate to a *different* agent, use the codex skill instead.
@@ -0,0 +1,11 @@
1
+ ---
2
+ name: handoff
3
+ description: Create handoff document to preserve session context for future sessions. USE WHEN handoff OR write a handoff OR create session summary OR document what we did OR end session with notes.
4
+ user-invocable: true
5
+ ---
6
+
7
+ # Handoff
8
+
9
+ Load and execute the handoff workflow from `.aiwcli/_core/skills/handoff-system/workflows/handoff.md`.
10
+
11
+ **Triggers:** "/handoff", "write a handoff", "create a session summary", "document what we did", "end session with notes"
@@ -0,0 +1,11 @@
1
+ ---
2
+ name: handoff-resume
3
+ description: Resume session from a handoff document. USE WHEN resume handoff OR continue from handoff OR restore session context OR pick up where we left off.
4
+ user-invocable: true
5
+ ---
6
+
7
+ # Handoff Resume
8
+
9
+ Load and execute the handoff resume workflow from `.aiwcli/_core/skills/handoff-system/workflows/handoff-resume.md`.
10
+
11
+ **Triggers:** "/handoff-resume", "resume handoff", "continue from handoff", "restore session", "pick up where we left off"
@@ -0,0 +1,13 @@
1
+ ---
2
+ name: meta-plan
3
+ description: Prompt amplifier for complex problems. USE WHEN meta-plan OR chain reasoning OR dissect problem OR help me figure out the right approach.
4
+ user-invocable: true
5
+ ---
6
+
7
+ # MetaPlan -- Prompt Amplifier
8
+
9
+ Load and engage with the reasoning framework at `.aiwcli/_core/skills/meta-plan/workflows/meta-plan.md`. Apply each category as a lens for deeper analysis -- not as steps to execute.
10
+
11
+ **Triggers:** "meta-plan", "chain reasoning", "dissect problem", "help me figure out the right approach"
12
+
13
+ **Produces:** An amplified request document (problem decomposition, approaches, trade-offs, risks, recommendation). Does NOT produce implementation steps -- those are the next session's job.
@@ -0,0 +1,9 @@
1
+ ---
2
+ description: Resume session from a handoff document
3
+ ---
4
+
5
+ # Handoff Resume
6
+
7
+ Load and execute the handoff resume workflow from `.aiwcli/_core/skills/handoff-system/workflows/handoff-resume.md`.
8
+
9
+ **Triggers:** "/handoff-resume", "resume handoff", "continue from handoff", "restore session", "pick up where we left off"
@@ -4,6 +4,6 @@ description: Create handoff document to preserve session context for future sess
4
4
 
5
5
  # Handoff
6
6
 
7
- Load and execute the handoff workflow from `.aiwcli/_shared/skills/handoff-system/workflows/handoff.md`.
7
+ Load and execute the handoff workflow from `.aiwcli/_core/skills/handoff-system/workflows/handoff.md`.
8
8
 
9
9
  **Triggers:** "/handoff", "write a handoff", "create a session summary", "document what we did", "end session with notes"
@@ -4,7 +4,7 @@ description: Prompt amplifier for complex problems — analyzes a request throug
4
4
 
5
5
  # MetaPlan — Prompt Amplifier
6
6
 
7
- Load and engage with the reasoning framework at `.aiwcli/_shared/skills/meta-plan/workflows/meta-plan.md`. Apply each category as a lens for deeper analysis — not as steps to execute.
7
+ Load and engage with the reasoning framework at `.aiwcli/_core/skills/meta-plan/workflows/meta-plan.md`. Apply each category as a lens for deeper analysis — not as steps to execute.
8
8
 
9
9
  **Triggers:** "meta-plan", "chain reasoning", "dissect problem", "help me figure out the right approach"
10
10
 
@@ -0,0 +1,2 @@
1
+ // Re-export from shared library — canonical location is lib-ts/runtime/git-state.ts
2
+ export { getGitState } from "../../lib-ts/runtime/git-state.js";
@@ -6,42 +6,21 @@
6
6
  */
7
7
  import * as fs from "node:fs";
8
8
  import * as os from "node:os";
9
- import * as path from "node:path";
9
+ import path from "node:path";
10
10
 
11
- import { getContextDir, getProjectRoot } from "../lib-ts/base/constants.js";
12
- import {
13
- loadHookInput, logDebug, logError, logInfo, logWarn, runHookAsync,
14
- } from "../lib-ts/base/hook-utils.js";
15
- import { getContextBySessionId } from "../lib-ts/context/context-store.js";
16
11
  import {
17
12
  archivePlan, extractPlanPathFromResult, findPlanPathInTranscript,
18
13
  } from "../lib-ts/context/plan-manager.js";
19
-
20
- /** Find the most recent .md file in a directory */
21
- function mostRecentMd(dir: string): null | string {
22
- try {
23
- if (!fs.existsSync(dir)) return null;
24
- const entries = fs.readdirSync(dir, { withFileTypes: true });
25
- let best: null | { mtime: number; path: string; } = null;
26
- for (const e of entries) {
27
- if (!e.isFile() || !e.name.endsWith(".md")) continue;
28
- const fullPath = path.join(dir, e.name);
29
- const stat = fs.statSync(fullPath);
30
- if (!best || stat.mtimeMs > best.mtime) {
31
- best = { path: fullPath, mtime: stat.mtimeMs };
32
- }
33
- }
34
-
35
- return best?.path ?? null;
36
- } catch {
37
- return null;
38
- }
39
- }
14
+ import {
15
+ loadHookInput, logDebug, logError, logInfo, logWarn, requireBoundSession, runHookAsync,
16
+ } from "../lib-ts/hooks/hook-utils.js";
17
+ import { getContextDir } from "../lib-ts/runtime/constants.js";
18
+ import { mostRecentMd } from "../lib-ts/runtime/utils.js";
40
19
 
41
20
  /** Multi-strategy plan path discovery */
42
- function findPlanPath(payload: Record<string, any>, projectRoot: string): null | string {
21
+ function findPlanPath(payload: Record<string, unknown>, projectRoot: string): null | string {
43
22
  const toolResult = payload.tool_result as string | undefined;
44
- const toolInput = (payload.tool_input ?? {}) as Record<string, any>;
23
+ const toolInput = (payload.tool_input ?? {}) as Record<string, unknown>;
45
24
  const transcriptPath = payload.transcript_path as string | undefined;
46
25
 
47
26
  // Strategy 1: Extract from tool result
@@ -100,20 +79,17 @@ async function asyncMain(): Promise<void> {
100
79
  }
101
80
 
102
81
  // Check stop flag
103
- if ((payload as any).stop_hook_active) {
82
+ if ((payload as unknown).stop_hook_active) {
104
83
  logDebug("archive_plan", "stop_hook_active set, skipping");
105
84
  return;
106
85
  }
107
86
 
108
- const projectRoot = getProjectRoot(payload.cwd);
109
- const sessionId = payload.session_id;
110
- if (!sessionId) {
111
- logWarn("archive_plan", "No session_id");
112
- return;
113
- }
87
+ const bound = requireBoundSession("archive_plan", payload);
88
+ if (!bound) return;
89
+ const { projectRoot, state } = bound;
114
90
 
115
91
  // Find plan path
116
- let planPath = findPlanPath(payload as Record<string, any>, projectRoot);
92
+ let planPath = findPlanPath(payload as Record<string, unknown>, projectRoot);
117
93
  if (!planPath) {
118
94
  logWarn("archive_plan", "Could not locate plan file");
119
95
  return;
@@ -130,13 +106,6 @@ async function asyncMain(): Promise<void> {
130
106
  return;
131
107
  }
132
108
 
133
- // Find bound context
134
- const state = getContextBySessionId(sessionId, projectRoot);
135
- if (!state) {
136
- logWarn("archive_plan", `No context bound to session ${sessionId}`);
137
- return;
138
- }
139
-
140
109
  // Archive the plan (async — uses AI for slug generation)
141
110
  const [archivedPath, planHash, _planSignature] = await archivePlan(planPath, state.id, projectRoot);
142
111
 
@@ -157,3 +126,5 @@ async function asyncMain(): Promise<void> {
157
126
  }
158
127
 
159
128
  runHookAsync(asyncMain, "archive_plan");
129
+
130
+
@@ -0,0 +1,160 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * UserPromptSubmit hook: One-shot Codex codebase exploration for first plan-mode prompt.
4
+ */
5
+ import * as fs from "node:fs";
6
+ import * as path from "node:path";
7
+
8
+ import {
9
+ emitContext, loadHookInput, logDebug, logInfo, logWarn, runHookAsync,
10
+ } from "../lib-ts/hooks/hook-utils.js";
11
+ import { getOutputDir, getProjectRoot } from "../lib-ts/runtime/constants.js";
12
+ import { codexInferAsync } from "../lib-ts/runtime/inference.js";
13
+ import { CODEX_MODELS } from "../lib-ts/runtime/models.js";
14
+
15
+ const MAX_PROMPT_CHARS = 8000;
16
+ const SPARK_TIMEOUT_SECONDS = 50;
17
+ const FIRED_FILENAME = ".codex-explorer-fired";
18
+ const MAX_FIRED_LINES = 200;
19
+ const PRUNE_KEEP = 100;
20
+
21
+ function getCacheFilePath(projectRoot: string): string {
22
+ return path.join(getOutputDir(projectRoot), FIRED_FILENAME);
23
+ }
24
+
25
+ function hasSessionFired(sessionId: string, projectRoot: string): boolean {
26
+ const filePath = getCacheFilePath(projectRoot);
27
+ try {
28
+ const content = fs.readFileSync(filePath, "utf8");
29
+ return content.split("\n").includes(sessionId);
30
+ } catch {
31
+ return false;
32
+ }
33
+ }
34
+
35
+ function markSessionFired(sessionId: string, projectRoot: string): void {
36
+ const filePath = getCacheFilePath(projectRoot);
37
+ const outputDir = getOutputDir(projectRoot);
38
+
39
+ if (!fs.existsSync(outputDir)) {
40
+ fs.mkdirSync(outputDir, { recursive: true });
41
+ }
42
+
43
+ fs.appendFileSync(filePath, sessionId + "\n");
44
+
45
+ // Prune if over limit
46
+ try {
47
+ const content = fs.readFileSync(filePath, "utf8");
48
+ const lines = content.split("\n").filter(Boolean);
49
+ if (lines.length > MAX_FIRED_LINES) {
50
+ const pruned = lines.slice(lines.length - PRUNE_KEEP);
51
+ fs.writeFileSync(filePath, pruned.join("\n") + "\n");
52
+ logDebug("codex_explorer", `Pruned fired cache from ${lines.length} to ${pruned.length} entries`);
53
+ }
54
+ } catch (error) {
55
+ logWarn("codex_explorer", `Failed to prune fired cache: ${error}`);
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Parse Codex JSONL output into clean agent message text.
61
+ * Codex --json returns streaming events; we extract only agent_message text.
62
+ */
63
+ function parseCodexOutput(raw: string): string {
64
+ const lines = raw.split("\n").filter(Boolean);
65
+ const parts: string[] = [];
66
+ for (const line of lines) {
67
+ try {
68
+ const event = JSON.parse(line);
69
+ if (event.type !== "item.completed") continue;
70
+ const item = event.item;
71
+ if (item?.type === "agent_message" && item.text) {
72
+ parts.push(item.text);
73
+ }
74
+ } catch { /* skip non-JSON lines */ }
75
+ }
76
+ return parts.join("\n\n") || raw;
77
+ }
78
+
79
+ function buildExplorerPrompt(userPrompt: string): string {
80
+ const trimmed = userPrompt.trim();
81
+ const clipped = trimmed.length > MAX_PROMPT_CHARS
82
+ ? `${trimmed.slice(0, MAX_PROMPT_CHARS)}...`
83
+ : trimmed;
84
+
85
+ return [
86
+ "You are a codebase explorer.",
87
+ "The user is starting planning work in plan mode.",
88
+ "Search the current repository and identify the most relevant files, patterns, and types.",
89
+ "",
90
+ "Focus on:",
91
+ "- Files likely to require changes",
92
+ "- Existing utilities/helpers that match the request",
93
+ "- Key functions, classes, types, and interfaces",
94
+ "- Relevant tests and configuration files",
95
+ "",
96
+ "Return a concise report (maximum ~2000 characters).",
97
+ "Do not suggest implementation steps. Only report what exists and where.",
98
+ "",
99
+ "User prompt:",
100
+ "---",
101
+ clipped,
102
+ "---",
103
+ ].join("\n");
104
+ }
105
+
106
+ async function main(): Promise<void> {
107
+ const payload = loadHookInput();
108
+ if (!payload) return;
109
+
110
+ const permissionMode = payload.permission_mode ?? "";
111
+ if (permissionMode !== "plan") {
112
+ logDebug("codex_explorer", `Skip: permission_mode=${permissionMode || "none"}`);
113
+ return;
114
+ }
115
+
116
+ const prompt = (payload as unknown as { prompt?: string }).prompt?.trim() ?? "";
117
+ if (!prompt) {
118
+ logDebug("codex_explorer", "Skip: no prompt");
119
+ return;
120
+ }
121
+
122
+ const sessionId = payload.session_id;
123
+ if (!sessionId) {
124
+ logDebug("codex_explorer", "Skip: no session_id");
125
+ return;
126
+ }
127
+
128
+ const projectRoot = getProjectRoot(payload.cwd);
129
+
130
+ if (hasSessionFired(sessionId, projectRoot)) {
131
+ logDebug("codex_explorer", `Skip: already fired for session ${sessionId}`);
132
+ return;
133
+ }
134
+
135
+ const startedAt = Date.now();
136
+ const explorerPrompt = buildExplorerPrompt(prompt);
137
+ const result = await codexInferAsync(
138
+ explorerPrompt,
139
+ CODEX_MODELS.spark,
140
+ { sandbox: "read-only", timeout: SPARK_TIMEOUT_SECONDS },
141
+ );
142
+ const elapsedMs = Date.now() - startedAt;
143
+
144
+ if (!result.success || !result.output) {
145
+ logWarn(
146
+ "codex_explorer",
147
+ `Explorer inference failed after ${elapsedMs}ms: ${result.error ?? "empty output"}`,
148
+ );
149
+ return;
150
+ }
151
+
152
+ const cleanOutput = parseCodexOutput(result.output);
153
+ emitContext(cleanOutput);
154
+ logInfo("codex_explorer", `Explorer context emitted in ${elapsedMs}ms`);
155
+
156
+ markSessionFired(sessionId, projectRoot);
157
+ logDebug("codex_explorer", `Marked session ${sessionId} as fired`);
158
+ }
159
+
160
+ runHookAsync(main, "codex_explorer");
@@ -3,53 +3,28 @@
3
3
  * PostToolUse:* hook: Monitor context window usage, trigger mode transitions,
4
4
  * and progressive-save state when context runs low.
5
5
  */
6
- import { getProjectRoot } from "../lib-ts/base/constants.js";
6
+ import { getContextBySessionId, saveState } from "../lib-ts/context/context-store.js";
7
+ import { selectWarningMessage } from "../lib-ts/hooks/context-monitor-logic.js";
7
8
  import {
8
9
  emitContext, getContextPercentRemaining, hookLog,
9
- loadHookInput,
10
- logDebug, logDiagnostic, logInfo, logWarn, runHook,
11
- } from "../lib-ts/base/hook-utils.js";
12
- import { nowIso } from "../lib-ts/base/utils.js";
13
- import { getContextBySessionId, maybeActivate, saveState } from "../lib-ts/context/context-store.js";
10
+ requireBoundSession, logDebug, logDiagnostic, logInfo, runHook, safeMaybeActivate,
11
+ } from "../lib-ts/hooks/hook-utils.js";
12
+ import { nowIso } from "../lib-ts/runtime/utils.js";
14
13
  import type { ContextState } from "../lib-ts/types.js";
15
14
 
16
15
  const WRITE_TOOLS = new Set(["Bash", "Edit", "NotebookEdit", "Write"]);
17
16
 
18
17
  const SAVE_STATE_THRESHOLD = 60;
19
18
 
20
- const CONTEXT_WARNING_30 = "## Context Window: ~30% Remaining\n\n" +
21
- "This session is approaching its context limit. Consider:\n\n" +
22
- "- Completing your current task, then pausing for the user to decide next steps\n" +
23
- "- If significant work remains, mention that `/aiwcli-shared:handoff` can capture progress " +
24
- "for a fresh session\n\n" +
25
- "Do not rush or cut corners — finish the current task properly. " +
26
- "Just be aware that starting large new tasks may not complete before context runs out.";
27
-
28
- const CONTEXT_WARNING_15 = "## Context Window: ~15% Remaining — Wrap Up Now\n\n" +
29
- "Context is critically low. After completing your current step:\n\n" +
30
- "1. **Stop taking on new work**\n" +
31
- "2. Summarize what was accomplished and what remains\n" +
32
- "3. Offer to run `/aiwcli-shared:handoff` so progress transfers to a fresh session\n\n" +
33
- "Do not start new multi-step tasks. Focus on clean closure.";
34
-
35
- const WARNING_THRESHOLDS = [
36
- { pct: 15, msg: CONTEXT_WARNING_15 }, // Most urgent first
37
- { pct: 30, msg: CONTEXT_WARNING_30 },
38
- ];
39
-
40
- /** Transition idle/has_plan → active when implementation tools are used. */
19
+ /** Transition idle/has_staged_work active when implementation tools are used. */
41
20
  function checkAndTransitionMode(
42
- state: ContextState,
21
+ stateId: string,
43
22
  toolName: string | undefined,
44
23
  permissionMode: string,
45
24
  projectRoot: string,
46
25
  ): void {
47
26
  if (!toolName || !WRITE_TOOLS.has(toolName)) return;
48
- try {
49
- maybeActivate(state.id, permissionMode, projectRoot, "context_monitor");
50
- } catch (error) {
51
- logWarn("context_monitor", `maybeActivate failed (non-critical): ${error}`);
52
- }
27
+ safeMaybeActivate(stateId, permissionMode, projectRoot, "context_monitor");
53
28
  }
54
29
 
55
30
  /** Save state snapshot at SAVE_STATE_THRESHOLD. */
@@ -82,38 +57,31 @@ function checkContextWarnings(
82
57
  state.last_session = {};
83
58
  }
84
59
  const fired = state.last_session.context_warnings_fired ?? [];
85
-
86
- for (const { pct, msg } of WARNING_THRESHOLDS) {
87
- if (pctRemaining <= pct && !fired.includes(pct)) {
88
- emitContext(msg);
89
- state.last_session.context_warnings_fired = [...fired, pct];
90
- saveState(state.id, state, projectRoot);
91
- logInfo("context_monitor", `Context warning emitted at ${pct}% threshold`);
92
- return; // One warning per tool call — most urgent fires first
93
- }
94
- }
60
+ const warning = selectWarningMessage(pctRemaining, fired);
61
+ if (!warning) return;
62
+
63
+ emitContext(warning.msg);
64
+ state.last_session.context_warnings_fired = [...fired, warning.pct];
65
+ saveState(state.id, state, projectRoot);
66
+ logInfo(
67
+ "context_monitor",
68
+ `Context warning emitted at ${warning.pct}% threshold`,
69
+ );
95
70
  }
96
71
 
97
72
  function main(): void {
98
- const payload = loadHookInput();
99
- if (!payload) return;
73
+ const bound = requireBoundSession("context_monitor");
74
+ if (!bound) return;
100
75
 
101
- const sessionId = payload.session_id;
102
- if (!sessionId) return;
103
-
104
- const projectRoot = getProjectRoot(payload.cwd);
76
+ const { payload, sessionId, projectRoot } = bound;
105
77
  const permissionMode = payload.permission_mode ?? "";
106
78
  const toolName = payload.tool_name;
107
79
 
108
80
  // Initial context lookup
109
- let state = getContextBySessionId(sessionId, projectRoot);
110
- if (!state) {
111
- logDebug("context_monitor", `No context for session ${sessionId}`);
112
- return;
113
- }
81
+ let state = bound.state;
114
82
 
115
83
  // Phase 1: Mode transition for write tools
116
- checkAndTransitionMode(state, toolName, permissionMode, projectRoot);
84
+ checkAndTransitionMode(state.id, toolName, permissionMode, projectRoot);
117
85
 
118
86
  // Phase 2: Context window check (log only, no warnings emitted)
119
87
  const [pctRemaining, tokensUsed, maxTokens] = getContextPercentRemaining(payload);
@@ -4,32 +4,14 @@
4
4
  * Outputs a plain JSON array (NOT hookSpecificOutput).
5
5
  */
6
6
  import * as fs from "node:fs";
7
- import * as path from "node:path";
7
+ import path from "node:path";
8
8
 
9
- import { getContextFilePath, getContextHandoffsDir, getContextPlansDir, getContextReviewsDir, getProjectRoot } from "../lib-ts/base/constants.js";
10
- import { loadHookInput, logDebug, logError, runHook } from "../lib-ts/base/hook-utils.js";
11
9
  import { getAllContexts, getContextBySessionId } from "../lib-ts/context/context-store.js";
10
+ import { loadHookInput, logDebug, logError, runHook } from "../lib-ts/hooks/hook-utils.js";
11
+ import { getContextFilePath, getContextHandoffsDir, getContextPlansDir, getContextReviewsDir, getProjectRoot } from "../lib-ts/runtime/constants.js";
12
+ import { getMdFilesByMtime } from "../lib-ts/runtime/utils.js";
12
13
  import type { ContextState } from "../lib-ts/types.js";
13
14
 
14
- /** Get .md files sorted by mtime descending */
15
- function getMdFilesByMtime(dir: string): string[] {
16
- try {
17
- if (!fs.existsSync(dir)) return [];
18
- const entries = fs.readdirSync(dir, { withFileTypes: true });
19
- const mdFiles = entries
20
- .filter(e => e.isFile() && e.name.endsWith(".md"))
21
- .map(e => {
22
- const fullPath = path.join(dir, e.name);
23
- const stat = fs.statSync(fullPath);
24
- return { path: fullPath, mtime: stat.mtimeMs };
25
- })
26
- .sort((a, b) => b.mtime - a.mtime);
27
- return mdFiles.map(f => f.path);
28
- } catch {
29
- return [];
30
- }
31
- }
32
-
33
15
  /** Find latest folder-based document (subdirectory with index.md) */
34
16
  function getLatestFolderDoc(dir: string): null | string {
35
17
  try {
@@ -128,3 +110,4 @@ function main(): void {
128
110
  }
129
111
 
130
112
  runHook(main, "file-suggestion");
113
+
@@ -3,11 +3,11 @@
3
3
  * PostToolUse:Write|Edit hook: Run linter on edited files, feed errors to Claude.
4
4
  * Uses emitContext() for non-blocking context injection — Claude sees errors and self-corrects.
5
5
  */
6
- import { getProjectRoot } from "../lib-ts/base/constants.js";
7
6
  import {
8
- emitContext, getToolInput, loadHookInput, logDebug, runHook,
9
- } from "../lib-ts/base/hook-utils.js";
10
- import { formatLintErrors, getLinterForFile, runLinter } from "../lib-ts/base/lint-dispatch.js";
7
+ emitContext, logDebug, requireToolInput, runHook,
8
+ } from "../lib-ts/hooks/hook-utils.js";
9
+ import { getProjectRoot } from "../lib-ts/runtime/constants.js";
10
+ import { formatLintErrors, getLinterForFile, runLinter } from "../lib-ts/runtime/lint-dispatch.js";
11
11
 
12
12
  // Extensions with no lint value
13
13
  const SKIP_EXTENSIONS = new Set([
@@ -31,11 +31,9 @@ function shouldSkip(filePath: string): boolean {
31
31
  }
32
32
 
33
33
  function main(): void {
34
- const payload = loadHookInput();
35
- if (!payload) return;
36
-
37
- const toolInput = getToolInput(payload);
38
- if (!toolInput) return;
34
+ const context = requireToolInput("lint_after_edit");
35
+ if (!context) return;
36
+ const { payload, toolInput } = context;
39
37
 
40
38
  const filePath = toolInput.file_path as string | undefined;
41
39
  if (!filePath) return;
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * PreCompact hook: Save state.json snapshot before context compaction.
4
+ * Captures git state and session metadata for recovery.
5
+ */
6
+ import { saveState } from "../lib-ts/context/context-store.js";
7
+ import {
8
+ logError, logInfo, requireBoundSession, runHook,
9
+ } from "../lib-ts/hooks/hook-utils.js";
10
+ import { getGitState } from "../lib-ts/runtime/git-state.js";
11
+ import { nowIso } from "../lib-ts/runtime/utils.js";
12
+
13
+ function main(): void {
14
+ const bound = requireBoundSession("pre_compact");
15
+ if (!bound) return;
16
+ const { sessionId, projectRoot, state } = bound;
17
+
18
+ const gitState = getGitState(projectRoot);
19
+
20
+ state.last_session = {
21
+ ...state.last_session,
22
+ session_id: sessionId,
23
+ saved_at: nowIso(),
24
+ save_reason: "pre_compact",
25
+ git_state: gitState,
26
+ };
27
+
28
+ const [ok, err] = saveState(state.id, state, projectRoot);
29
+ if (ok) {
30
+ logInfo("pre_compact", `Saved pre-compact snapshot for ${state.id}`);
31
+ } else {
32
+ logError("pre_compact", `Failed to save state: ${err}`);
33
+ }
34
+ }
35
+
36
+ runHook(main, "pre_compact");