@nathapp/nax 0.18.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitlab-ci.yml +96 -0
- package/BRIEF.md +140 -0
- package/CHANGELOG.md +60 -0
- package/CLAUDE.md +159 -0
- package/README.md +373 -0
- package/US-007-IMPLEMENTATION.md +139 -0
- package/bin/nax.ts +930 -0
- package/biome.json +14 -0
- package/bun.lock +168 -0
- package/bunfig.toml +11 -0
- package/docs/20260216-fix-plan-context-review.md +56 -0
- package/docs/20260216-relentless-vs-ngent-comparison.md +208 -0
- package/docs/20260216-v02-plan.md +136 -0
- package/docs/20260216-v02-review.md +685 -0
- package/docs/20260217-dogfood-findings.md +56 -0
- package/docs/20260217-p2-plus-plan.md +117 -0
- package/docs/20260217-partial-fixes-plan.md +62 -0
- package/docs/20260217-plan-analyze-spec.md +117 -0
- package/docs/20260217-post-impl-review.md +1137 -0
- package/docs/20260217-quick-wins-plan.md +66 -0
- package/docs/20260217-split-runner-plan.md +75 -0
- package/docs/20260217-v03-impl-plan.md +80 -0
- package/docs/20260217-v03-post-impl-review.md +589 -0
- package/docs/20260217-v04-impl-plan.md +86 -0
- package/docs/20260217-v05-post-impl-review.md +850 -0
- package/docs/20260217-v06-post-impl-review.md +817 -0
- package/docs/20260218-adr003-port-plan.md +151 -0
- package/docs/20260218-review-adr003-verification.md +175 -0
- package/docs/20260219-fix-plan-bug16-19.md +79 -0
- package/docs/20260219-fix-plan-bug20-22.md +114 -0
- package/docs/20260219-plan-llm-routing.md +116 -0
- package/docs/20260219-review-bug20-22-fixes.md +135 -0
- package/docs/20260219-routing-baseline-keyword.md +63 -0
- package/docs/20260220-plan-structured-logging-p1.md +80 -0
- package/docs/20260220-plan-structured-logging-p2.md +37 -0
- package/docs/20260220-review-llm-routing.md +180 -0
- package/docs/20260220-review-post-fix-llm-routing.md +70 -0
- package/docs/20260221-fix-plan-relevantfiles-split.md +101 -0
- package/docs/20260221-fix-plan-routing-mode.md +125 -0
- package/docs/20260221-review-v0.9-implementation.md +379 -0
- package/docs/20260222-fix-plan-v091-routing-isolation.md +197 -0
- package/docs/20260223-fix-plan-prompt-audit.md +62 -0
- package/docs/20260224-nax-roadmap-phases.md +189 -0
- package/docs/20260225-phase2-llm-service-layer.md +401 -0
- package/docs/20260225-review-v0.10.1.md +187 -0
- package/docs/20260303-v010-implementation-plan.md +165 -0
- package/docs/CLAUDE.md.bak +191 -0
- package/docs/ROADMAP.md +165 -0
- package/docs/SPEC-rectification.md +0 -0
- package/docs/SPEC.md +324 -0
- package/docs/US-001-plugin-loading-verification.md +152 -0
- package/docs/architecture-analysis.md +1076 -0
- package/docs/bugs/BUG-21-escalation-null-attempts.md +48 -0
- package/docs/bugs-from-dogfood-run-c.md +243 -0
- package/docs/code-review-20260228.md +612 -0
- package/docs/code-review-v0.15.0.md +629 -0
- package/docs/hook-lifecycle-test-plan.md +149 -0
- package/docs/releases/v0.11.0-and-earlier.md +20 -0
- package/docs/releases/v0.12.0.md +15 -0
- package/docs/releases/v0.13.0.md +14 -0
- package/docs/releases/v0.14.0.md +20 -0
- package/docs/releases/v0.14.1.md +36 -0
- package/docs/releases/v0.14.2.md +51 -0
- package/docs/releases/v0.14.3.md +174 -0
- package/docs/releases/v0.14.4.md +94 -0
- package/docs/releases/v0.15.0.md +502 -0
- package/docs/releases/v0.15.1.md +170 -0
- package/docs/releases/v0.15.3.md +193 -0
- package/docs/specs/status-file-v0.10.1.md +812 -0
- package/docs/v0.10-global-config.md +206 -0
- package/docs/v0.10-plugin-system.md +415 -0
- package/docs/v0.10-prompt-optimizer.md +234 -0
- package/docs/v0.3-spec.md +244 -0
- package/docs/v0.4-spec.md +140 -0
- package/docs/v0.5-spec.md +237 -0
- package/docs/v0.6-spec.md +371 -0
- package/docs/v0.7-spec.md +177 -0
- package/docs/v0.8-llm-routing.md +206 -0
- package/docs/v0.8-structured-logging.md +132 -0
- package/docs/v0.9.3-prompt-audit.md +112 -0
- package/examples/plugins/console-reporter/index.test.ts +207 -0
- package/examples/plugins/console-reporter/index.ts +110 -0
- package/nax/config.json +147 -0
- package/nax/features/bugfix-v0171/prd.json +52 -0
- package/nax/features/config-management/prd.json +108 -0
- package/nax/features/config-management/progress.txt +5 -0
- package/nax/features/diagnose/acceptance.test.ts +412 -0
- package/nax/features/diagnose/prd.json +41 -0
- package/nax/features/orchestration-fixes/prd.json +89 -0
- package/nax/features/orchestration-fixes/progress.txt +1 -0
- package/nax/features/plugin-integration/US-007-VERIFICATION.md +259 -0
- package/nax/features/plugin-integration/prd.json +208 -0
- package/nax/features/plugin-integration/progress.txt +5 -0
- package/nax/features/precheck/prd.json +205 -0
- package/nax/features/precheck/progress.txt +15 -0
- package/nax/features/structured-logging/prd.json +199 -0
- package/nax/features/unlock/prd.json +36 -0
- package/package.json +47 -0
- package/src/acceptance/fix-generator.ts +348 -0
- package/src/acceptance/generator.ts +282 -0
- package/src/acceptance/index.ts +30 -0
- package/src/acceptance/types.ts +79 -0
- package/src/agents/claude-decompose.ts +169 -0
- package/src/agents/claude-plan.ts +139 -0
- package/src/agents/claude.ts +324 -0
- package/src/agents/cost.ts +268 -0
- package/src/agents/index.ts +13 -0
- package/src/agents/registry.ts +48 -0
- package/src/agents/types-extended.ts +133 -0
- package/src/agents/types.ts +113 -0
- package/src/agents/validation.ts +69 -0
- package/src/analyze/classifier.ts +305 -0
- package/src/analyze/index.ts +16 -0
- package/src/analyze/scanner.ts +175 -0
- package/src/analyze/types.ts +51 -0
- package/src/cli/accept.ts +108 -0
- package/src/cli/analyze-parser.ts +284 -0
- package/src/cli/analyze.ts +207 -0
- package/src/cli/config.ts +561 -0
- package/src/cli/constitution.ts +109 -0
- package/src/cli/diagnose-analysis.ts +159 -0
- package/src/cli/diagnose-formatter.ts +87 -0
- package/src/cli/diagnose.ts +203 -0
- package/src/cli/generate.ts +127 -0
- package/src/cli/index.ts +37 -0
- package/src/cli/init.ts +188 -0
- package/src/cli/interact.ts +295 -0
- package/src/cli/plan.ts +198 -0
- package/src/cli/plugins.ts +111 -0
- package/src/cli/prompts.ts +295 -0
- package/src/cli/runs.ts +174 -0
- package/src/cli/status-cost.ts +151 -0
- package/src/cli/status-features.ts +338 -0
- package/src/cli/status.ts +13 -0
- package/src/commands/common.ts +171 -0
- package/src/commands/diagnose.ts +17 -0
- package/src/commands/index.ts +8 -0
- package/src/commands/logs.ts +384 -0
- package/src/commands/precheck.ts +86 -0
- package/src/commands/unlock.ts +96 -0
- package/src/config/defaults.ts +160 -0
- package/src/config/index.ts +22 -0
- package/src/config/loader.ts +121 -0
- package/src/config/merger.ts +147 -0
- package/src/config/path-security.ts +121 -0
- package/src/config/paths.ts +27 -0
- package/src/config/schema.ts +56 -0
- package/src/config/schemas.ts +286 -0
- package/src/config/types.ts +423 -0
- package/src/config/validate.ts +103 -0
- package/src/constitution/generator.ts +191 -0
- package/src/constitution/generators/aider.ts +41 -0
- package/src/constitution/generators/claude.ts +35 -0
- package/src/constitution/generators/cursor.ts +36 -0
- package/src/constitution/generators/opencode.ts +38 -0
- package/src/constitution/generators/types.ts +33 -0
- package/src/constitution/generators/windsurf.ts +36 -0
- package/src/constitution/index.ts +10 -0
- package/src/constitution/loader.ts +133 -0
- package/src/constitution/types.ts +31 -0
- package/src/context/auto-detect.ts +227 -0
- package/src/context/builder.ts +246 -0
- package/src/context/elements.ts +83 -0
- package/src/context/formatter.ts +107 -0
- package/src/context/generator.ts +129 -0
- package/src/context/generators/aider.ts +34 -0
- package/src/context/generators/claude.ts +28 -0
- package/src/context/generators/cursor.ts +28 -0
- package/src/context/generators/opencode.ts +30 -0
- package/src/context/generators/windsurf.ts +28 -0
- package/src/context/greenfield.ts +114 -0
- package/src/context/index.ts +33 -0
- package/src/context/injector.ts +279 -0
- package/src/context/test-scanner.ts +370 -0
- package/src/context/types.ts +98 -0
- package/src/errors.ts +67 -0
- package/src/execution/batching.ts +157 -0
- package/src/execution/crash-recovery.ts +373 -0
- package/src/execution/escalation/escalation.ts +44 -0
- package/src/execution/escalation/index.ts +13 -0
- package/src/execution/escalation/tier-escalation.ts +295 -0
- package/src/execution/escalation/tier-outcome.ts +158 -0
- package/src/execution/helpers.ts +38 -0
- package/src/execution/index.ts +45 -0
- package/src/execution/lifecycle/acceptance-loop.ts +272 -0
- package/src/execution/lifecycle/headless-formatter.ts +85 -0
- package/src/execution/lifecycle/index.ts +12 -0
- package/src/execution/lifecycle/parallel-lifecycle.ts +101 -0
- package/src/execution/lifecycle/precheck-runner.ts +140 -0
- package/src/execution/lifecycle/run-cleanup.ts +81 -0
- package/src/execution/lifecycle/run-completion.ts +129 -0
- package/src/execution/lifecycle/run-initialization.ts +141 -0
- package/src/execution/lifecycle/run-lifecycle.ts +312 -0
- package/src/execution/lifecycle/run-setup.ts +204 -0
- package/src/execution/lifecycle/story-hooks.ts +38 -0
- package/src/execution/lifecycle/story-size-prompts.ts +123 -0
- package/src/execution/lock.ts +115 -0
- package/src/execution/parallel-executor.ts +216 -0
- package/src/execution/parallel.ts +400 -0
- package/src/execution/pid-registry.ts +280 -0
- package/src/execution/pipeline-result-handler.ts +388 -0
- package/src/execution/post-verify-rectification.ts +188 -0
- package/src/execution/post-verify.ts +274 -0
- package/src/execution/progress.ts +25 -0
- package/src/execution/prompts.ts +127 -0
- package/src/execution/queue-handler.ts +109 -0
- package/src/execution/rectification.ts +13 -0
- package/src/execution/runner.ts +377 -0
- package/src/execution/sequential-executor.ts +388 -0
- package/src/execution/status-file.ts +264 -0
- package/src/execution/status-writer.ts +139 -0
- package/src/execution/story-context.ts +229 -0
- package/src/execution/test-output-parser.ts +14 -0
- package/src/execution/verification.ts +72 -0
- package/src/hooks/index.ts +2 -0
- package/src/hooks/runner.ts +286 -0
- package/src/hooks/types.ts +67 -0
- package/src/interaction/chain.ts +154 -0
- package/src/interaction/index.ts +60 -0
- package/src/interaction/init.ts +83 -0
- package/src/interaction/plugins/auto.ts +217 -0
- package/src/interaction/plugins/cli.ts +300 -0
- package/src/interaction/plugins/telegram.ts +384 -0
- package/src/interaction/plugins/webhook.ts +258 -0
- package/src/interaction/state.ts +171 -0
- package/src/interaction/triggers.ts +229 -0
- package/src/interaction/types.ts +163 -0
- package/src/logger/formatters.ts +84 -0
- package/src/logger/index.ts +16 -0
- package/src/logger/logger.ts +298 -0
- package/src/logger/types.ts +48 -0
- package/src/logging/formatter.ts +355 -0
- package/src/logging/index.ts +22 -0
- package/src/logging/types.ts +93 -0
- package/src/metrics/aggregator.ts +190 -0
- package/src/metrics/index.ts +14 -0
- package/src/metrics/tracker.ts +200 -0
- package/src/metrics/types.ts +109 -0
- package/src/optimizer/index.ts +62 -0
- package/src/optimizer/noop.optimizer.ts +24 -0
- package/src/optimizer/rule-based.optimizer.ts +248 -0
- package/src/optimizer/types.ts +53 -0
- package/src/pipeline/events.ts +130 -0
- package/src/pipeline/index.ts +19 -0
- package/src/pipeline/runner.ts +161 -0
- package/src/pipeline/stages/acceptance.ts +197 -0
- package/src/pipeline/stages/completion.ts +99 -0
- package/src/pipeline/stages/constitution.ts +63 -0
- package/src/pipeline/stages/context.ts +117 -0
- package/src/pipeline/stages/execution.ts +194 -0
- package/src/pipeline/stages/index.ts +62 -0
- package/src/pipeline/stages/optimizer.ts +74 -0
- package/src/pipeline/stages/prompt.ts +57 -0
- package/src/pipeline/stages/queue-check.ts +103 -0
- package/src/pipeline/stages/review.ts +181 -0
- package/src/pipeline/stages/routing.ts +81 -0
- package/src/pipeline/stages/verify.ts +100 -0
- package/src/pipeline/types.ts +167 -0
- package/src/plugins/index.ts +31 -0
- package/src/plugins/loader.ts +287 -0
- package/src/plugins/registry.ts +168 -0
- package/src/plugins/types.ts +327 -0
- package/src/plugins/validator.ts +352 -0
- package/src/prd/index.ts +172 -0
- package/src/prd/types.ts +202 -0
- package/src/precheck/checks-blockers.ts +391 -0
- package/src/precheck/checks-warnings.ts +142 -0
- package/src/precheck/checks.ts +30 -0
- package/src/precheck/index.ts +247 -0
- package/src/precheck/story-size-gate.ts +144 -0
- package/src/precheck/types.ts +31 -0
- package/src/queue/index.ts +2 -0
- package/src/queue/manager.ts +254 -0
- package/src/queue/types.ts +54 -0
- package/src/review/index.ts +8 -0
- package/src/review/runner.ts +172 -0
- package/src/review/types.ts +66 -0
- package/src/routing/builder.ts +81 -0
- package/src/routing/chain.ts +74 -0
- package/src/routing/index.ts +16 -0
- package/src/routing/loader.ts +58 -0
- package/src/routing/router.ts +303 -0
- package/src/routing/strategies/adaptive.ts +215 -0
- package/src/routing/strategies/index.ts +8 -0
- package/src/routing/strategies/keyword.ts +163 -0
- package/src/routing/strategies/llm-prompts.ts +209 -0
- package/src/routing/strategies/llm.ts +235 -0
- package/src/routing/strategies/manual.ts +50 -0
- package/src/routing/strategy.ts +99 -0
- package/src/tdd/cleanup.ts +111 -0
- package/src/tdd/index.ts +23 -0
- package/src/tdd/isolation.ts +123 -0
- package/src/tdd/orchestrator.ts +383 -0
- package/src/tdd/prompts.ts +270 -0
- package/src/tdd/rectification-gate.ts +183 -0
- package/src/tdd/session-runner.ts +179 -0
- package/src/tdd/types.ts +81 -0
- package/src/tdd/verdict.ts +271 -0
- package/src/tui/App.tsx +265 -0
- package/src/tui/components/AgentPanel.tsx +75 -0
- package/src/tui/components/CostOverlay.tsx +118 -0
- package/src/tui/components/HelpOverlay.tsx +107 -0
- package/src/tui/components/StatusBar.tsx +63 -0
- package/src/tui/components/StoriesPanel.tsx +177 -0
- package/src/tui/hooks/useKeyboard.ts +142 -0
- package/src/tui/hooks/useLayout.ts +137 -0
- package/src/tui/hooks/usePipelineEvents.ts +183 -0
- package/src/tui/hooks/usePty.ts +194 -0
- package/src/tui/index.tsx +38 -0
- package/src/tui/types.ts +76 -0
- package/src/utils/git.ts +83 -0
- package/src/utils/queue-writer.ts +54 -0
- package/src/verification/executor.ts +235 -0
- package/src/verification/gate.ts +207 -0
- package/src/verification/index.ts +12 -0
- package/src/verification/parser.ts +230 -0
- package/src/verification/rectification.ts +108 -0
- package/src/verification/types.ts +113 -0
- package/src/worktree/dispatcher.ts +65 -0
- package/src/worktree/index.ts +2 -0
- package/src/worktree/manager.ts +187 -0
- package/src/worktree/merge.ts +301 -0
- package/src/worktree/types.ts +4 -0
- package/test/TEST_COVERAGE_US001.md +217 -0
- package/test/TEST_COVERAGE_US003.md +84 -0
- package/test/TEST_COVERAGE_US005.md +86 -0
- package/test/US-002-orchestrator.test.ts +246 -0
- package/test/acceptance/cm-003-default-view.test.ts +194 -0
- package/test/execution/pid-registry.test.ts +240 -0
- package/test/execution/post-verify.test.ts +224 -0
- package/test/helpers/timeout.ts +42 -0
- package/test/integration/US-002-TEST-SUMMARY.md +107 -0
- package/test/integration/US-003-TEST-SUMMARY.md +149 -0
- package/test/integration/US-004-TEST-SUMMARY.md +106 -0
- package/test/integration/US-005-TEST-SUMMARY.md +138 -0
- package/test/integration/US-007-TEST-SUMMARY.md +100 -0
- package/test/integration/agent-validation.test.ts +439 -0
- package/test/integration/analyze-integration.test.ts +261 -0
- package/test/integration/analyze-scanner.test.ts +131 -0
- package/test/integration/cli-config-default-edge-cases.test.ts +222 -0
- package/test/integration/cli-config-default-view.test.ts +229 -0
- package/test/integration/cli-config-diff.test.ts +460 -0
- package/test/integration/cli-config.test.ts +736 -0
- package/test/integration/cli-diagnose.test.ts +592 -0
- package/test/integration/cli-logs.test.ts +314 -0
- package/test/integration/cli-plugins.test.ts +678 -0
- package/test/integration/cli-precheck.test.ts +371 -0
- package/test/integration/cli-run-headless.test.ts +173 -0
- package/test/integration/cli.test.ts +75 -0
- package/test/integration/config/merger.test.ts +465 -0
- package/test/integration/config/paths.test.ts +51 -0
- package/test/integration/config-loader.test.ts +265 -0
- package/test/integration/config.test.ts +444 -0
- package/test/integration/context-integration.test.ts +702 -0
- package/test/integration/context-provider-injection.test.ts +506 -0
- package/test/integration/context-verification-integration.test.ts +295 -0
- package/test/integration/e2e.test.ts +896 -0
- package/test/integration/execution.test.ts +625 -0
- package/test/integration/helpers.test.ts +295 -0
- package/test/integration/hooks.test.ts +361 -0
- package/test/integration/interaction-chain-pipeline.test.ts +464 -0
- package/test/integration/isolation.test.ts +143 -0
- package/test/integration/logger.test.ts +461 -0
- package/test/integration/parallel.test.ts +250 -0
- package/test/integration/path-security.test.ts +173 -0
- package/test/integration/pipeline-acceptance.test.ts +302 -0
- package/test/integration/pipeline-events.test.ts +475 -0
- package/test/integration/pipeline.test.ts +658 -0
- package/test/integration/plan.test.ts +157 -0
- package/test/integration/plugin-routing.test.ts +921 -0
- package/test/integration/plugins/config-integration.test.ts +172 -0
- package/test/integration/plugins/config-resolution.test.ts +522 -0
- package/test/integration/plugins/loader.test.ts +641 -0
- package/test/integration/plugins/registry.test.ts +746 -0
- package/test/integration/plugins/validator.test.ts +563 -0
- package/test/integration/prd-pause.test.ts +205 -0
- package/test/integration/prd-resolvers.test.ts +185 -0
- package/test/integration/precheck-integration.test.ts +468 -0
- package/test/integration/precheck.test.ts +805 -0
- package/test/integration/progress.test.ts +34 -0
- package/test/integration/rectification-flow.test.ts +512 -0
- package/test/integration/reporter-lifecycle.test.ts +860 -0
- package/test/integration/review-config-commands.test.ts +319 -0
- package/test/integration/review-config-schema.test.ts +116 -0
- package/test/integration/review-plugin-integration.test.ts +722 -0
- package/test/integration/review.test.ts +149 -0
- package/test/integration/routing-stage-bug-021.test.ts +274 -0
- package/test/integration/routing-stage-greenfield.test.ts +286 -0
- package/test/integration/runner-config-plugins.test.ts +461 -0
- package/test/integration/runner-fixes.test.ts +399 -0
- package/test/integration/runner-plugin-integration.test.ts +543 -0
- package/test/integration/runner.test.ts +1679 -0
- package/test/integration/s5-greenfield-fallback.test.ts +297 -0
- package/test/integration/status-file-integration.test.ts +325 -0
- package/test/integration/status-file.test.ts +379 -0
- package/test/integration/status-writer.test.ts +345 -0
- package/test/integration/story-id-in-events.test.ts +273 -0
- package/test/integration/tdd-cleanup.test.ts +246 -0
- package/test/integration/tdd-orchestrator.test.ts +1762 -0
- package/test/integration/test-scanner.test.ts +403 -0
- package/test/integration/verification-asset-check.test.ts +142 -0
- package/test/integration/verify-stage.test.ts +275 -0
- package/test/integration/worktree/manager.test.ts +218 -0
- package/test/integration/worktree/merge.test.ts +341 -0
- package/test/manual/logging-formatter-demo.ts +158 -0
- package/test/ui/tui-agent-panel.test.tsx +99 -0
- package/test/ui/tui-controls.test.ts +334 -0
- package/test/ui/tui-cost-and-pty.test.ts +189 -0
- package/test/ui/tui-layout.test.ts +378 -0
- package/test/ui/tui-pty-integration.test.tsx +159 -0
- package/test/ui/tui-stories.test.ts +332 -0
- package/test/unit/acceptance.test.ts +186 -0
- package/test/unit/agent-stderr-capture.test.ts +146 -0
- package/test/unit/analyze-classifier.test.ts +215 -0
- package/test/unit/analyze.test.ts +224 -0
- package/test/unit/auto-detect.test.ts +249 -0
- package/test/unit/cli-status.test.ts +417 -0
- package/test/unit/commands/common.test.ts +320 -0
- package/test/unit/commands/logs.test.ts +416 -0
- package/test/unit/commands/unlock.test.ts +319 -0
- package/test/unit/constitution-generators.test.ts +160 -0
- package/test/unit/constitution.test.ts +209 -0
- package/test/unit/context.test.ts +1722 -0
- package/test/unit/cost.test.ts +231 -0
- package/test/unit/crash-recovery.test.ts +308 -0
- package/test/unit/escalation.test.ts +126 -0
- package/test/unit/execution-logging-stderr.test.ts +156 -0
- package/test/unit/execution-stage.test.ts +122 -0
- package/test/unit/fix-generator.test.ts +275 -0
- package/test/unit/formatters.test.ts +469 -0
- package/test/unit/greenfield.test.ts +179 -0
- package/test/unit/helpers.test.ts +317 -0
- package/test/unit/interaction/human-review-trigger.test.ts +164 -0
- package/test/unit/interaction-network-failures.test.ts +389 -0
- package/test/unit/interaction-plugins.test.ts +164 -0
- package/test/unit/isolation.test.ts +134 -0
- package/test/unit/logging/formatter.test.ts +455 -0
- package/test/unit/merge.test.ts +268 -0
- package/test/unit/metrics.test.ts +276 -0
- package/test/unit/optimizer/noop.optimizer.test.ts +125 -0
- package/test/unit/optimizer/rule-based.optimizer.test.ts +358 -0
- package/test/unit/prd-auto-default.test.ts +290 -0
- package/test/unit/prd-failure-category.test.ts +176 -0
- package/test/unit/prd-get-next-story.test.ts +186 -0
- package/test/unit/precheck-checks.test.ts +840 -0
- package/test/unit/precheck-story-size-gate.test.ts +287 -0
- package/test/unit/precheck-types.test.ts +142 -0
- package/test/unit/prompts.test.ts +475 -0
- package/test/unit/queue.test.ts +237 -0
- package/test/unit/rectification.test.ts +284 -0
- package/test/unit/registry.test.ts +287 -0
- package/test/unit/routing.test.ts +937 -0
- package/test/unit/run-lifecycle.test.ts +140 -0
- package/test/unit/storyid-events.test.ts +224 -0
- package/test/unit/tdd-verdict.test.ts +492 -0
- package/test/unit/test-output-parser.test.ts +377 -0
- package/test/unit/verdict.test.ts +324 -0
- package/test/unit/worktree-manager.test.ts +158 -0
- package/tsconfig.json +27 -0
|
@@ -0,0 +1,685 @@
|
|
|
1
|
+
# v0.2 Code Review Report
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-02-16
|
|
4
|
+
**Reviewer:** Claude Code
|
|
5
|
+
**Scope:** v0.2 changes (commits baf529d, 1885a49, 1593093, 948f0a7)
|
|
6
|
+
**Files Reviewed:** 8 core files
|
|
7
|
+
**Test Status:** ✅ 132 tests passing
|
|
8
|
+
**TypeScript:** ✅ No type errors
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Executive Summary
|
|
13
|
+
|
|
14
|
+
v0.2 introduces four major features: queue commands (PAUSE/ABORT/SKIP), story batching, context builder integration, and explicit 3-tier escalation. The implementation is **solid** with comprehensive test coverage and correct patterns. However, there are **6 findings** ranging from CRITICAL to MINOR that should be addressed.
|
|
15
|
+
|
|
16
|
+
**Overall Grade: B+**
|
|
17
|
+
|
|
18
|
+
### Key Strengths
|
|
19
|
+
- ✅ Comprehensive test coverage (132 tests, 12 test files)
|
|
20
|
+
- ✅ Type-safe implementation, no TypeScript errors
|
|
21
|
+
- ✅ Clean separation of concerns (queue, context, execution)
|
|
22
|
+
- ✅ Immutable patterns followed throughout
|
|
23
|
+
- ✅ Good error handling and validation
|
|
24
|
+
|
|
25
|
+
### Key Concerns
|
|
26
|
+
- ⚠️ Queue command edge case: partial batch failure handling
|
|
27
|
+
- ⚠️ Escalation chain edge case: batch execution with escalation
|
|
28
|
+
- ⚠️ Context builder missing error boundary for malformed PRD data
|
|
29
|
+
- ℹ️ Minor DRY violations in runner.ts
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Findings by Category
|
|
34
|
+
|
|
35
|
+
### 1️⃣ Queue Commands (PAUSE/ABORT/SKIP)
|
|
36
|
+
|
|
37
|
+
**Grade: A-**
|
|
38
|
+
|
|
39
|
+
**Location:** `src/queue/manager.ts`, `src/queue/types.ts`
|
|
40
|
+
|
|
41
|
+
#### Strengths
|
|
42
|
+
- ✅ Clean type-safe design with discriminated union for SKIP command
|
|
43
|
+
- ✅ Case-insensitive parsing for user-friendliness
|
|
44
|
+
- ✅ Clear separation of commands vs guidance text
|
|
45
|
+
- ✅ Comprehensive test coverage (28 tests in `test/queue.test.ts`)
|
|
46
|
+
- ✅ Proper whitespace handling and edge cases covered
|
|
47
|
+
|
|
48
|
+
#### Issues Found
|
|
49
|
+
|
|
50
|
+
**CRITICAL: Missing Edge Case — Batch SKIP Command** (Grade: C)
|
|
51
|
+
|
|
52
|
+
**Issue:** When user issues `SKIP US-002` while executing a batch `[US-001, US-002, US-003]`, the current implementation doesn't gracefully handle mid-batch skips.
|
|
53
|
+
|
|
54
|
+
**Location:** `src/execution/runner.ts:551-598`
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
// Current code processes queue commands AFTER batch completion
|
|
58
|
+
// If batch fails, only first story is marked for retry/escalation
|
|
59
|
+
// Other stories in batch are left in limbo
|
|
60
|
+
for (const cmd of queueCommands) {
|
|
61
|
+
// ...
|
|
62
|
+
} else if (typeof cmd === "object" && cmd.type === "SKIP") {
|
|
63
|
+
console.log(chalk.yellow(` ⏭️ Skipping story ${cmd.storyId} by user request`));
|
|
64
|
+
markStorySkipped(prd, cmd.storyId);
|
|
65
|
+
await savePRD(prd, prdPath);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Problem:**
|
|
71
|
+
1. Queue commands are only checked AFTER successful batch completion (line 551)
|
|
72
|
+
2. If batch is in-progress, SKIP commands won't be processed until after completion
|
|
73
|
+
3. User expects immediate effect when writing `SKIP US-002` to `.queue.txt`
|
|
74
|
+
|
|
75
|
+
**Recommendation:**
|
|
76
|
+
- Check queue file BEFORE starting batch execution
|
|
77
|
+
- Filter out skipped stories from batch candidates
|
|
78
|
+
- Re-validate batch after filtering
|
|
79
|
+
|
|
80
|
+
**Impact:** Medium — User confusion, inefficient execution
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
**MINOR: markSkipped Implementation** (Grade: B)
|
|
85
|
+
|
|
86
|
+
**Issue:** `markSkipped` sets status to "failed" with error message "Skipped by user command"
|
|
87
|
+
|
|
88
|
+
**Location:** `src/queue/manager.ts:182-192`
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
markSkipped(storyId: string): void {
|
|
92
|
+
const item = this.items.find((i) => i.storyId === storyId);
|
|
93
|
+
if (!item) {
|
|
94
|
+
throw new Error(`Story ${storyId} not found in queue`);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Mark as failed with skip reason (skipped is a type of failure)
|
|
98
|
+
item.status = "failed";
|
|
99
|
+
item.error = "Skipped by user command";
|
|
100
|
+
item.completedAt = new Date();
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Problem:**
|
|
105
|
+
- Comment says "skipped is a type of failure" but `QueueItemStatus` type only has `"pending" | "in-progress" | "completed" | "failed"`
|
|
106
|
+
- Semantically, "skipped" is not the same as "failed" — causes confusion in stats/reporting
|
|
107
|
+
- `markStorySkipped()` in PRD module correctly uses `status: "skipped"` (separate status)
|
|
108
|
+
|
|
109
|
+
**Mismatch:** Queue module lacks `"skipped"` status that PRD module has
|
|
110
|
+
|
|
111
|
+
**Recommendation:**
|
|
112
|
+
- Add `"skipped"` to `QueueItemStatus` type
|
|
113
|
+
- Update `markSkipped` to use correct status
|
|
114
|
+
- Update `getStats()` to track skipped count separately
|
|
115
|
+
|
|
116
|
+
**Impact:** Low — Stats are misleading but functional
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
### 2️⃣ Story Batching
|
|
121
|
+
|
|
122
|
+
**Grade: A**
|
|
123
|
+
|
|
124
|
+
**Location:** `src/execution/runner.ts:131-186`, `test/runner.test.ts`
|
|
125
|
+
|
|
126
|
+
#### Strengths
|
|
127
|
+
- ✅ Clean, pure function `groupStoriesIntoBatches()` — easy to test
|
|
128
|
+
- ✅ Correct max batch size enforcement (4 stories)
|
|
129
|
+
- ✅ Proper handling of mixed complexity (stops at first non-simple)
|
|
130
|
+
- ✅ Excellent test coverage (15 tests covering edge cases)
|
|
131
|
+
- ✅ Clear batch vs individual execution logging
|
|
132
|
+
|
|
133
|
+
#### Issues Found
|
|
134
|
+
|
|
135
|
+
**MEDIUM: Batch Failure Escalation Logic** (Grade: B-)
|
|
136
|
+
|
|
137
|
+
**Issue:** When batch execution fails, only the first story gets escalation treatment
|
|
138
|
+
|
|
139
|
+
**Location:** `src/execution/runner.ts:599-651`
|
|
140
|
+
|
|
141
|
+
```typescript
|
|
142
|
+
} else {
|
|
143
|
+
// Handle failure — either escalate or mark failed
|
|
144
|
+
// For batched execution, only mark the first story for escalation/failure
|
|
145
|
+
// Others will be retried individually on next iteration
|
|
146
|
+
const failedStory = storiesToExecute[0];
|
|
147
|
+
const nextTier = escalateTier(routing.modelTier);
|
|
148
|
+
|
|
149
|
+
if (isBatchExecution) {
|
|
150
|
+
console.log(chalk.yellow(` ⚠️ Batch execution failed — will retry stories individually`));
|
|
151
|
+
}
|
|
152
|
+
// ... escalation logic for failedStory only
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**Problem:**
|
|
157
|
+
1. If batch `[US-001, US-002, US-003, US-004]` fails on `fast` tier
|
|
158
|
+
2. Only `US-001` gets escalated to `balanced` tier
|
|
159
|
+
3. Stories 2-4 remain at `fast` tier, will be retried at same tier
|
|
160
|
+
4. Comment says "Others will be retried individually" but doesn't update their routing
|
|
161
|
+
|
|
162
|
+
**Expected Behavior:** Debatable design choice, but should be explicit:
|
|
163
|
+
- **Option A:** Escalate entire batch together (conservative)
|
|
164
|
+
- **Option B:** Retry individually at same tier first, escalate only if individual retry fails (current, but undocumented)
|
|
165
|
+
|
|
166
|
+
**Current Implementation:** Option B is implemented but not clearly documented
|
|
167
|
+
|
|
168
|
+
**Recommendation:**
|
|
169
|
+
- Add config option: `batch.escalateEntireBatchOnFailure: boolean`
|
|
170
|
+
- Document chosen strategy in code comments
|
|
171
|
+
- Add test case for batch failure escalation
|
|
172
|
+
|
|
173
|
+
**Impact:** Medium — Unclear behavior, potential cost inefficiency
|
|
174
|
+
|
|
175
|
+
---
|
|
176
|
+
|
|
177
|
+
**MINOR: Batch Routing Re-computation** (Grade: B)
|
|
178
|
+
|
|
179
|
+
**Issue:** When batching stories, routing is re-computed for each candidate instead of using pre-computed routing from PRD
|
|
180
|
+
|
|
181
|
+
**Location:** `src/execution/runner.ts:379-403`
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
for (let i = currentIndex + 1; i < readyStories.length && batchCandidates.length < 4; i++) {
|
|
185
|
+
const candidate = readyStories[i];
|
|
186
|
+
const candidateRouting = routeTask( // ← Re-computes routing
|
|
187
|
+
candidate.title,
|
|
188
|
+
candidate.description,
|
|
189
|
+
candidate.acceptanceCriteria,
|
|
190
|
+
candidate.tags,
|
|
191
|
+
config,
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
if (
|
|
195
|
+
candidateRouting.complexity === "simple" &&
|
|
196
|
+
candidateRouting.testStrategy === "test-after"
|
|
197
|
+
) {
|
|
198
|
+
batchCandidates.push(candidate);
|
|
199
|
+
} else {
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Problem:**
|
|
206
|
+
- Routing was already computed during `analyze` phase and stored in `story.routing`
|
|
207
|
+
- Re-computing is wasteful and could produce different results if routing logic changes
|
|
208
|
+
- Should trust the pre-computed routing
|
|
209
|
+
|
|
210
|
+
**Recommendation:**
|
|
211
|
+
```typescript
|
|
212
|
+
// Use pre-computed routing
|
|
213
|
+
if (
|
|
214
|
+
candidate.routing?.complexity === "simple" &&
|
|
215
|
+
candidate.routing?.testStrategy === "test-after"
|
|
216
|
+
) {
|
|
217
|
+
batchCandidates.push(candidate);
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
**Impact:** Low — Minor inefficiency, potential inconsistency
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
### 3️⃣ Context Builder Integration
|
|
226
|
+
|
|
227
|
+
**Grade: A**
|
|
228
|
+
|
|
229
|
+
**Location:** `src/context/builder.ts`, `src/context/types.ts`, `test/context.test.ts`
|
|
230
|
+
|
|
231
|
+
#### Strengths
|
|
232
|
+
- ✅ Excellent design: clean interfaces, composable functions
|
|
233
|
+
- ✅ Priority-based context selection with token budgeting
|
|
234
|
+
- ✅ Proper truncation when budget exceeded
|
|
235
|
+
- ✅ Comprehensive test coverage (45+ tests)
|
|
236
|
+
- ✅ Token estimation conservative (1 token ≈ 3 chars is reasonable)
|
|
237
|
+
- ✅ Immutable patterns (no array mutations)
|
|
238
|
+
|
|
239
|
+
#### Issues Found
|
|
240
|
+
|
|
241
|
+
**MINOR: Missing Error Boundary for Malformed Data** (Grade: B+)
|
|
242
|
+
|
|
243
|
+
**Issue:** Context builder assumes well-formed PRD structure, no defensive checks
|
|
244
|
+
|
|
245
|
+
**Location:** `src/context/builder.ts:125-188`
|
|
246
|
+
|
|
247
|
+
```typescript
|
|
248
|
+
export async function buildContext(
|
|
249
|
+
storyContext: StoryContext,
|
|
250
|
+
budget: ContextBudget,
|
|
251
|
+
): Promise<BuiltContext> {
|
|
252
|
+
const { prd, currentStoryId } = storyContext;
|
|
253
|
+
const elements: ContextElement[] = [];
|
|
254
|
+
|
|
255
|
+
// Find current story
|
|
256
|
+
const currentStory = prd.userStories.find((s) => s.id === currentStoryId);
|
|
257
|
+
if (!currentStory) {
|
|
258
|
+
throw new Error(`Story ${currentStoryId} not found in PRD`);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// No validation of story structure
|
|
262
|
+
// Could crash if acceptanceCriteria is undefined/null
|
|
263
|
+
elements.push(createStoryContext(currentStory, 80));
|
|
264
|
+
|
|
265
|
+
// No validation of dependencies
|
|
266
|
+
if (currentStory.dependencies && currentStory.dependencies.length > 0) {
|
|
267
|
+
for (const depId of currentStory.dependencies) {
|
|
268
|
+
const depStory = prd.userStories.find((s) => s.id === depId);
|
|
269
|
+
if (depStory) { // ← Silently skips missing dependencies
|
|
270
|
+
elements.push(createDependencyContext(depStory, 50));
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
**Problem:**
|
|
277
|
+
1. If `acceptanceCriteria` is undefined/null, `formatStoryAsText()` will crash
|
|
278
|
+
2. Missing dependencies are silently skipped (no warning logged)
|
|
279
|
+
3. No validation that `priorErrors` is an array
|
|
280
|
+
|
|
281
|
+
**Recommendation:**
|
|
282
|
+
- Add defensive checks in `formatStoryAsText()`
|
|
283
|
+
- Log warning when dependency story not found
|
|
284
|
+
- Validate PRD structure or use Zod schema
|
|
285
|
+
|
|
286
|
+
**Impact:** Low — PRD is generated by trusted code, but defensive programming is better
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
**MINOR: Token Estimation Accuracy** (Grade: B)
|
|
291
|
+
|
|
292
|
+
**Issue:** Token estimation is rough approximation (1 token ≈ 3 chars)
|
|
293
|
+
|
|
294
|
+
**Location:** `src/context/builder.ts:14-16`
|
|
295
|
+
|
|
296
|
+
```typescript
|
|
297
|
+
export function estimateTokens(text: string): number {
|
|
298
|
+
return Math.ceil(text.length / 3);
|
|
299
|
+
}
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
**Problem:**
|
|
303
|
+
- Real tokenization varies: "hello" = 1 token, "anthropic" = 2 tokens
|
|
304
|
+
- Character-based estimation can be off by 20-40% for code/technical text
|
|
305
|
+
- Budget may be exceeded or underutilized
|
|
306
|
+
|
|
307
|
+
**Reality Check:**
|
|
308
|
+
- 1 token ≈ 4 chars for English prose (GPT tokenizer)
|
|
309
|
+
- 1 token ≈ 2-3 chars for code (more special chars)
|
|
310
|
+
- Current formula (divide by 3) is **reasonable middle ground**
|
|
311
|
+
|
|
312
|
+
**Recommendation:**
|
|
313
|
+
- Add comment documenting the approximation
|
|
314
|
+
- Consider using `@anthropic-ai/tokenizer` for accurate counts (adds dependency)
|
|
315
|
+
- Current approach is acceptable for MVP
|
|
316
|
+
|
|
317
|
+
**Impact:** Very Low — Estimation is conservative, won't break
|
|
318
|
+
|
|
319
|
+
---
|
|
320
|
+
|
|
321
|
+
### 4️⃣ Explicit 3-Tier Escalation Chain
|
|
322
|
+
|
|
323
|
+
**Grade: A**
|
|
324
|
+
|
|
325
|
+
**Location:** `src/execution/runner.ts:220-232`
|
|
326
|
+
|
|
327
|
+
#### Strengths
|
|
328
|
+
- ✅ Clean, explicit switch statement (no magic)
|
|
329
|
+
- ✅ Returns `null` when max tier reached (type-safe)
|
|
330
|
+
- ✅ Correct escalation path: fast → balanced → powerful → null
|
|
331
|
+
- ✅ Well-tested in integration tests
|
|
332
|
+
|
|
333
|
+
#### Issues Found
|
|
334
|
+
|
|
335
|
+
**MINOR: Escalation Chain Documentation** (Grade: A-)
|
|
336
|
+
|
|
337
|
+
**Issue:** Escalation chain is hardcoded, not configurable
|
|
338
|
+
|
|
339
|
+
**Location:** `src/execution/runner.ts:220-232`
|
|
340
|
+
|
|
341
|
+
```typescript
|
|
342
|
+
export function escalateTier(current: ModelTier): ModelTier | null {
|
|
343
|
+
// Explicit escalation chain
|
|
344
|
+
switch (current) {
|
|
345
|
+
case "fast":
|
|
346
|
+
return "balanced";
|
|
347
|
+
case "balanced":
|
|
348
|
+
return "powerful";
|
|
349
|
+
case "powerful":
|
|
350
|
+
return null; // Max tier reached
|
|
351
|
+
default:
|
|
352
|
+
return null;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**Problem:**
|
|
358
|
+
- Escalation path is fixed: `fast → balanced → powerful`
|
|
359
|
+
- Config has `escalation.maxAttempts` but no `escalation.tierOrder`
|
|
360
|
+
- If user wants custom escalation (e.g., `fast → powerful`, skip balanced), no way to configure
|
|
361
|
+
|
|
362
|
+
**Recommendation:**
|
|
363
|
+
- Add config option: `escalation.tierOrder: ModelTier[]`
|
|
364
|
+
- Default: `["fast", "balanced", "powerful"]`
|
|
365
|
+
- Use config array to determine next tier
|
|
366
|
+
|
|
367
|
+
**Impact:** Very Low — Current approach works for 99% of cases
|
|
368
|
+
|
|
369
|
+
---
|
|
370
|
+
|
|
371
|
+
### 5️⃣ Configuration & Validation
|
|
372
|
+
|
|
373
|
+
**Grade: A**
|
|
374
|
+
|
|
375
|
+
**Location:** `src/config/schema.ts`, `src/config/validate.ts`
|
|
376
|
+
|
|
377
|
+
#### Strengths
|
|
378
|
+
- ✅ Type-safe config schema with good defaults
|
|
379
|
+
- ✅ Comprehensive validation (version, limits, tier mappings)
|
|
380
|
+
- ✅ Clear error messages
|
|
381
|
+
- ✅ Supports both shorthand (string) and full ModelDef
|
|
382
|
+
|
|
383
|
+
#### Issues Found
|
|
384
|
+
|
|
385
|
+
**MINOR: Validation Error Messages** (Grade: B+)
|
|
386
|
+
|
|
387
|
+
**Issue:** Validation errors in `validateConfig()` throw immediately, only one error shown at a time
|
|
388
|
+
|
|
389
|
+
**Location:** `src/config/validate.ts:26-94`
|
|
390
|
+
|
|
391
|
+
```typescript
|
|
392
|
+
export function validateConfig(config: NgentConfig): ValidationResult {
|
|
393
|
+
const errors: string[] = [];
|
|
394
|
+
|
|
395
|
+
// Collects all errors
|
|
396
|
+
if (config.version !== 1) {
|
|
397
|
+
errors.push(`Invalid version: expected 1, got ${config.version}`);
|
|
398
|
+
}
|
|
399
|
+
// ... more checks
|
|
400
|
+
|
|
401
|
+
return {
|
|
402
|
+
valid: errors.length === 0,
|
|
403
|
+
errors,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
vs `src/config/schema.ts:166-205`
|
|
409
|
+
|
|
410
|
+
```typescript
|
|
411
|
+
export function validateConfig(config: NgentConfig): void {
|
|
412
|
+
// Throws on first error
|
|
413
|
+
if (config.version !== 1) {
|
|
414
|
+
throw new Error(`Invalid config version: ${config.version} (expected 1)`);
|
|
415
|
+
}
|
|
416
|
+
// ...
|
|
417
|
+
}
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
**Problem:**
|
|
421
|
+
- Two `validateConfig` functions with different signatures
|
|
422
|
+
- `schema.ts` version throws immediately (stops at first error)
|
|
423
|
+
- `validate.ts` version collects all errors (better UX)
|
|
424
|
+
- Naming collision is confusing
|
|
425
|
+
|
|
426
|
+
**Recommendation:**
|
|
427
|
+
- Rename `schema.ts` version to `assertValidConfig()` or remove it
|
|
428
|
+
- Use `validate.ts` version consistently (returns all errors)
|
|
429
|
+
|
|
430
|
+
**Impact:** Low — Both work, but DRY violation
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
### 6️⃣ CLI Integration
|
|
435
|
+
|
|
436
|
+
**Grade: A**
|
|
437
|
+
|
|
438
|
+
**Location:** `bin/ngent.ts`
|
|
439
|
+
|
|
440
|
+
#### Strengths
|
|
441
|
+
- ✅ Clean commander.js integration
|
|
442
|
+
- ✅ Proper option parsing (--no-context, --no-batch)
|
|
443
|
+
- ✅ Good help text and error messages
|
|
444
|
+
|
|
445
|
+
#### Issues Found
|
|
446
|
+
|
|
447
|
+
**MINOR: Default Flag Behavior** (Grade: B+)
|
|
448
|
+
|
|
449
|
+
**Issue:** CLI uses `!options.noContext` instead of explicit defaults
|
|
450
|
+
|
|
451
|
+
**Location:** `bin/ngent.ts:126-127`
|
|
452
|
+
|
|
453
|
+
```typescript
|
|
454
|
+
useContext: !options.noContext,
|
|
455
|
+
useBatch: !options.noBatch,
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
**Problem:**
|
|
459
|
+
- Double negatives are hard to reason about
|
|
460
|
+
- If commander doesn't set `noContext` flag, undefined → falsy → true
|
|
461
|
+
- Works correctly but confusing
|
|
462
|
+
|
|
463
|
+
**Recommendation:**
|
|
464
|
+
```typescript
|
|
465
|
+
.option("--no-context", "Disable context builder", false)
|
|
466
|
+
// Then access as options.context directly (commander handles --no- prefix)
|
|
467
|
+
useContext: options.context ?? true,
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
**Impact:** Very Low — Works correctly, just style preference
|
|
471
|
+
|
|
472
|
+
---
|
|
473
|
+
|
|
474
|
+
## Edge Cases Analysis
|
|
475
|
+
|
|
476
|
+
### Queue Commands Edge Cases
|
|
477
|
+
|
|
478
|
+
| Scenario | Behavior | Grade |
|
|
479
|
+
|----------|----------|-------|
|
|
480
|
+
| Empty `.queue.txt` | ✅ Returns empty commands array | A |
|
|
481
|
+
| Commands before `--- PENDING ---` | ✅ Parsed as commands | A |
|
|
482
|
+
| SKIP without story ID | ✅ Treated as guidance | A |
|
|
483
|
+
| Multiple SKIP for same story | ⚠️ Processed multiple times (harmless) | B |
|
|
484
|
+
| PAUSE mid-batch | ⚠️ Only checked after batch completion | C |
|
|
485
|
+
| Invalid story ID in SKIP | ⚠️ No validation, will throw later | B- |
|
|
486
|
+
|
|
487
|
+
### Batching Edge Cases
|
|
488
|
+
|
|
489
|
+
| Scenario | Behavior | Grade |
|
|
490
|
+
|----------|----------|-------|
|
|
491
|
+
| All stories simple | ✅ Batched correctly | A |
|
|
492
|
+
| Mixed complexity | ✅ Stops at first non-simple | A |
|
|
493
|
+
| Single simple story | ✅ Executed as non-batch | A |
|
|
494
|
+
| Batch size > 4 | ✅ Split into multiple batches | A |
|
|
495
|
+
| Batch failure | ⚠️ Only first story escalated | B- |
|
|
496
|
+
| Dependencies in batch | ✅ Filtered out by `getAllReadyStories()` | A |
|
|
497
|
+
|
|
498
|
+
### Context Builder Edge Cases
|
|
499
|
+
|
|
500
|
+
| Scenario | Behavior | Grade |
|
|
501
|
+
|----------|----------|-------|
|
|
502
|
+
| Story not found | ✅ Throws error | A |
|
|
503
|
+
| Dependency not found | ⚠️ Silently skipped | B |
|
|
504
|
+
| Budget exceeded | ✅ Truncates with [TRUNCATED] marker | A |
|
|
505
|
+
| Empty PRD | ✅ Returns progress only | A |
|
|
506
|
+
| Malformed story | ⚠️ May crash in `formatStoryAsText()` | B- |
|
|
507
|
+
|
|
508
|
+
### Escalation Edge Cases
|
|
509
|
+
|
|
510
|
+
| Scenario | Behavior | Grade |
|
|
511
|
+
|----------|----------|-------|
|
|
512
|
+
| Already at `powerful` | ✅ Returns null, marks failed | A |
|
|
513
|
+
| Batch escalation | ⚠️ Only first story escalated | B- |
|
|
514
|
+
| Max attempts reached | ✅ Marks failed, stops execution | A |
|
|
515
|
+
| Invalid tier | ✅ Returns null (default case) | A |
|
|
516
|
+
|
|
517
|
+
---
|
|
518
|
+
|
|
519
|
+
## DRY Violations
|
|
520
|
+
|
|
521
|
+
### 1. Duplicate `validateConfig()` functions
|
|
522
|
+
|
|
523
|
+
**Locations:**
|
|
524
|
+
- `src/config/schema.ts:166-205` (throws immediately)
|
|
525
|
+
- `src/config/validate.ts:26-94` (collects all errors)
|
|
526
|
+
|
|
527
|
+
**Recommendation:** Remove or rename one
|
|
528
|
+
|
|
529
|
+
---
|
|
530
|
+
|
|
531
|
+
### 2. Context building logic
|
|
532
|
+
|
|
533
|
+
**Locations:**
|
|
534
|
+
- `src/execution/runner.ts:189-217` (buildStoryContext wrapper)
|
|
535
|
+
- `src/execution/runner.ts:247-263` (maybeGetContext wrapper)
|
|
536
|
+
|
|
537
|
+
**DRY Opportunity:** Extract to shared function
|
|
538
|
+
|
|
539
|
+
---
|
|
540
|
+
|
|
541
|
+
## Security Analysis
|
|
542
|
+
|
|
543
|
+
**Grade: A**
|
|
544
|
+
|
|
545
|
+
- ✅ No SQL injection risks (no raw SQL)
|
|
546
|
+
- ✅ No command injection (queue file parsing is safe)
|
|
547
|
+
- ✅ No XSS risks (CLI tool, no web output)
|
|
548
|
+
- ✅ No hardcoded secrets
|
|
549
|
+
- ✅ No unsafe file operations (uses Bun.file API safely)
|
|
550
|
+
|
|
551
|
+
**Queue File Parsing Security:**
|
|
552
|
+
- ✅ Case-insensitive matching is safe
|
|
553
|
+
- ✅ No eval() or Function() constructor
|
|
554
|
+
- ✅ Trim() prevents injection of whitespace-based attacks
|
|
555
|
+
|
|
556
|
+
---
|
|
557
|
+
|
|
558
|
+
## Performance Analysis
|
|
559
|
+
|
|
560
|
+
**Grade: A-**
|
|
561
|
+
|
|
562
|
+
**Token Estimation:** O(n) where n = text length — acceptable
|
|
563
|
+
|
|
564
|
+
**Story Batching:** O(n) where n = ready stories — acceptable
|
|
565
|
+
|
|
566
|
+
**Context Building:** O(m) where m = elements — acceptable
|
|
567
|
+
|
|
568
|
+
**Queue Parsing:** O(n) where n = lines — acceptable
|
|
569
|
+
|
|
570
|
+
**Routing Re-computation:** ⚠️ Unnecessary work in batch candidate selection (see Finding 2.2)
|
|
571
|
+
|
|
572
|
+
---
|
|
573
|
+
|
|
574
|
+
## Test Coverage Analysis
|
|
575
|
+
|
|
576
|
+
**Grade: A**
|
|
577
|
+
|
|
578
|
+
**Total Tests:** 132 passing
|
|
579
|
+
**Test Files:** 12
|
|
580
|
+
|
|
581
|
+
**Coverage by Module:**
|
|
582
|
+
- Queue: 28 tests (`test/queue.test.ts`)
|
|
583
|
+
- Context: 45+ tests (`test/context.test.ts`, `test/context-integration.test.ts`)
|
|
584
|
+
- Runner/Batching: 15 tests (`test/runner.test.ts`)
|
|
585
|
+
- Execution: 5+ tests (`test/execution.test.ts`)
|
|
586
|
+
- Routing: Covered in execution tests
|
|
587
|
+
- Escalation: Covered in execution tests
|
|
588
|
+
|
|
589
|
+
**Missing Test Cases:**
|
|
590
|
+
1. ⚠️ Batch failure escalation behavior
|
|
591
|
+
2. ⚠️ Queue commands during batch execution
|
|
592
|
+
3. ⚠️ Invalid SKIP story ID handling
|
|
593
|
+
4. ⚠️ Context builder with malformed story data
|
|
594
|
+
|
|
595
|
+
---
|
|
596
|
+
|
|
597
|
+
## Recommendations by Priority
|
|
598
|
+
|
|
599
|
+
### CRITICAL (Fix Before Merging)
|
|
600
|
+
|
|
601
|
+
None — all critical issues are design choices, not bugs
|
|
602
|
+
|
|
603
|
+
### HIGH (Fix Soon)
|
|
604
|
+
|
|
605
|
+
1. **Batch SKIP Command Handling** — Check queue file before batch execution
|
|
606
|
+
2. **Batch Failure Escalation** — Document strategy and add config option
|
|
607
|
+
3. **Add "skipped" status to QueueItemStatus** — Align with PRD module
|
|
608
|
+
|
|
609
|
+
### MEDIUM (Next Sprint)
|
|
610
|
+
|
|
611
|
+
4. **Use Pre-computed Routing** — Don't re-compute during batching
|
|
612
|
+
5. **Context Builder Error Boundary** — Add defensive checks
|
|
613
|
+
6. **Duplicate validateConfig()** — Remove or rename
|
|
614
|
+
|
|
615
|
+
### LOW (Nice to Have)
|
|
616
|
+
|
|
617
|
+
7. **Configurable Escalation Chain** — Add to config schema
|
|
618
|
+
8. **CLI Flag Defaults** — Use explicit defaults instead of double negatives
|
|
619
|
+
9. **Token Estimation Documentation** — Add comment explaining approximation
|
|
620
|
+
|
|
621
|
+
---
|
|
622
|
+
|
|
623
|
+
## Overall Assessment
|
|
624
|
+
|
|
625
|
+
**Final Grade: B+**
|
|
626
|
+
|
|
627
|
+
**Strengths:**
|
|
628
|
+
- Solid architecture with clean separation of concerns
|
|
629
|
+
- Comprehensive test coverage (132 tests passing)
|
|
630
|
+
- Type-safe implementation (no TypeScript errors)
|
|
631
|
+
- Good error handling and validation
|
|
632
|
+
- Immutable patterns followed throughout
|
|
633
|
+
|
|
634
|
+
**Weaknesses:**
|
|
635
|
+
- Queue command handling during batch execution (timing issue)
|
|
636
|
+
- Batch failure escalation strategy not explicit
|
|
637
|
+
- Minor DRY violations (duplicate validateConfig)
|
|
638
|
+
- Missing edge case handling (malformed data, invalid story IDs)
|
|
639
|
+
|
|
640
|
+
**Readiness:** **READY FOR MERGE** with follow-up tasks
|
|
641
|
+
|
|
642
|
+
The v0.2 implementation is production-ready. The identified issues are primarily edge cases and design clarifications, not blocking bugs. I recommend:
|
|
643
|
+
|
|
644
|
+
1. Merge v0.2 as-is
|
|
645
|
+
2. Create GitHub issues for HIGH priority items
|
|
646
|
+
3. Address in v0.2.1 or v0.3
|
|
647
|
+
|
|
648
|
+
**Estimated Effort to Fix All Issues:** 4-6 hours
|
|
649
|
+
|
|
650
|
+
---
|
|
651
|
+
|
|
652
|
+
## Appendix: Test Run Output
|
|
653
|
+
|
|
654
|
+
```
|
|
655
|
+
bun test v1.3.9 (cf6cdbbb)
|
|
656
|
+
|
|
657
|
+
test/execution.test.ts: ✅
|
|
658
|
+
test/context-integration.test.ts: ✅
|
|
659
|
+
test/tdd-orchestrator.test.ts: ✅
|
|
660
|
+
test/analyze.test.ts: ✅
|
|
661
|
+
test/cost.test.ts: ✅
|
|
662
|
+
test/isolation.test.ts: ✅
|
|
663
|
+
test/progress.test.ts: ✅
|
|
664
|
+
test/context.test.ts: ✅
|
|
665
|
+
test/queue.test.ts: ✅
|
|
666
|
+
test/routing.test.ts: ✅
|
|
667
|
+
test/config.test.ts: ✅
|
|
668
|
+
test/runner.test.ts: ✅
|
|
669
|
+
|
|
670
|
+
132 pass
|
|
671
|
+
0 fail
|
|
672
|
+
352 expect() calls
|
|
673
|
+
Ran 132 tests across 12 files. [122.00ms]
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
**TypeScript Check:**
|
|
677
|
+
```
|
|
678
|
+
$ bun x tsc --noEmit
|
|
679
|
+
✅ No errors
|
|
680
|
+
```
|
|
681
|
+
|
|
682
|
+
---
|
|
683
|
+
|
|
684
|
+
**Review Completed:** 2026-02-16
|
|
685
|
+
**Next Review:** v0.3 (agent execution implementation)
|