aiwcli 0.15.7 → 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 (272) hide show
  1. package/README.md +106 -1125
  2. package/bin/run.js +0 -4
  3. package/dist/capabilities/installation/control-plane/clear-command.d.ts +2 -0
  4. package/dist/capabilities/installation/control-plane/clear-command.js +32 -3
  5. package/dist/capabilities/installation/control-plane/init-command.js +2 -2
  6. package/dist/capabilities/launch/contracts.d.ts +39 -4
  7. package/dist/capabilities/launch/control-plane/execute-launch.js +158 -119
  8. package/dist/capabilities/launch/runtime-core/launch-decisions.d.ts +82 -0
  9. package/dist/capabilities/launch/runtime-core/launch-decisions.js +202 -0
  10. package/dist/commands/branch.d.ts +1 -1
  11. package/dist/commands/branch.js +1 -1
  12. package/dist/commands/launch.d.ts +0 -5
  13. package/dist/commands/launch.js +2 -37
  14. package/dist/lib/config.js +1 -2
  15. package/dist/lib/context/context-store.js +28 -2
  16. package/dist/lib/core-installer.d.ts +1 -1
  17. package/dist/lib/core-installer.js +6 -27
  18. package/dist/lib/debug.d.ts +0 -10
  19. package/dist/lib/debug.js +0 -10
  20. package/dist/lib/env-sanitizer.d.ts +25 -0
  21. package/dist/lib/env-sanitizer.js +46 -0
  22. package/dist/lib/errors.d.ts +0 -13
  23. package/dist/lib/errors.js +0 -15
  24. package/dist/lib/git-exclude-manager.js +1 -1
  25. package/dist/lib/hooks/context-monitor-logic.d.ts +6 -0
  26. package/dist/lib/hooks/context-monitor-logic.js +25 -0
  27. package/dist/lib/hooks/hook-utils.js +11 -0
  28. package/dist/lib/hooks/prompt-binding-logic.d.ts +7 -0
  29. package/dist/lib/hooks/prompt-binding-logic.js +50 -0
  30. package/dist/lib/hooks/session-end-logic.js +2 -14
  31. package/dist/lib/install-state.js +6 -13
  32. package/dist/lib/json-io.d.ts +12 -0
  33. package/dist/lib/json-io.js +30 -0
  34. package/dist/lib/multiplexer.d.ts +43 -35
  35. package/dist/lib/multiplexer.js +21 -2
  36. package/dist/lib/multiplexers/psmux.d.ts +14 -34
  37. package/dist/lib/multiplexers/psmux.js +70 -130
  38. package/dist/lib/multiplexers/tmux.d.ts +11 -19
  39. package/dist/lib/multiplexers/tmux.js +79 -120
  40. package/dist/lib/multiplexers/wezterm.d.ts +38 -0
  41. package/dist/lib/multiplexers/wezterm.js +225 -0
  42. package/dist/lib/mux-utils.d.ts +4 -3
  43. package/dist/lib/mux-utils.js +7 -13
  44. package/dist/lib/prompt-file-manager.d.ts +23 -0
  45. package/dist/lib/prompt-file-manager.js +41 -0
  46. package/dist/lib/runtime/agent-launcher.d.ts +67 -0
  47. package/dist/lib/runtime/agent-launcher.js +262 -0
  48. package/dist/lib/runtime/aiw-cli.d.ts +2 -0
  49. package/dist/lib/runtime/aiw-cli.js +3 -1
  50. package/dist/lib/runtime/cli-args.d.ts +5 -2
  51. package/dist/lib/runtime/cli-args.js +18 -3
  52. package/dist/lib/runtime/inference.js +3 -14
  53. package/dist/lib/runtime/models.d.ts +6 -0
  54. package/dist/lib/runtime/models.js +6 -0
  55. package/dist/lib/runtime/state-io.d.ts +2 -1
  56. package/dist/lib/runtime/state-io.js +9 -4
  57. package/dist/lib/runtime/utils.d.ts +8 -0
  58. package/dist/lib/runtime/utils.js +31 -1
  59. package/dist/lib/schemas.d.ts +250 -0
  60. package/dist/lib/schemas.js +216 -0
  61. package/dist/lib/sentinel-manager.d.ts +32 -0
  62. package/dist/lib/sentinel-manager.js +62 -0
  63. package/dist/lib/sentinel-wrapper.d.ts +1 -0
  64. package/dist/lib/sentinel-wrapper.js +12 -3
  65. package/dist/lib/settings-hierarchy.js +3 -20
  66. package/dist/lib/shell-adapters/bash-adapter.d.ts +18 -0
  67. package/dist/lib/shell-adapters/bash-adapter.js +69 -0
  68. package/dist/lib/shell-adapters/index.d.ts +5 -0
  69. package/dist/lib/shell-adapters/index.js +7 -0
  70. package/dist/lib/shell-adapters/powershell-adapter.d.ts +18 -0
  71. package/dist/lib/shell-adapters/powershell-adapter.js +62 -0
  72. package/dist/lib/shell-adapters/shell-adapter.d.ts +45 -0
  73. package/dist/lib/shell-adapters/shell-adapter.js +5 -0
  74. package/dist/lib/spawn-errors.d.ts +3 -0
  75. package/dist/lib/spawn-errors.js +15 -1
  76. package/dist/lib/spinner.d.ts +0 -5
  77. package/dist/lib/spinner.js +0 -16
  78. package/dist/lib/template-installer.d.ts +10 -0
  79. package/dist/lib/template-installer.js +4 -4
  80. package/dist/lib/terminal-strategy.d.ts +1 -0
  81. package/dist/lib/terminal-strategy.js +12 -6
  82. package/dist/lib/terminal.d.ts +7 -5
  83. package/dist/lib/terminal.js +42 -19
  84. package/dist/lib/tmux-primitives.d.ts +0 -2
  85. package/dist/lib/tmux-primitives.js +0 -4
  86. package/dist/lib/tmux-session.js +2 -1
  87. package/dist/lib/windsurf-hooks-hierarchy.js +6 -23
  88. package/dist/platform/launch.d.ts +2 -1
  89. package/dist/platform/launch.js +1 -0
  90. package/dist/templates/CLAUDE.md +0 -1
  91. package/dist/templates/cc-native/.claude/settings.json +0 -10
  92. package/dist/templates/cc-native/TEMPLATE-SCHEMA.md +11 -4
  93. package/dist/templates/cc-native/_cc-native/cc-native.config.json +3 -7
  94. package/dist/templates/cc-native/_cc-native/hooks/CLAUDE.md +26 -47
  95. package/dist/templates/cc-native/_cc-native/hooks/cc-native-plan-review.ts +7 -9
  96. package/dist/templates/cc-native/_cc-native/hooks/enhance_plan_post_write.ts +2 -3
  97. package/dist/templates/cc-native/_cc-native/hooks/mark_questions_asked.ts +2 -2
  98. package/dist/templates/cc-native/_cc-native/hooks/plan_questions_early.ts +0 -25
  99. package/dist/templates/cc-native/_cc-native/hooks/validate_task_prompt.ts +4 -4
  100. package/dist/templates/cc-native/_cc-native/lib-ts/.mocharc.json +9 -0
  101. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/aggregate-agents.test.ts +118 -0
  102. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/artifacts.test.ts +234 -0
  103. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/cc-native-state.test.ts +170 -0
  104. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/cli-output-parser.test.ts +73 -0
  105. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/config.test.ts +64 -0
  106. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/constants.test.ts +40 -0
  107. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/debug.test.ts +42 -0
  108. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/exports.test.ts +58 -0
  109. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/helpers.ts +107 -0
  110. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/add-plan-context.hook.test.ts +97 -0
  111. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/plan-questions.hook.test.ts +81 -0
  112. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/hooks/plan-review.hook.test.ts +71 -0
  113. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/json-parser.test.ts +99 -0
  114. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/orchestrator-agent.test.ts +288 -0
  115. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/orchestrator.test.ts +48 -0
  116. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/reviewers.test.ts +32 -0
  117. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/state.test.ts +124 -0
  118. package/dist/templates/cc-native/_cc-native/lib-ts/__tests__/verdict.test.ts +93 -0
  119. package/dist/templates/cc-native/_cc-native/lib-ts/agent-selection.ts +163 -0
  120. package/dist/templates/cc-native/_cc-native/lib-ts/aggregate-agents.ts +6 -14
  121. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/format.ts +597 -599
  122. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/index.ts +26 -26
  123. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/tracker.ts +106 -107
  124. package/dist/templates/cc-native/_cc-native/{artifacts/lib → lib-ts/artifacts}/write.ts +118 -119
  125. package/dist/templates/cc-native/_cc-native/lib-ts/artifacts.ts +21 -0
  126. package/dist/templates/cc-native/_cc-native/lib-ts/cc-native-state.ts +16 -15
  127. package/dist/templates/cc-native/_cc-native/lib-ts/cli-output-parser.ts +132 -10
  128. package/dist/templates/cc-native/_cc-native/lib-ts/constants.ts +6 -6
  129. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/corroboration.ts +119 -119
  130. package/dist/templates/cc-native/_cc-native/lib-ts/debug.ts +1 -2
  131. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/graduation.ts +132 -132
  132. package/dist/templates/cc-native/_cc-native/lib-ts/index.ts +88 -86
  133. package/dist/templates/cc-native/_cc-native/lib-ts/json-parser.ts +5 -6
  134. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/orchestrator.ts +70 -70
  135. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/output-builder.ts +130 -121
  136. package/dist/templates/cc-native/_cc-native/lib-ts/package-lock.json +1679 -0
  137. package/dist/templates/cc-native/_cc-native/lib-ts/package.json +24 -0
  138. package/dist/templates/cc-native/_cc-native/lib-ts/plan-discovery.ts +4 -4
  139. package/dist/templates/cc-native/_cc-native/lib-ts/plan-enhancement.ts +1 -6
  140. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/plan-questions.ts +101 -101
  141. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/review-pipeline.ts +511 -543
  142. package/dist/templates/cc-native/_cc-native/lib-ts/reviewers/__tests__/agent-providers.test.ts +262 -0
  143. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/agent.ts +71 -85
  144. package/dist/templates/{core/lib-ts/agent-exec → cc-native/_cc-native/lib-ts/reviewers/base}/base-agent.ts +138 -152
  145. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/index.ts +12 -12
  146. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/claude-agent.ts +66 -57
  147. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/codex-agent.ts +185 -200
  148. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/gemini-agent.ts +39 -40
  149. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/providers/orchestrator-claude-agent.ts +196 -224
  150. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/schemas.ts +201 -201
  151. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/reviewers/types.ts +21 -23
  152. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/__tests__/hyde.test.ts +365 -0
  153. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/__tests__/ollama-client.test.ts +223 -0
  154. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/embedding-indexer.ts +12 -16
  155. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/hyde.ts +3 -2
  156. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/index.ts +31 -31
  157. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/logger.ts +6 -7
  158. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/ollama-client.ts +7 -9
  159. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/retrieval-pipeline.ts +14 -17
  160. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-indexer.ts +37 -41
  161. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-loader.ts +33 -43
  162. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/transcript-searcher.ts +20 -20
  163. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/types.ts +8 -9
  164. package/dist/templates/cc-native/_cc-native/lib-ts/rlm/vector-store.ts +3 -4
  165. package/dist/templates/cc-native/_cc-native/lib-ts/settings.ts +50 -126
  166. package/dist/templates/cc-native/_cc-native/lib-ts/state.ts +19 -21
  167. package/dist/templates/cc-native/_cc-native/lib-ts/types.ts +13 -88
  168. package/dist/templates/cc-native/_cc-native/{plan-review/lib → lib-ts}/verdict.ts +72 -72
  169. package/dist/templates/cc-native/_cc-native/plan-review/CLAUDE.md +35 -0
  170. package/dist/templates/cc-native/_cc-native/plan-review/lib/agent-selection.ts +1 -1
  171. package/dist/templates/cc-native/_cc-native/scripts/council_debate.ts +242 -0
  172. package/dist/templates/cc-native/_cc-native/scripts/council_debate_simple.ts +294 -0
  173. package/dist/templates/cc-native/_cc-native/{plan-review/workflows → workflows}/specdev.md +9 -9
  174. package/dist/templates/core/.claude/skills/codex/SKILL.md +25 -0
  175. package/dist/templates/core/.claude/skills/devin/SKILL.md +25 -0
  176. package/dist/templates/core/.claude/skills/handoff/SKILL.md +11 -0
  177. package/dist/templates/core/.claude/skills/handoff-resume/SKILL.md +11 -0
  178. package/dist/templates/core/.claude/skills/meta-plan/SKILL.md +13 -0
  179. package/dist/templates/core/.codex/skills/codex/SKILL.md +13 -0
  180. package/dist/templates/core/.codex/skills/devin/SKILL.md +19 -0
  181. package/dist/templates/core/.codex/skills/handoff/SKILL.md +11 -0
  182. package/dist/templates/core/.codex/skills/handoff-resume/SKILL.md +11 -0
  183. package/dist/templates/core/.codex/{workflows/meta-plan.md → skills/meta-plan/SKILL.md} +6 -0
  184. package/dist/templates/core/{.cognition → .devin}/AGENTS.md +2 -2
  185. package/dist/templates/core/.devin/skills/codex/SKILL.md +19 -0
  186. package/dist/templates/core/.devin/skills/devin/SKILL.md +13 -0
  187. package/dist/templates/core/.devin/skills/handoff/SKILL.md +11 -0
  188. package/dist/templates/core/.devin/skills/handoff-resume/SKILL.md +11 -0
  189. package/dist/templates/core/.devin/skills/meta-plan/SKILL.md +13 -0
  190. package/dist/templates/core/.windsurf/workflows/handoff-resume.md +9 -0
  191. package/dist/templates/core/hooks-ts/archive_plan.ts +1 -21
  192. package/dist/templates/core/hooks-ts/file-suggestion.ts +1 -19
  193. package/dist/templates/core/hooks-ts/pre_compact.ts +5 -18
  194. package/dist/templates/core/lib-ts/context/context-store.ts +29 -2
  195. package/dist/templates/core/lib-ts/hooks/hook-utils.ts +11 -0
  196. package/dist/templates/core/lib-ts/hooks/session-end-logic.ts +2 -13
  197. package/dist/templates/core/lib-ts/runtime/agent-launcher.ts +74 -0
  198. package/dist/templates/core/lib-ts/runtime/aiw-cli.ts +4 -2
  199. package/dist/templates/core/lib-ts/runtime/cli-args.ts +18 -4
  200. package/dist/templates/core/lib-ts/runtime/inference.ts +3 -15
  201. package/dist/templates/core/lib-ts/runtime/models.ts +7 -0
  202. package/dist/templates/core/lib-ts/runtime/state-io.ts +9 -4
  203. package/dist/templates/core/lib-ts/runtime/utils.ts +30 -1
  204. package/dist/templates/core/lib-ts/schemas.ts +233 -0
  205. package/dist/templates/core/scripts/resolve-run.ts +34 -2
  206. package/dist/templates/core/scripts/status_line.ts +1 -1
  207. package/dist/templates/core/skills/codex/CLAUDE.md +9 -4
  208. package/dist/templates/core/skills/codex/SKILL.md +6 -0
  209. package/dist/templates/core/skills/codex/lib/codex-watcher.ts +3 -10
  210. package/dist/templates/core/skills/codex/scripts/launch-codex.ts +26 -26
  211. package/dist/templates/core/skills/devin/CLAUDE.md +63 -6
  212. package/dist/templates/core/skills/devin/lib/devin-watcher.ts +116 -96
  213. package/dist/templates/core/skills/devin/scripts/launch-devin.ts +22 -21
  214. package/dist/templates/core/skills/handoff-system/CLAUDE.md +1 -1
  215. package/oclif.manifest.json +4 -4
  216. package/package.json +4 -4
  217. package/dist/lib/base-command.d.ts +0 -1
  218. package/dist/lib/base-command.js +0 -1
  219. package/dist/lib/env-compat.d.ts +0 -18
  220. package/dist/lib/env-compat.js +0 -23
  221. package/dist/lib/launch-options.d.ts +0 -1
  222. package/dist/lib/launch-options.js +0 -1
  223. package/dist/lib/stdin.d.ts +0 -48
  224. package/dist/lib/stdin.js +0 -60
  225. package/dist/templates/cc-native/_cc-native/CLAUDE.md +0 -73
  226. package/dist/templates/cc-native/_cc-native/artifacts/CLAUDE.md +0 -64
  227. package/dist/templates/cc-native/_cc-native/lib-ts/CLAUDE.md +0 -70
  228. package/dist/templates/cc-native/_cc-native/plan-review/CODING-STANDARDS-CHECKLIST.md +0 -75
  229. package/dist/templates/cc-native/_cc-native/plan-review/agents/CLAUDE.md +0 -143
  230. package/dist/templates/cc-native/_cc-native/plan-review/agents/PLAN-ORCHESTRATOR.md +0 -213
  231. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-questions/PLAN-QUESTIONER.md +0 -70
  232. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-EVOLUTION.md +0 -62
  233. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-PATTERNS.md +0 -61
  234. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ARCH-STRUCTURE.md +0 -62
  235. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/ASSUMPTION-TRACER.md +0 -56
  236. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CLARITY-AUDITOR.md +0 -53
  237. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-FEASIBILITY.md +0 -66
  238. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-GAPS.md +0 -70
  239. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/COMPLETENESS-ORDERING.md +0 -62
  240. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/CONSTRAINT-VALIDATOR.md +0 -72
  241. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-ADR-VALIDATOR.md +0 -61
  242. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DESIGN-SCALE-MATCHER.md +0 -64
  243. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DEVILS-ADVOCATE.md +0 -56
  244. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/DOCUMENTATION-PHILOSOPHY.md +0 -86
  245. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HANDOFF-READINESS.md +0 -59
  246. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/HIDDEN-COMPLEXITY.md +0 -58
  247. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/INCREMENTAL-DELIVERY.md +0 -66
  248. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-DEPENDENCY.md +0 -62
  249. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-FMEA.md +0 -66
  250. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-PREMORTEM.md +0 -71
  251. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/RISK-REVERSIBILITY.md +0 -74
  252. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SCOPE-BOUNDARY.md +0 -77
  253. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SIMPLICITY-GUARDIAN.md +0 -62
  254. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/SKEPTIC.md +0 -68
  255. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-BEHAVIOR-AUDITOR.md +0 -61
  256. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-CHARACTERIZATION.md +0 -71
  257. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-FIRST-VALIDATOR.md +0 -61
  258. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TESTDRIVEN-PYRAMID-ANALYZER.md +0 -61
  259. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-COSTS.md +0 -67
  260. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/TRADEOFF-STAKEHOLDERS.md +0 -65
  261. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-COVERAGE.md +0 -74
  262. package/dist/templates/cc-native/_cc-native/plan-review/agents/plan-review/VERIFY-STRENGTH.md +0 -69
  263. package/dist/templates/cc-native/_cc-native/plan-review/lib/reviewers/base/base-agent.ts +0 -7
  264. package/dist/templates/core/.codex/workflows/codex.md +0 -17
  265. package/dist/templates/core/.codex/workflows/handoff.md +0 -5
  266. package/dist/templates/core/lib-ts/agent-exec/backends/headless.ts +0 -34
  267. package/dist/templates/core/lib-ts/agent-exec/backends/index.ts +0 -6
  268. package/dist/templates/core/lib-ts/agent-exec/backends/tmux.ts +0 -148
  269. package/dist/templates/core/lib-ts/agent-exec/execution-backend.ts +0 -50
  270. package/dist/templates/core/lib-ts/agent-exec/index.ts +0 -6
  271. package/dist/templates/core/lib-ts/agent-exec/structured-output.ts +0 -165
  272. /package/dist/templates/core/{.cognition → .devin}/config.json +0 -0
@@ -0,0 +1,294 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Simplified council debate runner - bypasses review infrastructure.
4
+ * Directly invokes claude CLI and parses debate-specific schema.
5
+ */
6
+
7
+ import { spawn } from "child_process";
8
+ import { shellQuoteWin } from "../../_core/lib-ts/runtime/subprocess-utils.js";
9
+
10
+ const DEBATE_SCHEMA = {
11
+ type: "object",
12
+ properties: {
13
+ agent_name: { type: "string" },
14
+ position: {
15
+ type: "string",
16
+ enum: ["approach_a", "approach_b", "hybrid", "neither"],
17
+ },
18
+ reasoning: {
19
+ type: "array",
20
+ items: { type: "string" },
21
+ },
22
+ rebuttals: {
23
+ type: "array",
24
+ items: {
25
+ type: "object",
26
+ properties: {
27
+ concern: { type: "string" },
28
+ response: { type: "string" },
29
+ },
30
+ required: ["concern", "response"],
31
+ },
32
+ },
33
+ verdict: { type: "string" },
34
+ },
35
+ required: ["agent_name", "position", "reasoning", "rebuttals", "verdict"],
36
+ };
37
+
38
+ const AGENTS = [
39
+ {
40
+ name: "Correctness Advocate",
41
+ system: `You are the Correctness Advocate in this architectural council.
42
+
43
+ YOUR MANDATE: Prioritize system correctness and data integrity above all else.
44
+
45
+ EVALUATION CRITERIA:
46
+ - What happens if timing assumptions break?
47
+ - Can the system enter invalid states?
48
+ - Are there race conditions or ordering dependencies?
49
+ - What's the blast radius of bugs in each approach?
50
+ - Which approach has fewer failure modes?
51
+
52
+ STYLE:
53
+ - Be skeptical of "it should work" assumptions
54
+ - Point out edge cases and failure scenarios
55
+ - Ask "what breaks when X happens before Y?"
56
+ - Favor defensive, fail-safe designs`,
57
+ },
58
+ {
59
+ name: "Simplicity Champion",
60
+ system: `You are the Simplicity Champion in this architectural council.
61
+
62
+ YOUR MANDATE: Advocate for the simplest solution that could possibly work.
63
+
64
+ EVALUATION CRITERIA:
65
+ - Which approach has fewer moving parts?
66
+ - Can a new developer understand it in 5 minutes?
67
+ - How many state transitions are required?
68
+ - Is the responsibility of each component clear?
69
+ - Which approach requires less documentation?
70
+
71
+ STYLE:
72
+ - Challenge unnecessary complexity
73
+ - Prefer explicit over implicit behavior
74
+ - Ask "do we really need this?"
75
+ - Value readability and maintainability
76
+ - Distrust "clever" solutions`,
77
+ },
78
+ {
79
+ name: "Pragmatist",
80
+ system: `You are the Pragmatist in this architectural council.
81
+
82
+ YOUR MANDATE: Balance theoretical correctness with practical engineering constraints.
83
+
84
+ EVALUATION CRITERIA:
85
+ - What's the migration cost from current state?
86
+ - How much code needs to change?
87
+ - What's the testing burden?
88
+ - Are there real-world scenarios that break each approach?
89
+ - Which approach is easier to debug when things go wrong?
90
+
91
+ STYLE:
92
+ - Consider operational reality
93
+ - Value incremental improvements over rewrites
94
+ - Ask "what problem are we actually solving?"
95
+ - Challenge both over-engineering and under-engineering
96
+ - Focus on developer experience`,
97
+ },
98
+ ];
99
+
100
+ interface DebateResult {
101
+ agent_name: string;
102
+ position: string;
103
+ reasoning: string[];
104
+ rebuttals: Array<{ concern: string; response: string }>;
105
+ verdict: string;
106
+ }
107
+
108
+ async function runAgent(
109
+ topic: string,
110
+ agentName: string,
111
+ systemPrompt: string,
112
+ ): Promise<DebateResult | null> {
113
+ return new Promise((resolve) => {
114
+ const schemaJson = JSON.stringify(DEBATE_SCHEMA);
115
+ const promptText = `IMMEDIATELY call StructuredOutput with your council debate response.
116
+ Do NOT output any text before calling StructuredOutput.
117
+
118
+ TOPIC:
119
+ <<<
120
+ ${topic}
121
+ >>>
122
+ `;
123
+
124
+ const args = [
125
+ "--model",
126
+ "claude-sonnet-4-5",
127
+ "--output-format",
128
+ "json",
129
+ "--json-schema",
130
+ shellQuoteWin(schemaJson),
131
+ "--max-turns",
132
+ "3",
133
+ "--setting-sources",
134
+ process.platform === "win32" ? '""' : "",
135
+ "-p",
136
+ "--no-session-persistence",
137
+ "--system-prompt",
138
+ shellQuoteWin(systemPrompt),
139
+ ];
140
+
141
+ const claudeCmd = process.platform === "win32"
142
+ ? "C:\\Users\\fujos\\AppData\\Roaming\\npm\\claude.cmd"
143
+ : "claude";
144
+
145
+ console.error(`\n[${agentName}] Starting...`);
146
+
147
+ const proc = spawn(claudeCmd, args, {
148
+ shell: true,
149
+ env: {
150
+ ...process.env,
151
+ CLAUDECODE: undefined,
152
+ CLAUDE_CODE_ENTRYPOINT: undefined,
153
+ },
154
+ });
155
+
156
+ let stdout = "";
157
+ let stderr = "";
158
+
159
+ proc.stdout?.on("data", (chunk) => {
160
+ stdout += chunk.toString();
161
+ });
162
+
163
+ proc.stderr?.on("data", (chunk) => {
164
+ stderr += chunk.toString();
165
+ });
166
+
167
+ proc.on("close", (code) => {
168
+ if (code !== 0) {
169
+ console.error(`[${agentName}] Failed with exit code ${code}`);
170
+ console.error(`[${agentName}] stderr: ${stderr}`);
171
+ resolve(null);
172
+ return;
173
+ }
174
+
175
+ // Parse CLI wrapper output
176
+ try {
177
+ const wrapper = JSON.parse(stdout);
178
+ if (wrapper.type !== "result" || !wrapper.structured_output) {
179
+ console.error(`[${agentName}] No structured_output in wrapper`);
180
+ console.error(`[${agentName}] wrapper keys: ${Object.keys(wrapper).join(", ")}`);
181
+ resolve(null);
182
+ return;
183
+ }
184
+
185
+ const result = wrapper.structured_output as DebateResult;
186
+ console.error(`[${agentName}] ✓ Position: ${result.position}`);
187
+ resolve(result);
188
+ } catch (e) {
189
+ console.error(`[${agentName}] Parse error: ${e}`);
190
+ console.error(`[${agentName}] stdout: ${stdout.slice(0, 500)}`);
191
+ resolve(null);
192
+ }
193
+ });
194
+
195
+ // Send prompt to stdin
196
+ proc.stdin?.write(promptText);
197
+ proc.stdin?.end();
198
+ });
199
+ }
200
+
201
+ async function main() {
202
+ const args = process.argv.slice(2);
203
+ let topic: string;
204
+
205
+ if (args.length > 0) {
206
+ topic = args.join(" ");
207
+ } else {
208
+ const chunks: Buffer[] = [];
209
+ for await (const chunk of process.stdin) {
210
+ chunks.push(chunk);
211
+ }
212
+ topic = Buffer.concat(chunks).toString("utf-8").trim();
213
+ }
214
+
215
+ if (!topic) {
216
+ console.error("Usage: council_debate_simple.ts <topic>");
217
+ process.exit(1);
218
+ }
219
+
220
+ console.log("\n=== COUNCIL DEBATE ===\n");
221
+ console.log(topic.slice(0, 200) + "...\n");
222
+ console.log("=".repeat(80) + "\n");
223
+
224
+ // Run all agents in parallel
225
+ const promises = AGENTS.map((agent) =>
226
+ runAgent(topic, agent.name, agent.system),
227
+ );
228
+
229
+ const results = (await Promise.all(promises)).filter(
230
+ (r): r is DebateResult => r !== null,
231
+ );
232
+
233
+ if (results.length === 0) {
234
+ console.error("\n[FATAL] All agents failed\n");
235
+ process.exit(1);
236
+ }
237
+
238
+ // Display results
239
+ for (const result of results) {
240
+ console.log(`\n### ${result.agent_name}\n`);
241
+ console.log(`**Position:** ${result.position}\n`);
242
+
243
+ console.log("**Reasoning:**");
244
+ for (const point of result.reasoning) {
245
+ console.log(`- ${point}`);
246
+ }
247
+
248
+ if (result.rebuttals.length > 0) {
249
+ console.log("\n**Rebuttals:**");
250
+ for (const rebuttal of result.rebuttals) {
251
+ console.log(`- *${rebuttal.concern}*`);
252
+ console.log(` → ${rebuttal.response}`);
253
+ }
254
+ }
255
+
256
+ console.log(`\n**Verdict:** ${result.verdict}\n`);
257
+ console.log("-".repeat(80));
258
+ }
259
+
260
+ // Compute consensus
261
+ console.log("\n=== CONSENSUS ANALYSIS ===\n");
262
+
263
+ const positionCounts = new Map<string, number>();
264
+ for (const result of results) {
265
+ positionCounts.set(
266
+ result.position,
267
+ (positionCounts.get(result.position) || 0) + 1,
268
+ );
269
+ }
270
+
271
+ console.log("**Position Distribution:**");
272
+ for (const [position, count] of positionCounts.entries()) {
273
+ console.log(`- ${position}: ${count}/${results.length} agents`);
274
+ }
275
+
276
+ const majorityPosition = Array.from(positionCounts.entries()).sort(
277
+ (a, b) => b[1] - a[1],
278
+ )[0];
279
+
280
+ if (majorityPosition && majorityPosition[1] >= 2) {
281
+ console.log(
282
+ `\n**Majority Decision:** ${majorityPosition[0]} (${majorityPosition[1]}/${results.length} agents)`,
283
+ );
284
+ } else {
285
+ console.log("\n**No clear majority** - further investigation needed");
286
+ }
287
+
288
+ console.log("\n" + "=".repeat(80) + "\n");
289
+ }
290
+
291
+ main().catch((e) => {
292
+ console.error(`\n[FATAL] ${e}\n`);
293
+ process.exit(1);
294
+ });
@@ -1,9 +1,9 @@
1
- Read this spec and interview me in detail using the AskUserQuestionTool about literally anything:
2
- - Technical implementation
3
- - UI & UX
4
- - Concerns
5
- - Tradeoffs, etc.
6
-
7
- But make sure the questions are not obvious
8
-
9
- Be very in-depth and continue interviewing me continually until it's complete, then write the spec to the file.
1
+ Read this spec and interview me in detail using the AskUserQuestionTool about literally anything:
2
+ - Technical implementation
3
+ - UI & UX
4
+ - Concerns
5
+ - Tradeoffs, etc.
6
+
7
+ But make sure the questions are not obvious
8
+
9
+ Be very in-depth and continue interviewing me continually until it's complete, then write the spec to the file.
@@ -0,0 +1,25 @@
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
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`
20
+
21
+ ## Usage
22
+
23
+ Run with `run_in_background: true`. The script blocks until Codex exits and prints a session summary.
24
+
25
+ For detailed delegation patterns (parallel, one-shot, ad-hoc), read `.aiwcli/_core/skills/codex/SKILL.md`.
@@ -0,0 +1,25 @@
1
+ ---
2
+ name: devin
3
+ description: Delegate implementation to Devin sub-agents. USE WHEN devin OR send to devin OR devin implement OR hand off to devin OR launch devin OR run devin.
4
+ user-invocable: true
5
+ ---
6
+
7
+ # /devin
8
+
9
+ Delegate work to a Devin 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 Devin's prompt internally. Leaking internal paths into the prompt causes Devin to recurse.
12
+
13
+ ## Command
14
+
15
+ `bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/devin/scripts/launch-devin.ts [flags] <mode>`
16
+
17
+ **Modes:** `plan` | `--file <path>` | `<inline text...>`
18
+
19
+ **Flags:** `--model <name>`, `--context <id>`, `--prompt <text>`, `--no-watch`
20
+
21
+ ## Usage
22
+
23
+ Run with `run_in_background: true`. The script blocks until Devin exits and prints a session summary.
24
+
25
+ For detailed delegation patterns (parallel, one-shot, ad-hoc), read `.aiwcli/_core/skills/devin/SKILL.md`.
@@ -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
+ # /meta-plan -- 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,13 @@
1
+ ---
2
+ name: codex
3
+ description: "Self-reference guard: you ARE Codex. Do not invoke this skill."
4
+ user-invocable: false
5
+ ---
6
+
7
+ # Codex (Self-Reference Guard)
8
+
9
+ **You are already running as Codex.** Do not attempt to launch another Codex instance.
10
+
11
+ If asked to delegate work to Codex, you should perform the work directly — you are the Codex agent.
12
+
13
+ To delegate to a *different* agent, use the devin skill instead.
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: devin
3
+ description: Delegate implementation to Devin sub-agents. USE WHEN devin OR send to devin OR devin implement OR hand off to devin OR launch devin OR run devin.
4
+ user-invocable: true
5
+ ---
6
+
7
+ # Devin Workflow
8
+
9
+ Delegate work to a Devin 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 Devin's prompt internally. Leaking internal paths into the prompt causes Devin to recurse.
12
+
13
+ ## Command
14
+
15
+ `bun ~/.aiwcli/bin/resolve-run.ts .aiwcli/_core/skills/devin/scripts/launch-devin.ts [flags] <mode>`
16
+
17
+ **Modes:** `plan` | `--file <path>` | `<inline text...>`
18
+
19
+ **Flags:** `--model <name>`, `--context <id>`, `--prompt <text>`, `--no-watch`
@@ -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"
@@ -1,3 +1,9 @@
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
+
1
7
  # MetaPlan -- Prompt Amplifier
2
8
 
3
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.
@@ -1,5 +1,5 @@
1
- # Cognition Notes
1
+ # Devin Notes
2
2
 
3
- On Windows, keep any filesystem paths that appear in `.cognition` config text or agent instructions in forward-slash form when they are meant to be read by Devin/Cognition.
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
4
 
5
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,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"
@@ -15,27 +15,7 @@ import {
15
15
  loadHookInput, logDebug, logError, logInfo, logWarn, requireBoundSession, runHookAsync,
16
16
  } from "../lib-ts/hooks/hook-utils.js";
17
17
  import { getContextDir } from "../lib-ts/runtime/constants.js";
18
-
19
- /** Find the most recent .md file in a directory */
20
- function mostRecentMd(dir: string): null | string {
21
- try {
22
- if (!fs.existsSync(dir)) return null;
23
- const entries = fs.readdirSync(dir, { withFileTypes: true });
24
- let best: null | { mtime: number; path: string; } = null;
25
- for (const e of entries) {
26
- if (!e.isFile() || !e.name.endsWith(".md")) continue;
27
- const fullPath = path.join(dir, e.name);
28
- const stat = fs.statSync(fullPath);
29
- if (!best || stat.mtimeMs > best.mtime) {
30
- best = { path: fullPath, mtime: stat.mtimeMs };
31
- }
32
- }
33
-
34
- return best?.path ?? null;
35
- } catch {
36
- return null;
37
- }
38
- }
18
+ import { mostRecentMd } from "../lib-ts/runtime/utils.js";
39
19
 
40
20
  /** Multi-strategy plan path discovery */
41
21
  function findPlanPath(payload: Record<string, unknown>, projectRoot: string): null | string {
@@ -9,27 +9,9 @@ import path from "node:path";
9
9
  import { getAllContexts, getContextBySessionId } from "../lib-ts/context/context-store.js";
10
10
  import { loadHookInput, logDebug, logError, runHook } from "../lib-ts/hooks/hook-utils.js";
11
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 {
@@ -3,30 +3,17 @@
3
3
  * PreCompact hook: Save state.json snapshot before context compaction.
4
4
  * Captures git state and session metadata for recovery.
5
5
  */
6
- import { getContextBySessionId, saveState } from "../lib-ts/context/context-store.js";
6
+ import { saveState } from "../lib-ts/context/context-store.js";
7
7
  import {
8
- loadHookInput, logDebug, logError, logInfo, runHook,
8
+ logError, logInfo, requireBoundSession, runHook,
9
9
  } from "../lib-ts/hooks/hook-utils.js";
10
- import { getProjectRoot } from "../lib-ts/runtime/constants.js";
11
10
  import { getGitState } from "../lib-ts/runtime/git-state.js";
12
11
  import { nowIso } from "../lib-ts/runtime/utils.js";
13
12
 
14
13
  function main(): void {
15
- const payload = loadHookInput();
16
- if (!payload) return;
17
-
18
- const sessionId = payload.session_id;
19
- if (!sessionId) {
20
- logDebug("pre_compact", "No session_id, skipping");
21
- return;
22
- }
23
-
24
- const projectRoot = getProjectRoot(payload.cwd);
25
- const state = getContextBySessionId(sessionId, projectRoot);
26
- if (!state) {
27
- logDebug("pre_compact", `No context bound to session ${sessionId}`);
28
- return;
29
- }
14
+ const bound = requireBoundSession("pre_compact");
15
+ if (!bound) return;
16
+ const { sessionId, projectRoot, state } = bound;
30
17
 
31
18
  const gitState = getGitState(projectRoot);
32
19