@nathapp/nax 0.18.1

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 (459) hide show
  1. package/.gitlab-ci.yml +96 -0
  2. package/BRIEF.md +140 -0
  3. package/CHANGELOG.md +60 -0
  4. package/CLAUDE.md +159 -0
  5. package/README.md +373 -0
  6. package/US-007-IMPLEMENTATION.md +139 -0
  7. package/bin/nax.ts +930 -0
  8. package/biome.json +14 -0
  9. package/bun.lock +168 -0
  10. package/bunfig.toml +11 -0
  11. package/docs/20260216-fix-plan-context-review.md +56 -0
  12. package/docs/20260216-relentless-vs-ngent-comparison.md +208 -0
  13. package/docs/20260216-v02-plan.md +136 -0
  14. package/docs/20260216-v02-review.md +685 -0
  15. package/docs/20260217-dogfood-findings.md +56 -0
  16. package/docs/20260217-p2-plus-plan.md +117 -0
  17. package/docs/20260217-partial-fixes-plan.md +62 -0
  18. package/docs/20260217-plan-analyze-spec.md +117 -0
  19. package/docs/20260217-post-impl-review.md +1137 -0
  20. package/docs/20260217-quick-wins-plan.md +66 -0
  21. package/docs/20260217-split-runner-plan.md +75 -0
  22. package/docs/20260217-v03-impl-plan.md +80 -0
  23. package/docs/20260217-v03-post-impl-review.md +589 -0
  24. package/docs/20260217-v04-impl-plan.md +86 -0
  25. package/docs/20260217-v05-post-impl-review.md +850 -0
  26. package/docs/20260217-v06-post-impl-review.md +817 -0
  27. package/docs/20260218-adr003-port-plan.md +151 -0
  28. package/docs/20260218-review-adr003-verification.md +175 -0
  29. package/docs/20260219-fix-plan-bug16-19.md +79 -0
  30. package/docs/20260219-fix-plan-bug20-22.md +114 -0
  31. package/docs/20260219-plan-llm-routing.md +116 -0
  32. package/docs/20260219-review-bug20-22-fixes.md +135 -0
  33. package/docs/20260219-routing-baseline-keyword.md +63 -0
  34. package/docs/20260220-plan-structured-logging-p1.md +80 -0
  35. package/docs/20260220-plan-structured-logging-p2.md +37 -0
  36. package/docs/20260220-review-llm-routing.md +180 -0
  37. package/docs/20260220-review-post-fix-llm-routing.md +70 -0
  38. package/docs/20260221-fix-plan-relevantfiles-split.md +101 -0
  39. package/docs/20260221-fix-plan-routing-mode.md +125 -0
  40. package/docs/20260221-review-v0.9-implementation.md +379 -0
  41. package/docs/20260222-fix-plan-v091-routing-isolation.md +197 -0
  42. package/docs/20260223-fix-plan-prompt-audit.md +62 -0
  43. package/docs/20260224-nax-roadmap-phases.md +189 -0
  44. package/docs/20260225-phase2-llm-service-layer.md +401 -0
  45. package/docs/20260225-review-v0.10.1.md +187 -0
  46. package/docs/20260303-v010-implementation-plan.md +165 -0
  47. package/docs/CLAUDE.md.bak +191 -0
  48. package/docs/ROADMAP.md +165 -0
  49. package/docs/SPEC-rectification.md +0 -0
  50. package/docs/SPEC.md +324 -0
  51. package/docs/US-001-plugin-loading-verification.md +152 -0
  52. package/docs/architecture-analysis.md +1076 -0
  53. package/docs/bugs/BUG-21-escalation-null-attempts.md +48 -0
  54. package/docs/bugs-from-dogfood-run-c.md +243 -0
  55. package/docs/code-review-20260228.md +612 -0
  56. package/docs/code-review-v0.15.0.md +629 -0
  57. package/docs/hook-lifecycle-test-plan.md +149 -0
  58. package/docs/releases/v0.11.0-and-earlier.md +20 -0
  59. package/docs/releases/v0.12.0.md +15 -0
  60. package/docs/releases/v0.13.0.md +14 -0
  61. package/docs/releases/v0.14.0.md +20 -0
  62. package/docs/releases/v0.14.1.md +36 -0
  63. package/docs/releases/v0.14.2.md +51 -0
  64. package/docs/releases/v0.14.3.md +174 -0
  65. package/docs/releases/v0.14.4.md +94 -0
  66. package/docs/releases/v0.15.0.md +502 -0
  67. package/docs/releases/v0.15.1.md +170 -0
  68. package/docs/releases/v0.15.3.md +193 -0
  69. package/docs/specs/status-file-v0.10.1.md +812 -0
  70. package/docs/v0.10-global-config.md +206 -0
  71. package/docs/v0.10-plugin-system.md +415 -0
  72. package/docs/v0.10-prompt-optimizer.md +234 -0
  73. package/docs/v0.3-spec.md +244 -0
  74. package/docs/v0.4-spec.md +140 -0
  75. package/docs/v0.5-spec.md +237 -0
  76. package/docs/v0.6-spec.md +371 -0
  77. package/docs/v0.7-spec.md +177 -0
  78. package/docs/v0.8-llm-routing.md +206 -0
  79. package/docs/v0.8-structured-logging.md +132 -0
  80. package/docs/v0.9.3-prompt-audit.md +112 -0
  81. package/examples/plugins/console-reporter/index.test.ts +207 -0
  82. package/examples/plugins/console-reporter/index.ts +110 -0
  83. package/nax/config.json +147 -0
  84. package/nax/features/bugfix-v0171/prd.json +52 -0
  85. package/nax/features/config-management/prd.json +108 -0
  86. package/nax/features/config-management/progress.txt +5 -0
  87. package/nax/features/diagnose/acceptance.test.ts +412 -0
  88. package/nax/features/diagnose/prd.json +41 -0
  89. package/nax/features/orchestration-fixes/prd.json +89 -0
  90. package/nax/features/orchestration-fixes/progress.txt +1 -0
  91. package/nax/features/plugin-integration/US-007-VERIFICATION.md +259 -0
  92. package/nax/features/plugin-integration/prd.json +208 -0
  93. package/nax/features/plugin-integration/progress.txt +5 -0
  94. package/nax/features/precheck/prd.json +205 -0
  95. package/nax/features/precheck/progress.txt +15 -0
  96. package/nax/features/structured-logging/prd.json +199 -0
  97. package/nax/features/unlock/prd.json +36 -0
  98. package/package.json +47 -0
  99. package/src/acceptance/fix-generator.ts +348 -0
  100. package/src/acceptance/generator.ts +282 -0
  101. package/src/acceptance/index.ts +30 -0
  102. package/src/acceptance/types.ts +79 -0
  103. package/src/agents/claude-decompose.ts +169 -0
  104. package/src/agents/claude-plan.ts +139 -0
  105. package/src/agents/claude.ts +324 -0
  106. package/src/agents/cost.ts +268 -0
  107. package/src/agents/index.ts +13 -0
  108. package/src/agents/registry.ts +48 -0
  109. package/src/agents/types-extended.ts +133 -0
  110. package/src/agents/types.ts +113 -0
  111. package/src/agents/validation.ts +69 -0
  112. package/src/analyze/classifier.ts +305 -0
  113. package/src/analyze/index.ts +16 -0
  114. package/src/analyze/scanner.ts +175 -0
  115. package/src/analyze/types.ts +51 -0
  116. package/src/cli/accept.ts +108 -0
  117. package/src/cli/analyze-parser.ts +284 -0
  118. package/src/cli/analyze.ts +207 -0
  119. package/src/cli/config.ts +561 -0
  120. package/src/cli/constitution.ts +109 -0
  121. package/src/cli/diagnose-analysis.ts +159 -0
  122. package/src/cli/diagnose-formatter.ts +87 -0
  123. package/src/cli/diagnose.ts +203 -0
  124. package/src/cli/generate.ts +127 -0
  125. package/src/cli/index.ts +37 -0
  126. package/src/cli/init.ts +188 -0
  127. package/src/cli/interact.ts +295 -0
  128. package/src/cli/plan.ts +198 -0
  129. package/src/cli/plugins.ts +111 -0
  130. package/src/cli/prompts.ts +295 -0
  131. package/src/cli/runs.ts +174 -0
  132. package/src/cli/status-cost.ts +151 -0
  133. package/src/cli/status-features.ts +338 -0
  134. package/src/cli/status.ts +13 -0
  135. package/src/commands/common.ts +171 -0
  136. package/src/commands/diagnose.ts +17 -0
  137. package/src/commands/index.ts +8 -0
  138. package/src/commands/logs.ts +384 -0
  139. package/src/commands/precheck.ts +86 -0
  140. package/src/commands/unlock.ts +96 -0
  141. package/src/config/defaults.ts +160 -0
  142. package/src/config/index.ts +22 -0
  143. package/src/config/loader.ts +121 -0
  144. package/src/config/merger.ts +147 -0
  145. package/src/config/path-security.ts +121 -0
  146. package/src/config/paths.ts +27 -0
  147. package/src/config/schema.ts +56 -0
  148. package/src/config/schemas.ts +286 -0
  149. package/src/config/types.ts +423 -0
  150. package/src/config/validate.ts +103 -0
  151. package/src/constitution/generator.ts +191 -0
  152. package/src/constitution/generators/aider.ts +41 -0
  153. package/src/constitution/generators/claude.ts +35 -0
  154. package/src/constitution/generators/cursor.ts +36 -0
  155. package/src/constitution/generators/opencode.ts +38 -0
  156. package/src/constitution/generators/types.ts +33 -0
  157. package/src/constitution/generators/windsurf.ts +36 -0
  158. package/src/constitution/index.ts +10 -0
  159. package/src/constitution/loader.ts +133 -0
  160. package/src/constitution/types.ts +31 -0
  161. package/src/context/auto-detect.ts +227 -0
  162. package/src/context/builder.ts +246 -0
  163. package/src/context/elements.ts +83 -0
  164. package/src/context/formatter.ts +107 -0
  165. package/src/context/generator.ts +129 -0
  166. package/src/context/generators/aider.ts +34 -0
  167. package/src/context/generators/claude.ts +28 -0
  168. package/src/context/generators/cursor.ts +28 -0
  169. package/src/context/generators/opencode.ts +30 -0
  170. package/src/context/generators/windsurf.ts +28 -0
  171. package/src/context/greenfield.ts +114 -0
  172. package/src/context/index.ts +33 -0
  173. package/src/context/injector.ts +279 -0
  174. package/src/context/test-scanner.ts +370 -0
  175. package/src/context/types.ts +98 -0
  176. package/src/errors.ts +67 -0
  177. package/src/execution/batching.ts +157 -0
  178. package/src/execution/crash-recovery.ts +373 -0
  179. package/src/execution/escalation/escalation.ts +44 -0
  180. package/src/execution/escalation/index.ts +13 -0
  181. package/src/execution/escalation/tier-escalation.ts +295 -0
  182. package/src/execution/escalation/tier-outcome.ts +158 -0
  183. package/src/execution/helpers.ts +38 -0
  184. package/src/execution/index.ts +45 -0
  185. package/src/execution/lifecycle/acceptance-loop.ts +272 -0
  186. package/src/execution/lifecycle/headless-formatter.ts +85 -0
  187. package/src/execution/lifecycle/index.ts +12 -0
  188. package/src/execution/lifecycle/parallel-lifecycle.ts +101 -0
  189. package/src/execution/lifecycle/precheck-runner.ts +140 -0
  190. package/src/execution/lifecycle/run-cleanup.ts +81 -0
  191. package/src/execution/lifecycle/run-completion.ts +129 -0
  192. package/src/execution/lifecycle/run-initialization.ts +141 -0
  193. package/src/execution/lifecycle/run-lifecycle.ts +312 -0
  194. package/src/execution/lifecycle/run-setup.ts +204 -0
  195. package/src/execution/lifecycle/story-hooks.ts +38 -0
  196. package/src/execution/lifecycle/story-size-prompts.ts +123 -0
  197. package/src/execution/lock.ts +115 -0
  198. package/src/execution/parallel-executor.ts +216 -0
  199. package/src/execution/parallel.ts +400 -0
  200. package/src/execution/pid-registry.ts +280 -0
  201. package/src/execution/pipeline-result-handler.ts +388 -0
  202. package/src/execution/post-verify-rectification.ts +188 -0
  203. package/src/execution/post-verify.ts +274 -0
  204. package/src/execution/progress.ts +25 -0
  205. package/src/execution/prompts.ts +127 -0
  206. package/src/execution/queue-handler.ts +109 -0
  207. package/src/execution/rectification.ts +13 -0
  208. package/src/execution/runner.ts +377 -0
  209. package/src/execution/sequential-executor.ts +388 -0
  210. package/src/execution/status-file.ts +264 -0
  211. package/src/execution/status-writer.ts +139 -0
  212. package/src/execution/story-context.ts +229 -0
  213. package/src/execution/test-output-parser.ts +14 -0
  214. package/src/execution/verification.ts +72 -0
  215. package/src/hooks/index.ts +2 -0
  216. package/src/hooks/runner.ts +286 -0
  217. package/src/hooks/types.ts +67 -0
  218. package/src/interaction/chain.ts +154 -0
  219. package/src/interaction/index.ts +60 -0
  220. package/src/interaction/init.ts +83 -0
  221. package/src/interaction/plugins/auto.ts +217 -0
  222. package/src/interaction/plugins/cli.ts +300 -0
  223. package/src/interaction/plugins/telegram.ts +384 -0
  224. package/src/interaction/plugins/webhook.ts +258 -0
  225. package/src/interaction/state.ts +171 -0
  226. package/src/interaction/triggers.ts +229 -0
  227. package/src/interaction/types.ts +163 -0
  228. package/src/logger/formatters.ts +84 -0
  229. package/src/logger/index.ts +16 -0
  230. package/src/logger/logger.ts +298 -0
  231. package/src/logger/types.ts +48 -0
  232. package/src/logging/formatter.ts +355 -0
  233. package/src/logging/index.ts +22 -0
  234. package/src/logging/types.ts +93 -0
  235. package/src/metrics/aggregator.ts +190 -0
  236. package/src/metrics/index.ts +14 -0
  237. package/src/metrics/tracker.ts +200 -0
  238. package/src/metrics/types.ts +109 -0
  239. package/src/optimizer/index.ts +62 -0
  240. package/src/optimizer/noop.optimizer.ts +24 -0
  241. package/src/optimizer/rule-based.optimizer.ts +248 -0
  242. package/src/optimizer/types.ts +53 -0
  243. package/src/pipeline/events.ts +130 -0
  244. package/src/pipeline/index.ts +19 -0
  245. package/src/pipeline/runner.ts +161 -0
  246. package/src/pipeline/stages/acceptance.ts +197 -0
  247. package/src/pipeline/stages/completion.ts +99 -0
  248. package/src/pipeline/stages/constitution.ts +63 -0
  249. package/src/pipeline/stages/context.ts +117 -0
  250. package/src/pipeline/stages/execution.ts +194 -0
  251. package/src/pipeline/stages/index.ts +62 -0
  252. package/src/pipeline/stages/optimizer.ts +74 -0
  253. package/src/pipeline/stages/prompt.ts +57 -0
  254. package/src/pipeline/stages/queue-check.ts +103 -0
  255. package/src/pipeline/stages/review.ts +181 -0
  256. package/src/pipeline/stages/routing.ts +81 -0
  257. package/src/pipeline/stages/verify.ts +100 -0
  258. package/src/pipeline/types.ts +167 -0
  259. package/src/plugins/index.ts +31 -0
  260. package/src/plugins/loader.ts +287 -0
  261. package/src/plugins/registry.ts +168 -0
  262. package/src/plugins/types.ts +327 -0
  263. package/src/plugins/validator.ts +352 -0
  264. package/src/prd/index.ts +172 -0
  265. package/src/prd/types.ts +202 -0
  266. package/src/precheck/checks-blockers.ts +391 -0
  267. package/src/precheck/checks-warnings.ts +142 -0
  268. package/src/precheck/checks.ts +30 -0
  269. package/src/precheck/index.ts +247 -0
  270. package/src/precheck/story-size-gate.ts +144 -0
  271. package/src/precheck/types.ts +31 -0
  272. package/src/queue/index.ts +2 -0
  273. package/src/queue/manager.ts +254 -0
  274. package/src/queue/types.ts +54 -0
  275. package/src/review/index.ts +8 -0
  276. package/src/review/runner.ts +172 -0
  277. package/src/review/types.ts +66 -0
  278. package/src/routing/builder.ts +81 -0
  279. package/src/routing/chain.ts +74 -0
  280. package/src/routing/index.ts +16 -0
  281. package/src/routing/loader.ts +58 -0
  282. package/src/routing/router.ts +303 -0
  283. package/src/routing/strategies/adaptive.ts +215 -0
  284. package/src/routing/strategies/index.ts +8 -0
  285. package/src/routing/strategies/keyword.ts +163 -0
  286. package/src/routing/strategies/llm-prompts.ts +209 -0
  287. package/src/routing/strategies/llm.ts +235 -0
  288. package/src/routing/strategies/manual.ts +50 -0
  289. package/src/routing/strategy.ts +99 -0
  290. package/src/tdd/cleanup.ts +111 -0
  291. package/src/tdd/index.ts +23 -0
  292. package/src/tdd/isolation.ts +123 -0
  293. package/src/tdd/orchestrator.ts +383 -0
  294. package/src/tdd/prompts.ts +270 -0
  295. package/src/tdd/rectification-gate.ts +183 -0
  296. package/src/tdd/session-runner.ts +179 -0
  297. package/src/tdd/types.ts +81 -0
  298. package/src/tdd/verdict.ts +271 -0
  299. package/src/tui/App.tsx +265 -0
  300. package/src/tui/components/AgentPanel.tsx +75 -0
  301. package/src/tui/components/CostOverlay.tsx +118 -0
  302. package/src/tui/components/HelpOverlay.tsx +107 -0
  303. package/src/tui/components/StatusBar.tsx +63 -0
  304. package/src/tui/components/StoriesPanel.tsx +177 -0
  305. package/src/tui/hooks/useKeyboard.ts +142 -0
  306. package/src/tui/hooks/useLayout.ts +137 -0
  307. package/src/tui/hooks/usePipelineEvents.ts +183 -0
  308. package/src/tui/hooks/usePty.ts +194 -0
  309. package/src/tui/index.tsx +38 -0
  310. package/src/tui/types.ts +76 -0
  311. package/src/utils/git.ts +83 -0
  312. package/src/utils/queue-writer.ts +54 -0
  313. package/src/verification/executor.ts +235 -0
  314. package/src/verification/gate.ts +207 -0
  315. package/src/verification/index.ts +12 -0
  316. package/src/verification/parser.ts +230 -0
  317. package/src/verification/rectification.ts +108 -0
  318. package/src/verification/types.ts +113 -0
  319. package/src/worktree/dispatcher.ts +65 -0
  320. package/src/worktree/index.ts +2 -0
  321. package/src/worktree/manager.ts +187 -0
  322. package/src/worktree/merge.ts +301 -0
  323. package/src/worktree/types.ts +4 -0
  324. package/test/TEST_COVERAGE_US001.md +217 -0
  325. package/test/TEST_COVERAGE_US003.md +84 -0
  326. package/test/TEST_COVERAGE_US005.md +86 -0
  327. package/test/US-002-orchestrator.test.ts +246 -0
  328. package/test/acceptance/cm-003-default-view.test.ts +194 -0
  329. package/test/execution/pid-registry.test.ts +240 -0
  330. package/test/execution/post-verify.test.ts +224 -0
  331. package/test/helpers/timeout.ts +42 -0
  332. package/test/integration/US-002-TEST-SUMMARY.md +107 -0
  333. package/test/integration/US-003-TEST-SUMMARY.md +149 -0
  334. package/test/integration/US-004-TEST-SUMMARY.md +106 -0
  335. package/test/integration/US-005-TEST-SUMMARY.md +138 -0
  336. package/test/integration/US-007-TEST-SUMMARY.md +100 -0
  337. package/test/integration/agent-validation.test.ts +439 -0
  338. package/test/integration/analyze-integration.test.ts +261 -0
  339. package/test/integration/analyze-scanner.test.ts +131 -0
  340. package/test/integration/cli-config-default-edge-cases.test.ts +222 -0
  341. package/test/integration/cli-config-default-view.test.ts +229 -0
  342. package/test/integration/cli-config-diff.test.ts +460 -0
  343. package/test/integration/cli-config.test.ts +736 -0
  344. package/test/integration/cli-diagnose.test.ts +592 -0
  345. package/test/integration/cli-logs.test.ts +314 -0
  346. package/test/integration/cli-plugins.test.ts +678 -0
  347. package/test/integration/cli-precheck.test.ts +371 -0
  348. package/test/integration/cli-run-headless.test.ts +173 -0
  349. package/test/integration/cli.test.ts +75 -0
  350. package/test/integration/config/merger.test.ts +465 -0
  351. package/test/integration/config/paths.test.ts +51 -0
  352. package/test/integration/config-loader.test.ts +265 -0
  353. package/test/integration/config.test.ts +444 -0
  354. package/test/integration/context-integration.test.ts +702 -0
  355. package/test/integration/context-provider-injection.test.ts +506 -0
  356. package/test/integration/context-verification-integration.test.ts +295 -0
  357. package/test/integration/e2e.test.ts +896 -0
  358. package/test/integration/execution.test.ts +625 -0
  359. package/test/integration/helpers.test.ts +295 -0
  360. package/test/integration/hooks.test.ts +361 -0
  361. package/test/integration/interaction-chain-pipeline.test.ts +464 -0
  362. package/test/integration/isolation.test.ts +143 -0
  363. package/test/integration/logger.test.ts +461 -0
  364. package/test/integration/parallel.test.ts +250 -0
  365. package/test/integration/path-security.test.ts +173 -0
  366. package/test/integration/pipeline-acceptance.test.ts +302 -0
  367. package/test/integration/pipeline-events.test.ts +475 -0
  368. package/test/integration/pipeline.test.ts +658 -0
  369. package/test/integration/plan.test.ts +157 -0
  370. package/test/integration/plugin-routing.test.ts +921 -0
  371. package/test/integration/plugins/config-integration.test.ts +172 -0
  372. package/test/integration/plugins/config-resolution.test.ts +522 -0
  373. package/test/integration/plugins/loader.test.ts +641 -0
  374. package/test/integration/plugins/registry.test.ts +746 -0
  375. package/test/integration/plugins/validator.test.ts +563 -0
  376. package/test/integration/prd-pause.test.ts +205 -0
  377. package/test/integration/prd-resolvers.test.ts +185 -0
  378. package/test/integration/precheck-integration.test.ts +468 -0
  379. package/test/integration/precheck.test.ts +805 -0
  380. package/test/integration/progress.test.ts +34 -0
  381. package/test/integration/rectification-flow.test.ts +512 -0
  382. package/test/integration/reporter-lifecycle.test.ts +860 -0
  383. package/test/integration/review-config-commands.test.ts +319 -0
  384. package/test/integration/review-config-schema.test.ts +116 -0
  385. package/test/integration/review-plugin-integration.test.ts +722 -0
  386. package/test/integration/review.test.ts +149 -0
  387. package/test/integration/routing-stage-bug-021.test.ts +274 -0
  388. package/test/integration/routing-stage-greenfield.test.ts +286 -0
  389. package/test/integration/runner-config-plugins.test.ts +461 -0
  390. package/test/integration/runner-fixes.test.ts +399 -0
  391. package/test/integration/runner-plugin-integration.test.ts +543 -0
  392. package/test/integration/runner.test.ts +1679 -0
  393. package/test/integration/s5-greenfield-fallback.test.ts +297 -0
  394. package/test/integration/status-file-integration.test.ts +325 -0
  395. package/test/integration/status-file.test.ts +379 -0
  396. package/test/integration/status-writer.test.ts +345 -0
  397. package/test/integration/story-id-in-events.test.ts +273 -0
  398. package/test/integration/tdd-cleanup.test.ts +246 -0
  399. package/test/integration/tdd-orchestrator.test.ts +1762 -0
  400. package/test/integration/test-scanner.test.ts +403 -0
  401. package/test/integration/verification-asset-check.test.ts +142 -0
  402. package/test/integration/verify-stage.test.ts +275 -0
  403. package/test/integration/worktree/manager.test.ts +218 -0
  404. package/test/integration/worktree/merge.test.ts +341 -0
  405. package/test/manual/logging-formatter-demo.ts +158 -0
  406. package/test/ui/tui-agent-panel.test.tsx +99 -0
  407. package/test/ui/tui-controls.test.ts +334 -0
  408. package/test/ui/tui-cost-and-pty.test.ts +189 -0
  409. package/test/ui/tui-layout.test.ts +378 -0
  410. package/test/ui/tui-pty-integration.test.tsx +159 -0
  411. package/test/ui/tui-stories.test.ts +332 -0
  412. package/test/unit/acceptance.test.ts +186 -0
  413. package/test/unit/agent-stderr-capture.test.ts +146 -0
  414. package/test/unit/analyze-classifier.test.ts +215 -0
  415. package/test/unit/analyze.test.ts +224 -0
  416. package/test/unit/auto-detect.test.ts +249 -0
  417. package/test/unit/cli-status.test.ts +417 -0
  418. package/test/unit/commands/common.test.ts +320 -0
  419. package/test/unit/commands/logs.test.ts +416 -0
  420. package/test/unit/commands/unlock.test.ts +319 -0
  421. package/test/unit/constitution-generators.test.ts +160 -0
  422. package/test/unit/constitution.test.ts +209 -0
  423. package/test/unit/context.test.ts +1722 -0
  424. package/test/unit/cost.test.ts +231 -0
  425. package/test/unit/crash-recovery.test.ts +308 -0
  426. package/test/unit/escalation.test.ts +126 -0
  427. package/test/unit/execution-logging-stderr.test.ts +156 -0
  428. package/test/unit/execution-stage.test.ts +122 -0
  429. package/test/unit/fix-generator.test.ts +275 -0
  430. package/test/unit/formatters.test.ts +469 -0
  431. package/test/unit/greenfield.test.ts +179 -0
  432. package/test/unit/helpers.test.ts +317 -0
  433. package/test/unit/interaction/human-review-trigger.test.ts +164 -0
  434. package/test/unit/interaction-network-failures.test.ts +389 -0
  435. package/test/unit/interaction-plugins.test.ts +164 -0
  436. package/test/unit/isolation.test.ts +134 -0
  437. package/test/unit/logging/formatter.test.ts +455 -0
  438. package/test/unit/merge.test.ts +268 -0
  439. package/test/unit/metrics.test.ts +276 -0
  440. package/test/unit/optimizer/noop.optimizer.test.ts +125 -0
  441. package/test/unit/optimizer/rule-based.optimizer.test.ts +358 -0
  442. package/test/unit/prd-auto-default.test.ts +290 -0
  443. package/test/unit/prd-failure-category.test.ts +176 -0
  444. package/test/unit/prd-get-next-story.test.ts +186 -0
  445. package/test/unit/precheck-checks.test.ts +840 -0
  446. package/test/unit/precheck-story-size-gate.test.ts +287 -0
  447. package/test/unit/precheck-types.test.ts +142 -0
  448. package/test/unit/prompts.test.ts +475 -0
  449. package/test/unit/queue.test.ts +237 -0
  450. package/test/unit/rectification.test.ts +284 -0
  451. package/test/unit/registry.test.ts +287 -0
  452. package/test/unit/routing.test.ts +937 -0
  453. package/test/unit/run-lifecycle.test.ts +140 -0
  454. package/test/unit/storyid-events.test.ts +224 -0
  455. package/test/unit/tdd-verdict.test.ts +492 -0
  456. package/test/unit/test-output-parser.test.ts +377 -0
  457. package/test/unit/verdict.test.ts +324 -0
  458. package/test/unit/worktree-manager.test.ts +158 -0
  459. package/tsconfig.json +27 -0
package/.gitlab-ci.yml ADDED
@@ -0,0 +1,96 @@
1
+ # .gitlab-ci.yml - nax CI/CD
2
+ # Bun-native, single package (no turbo/monorepo)
3
+ #
4
+ # Triggers:
5
+ # - MR: test only (gate for merge)
6
+ # - [run-release] on master: test + release + notify
7
+ # - [run-prerelease] on non-master: test + canary release + notify
8
+ # - release-by-bot commits and tags: skipped entirely
9
+
10
+ stages:
11
+ - test
12
+ - release
13
+ - notify
14
+
15
+ # --- Stage: Test ---
16
+ test:
17
+ stage: test
18
+ image: nathapp/node-bun:22.21.0-1.3.9-alpine
19
+ before_script:
20
+ - apk add --no-cache git python3 make g++
21
+ - git config --global safe.directory '*'
22
+ - git config --global user.name "CI Runner"
23
+ - git config --global user.email "ci@nathapp.io"
24
+ cache:
25
+ key:
26
+ files:
27
+ - bun.lock
28
+ paths:
29
+ - node_modules/
30
+ policy: pull-push
31
+ script:
32
+ - bun install --frozen-lockfile --ignore-scripts
33
+ - bun run typecheck
34
+ - bun run lint
35
+ - NAX_SKIP_PRECHECK=1 bun test test/ --timeout=60000
36
+ rules:
37
+ - if: '$CI_COMMIT_MESSAGE =~ /release-by-bot/ || $CI_COMMIT_TAG'
38
+ when: never
39
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
40
+ - if: '$CI_COMMIT_MESSAGE =~ /run-prerelease/ && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
41
+ - if: '$CI_COMMIT_MESSAGE =~ /run-release/ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
42
+
43
+ # --- Stage: Release ---
44
+ release:
45
+ stage: release
46
+ image: nathapp/node-bun:22.21.0-1.3.9-alpine
47
+ cache:
48
+ key:
49
+ files:
50
+ - bun.lock
51
+ paths:
52
+ - node_modules/
53
+ policy: pull
54
+ variables:
55
+ NPM_REGISTRY: "//registry.npmjs.org/"
56
+ NPM_RELEASE_TOKEN: $NPM_TOKEN
57
+ before_script:
58
+ - apk add --no-cache git python3 make g++
59
+ - git config --global user.name "$GITLAB_USER_NAME"
60
+ - git config --global user.email "$GITLAB_USER_EMAIL"
61
+ script:
62
+ - bun install --frozen-lockfile --ignore-scripts
63
+ - VERSION=$(bun -e "console.log(require('./package.json').version)")
64
+ - bun run build
65
+ - echo "${NPM_REGISTRY}:_authToken=${NPM_RELEASE_TOKEN}" > .npmrc
66
+ - npm publish --access public
67
+ - git tag -a "v${VERSION}" -m "v${VERSION}"
68
+ - git push "https://${GITLAB_USER_NAME}:${CI_GIT_TOKEN}@${CI_REPOSITORY_URL#*@}" --tags
69
+ rules:
70
+ - if: '$CI_COMMIT_MESSAGE =~ /release-by-bot/ || $CI_COMMIT_TAG'
71
+ when: never
72
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
73
+ when: never
74
+ - if: '$CI_COMMIT_MESSAGE =~ /run-prerelease/ && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
75
+ variables:
76
+ NPM_REGISTRY: "//npm.nathapp.io/"
77
+ NPM_RELEASE_TOKEN: $NPM_PRIVATE_TOKEN
78
+ - if: '$CI_COMMIT_MESSAGE =~ /run-release/ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
79
+
80
+ # --- Stage: Notify ---
81
+ notify:
82
+ stage: notify
83
+ image: nathapp/node-bun:22.21.0-1.3.9-alpine
84
+ needs: [release]
85
+ script:
86
+ - VERSION=$(bun -e "console.log(require('./package.json').version)")
87
+ - 'curl -s -X POST -H "Content-Type: application/json" -d "{\"chat_id\": \"$TELEGRAM_CHAT_ID\", \"text\": \"nax v${VERSION} released\"}" https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage'
88
+ rules:
89
+ - if: '$CI_COMMIT_MESSAGE =~ /release-by-bot/ || $CI_COMMIT_TAG'
90
+ when: never
91
+ - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
92
+ when: never
93
+ - if: '$TELEGRAM_BOT_TOKEN == null || $TELEGRAM_BOT_TOKEN == ""'
94
+ when: never
95
+ - if: '$CI_COMMIT_MESSAGE =~ /run-prerelease/ && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
96
+ - if: '$CI_COMMIT_MESSAGE =~ /run-release/ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
package/BRIEF.md ADDED
@@ -0,0 +1,140 @@
1
+ # nax — Brief
2
+
3
+ ## What
4
+ AI coding agent orchestrator (CLI, Bun + TypeScript). Takes a feature spec, decomposes into user stories via LLM, routes each to the right model tier by complexity, and executes them with auto-escalation and retry. Supports three-session TDD for quality-critical work. Currently v0.10.1 on master. Published as `@nathapp/nax` (not yet on npm — local/global install only).
5
+
6
+ ## Architecture
7
+
8
+ ```
9
+ spec.md + tasks.md
10
+
11
+ nax analyze → prd.json (user stories with routing metadata)
12
+
13
+ nax run → pipeline per story:
14
+ routing → context → constitution → prompt → optimizer → execution → review → acceptance → completion
15
+ ↑ ↑
16
+ (v0.10 plugin) (v0.10 plugin)
17
+ ↑ ↑
18
+ plugin routers plugin context-providers
19
+ ```
20
+
21
+ **Key modules:**
22
+
23
+ | Module | Purpose |
24
+ |:-------|:--------|
25
+ | `pipeline/` | Stage-based runner — each stage returns continue/skip/fail/escalate/pause |
26
+ | `routing/` | Strategy chain: keyword → LLM → adaptive → manual → plugin |
27
+ | `context/` | Builds per-story context from PRD + dependencies within token budget |
28
+ | `tdd/` | Three-session orchestrator: test-writer → implementer → verifier with git-diff isolation |
29
+ | `execution/` | Spawns `claude -p` via ClaudeCodeAdapter, handles timeouts and cost tracking |
30
+ | `status-file/` | *(v0.10.1)* Atomic JSON status writer for external monitoring (dashboards/CI) |
31
+ | `acceptance/` | LLM-generated acceptance tests, validates story output |
32
+ | `agents/` | Adapter pattern — currently only Claude Code, designed for Codex/Gemini/OpenCode |
33
+ | `hooks/` | Lifecycle events (on-start, on-complete, on-pause, on-error) via shell commands |
34
+ | `config/` | Layered config: global (`~/.nax/`) → project (`nax/`) with Zod validation + deep merge |
35
+ | `constitution/` | Injected rules/constraints prepended to every agent prompt |
36
+ | `plugins/` | *(v0.10)* Plugin loader, registry, and extension point interfaces |
37
+ | `optimizer/` | *(v0.10)* Prompt optimization stage (rule-based built-in + plugin support) |
38
+
39
+ ## Key Decisions
40
+
41
+ | Decision | Why | Date | Ref |
42
+ |:---------|:----|:-----|:----|
43
+ | Classify complexity upfront, not start-cheap | Avoids wasting cycles on wrong model; LLM routing is cheap (~$0.002/story) | 2026-02-16 | SPEC.md |
44
+ | Three-session TDD (not two) | Session 3 (verifier) catches cases where implementer subtly modifies tests; git-diff isolation between all sessions | 2026-02-16 | SPEC.md |
45
+ | LLM outputs testStrategy directly | Keyword matching caused false positives ("endpoint"→TDD). LLM handles nuance better | 2026-02-23 | #11, #12 |
46
+ | Stage-based pipeline over monolithic runner | Composable, testable, each stage can skip/fail independently | 2026-02-17 | v0.3-spec |
47
+ | Bun over Node | Faster test execution, native TypeScript, built-in file APIs | 2026-02-16 | — |
48
+ | Token budget for context | Prevents context overflow (200k window); reserves 100k for agent reasoning | 2026-02-17 | context/builder.ts |
49
+ | Constitution as separate file | Project-level rules (coding standards, forbidden patterns) injected into every prompt without modifying CLAUDE.md | 2026-02-18 | — |
50
+ | Hooks over built-in integrations | Users wire their own notifications/CI via shell commands; nax stays standalone | 2026-02-16 | SPEC.md |
51
+ | Dropped greenfield scaffolding (#13) | Chicken-and-egg: nax/ must exist inside project, but scaffolding creates the project. Manual US-000 works fine. Existing tools (na-cli, nest new) handle scaffolding better. | 2026-03-03 | #13 |
52
+ | Test-writer allowed paths for barrel exports | `src/index.ts` re-exports are common TDD collateral; soft-warn instead of hard-block | 2026-02-22 | #9 |
53
+ | Story pause doesn't block unrelated stories | Dependency graph determines which stories can proceed independently | 2026-02-22 | #10 |
54
+ | Use actual BuiltContext tokens in frontmatter | Re-estimating tokens independently caused mismatches; element-level tracking is more accurate for audit | 2026-02-23 | #15 |
55
+ | Shared TDD prompt module | Extracting TDD prompts from orchestrator ensures consistency between CLI and execution | 2026-02-23 | #15 |
56
+ | Plugin system over ad-hoc extension | Unified registration/loading for all extension points (optimizer, router, agent, reviewer, context, reporter). Reuses existing interfaces. | 2026-03-03 | #8, #14 |
57
+ | Deep merge for global+project config | More intuitive than section replace; users only override what they change. Hooks and constitution concatenate (global first). | 2026-03-03 | #14 |
58
+ | No LLM optimizer built-in | Fast-tier LLM rewrite adds cost/complexity. Rule-based covers deterministic wins. External LLM optimizers (LLMLingua, etc.) can be added via plugins. | 2026-03-03 | #8 |
59
+ | TDD-Lite over removing TDD | TDD is nax's differentiator; instead of dropping it, add a relaxed variant (lite) where only verifier stays isolated. Strict for TS libs, lite for UI/polyglot. | 2026-02-24 | #20 |
60
+ | Fix nax over replacing with dev-orchestrator | dev-orchestrator lacks TDD pipeline, structured logging, PRD workflow. Porting those is more work than fixing nax's weaknesses. | 2026-02-24 | `docs/20260224-nax-roadmap-phases.md` |
61
+ | Dry-run marks stories as passed | Previous dry-run never changed story status, causing infinite loop until maxIterations. Now marks passed + saves PRD for natural completion. | 2026-02-24 | `09996c8` |
62
+ | Targeted git reset for TDD fallback | `git checkout .` was too aggressive; now resets only files touched by the failed session, preserving other local changes. | 2026-02-24 | `d1dc4b9` |
63
+ | Atomic Status File (v0.10.1) | Machine-readable status tracking via JSON. Atomic write (write-then-rename) prevents partial reads during polling. | 2026-02-25 | `status-file-v0.10.1.md` |
64
+ | Category-based TDD routing (v0.10.1) | Isolation violations trigger strategy downgrade (Lite) while mechanical failures trigger tier escalation. Reduces manual pause/resume cycles. | 2026-02-25 | `status-file-v0.10.1.md` |
65
+
66
+ ## Config Reference
67
+
68
+ Config loaded from `~/.nax/config.json` (global) deep-merged with `nax/config.json` (project). CLI flags override both.
69
+
70
+ **Resolution order:** Built-in defaults → `~/.nax/config.json` → `nax/config.json` → CLI flags
71
+
72
+ | Section | Key | Type | Default | Purpose |
73
+ |:--------|:----|:-----|:--------|:--------|
74
+ | models | fast/balanced/powerful | ModelDef \| string | haiku/sonnet/opus | Maps abstract tiers to actual models |
75
+ | autoMode | complexityRouting | Record<Complexity, Tier> | simple→fast, medium→balanced, complex/expert→powerful | Which tier handles which complexity |
76
+ | autoMode | escalation.tierOrder | TierConfig[] | fast×5, balanced×3, powerful×2 | Retry budget per tier before escalating |
77
+ | routing | strategy | keyword\|llm\|manual\|adaptive\|custom | keyword | How stories get classified |
78
+ | routing | llm.mode | one-shot\|per-story\|hybrid | hybrid | Batch-route upfront + re-route on retry |
79
+ | execution | costLimit | number (USD) | 5.0 | Pause run when cost exceeds this |
80
+ | execution | sessionTimeoutSeconds | number | 600 | Kill agent session after this |
81
+ | execution | verificationTimeoutSeconds | number | 300 | Kill test/typecheck/lint subprocess |
82
+ | quality | commands.test | string | (auto-detect) | Custom test command |
83
+ | quality | forceExit | boolean | false | Append --forceExit to test command |
84
+ | quality | stripEnvVars | string[] | CLAUDECODE, REPL_ID, AGENT | Env vars removed during verification |
85
+ | tdd | sessionTiers | {testWriter, implementer, verifier} | balanced/story-tier/fast | Per-session model overrides |
86
+ | tdd | testWriterAllowedPaths | string[] | src/index.ts, src/**/index.ts | Soft-allowed paths for test-writer |
87
+ | constitution | path | string | constitution.md | Relative to config dir (~/.nax/ or nax/) |
88
+ | constitution | skipGlobal | boolean | false | *(v0.10)* Skip global constitution for this project |
89
+ | context | testCoverage.detail | names-only\|names-and-counts\|describe-blocks | names-and-counts | How much test info to inject |
90
+ | context | testCoverage.maxTokens | number | 500 | Token budget for test coverage section |
91
+ | context | testCoverage.scopeToStory | boolean | true | Filter test coverage to story-relevant files only |
92
+ | acceptance | enabled | boolean | true | Run LLM acceptance validation |
93
+ | analyze | llmEnhanced | boolean | true | Use LLM for story decomposition |
94
+ | optimizer | enabled | boolean | false | *(v0.10)* Enable prompt optimization stage |
95
+ | optimizer | strategy | noop\|rule-based | noop | *(v0.10)* Built-in optimizer strategy |
96
+ | hooks | skipGlobal | boolean | false | *(v0.10)* Skip global hooks for this project |
97
+ | plugins | (array) | PluginConfigEntry[] | [] | *(v0.10)* Explicit plugin modules + config |
98
+
99
+ Full schema with Zod validation: `src/config/schema.ts`
100
+
101
+ ## v0.10 Specs
102
+
103
+ | Feature | Spec File | Stories | Summary |
104
+ |:--------|:----------|:--------|:--------|
105
+ | Plugin System | `docs/v0.10-plugin-system.md` | 9 | Loader, registry, 6 extension point interfaces (optimizer, router, agent, reviewer, context-provider, reporter) |
106
+ | Prompt Optimizer | `docs/v0.10-prompt-optimizer.md` | 5 | NoopOptimizer (default), RuleBasedOptimizer (strip whitespace, compact criteria, dedup context), optimizer pipeline stage |
107
+ | Global Config | `docs/v0.10-global-config.md` | 7 | `~/.nax/` directory, deep merge (project wins), hooks concatenate (global first), constitution concatenate, `nax init --global`, `skipGlobal` opt-out |
108
+ | Status File & Smart Escalation | `docs/specs/status-file-v0.10.1.md` | 9 | Atomic JSON status tracking, failure categorization, retry-as-lite strategy downgrade |
109
+
110
+ **Total: ~30 user stories** across 4 features.
111
+
112
+ ## Version History
113
+
114
+ | Version | What Changed | Issues |
115
+ |:--------|:-------------|:-------|
116
+ | v0.10.1 | Status file (machine-readable), Smart TDD escalation (retryAsLite), Verifier Verdicts | #16 |
117
+ | v0.10.0 | Plugin system, Global config layering, Prompt optimizer stage | #8, #14 |
118
+ | v0.9.3 | Prompt Audit CLI (`nax prompts`), context isolation unit tests, scoped test coverage scanner | #15 |
119
+
120
+ ## Roadmap
121
+
122
+ | Priority | Feature | Status | Ref |
123
+ |:---------|:--------|:-------|:----|
124
+ | **Done** | Phase 1: TDD-Lite strategy + zero-file fallback | ✅ Done | #20, `docs/20260224-nax-roadmap-phases.md` |
125
+ | **Next** | Phase 2: LLM Service Layer — agent interface with pluggable backends | 📋 Planned | #3 |
126
+ | **Next** | Phase 3: Worktree parallelism — N stories concurrent | 📋 Planned | — |
127
+ | **Backlog** | CLI for paused stories (`nax stories`, `nax resume`) | 📋 Planned | #18 |
128
+ | **Backlog** | Quality flags + review.checks unification | 📋 Planned | #19 |
129
+
130
+ ### Phase Dependency Chain
131
+ ```
132
+ Phase 1: tdd-lite + fallback ← standalone, no blockers
133
+
134
+ Phase 2: LLM Service Layer (#3) ← abstracts agent spawning (claude-cli, openclaw, api)
135
+
136
+ Phase 3: Worktree parallelism ← needs Phase 2 for multi-agent coordination
137
+ ```
138
+
139
+ ---
140
+ *Updated 2026-02-25*
package/CHANGELOG.md ADDED
@@ -0,0 +1,60 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.10.0] - 2026-02-23
9
+
10
+ ### Added
11
+
12
+ #### Plugin System
13
+ - Introduced extensible plugin architecture supporting:
14
+ - Prompt optimizers for context compression and token reduction
15
+ - Custom routers for intelligent agent/model selection
16
+ - Code reviewers for quality gates and automated checks
17
+ - Context providers for dynamic context injection
18
+ - Custom reporters for execution reporting and analytics
19
+ - Agent launchers for custom agent implementations
20
+ - Plugin discovery from both global (`~/.nax/plugins`) and project-local (`nax/plugins`) directories
21
+ - Plugin validation and lifecycle management (setup/teardown hooks)
22
+ - Safe plugin loading with comprehensive error handling
23
+ - Plugin configuration via `nax/config.json` with per-plugin settings
24
+
25
+ #### Global Configuration Layering
26
+ - Implemented three-tier configuration system:
27
+ - User-global config (`~/.nax/config.json`) for default preferences
28
+ - Project config (`nax/config.json`) for project-specific settings
29
+ - CLI overrides for runtime customization
30
+ - Deep merge strategy with array override semantics
31
+ - Layered constitution loading with optional global opt-out
32
+ - Project-level directory detection for automatic config discovery
33
+ - Validation and normalization at each layer
34
+
35
+ #### Prompt Optimizer
36
+ - Built-in prompt optimization system with modular optimizer plugins
37
+ - Token budget enforcement with configurable limits
38
+ - Multi-strategy optimization:
39
+ - Redundancy elimination
40
+ - Context summarization
41
+ - Selective detail retention
42
+ - Optimization statistics tracking (original vs. optimized token counts, reduction percentage)
43
+ - Integration with execution pipeline for automatic prompt optimization
44
+ - Plugin API for custom optimization strategies
45
+
46
+ ### Changed
47
+ - Refactored config loading to support global + project layering
48
+ - Updated constitution loader to support skipGlobal flag
49
+ - Enhanced plugin registry with proper lifecycle management
50
+ - Improved error handling across plugin loading and validation
51
+
52
+ ### Fixed
53
+ - Path security test failures on macOS (handled `/private` symlink prefix)
54
+ - TypeScript compilation errors across 9 files (20 total errors resolved)
55
+ - Import organization and code formatting issues (96 files auto-formatted)
56
+
57
+ ## [0.9.2] - 2026-02-XX
58
+
59
+ ### Previous releases
60
+ - See git history for changes prior to v0.10.0
package/CLAUDE.md ADDED
@@ -0,0 +1,159 @@
1
+ # nax — AI Coding Agent Orchestrator
2
+
3
+ Bun + TypeScript CLI that orchestrates AI coding agents with model routing, three-session TDD, and lifecycle hooks.
4
+
5
+ ## Git Identity
6
+
7
+ Always set before committing:
8
+ ```bash
9
+ git config user.name "subrina.tai"
10
+ git config user.email "subrina8080@outlook.com"
11
+ ```
12
+
13
+ ## Commands
14
+
15
+ - Test: `bun test`
16
+ - Typecheck: `bun run typecheck`
17
+ - Lint: `bun run lint`
18
+ - Dev: `bun run dev`
19
+ - Build: `bun run build`
20
+ - Run before commit: `bun test && bun run typecheck`
21
+
22
+ ## Code Style
23
+
24
+ - Bun-native APIs only (Bun.file, Bun.write, Bun.spawn, Bun.sleep) — no Node.js equivalents
25
+ - Functional style for pure logic; classes only for stateful adapters (e.g., ClaudeCodeAdapter)
26
+ - Types in `types.ts` per module, barrel exports via `index.ts`
27
+ - Max ~400 lines per file — split if larger
28
+ - Biome for formatting/linting
29
+
30
+ ## Testing
31
+
32
+ - Framework: `bun:test` (describe/test/expect)
33
+ - Unit tests: `test/unit/<module>.test.ts`
34
+ - Integration tests: `test/integration/<feature>.test.ts`
35
+ - Routing tests: `test/routing/<router>.test.ts`
36
+ - UI tests: `test/ui/` (TUI testing, rarely needed)
37
+ - All routing, classification, and isolation logic must have unit tests
38
+
39
+ ## Architecture
40
+
41
+ ### Execution Flow
42
+
43
+ ```
44
+ Runner.run() [src/execution/runner.ts]
45
+ -> loadPlugins() [src/plugins/loader.ts]
46
+ -> for each story:
47
+ -> Pipeline.execute() [src/pipeline/pipeline.ts]
48
+ -> stages: queueCheck -> routing -> constitution -> context -> prompt -> execution -> verify -> review -> completion
49
+ -> context stage injects plugin context providers [src/pipeline/stages/context.ts]
50
+ -> routing stage checks plugin routers first [src/routing/chain.ts]
51
+ -> Reporter.emit() [src/plugins/registry.ts]
52
+ -> registry.teardownAll()
53
+ ```
54
+
55
+ ### Key Directories
56
+
57
+ | Directory | Purpose |
58
+ |:---|:---|
59
+ | `src/execution/` | Runner loop, agent adapters (Claude Code), TDD strategies |
60
+ | `src/execution/lifecycle/` | (v0.15.0) Lifecycle hooks, startup/teardown orchestration |
61
+ | `src/execution/escalation/` | (v0.15.0) Acceptance-loop escalation logic (when agent fails repeatedly) |
62
+ | `src/execution/acceptance/` | (v0.15.0) Acceptance-loop iteration logic |
63
+ | `src/pipeline/stages/` | Pipeline stages (routing, context, prompt, execution, review, etc.) |
64
+ | `src/routing/` | Model routing — tier classification, router chain, plugin routers |
65
+ | `src/plugins/` | Plugin system — loader, registry, validator, types |
66
+ | `src/config/` | Config schema, loader (layered global + project) |
67
+ | `src/verification/` | (planned) Unified test execution, typecheck, lint, acceptance checks |
68
+ | `src/agents/adapters/` | Agent integrations (Claude Code, future: Devin, Aider, etc.) |
69
+ | `src/cli/` | CLI commands |
70
+ | `examples/plugins/` | Sample plugins (console-reporter) |
71
+
72
+ ### Plugin System
73
+
74
+ Plugins extend nax via 4 extension points:
75
+
76
+ | Extension | Interface | Integration Point |
77
+ |:---|:---|:---|
78
+ | **Context Provider** | `IContextProvider` | `src/pipeline/stages/context.ts` — injects context into agent prompts before execution |
79
+ | **Reviewer** | `IReviewer` | Pipeline review stage — runs after built-in checks (typecheck/lint/test) |
80
+ | **Reporter** | `IReporter` | `src/execution/runner.ts` — receives onRunStart/onStoryComplete/onRunEnd events |
81
+ | **Router** | `IRoutingStrategy` | `src/routing/chain.ts` — overrides model routing for specific stories |
82
+
83
+ Plugin loading order: global (`~/.nax/plugins/`) -> project (`<workdir>/nax/plugins/`) -> config (`plugins[]` in config.json).
84
+
85
+ ### Config
86
+
87
+ - Global: `~/.nax/config.json`
88
+ - Project: `<workdir>/nax/config.json`
89
+ - Key settings: `execution.contextProviderTokenBudget` (default: 2000), `plugins[]` array
90
+
91
+ ## Target Architecture (v0.15.0+)
92
+
93
+ ### File Size Hard Limit
94
+
95
+ **400 lines maximum per file.** If you are about to exceed it, STOP and split first.
96
+
97
+ ### execution/ Module Re-architecture Goal
98
+
99
+ Keep `runner.ts` as a **thin orchestrator only**. Extract:
100
+
101
+ - `sequential-executor.ts` — single-story execution loop
102
+ - `parallel-runner.ts` — parallel story execution (future)
103
+ - `acceptance-loop.ts` — retry/escalation logic for failed stories
104
+ - `reporter-notifier.ts` — plugin event emission (onRunStart, onStoryComplete, onRunEnd)
105
+ - `lifecycle/` subdir — startup, teardown, cleanup handlers
106
+ - `escalation/` subdir — escalation strategies when acceptance loop fails
107
+
108
+ **Never add new concerns to `runner.ts`** — new logic goes into a focused sub-module.
109
+
110
+ ### verification/ Unified Layer (Planned)
111
+
112
+ Do not duplicate test execution logic across pipeline stages. When building new verification features (typecheck, lint, test, acceptance checks), put the logic in `src/verification/` and call from pipeline stages. This prevents scattered test invocations and ensures consistent test result parsing.
113
+
114
+ ### Plugin Extension Points
115
+
116
+ When adding new agent integrations (e.g., Devin, Aider, Cursor):
117
+
118
+ 1. Add adapter class to `src/agents/adapters/<name>.ts`
119
+ 2. Register in `src/agents/adapters/index.ts`
120
+ 3. Do NOT inline agent logic in `runner.ts` or `claude.ts`
121
+
122
+ ### Logging Style
123
+
124
+ - No emojis in log messages
125
+ - Use `[OK]`, `[WARN]`, `[FAIL]`, `->` instead
126
+ - Keep logs machine-parseable
127
+
128
+ ### Configuration
129
+
130
+ - No hardcoded flags or credentials
131
+ - Always read from config schema (`src/config/schema.ts`)
132
+ - Validate config at startup
133
+
134
+ ### Closure Passing for Long-Lived Handlers
135
+
136
+ Pass **closures, not values** to long-lived handlers (crash handlers, heartbeat timers). This ensures handlers always reference the latest state, not stale snapshots.
137
+
138
+ ```typescript
139
+ // WRONG: Captures stale value
140
+ const handler = () => cleanup(currentStory)
141
+
142
+ // CORRECT: Closure references latest state
143
+ const handler = () => cleanup(() => getCurrentStory())
144
+ ```
145
+
146
+ ## Testing Constraints (CRITICAL)
147
+
148
+ - **Never spawn full `nax` processes in tests.** nax has prechecks (git-repo-exists, dependencies-installed) that fail in temp directories. Write unit tests with mocks instead.
149
+ - **Integration tests that need git:** Always `git init` + `git add` + `git commit` in the test fixture before running any code that triggers nax precheck validation.
150
+ - **Test files for crash/signal handling:** Use process-level mocks (e.g., mock `process.on('SIGTERM', ...)`) — do not send real signals in tests.
151
+ - **Context files:** If a test needs specific context files, create them in the test fixture directory — don't rely on auto-detection from the real workspace.
152
+
153
+ ## IMPORTANT
154
+
155
+ - Never hardcode API keys — agents use their own auth from env
156
+ - Agent adapters spawn external processes — always handle timeouts and cleanup
157
+ - Conventional commits: `feat:`, `fix:`, `refactor:`, `test:`, `docs:`, `chore:`
158
+ - Keep commits atomic — one logical change per commit
159
+ - Do NOT push to remote — let the human review and push