@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
@@ -0,0 +1,165 @@
1
+ # v0.10 Implementation Plan
2
+
3
+ **Date:** 2026-03-03
4
+ **Branch:** `feat/v0.10-plugins`
5
+ **Base:** v0.9.3 (master, `d4562b2`)
6
+
7
+ ## Test Strategy
8
+ - Mode: hybrid
9
+ - TDD targets: plugin types, plugin loader/validator, merger utility, optimizer interface
10
+ - Test-after targets: pipeline integration, CLI commands, config schema updates
11
+
12
+ ## Phase 1: Plugin System Foundation (Types + Loader + Registry)
13
+
14
+ ### 1a: Plugin types and extension interfaces
15
+ **Files:**
16
+ - `src/plugins/types.ts` — `NaxPlugin`, `PluginType`, `PluginExtensions`, `IPromptOptimizer`, `IReviewPlugin`, `IContextProvider`, `IReporter` + event types
17
+ - `src/plugins/index.ts` — public exports
18
+
19
+ **Change:** Define all interfaces. `RoutingStrategy` and `AgentAdapter` already exist — reference them, don't duplicate.
20
+
21
+ ### 1b: Plugin validator
22
+ **File:** `src/plugins/validator.ts`
23
+ **Change:** `validatePlugin(module: unknown): NaxPlugin | null` — runtime type checks (name string, version string, provides array, matching extensions). Returns null + logs warning on invalid.
24
+
25
+ ### 1c: Plugin loader
26
+ **File:** `src/plugins/loader.ts`
27
+ **Change:** `loadPlugins(globalDir, projectDir, configPlugins)` — scan directories, import modules, validate, call setup(), return registry. Directory auto-discovery + explicit config modules.
28
+
29
+ ### 1d: Plugin registry
30
+ **File:** `src/plugins/registry.ts`
31
+ **Change:** `PluginRegistry` class with typed getters (`getOptimizers()`, `getRouters()`, etc.) and `teardownAll()`.
32
+
33
+ ### Tests:
34
+ - `test/plugins/validator.test.ts` — valid/invalid plugin shapes
35
+ - `test/plugins/loader.test.ts` — directory scan, module loading, validation
36
+ - `test/plugins/registry.test.ts` — registration, getters, teardown
37
+
38
+ **Commit:** `feat(plugins): add plugin system foundation (types, loader, registry)`
39
+
40
+ ## Phase 2: Config Layering (Global + Project + Deep Merge)
41
+
42
+ ### 2a: Config paths resolver
43
+ **File:** `src/config/paths.ts`
44
+ **Change:** `globalConfigDir()` → `~/.nax/`, `projectConfigDir(dir?)` → `<cwd>/nax/`. Handle XDG_CONFIG_HOME if set.
45
+
46
+ ### 2b: Deep merge utility
47
+ **File:** `src/config/merger.ts`
48
+ **Change:** `mergeConfigs(base, override)` — recursive object merge, arrays replace, `null` removes keys. Special handling: hooks and constitution concatenate via `skipGlobal` check.
49
+
50
+ ### 2c: Update loadConfig()
51
+ **File:** `src/config/loader.ts` (modify existing)
52
+ **Change:** Load global → project → merge → apply CLI flags. Update existing `loadConfig()` signature.
53
+
54
+ ### 2d: Zod schema updates
55
+ **File:** `src/config/schema.ts` (modify existing)
56
+ **Change:** Add `HooksConfig` (`skipGlobal`, `dir`), `ConstitutionConfig` (`path`, `skipGlobal`), `OptimizerConfig` (`enabled`, `strategy`, `strategies`), `PluginConfigEntry` (`module`, `config`), `plugins` array to root schema.
57
+
58
+ ### 2e: `nax init --global`
59
+ **File:** `src/commands/init.ts` (modify existing)
60
+ **Change:** Add `--global` flag. Creates `~/.nax/config.json` (with commented examples), `~/.nax/constitution.md`, `~/.nax/hooks/`.
61
+
62
+ ### 2f: Hook concatenation
63
+ **File:** `src/hooks/loader.ts` (modify existing)
64
+ **Change:** Load hooks from global dir first, then project dir. Both fire independently. Respect `skipGlobal`.
65
+
66
+ ### 2g: Constitution concatenation
67
+ **File:** `src/constitution/loader.ts` (modify existing)
68
+ **Change:** Prepend global constitution to project constitution with `---` separator. Respect `skipGlobal`.
69
+
70
+ ### Tests:
71
+ - `test/config/merger.test.ts` — deep merge, null removal, array replace
72
+ - `test/config/paths.test.ts` — path resolution
73
+ - `test/config/loader.test.ts` — global+project merge integration
74
+ - Update existing hook/constitution tests for concatenation
75
+
76
+ **Commit:** `feat(config): add global config layering with deep merge`
77
+
78
+ ## Phase 3: Prompt Optimizer
79
+
80
+ ### 3a: Optimizer types + NoopOptimizer
81
+ **Files:**
82
+ - `src/optimizer/types.ts` — `IPromptOptimizer`, `PromptOptimizerInput`, `PromptOptimizerResult`
83
+ - `src/optimizer/noop.optimizer.ts` — passthrough, zero savings
84
+ - `src/optimizer/index.ts` — exports + `resolveOptimizer()` factory
85
+
86
+ ### 3b: RuleBasedOptimizer
87
+ **File:** `src/optimizer/rule-based.optimizer.ts`
88
+ **Rules:** `stripWhitespace`, `compactCriteria`, `deduplicateContext`, `maxPromptTokens`
89
+
90
+ ### 3c: Optimizer pipeline stage
91
+ **File:** `src/pipeline/stages/optimizer.ts`
92
+ **Change:** New stage between prompt and execution. Uses `resolveOptimizer()` which checks plugin registry first, then built-in strategy.
93
+
94
+ ### 3d: Wire optimizer stage into pipeline
95
+ **File:** `src/pipeline/stages/index.ts` (modify)
96
+ **Change:** Insert `optimizerStage` after `promptStage` in `defaultPipeline`.
97
+
98
+ ### Tests:
99
+ - `test/optimizer/noop.test.ts`
100
+ - `test/optimizer/rule-based.test.ts` — each rule individually + combined
101
+ - `test/optimizer/stage.test.ts` — pipeline integration
102
+
103
+ **Commit:** `feat(optimizer): add prompt optimization stage with rule-based optimizer`
104
+
105
+ ## Phase 4: Pipeline Integration + CLI
106
+
107
+ ### 4a: Add PluginRegistry to PipelineContext
108
+ **File:** `src/pipeline/types.ts` (modify)
109
+ **Change:** Add `plugins?: PluginRegistry` field.
110
+
111
+ ### 4b: Initialize plugins in runner
112
+ **File:** `src/pipeline/runner.ts` (modify)
113
+ **Change:** Load plugins at run start, pass registry to context, teardown at run end.
114
+
115
+ ### 4c: Wire plugin routers into routing chain
116
+ **File:** `src/routing/chain.ts` or `src/routing/builder.ts` (modify)
117
+ **Change:** Prepend plugin routers before built-in strategies.
118
+
119
+ ### 4d: Wire plugin reviewers into review stage
120
+ **File:** `src/pipeline/stages/review.ts` (modify)
121
+ **Change:** Run plugin reviewers after built-in checks.
122
+
123
+ ### 4e: Wire context providers into context stage
124
+ **File:** `src/pipeline/stages/context.ts` (modify)
125
+ **Change:** Append provider content after built context, within token budget.
126
+
127
+ ### 4f: Wire reporters into runner
128
+ **File:** `src/pipeline/runner.ts` (modify)
129
+ **Change:** Emit `onRunStart`, `onStoryComplete`, `onRunEnd` to all reporters.
130
+
131
+ ### 4g: `nax plugins list` CLI
132
+ **File:** `src/commands/plugins.ts` (new)
133
+ **Change:** Show loaded plugins with name, version, provides, source (global/project/config).
134
+
135
+ ### Tests:
136
+ - Update existing pipeline/runner tests for plugin initialization
137
+ - `test/commands/plugins.test.ts` — CLI output
138
+
139
+ **Commit:** `feat(pipeline): integrate plugin system into pipeline + add plugins CLI`
140
+
141
+ ## Phase 5: Final Verification + Version Bump
142
+
143
+ 1. Run full test suite: `bun test`
144
+ 2. Run typecheck: `tsc --noEmit`
145
+ 3. Run lint: `eslint src/`
146
+ 4. Bump version to `0.10.0` in package.json
147
+ 5. Update CHANGELOG.md
148
+
149
+ **Commit:** `chore: bump version to v0.10.0`
150
+
151
+ ---
152
+
153
+ ## Execution Plan
154
+
155
+ | Phase | Target | Estimated Duration | Strategy |
156
+ |:------|:-------|:------------------|:---------|
157
+ | 1 | Mac01 (claude-monitor) | ~15 min | test-first for types + loader |
158
+ | 2 | Mac01 (claude-monitor) | ~15 min | test-first for merger, test-after for wiring |
159
+ | 3 | Mac01 (claude-monitor) | ~10 min | test-first for optimizers |
160
+ | 4 | Mac01 (claude-monitor) | ~15 min | test-after for pipeline wiring |
161
+ | 5 | Mac01 (claude-monitor) | ~5 min | verification only |
162
+
163
+ All phases run sequentially on Mac01 via `claude-run.sh --phases`.
164
+
165
+ **Branch strategy:** Single feature branch `feat/v0.10-plugins`, one commit per phase, squash merge to master.
@@ -0,0 +1,191 @@
1
+ # @nathapp/nax — AI Coding Agent Orchestrator
2
+
3
+ Standalone CLI (Bun + TypeScript) that orchestrates AI coding agents with smart model routing, three-session TDD, and lifecycle hooks. NOT an OpenClaw skill — independent npm package.
4
+
5
+ **CLI command:** `nax`
6
+
7
+ ## Commands
8
+
9
+ ```bash
10
+ bun test # Run all tests (bun:test)
11
+ bun run typecheck # TypeScript type checking (tsc --noEmit)
12
+ bun run lint # Biome linter (src/ bin/)
13
+ bun run dev # Run CLI locally
14
+ bun run build # Bundle for distribution
15
+ ```
16
+
17
+ ## Architecture
18
+
19
+ ```
20
+ bin/nax.ts # CLI entry point (commander)
21
+ src/
22
+ agents/ # AgentAdapter interface + implementations (claude.ts)
23
+ cli/ # CLI commands (init, run, features, agents, status)
24
+ config/ # NaxConfig schema + layered loader + validation (global → project)
25
+ execution/ # Main orchestration loop (the core)
26
+ hooks/ # Lifecycle hooks (hooks.json → shell commands + NAX_* env)
27
+ pipeline/ # Pipeline orchestration utilities
28
+ prd/ # PRD/user-story loader, ordering, completion tracking
29
+ queue/ # Queue manager for multi-agent parallel execution
30
+ routing/ # Complexity classifier + test strategy decision tree
31
+ tdd/ # Three-session TDD types + file isolation checker + orchestrator
32
+ test/ # Bun test files (*.test.ts)
33
+ ```
34
+
35
+ ### Key Concepts
36
+
37
+ - **Complexity Routing**: Tasks classified as simple/medium/complex/expert → mapped to model tiers (cheap/standard/premium)
38
+ - **Three-Session TDD**: Session 1 (test-writer, only test files) → Session 2 (implementer, only source files) → Session 3 (verifier, auto-approves legitimate fixes)
39
+ - **Isolation Enforcement**: Git diff verification between TDD sessions — test-writer can't touch source, implementer can't touch tests
40
+ - **Hook System**: `hooks.json` maps lifecycle events (on-start, on-complete, on-pause, on-error, on-story-start, on-story-end) to shell commands
41
+ - **Layered Config**: `~/.nax/config.json` (global) merged with `<project>/nax/config.json` (project overrides)
42
+
43
+ ### Pipeline Architecture (v0.3 target)
44
+
45
+ The execution loop should be refactored from a monolithic `run()` into composable pipeline stages. This enables adding/removing/reordering stages without editing a 600+ line function.
46
+
47
+ ```typescript
48
+ // src/pipeline/types.ts
49
+ interface PipelineStage {
50
+ name: string; // unique stage identifier
51
+ enabled: (ctx: PipelineContext) => boolean; // skip if false
52
+ execute: (ctx: PipelineContext) => Promise<StageResult>; // do the work
53
+ }
54
+
55
+ interface PipelineContext {
56
+ config: NaxConfig;
57
+ prd: PRD;
58
+ story: UserStory; // current story (or batch leader)
59
+ stories: UserStory[]; // batch (length 1 for single)
60
+ routing: RoutingResult;
61
+ workdir: string;
62
+ featureDir?: string;
63
+ hooks: HooksConfig;
64
+ // accumulated through stages
65
+ constitution?: string;
66
+ contextMarkdown?: string;
67
+ prompt?: string;
68
+ agentResult?: AgentResult;
69
+ reviewResult?: ReviewResult;
70
+ }
71
+
72
+ type StageResult =
73
+ | { action: 'continue' } // proceed to next stage
74
+ | { action: 'skip'; reason: string } // skip this story
75
+ | { action: 'fail'; reason: string } // mark story failed
76
+ | { action: 'escalate' } // retry with higher tier
77
+ | { action: 'pause'; reason: string } // pause execution (queue command)
78
+ ```
79
+
80
+ **Default pipeline stages (in order):**
81
+ ```typescript
82
+ const defaultPipeline: PipelineStage[] = [
83
+ queueCheckStage, // check for PAUSE/ABORT/SKIP commands
84
+ routingStage, // classify complexity → model tier
85
+ constitutionStage, // load & inject project constitution
86
+ contextStage, // build file context from relevant sources
87
+ promptStage, // assemble final prompt from story + context + constitution
88
+ executionStage, // spawn agent session (single, batch, or TDD)
89
+ verifyStage, // check agent output, tests pass
90
+ reviewStage, // post-impl quality gate (typecheck/lint/test)
91
+ completionStage, // mark story done, fire hooks, log progress
92
+ ];
93
+ ```
94
+
95
+ **Design rules:**
96
+ - Each stage is a separate file: `src/pipeline/stages/<name>.ts`
97
+ - Stages communicate via `PipelineContext` — no side-channel state
98
+ - The pipeline runner (`src/pipeline/runner.ts`) iterates stages, handles StageResult actions
99
+ - The outer loop (load PRD → pick story → run pipeline → repeat) stays in `src/execution/runner.ts` but delegates per-story work to the pipeline
100
+ - Hooks fire inside stages (e.g., `completionStage` fires `on-story-complete`), not in the outer loop
101
+ - Config can override stage order or disable stages: `config.pipeline.stages`
102
+
103
+ ## Code Style
104
+
105
+ - Bun-native APIs preferred (Bun.file, Bun.write, Bun.spawn, Bun.sleep)
106
+ - Each module directory: `types.ts` (interfaces), implementation files, `index.ts` (barrel exports)
107
+ - Immutable patterns — avoid mutation
108
+ - No classes unless wrapping stateful adapters (like ClaudeCodeAdapter)
109
+ - Functional style for pure logic (routing, classification, isolation checks)
110
+ - Biome for formatting and linting
111
+
112
+ ## Testing
113
+
114
+ - Test framework: `bun:test` (describe/test/expect)
115
+ - Test files: `test/*.test.ts`
116
+ - Test naming: `test/<module>.test.ts`
117
+ - All routing/classification logic must have unit tests
118
+ - Isolation checker must have unit tests
119
+ - Run `bun test` before committing — all tests must pass
120
+
121
+ ## File Conventions
122
+
123
+ - Max ~400 lines per file, split if larger
124
+ - Types/interfaces in dedicated `types.ts` per module
125
+ - Barrel exports via `index.ts` — import from module path, not deep paths
126
+ - Config defaults co-located with schema (`DEFAULT_CONFIG` in `schema.ts`)
127
+
128
+ ## Current Status (v0.2.0-dev)
129
+
130
+ **Tests:** 222 passing across 16 files, 504 assertions
131
+ **Last Review:** 2026-02-17 — Grade B+ (82/100) — see `docs/20260217-post-impl-review.md`
132
+
133
+ ### Implemented (v0.1 → v0.2)
134
+ - [x] Agent adapter interface + Claude Code implementation
135
+ - [x] Config schema + layered loader + validation
136
+ - [x] Hook lifecycle system + **command injection prevention** (SEC-1 ✅)
137
+ - [x] Complexity-based routing + test strategy decision tree
138
+ - [x] TDD isolation checker + three-session TDD orchestrator
139
+ - [x] PRD loader/saver with dependency-aware ordering
140
+ - [x] Execution runner with cost tracking
141
+ - [x] Queue manager + **PAUSE/ABORT/SKIP commands** (v0.2 Phase 2 ✅)
142
+ - [x] CLI: init, run, analyze, features create/list, agents, status
143
+ - [x] **Story-scoped context extraction from PRD** (v0.2 Phase 1 ✅)
144
+ - [x] **Explicit 3-tier escalation chain** fast→balanced→powerful (v0.2 Phase 3 ✅)
145
+ - [x] **Story batching for simple stories** with --no-batch flag (v0.2 Phase 4 ✅)
146
+ - [x] **Path validation + bounds checking** (SEC-2 ✅) — `src/config/path-security.ts`
147
+ - [x] **Agent installation check + retry with exponential backoff** (BUG-1 partial ✅)
148
+ - [x] **Atomic queue file handling** — rename-before-read pattern (BUG-2 ✅)
149
+ - [x] **PRD size limits** — `maxStoriesPerFeature` config + validation (MEM-1 partial ✅)
150
+ - [x] **Improved cost estimation** — structured output parsing + confidence (BUG-3 partial ✅)
151
+ - [x] **Story dependency validation** in analyze command (BUG-6 ✅)
152
+ - [x] **Hook timeout messages** — clear timeout vs failure distinction (BUG-5 ✅)
153
+
154
+ ### Remaining Issues (from review, by priority)
155
+
156
+ #### P1 — Reliability
157
+ - [ ] **MEM-1 (partial):** Lazy loading for large PRDs not implemented — only size limit validation exists. No memory pressure detection or streaming JSON parsing.
158
+ - [ ] **PERF-1:** O(n²) batch story selection — not yet optimized with pre-computed eligible stories.
159
+ - [ ] **BUG-3 (partial):** Cost estimation still falls back to duration-based guessing when structured output unavailable. No per-story confidence scores.
160
+
161
+ #### P2 — Quality
162
+ - [ ] **ENH-1:** JSDoc coverage ~40% — `src/agents/claude.ts` (1 JSDoc), `bin/nax.ts` (1 JSDoc) are underserved. Most exported functions in runner.ts have docs but `routeTask()`, `buildContext()`, `runThreeSessionTdd()` lack usage examples.
163
+ - [ ] **TYPE-1:** Config loader still uses `as unknown as` double-casting (2 instances). No Zod runtime validation.
164
+ - [ ] **BUG-4:** Batch failure still escalates only first story. No config option for batch-wide escalation.
165
+ - [ ] **ENH-2:** No agent capability negotiation — adapters don't declare supported tiers/features.
166
+ - [ ] **PERF-2:** PRD reloaded every iteration — no dirty flag optimization.
167
+ - [ ] **ENH-3:** Context builder doesn't load file content — stories only, no source code context.
168
+
169
+ #### P3 — Polish
170
+ - [ ] **STYLE-1:** `runner.ts` is 901 lines (was 779, grew with fixes). Needs splitting into prompts/batching/queue-handler/escalation modules.
171
+ - [ ] **ENH-4:** No progress bar or ETA display — only line-by-line iteration logging.
172
+ - [ ] **TYPE-2:** `QueueCommand` still mixed string literals + object — not discriminated union.
173
+ - [ ] **ENH-5:** No dry-run mode for three-session TDD.
174
+ - [ ] **PERF-3:** Token estimation still uses `Math.ceil(text.length / 3)` — no improved heuristic.
175
+
176
+ #### P4 — Consistency
177
+ - [ ] **STYLE-2:** Inconsistent error handling patterns (throw vs return null vs log warning).
178
+ - [ ] **STYLE-3:** Magic numbers not extracted as named constants.
179
+
180
+ ## Git
181
+
182
+ - Conventional commits: `feat:`, `fix:`, `refactor:`, `test:`, `docs:`, `chore:`
183
+ - Run `bun test && bun run typecheck` before committing
184
+ - Keep commits atomic — one logical change per commit
185
+
186
+ ## Important
187
+
188
+ - This is a Bun project — do NOT use Node.js APIs when Bun equivalents exist
189
+ - Agent adapters spawn external processes — always handle timeouts and cleanup
190
+ - Never hardcode API keys — agents use their own auth (e.g., Claude Code uses ANTHROPIC_API_KEY from env)
191
+ - The execution runner has `[TODO]` markers for unimplemented agent spawning — that's the next priority
@@ -0,0 +1,165 @@
1
+ # nax Roadmap
2
+
3
+ > **Authoritative source** for planned and shipped versions.
4
+ > Specs in `memory/` are detailed references. GitLab issues are supplementary.
5
+ > Full release notes → `docs/releases/`
6
+
7
+ ---
8
+
9
+ ## Next: v0.18.0 — Orchestration Quality
10
+
11
+ **Theme:** Fix execution bugs and improve orchestration reliability
12
+ **Status:** 🔲 Planned
13
+
14
+ ### Bugfixes (Priority)
15
+ - [x] ~~**BUG-016:** Hardcoded 120s timeout in verify stage → read from config~~
16
+ - [x] ~~**BUG-017:** `run.complete` not emitted on SIGTERM → emit in crash handler~~
17
+ - [x] ~~**BUG-018:** Test-writer spawns on every retry → skip when tests exist (`story.attempts > 0`)~~
18
+ - [x] ~~**BUG-019:** Misleading TIMEOUT output preview → separate TIMEOUT vs TEST_FAILURE messaging~~
19
+ - [x] ~~**BUG-020:** Missing storyId in JSONL events → audit all emitters~~
20
+ - [x] ~~**BUG-021:** `Task classified` log shows raw LLM result, not final routing after cache/config override → log final routing only~~
21
+ - [x] ~~**BUG-022:** Story interleaving wastes iterations — after failure, `getNextStory()` picks next pending story instead of retrying the failed one → prioritize current story retries before moving on~~
22
+ - [x] ~~**BUG-023:** Agent failure doesn't log exitCode/stderr → add to `execution.Agent session failed` event~~
23
+ - [x] ~~**BUG-025:** `needsHumanReview` doesn't trigger interactive plugin in headless mode → wire to interaction chain or suppress the log~~
24
+
25
+ ---
26
+
27
+ ## v0.18.1 — Type Safety + Per-Story testStrategy
28
+
29
+ **Theme:** Fix all TypeScript/lint errors + fine-grained test strategy control
30
+ **Status:** 🔲 Planned
31
+
32
+ ### TypeScript Fixes (60 errors across 21 files)
33
+ - [ ] **TS-001:** Fix context module exports — add `BuiltContext`, `ContextElement`, `ContextBudget`, `StoryContext` to `context/types.ts` (13 errors)
34
+ - [ ] **TS-002:** Fix config/command type safety — type `{}` → proper types in `config/loader.ts`, `commands/logs.ts`, `agents/claude.ts` (12 errors)
35
+ - [ ] **TS-003:** Fix review/verification types — add `softViolations`, `warnings`, `description` to review result types (9 errors)
36
+ - [ ] **TS-004:** Fix escalation PRD type construction — ensure escalation produces valid `PRD` objects (4 errors)
37
+ - [ ] **TS-005:** Fix misc — Logger mock types, null checks, missing exports (`RectificationState`, `TestSummary`, `TestFailure`) (6 errors)
38
+
39
+ ### Lint Fixes (12 errors)
40
+ - [ ] **LINT-001:** Run `biome check --fix` + manual review of unsafe fixes
41
+
42
+ ### Verify Stage Fix
43
+ - [ ] **TEST-001:** Fix hanging "test command that throws error" test — add timeout or proper process kill
44
+
45
+ ### Per-Story testStrategy
46
+ - [ ] Add optional `testStrategy` field to userStory PRD schema (`"test-after" | "three-session-tdd" | "three-session-tdd-lite"`)
47
+ - [ ] When set, overrides global config + task classification for that story
48
+ - [ ] Update routing stage to check `story.testStrategy` before config/LLM
49
+ - [ ] Docs + tests
50
+
51
+ ### Re-enable Checks
52
+ - [ ] Re-enable `typecheck` in `nax/config.json` review checks after TS fixes land
53
+
54
+ ---
55
+
56
+ ## v0.18.2 — Smart Test Runner + Bun PTY Migration
57
+
58
+ **Theme:** Scope verify to changed files only + remove node-pty native addon
59
+ **Status:** 🔲 Planned
60
+
61
+ ### Smart Test Runner
62
+ - [ ] After agent implementation, run `git diff --name-only` to get changed source files
63
+ - [ ] Map source → test files by naming convention (`src/foo/bar.ts` → `test/unit/foo/bar.test.ts`)
64
+ - [ ] Run only related tests for verify (instead of full suite)
65
+ - [ ] Fallback to full suite when mapping yields no test files
66
+ - [ ] Config flag `execution.smartTestRunner: true` (default: true) to opt out
67
+ - [ ] Result: verify drops from ~125s to ~10-20s for typical single-file fixes
68
+
69
+ ### Bun PTY Migration (BUN-001)
70
+ - [ ] Replace `node-pty` (native addon, requires python/make/g++ to build) with `Bun.Terminal` API (v1.3.5+)
71
+ - [ ] Update `src/agents/claude.ts` `runInteractive()` — replace `nodePty.spawn()` with `Bun.Terminal`
72
+ - [ ] Update `src/tui/hooks/usePty.ts` — replace `IPty` interface with Bun equivalent
73
+ - [ ] Remove `node-pty` from `dependencies` in `package.json`
74
+ - [ ] Remove `--ignore-scripts` workaround from `.gitlab-ci.yml`
75
+ - [ ] Benefit: no native build, no gyp/python/gcc in CI, cleaner alpine support
76
+
77
+ ### CI Memory Optimization (CI-001)
78
+ - [ ] Investigate splitting test suite into parallel jobs (unit / integration / ui) to reduce per-job peak memory
79
+ - [ ] Evaluate `bun test --shard` when stable (currently experimental)
80
+ - [ ] Target: make test suite pass on 1GB runners (currently requires 8GB shared runner)
81
+ - [ ] Known constraints: 2008 tests across 125 files, ~75s on local VPS (3.8GB), OOMs even with `--smol --concurrency 1`
82
+ - [ ] Current workaround: use `saas-linux-small-amd64` (8GB) shared runner
83
+
84
+ ---
85
+
86
+ ## v0.19.0 — Central Run Registry
87
+
88
+ **Theme:** Unified run tracking across worktrees + dashboard integration
89
+ **Status:** 🔲 Planned
90
+
91
+ - [ ] **Central Run Registry** — `~/.nax/runs/<project>-<feature>-<runId>/` with status.json + events.jsonl symlink. Dashboard reads from registry.
92
+
93
+ ---
94
+
95
+ ## Shipped
96
+
97
+ | Version | Theme | Date | Details |
98
+ |:---|:---|:---|:---|
99
+ | v0.18.0 | Orchestration Quality | 2026-03-03 | BUG-016/017/018/019/020/021/022/023/025 all fixed |
100
+ | v0.17.0 | Config Management | 2026-03-02 | CM-001 --explain, CM-002 --diff, CM-003 default view |
101
+ | v0.16.4 | Bugfixes: Routing + Env Allowlist | 2026-03-02 | BUG-012/013/014 |
102
+ | v0.16.1 | Project Context Generator | 2026-03-01 | `nax generate`, auto-inject, multi-language |
103
+ | v0.16.0 | Story Size Gate | 2026-03-01 | [releases/v0.16.0.md](releases/v0.16.0.md) |
104
+ | v0.15.3 | Constitution Generator + Runner Interaction Wiring | 2026-02-28 | [releases/v0.15.3.md](releases/v0.15.3.md) |
105
+ | v0.15.1 | Architectural Compliance + Security Hardening | 2026-02-28 | [releases/v0.15.1.md](releases/v0.15.1.md) |
106
+ | v0.15.0 | Interactive Pipeline | 2026-02-28 | [releases/v0.15.0.md](releases/v0.15.0.md) |
107
+ | v0.14.4 | Code Audit Cleanup (MEDIUM findings) | 2026-02-28 | [releases/v0.14.4.md](releases/v0.14.4.md) |
108
+ | v0.14.3 | Code Audit Fixes (CRITICAL+HIGH+MEDIUM) | 2026-02-28 | [releases/v0.14.3.md](releases/v0.14.3.md) |
109
+ | v0.14.2 | E2E Test Hang Fix | 2026-02-28 | [releases/v0.14.2.md](releases/v0.14.2.md) |
110
+ | v0.14.1 | nax diagnose CLI | 2026-02-28 | [releases/v0.14.1.md](releases/v0.14.1.md) |
111
+ | v0.14.0 | Failure Resilience | 2026-02-28 | [releases/v0.14.0.md](releases/v0.14.0.md) |
112
+ | v0.13.0 | Precheck | 2026-02-27 | [releases/v0.13.0.md](releases/v0.13.0.md) |
113
+ | v0.12.0 | Structured Logging | 2026-02-27 | [releases/v0.12.0.md](releases/v0.12.0.md) |
114
+ | v0.11.0 and earlier | Plugin Integration, LLM Routing, Core Pipeline | 2026-02-27 | [releases/v0.11.0-and-earlier.md](releases/v0.11.0-and-earlier.md) |
115
+
116
+ ---
117
+
118
+ ## Backlog
119
+
120
+ ### Bugs
121
+ - [x] ~~BUG-002: Orphan Claude processes~~
122
+ - [x] ~~BUG-003: PRD status "done" not skipped~~
123
+ - [x] ~~BUG-004: router.ts crashes on missing tags~~
124
+ - [x] ~~BUG-005: Hardcoded `bun run lint` in review~~
125
+ - [x] ~~BUG-006: Context auto-detection~~
126
+ - [x] ~~BUG-008: E2E tests hang with infinite retry~~
127
+ - [x] ~~BUG-009: No cross-story regression check~~
128
+ - [x] ~~BUG-010: Greenfield TDD no test files~~
129
+ - [x] ~~BUG-011: Escalation tier budget not enforced~~
130
+ - [x] ~~BUG-012: Greenfield detection ignores pre-existing test files~~
131
+ - [x] ~~BUG-013: Escalation routing not applied in iterations~~
132
+ - [x] ~~BUG-014: buildAllowedEnv() strips USER/LOGNAME~~
133
+ - [ ] **BUG-015:** `loadConstitution()` leaks global `~/.nax/constitution.md` into unit tests
134
+ - [x] ~~**BUG-016:** Hardcoded 120s timeout in pipeline verify stage → fixed in v0.18.0~~
135
+ - [x] ~~**BUG-017:** run.complete not emitted on SIGTERM → fixed in v0.18.0~~
136
+ - [x] ~~**BUG-018:** Test-writer wastes ~3min/retry when tests already exist → fixed in v0.18.0~~
137
+ - [x] ~~**BUG-019:** Misleading TIMEOUT output preview → fixed in v0.18.0~~
138
+ - [x] ~~**BUG-020:** Missing storyId in JSONL events → fixed in v0.18.0~~
139
+ - [x] ~~**BUG-021:** `Task classified` log shows raw LLM result, not final routing → fixed in v0.18.0~~
140
+ - [x] ~~**BUG-022:** Story interleaving — `getNextStory()` round-robins instead of exhausting retries on current story → fixed in v0.18.0~~
141
+ - [x] ~~**BUG-023:** Agent failure silent — no exitCode/stderr in JSONL → fixed in v0.18.0~~
142
+ - [x] ~~**BUG-025:** `needsHumanReview` not triggering interactive plugin → fixed in v0.18.0~~
143
+
144
+ ### Features
145
+ - [x] ~~`nax unlock` command~~
146
+ - [x] ~~Constitution file support~~
147
+ - [x] ~~Per-story testStrategy override — v0.18.1~~
148
+ - [x] ~~Smart Test Runner — v0.18.2~~
149
+ - [x] ~~Central Run Registry — v0.19.0~~
150
+ - [ ] Cost tracking dashboard
151
+ - [ ] npm publish setup
152
+ - [ ] `nax diagnose --ai` flag (LLM-assisted, future TBD)
153
+ - [ ] **Auto-decompose oversized stories** — When story size gate triggers, offer via interaction chain to auto-decompose using `nax analyse`.
154
+ - [ ] **AST-based context file detection** — replace keyword-matching with import/symbol graph analysis. Target: v0.19+
155
+ - [ ] VitePress documentation site — full CLI reference, hosted as standalone docs (pre-publish requirement)
156
+
157
+ ---
158
+
159
+ ## Versioning
160
+
161
+ Sequential canary → stable: `v0.12.0-canary.0` → `canary.N` → `v0.12.0`
162
+ Canary: `npm publish --tag canary`
163
+ Stable: `npm publish` (latest)
164
+
165
+ *Last updated: 2026-03-03 (v0.18.0 shipped — all 9 bugs fixed)*
File without changes