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,91 @@
1
+ import * as fs from 'node:fs'
2
+ import * as os from 'node:os'
3
+ import path from 'node:path'
4
+
5
+ export interface SentinelIpcPaths {
6
+ tmpDir: string
7
+ inputPath: string
8
+ stdoutPath: string
9
+ stderrPath: string
10
+ sentinelPath: string
11
+ }
12
+
13
+ function sanitizePrefix(prefix: string): string {
14
+ return prefix.replaceAll(/[^a-zA-Z0-9_-]/g, '-')
15
+ }
16
+
17
+ export function createSentinelIpcPaths(prefix: string): SentinelIpcPaths {
18
+ const safePrefix = sanitizePrefix(prefix)
19
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), `${safePrefix}-`))
20
+
21
+ return {
22
+ tmpDir,
23
+ inputPath: path.join(tmpDir, 'input.txt'),
24
+ stdoutPath: path.join(tmpDir, 'stdout.txt'),
25
+ stderrPath: path.join(tmpDir, 'stderr.txt'),
26
+ sentinelPath: path.join(tmpDir, 'sentinel.txt'),
27
+ }
28
+ }
29
+
30
+ export function buildShellCaptureScript(
31
+ command: string,
32
+ paths: Pick<SentinelIpcPaths, 'inputPath' | 'stdoutPath' | 'stderrPath' | 'sentinelPath'>,
33
+ quote: (input: string) => string,
34
+ ): string {
35
+ return [
36
+ command,
37
+ `< ${quote(paths.inputPath)}`,
38
+ `> ${quote(paths.stdoutPath)}`,
39
+ `2> ${quote(paths.stderrPath)}`,
40
+ `; echo $? > ${quote(paths.sentinelPath)}`,
41
+ ].join(' ')
42
+ }
43
+
44
+ export async function waitForSentinelFile(
45
+ sentinelPath: string,
46
+ timeoutMs: number,
47
+ pollIntervalMs = 250,
48
+ ): Promise<boolean> {
49
+ const deadline = Date.now() + timeoutMs
50
+ while (Date.now() < deadline) {
51
+ if (fs.existsSync(sentinelPath)) return true
52
+ await new Promise<void>((resolve) => {
53
+ setTimeout(resolve, pollIntervalMs)
54
+ })
55
+ }
56
+
57
+ return fs.existsSync(sentinelPath)
58
+ }
59
+
60
+ export function readSentinelExitCode(sentinelPath: string, fallback = 1): number {
61
+ if (!fs.existsSync(sentinelPath)) return fallback
62
+
63
+ const raw = fs.readFileSync(sentinelPath, 'utf8').trim()
64
+ const parsed = Number.parseInt(raw, 10)
65
+ return Number.isFinite(parsed) ? parsed : fallback
66
+ }
67
+
68
+ export function readTextIfExists(filePath: string): string {
69
+ if (!filePath || !fs.existsSync(filePath)) return ''
70
+ return fs.readFileSync(filePath, 'utf8')
71
+ }
72
+
73
+ export function cleanupSentinelIpc(paths: Pick<SentinelIpcPaths, 'tmpDir'>): void {
74
+ try {
75
+ fs.rmSync(paths.tmpDir, { recursive: true, force: true })
76
+ } catch {
77
+ // Best-effort cleanup.
78
+ }
79
+ }
80
+
81
+ export function cleanupSentinelPath(sentinelPath: string | undefined): void {
82
+ if (!sentinelPath) return
83
+
84
+ try {
85
+ fs.rmSync(path.dirname(sentinelPath), { recursive: true, force: true })
86
+ } catch {
87
+ // Best-effort cleanup.
88
+ }
89
+ }
90
+
91
+
@@ -5,11 +5,12 @@
5
5
  */
6
6
 
7
7
  import * as fs from "node:fs";
8
- import * as path from "node:path";
8
+ import path from "node:path";
9
9
 
10
10
  import { atomicWrite } from "./atomic-write.js";
11
11
  import { getContextDir } from "./constants.js";
12
12
  import { logWarn } from "./logger.js";
13
+ import { ContextStateSchema } from "../schemas.js";
13
14
  import type { ContextState, Mode } from "../types.js";
14
15
 
15
16
  /** Mode migration from legacy context_manager values. */
@@ -34,12 +35,13 @@ interface LegacyStateData {
34
35
 
35
36
  /**
36
37
  * Serialize a ContextState for JSON output.
37
- * Omits null/undefined keys but keeps false, 0, empty string, and empty arrays.
38
+ * Omits undefined keys but preserves null (semantically meaningful in the schema).
39
+ * Keeps false, 0, empty string, and empty arrays.
38
40
  */
39
41
  export function toDict(state: ContextState): Record<string, unknown> {
40
42
  const result: Record<string, unknown> = {};
41
43
  for (const [key, value] of Object.entries(state)) {
42
- if (value !== null && value !== undefined) {
44
+ if (value !== undefined) {
43
45
  result[key] = value;
44
46
  }
45
47
  }
@@ -118,11 +120,16 @@ export function readStateJson(
118
120
  if (!fs.existsSync(sp)) return null;
119
121
 
120
122
  try {
121
- const raw = fs.readFileSync(sp, "utf-8");
122
- const data = JSON.parse(raw) as Record<string, any>;
123
+ const raw = fs.readFileSync(sp, "utf8");
124
+ const data = JSON.parse(raw) as Record<string, unknown>;
123
125
  migrateConsumedFlags(data); // Migrate before dictToState
126
+ const parsed = ContextStateSchema.safeParse(data);
127
+ if (!parsed.success) {
128
+ logWarn("state_io", `Schema validation failed for '${contextId}': ${parsed.error.message}`);
129
+ // Fail-open: still attempt to reconstruct state from raw data
130
+ }
124
131
  return dictToState(data);
125
- } catch (error: any) {
132
+ } catch (error: unknown) {
126
133
  logWarn("state_io", `Failed to read state.json for '${contextId}': ${error}`);
127
134
  return null;
128
135
  }
@@ -138,11 +145,10 @@ export function writeStateJson(
138
145
  projectRoot?: string,
139
146
  ): [boolean, string | null] {
140
147
  const sp = statePath(contextId, projectRoot);
141
- const dir = path.dirname(sp);
142
- fs.mkdirSync(dir, { recursive: true });
143
148
 
144
149
  const content = JSON.stringify(toDict(state), null, 2);
145
- return atomicWrite(sp, content);
150
+ // fsync: false — state.json is reconstructable from context folder contents
151
+ return atomicWrite(sp, content, 2, [500, 1000], false);
146
152
  }
147
153
 
148
154
  /**
@@ -159,7 +165,7 @@ export function dictToState(data: Record<string, unknown>): ContextState {
159
165
  typeof data.mode === "string" ? data.mode : "idle";
160
166
  const mode: Mode = (MODE_MIGRATION[rawMode] ?? rawMode) as Mode;
161
167
 
162
- const state: any = {
168
+ const state: Record<string, unknown> = {
163
169
  id: data.id,
164
170
  status: data.status ?? "active",
165
171
  summary: data.summary ?? "",
@@ -199,5 +205,8 @@ export function dictToState(data: Record<string, unknown>): ContextState {
199
205
  }
200
206
  }
201
207
 
202
- return state as ContextState;
208
+ return state as unknown as ContextState;
203
209
  }
210
+
211
+
212
+
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Stop words for context ID generation.
3
+ *
4
+ * Generated from analysis of 1,424 prompts, context summaries, and plan files.
5
+ * Words that appear frequently but don't help identify the specific task.
6
+ *
7
+ * ACTION VERBS ARE INTENTIONALLY EXCLUDED:
8
+ * add, fix, update, create, implement, refactor, migrate, debug, remove, change,
9
+ * move, rename, delete, build, test, deploy, verify, analyze, modify, write, run,
10
+ * check, replace, save, sync, load, extract, install, clean, merge, etc.
11
+ *
12
+ * See SPEC.md §14.1
13
+ */
14
+
15
+ export const STOP_WORDS: ReadonlySet<string> = new Set([
16
+ // ARTICLES
17
+ "a", "about", "above",
18
+
19
+ "absolutely", "accordingly", "across", "active", "actually", "after", "afterwards", "against", "ago", "ah",
20
+ "aiw", "all", "allow", "almost", "along", "already", "alright", "also",
21
+ "alternatively", "although", "always", // AUXILIARY/MODAL VERBS
22
+ "am", "among", "an", // CONJUNCTIONS
23
+ "and", "another",
24
+ "anybody", "anyone", "anything", "anyway", "anyways", "apparently", "appear", "are",
25
+ "aren", "arent", "args", "around", "as", "ask", "assert",
26
+ "async", "at", "b", // SINGLE LETTERS
27
+ "based",
28
+
29
+ "basic", "basically", "bat", "be", "because", "become", "been",
30
+ "before", "begin", "behind", "being", "below",
31
+ "below", "beside", "besides", "between", "beyond", "block", "both",
32
+
33
+ "but", "by", "c", "can", "cant", "case", "cases",
34
+ "cause", "cc", "certainly", "chunk", "clarification",
35
+
36
+ "class", "clearly", "come", "complete",
37
+
38
+ "completely", "consequently", "consider", "const",
39
+
40
+ "contain", "contains", "continue", "conversely", "correct", "correctly",
41
+ "could", "couldn", "couldnt", "critical", "current", "currently",
42
+ "d", "def",
43
+
44
+ "definitely", "dict", "did", "didn", "didnt", "different", "directory", "do",
45
+ "does", "doesn", "doesn", "doesnt",
46
+ "doing", "don", "done", "dont", "down",
47
+ "during", "e", "each", "eh", "eight", "either", "elif", "else", "empty",
48
+
49
+ "end", "enough", "entirely", "eprint", "er", "essentially", // SHORT NOISE
50
+ "etc",
51
+ "eventually", "every", "everybody", "everyone", "everything", "exactly",
52
+ "example", "examples", "except", "exe", "existing",
53
+
54
+ "expect", "expected", "f", "false", "feature",
55
+
56
+ "features", "feel", "few", "finally", "find", "first", "five",
57
+ "folder", "follow", "following", "footer", "for", "format", "four",
58
+ "from", "full", "furthermore", "g", "general",
59
+ "get", "getting", "give", // COMMON NON-ACTION VERBS
60
+ "go",
61
+
62
+ "going", "gonna", "gotta", "group",
63
+ "h", "had", "hadn", "hadnt", "has", "hasn", "hasnt",
64
+ "have", "haven", "havent", "having", "he", "header", "hello",
65
+
66
+ "help", "hence", "her", "her", "here", // ADVERBS OF PLACE/TIME
67
+ "heres", "hers", "herself", "hes",
68
+ "hey", "hi", "high", // GENERIC ADJECTIVES
69
+ "him", "himself", "his", "hm", "hmm",
70
+ "how", // LINKING/TRANSITION WORDS
71
+ "however",
72
+
73
+ "huh", "i", // PRONOUNS - Personal
74
+ "id", "if", "ill", "im", // CONTRACTED FORMS
75
+ "immediately",
76
+ "import", "important", "in", "include", "index", "information", // GENERIC TECHNICAL NOUNS
77
+ "inside",
78
+ "instead", "into", "is", "isn", "isnt",
79
+ "issue", "it", "item", "items", "its", "itself",
80
+ "ive", "j", "js", "json", // FILLER/HEDGE WORDS
81
+ "just",
82
+
83
+ "k", "keep", "kind", "kinda", "know", "l", "lambda", "last", "later",
84
+ "least", "len", "less", "let", "lets", "level", "like", "likewise",
85
+ "line", "lines", "list", "literally", "ll",
86
+ "look", "looking", "low", "m", "main", "make",
87
+
88
+ "making", "manual", "many", "may", "maybe", "md", "me",
89
+ "mean", "meanwhile", "method", "might", "mine", "mode", "more",
90
+ "moreover", "most", "much", "multiple", "must", // PRONOUNS - Possessive
91
+ "my",
92
+
93
+ "myself", "n", "nah", "near", "nearly", "need", "needed", "neither",
94
+ "never", "nevertheless", "new", "next", "nine", "no", // NEGATION
95
+ "nobody", "none",
96
+ "none", "nonetheless", "no one", "nope", "nor", "not",
97
+ "nothing", "now", "o", "obviously", "of", "off",
98
+ "often", "oh",
99
+
100
+ "ok", "okay", "on", "one", "ones", "only",
101
+ "onto", "option", "optional", "options", "or",
102
+ "other", "otherwise", "our", "ours", "ourselves",
103
+
104
+ "out", "outside", "over", "overall", "p", "part", "parts", "pass", "per",
105
+
106
+ "perhaps", "phase", "pl",
107
+ "please", "point",
108
+ "points", "possibly", "pretty", "previously", "primary", "probably", "process",
109
+ "proper", "provide", "provided", "purpose", "put", // FILE EXTENSIONS
110
+ "py",
111
+ "q", "question", "questions", // QUERY LANGUAGE
112
+ "quite",
113
+ "r", "rather", // FRAGMENT WORDS
114
+ "re",
115
+
116
+ "real", "really", "recently", "region",
117
+
118
+ "remain", "require", "required",
119
+
120
+ "result", "return", "right", "s", "same", "say", "secondary", // DOCUMENT/CODE STRUCTURE
121
+ "section",
122
+ "see", "seem", // PROGRAMMING KEYWORDS
123
+ "self",
124
+ "set", "seven", "several", "shall",
125
+ "she", "shes", "should", "shouldn",
126
+ "shouldnt", "show", "similarly", "simple", "simply",
127
+
128
+ "since", "single", "six", "so", "some", // QUANTIFIERS
129
+ "somebody", "someone", // PRONOUNS - Indefinite
130
+ "something",
131
+ "sometimes", "somewhat", "soon", "sorta", "source", "specific", "stable", "start",
132
+ "state", "status", "stay", "step", // STRUCTURAL WORDS
133
+ "steps", "still",
134
+
135
+ "str", "stuff", "such", "sys", "t", "take",
136
+ "tell", "ten", "that", "thats", "the", "their",
137
+ "theirs", "them", "themselves", "then", "there", "therefore",
138
+
139
+ "theres", "these", "they", "theyre", "theyve", // OVERLY GENERIC TERMS
140
+ "thing",
141
+ "things", "think", "this", // PRONOUNS - Demonstrative
142
+ "those", "though", "three", "through",
143
+ "thus", "time", "times", // PREPOSITIONS
144
+ "to",
145
+
146
+ "today", "toml", "tomorrow", "too", // SHORT FILLER
147
+ "totally", "toward",
148
+ "towards", "true", "try", "trying", "ts", // NUMBER WORDS
149
+ "two",
150
+
151
+ "type", "types", "u", "uh", "um", // SPEECH-TO-TEXT FILLERS (STT artifacts from voice input)
152
+ "under", "unknown", "unless",
153
+
154
+ "until", "up", "upon", "us", "used", "uses", // COMMON CODING TERMS
155
+ "using",
156
+ "v", "value", "ve", "version", "very", "via", "w",
157
+ "wanna", // COMMON REQUEST PHRASES
158
+ "want", "was", "wasn", "wasnt", "way", "ways",
159
+ "we", "well", "were", "weren", "werent", "weve", // QUESTION WORDS
160
+ "what",
161
+ "whats", "when", "whenever", "where", "whereas",
162
+
163
+ "wherever", "whether", "which", "while",
164
+
165
+ // PRONOUNS - Relative
166
+ "who", "whom", "whos", "whose", "why", "will", "with", "within", "without",
167
+
168
+ "won", "wont", "work", "working", "works", "would", "wouldn", "wouldnt", "x", "y", "yaml", "yeah", "yep", "yes",
169
+ "yesterday", "yet", "yield", "you", "youll", "your", "youre", "yours",
170
+
171
+ "yourself", "youve", "yup", "z",
172
+ ]);
173
+
174
+ /**
175
+ * Filter stop words from text.
176
+ * Splits on whitespace, removes words in STOP_WORDS set and single-char words.
177
+ * See SPEC.md §6.4
178
+ */
179
+ export function filterStopWords(text: string): string {
180
+ return text
181
+ .split(/\s+/)
182
+ .filter((word) => word.length > 1 && !STOP_WORDS.has(word.toLowerCase()))
183
+ .join(" ");
184
+ }
185
+
@@ -0,0 +1,147 @@
1
+ import { execFile } from 'node:child_process'
2
+ import type { ChildProcess } from 'node:child_process'
3
+
4
+ import { resolveExecutable } from './executable-policy.js'
5
+
6
+ const childProcesses = new Set<ChildProcess>()
7
+
8
+ function cleanupChildren(): void {
9
+ for (const child of childProcesses) {
10
+ try {
11
+ child.kill('SIGKILL')
12
+ } catch {
13
+ // Child may have already exited.
14
+ }
15
+ }
16
+
17
+ childProcesses.clear()
18
+ }
19
+
20
+ process.on('exit', () => {
21
+ cleanupChildren()
22
+ })
23
+
24
+ process.on('SIGINT', () => {
25
+ cleanupChildren()
26
+ process.exit(130)
27
+ })
28
+
29
+ process.on('SIGTERM', () => {
30
+ cleanupChildren()
31
+ process.exit(143)
32
+ })
33
+
34
+ export function isInternalCall(): boolean {
35
+ return process.env.AIWCLI_INTERNAL_CALL === 'true'
36
+ }
37
+
38
+ export function getInternalSubprocessEnv(): Record<string, string | undefined> {
39
+ const env: Record<string, string | undefined> = {
40
+ ...process.env,
41
+ AIWCLI_INTERNAL_CALL: 'true',
42
+ }
43
+
44
+ delete env.CLAUDECODE
45
+ delete env.CLAUDE_CODE_ENTRYPOINT
46
+ return env
47
+ }
48
+
49
+ export function findExecutable(name: string): string | null {
50
+ return resolveExecutable(name, { windowsProfile: 'cmdOrExeFirst' })
51
+ }
52
+
53
+ export interface ExecSyncError {
54
+ killed: boolean
55
+ signal: string | null
56
+ stdout: Buffer | string
57
+ stderr: Buffer | string
58
+ status: number | null
59
+ message: string
60
+ }
61
+
62
+ export function isExecSyncError(error: unknown): error is ExecSyncError {
63
+ return typeof error === 'object' && error !== null && 'killed' in error && 'signal' in error
64
+ }
65
+
66
+ export function normalizePathForCli(pathValue: string): string {
67
+ if (process.platform !== 'win32') return pathValue
68
+ return pathValue.replaceAll('\\', '/')
69
+ }
70
+
71
+ export function shellQuoteWin(arg: string): string {
72
+ if (process.platform !== 'win32') return arg
73
+ return '"' + arg.replaceAll('"', '""') + '"'
74
+ }
75
+
76
+ export interface ExecResult {
77
+ stdout: string
78
+ stderr: string
79
+ exitCode: number
80
+ killed: boolean
81
+ signal: string | null
82
+ }
83
+
84
+ export interface ExecAsyncOptions {
85
+ input?: string | undefined
86
+ timeout?: number | undefined
87
+ env?: Record<string, string | undefined> | undefined
88
+ maxBuffer?: number | undefined
89
+ shell?: boolean | undefined
90
+ }
91
+
92
+ export function execFileAsync(
93
+ file: string,
94
+ args: string[],
95
+ options?: ExecAsyncOptions,
96
+ ): Promise<ExecResult> {
97
+ return new Promise((resolve) => {
98
+ const child = execFile(
99
+ file,
100
+ args,
101
+ {
102
+ encoding: 'utf8',
103
+ timeout: options?.timeout ?? 0,
104
+ env: options?.env as NodeJS.ProcessEnv,
105
+ maxBuffer: options?.maxBuffer ?? 10 * 1024 * 1024,
106
+ shell: options?.shell,
107
+ },
108
+ (error, stdout, stderr) => {
109
+ if (error) {
110
+ const errObj = error as unknown as Record<string, unknown>
111
+ resolve({
112
+ stdout: String(stdout ?? ''),
113
+ stderr: String(stderr ?? ''),
114
+ exitCode:
115
+ typeof errObj.code === 'number'
116
+ ? errObj.code
117
+ : typeof errObj.status === 'number'
118
+ ? errObj.status
119
+ : 1,
120
+ killed: Boolean(errObj.killed),
121
+ signal: typeof errObj.signal === 'string' ? errObj.signal : null,
122
+ })
123
+ } else {
124
+ resolve({
125
+ stdout: String(stdout ?? ''),
126
+ stderr: String(stderr ?? ''),
127
+ exitCode: 0,
128
+ killed: false,
129
+ signal: null,
130
+ })
131
+ }
132
+ },
133
+ )
134
+
135
+ childProcesses.add(child)
136
+ child.on('exit', () => {
137
+ childProcesses.delete(child)
138
+ })
139
+
140
+ if (options?.input !== null && options?.input !== undefined && child.stdin) {
141
+ child.stdin.write(options.input)
142
+ child.stdin.end()
143
+ }
144
+ })
145
+ }
146
+
147
+
@@ -0,0 +1,93 @@
1
+ import { execFileSync } from 'node:child_process'
2
+ import { existsSync } from 'node:fs'
3
+
4
+ import { isCommandAvailable, lookupExecutables } from './executable-policy.js'
5
+ import { isWindowsPlatform } from './platform-adapter.js'
6
+
7
+ export function selectMsysBashFromLookupPaths(paths: string[]): null | string {
8
+ for (const candidate of paths) {
9
+ const trimmed = candidate.trim()
10
+ if (trimmed && /git|msys|mingw/iu.test(trimmed)) return trimmed
11
+ }
12
+
13
+ return null
14
+ }
15
+
16
+ export function deriveMsysBashFromGitPath(gitPath: string): null | string {
17
+ const trimmed = gitPath.trim()
18
+ if (!trimmed) return null
19
+
20
+ const gitMatch = trimmed.match(/^(.+[/\\]Git)[/\\]cmd[/\\]git\.exe$/iu)
21
+ if (!gitMatch?.[1]) return null
22
+ return `${gitMatch[1]}\\usr\\bin\\bash.exe`
23
+ }
24
+
25
+ export function findMsysBash(): null | string {
26
+ const directBash = selectMsysBashFromLookupPaths(lookupExecutables('bash', { platform: 'win32' }))
27
+ if (directBash) return directBash
28
+
29
+ const gitCandidates = lookupExecutables('git', { platform: 'win32' })
30
+ for (const candidate of gitCandidates) {
31
+ const derived = deriveMsysBashFromGitPath(candidate)
32
+ if (derived && existsSync(derived)) return derived
33
+ }
34
+
35
+ const knownPaths = [
36
+ String.raw`C:\Program Files\Git\usr\bin\bash.exe`,
37
+ String.raw`C:\Program Files (x86)\Git\usr\bin\bash.exe`,
38
+ ]
39
+
40
+ for (const knownPath of knownPaths) {
41
+ if (existsSync(knownPath)) return knownPath
42
+ }
43
+
44
+ return null
45
+ }
46
+
47
+ export function isTmuxReachableViaBash(bashPath: string): boolean {
48
+ try {
49
+ execFileSync(bashPath, ['-lc', 'tmux -V'], {
50
+ timeout: 3000,
51
+ stdio: 'ignore',
52
+ env: { ...process.env, MSYS_NO_PATHCONV: '1' },
53
+ windowsHide: true,
54
+ })
55
+ return true
56
+ } catch {
57
+ return false
58
+ }
59
+ }
60
+
61
+ export function isNativeTmuxAvailable(platform: NodeJS.Platform = process.platform): boolean {
62
+ return isCommandAvailable('tmux', platform)
63
+ }
64
+
65
+ /** Find psmux (native Windows terminal multiplexer) on PATH. */
66
+ export function findPsmux(): null | string {
67
+ if (!isWindowsPlatform()) return null
68
+ const candidates = lookupExecutables('psmux', { platform: 'win32' })
69
+ return candidates[0]?.trim() || null
70
+ }
71
+
72
+ export interface WindowsTmuxPreflight {
73
+ available: boolean
74
+ bashPath?: string
75
+ reason?: string
76
+ }
77
+
78
+ export function preflightWindowsTmux(): WindowsTmuxPreflight {
79
+ if (!isWindowsPlatform()) {
80
+ return { available: false, reason: 'not running on Windows' }
81
+ }
82
+
83
+ const bashPath = findMsysBash()
84
+ if (!bashPath) {
85
+ return { available: false, reason: 'Git Bash not found' }
86
+ }
87
+
88
+ if (!isTmuxReachableViaBash(bashPath)) {
89
+ return { available: false, bashPath, reason: 'tmux not available in Git Bash' }
90
+ }
91
+
92
+ return { available: true, bashPath }
93
+ }
@@ -3,6 +3,9 @@
3
3
  * See SPEC.md §14.2, §14.3
4
4
  */
5
5
 
6
+ import * as fs from "node:fs";
7
+ import path from "node:path";
8
+
6
9
  import { sanitizeTitle } from "./constants.js";
7
10
  import { logDebug, logError, logWarn } from "./logger.js";
8
11
  import { STOP_WORDS } from "./stop-words.js";
@@ -10,7 +13,7 @@ import { STOP_WORDS } from "./stop-words.js";
10
13
  /**
11
14
  * Print to stderr. For terminal-only UX messages, not diagnostics.
12
15
  */
13
- export function eprint(...args: any[]): void {
16
+ export function eprint(...args: unknown[]): void {
14
17
  process.stderr.write(args.map(String).join(" ") + "\n");
15
18
  }
16
19
 
@@ -110,7 +113,7 @@ export function generateSlug(
110
113
  // Tier 1: AI inference via generateContextIdSlug (sync — uses execFileSync)
111
114
  try {
112
115
  // eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef
113
- const { generateContextIdSlug } = require("./inference.js");
116
+ const { generateContextIdSlug } = require("./inference");
114
117
  const aiSlug = generateContextIdSlug(text);
115
118
  if (aiSlug) {
116
119
  const filteredWords = aiSlug
@@ -127,7 +130,7 @@ export function generateSlug(
127
130
  );
128
131
  }
129
132
  }
130
- } catch (error: any) {
133
+ } catch (error: unknown) {
131
134
  logWarn("utils", `AI slug generation failed, using fallback: ${error}`);
132
135
  }
133
136
 
@@ -171,7 +174,7 @@ export function generateContextId(
171
174
  try {
172
175
  const slug = generateSlug(summary);
173
176
  baseId = `${timestamp}-${slug}`;
174
- } catch (error: any) {
177
+ } catch (error: unknown) {
175
178
  logError(
176
179
  "utils",
177
180
  `Context ID generation failed entirely, using timestamp: ${error}`,
@@ -190,3 +193,30 @@ export function generateContextId(
190
193
 
191
194
  return `${baseId}-${counter}`;
192
195
  }
196
+
197
+ /**
198
+ * Get .md files in a directory sorted by mtime (newest first).
199
+ */
200
+ export function getMdFilesByMtime(dir: string): string[] {
201
+ try {
202
+ if (!fs.existsSync(dir)) return [];
203
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
204
+ return entries
205
+ .filter(e => e.isFile() && e.name.endsWith(".md"))
206
+ .map(e => {
207
+ const fullPath = path.join(dir, e.name);
208
+ const stat = fs.statSync(fullPath);
209
+ return { path: fullPath, mtime: stat.mtimeMs };
210
+ })
211
+ .sort((a, b) => b.mtime - a.mtime)
212
+ .map(f => f.path);
213
+ } catch { return []; }
214
+ }
215
+
216
+ /**
217
+ * Get the most recently modified .md file in a directory.
218
+ */
219
+ export function mostRecentMd(dir: string): string | null {
220
+ return getMdFilesByMtime(dir)[0] ?? null;
221
+ }
222
+