@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/README.md
ADDED
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
# nax
|
|
2
|
+
|
|
3
|
+
**AI Coding Agent Orchestrator** — loops until done.
|
|
4
|
+
|
|
5
|
+
Give it a spec. It writes tests, implements code, verifies quality, and retries until everything passes.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g @nathapp/nax
|
|
11
|
+
# or
|
|
12
|
+
bun install -g @nathapp/nax
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Quick Start
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
cd your-project
|
|
19
|
+
nax init
|
|
20
|
+
nax features create my-feature
|
|
21
|
+
# Edit nax/features/my-feature/prd.json with your user stories
|
|
22
|
+
nax run -f my-feature
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## How It Works
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
analyze → route → execute (loop until all stories pass)
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
1. **Analyze** each user story — classify complexity, select test strategy
|
|
32
|
+
2. **Route** to the right model tier (cheap → standard → premium)
|
|
33
|
+
3. **Execute** an agent session (Claude Code by default)
|
|
34
|
+
4. **Verify** tests pass; escalate model on failure
|
|
35
|
+
5. **Loop** until all stories are complete or a cost/iteration limit is hit
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## CLI Reference
|
|
40
|
+
|
|
41
|
+
### `nax init`
|
|
42
|
+
|
|
43
|
+
Initialize nax in your project. Creates the `nax/` folder structure.
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
nax init
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Creates:
|
|
50
|
+
```
|
|
51
|
+
nax/
|
|
52
|
+
├── config.json # Project-level config
|
|
53
|
+
└── features/ # One folder per feature
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
### `nax features create <name>`
|
|
59
|
+
|
|
60
|
+
Scaffold a new feature.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
nax features create user-auth
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Creates `nax/features/user-auth/prd.json` — edit this file to define your user stories.
|
|
67
|
+
|
|
68
|
+
### `nax features list`
|
|
69
|
+
|
|
70
|
+
List all features and their story completion status.
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
nax features list
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
### `nax analyze -f <name>`
|
|
79
|
+
|
|
80
|
+
Parse a `spec.md` file into a structured `prd.json`. Useful if you prefer writing specs in markdown first.
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
nax analyze -f my-feature
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
### `nax run -f <name>`
|
|
89
|
+
|
|
90
|
+
Execute the orchestration loop for a feature.
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
nax run -f my-feature
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
**Flags:**
|
|
97
|
+
|
|
98
|
+
| Flag | Description |
|
|
99
|
+
|:-----|:------------|
|
|
100
|
+
| `-f, --feature <name>` | Feature name (required) |
|
|
101
|
+
| `--dry-run` | Preview story routing without running agents |
|
|
102
|
+
| `--headless` | Non-interactive output (structured logs, no TUI) |
|
|
103
|
+
| `-d, --dir <path>` | Project directory (defaults to `cwd`) |
|
|
104
|
+
|
|
105
|
+
**Examples:**
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# Preview what would run (no agents spawned)
|
|
109
|
+
nax run -f user-auth --dry-run
|
|
110
|
+
|
|
111
|
+
# Run in a different directory
|
|
112
|
+
nax run -f user-auth -d /path/to/project
|
|
113
|
+
|
|
114
|
+
# Run in CI/CD (structured output)
|
|
115
|
+
nax run -f user-auth --headless
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
### `nax precheck -f <name>`
|
|
121
|
+
|
|
122
|
+
Validate your project is ready to run — checks git, PRD, CLI tools, deps, test/lint/typecheck scripts.
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
nax precheck -f my-feature
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Run this before `nax run` to catch configuration issues early.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
### `nax status -f <name>`
|
|
133
|
+
|
|
134
|
+
Show live run progress — stories passed, failed, current story, cost so far.
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
nax status -f my-feature
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
### `nax logs -f <name>`
|
|
143
|
+
|
|
144
|
+
Stream logs from the current or last run.
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
nax logs -f my-feature
|
|
148
|
+
|
|
149
|
+
# Follow in real-time
|
|
150
|
+
nax logs -f my-feature --follow
|
|
151
|
+
|
|
152
|
+
# Filter by story
|
|
153
|
+
nax logs -f my-feature --story US-003
|
|
154
|
+
|
|
155
|
+
# Filter by level
|
|
156
|
+
nax logs -f my-feature --level error
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### `nax diagnose -f <name>`
|
|
162
|
+
|
|
163
|
+
Analyze a failed run and suggest fixes. No LLM — pure pattern matching on PRD state, git log, and events.
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
nax diagnose -f my-feature
|
|
167
|
+
|
|
168
|
+
# JSON output for scripting
|
|
169
|
+
nax diagnose -f my-feature --json
|
|
170
|
+
|
|
171
|
+
# Verbose (per-story tier/strategy detail)
|
|
172
|
+
nax diagnose -f my-feature --verbose
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Output sections:
|
|
176
|
+
- **Run Summary** — status, stories passed/failed/pending, total cost
|
|
177
|
+
- **Story Breakdown** — per-story pattern classification
|
|
178
|
+
- **Failure Analysis** — pattern name, symptom, recommended fix
|
|
179
|
+
- **Lock Check** — detects stale `nax.lock`
|
|
180
|
+
- **Recommendations** — ordered next actions
|
|
181
|
+
|
|
182
|
+
**Common failure patterns:**
|
|
183
|
+
|
|
184
|
+
| Pattern | Symptom | Fix |
|
|
185
|
+
|:--------|:--------|:----|
|
|
186
|
+
| `GREENFIELD_TDD` | No source files exist yet | Use `test-after` or bootstrap files first |
|
|
187
|
+
| `MAX_TIERS_EXHAUSTED` | All model tiers tried | Split story into smaller sub-stories |
|
|
188
|
+
| `ENVIRONMENTAL` | Build/dep errors | Fix precheck issues before re-running |
|
|
189
|
+
| `LOCK_STALE` | `nax.lock` blocking | Shown automatically with `rm nax.lock` |
|
|
190
|
+
| `AUTO_RECOVERED` | nax self-healed | No action needed |
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
### `nax agents`
|
|
195
|
+
|
|
196
|
+
List installed coding agents and which models they support.
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
nax agents
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Configuration
|
|
205
|
+
|
|
206
|
+
Config is layered — project overrides global:
|
|
207
|
+
|
|
208
|
+
| File | Scope |
|
|
209
|
+
|:-----|:------|
|
|
210
|
+
| `~/.nax/config.json` | Global (all projects) |
|
|
211
|
+
| `nax/config.json` | Project-level override |
|
|
212
|
+
|
|
213
|
+
**Key options:**
|
|
214
|
+
|
|
215
|
+
```json
|
|
216
|
+
{
|
|
217
|
+
"execution": {
|
|
218
|
+
"maxIterations": 20,
|
|
219
|
+
"costLimit": 5.0
|
|
220
|
+
},
|
|
221
|
+
"tdd": {
|
|
222
|
+
"strategy": "auto"
|
|
223
|
+
},
|
|
224
|
+
"quality": {
|
|
225
|
+
"commands": {
|
|
226
|
+
"test": "bun test",
|
|
227
|
+
"lint": "bun run lint",
|
|
228
|
+
"typecheck": "bun x tsc --noEmit"
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
**TDD strategy options:**
|
|
235
|
+
|
|
236
|
+
| Value | Behaviour |
|
|
237
|
+
|:------|:----------|
|
|
238
|
+
| `auto` | nax decides based on complexity and tags |
|
|
239
|
+
| `lite` | Prefer `three-session-tdd-lite` for complex stories |
|
|
240
|
+
| `strict` | Always use full `three-session-tdd` for complex stories |
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Three-Session TDD
|
|
245
|
+
|
|
246
|
+
For complex or security-critical stories, nax enforces strict role separation:
|
|
247
|
+
|
|
248
|
+
| Session | Role | Allowed Files |
|
|
249
|
+
|:--------|:-----|:--------------|
|
|
250
|
+
| 1 | Test Writer | Test files only — no source code |
|
|
251
|
+
| 2 | Implementer | Source files only — no test changes |
|
|
252
|
+
| 3 | Verifier | Reviews quality, auto-approves or flags |
|
|
253
|
+
|
|
254
|
+
Isolation is verified automatically via `git diff` between sessions. Violations cause an immediate failure.
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Hooks
|
|
259
|
+
|
|
260
|
+
Integrate notifications, CI triggers, or custom scripts via lifecycle hooks.
|
|
261
|
+
|
|
262
|
+
**Project hooks** (`nax/hooks.json`):
|
|
263
|
+
|
|
264
|
+
```json
|
|
265
|
+
{
|
|
266
|
+
"hooks": {
|
|
267
|
+
"on-complete": {
|
|
268
|
+
"command": "openclaw system event --text 'Feature done!'",
|
|
269
|
+
"enabled": true
|
|
270
|
+
},
|
|
271
|
+
"on-pause": {
|
|
272
|
+
"command": "bash hooks/notify.sh",
|
|
273
|
+
"enabled": true
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
**Available events:**
|
|
280
|
+
|
|
281
|
+
| Event | Fires when |
|
|
282
|
+
|:------|:-----------|
|
|
283
|
+
| `on-start` | Run begins |
|
|
284
|
+
| `on-story-start` | A story starts |
|
|
285
|
+
| `on-story-complete` | A story passes |
|
|
286
|
+
| `on-story-fail` | A story exhausts all attempts |
|
|
287
|
+
| `on-pause` | Run paused (awaiting input) |
|
|
288
|
+
| `on-complete` | All stories done |
|
|
289
|
+
| `on-error` | Unhandled error |
|
|
290
|
+
|
|
291
|
+
Each hook receives context via `NAX_*` environment variables and full JSON on stdin.
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Plugins
|
|
296
|
+
|
|
297
|
+
Extend nax with custom reporters or integrations. Configure in `nax/config.json`:
|
|
298
|
+
|
|
299
|
+
```json
|
|
300
|
+
{
|
|
301
|
+
"plugins": [
|
|
302
|
+
{ "name": "my-reporter", "path": "./plugins/my-reporter.ts" }
|
|
303
|
+
]
|
|
304
|
+
}
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
Global plugin directory: `~/.nax/plugins/`
|
|
308
|
+
|
|
309
|
+
---
|
|
310
|
+
|
|
311
|
+
## Troubleshooting
|
|
312
|
+
|
|
313
|
+
**`nax.lock` blocking a new run**
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
# Check if nax is actually running first
|
|
317
|
+
pgrep -fa nax
|
|
318
|
+
|
|
319
|
+
# If nothing is running, remove the lock
|
|
320
|
+
rm nax.lock
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
**Story keeps failing**
|
|
324
|
+
|
|
325
|
+
```bash
|
|
326
|
+
nax diagnose -f my-feature
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**Precheck fails**
|
|
330
|
+
|
|
331
|
+
```bash
|
|
332
|
+
nax precheck -f my-feature
|
|
333
|
+
# Fix reported issues, then re-run
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
**Run stopped mid-way**
|
|
337
|
+
|
|
338
|
+
nax saves progress in `nax/features/<name>/prd.json`. Re-run with the same command — completed stories are skipped automatically.
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## PRD Format
|
|
343
|
+
|
|
344
|
+
User stories are defined in `nax/features/<name>/prd.json`:
|
|
345
|
+
|
|
346
|
+
```json
|
|
347
|
+
{
|
|
348
|
+
"feature": "user-auth",
|
|
349
|
+
"userStories": [
|
|
350
|
+
{
|
|
351
|
+
"id": "US-001",
|
|
352
|
+
"title": "Add login endpoint",
|
|
353
|
+
"description": "POST /auth/login with email/password",
|
|
354
|
+
"acceptanceCriteria": [
|
|
355
|
+
"Returns JWT on success",
|
|
356
|
+
"Returns 401 on invalid credentials"
|
|
357
|
+
],
|
|
358
|
+
"complexity": "medium",
|
|
359
|
+
"tags": ["auth", "security"],
|
|
360
|
+
"status": "pending"
|
|
361
|
+
}
|
|
362
|
+
]
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
> **Note:** Use `"status": "passed"` (not `"done"`) to manually mark a story complete.
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
## License
|
|
371
|
+
|
|
372
|
+
MIT
|
|
373
|
+
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# US-007 Implementation Summary
|
|
2
|
+
|
|
3
|
+
## Story: Read plugin config entries from nax config.json
|
|
4
|
+
|
|
5
|
+
**Status:** ✅ COMPLETE
|
|
6
|
+
|
|
7
|
+
## Implementation Details
|
|
8
|
+
|
|
9
|
+
The functionality described in US-007 was already implemented in the codebase. This document verifies that all acceptance criteria are met.
|
|
10
|
+
|
|
11
|
+
### Acceptance Criteria Verification
|
|
12
|
+
|
|
13
|
+
#### ✅ AC1: plugins[] from config.json are passed to loadPlugins() as configPlugins parameter
|
|
14
|
+
|
|
15
|
+
**Implementation:**
|
|
16
|
+
- `src/config/loader.ts`: Config schema includes `plugins?: PluginConfigEntry[]` (line 369)
|
|
17
|
+
- `src/execution/runner.ts`: Reads `config.plugins` and passes to `loadPlugins()` (line 201)
|
|
18
|
+
- `src/execution/run-lifecycle.ts`: Reads `config.plugins` and passes to `loadPlugins()` (line 88)
|
|
19
|
+
- `src/cli/plugins.ts`: Reads `config.plugins` and passes to `loadPlugins()` (line 22)
|
|
20
|
+
|
|
21
|
+
**Test Coverage:**
|
|
22
|
+
- `test/integration/config-loader.test.ts`: New tests verify plugins[] are loaded from config.json
|
|
23
|
+
- `test/integration/plugins/config-integration.test.ts`: End-to-end test with realistic scenario
|
|
24
|
+
- `test/integration/plugins/config-resolution.test.ts`: Comprehensive path resolution tests
|
|
25
|
+
|
|
26
|
+
#### ✅ AC2: Relative module paths in plugins[].module are resolved relative to project root
|
|
27
|
+
|
|
28
|
+
**Implementation:**
|
|
29
|
+
- `src/plugins/loader.ts`: `resolveModulePath()` function (lines 173-186)
|
|
30
|
+
- Relative paths (starting with `./` or `../`) are resolved relative to `projectRoot`
|
|
31
|
+
- Uses `path.resolve(projectRoot, modulePath)` for relative paths
|
|
32
|
+
|
|
33
|
+
**Test Coverage:**
|
|
34
|
+
- `test/integration/plugins/config-resolution.test.ts`:
|
|
35
|
+
- "AC2: Relative module paths resolved relative to project root"
|
|
36
|
+
- "resolves ./custom-plugins/plugin.ts relative to project root"
|
|
37
|
+
|
|
38
|
+
#### ✅ AC3: Absolute module paths and npm package names work as-is
|
|
39
|
+
|
|
40
|
+
**Implementation:**
|
|
41
|
+
- `src/plugins/loader.ts`: `resolveModulePath()` function (lines 173-186)
|
|
42
|
+
- Absolute paths: `path.isAbsolute(modulePath)` returns true → no resolution needed
|
|
43
|
+
- NPM packages: No leading `./` or `../` → treated as package name, passed as-is
|
|
44
|
+
|
|
45
|
+
**Test Coverage:**
|
|
46
|
+
- `test/integration/plugins/config-resolution.test.ts`:
|
|
47
|
+
- "AC3: Absolute paths and npm packages work as-is"
|
|
48
|
+
- "resolves npm package names as-is"
|
|
49
|
+
- "resolves absolute paths as-is"
|
|
50
|
+
|
|
51
|
+
#### ✅ AC4: If a plugin module cannot be found, a clear error message is logged with the path tried
|
|
52
|
+
|
|
53
|
+
**Implementation:**
|
|
54
|
+
- `src/plugins/loader.ts`: `loadAndValidatePlugin()` function (lines 225-241)
|
|
55
|
+
- Catches import errors and provides helpful error messages
|
|
56
|
+
- Lines 230-235: Special handling for "Cannot find module" and "ENOENT" errors
|
|
57
|
+
- Logs both original path and attempted resolved path
|
|
58
|
+
- Provides guidance: "Ensure the module exists and the path is correct (relative paths are resolved from project root)"
|
|
59
|
+
|
|
60
|
+
**Test Coverage:**
|
|
61
|
+
- `test/integration/plugins/config-resolution.test.ts`:
|
|
62
|
+
- "AC4: Clear error message when plugin module not found (relative path)"
|
|
63
|
+
- "AC4: Clear error message when plugin module not found (npm package)"
|
|
64
|
+
|
|
65
|
+
**Example Error Output:**
|
|
66
|
+
```
|
|
67
|
+
[nax] Failed to load plugin module './custom-plugins/missing.ts'
|
|
68
|
+
[nax] Attempted path: /path/to/project/custom-plugins/missing.ts
|
|
69
|
+
[nax] Ensure the module exists and the path is correct (relative paths are resolved from project root)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
#### ✅ AC5: Plugin-specific config (plugins[].config) is passed to the plugin's setup() function
|
|
73
|
+
|
|
74
|
+
**Implementation:**
|
|
75
|
+
- `src/plugins/loader.ts`: `loadAndValidatePlugin()` function (lines 214-221)
|
|
76
|
+
- Calls plugin's `setup()` function with the provided config
|
|
77
|
+
- Config is passed as the first parameter: `await validated.setup(config)`
|
|
78
|
+
|
|
79
|
+
**Test Coverage:**
|
|
80
|
+
- `test/integration/plugins/config-integration.test.ts`:
|
|
81
|
+
- "realistic scenario: project with relative plugin paths in config"
|
|
82
|
+
- Verifies that plugin configs are written to tracker file via setup()
|
|
83
|
+
- `test/integration/plugins/config-resolution.test.ts`:
|
|
84
|
+
- "AC5: Plugin-specific config passed to setup() function"
|
|
85
|
+
|
|
86
|
+
## Test Results
|
|
87
|
+
|
|
88
|
+
All plugin-related tests pass:
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
$ bun test test/integration/plugins/ test/integration/config-loader.test.ts test/integration/runner-plugin-integration.test.ts
|
|
92
|
+
|
|
93
|
+
✓ 101 tests passed
|
|
94
|
+
✓ 154 expect() calls
|
|
95
|
+
✓ 0 failures
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### New Tests Added
|
|
99
|
+
|
|
100
|
+
Added 4 new tests to `test/integration/config-loader.test.ts`:
|
|
101
|
+
|
|
102
|
+
1. **"loads plugins[] from config.json"** - Verifies plugins array is loaded correctly
|
|
103
|
+
2. **"handles missing plugins[] array"** - Verifies graceful handling of missing plugins
|
|
104
|
+
3. **"merges plugins[] from global and project config"** - Verifies config merging behavior
|
|
105
|
+
4. **"validates plugin config entries have required fields"** - Verifies validation works
|
|
106
|
+
|
|
107
|
+
## Files Modified
|
|
108
|
+
|
|
109
|
+
1. **test/integration/config-loader.test.ts**
|
|
110
|
+
- Added new test suite: "Config Loader - Plugin Configuration (US-007)"
|
|
111
|
+
- Added 4 tests covering config loading scenarios
|
|
112
|
+
- Tests verify plugins[] array is properly loaded and validated
|
|
113
|
+
|
|
114
|
+
## Architecture Overview
|
|
115
|
+
|
|
116
|
+
```
|
|
117
|
+
config.json
|
|
118
|
+
└─> loadConfig() (src/config/loader.ts)
|
|
119
|
+
└─> NaxConfig { plugins?: PluginConfigEntry[] }
|
|
120
|
+
└─> Runner/CLI reads config.plugins
|
|
121
|
+
└─> loadPlugins(globalDir, projectDir, configPlugins, projectRoot)
|
|
122
|
+
└─> resolveModulePath() for each entry
|
|
123
|
+
└─> loadAndValidatePlugin()
|
|
124
|
+
└─> import module
|
|
125
|
+
└─> validatePlugin()
|
|
126
|
+
└─> plugin.setup(config)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Conclusion
|
|
130
|
+
|
|
131
|
+
All acceptance criteria for US-007 are met. The implementation correctly:
|
|
132
|
+
1. Reads plugins[] from config.json
|
|
133
|
+
2. Passes them to loadPlugins() as configPlugins parameter
|
|
134
|
+
3. Resolves relative paths relative to project root
|
|
135
|
+
4. Handles absolute paths and npm packages correctly
|
|
136
|
+
5. Provides clear error messages when modules are not found
|
|
137
|
+
6. Passes plugin-specific config to setup() functions
|
|
138
|
+
|
|
139
|
+
The feature is production-ready and fully tested.
|