@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.
- package/.gitlab-ci.yml +96 -0
- package/BRIEF.md +140 -0
- package/CHANGELOG.md +60 -0
- package/CLAUDE.md +159 -0
- package/README.md +373 -0
- package/US-007-IMPLEMENTATION.md +139 -0
- package/bin/nax.ts +930 -0
- package/biome.json +14 -0
- package/bun.lock +168 -0
- package/bunfig.toml +11 -0
- package/docs/20260216-fix-plan-context-review.md +56 -0
- package/docs/20260216-relentless-vs-ngent-comparison.md +208 -0
- package/docs/20260216-v02-plan.md +136 -0
- package/docs/20260216-v02-review.md +685 -0
- package/docs/20260217-dogfood-findings.md +56 -0
- package/docs/20260217-p2-plus-plan.md +117 -0
- package/docs/20260217-partial-fixes-plan.md +62 -0
- package/docs/20260217-plan-analyze-spec.md +117 -0
- package/docs/20260217-post-impl-review.md +1137 -0
- package/docs/20260217-quick-wins-plan.md +66 -0
- package/docs/20260217-split-runner-plan.md +75 -0
- package/docs/20260217-v03-impl-plan.md +80 -0
- package/docs/20260217-v03-post-impl-review.md +589 -0
- package/docs/20260217-v04-impl-plan.md +86 -0
- package/docs/20260217-v05-post-impl-review.md +850 -0
- package/docs/20260217-v06-post-impl-review.md +817 -0
- package/docs/20260218-adr003-port-plan.md +151 -0
- package/docs/20260218-review-adr003-verification.md +175 -0
- package/docs/20260219-fix-plan-bug16-19.md +79 -0
- package/docs/20260219-fix-plan-bug20-22.md +114 -0
- package/docs/20260219-plan-llm-routing.md +116 -0
- package/docs/20260219-review-bug20-22-fixes.md +135 -0
- package/docs/20260219-routing-baseline-keyword.md +63 -0
- package/docs/20260220-plan-structured-logging-p1.md +80 -0
- package/docs/20260220-plan-structured-logging-p2.md +37 -0
- package/docs/20260220-review-llm-routing.md +180 -0
- package/docs/20260220-review-post-fix-llm-routing.md +70 -0
- package/docs/20260221-fix-plan-relevantfiles-split.md +101 -0
- package/docs/20260221-fix-plan-routing-mode.md +125 -0
- package/docs/20260221-review-v0.9-implementation.md +379 -0
- package/docs/20260222-fix-plan-v091-routing-isolation.md +197 -0
- package/docs/20260223-fix-plan-prompt-audit.md +62 -0
- package/docs/20260224-nax-roadmap-phases.md +189 -0
- package/docs/20260225-phase2-llm-service-layer.md +401 -0
- package/docs/20260225-review-v0.10.1.md +187 -0
- package/docs/20260303-v010-implementation-plan.md +165 -0
- package/docs/CLAUDE.md.bak +191 -0
- package/docs/ROADMAP.md +165 -0
- package/docs/SPEC-rectification.md +0 -0
- package/docs/SPEC.md +324 -0
- package/docs/US-001-plugin-loading-verification.md +152 -0
- package/docs/architecture-analysis.md +1076 -0
- package/docs/bugs/BUG-21-escalation-null-attempts.md +48 -0
- package/docs/bugs-from-dogfood-run-c.md +243 -0
- package/docs/code-review-20260228.md +612 -0
- package/docs/code-review-v0.15.0.md +629 -0
- package/docs/hook-lifecycle-test-plan.md +149 -0
- package/docs/releases/v0.11.0-and-earlier.md +20 -0
- package/docs/releases/v0.12.0.md +15 -0
- package/docs/releases/v0.13.0.md +14 -0
- package/docs/releases/v0.14.0.md +20 -0
- package/docs/releases/v0.14.1.md +36 -0
- package/docs/releases/v0.14.2.md +51 -0
- package/docs/releases/v0.14.3.md +174 -0
- package/docs/releases/v0.14.4.md +94 -0
- package/docs/releases/v0.15.0.md +502 -0
- package/docs/releases/v0.15.1.md +170 -0
- package/docs/releases/v0.15.3.md +193 -0
- package/docs/specs/status-file-v0.10.1.md +812 -0
- package/docs/v0.10-global-config.md +206 -0
- package/docs/v0.10-plugin-system.md +415 -0
- package/docs/v0.10-prompt-optimizer.md +234 -0
- package/docs/v0.3-spec.md +244 -0
- package/docs/v0.4-spec.md +140 -0
- package/docs/v0.5-spec.md +237 -0
- package/docs/v0.6-spec.md +371 -0
- package/docs/v0.7-spec.md +177 -0
- package/docs/v0.8-llm-routing.md +206 -0
- package/docs/v0.8-structured-logging.md +132 -0
- package/docs/v0.9.3-prompt-audit.md +112 -0
- package/examples/plugins/console-reporter/index.test.ts +207 -0
- package/examples/plugins/console-reporter/index.ts +110 -0
- package/nax/config.json +147 -0
- package/nax/features/bugfix-v0171/prd.json +52 -0
- package/nax/features/config-management/prd.json +108 -0
- package/nax/features/config-management/progress.txt +5 -0
- package/nax/features/diagnose/acceptance.test.ts +412 -0
- package/nax/features/diagnose/prd.json +41 -0
- package/nax/features/orchestration-fixes/prd.json +89 -0
- package/nax/features/orchestration-fixes/progress.txt +1 -0
- package/nax/features/plugin-integration/US-007-VERIFICATION.md +259 -0
- package/nax/features/plugin-integration/prd.json +208 -0
- package/nax/features/plugin-integration/progress.txt +5 -0
- package/nax/features/precheck/prd.json +205 -0
- package/nax/features/precheck/progress.txt +15 -0
- package/nax/features/structured-logging/prd.json +199 -0
- package/nax/features/unlock/prd.json +36 -0
- package/package.json +47 -0
- package/src/acceptance/fix-generator.ts +348 -0
- package/src/acceptance/generator.ts +282 -0
- package/src/acceptance/index.ts +30 -0
- package/src/acceptance/types.ts +79 -0
- package/src/agents/claude-decompose.ts +169 -0
- package/src/agents/claude-plan.ts +139 -0
- package/src/agents/claude.ts +324 -0
- package/src/agents/cost.ts +268 -0
- package/src/agents/index.ts +13 -0
- package/src/agents/registry.ts +48 -0
- package/src/agents/types-extended.ts +133 -0
- package/src/agents/types.ts +113 -0
- package/src/agents/validation.ts +69 -0
- package/src/analyze/classifier.ts +305 -0
- package/src/analyze/index.ts +16 -0
- package/src/analyze/scanner.ts +175 -0
- package/src/analyze/types.ts +51 -0
- package/src/cli/accept.ts +108 -0
- package/src/cli/analyze-parser.ts +284 -0
- package/src/cli/analyze.ts +207 -0
- package/src/cli/config.ts +561 -0
- package/src/cli/constitution.ts +109 -0
- package/src/cli/diagnose-analysis.ts +159 -0
- package/src/cli/diagnose-formatter.ts +87 -0
- package/src/cli/diagnose.ts +203 -0
- package/src/cli/generate.ts +127 -0
- package/src/cli/index.ts +37 -0
- package/src/cli/init.ts +188 -0
- package/src/cli/interact.ts +295 -0
- package/src/cli/plan.ts +198 -0
- package/src/cli/plugins.ts +111 -0
- package/src/cli/prompts.ts +295 -0
- package/src/cli/runs.ts +174 -0
- package/src/cli/status-cost.ts +151 -0
- package/src/cli/status-features.ts +338 -0
- package/src/cli/status.ts +13 -0
- package/src/commands/common.ts +171 -0
- package/src/commands/diagnose.ts +17 -0
- package/src/commands/index.ts +8 -0
- package/src/commands/logs.ts +384 -0
- package/src/commands/precheck.ts +86 -0
- package/src/commands/unlock.ts +96 -0
- package/src/config/defaults.ts +160 -0
- package/src/config/index.ts +22 -0
- package/src/config/loader.ts +121 -0
- package/src/config/merger.ts +147 -0
- package/src/config/path-security.ts +121 -0
- package/src/config/paths.ts +27 -0
- package/src/config/schema.ts +56 -0
- package/src/config/schemas.ts +286 -0
- package/src/config/types.ts +423 -0
- package/src/config/validate.ts +103 -0
- package/src/constitution/generator.ts +191 -0
- package/src/constitution/generators/aider.ts +41 -0
- package/src/constitution/generators/claude.ts +35 -0
- package/src/constitution/generators/cursor.ts +36 -0
- package/src/constitution/generators/opencode.ts +38 -0
- package/src/constitution/generators/types.ts +33 -0
- package/src/constitution/generators/windsurf.ts +36 -0
- package/src/constitution/index.ts +10 -0
- package/src/constitution/loader.ts +133 -0
- package/src/constitution/types.ts +31 -0
- package/src/context/auto-detect.ts +227 -0
- package/src/context/builder.ts +246 -0
- package/src/context/elements.ts +83 -0
- package/src/context/formatter.ts +107 -0
- package/src/context/generator.ts +129 -0
- package/src/context/generators/aider.ts +34 -0
- package/src/context/generators/claude.ts +28 -0
- package/src/context/generators/cursor.ts +28 -0
- package/src/context/generators/opencode.ts +30 -0
- package/src/context/generators/windsurf.ts +28 -0
- package/src/context/greenfield.ts +114 -0
- package/src/context/index.ts +33 -0
- package/src/context/injector.ts +279 -0
- package/src/context/test-scanner.ts +370 -0
- package/src/context/types.ts +98 -0
- package/src/errors.ts +67 -0
- package/src/execution/batching.ts +157 -0
- package/src/execution/crash-recovery.ts +373 -0
- package/src/execution/escalation/escalation.ts +44 -0
- package/src/execution/escalation/index.ts +13 -0
- package/src/execution/escalation/tier-escalation.ts +295 -0
- package/src/execution/escalation/tier-outcome.ts +158 -0
- package/src/execution/helpers.ts +38 -0
- package/src/execution/index.ts +45 -0
- package/src/execution/lifecycle/acceptance-loop.ts +272 -0
- package/src/execution/lifecycle/headless-formatter.ts +85 -0
- package/src/execution/lifecycle/index.ts +12 -0
- package/src/execution/lifecycle/parallel-lifecycle.ts +101 -0
- package/src/execution/lifecycle/precheck-runner.ts +140 -0
- package/src/execution/lifecycle/run-cleanup.ts +81 -0
- package/src/execution/lifecycle/run-completion.ts +129 -0
- package/src/execution/lifecycle/run-initialization.ts +141 -0
- package/src/execution/lifecycle/run-lifecycle.ts +312 -0
- package/src/execution/lifecycle/run-setup.ts +204 -0
- package/src/execution/lifecycle/story-hooks.ts +38 -0
- package/src/execution/lifecycle/story-size-prompts.ts +123 -0
- package/src/execution/lock.ts +115 -0
- package/src/execution/parallel-executor.ts +216 -0
- package/src/execution/parallel.ts +400 -0
- package/src/execution/pid-registry.ts +280 -0
- package/src/execution/pipeline-result-handler.ts +388 -0
- package/src/execution/post-verify-rectification.ts +188 -0
- package/src/execution/post-verify.ts +274 -0
- package/src/execution/progress.ts +25 -0
- package/src/execution/prompts.ts +127 -0
- package/src/execution/queue-handler.ts +109 -0
- package/src/execution/rectification.ts +13 -0
- package/src/execution/runner.ts +377 -0
- package/src/execution/sequential-executor.ts +388 -0
- package/src/execution/status-file.ts +264 -0
- package/src/execution/status-writer.ts +139 -0
- package/src/execution/story-context.ts +229 -0
- package/src/execution/test-output-parser.ts +14 -0
- package/src/execution/verification.ts +72 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/runner.ts +286 -0
- package/src/hooks/types.ts +67 -0
- package/src/interaction/chain.ts +154 -0
- package/src/interaction/index.ts +60 -0
- package/src/interaction/init.ts +83 -0
- package/src/interaction/plugins/auto.ts +217 -0
- package/src/interaction/plugins/cli.ts +300 -0
- package/src/interaction/plugins/telegram.ts +384 -0
- package/src/interaction/plugins/webhook.ts +258 -0
- package/src/interaction/state.ts +171 -0
- package/src/interaction/triggers.ts +229 -0
- package/src/interaction/types.ts +163 -0
- package/src/logger/formatters.ts +84 -0
- package/src/logger/index.ts +16 -0
- package/src/logger/logger.ts +298 -0
- package/src/logger/types.ts +48 -0
- package/src/logging/formatter.ts +355 -0
- package/src/logging/index.ts +22 -0
- package/src/logging/types.ts +93 -0
- package/src/metrics/aggregator.ts +190 -0
- package/src/metrics/index.ts +14 -0
- package/src/metrics/tracker.ts +200 -0
- package/src/metrics/types.ts +109 -0
- package/src/optimizer/index.ts +62 -0
- package/src/optimizer/noop.optimizer.ts +24 -0
- package/src/optimizer/rule-based.optimizer.ts +248 -0
- package/src/optimizer/types.ts +53 -0
- package/src/pipeline/events.ts +130 -0
- package/src/pipeline/index.ts +19 -0
- package/src/pipeline/runner.ts +161 -0
- package/src/pipeline/stages/acceptance.ts +197 -0
- package/src/pipeline/stages/completion.ts +99 -0
- package/src/pipeline/stages/constitution.ts +63 -0
- package/src/pipeline/stages/context.ts +117 -0
- package/src/pipeline/stages/execution.ts +194 -0
- package/src/pipeline/stages/index.ts +62 -0
- package/src/pipeline/stages/optimizer.ts +74 -0
- package/src/pipeline/stages/prompt.ts +57 -0
- package/src/pipeline/stages/queue-check.ts +103 -0
- package/src/pipeline/stages/review.ts +181 -0
- package/src/pipeline/stages/routing.ts +81 -0
- package/src/pipeline/stages/verify.ts +100 -0
- package/src/pipeline/types.ts +167 -0
- package/src/plugins/index.ts +31 -0
- package/src/plugins/loader.ts +287 -0
- package/src/plugins/registry.ts +168 -0
- package/src/plugins/types.ts +327 -0
- package/src/plugins/validator.ts +352 -0
- package/src/prd/index.ts +172 -0
- package/src/prd/types.ts +202 -0
- package/src/precheck/checks-blockers.ts +391 -0
- package/src/precheck/checks-warnings.ts +142 -0
- package/src/precheck/checks.ts +30 -0
- package/src/precheck/index.ts +247 -0
- package/src/precheck/story-size-gate.ts +144 -0
- package/src/precheck/types.ts +31 -0
- package/src/queue/index.ts +2 -0
- package/src/queue/manager.ts +254 -0
- package/src/queue/types.ts +54 -0
- package/src/review/index.ts +8 -0
- package/src/review/runner.ts +172 -0
- package/src/review/types.ts +66 -0
- package/src/routing/builder.ts +81 -0
- package/src/routing/chain.ts +74 -0
- package/src/routing/index.ts +16 -0
- package/src/routing/loader.ts +58 -0
- package/src/routing/router.ts +303 -0
- package/src/routing/strategies/adaptive.ts +215 -0
- package/src/routing/strategies/index.ts +8 -0
- package/src/routing/strategies/keyword.ts +163 -0
- package/src/routing/strategies/llm-prompts.ts +209 -0
- package/src/routing/strategies/llm.ts +235 -0
- package/src/routing/strategies/manual.ts +50 -0
- package/src/routing/strategy.ts +99 -0
- package/src/tdd/cleanup.ts +111 -0
- package/src/tdd/index.ts +23 -0
- package/src/tdd/isolation.ts +123 -0
- package/src/tdd/orchestrator.ts +383 -0
- package/src/tdd/prompts.ts +270 -0
- package/src/tdd/rectification-gate.ts +183 -0
- package/src/tdd/session-runner.ts +179 -0
- package/src/tdd/types.ts +81 -0
- package/src/tdd/verdict.ts +271 -0
- package/src/tui/App.tsx +265 -0
- package/src/tui/components/AgentPanel.tsx +75 -0
- package/src/tui/components/CostOverlay.tsx +118 -0
- package/src/tui/components/HelpOverlay.tsx +107 -0
- package/src/tui/components/StatusBar.tsx +63 -0
- package/src/tui/components/StoriesPanel.tsx +177 -0
- package/src/tui/hooks/useKeyboard.ts +142 -0
- package/src/tui/hooks/useLayout.ts +137 -0
- package/src/tui/hooks/usePipelineEvents.ts +183 -0
- package/src/tui/hooks/usePty.ts +194 -0
- package/src/tui/index.tsx +38 -0
- package/src/tui/types.ts +76 -0
- package/src/utils/git.ts +83 -0
- package/src/utils/queue-writer.ts +54 -0
- package/src/verification/executor.ts +235 -0
- package/src/verification/gate.ts +207 -0
- package/src/verification/index.ts +12 -0
- package/src/verification/parser.ts +230 -0
- package/src/verification/rectification.ts +108 -0
- package/src/verification/types.ts +113 -0
- package/src/worktree/dispatcher.ts +65 -0
- package/src/worktree/index.ts +2 -0
- package/src/worktree/manager.ts +187 -0
- package/src/worktree/merge.ts +301 -0
- package/src/worktree/types.ts +4 -0
- package/test/TEST_COVERAGE_US001.md +217 -0
- package/test/TEST_COVERAGE_US003.md +84 -0
- package/test/TEST_COVERAGE_US005.md +86 -0
- package/test/US-002-orchestrator.test.ts +246 -0
- package/test/acceptance/cm-003-default-view.test.ts +194 -0
- package/test/execution/pid-registry.test.ts +240 -0
- package/test/execution/post-verify.test.ts +224 -0
- package/test/helpers/timeout.ts +42 -0
- package/test/integration/US-002-TEST-SUMMARY.md +107 -0
- package/test/integration/US-003-TEST-SUMMARY.md +149 -0
- package/test/integration/US-004-TEST-SUMMARY.md +106 -0
- package/test/integration/US-005-TEST-SUMMARY.md +138 -0
- package/test/integration/US-007-TEST-SUMMARY.md +100 -0
- package/test/integration/agent-validation.test.ts +439 -0
- package/test/integration/analyze-integration.test.ts +261 -0
- package/test/integration/analyze-scanner.test.ts +131 -0
- package/test/integration/cli-config-default-edge-cases.test.ts +222 -0
- package/test/integration/cli-config-default-view.test.ts +229 -0
- package/test/integration/cli-config-diff.test.ts +460 -0
- package/test/integration/cli-config.test.ts +736 -0
- package/test/integration/cli-diagnose.test.ts +592 -0
- package/test/integration/cli-logs.test.ts +314 -0
- package/test/integration/cli-plugins.test.ts +678 -0
- package/test/integration/cli-precheck.test.ts +371 -0
- package/test/integration/cli-run-headless.test.ts +173 -0
- package/test/integration/cli.test.ts +75 -0
- package/test/integration/config/merger.test.ts +465 -0
- package/test/integration/config/paths.test.ts +51 -0
- package/test/integration/config-loader.test.ts +265 -0
- package/test/integration/config.test.ts +444 -0
- package/test/integration/context-integration.test.ts +702 -0
- package/test/integration/context-provider-injection.test.ts +506 -0
- package/test/integration/context-verification-integration.test.ts +295 -0
- package/test/integration/e2e.test.ts +896 -0
- package/test/integration/execution.test.ts +625 -0
- package/test/integration/helpers.test.ts +295 -0
- package/test/integration/hooks.test.ts +361 -0
- package/test/integration/interaction-chain-pipeline.test.ts +464 -0
- package/test/integration/isolation.test.ts +143 -0
- package/test/integration/logger.test.ts +461 -0
- package/test/integration/parallel.test.ts +250 -0
- package/test/integration/path-security.test.ts +173 -0
- package/test/integration/pipeline-acceptance.test.ts +302 -0
- package/test/integration/pipeline-events.test.ts +475 -0
- package/test/integration/pipeline.test.ts +658 -0
- package/test/integration/plan.test.ts +157 -0
- package/test/integration/plugin-routing.test.ts +921 -0
- package/test/integration/plugins/config-integration.test.ts +172 -0
- package/test/integration/plugins/config-resolution.test.ts +522 -0
- package/test/integration/plugins/loader.test.ts +641 -0
- package/test/integration/plugins/registry.test.ts +746 -0
- package/test/integration/plugins/validator.test.ts +563 -0
- package/test/integration/prd-pause.test.ts +205 -0
- package/test/integration/prd-resolvers.test.ts +185 -0
- package/test/integration/precheck-integration.test.ts +468 -0
- package/test/integration/precheck.test.ts +805 -0
- package/test/integration/progress.test.ts +34 -0
- package/test/integration/rectification-flow.test.ts +512 -0
- package/test/integration/reporter-lifecycle.test.ts +860 -0
- package/test/integration/review-config-commands.test.ts +319 -0
- package/test/integration/review-config-schema.test.ts +116 -0
- package/test/integration/review-plugin-integration.test.ts +722 -0
- package/test/integration/review.test.ts +149 -0
- package/test/integration/routing-stage-bug-021.test.ts +274 -0
- package/test/integration/routing-stage-greenfield.test.ts +286 -0
- package/test/integration/runner-config-plugins.test.ts +461 -0
- package/test/integration/runner-fixes.test.ts +399 -0
- package/test/integration/runner-plugin-integration.test.ts +543 -0
- package/test/integration/runner.test.ts +1679 -0
- package/test/integration/s5-greenfield-fallback.test.ts +297 -0
- package/test/integration/status-file-integration.test.ts +325 -0
- package/test/integration/status-file.test.ts +379 -0
- package/test/integration/status-writer.test.ts +345 -0
- package/test/integration/story-id-in-events.test.ts +273 -0
- package/test/integration/tdd-cleanup.test.ts +246 -0
- package/test/integration/tdd-orchestrator.test.ts +1762 -0
- package/test/integration/test-scanner.test.ts +403 -0
- package/test/integration/verification-asset-check.test.ts +142 -0
- package/test/integration/verify-stage.test.ts +275 -0
- package/test/integration/worktree/manager.test.ts +218 -0
- package/test/integration/worktree/merge.test.ts +341 -0
- package/test/manual/logging-formatter-demo.ts +158 -0
- package/test/ui/tui-agent-panel.test.tsx +99 -0
- package/test/ui/tui-controls.test.ts +334 -0
- package/test/ui/tui-cost-and-pty.test.ts +189 -0
- package/test/ui/tui-layout.test.ts +378 -0
- package/test/ui/tui-pty-integration.test.tsx +159 -0
- package/test/ui/tui-stories.test.ts +332 -0
- package/test/unit/acceptance.test.ts +186 -0
- package/test/unit/agent-stderr-capture.test.ts +146 -0
- package/test/unit/analyze-classifier.test.ts +215 -0
- package/test/unit/analyze.test.ts +224 -0
- package/test/unit/auto-detect.test.ts +249 -0
- package/test/unit/cli-status.test.ts +417 -0
- package/test/unit/commands/common.test.ts +320 -0
- package/test/unit/commands/logs.test.ts +416 -0
- package/test/unit/commands/unlock.test.ts +319 -0
- package/test/unit/constitution-generators.test.ts +160 -0
- package/test/unit/constitution.test.ts +209 -0
- package/test/unit/context.test.ts +1722 -0
- package/test/unit/cost.test.ts +231 -0
- package/test/unit/crash-recovery.test.ts +308 -0
- package/test/unit/escalation.test.ts +126 -0
- package/test/unit/execution-logging-stderr.test.ts +156 -0
- package/test/unit/execution-stage.test.ts +122 -0
- package/test/unit/fix-generator.test.ts +275 -0
- package/test/unit/formatters.test.ts +469 -0
- package/test/unit/greenfield.test.ts +179 -0
- package/test/unit/helpers.test.ts +317 -0
- package/test/unit/interaction/human-review-trigger.test.ts +164 -0
- package/test/unit/interaction-network-failures.test.ts +389 -0
- package/test/unit/interaction-plugins.test.ts +164 -0
- package/test/unit/isolation.test.ts +134 -0
- package/test/unit/logging/formatter.test.ts +455 -0
- package/test/unit/merge.test.ts +268 -0
- package/test/unit/metrics.test.ts +276 -0
- package/test/unit/optimizer/noop.optimizer.test.ts +125 -0
- package/test/unit/optimizer/rule-based.optimizer.test.ts +358 -0
- package/test/unit/prd-auto-default.test.ts +290 -0
- package/test/unit/prd-failure-category.test.ts +176 -0
- package/test/unit/prd-get-next-story.test.ts +186 -0
- package/test/unit/precheck-checks.test.ts +840 -0
- package/test/unit/precheck-story-size-gate.test.ts +287 -0
- package/test/unit/precheck-types.test.ts +142 -0
- package/test/unit/prompts.test.ts +475 -0
- package/test/unit/queue.test.ts +237 -0
- package/test/unit/rectification.test.ts +284 -0
- package/test/unit/registry.test.ts +287 -0
- package/test/unit/routing.test.ts +937 -0
- package/test/unit/run-lifecycle.test.ts +140 -0
- package/test/unit/storyid-events.test.ts +224 -0
- package/test/unit/tdd-verdict.test.ts +492 -0
- package/test/unit/test-output-parser.test.ts +377 -0
- package/test/unit/verdict.test.ts +324 -0
- package/test/unit/worktree-manager.test.ts +158 -0
- 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
|
package/docs/ROADMAP.md
ADDED
|
@@ -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
|