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,250 @@
1
+ /**
2
+ * Zod schemas mirroring types.ts for runtime validation at JSON.parse boundaries.
3
+ * All object schemas use .passthrough() to preserve method-specific extension fields.
4
+ * See types.ts for corresponding TypeScript interfaces.
5
+ */
6
+ import { z } from "zod";
7
+ export declare const ModeSchema: z.ZodEnum<{
8
+ idle: "idle";
9
+ active: "active";
10
+ has_staged_work: "has_staged_work";
11
+ }>;
12
+ export declare const GitStateSchema: z.ZodObject<{
13
+ branch: z.ZodOptional<z.ZodString>;
14
+ last_commit_short: z.ZodOptional<z.ZodString>;
15
+ uncommitted_files: z.ZodOptional<z.ZodArray<z.ZodString>>;
16
+ }, z.core.$loose>;
17
+ export declare const LastSessionSchema: z.ZodObject<{
18
+ context_remaining_pct: z.ZodOptional<z.ZodNumber>;
19
+ context_warnings_fired: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
20
+ git_state: z.ZodOptional<z.ZodObject<{
21
+ branch: z.ZodOptional<z.ZodString>;
22
+ last_commit_short: z.ZodOptional<z.ZodString>;
23
+ uncommitted_files: z.ZodOptional<z.ZodArray<z.ZodString>>;
24
+ }, z.core.$loose>>;
25
+ save_reason: z.ZodOptional<z.ZodString>;
26
+ saved_at: z.ZodOptional<z.ZodString>;
27
+ session_id: z.ZodOptional<z.ZodString>;
28
+ transcript_path: z.ZodOptional<z.ZodString>;
29
+ }, z.core.$loose>;
30
+ export declare const TaskSchema: z.ZodObject<{
31
+ active_form: z.ZodString;
32
+ completed_at: z.ZodNullable<z.ZodString>;
33
+ created_at: z.ZodString;
34
+ description: z.ZodString;
35
+ evidence: z.ZodString;
36
+ files_changed: z.ZodArray<z.ZodString>;
37
+ id: z.ZodString;
38
+ session_id: z.ZodOptional<z.ZodString>;
39
+ status: z.ZodEnum<{
40
+ blocked: "blocked";
41
+ completed: "completed";
42
+ in_progress: "in_progress";
43
+ pending: "pending";
44
+ }>;
45
+ subject: z.ZodString;
46
+ work_summary: z.ZodString;
47
+ }, z.core.$loose>;
48
+ export declare const ContextStateSchema: z.ZodObject<{
49
+ created_at: z.ZodString;
50
+ handoff_consumed: z.ZodOptional<z.ZodBoolean>;
51
+ handoff_path: z.ZodOptional<z.ZodNullable<z.ZodString>>;
52
+ id: z.ZodString;
53
+ last_active: z.ZodString;
54
+ last_session: z.ZodOptional<z.ZodNullable<z.ZodObject<{
55
+ context_remaining_pct: z.ZodOptional<z.ZodNumber>;
56
+ context_warnings_fired: z.ZodOptional<z.ZodArray<z.ZodNumber>>;
57
+ git_state: z.ZodOptional<z.ZodObject<{
58
+ branch: z.ZodOptional<z.ZodString>;
59
+ last_commit_short: z.ZodOptional<z.ZodString>;
60
+ uncommitted_files: z.ZodOptional<z.ZodArray<z.ZodString>>;
61
+ }, z.core.$loose>>;
62
+ save_reason: z.ZodOptional<z.ZodString>;
63
+ saved_at: z.ZodOptional<z.ZodString>;
64
+ session_id: z.ZodOptional<z.ZodString>;
65
+ transcript_path: z.ZodOptional<z.ZodString>;
66
+ }, z.core.$loose>>>;
67
+ method: z.ZodString;
68
+ mode: z.ZodEnum<{
69
+ idle: "idle";
70
+ active: "active";
71
+ has_staged_work: "has_staged_work";
72
+ }>;
73
+ next_artifact_type: z.ZodOptional<z.ZodNullable<z.ZodEnum<{
74
+ handoff: "handoff";
75
+ plan: "plan";
76
+ }>>>;
77
+ plan_anchors: z.ZodOptional<z.ZodArray<z.ZodString>>;
78
+ plan_consumed: z.ZodOptional<z.ZodBoolean>;
79
+ plan_hash: z.ZodOptional<z.ZodNullable<z.ZodString>>;
80
+ plan_hash_consumed: z.ZodOptional<z.ZodNullable<z.ZodString>>;
81
+ plan_id: z.ZodOptional<z.ZodNullable<z.ZodString>>;
82
+ plan_path: z.ZodOptional<z.ZodNullable<z.ZodString>>;
83
+ plan_signature: z.ZodOptional<z.ZodNullable<z.ZodString>>;
84
+ session_ids: z.ZodOptional<z.ZodArray<z.ZodString>>;
85
+ status: z.ZodEnum<{
86
+ active: "active";
87
+ completed: "completed";
88
+ }>;
89
+ summary: z.ZodString;
90
+ tags: z.ZodOptional<z.ZodArray<z.ZodString>>;
91
+ tasks: z.ZodOptional<z.ZodArray<z.ZodObject<{
92
+ active_form: z.ZodString;
93
+ completed_at: z.ZodNullable<z.ZodString>;
94
+ created_at: z.ZodString;
95
+ description: z.ZodString;
96
+ evidence: z.ZodString;
97
+ files_changed: z.ZodArray<z.ZodString>;
98
+ id: z.ZodString;
99
+ session_id: z.ZodOptional<z.ZodString>;
100
+ status: z.ZodEnum<{
101
+ blocked: "blocked";
102
+ completed: "completed";
103
+ in_progress: "in_progress";
104
+ pending: "pending";
105
+ }>;
106
+ subject: z.ZodString;
107
+ work_summary: z.ZodString;
108
+ }, z.core.$loose>>>;
109
+ work_consumed: z.ZodOptional<z.ZodBoolean>;
110
+ }, z.core.$loose>;
111
+ export declare const IndexEntrySchema: z.ZodObject<{
112
+ last_active: z.ZodString;
113
+ mode: z.ZodString;
114
+ summary: z.ZodString;
115
+ }, z.core.$loose>;
116
+ export declare const IndexFileSchema: z.ZodObject<{
117
+ contexts: z.ZodRecord<z.ZodString, z.ZodObject<{
118
+ last_active: z.ZodString;
119
+ mode: z.ZodString;
120
+ summary: z.ZodString;
121
+ }, z.core.$loose>>;
122
+ sessions: z.ZodRecord<z.ZodString, z.ZodString>;
123
+ updated_at: z.ZodString;
124
+ version: z.ZodLiteral<"3.0">;
125
+ }, z.core.$loose>;
126
+ export declare const LogEntrySchema: z.ZodObject<{
127
+ component: z.ZodOptional<z.ZodString>;
128
+ data: z.ZodOptional<z.ZodUnknown>;
129
+ hook: z.ZodString;
130
+ level: z.ZodEnum<{
131
+ error: "error";
132
+ warn: "warn";
133
+ debug: "debug";
134
+ info: "info";
135
+ }>;
136
+ msg: z.ZodString;
137
+ tb: z.ZodOptional<z.ZodString>;
138
+ ts: z.ZodString;
139
+ }, z.core.$loose>;
140
+ export declare const HookInputSchema: z.ZodObject<{
141
+ context_window: z.ZodOptional<z.ZodObject<{
142
+ context_window_size: z.ZodOptional<z.ZodNumber>;
143
+ current_usage: z.ZodOptional<z.ZodObject<{
144
+ cache_creation_input_tokens: z.ZodOptional<z.ZodNumber>;
145
+ cache_read_input_tokens: z.ZodOptional<z.ZodNumber>;
146
+ input_tokens: z.ZodOptional<z.ZodNumber>;
147
+ output_tokens: z.ZodOptional<z.ZodNumber>;
148
+ }, z.core.$loose>>;
149
+ }, z.core.$loose>>;
150
+ cwd: z.ZodOptional<z.ZodString>;
151
+ hook_event_name: z.ZodString;
152
+ permission_mode: z.ZodOptional<z.ZodString>;
153
+ session_id: z.ZodOptional<z.ZodString>;
154
+ source: z.ZodOptional<z.ZodString>;
155
+ tool_input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
156
+ tool_name: z.ZodOptional<z.ZodString>;
157
+ tool_result: z.ZodOptional<z.ZodString>;
158
+ transcript_path: z.ZodOptional<z.ZodString>;
159
+ }, z.core.$loose>;
160
+ export declare const HookOutputSchema: z.ZodObject<{
161
+ decision: z.ZodOptional<z.ZodLiteral<"block">>;
162
+ hookSpecificOutput: z.ZodOptional<z.ZodObject<{
163
+ additionalContext: z.ZodOptional<z.ZodString>;
164
+ hookEventName: z.ZodOptional<z.ZodString>;
165
+ permissionDecision: z.ZodOptional<z.ZodEnum<{
166
+ allow: "allow";
167
+ deny: "deny";
168
+ ask: "ask";
169
+ }>>;
170
+ permissionDecisionReason: z.ZodOptional<z.ZodString>;
171
+ updatedInput: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
172
+ }, z.core.$loose>>;
173
+ reason: z.ZodOptional<z.ZodString>;
174
+ }, z.core.$loose>;
175
+ export declare const PermissionRequestOutputSchema: z.ZodObject<{
176
+ decision: z.ZodObject<{
177
+ behavior: z.ZodEnum<{
178
+ allow: "allow";
179
+ deny: "deny";
180
+ }>;
181
+ message: z.ZodOptional<z.ZodString>;
182
+ updatedInput: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
183
+ updatedPermissions: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
184
+ }, z.core.$strip>;
185
+ }, z.core.$loose>;
186
+ export declare const InferenceResultSchema: z.ZodObject<{
187
+ error: z.ZodOptional<z.ZodString>;
188
+ latency_ms: z.ZodNumber;
189
+ output: z.ZodString;
190
+ success: z.ZodBoolean;
191
+ }, z.core.$loose>;
192
+ export declare const HandoffDocumentSchema: z.ZodObject<{
193
+ active_tasks: z.ZodArray<z.ZodObject<{
194
+ active_form: z.ZodString;
195
+ completed_at: z.ZodNullable<z.ZodString>;
196
+ created_at: z.ZodString;
197
+ description: z.ZodString;
198
+ evidence: z.ZodString;
199
+ files_changed: z.ZodArray<z.ZodString>;
200
+ id: z.ZodString;
201
+ session_id: z.ZodOptional<z.ZodString>;
202
+ status: z.ZodEnum<{
203
+ blocked: "blocked";
204
+ completed: "completed";
205
+ in_progress: "in_progress";
206
+ pending: "pending";
207
+ }>;
208
+ subject: z.ZodString;
209
+ work_summary: z.ZodString;
210
+ }, z.core.$loose>>;
211
+ completed_tasks_this_session: z.ZodArray<z.ZodObject<{
212
+ subject: z.ZodString;
213
+ }, z.core.$loose>>;
214
+ context_folder: z.ZodString;
215
+ context_id: z.ZodString;
216
+ context_summary: z.ZodString;
217
+ created_at: z.ZodString;
218
+ events_log_path: z.ZodString;
219
+ file_path: z.ZodNullable<z.ZodString>;
220
+ important_notes: z.ZodArray<z.ZodString>;
221
+ next_steps: z.ZodArray<z.ZodString>;
222
+ plan_path: z.ZodNullable<z.ZodString>;
223
+ reason: z.ZodString;
224
+ session_id: z.ZodString;
225
+ work_summary: z.ZodString;
226
+ }, z.core.$loose>;
227
+ export declare const HandoffSectionsSchema: z.ZodObject<{
228
+ completedWork: z.ZodNullable<z.ZodString>;
229
+ context: z.ZodNullable<z.ZodString>;
230
+ deadEnds: z.ZodNullable<z.ZodString>;
231
+ decisions: z.ZodNullable<z.ZodString>;
232
+ index: z.ZodNullable<z.ZodString>;
233
+ pending: z.ZodNullable<z.ZodString>;
234
+ plan: z.ZodNullable<z.ZodString>;
235
+ }, z.core.$loose>;
236
+ export declare const CaretCommandSchema: z.ZodObject<{
237
+ ends: z.ZodArray<z.ZodString>;
238
+ new_context_desc: z.ZodNullable<z.ZodString>;
239
+ remaining_prompt: z.ZodString;
240
+ select: z.ZodNullable<z.ZodString>;
241
+ }, z.core.$loose>;
242
+ export declare const AgentConfigSchema: z.ZodObject<{
243
+ categories: z.ZodArray<z.ZodString>;
244
+ description: z.ZodString;
245
+ focus: z.ZodString;
246
+ model: z.ZodString;
247
+ name: z.ZodString;
248
+ provider: z.ZodString;
249
+ system_prompt: z.ZodString;
250
+ }, z.core.$loose>;
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Zod schemas mirroring types.ts for runtime validation at JSON.parse boundaries.
3
+ * All object schemas use .passthrough() to preserve method-specific extension fields.
4
+ * See types.ts for corresponding TypeScript interfaces.
5
+ */
6
+ import { z } from "zod";
7
+ // §1.1
8
+ export const ModeSchema = z.enum(["active", "has_staged_work", "idle"]);
9
+ // §1.2
10
+ export const GitStateSchema = z
11
+ .object({
12
+ branch: z.string().optional(),
13
+ last_commit_short: z.string().optional(),
14
+ uncommitted_files: z.array(z.string()).optional(),
15
+ })
16
+ .passthrough();
17
+ export const LastSessionSchema = z
18
+ .object({
19
+ context_remaining_pct: z.number().optional(),
20
+ context_warnings_fired: z.array(z.number()).optional(),
21
+ git_state: GitStateSchema.optional(),
22
+ save_reason: z.string().optional(),
23
+ saved_at: z.string().optional(),
24
+ session_id: z.string().optional(),
25
+ transcript_path: z.string().optional(),
26
+ })
27
+ .passthrough();
28
+ // §1.3
29
+ export const TaskSchema = z
30
+ .object({
31
+ active_form: z.string(),
32
+ completed_at: z.string().nullable(),
33
+ created_at: z.string(),
34
+ description: z.string(),
35
+ evidence: z.string(),
36
+ files_changed: z.array(z.string()),
37
+ id: z.string(),
38
+ session_id: z.string().optional(),
39
+ status: z.enum(["blocked", "completed", "in_progress", "pending"]),
40
+ subject: z.string(),
41
+ work_summary: z.string(),
42
+ })
43
+ .passthrough();
44
+ // §1.1 (continued)
45
+ export const ContextStateSchema = z
46
+ .object({
47
+ created_at: z.string(),
48
+ handoff_consumed: z.boolean().optional(), // deprecated
49
+ handoff_path: z.string().nullable().optional(),
50
+ id: z.string(),
51
+ last_active: z.string(),
52
+ last_session: LastSessionSchema.nullable().optional(),
53
+ method: z.string(),
54
+ mode: ModeSchema,
55
+ next_artifact_type: z.enum(["handoff", "plan"]).nullable().optional(),
56
+ plan_anchors: z.array(z.string()).optional(),
57
+ plan_consumed: z.boolean().optional(), // deprecated
58
+ plan_hash: z.string().nullable().optional(),
59
+ plan_hash_consumed: z.string().nullable().optional(),
60
+ plan_id: z.string().nullable().optional(),
61
+ plan_path: z.string().nullable().optional(),
62
+ plan_signature: z.string().nullable().optional(),
63
+ session_ids: z.array(z.string()).optional(),
64
+ status: z.enum(["active", "completed"]),
65
+ summary: z.string(),
66
+ tags: z.array(z.string()).optional(),
67
+ tasks: z.array(TaskSchema).optional(),
68
+ work_consumed: z.boolean().optional(),
69
+ })
70
+ .passthrough();
71
+ // §1.4
72
+ export const IndexEntrySchema = z
73
+ .object({
74
+ last_active: z.string(),
75
+ mode: z.string(),
76
+ summary: z.string(),
77
+ })
78
+ .passthrough();
79
+ export const IndexFileSchema = z
80
+ .object({
81
+ contexts: z.record(z.string(), IndexEntrySchema),
82
+ sessions: z.record(z.string(), z.string()),
83
+ updated_at: z.string(),
84
+ version: z.literal("3.0"),
85
+ })
86
+ .passthrough();
87
+ // §1.5
88
+ export const LogEntrySchema = z
89
+ .object({
90
+ component: z.string().optional(),
91
+ data: z.unknown().optional(),
92
+ hook: z.string(),
93
+ level: z.enum(["debug", "error", "info", "warn"]),
94
+ msg: z.string(),
95
+ tb: z.string().optional(),
96
+ ts: z.string(),
97
+ })
98
+ .passthrough();
99
+ // §1.6
100
+ export const HookInputSchema = z
101
+ .object({
102
+ context_window: z
103
+ .object({
104
+ context_window_size: z.number().optional(),
105
+ current_usage: z
106
+ .object({
107
+ cache_creation_input_tokens: z.number().optional(),
108
+ cache_read_input_tokens: z.number().optional(),
109
+ input_tokens: z.number().optional(),
110
+ output_tokens: z.number().optional(),
111
+ })
112
+ .passthrough()
113
+ .optional(),
114
+ })
115
+ .passthrough()
116
+ .optional(),
117
+ cwd: z.string().optional(),
118
+ hook_event_name: z.string(),
119
+ permission_mode: z.string().optional(),
120
+ session_id: z.string().optional(),
121
+ source: z.string().optional(),
122
+ tool_input: z.record(z.string(), z.unknown()).optional(),
123
+ tool_name: z.string().optional(),
124
+ tool_result: z.string().optional(),
125
+ transcript_path: z.string().optional(),
126
+ })
127
+ .passthrough();
128
+ // §1.7
129
+ export const HookOutputSchema = z
130
+ .object({
131
+ decision: z.literal("block").optional(),
132
+ hookSpecificOutput: z
133
+ .object({
134
+ additionalContext: z.string().optional(),
135
+ hookEventName: z.string().optional(),
136
+ permissionDecision: z.enum(["allow", "ask", "deny"]).optional(),
137
+ permissionDecisionReason: z.string().optional(),
138
+ updatedInput: z.record(z.string(), z.unknown()).optional(),
139
+ })
140
+ .passthrough()
141
+ .optional(),
142
+ reason: z.string().optional(),
143
+ })
144
+ .passthrough();
145
+ // §1.7b
146
+ export const PermissionRequestOutputSchema = z
147
+ .object({
148
+ decision: z.object({
149
+ behavior: z.enum(["allow", "deny"]),
150
+ message: z.string().optional(),
151
+ updatedInput: z.record(z.string(), z.unknown()).optional(),
152
+ updatedPermissions: z.record(z.string(), z.unknown()).optional(),
153
+ }),
154
+ })
155
+ .passthrough();
156
+ // §1.8
157
+ export const InferenceResultSchema = z
158
+ .object({
159
+ error: z.string().optional(),
160
+ latency_ms: z.number(),
161
+ output: z.string(),
162
+ success: z.boolean(),
163
+ })
164
+ .passthrough();
165
+ // §1.9
166
+ export const HandoffDocumentSchema = z
167
+ .object({
168
+ active_tasks: z.array(TaskSchema),
169
+ completed_tasks_this_session: z.array(z.object({ subject: z.string() }).passthrough()),
170
+ context_folder: z.string(),
171
+ context_id: z.string(),
172
+ context_summary: z.string(),
173
+ created_at: z.string(),
174
+ events_log_path: z.string(),
175
+ file_path: z.string().nullable(),
176
+ important_notes: z.array(z.string()),
177
+ next_steps: z.array(z.string()),
178
+ plan_path: z.string().nullable(),
179
+ reason: z.string(),
180
+ session_id: z.string(),
181
+ work_summary: z.string(),
182
+ })
183
+ .passthrough();
184
+ // §1.10
185
+ export const HandoffSectionsSchema = z
186
+ .object({
187
+ completedWork: z.string().nullable(),
188
+ context: z.string().nullable(),
189
+ deadEnds: z.string().nullable(),
190
+ decisions: z.string().nullable(),
191
+ index: z.string().nullable(),
192
+ pending: z.string().nullable(),
193
+ plan: z.string().nullable(),
194
+ })
195
+ .passthrough();
196
+ // §1.11
197
+ export const CaretCommandSchema = z
198
+ .object({
199
+ ends: z.array(z.string()),
200
+ new_context_desc: z.string().nullable(),
201
+ remaining_prompt: z.string(),
202
+ select: z.string().nullable(),
203
+ })
204
+ .passthrough();
205
+ // §1.13
206
+ export const AgentConfigSchema = z
207
+ .object({
208
+ categories: z.array(z.string()),
209
+ description: z.string(),
210
+ focus: z.string(),
211
+ model: z.string(),
212
+ name: z.string(),
213
+ provider: z.string(),
214
+ system_prompt: z.string(),
215
+ })
216
+ .passthrough();
@@ -0,0 +1,32 @@
1
+ /**
2
+ * SentinelManager — owns sentinel IPC lifecycle (creation, wait, cleanup).
3
+ * Replaces scattered createSentinelIpcPaths + cleanupSentinelIpc across backends.
4
+ */
5
+ import { type SentinelIpcPaths } from './runtime/sentinel-ipc.js';
6
+ export interface SentinelIO {
7
+ create(toolName: string): SentinelIpcPaths;
8
+ waitForExit(sentinelPath: string, timeoutMs: number): Promise<number | null>;
9
+ cleanup(paths: SentinelIpcPaths): void;
10
+ }
11
+ export declare class SentinelManager {
12
+ private readonly tracked;
13
+ private readonly io;
14
+ constructor(io?: SentinelIO);
15
+ /**
16
+ * Create a sentinel IPC path set for tracking a pane's exit code.
17
+ * Returns the sentinelPath string, or undefined if disabled.
18
+ */
19
+ create(toolName: string, enabled?: boolean): string | undefined;
20
+ /**
21
+ * Wait for the sentinel file to be written, then read the exit code.
22
+ */
23
+ waitForExit(sentinelPath: string, timeoutMs?: number): Promise<number | null>;
24
+ /**
25
+ * Clean up a specific sentinel by its path.
26
+ */
27
+ cleanup(sentinelPath: string): void;
28
+ /**
29
+ * Clean up all tracked sentinels. Call in finally block.
30
+ */
31
+ cleanupAll(): void;
32
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * SentinelManager — owns sentinel IPC lifecycle (creation, wait, cleanup).
3
+ * Replaces scattered createSentinelIpcPaths + cleanupSentinelIpc across backends.
4
+ */
5
+ import { cleanupSentinelIpc, createSentinelIpcPaths, readSentinelExitCode, waitForSentinelFile, } from './runtime/sentinel-ipc.js';
6
+ const defaultIO = {
7
+ create(toolName) {
8
+ return createSentinelIpcPaths(`aiwcli-pane-${toolName}`);
9
+ },
10
+ async waitForExit(sentinelPath, timeoutMs) {
11
+ const found = await waitForSentinelFile(sentinelPath, timeoutMs);
12
+ return found ? readSentinelExitCode(sentinelPath, 1) : null;
13
+ },
14
+ cleanup(paths) {
15
+ cleanupSentinelIpc(paths);
16
+ },
17
+ };
18
+ export class SentinelManager {
19
+ tracked = [];
20
+ io;
21
+ constructor(io) {
22
+ this.io = io ?? defaultIO;
23
+ }
24
+ /**
25
+ * Create a sentinel IPC path set for tracking a pane's exit code.
26
+ * Returns the sentinelPath string, or undefined if disabled.
27
+ */
28
+ create(toolName, enabled = true) {
29
+ if (!enabled)
30
+ return undefined;
31
+ const paths = this.io.create(toolName);
32
+ this.tracked.push(paths);
33
+ return paths.sentinelPath;
34
+ }
35
+ /**
36
+ * Wait for the sentinel file to be written, then read the exit code.
37
+ */
38
+ async waitForExit(sentinelPath, timeoutMs = 14_400_000) {
39
+ return this.io.waitForExit(sentinelPath, timeoutMs);
40
+ }
41
+ /**
42
+ * Clean up a specific sentinel by its path.
43
+ */
44
+ cleanup(sentinelPath) {
45
+ const entry = this.tracked.find((p) => p.sentinelPath === sentinelPath);
46
+ if (entry) {
47
+ this.io.cleanup(entry);
48
+ const index = this.tracked.indexOf(entry);
49
+ if (index >= 0)
50
+ this.tracked.splice(index, 1);
51
+ }
52
+ }
53
+ /**
54
+ * Clean up all tracked sentinels. Call in finally block.
55
+ */
56
+ cleanupAll() {
57
+ for (const paths of this.tracked) {
58
+ this.io.cleanup(paths);
59
+ }
60
+ this.tracked.length = 0;
61
+ }
62
+ }
@@ -1,5 +1,6 @@
1
1
  export interface SentinelWrapParams {
2
2
  autoClose: boolean;
3
+ autoCloseCommand?: string | undefined;
3
4
  command: string;
4
5
  holdMessage: string;
5
6
  holdPane: boolean;
@@ -1,12 +1,21 @@
1
1
  import { quoteForPowerShell, quoteForSh } from './shell-quoting.js';
2
2
  export function wrapSentinelSh(params) {
3
3
  const { command, sentinelPath, autoClose, holdPane, holdMessage } = params;
4
- const base = `${command}; code=$?; printf '%s' "$code" > ${quoteForSh(sentinelPath)}`;
4
+ const quoted = quoteForSh(sentinelPath);
5
+ // Trap HUP/INT/TERM so the sentinel is written even if the pane is killed.
6
+ const trap = `trap 'printf "%s" "130" > ${quoted}; exit 130' HUP INT TERM`;
7
+ const base = `${trap}; ${command}; code=$?; printf '%s' "$code" > ${quoted}`;
5
8
  if (autoClose) {
6
- return `${base}; tmux kill-pane -t "$TMUX_PANE" >/dev/null 2>&1 || true; exit $code`;
9
+ const killCmd = params.autoCloseCommand
10
+ ?? 'tmux kill-pane -t "$TMUX_PANE" >/dev/null 2>&1 || true';
11
+ return `${base}; ${killCmd}; exit $code`;
7
12
  }
8
13
  if (holdPane) {
9
- return `${base}; echo; echo ${quoteForSh(holdMessage)}; exec bash`;
14
+ // Launch an interactive login shell to hold the pane open.
15
+ // Use "$BASH" (current bash) to avoid resolving to WSL's bash.
16
+ // Do NOT use 'exec' — on MSYS2/Windows exec emulates by spawning a new
17
+ // process and exiting the original, which causes WezTerm to close the pane.
18
+ return `${base}; echo; echo ${quoteForSh(holdMessage)}; "$BASH" -li`;
10
19
  }
11
20
  return `${base}; exit $code`;
12
21
  }
@@ -1,7 +1,7 @@
1
- import { promises as fs } from 'node:fs';
2
1
  import { homedir } from 'node:os';
3
2
  import { join } from 'node:path';
4
3
  import { IdePathResolver } from './ide-path-resolver.js';
4
+ import { readJsonFile, writeJsonFile } from './json-io.js';
5
5
  import { pathExists } from './paths.js';
6
6
  /**
7
7
  * Discover Claude settings files in the hierarchy
@@ -46,14 +46,7 @@ export async function discoverSettingsFiles(projectDir) {
46
46
  * @returns Parsed settings or undefined if file doesn't exist or is invalid
47
47
  */
48
48
  export async function readClaudeSettings(path) {
49
- try {
50
- const content = await fs.readFile(path, 'utf8');
51
- return JSON.parse(content);
52
- }
53
- catch {
54
- // File doesn't exist or invalid JSON
55
- return undefined;
56
- }
49
+ return readJsonFile(path);
57
50
  }
58
51
  /**
59
52
  * Write Claude settings to file
@@ -66,17 +59,7 @@ export async function readClaudeSettings(path) {
66
59
  * @throws Error if write fails
67
60
  */
68
61
  export async function writeClaudeSettings(path, settings) {
69
- // Create parent directory if it doesn't exist
70
- const dir = join(path, '..');
71
- await fs.mkdir(dir, { recursive: true });
72
- // Backup existing file if it exists
73
- if (await pathExists(path)) {
74
- const backupPath = `${path}.backup`;
75
- await fs.copyFile(path, backupPath);
76
- }
77
- // Write settings with pretty formatting
78
- const content = JSON.stringify(settings, null, 2);
79
- await fs.writeFile(path, content, 'utf8');
62
+ return writeJsonFile(path, settings, { backup: true });
80
63
  }
81
64
  /**
82
65
  * Get the target settings file for template hook merging
@@ -0,0 +1,18 @@
1
+ /**
2
+ * BashAdapter — ShellAdapter for bash (Unix + MSYS2/Git Bash on Windows).
3
+ * Delegates to low-level primitives in shell-quoting.ts, sentinel-wrapper.ts, etc.
4
+ */
5
+ import type { SentinelWrapOptions, ShellAdapter, ToolCommandParams } from './shell-adapter.js';
6
+ export declare class BashAdapter implements ShellAdapter {
7
+ readonly dialect: "bash";
8
+ quote(value: string): string;
9
+ buildEnvPreamble(env: Record<string, string>): string;
10
+ buildToolCommand(params: ToolCommandParams): string;
11
+ wrapSentinel(params: SentinelWrapOptions): string;
12
+ resolveToolPath(toolName: string, nativePath: string): Promise<string | null>;
13
+ buildNestingCleanup(): string;
14
+ normalizeCwd(cwd: string): string;
15
+ wrapQuickExitRetry(command: string, toolPath: string, thresholdSec?: number): string;
16
+ encodeForExecution(command: string): string;
17
+ private appendPromptArg;
18
+ }