@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
package/.gitlab-ci.yml
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# .gitlab-ci.yml - nax CI/CD
|
|
2
|
+
# Bun-native, single package (no turbo/monorepo)
|
|
3
|
+
#
|
|
4
|
+
# Triggers:
|
|
5
|
+
# - MR: test only (gate for merge)
|
|
6
|
+
# - [run-release] on master: test + release + notify
|
|
7
|
+
# - [run-prerelease] on non-master: test + canary release + notify
|
|
8
|
+
# - release-by-bot commits and tags: skipped entirely
|
|
9
|
+
|
|
10
|
+
stages:
|
|
11
|
+
- test
|
|
12
|
+
- release
|
|
13
|
+
- notify
|
|
14
|
+
|
|
15
|
+
# --- Stage: Test ---
|
|
16
|
+
test:
|
|
17
|
+
stage: test
|
|
18
|
+
image: nathapp/node-bun:22.21.0-1.3.9-alpine
|
|
19
|
+
before_script:
|
|
20
|
+
- apk add --no-cache git python3 make g++
|
|
21
|
+
- git config --global safe.directory '*'
|
|
22
|
+
- git config --global user.name "CI Runner"
|
|
23
|
+
- git config --global user.email "ci@nathapp.io"
|
|
24
|
+
cache:
|
|
25
|
+
key:
|
|
26
|
+
files:
|
|
27
|
+
- bun.lock
|
|
28
|
+
paths:
|
|
29
|
+
- node_modules/
|
|
30
|
+
policy: pull-push
|
|
31
|
+
script:
|
|
32
|
+
- bun install --frozen-lockfile --ignore-scripts
|
|
33
|
+
- bun run typecheck
|
|
34
|
+
- bun run lint
|
|
35
|
+
- NAX_SKIP_PRECHECK=1 bun test test/ --timeout=60000
|
|
36
|
+
rules:
|
|
37
|
+
- if: '$CI_COMMIT_MESSAGE =~ /release-by-bot/ || $CI_COMMIT_TAG'
|
|
38
|
+
when: never
|
|
39
|
+
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
|
40
|
+
- if: '$CI_COMMIT_MESSAGE =~ /run-prerelease/ && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
|
|
41
|
+
- if: '$CI_COMMIT_MESSAGE =~ /run-release/ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
|
|
42
|
+
|
|
43
|
+
# --- Stage: Release ---
|
|
44
|
+
release:
|
|
45
|
+
stage: release
|
|
46
|
+
image: nathapp/node-bun:22.21.0-1.3.9-alpine
|
|
47
|
+
cache:
|
|
48
|
+
key:
|
|
49
|
+
files:
|
|
50
|
+
- bun.lock
|
|
51
|
+
paths:
|
|
52
|
+
- node_modules/
|
|
53
|
+
policy: pull
|
|
54
|
+
variables:
|
|
55
|
+
NPM_REGISTRY: "//registry.npmjs.org/"
|
|
56
|
+
NPM_RELEASE_TOKEN: $NPM_TOKEN
|
|
57
|
+
before_script:
|
|
58
|
+
- apk add --no-cache git python3 make g++
|
|
59
|
+
- git config --global user.name "$GITLAB_USER_NAME"
|
|
60
|
+
- git config --global user.email "$GITLAB_USER_EMAIL"
|
|
61
|
+
script:
|
|
62
|
+
- bun install --frozen-lockfile --ignore-scripts
|
|
63
|
+
- VERSION=$(bun -e "console.log(require('./package.json').version)")
|
|
64
|
+
- bun run build
|
|
65
|
+
- echo "${NPM_REGISTRY}:_authToken=${NPM_RELEASE_TOKEN}" > .npmrc
|
|
66
|
+
- npm publish --access public
|
|
67
|
+
- git tag -a "v${VERSION}" -m "v${VERSION}"
|
|
68
|
+
- git push "https://${GITLAB_USER_NAME}:${CI_GIT_TOKEN}@${CI_REPOSITORY_URL#*@}" --tags
|
|
69
|
+
rules:
|
|
70
|
+
- if: '$CI_COMMIT_MESSAGE =~ /release-by-bot/ || $CI_COMMIT_TAG'
|
|
71
|
+
when: never
|
|
72
|
+
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
|
73
|
+
when: never
|
|
74
|
+
- if: '$CI_COMMIT_MESSAGE =~ /run-prerelease/ && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
|
|
75
|
+
variables:
|
|
76
|
+
NPM_REGISTRY: "//npm.nathapp.io/"
|
|
77
|
+
NPM_RELEASE_TOKEN: $NPM_PRIVATE_TOKEN
|
|
78
|
+
- if: '$CI_COMMIT_MESSAGE =~ /run-release/ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
|
|
79
|
+
|
|
80
|
+
# --- Stage: Notify ---
|
|
81
|
+
notify:
|
|
82
|
+
stage: notify
|
|
83
|
+
image: nathapp/node-bun:22.21.0-1.3.9-alpine
|
|
84
|
+
needs: [release]
|
|
85
|
+
script:
|
|
86
|
+
- VERSION=$(bun -e "console.log(require('./package.json').version)")
|
|
87
|
+
- 'curl -s -X POST -H "Content-Type: application/json" -d "{\"chat_id\": \"$TELEGRAM_CHAT_ID\", \"text\": \"nax v${VERSION} released\"}" https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage'
|
|
88
|
+
rules:
|
|
89
|
+
- if: '$CI_COMMIT_MESSAGE =~ /release-by-bot/ || $CI_COMMIT_TAG'
|
|
90
|
+
when: never
|
|
91
|
+
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
|
92
|
+
when: never
|
|
93
|
+
- if: '$TELEGRAM_BOT_TOKEN == null || $TELEGRAM_BOT_TOKEN == ""'
|
|
94
|
+
when: never
|
|
95
|
+
- if: '$CI_COMMIT_MESSAGE =~ /run-prerelease/ && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
|
|
96
|
+
- if: '$CI_COMMIT_MESSAGE =~ /run-release/ && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
|
package/BRIEF.md
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# nax — Brief
|
|
2
|
+
|
|
3
|
+
## What
|
|
4
|
+
AI coding agent orchestrator (CLI, Bun + TypeScript). Takes a feature spec, decomposes into user stories via LLM, routes each to the right model tier by complexity, and executes them with auto-escalation and retry. Supports three-session TDD for quality-critical work. Currently v0.10.1 on master. Published as `@nathapp/nax` (not yet on npm — local/global install only).
|
|
5
|
+
|
|
6
|
+
## Architecture
|
|
7
|
+
|
|
8
|
+
```
|
|
9
|
+
spec.md + tasks.md
|
|
10
|
+
↓
|
|
11
|
+
nax analyze → prd.json (user stories with routing metadata)
|
|
12
|
+
↓
|
|
13
|
+
nax run → pipeline per story:
|
|
14
|
+
routing → context → constitution → prompt → optimizer → execution → review → acceptance → completion
|
|
15
|
+
↑ ↑
|
|
16
|
+
(v0.10 plugin) (v0.10 plugin)
|
|
17
|
+
↑ ↑
|
|
18
|
+
plugin routers plugin context-providers
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
**Key modules:**
|
|
22
|
+
|
|
23
|
+
| Module | Purpose |
|
|
24
|
+
|:-------|:--------|
|
|
25
|
+
| `pipeline/` | Stage-based runner — each stage returns continue/skip/fail/escalate/pause |
|
|
26
|
+
| `routing/` | Strategy chain: keyword → LLM → adaptive → manual → plugin |
|
|
27
|
+
| `context/` | Builds per-story context from PRD + dependencies within token budget |
|
|
28
|
+
| `tdd/` | Three-session orchestrator: test-writer → implementer → verifier with git-diff isolation |
|
|
29
|
+
| `execution/` | Spawns `claude -p` via ClaudeCodeAdapter, handles timeouts and cost tracking |
|
|
30
|
+
| `status-file/` | *(v0.10.1)* Atomic JSON status writer for external monitoring (dashboards/CI) |
|
|
31
|
+
| `acceptance/` | LLM-generated acceptance tests, validates story output |
|
|
32
|
+
| `agents/` | Adapter pattern — currently only Claude Code, designed for Codex/Gemini/OpenCode |
|
|
33
|
+
| `hooks/` | Lifecycle events (on-start, on-complete, on-pause, on-error) via shell commands |
|
|
34
|
+
| `config/` | Layered config: global (`~/.nax/`) → project (`nax/`) with Zod validation + deep merge |
|
|
35
|
+
| `constitution/` | Injected rules/constraints prepended to every agent prompt |
|
|
36
|
+
| `plugins/` | *(v0.10)* Plugin loader, registry, and extension point interfaces |
|
|
37
|
+
| `optimizer/` | *(v0.10)* Prompt optimization stage (rule-based built-in + plugin support) |
|
|
38
|
+
|
|
39
|
+
## Key Decisions
|
|
40
|
+
|
|
41
|
+
| Decision | Why | Date | Ref |
|
|
42
|
+
|:---------|:----|:-----|:----|
|
|
43
|
+
| Classify complexity upfront, not start-cheap | Avoids wasting cycles on wrong model; LLM routing is cheap (~$0.002/story) | 2026-02-16 | SPEC.md |
|
|
44
|
+
| Three-session TDD (not two) | Session 3 (verifier) catches cases where implementer subtly modifies tests; git-diff isolation between all sessions | 2026-02-16 | SPEC.md |
|
|
45
|
+
| LLM outputs testStrategy directly | Keyword matching caused false positives ("endpoint"→TDD). LLM handles nuance better | 2026-02-23 | #11, #12 |
|
|
46
|
+
| Stage-based pipeline over monolithic runner | Composable, testable, each stage can skip/fail independently | 2026-02-17 | v0.3-spec |
|
|
47
|
+
| Bun over Node | Faster test execution, native TypeScript, built-in file APIs | 2026-02-16 | — |
|
|
48
|
+
| Token budget for context | Prevents context overflow (200k window); reserves 100k for agent reasoning | 2026-02-17 | context/builder.ts |
|
|
49
|
+
| Constitution as separate file | Project-level rules (coding standards, forbidden patterns) injected into every prompt without modifying CLAUDE.md | 2026-02-18 | — |
|
|
50
|
+
| Hooks over built-in integrations | Users wire their own notifications/CI via shell commands; nax stays standalone | 2026-02-16 | SPEC.md |
|
|
51
|
+
| Dropped greenfield scaffolding (#13) | Chicken-and-egg: nax/ must exist inside project, but scaffolding creates the project. Manual US-000 works fine. Existing tools (na-cli, nest new) handle scaffolding better. | 2026-03-03 | #13 |
|
|
52
|
+
| Test-writer allowed paths for barrel exports | `src/index.ts` re-exports are common TDD collateral; soft-warn instead of hard-block | 2026-02-22 | #9 |
|
|
53
|
+
| Story pause doesn't block unrelated stories | Dependency graph determines which stories can proceed independently | 2026-02-22 | #10 |
|
|
54
|
+
| Use actual BuiltContext tokens in frontmatter | Re-estimating tokens independently caused mismatches; element-level tracking is more accurate for audit | 2026-02-23 | #15 |
|
|
55
|
+
| Shared TDD prompt module | Extracting TDD prompts from orchestrator ensures consistency between CLI and execution | 2026-02-23 | #15 |
|
|
56
|
+
| Plugin system over ad-hoc extension | Unified registration/loading for all extension points (optimizer, router, agent, reviewer, context, reporter). Reuses existing interfaces. | 2026-03-03 | #8, #14 |
|
|
57
|
+
| Deep merge for global+project config | More intuitive than section replace; users only override what they change. Hooks and constitution concatenate (global first). | 2026-03-03 | #14 |
|
|
58
|
+
| No LLM optimizer built-in | Fast-tier LLM rewrite adds cost/complexity. Rule-based covers deterministic wins. External LLM optimizers (LLMLingua, etc.) can be added via plugins. | 2026-03-03 | #8 |
|
|
59
|
+
| TDD-Lite over removing TDD | TDD is nax's differentiator; instead of dropping it, add a relaxed variant (lite) where only verifier stays isolated. Strict for TS libs, lite for UI/polyglot. | 2026-02-24 | #20 |
|
|
60
|
+
| Fix nax over replacing with dev-orchestrator | dev-orchestrator lacks TDD pipeline, structured logging, PRD workflow. Porting those is more work than fixing nax's weaknesses. | 2026-02-24 | `docs/20260224-nax-roadmap-phases.md` |
|
|
61
|
+
| Dry-run marks stories as passed | Previous dry-run never changed story status, causing infinite loop until maxIterations. Now marks passed + saves PRD for natural completion. | 2026-02-24 | `09996c8` |
|
|
62
|
+
| Targeted git reset for TDD fallback | `git checkout .` was too aggressive; now resets only files touched by the failed session, preserving other local changes. | 2026-02-24 | `d1dc4b9` |
|
|
63
|
+
| Atomic Status File (v0.10.1) | Machine-readable status tracking via JSON. Atomic write (write-then-rename) prevents partial reads during polling. | 2026-02-25 | `status-file-v0.10.1.md` |
|
|
64
|
+
| Category-based TDD routing (v0.10.1) | Isolation violations trigger strategy downgrade (Lite) while mechanical failures trigger tier escalation. Reduces manual pause/resume cycles. | 2026-02-25 | `status-file-v0.10.1.md` |
|
|
65
|
+
|
|
66
|
+
## Config Reference
|
|
67
|
+
|
|
68
|
+
Config loaded from `~/.nax/config.json` (global) deep-merged with `nax/config.json` (project). CLI flags override both.
|
|
69
|
+
|
|
70
|
+
**Resolution order:** Built-in defaults → `~/.nax/config.json` → `nax/config.json` → CLI flags
|
|
71
|
+
|
|
72
|
+
| Section | Key | Type | Default | Purpose |
|
|
73
|
+
|:--------|:----|:-----|:--------|:--------|
|
|
74
|
+
| models | fast/balanced/powerful | ModelDef \| string | haiku/sonnet/opus | Maps abstract tiers to actual models |
|
|
75
|
+
| autoMode | complexityRouting | Record<Complexity, Tier> | simple→fast, medium→balanced, complex/expert→powerful | Which tier handles which complexity |
|
|
76
|
+
| autoMode | escalation.tierOrder | TierConfig[] | fast×5, balanced×3, powerful×2 | Retry budget per tier before escalating |
|
|
77
|
+
| routing | strategy | keyword\|llm\|manual\|adaptive\|custom | keyword | How stories get classified |
|
|
78
|
+
| routing | llm.mode | one-shot\|per-story\|hybrid | hybrid | Batch-route upfront + re-route on retry |
|
|
79
|
+
| execution | costLimit | number (USD) | 5.0 | Pause run when cost exceeds this |
|
|
80
|
+
| execution | sessionTimeoutSeconds | number | 600 | Kill agent session after this |
|
|
81
|
+
| execution | verificationTimeoutSeconds | number | 300 | Kill test/typecheck/lint subprocess |
|
|
82
|
+
| quality | commands.test | string | (auto-detect) | Custom test command |
|
|
83
|
+
| quality | forceExit | boolean | false | Append --forceExit to test command |
|
|
84
|
+
| quality | stripEnvVars | string[] | CLAUDECODE, REPL_ID, AGENT | Env vars removed during verification |
|
|
85
|
+
| tdd | sessionTiers | {testWriter, implementer, verifier} | balanced/story-tier/fast | Per-session model overrides |
|
|
86
|
+
| tdd | testWriterAllowedPaths | string[] | src/index.ts, src/**/index.ts | Soft-allowed paths for test-writer |
|
|
87
|
+
| constitution | path | string | constitution.md | Relative to config dir (~/.nax/ or nax/) |
|
|
88
|
+
| constitution | skipGlobal | boolean | false | *(v0.10)* Skip global constitution for this project |
|
|
89
|
+
| context | testCoverage.detail | names-only\|names-and-counts\|describe-blocks | names-and-counts | How much test info to inject |
|
|
90
|
+
| context | testCoverage.maxTokens | number | 500 | Token budget for test coverage section |
|
|
91
|
+
| context | testCoverage.scopeToStory | boolean | true | Filter test coverage to story-relevant files only |
|
|
92
|
+
| acceptance | enabled | boolean | true | Run LLM acceptance validation |
|
|
93
|
+
| analyze | llmEnhanced | boolean | true | Use LLM for story decomposition |
|
|
94
|
+
| optimizer | enabled | boolean | false | *(v0.10)* Enable prompt optimization stage |
|
|
95
|
+
| optimizer | strategy | noop\|rule-based | noop | *(v0.10)* Built-in optimizer strategy |
|
|
96
|
+
| hooks | skipGlobal | boolean | false | *(v0.10)* Skip global hooks for this project |
|
|
97
|
+
| plugins | (array) | PluginConfigEntry[] | [] | *(v0.10)* Explicit plugin modules + config |
|
|
98
|
+
|
|
99
|
+
Full schema with Zod validation: `src/config/schema.ts`
|
|
100
|
+
|
|
101
|
+
## v0.10 Specs
|
|
102
|
+
|
|
103
|
+
| Feature | Spec File | Stories | Summary |
|
|
104
|
+
|:--------|:----------|:--------|:--------|
|
|
105
|
+
| Plugin System | `docs/v0.10-plugin-system.md` | 9 | Loader, registry, 6 extension point interfaces (optimizer, router, agent, reviewer, context-provider, reporter) |
|
|
106
|
+
| Prompt Optimizer | `docs/v0.10-prompt-optimizer.md` | 5 | NoopOptimizer (default), RuleBasedOptimizer (strip whitespace, compact criteria, dedup context), optimizer pipeline stage |
|
|
107
|
+
| Global Config | `docs/v0.10-global-config.md` | 7 | `~/.nax/` directory, deep merge (project wins), hooks concatenate (global first), constitution concatenate, `nax init --global`, `skipGlobal` opt-out |
|
|
108
|
+
| Status File & Smart Escalation | `docs/specs/status-file-v0.10.1.md` | 9 | Atomic JSON status tracking, failure categorization, retry-as-lite strategy downgrade |
|
|
109
|
+
|
|
110
|
+
**Total: ~30 user stories** across 4 features.
|
|
111
|
+
|
|
112
|
+
## Version History
|
|
113
|
+
|
|
114
|
+
| Version | What Changed | Issues |
|
|
115
|
+
|:--------|:-------------|:-------|
|
|
116
|
+
| v0.10.1 | Status file (machine-readable), Smart TDD escalation (retryAsLite), Verifier Verdicts | #16 |
|
|
117
|
+
| v0.10.0 | Plugin system, Global config layering, Prompt optimizer stage | #8, #14 |
|
|
118
|
+
| v0.9.3 | Prompt Audit CLI (`nax prompts`), context isolation unit tests, scoped test coverage scanner | #15 |
|
|
119
|
+
|
|
120
|
+
## Roadmap
|
|
121
|
+
|
|
122
|
+
| Priority | Feature | Status | Ref |
|
|
123
|
+
|:---------|:--------|:-------|:----|
|
|
124
|
+
| **Done** | Phase 1: TDD-Lite strategy + zero-file fallback | ✅ Done | #20, `docs/20260224-nax-roadmap-phases.md` |
|
|
125
|
+
| **Next** | Phase 2: LLM Service Layer — agent interface with pluggable backends | 📋 Planned | #3 |
|
|
126
|
+
| **Next** | Phase 3: Worktree parallelism — N stories concurrent | 📋 Planned | — |
|
|
127
|
+
| **Backlog** | CLI for paused stories (`nax stories`, `nax resume`) | 📋 Planned | #18 |
|
|
128
|
+
| **Backlog** | Quality flags + review.checks unification | 📋 Planned | #19 |
|
|
129
|
+
|
|
130
|
+
### Phase Dependency Chain
|
|
131
|
+
```
|
|
132
|
+
Phase 1: tdd-lite + fallback ← standalone, no blockers
|
|
133
|
+
↓
|
|
134
|
+
Phase 2: LLM Service Layer (#3) ← abstracts agent spawning (claude-cli, openclaw, api)
|
|
135
|
+
↓
|
|
136
|
+
Phase 3: Worktree parallelism ← needs Phase 2 for multi-agent coordination
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
*Updated 2026-02-25*
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.10.0] - 2026-02-23
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
#### Plugin System
|
|
13
|
+
- Introduced extensible plugin architecture supporting:
|
|
14
|
+
- Prompt optimizers for context compression and token reduction
|
|
15
|
+
- Custom routers for intelligent agent/model selection
|
|
16
|
+
- Code reviewers for quality gates and automated checks
|
|
17
|
+
- Context providers for dynamic context injection
|
|
18
|
+
- Custom reporters for execution reporting and analytics
|
|
19
|
+
- Agent launchers for custom agent implementations
|
|
20
|
+
- Plugin discovery from both global (`~/.nax/plugins`) and project-local (`nax/plugins`) directories
|
|
21
|
+
- Plugin validation and lifecycle management (setup/teardown hooks)
|
|
22
|
+
- Safe plugin loading with comprehensive error handling
|
|
23
|
+
- Plugin configuration via `nax/config.json` with per-plugin settings
|
|
24
|
+
|
|
25
|
+
#### Global Configuration Layering
|
|
26
|
+
- Implemented three-tier configuration system:
|
|
27
|
+
- User-global config (`~/.nax/config.json`) for default preferences
|
|
28
|
+
- Project config (`nax/config.json`) for project-specific settings
|
|
29
|
+
- CLI overrides for runtime customization
|
|
30
|
+
- Deep merge strategy with array override semantics
|
|
31
|
+
- Layered constitution loading with optional global opt-out
|
|
32
|
+
- Project-level directory detection for automatic config discovery
|
|
33
|
+
- Validation and normalization at each layer
|
|
34
|
+
|
|
35
|
+
#### Prompt Optimizer
|
|
36
|
+
- Built-in prompt optimization system with modular optimizer plugins
|
|
37
|
+
- Token budget enforcement with configurable limits
|
|
38
|
+
- Multi-strategy optimization:
|
|
39
|
+
- Redundancy elimination
|
|
40
|
+
- Context summarization
|
|
41
|
+
- Selective detail retention
|
|
42
|
+
- Optimization statistics tracking (original vs. optimized token counts, reduction percentage)
|
|
43
|
+
- Integration with execution pipeline for automatic prompt optimization
|
|
44
|
+
- Plugin API for custom optimization strategies
|
|
45
|
+
|
|
46
|
+
### Changed
|
|
47
|
+
- Refactored config loading to support global + project layering
|
|
48
|
+
- Updated constitution loader to support skipGlobal flag
|
|
49
|
+
- Enhanced plugin registry with proper lifecycle management
|
|
50
|
+
- Improved error handling across plugin loading and validation
|
|
51
|
+
|
|
52
|
+
### Fixed
|
|
53
|
+
- Path security test failures on macOS (handled `/private` symlink prefix)
|
|
54
|
+
- TypeScript compilation errors across 9 files (20 total errors resolved)
|
|
55
|
+
- Import organization and code formatting issues (96 files auto-formatted)
|
|
56
|
+
|
|
57
|
+
## [0.9.2] - 2026-02-XX
|
|
58
|
+
|
|
59
|
+
### Previous releases
|
|
60
|
+
- See git history for changes prior to v0.10.0
|
package/CLAUDE.md
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
# nax — AI Coding Agent Orchestrator
|
|
2
|
+
|
|
3
|
+
Bun + TypeScript CLI that orchestrates AI coding agents with model routing, three-session TDD, and lifecycle hooks.
|
|
4
|
+
|
|
5
|
+
## Git Identity
|
|
6
|
+
|
|
7
|
+
Always set before committing:
|
|
8
|
+
```bash
|
|
9
|
+
git config user.name "subrina.tai"
|
|
10
|
+
git config user.email "subrina8080@outlook.com"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Commands
|
|
14
|
+
|
|
15
|
+
- Test: `bun test`
|
|
16
|
+
- Typecheck: `bun run typecheck`
|
|
17
|
+
- Lint: `bun run lint`
|
|
18
|
+
- Dev: `bun run dev`
|
|
19
|
+
- Build: `bun run build`
|
|
20
|
+
- Run before commit: `bun test && bun run typecheck`
|
|
21
|
+
|
|
22
|
+
## Code Style
|
|
23
|
+
|
|
24
|
+
- Bun-native APIs only (Bun.file, Bun.write, Bun.spawn, Bun.sleep) — no Node.js equivalents
|
|
25
|
+
- Functional style for pure logic; classes only for stateful adapters (e.g., ClaudeCodeAdapter)
|
|
26
|
+
- Types in `types.ts` per module, barrel exports via `index.ts`
|
|
27
|
+
- Max ~400 lines per file — split if larger
|
|
28
|
+
- Biome for formatting/linting
|
|
29
|
+
|
|
30
|
+
## Testing
|
|
31
|
+
|
|
32
|
+
- Framework: `bun:test` (describe/test/expect)
|
|
33
|
+
- Unit tests: `test/unit/<module>.test.ts`
|
|
34
|
+
- Integration tests: `test/integration/<feature>.test.ts`
|
|
35
|
+
- Routing tests: `test/routing/<router>.test.ts`
|
|
36
|
+
- UI tests: `test/ui/` (TUI testing, rarely needed)
|
|
37
|
+
- All routing, classification, and isolation logic must have unit tests
|
|
38
|
+
|
|
39
|
+
## Architecture
|
|
40
|
+
|
|
41
|
+
### Execution Flow
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
Runner.run() [src/execution/runner.ts]
|
|
45
|
+
-> loadPlugins() [src/plugins/loader.ts]
|
|
46
|
+
-> for each story:
|
|
47
|
+
-> Pipeline.execute() [src/pipeline/pipeline.ts]
|
|
48
|
+
-> stages: queueCheck -> routing -> constitution -> context -> prompt -> execution -> verify -> review -> completion
|
|
49
|
+
-> context stage injects plugin context providers [src/pipeline/stages/context.ts]
|
|
50
|
+
-> routing stage checks plugin routers first [src/routing/chain.ts]
|
|
51
|
+
-> Reporter.emit() [src/plugins/registry.ts]
|
|
52
|
+
-> registry.teardownAll()
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Key Directories
|
|
56
|
+
|
|
57
|
+
| Directory | Purpose |
|
|
58
|
+
|:---|:---|
|
|
59
|
+
| `src/execution/` | Runner loop, agent adapters (Claude Code), TDD strategies |
|
|
60
|
+
| `src/execution/lifecycle/` | (v0.15.0) Lifecycle hooks, startup/teardown orchestration |
|
|
61
|
+
| `src/execution/escalation/` | (v0.15.0) Acceptance-loop escalation logic (when agent fails repeatedly) |
|
|
62
|
+
| `src/execution/acceptance/` | (v0.15.0) Acceptance-loop iteration logic |
|
|
63
|
+
| `src/pipeline/stages/` | Pipeline stages (routing, context, prompt, execution, review, etc.) |
|
|
64
|
+
| `src/routing/` | Model routing — tier classification, router chain, plugin routers |
|
|
65
|
+
| `src/plugins/` | Plugin system — loader, registry, validator, types |
|
|
66
|
+
| `src/config/` | Config schema, loader (layered global + project) |
|
|
67
|
+
| `src/verification/` | (planned) Unified test execution, typecheck, lint, acceptance checks |
|
|
68
|
+
| `src/agents/adapters/` | Agent integrations (Claude Code, future: Devin, Aider, etc.) |
|
|
69
|
+
| `src/cli/` | CLI commands |
|
|
70
|
+
| `examples/plugins/` | Sample plugins (console-reporter) |
|
|
71
|
+
|
|
72
|
+
### Plugin System
|
|
73
|
+
|
|
74
|
+
Plugins extend nax via 4 extension points:
|
|
75
|
+
|
|
76
|
+
| Extension | Interface | Integration Point |
|
|
77
|
+
|:---|:---|:---|
|
|
78
|
+
| **Context Provider** | `IContextProvider` | `src/pipeline/stages/context.ts` — injects context into agent prompts before execution |
|
|
79
|
+
| **Reviewer** | `IReviewer` | Pipeline review stage — runs after built-in checks (typecheck/lint/test) |
|
|
80
|
+
| **Reporter** | `IReporter` | `src/execution/runner.ts` — receives onRunStart/onStoryComplete/onRunEnd events |
|
|
81
|
+
| **Router** | `IRoutingStrategy` | `src/routing/chain.ts` — overrides model routing for specific stories |
|
|
82
|
+
|
|
83
|
+
Plugin loading order: global (`~/.nax/plugins/`) -> project (`<workdir>/nax/plugins/`) -> config (`plugins[]` in config.json).
|
|
84
|
+
|
|
85
|
+
### Config
|
|
86
|
+
|
|
87
|
+
- Global: `~/.nax/config.json`
|
|
88
|
+
- Project: `<workdir>/nax/config.json`
|
|
89
|
+
- Key settings: `execution.contextProviderTokenBudget` (default: 2000), `plugins[]` array
|
|
90
|
+
|
|
91
|
+
## Target Architecture (v0.15.0+)
|
|
92
|
+
|
|
93
|
+
### File Size Hard Limit
|
|
94
|
+
|
|
95
|
+
**400 lines maximum per file.** If you are about to exceed it, STOP and split first.
|
|
96
|
+
|
|
97
|
+
### execution/ Module Re-architecture Goal
|
|
98
|
+
|
|
99
|
+
Keep `runner.ts` as a **thin orchestrator only**. Extract:
|
|
100
|
+
|
|
101
|
+
- `sequential-executor.ts` — single-story execution loop
|
|
102
|
+
- `parallel-runner.ts` — parallel story execution (future)
|
|
103
|
+
- `acceptance-loop.ts` — retry/escalation logic for failed stories
|
|
104
|
+
- `reporter-notifier.ts` — plugin event emission (onRunStart, onStoryComplete, onRunEnd)
|
|
105
|
+
- `lifecycle/` subdir — startup, teardown, cleanup handlers
|
|
106
|
+
- `escalation/` subdir — escalation strategies when acceptance loop fails
|
|
107
|
+
|
|
108
|
+
**Never add new concerns to `runner.ts`** — new logic goes into a focused sub-module.
|
|
109
|
+
|
|
110
|
+
### verification/ Unified Layer (Planned)
|
|
111
|
+
|
|
112
|
+
Do not duplicate test execution logic across pipeline stages. When building new verification features (typecheck, lint, test, acceptance checks), put the logic in `src/verification/` and call from pipeline stages. This prevents scattered test invocations and ensures consistent test result parsing.
|
|
113
|
+
|
|
114
|
+
### Plugin Extension Points
|
|
115
|
+
|
|
116
|
+
When adding new agent integrations (e.g., Devin, Aider, Cursor):
|
|
117
|
+
|
|
118
|
+
1. Add adapter class to `src/agents/adapters/<name>.ts`
|
|
119
|
+
2. Register in `src/agents/adapters/index.ts`
|
|
120
|
+
3. Do NOT inline agent logic in `runner.ts` or `claude.ts`
|
|
121
|
+
|
|
122
|
+
### Logging Style
|
|
123
|
+
|
|
124
|
+
- No emojis in log messages
|
|
125
|
+
- Use `[OK]`, `[WARN]`, `[FAIL]`, `->` instead
|
|
126
|
+
- Keep logs machine-parseable
|
|
127
|
+
|
|
128
|
+
### Configuration
|
|
129
|
+
|
|
130
|
+
- No hardcoded flags or credentials
|
|
131
|
+
- Always read from config schema (`src/config/schema.ts`)
|
|
132
|
+
- Validate config at startup
|
|
133
|
+
|
|
134
|
+
### Closure Passing for Long-Lived Handlers
|
|
135
|
+
|
|
136
|
+
Pass **closures, not values** to long-lived handlers (crash handlers, heartbeat timers). This ensures handlers always reference the latest state, not stale snapshots.
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
// WRONG: Captures stale value
|
|
140
|
+
const handler = () => cleanup(currentStory)
|
|
141
|
+
|
|
142
|
+
// CORRECT: Closure references latest state
|
|
143
|
+
const handler = () => cleanup(() => getCurrentStory())
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Testing Constraints (CRITICAL)
|
|
147
|
+
|
|
148
|
+
- **Never spawn full `nax` processes in tests.** nax has prechecks (git-repo-exists, dependencies-installed) that fail in temp directories. Write unit tests with mocks instead.
|
|
149
|
+
- **Integration tests that need git:** Always `git init` + `git add` + `git commit` in the test fixture before running any code that triggers nax precheck validation.
|
|
150
|
+
- **Test files for crash/signal handling:** Use process-level mocks (e.g., mock `process.on('SIGTERM', ...)`) — do not send real signals in tests.
|
|
151
|
+
- **Context files:** If a test needs specific context files, create them in the test fixture directory — don't rely on auto-detection from the real workspace.
|
|
152
|
+
|
|
153
|
+
## IMPORTANT
|
|
154
|
+
|
|
155
|
+
- Never hardcode API keys — agents use their own auth from env
|
|
156
|
+
- Agent adapters spawn external processes — always handle timeouts and cleanup
|
|
157
|
+
- Conventional commits: `feat:`, `fix:`, `refactor:`, `test:`, `docs:`, `chore:`
|
|
158
|
+
- Keep commits atomic — one logical change per commit
|
|
159
|
+
- Do NOT push to remote — let the human review and push
|