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,288 @@
1
+ /**
2
+ * Integration test for OrchestratorClaudeAgent via runOrchestrator().
3
+ * Tests the migration from direct execFileAsync to BaseCliAgent framework.
4
+ *
5
+ * Run: bun test .aiwcli/_cc-native/lib-ts/__tests__/orchestrator-agent.test.ts
6
+ */
7
+
8
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
9
+ import type { AgentConfig, OrchestratorConfig, OrchestratorResult } from "../types.js";
10
+
11
+ // Mock subprocess-utils to avoid actual CLI invocations
12
+ vi.mock("../../../_core/lib-ts/runtime/subprocess-utils.js", () => ({
13
+ findExecutable: vi.fn(),
14
+ execFileAsync: vi.fn(),
15
+ getInternalSubprocessEnv: vi.fn(() => ({})),
16
+ shellQuoteWin: vi.fn((s: string) => s),
17
+ }));
18
+
19
+ // Mock logger to suppress output
20
+ vi.mock("../../../_core/lib-ts/runtime/logger.js", () => ({
21
+ logDebug: vi.fn(),
22
+ logInfo: vi.fn(),
23
+ logWarn: vi.fn(),
24
+ logError: vi.fn(),
25
+ }));
26
+
27
+ const FAKE_PLAN = `# Add User Authentication
28
+
29
+ ## Steps
30
+ 1. Add JWT middleware
31
+ 2. Create login/register endpoints
32
+ 3. Add password hashing with bcrypt
33
+ 4. Write integration tests
34
+
35
+ ## Files
36
+ - src/auth/middleware.ts
37
+ - src/auth/routes.ts
38
+ - src/auth/hash.ts
39
+ `;
40
+
41
+ const FAKE_AGENTS: AgentConfig[] = [
42
+ {
43
+ name: "security-reviewer",
44
+ model: "claude-sonnet-4-5-20250929",
45
+ provider: "claude",
46
+ focus: "security",
47
+ enabled: true,
48
+ categories: ["code", "security"],
49
+ description: "Reviews security concerns",
50
+ system_prompt: "You are a security reviewer.",
51
+ },
52
+ {
53
+ name: "architecture-reviewer",
54
+ model: "claude-sonnet-4-5-20250929",
55
+ provider: "claude",
56
+ focus: "architecture",
57
+ enabled: true,
58
+ categories: ["code", "infrastructure"],
59
+ description: "Reviews architecture decisions",
60
+ system_prompt: "You are an architecture reviewer.",
61
+ },
62
+ {
63
+ name: "testing-reviewer",
64
+ model: "claude-sonnet-4-5-20250929",
65
+ provider: "claude",
66
+ focus: "testing",
67
+ enabled: true,
68
+ categories: ["code"],
69
+ description: "Reviews test coverage",
70
+ system_prompt: "You are a testing reviewer.",
71
+ },
72
+ ];
73
+
74
+ const FAKE_CONFIG: OrchestratorConfig = {
75
+ enabled: true,
76
+ model: "claude-sonnet-4-5-20250929",
77
+ timeout: 60,
78
+ };
79
+
80
+ const FAKE_SETTINGS: Record<string, unknown> = {
81
+ agentSelection: {
82
+ simple: { min: 1, max: 2 },
83
+ medium: { min: 3, max: 5 },
84
+ high: { min: 5, max: 8 },
85
+ fallbackCount: 2,
86
+ },
87
+ complexityCategories: ["code", "infrastructure", "documentation"],
88
+ };
89
+
90
+ describe("OrchestratorClaudeAgent via runOrchestrator", () => {
91
+ let findExecutable: ReturnType<typeof vi.fn>;
92
+ let execFileAsync: ReturnType<typeof vi.fn>;
93
+
94
+ beforeEach(async () => {
95
+ const subproc = await import("../../../_core/lib-ts/runtime/subprocess-utils.js");
96
+ findExecutable = subproc.findExecutable as ReturnType<typeof vi.fn>;
97
+ execFileAsync = subproc.execFileAsync as ReturnType<typeof vi.fn>;
98
+ });
99
+
100
+ afterEach(() => {
101
+ vi.clearAllMocks();
102
+ });
103
+
104
+ it("returns fallback when claude CLI not found", async () => {
105
+ findExecutable.mockReturnValue(null);
106
+
107
+ const { runOrchestrator } = await import("../orchestrator.js");
108
+ const result = await runOrchestrator(FAKE_PLAN, FAKE_AGENTS, FAKE_CONFIG, FAKE_SETTINGS);
109
+
110
+ expect(result.complexity).toBe("medium");
111
+ expect(result.category).toBe("code");
112
+ expect(result.selected_agents).toHaveLength(2); // fallbackCount
113
+ expect(result.error).toBeDefined();
114
+ });
115
+
116
+ it("parses valid orchestrator output", async () => {
117
+ findExecutable.mockReturnValue("/usr/bin/claude");
118
+
119
+ const mockOutput = JSON.stringify({
120
+ structured_output: {
121
+ complexity: "high",
122
+ category: "code",
123
+ selectedAgents: ["security-reviewer", "architecture-reviewer", "testing-reviewer"],
124
+ reasoning: "Authentication involves security-sensitive operations requiring thorough review.",
125
+ },
126
+ });
127
+
128
+ execFileAsync.mockResolvedValue({
129
+ stdout: mockOutput,
130
+ stderr: "",
131
+ exitCode: 0,
132
+ signal: null,
133
+ killed: false,
134
+ });
135
+
136
+ const { runOrchestrator } = await import("../orchestrator.js");
137
+ const result = await runOrchestrator(FAKE_PLAN, FAKE_AGENTS, FAKE_CONFIG, FAKE_SETTINGS);
138
+
139
+ expect(result.complexity).toBe("high");
140
+ expect(result.category).toBe("code");
141
+ expect(result.selected_agents).toEqual(["security-reviewer", "architecture-reviewer", "testing-reviewer"]);
142
+ expect(result.reasoning).toContain("security-sensitive");
143
+ expect(result.error).toBeUndefined();
144
+ });
145
+
146
+ it("returns fallback on timeout", async () => {
147
+ findExecutable.mockReturnValue("/usr/bin/claude");
148
+
149
+ execFileAsync.mockResolvedValue({
150
+ stdout: "",
151
+ stderr: "",
152
+ exitCode: null,
153
+ signal: "SIGTERM",
154
+ killed: true,
155
+ });
156
+
157
+ const { runOrchestrator } = await import("../orchestrator.js");
158
+ const result = await runOrchestrator(FAKE_PLAN, FAKE_AGENTS, FAKE_CONFIG, FAKE_SETTINGS);
159
+
160
+ expect(result.complexity).toBe("medium");
161
+ expect(result.error).toBeDefined();
162
+ });
163
+
164
+ it("returns fallback on non-zero exit with no output", async () => {
165
+ findExecutable.mockReturnValue("/usr/bin/claude");
166
+
167
+ execFileAsync.mockResolvedValue({
168
+ stdout: "",
169
+ stderr: "",
170
+ exitCode: 1,
171
+ signal: null,
172
+ killed: false,
173
+ });
174
+
175
+ const { runOrchestrator } = await import("../orchestrator.js");
176
+ const result = await runOrchestrator(FAKE_PLAN, FAKE_AGENTS, FAKE_CONFIG, FAKE_SETTINGS);
177
+
178
+ expect(result.complexity).toBe("medium");
179
+ expect(result.error).toBeDefined();
180
+ });
181
+
182
+ it("validates complexity enum — invalid falls back to medium", async () => {
183
+ findExecutable.mockReturnValue("/usr/bin/claude");
184
+
185
+ const mockOutput = JSON.stringify({
186
+ structured_output: {
187
+ complexity: "extreme", // invalid
188
+ category: "code",
189
+ selectedAgents: ["security-reviewer"],
190
+ reasoning: "Test",
191
+ },
192
+ });
193
+
194
+ execFileAsync.mockResolvedValue({
195
+ stdout: mockOutput,
196
+ stderr: "",
197
+ exitCode: 0,
198
+ signal: null,
199
+ killed: false,
200
+ });
201
+
202
+ const { runOrchestrator } = await import("../orchestrator.js");
203
+ const result = await runOrchestrator(FAKE_PLAN, FAKE_AGENTS, FAKE_CONFIG, FAKE_SETTINGS);
204
+
205
+ expect(result.complexity).toBe("medium"); // fallback
206
+ });
207
+
208
+ it("validates category — invalid falls back to code", async () => {
209
+ findExecutable.mockReturnValue("/usr/bin/claude");
210
+
211
+ const mockOutput = JSON.stringify({
212
+ structured_output: {
213
+ complexity: "simple",
214
+ category: "quantum-physics", // not in categories list
215
+ selectedAgents: [],
216
+ reasoning: "Test",
217
+ },
218
+ });
219
+
220
+ execFileAsync.mockResolvedValue({
221
+ stdout: mockOutput,
222
+ stderr: "",
223
+ exitCode: 0,
224
+ signal: null,
225
+ killed: false,
226
+ });
227
+
228
+ const { runOrchestrator } = await import("../orchestrator.js");
229
+ const result = await runOrchestrator(FAKE_PLAN, FAKE_AGENTS, FAKE_CONFIG, FAKE_SETTINGS);
230
+
231
+ expect(result.category).toBe("code"); // fallback
232
+ });
233
+
234
+ it("excludes mandatory agents from selection pool", async () => {
235
+ findExecutable.mockReturnValue("/usr/bin/claude");
236
+
237
+ const mockOutput = JSON.stringify({
238
+ structured_output: {
239
+ complexity: "medium",
240
+ category: "code",
241
+ selectedAgents: ["testing-reviewer"],
242
+ reasoning: "Only non-mandatory agents selected",
243
+ },
244
+ });
245
+
246
+ execFileAsync.mockResolvedValue({
247
+ stdout: mockOutput,
248
+ stderr: "",
249
+ exitCode: 0,
250
+ signal: null,
251
+ killed: false,
252
+ });
253
+
254
+ const mandatory = new Set(["security-reviewer"]);
255
+ const { runOrchestrator } = await import("../orchestrator.js");
256
+ const result = await runOrchestrator(FAKE_PLAN, FAKE_AGENTS, FAKE_CONFIG, FAKE_SETTINGS, mandatory);
257
+
258
+ expect(result.selected_agents).toEqual(["testing-reviewer"]);
259
+ });
260
+
261
+ it("passes correct CLI args to execFileAsync", async () => {
262
+ findExecutable.mockReturnValue("/usr/bin/claude");
263
+
264
+ execFileAsync.mockResolvedValue({
265
+ stdout: JSON.stringify({ structured_output: { complexity: "simple", category: "code", selectedAgents: [], reasoning: "test" } }),
266
+ stderr: "",
267
+ exitCode: 0,
268
+ signal: null,
269
+ killed: false,
270
+ });
271
+
272
+ const { runOrchestrator } = await import("../orchestrator.js");
273
+ await runOrchestrator(FAKE_PLAN, FAKE_AGENTS, FAKE_CONFIG, FAKE_SETTINGS);
274
+
275
+ expect(execFileAsync).toHaveBeenCalledOnce();
276
+ const [cliPath, args, opts] = execFileAsync.mock.calls[0];
277
+
278
+ expect(cliPath).toBe("/usr/bin/claude");
279
+ expect(args).toContain("--model");
280
+ expect(args).toContain(FAKE_CONFIG.model);
281
+ expect(args).toContain("--output-format");
282
+ expect(args).toContain("json");
283
+ expect(args).toContain("--json-schema");
284
+ expect(args).toContain("--system-prompt");
285
+ expect(args).toContain("-p");
286
+ expect(opts.timeout).toBe(FAKE_CONFIG.timeout * 1000);
287
+ });
288
+ });
@@ -0,0 +1,48 @@
1
+ import { expect } from "chai";
2
+ import { buildOrchestratorSchema } from "../orchestrator.js";
3
+
4
+ describe("orchestrator", () => {
5
+ describe("buildOrchestratorSchema", () => {
6
+ it("returns valid JSON schema object", () => {
7
+ const schema = buildOrchestratorSchema(
8
+ ["agent-a", "agent-b"],
9
+ ["code", "documentation"],
10
+ );
11
+ expect(schema.type).to.equal("object");
12
+ expect(schema.required).to.include("complexity");
13
+ expect(schema.required).to.include("selectedAgents");
14
+ });
15
+
16
+ it("constrains agent names with enum", () => {
17
+ const schema = buildOrchestratorSchema(
18
+ ["alpha", "beta"],
19
+ ["code"],
20
+ );
21
+ const props = schema.properties as any;
22
+ expect(props.selectedAgents.items.enum).to.deep.equal(["alpha", "beta"]);
23
+ });
24
+
25
+ it("omits enum when agent list is empty", () => {
26
+ const schema = buildOrchestratorSchema([], ["code"]);
27
+ const props = schema.properties as any;
28
+ expect(props.selectedAgents.items).to.not.have.property("enum");
29
+ });
30
+
31
+ it("constrains complexity to simple/medium/high", () => {
32
+ const schema = buildOrchestratorSchema(["a"], ["code"]);
33
+ const props = schema.properties as any;
34
+ expect(props.complexity.enum).to.deep.equal(["simple", "medium", "high"]);
35
+ });
36
+
37
+ it("includes categories in category enum", () => {
38
+ const schema = buildOrchestratorSchema(["a"], ["code", "life", "business"]);
39
+ const props = schema.properties as any;
40
+ expect(props.category.enum).to.deep.equal(["code", "life", "business"]);
41
+ });
42
+
43
+ it("disallows additional properties", () => {
44
+ const schema = buildOrchestratorSchema(["a"], ["code"]);
45
+ expect(schema.additionalProperties).to.equal(false);
46
+ });
47
+ });
48
+ });
@@ -0,0 +1,32 @@
1
+ import { expect } from "chai";
2
+ import { makeResult } from "../reviewers/types.js";
3
+ import type { ReviewData, Verdict } from "../types.js";
4
+
5
+ describe("reviewers", () => {
6
+ describe("makeResult", () => {
7
+ it("creates a ReviewerResult with all fields", () => {
8
+ const data: ReviewData = {
9
+ verdict: "pass",
10
+ summary: "All good",
11
+ summary_source: "reviewer",
12
+ issues: [],
13
+ missing_sections: [],
14
+ questions: [],
15
+ };
16
+ const result = makeResult("test-reviewer", true, "pass", data, '{"verdict":"pass"}', "");
17
+ expect(result.name).to.equal("test-reviewer");
18
+ expect(result.ok).to.be.true;
19
+ expect(result.verdict).to.equal("pass");
20
+ expect(result.data).to.deep.equal(data);
21
+ expect(result.raw).to.equal('{"verdict":"pass"}');
22
+ expect(result.err).to.equal("");
23
+ });
24
+
25
+ it("handles error case", () => {
26
+ const result = makeResult("failing-reviewer", false, "error", {}, "", "Connection timeout");
27
+ expect(result.ok).to.be.false;
28
+ expect(result.verdict).to.equal("error");
29
+ expect(result.err).to.equal("Connection timeout");
30
+ });
31
+ });
32
+ });
@@ -0,0 +1,124 @@
1
+ import { expect } from "chai";
2
+ import * as fs from "node:fs";
3
+ import * as path from "node:path";
4
+ import * as os from "node:os";
5
+ import {
6
+ getStateFilePath,
7
+ getIterationState,
8
+ updateIterationState,
9
+ shouldContinueIterating,
10
+ } from "../state.js";
11
+ import { PLANS_DIR } from "../constants.js";
12
+ import type { IterationState } from "../types.js";
13
+
14
+ describe("state", () => {
15
+ describe("getStateFilePath", () => {
16
+ it("derives .state.json from .md path", () => {
17
+ const planPath = path.join(PLANS_DIR, "my-plan.md");
18
+ const result = getStateFilePath(planPath);
19
+ expect(result).to.match(/my-plan\.state\.json$/);
20
+ });
21
+
22
+ it("throws for path outside PLANS_DIR", () => {
23
+ expect(() => getStateFilePath(path.join(os.tmpdir(), "evil.md"))).to.throw();
24
+ });
25
+ });
26
+
27
+ describe("getIterationState", () => {
28
+ it("returns existing iteration state from state object", () => {
29
+ const existing: IterationState = {
30
+ current: 2,
31
+ max: 3,
32
+ complexity: "high",
33
+ history: [],
34
+ };
35
+ const state = { iteration: existing };
36
+ const result = getIterationState(state, "medium");
37
+ expect(result.current).to.equal(2);
38
+ expect(result.complexity).to.equal("high");
39
+ });
40
+
41
+ it("initializes new iteration state with default max", () => {
42
+ const result = getIterationState({}, "simple");
43
+ expect(result.current).to.equal(1);
44
+ expect(result.max).to.equal(1);
45
+ expect(result.complexity).to.equal("simple");
46
+ expect(result.history).to.deep.equal([]);
47
+ });
48
+
49
+ it("uses config overrides for max iterations", () => {
50
+ const config = { reviewIterations: { simple: 5 } };
51
+ const result = getIterationState({}, "simple", config);
52
+ expect(result.max).to.equal(5);
53
+ });
54
+
55
+ it("defaults to 1 for unknown complexity", () => {
56
+ const result = getIterationState({}, "unknown");
57
+ expect(result.max).to.equal(1);
58
+ });
59
+
60
+ it("uses high complexity default (2 iterations)", () => {
61
+ const result = getIterationState({}, "high");
62
+ expect(result.max).to.equal(2);
63
+ });
64
+ });
65
+
66
+ describe("updateIterationState", () => {
67
+ it("adds entry to history", () => {
68
+ const iteration: IterationState = {
69
+ current: 1,
70
+ max: 2,
71
+ complexity: "medium",
72
+ history: [],
73
+ };
74
+ const state: Record<string, unknown> = {};
75
+ const result = updateIterationState(state, iteration, "hash123", "pass");
76
+ expect(iteration.history).to.have.length(1);
77
+ expect(iteration.history[0]?.hash).to.equal("hash123");
78
+ expect(iteration.history[0]?.verdict).to.equal("pass");
79
+ expect(result.iteration).to.equal(iteration);
80
+ });
81
+ });
82
+
83
+ describe("shouldContinueIterating", () => {
84
+ it("returns false when at max iterations", () => {
85
+ const iteration: IterationState = {
86
+ current: 2,
87
+ max: 2,
88
+ complexity: "high",
89
+ history: [],
90
+ };
91
+ expect(shouldContinueIterating(iteration, "warn")).to.be.false;
92
+ });
93
+
94
+ it("returns false on pass with earlyExitOnAllPass (default)", () => {
95
+ const iteration: IterationState = {
96
+ current: 1,
97
+ max: 3,
98
+ complexity: "high",
99
+ history: [],
100
+ };
101
+ expect(shouldContinueIterating(iteration, "pass")).to.be.false;
102
+ });
103
+
104
+ it("returns true when below max and verdict is not pass", () => {
105
+ const iteration: IterationState = {
106
+ current: 1,
107
+ max: 3,
108
+ complexity: "high",
109
+ history: [],
110
+ };
111
+ expect(shouldContinueIterating(iteration, "warn")).to.be.true;
112
+ });
113
+
114
+ it("continues on pass when earlyExitOnAllPass is false", () => {
115
+ const iteration: IterationState = {
116
+ current: 1,
117
+ max: 3,
118
+ complexity: "high",
119
+ history: [],
120
+ };
121
+ expect(shouldContinueIterating(iteration, "pass", { earlyExitOnAllPass: false })).to.be.true;
122
+ });
123
+ });
124
+ });
@@ -0,0 +1,93 @@
1
+ import { expect } from "chai";
2
+ import { worstVerdict, computeReviewDecision } from "../verdict.js";
3
+ import type { Verdict } from "../types.js";
4
+
5
+ describe("verdict", () => {
6
+ describe("worstVerdict", () => {
7
+ it("returns pass for empty list", () => {
8
+ expect(worstVerdict([])).to.equal("pass");
9
+ });
10
+
11
+ it("returns pass for all pass", () => {
12
+ expect(worstVerdict(["pass", "pass", "pass"])).to.equal("pass");
13
+ });
14
+
15
+ it("returns warn when warn present", () => {
16
+ expect(worstVerdict(["pass", "warn", "pass"])).to.equal("warn");
17
+ });
18
+
19
+ it("returns fail when fail present", () => {
20
+ expect(worstVerdict(["pass", "warn", "fail"])).to.equal("fail");
21
+ });
22
+
23
+ it("maps skip to pass level (worst stays pass)", () => {
24
+ // skip has same priority as pass (0), so worst remains "pass"
25
+ expect(worstVerdict(["skip", "skip"])).to.equal("pass");
26
+ });
27
+
28
+ it("maps error to warn level", () => {
29
+ expect(worstVerdict(["pass", "error"])).to.equal("warn");
30
+ });
31
+
32
+ it("fail beats error", () => {
33
+ expect(worstVerdict(["error", "fail"])).to.equal("fail");
34
+ });
35
+
36
+ it("returns pass for single pass", () => {
37
+ expect(worstVerdict(["pass"])).to.equal("pass");
38
+ });
39
+ });
40
+
41
+ describe("computeReviewDecision", () => {
42
+ it("returns no_signal for empty verdicts", () => {
43
+ const result = computeReviewDecision([]);
44
+ expect(result.should_deny).to.be.false;
45
+ expect(result.reason).to.equal("no_signal");
46
+ expect(result.score).to.equal(0.0);
47
+ });
48
+
49
+ it("returns no_signal when all skip/error", () => {
50
+ const result = computeReviewDecision(["skip", "error", "skip"]);
51
+ expect(result.should_deny).to.be.false;
52
+ expect(result.reason).to.equal("no_signal");
53
+ });
54
+
55
+ it("denies when any fail present (fail veto)", () => {
56
+ const result = computeReviewDecision(["pass", "fail", "pass"]);
57
+ expect(result.should_deny).to.be.true;
58
+ expect(result.reason).to.equal("fail_veto");
59
+ expect(result.score).to.equal(1.0);
60
+ });
61
+
62
+ it("accepts all pass", () => {
63
+ const result = computeReviewDecision(["pass", "pass", "pass"]);
64
+ expect(result.should_deny).to.be.false;
65
+ expect(result.reason).to.equal("acceptable");
66
+ expect(result.score).to.equal(0.0);
67
+ });
68
+
69
+ it("accepts warns (warn does not block)", () => {
70
+ const result = computeReviewDecision(["warn", "warn", "pass"]);
71
+ expect(result.should_deny).to.be.false;
72
+ expect(result.reason).to.equal("acceptable");
73
+ });
74
+
75
+ it("computes correct warn ratio", () => {
76
+ const result = computeReviewDecision(["warn", "pass"]);
77
+ expect(result.score).to.equal(0.5);
78
+ });
79
+
80
+ it("excludes skip and error from signal", () => {
81
+ const result = computeReviewDecision(["pass", "skip", "error"]);
82
+ expect(result.should_deny).to.be.false;
83
+ expect(result.reason).to.equal("acceptable");
84
+ expect(result.score).to.equal(0.0);
85
+ });
86
+
87
+ it("single fail denies", () => {
88
+ const result = computeReviewDecision(["fail"]);
89
+ expect(result.should_deny).to.be.true;
90
+ expect(result.reason).to.equal("fail_veto");
91
+ });
92
+ });
93
+ });