@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,475 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt builder tests
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, expect, test } from "bun:test";
|
|
6
|
+
import type { ConstitutionResult } from "../../src/constitution";
|
|
7
|
+
import { buildBatchPrompt, buildSingleSessionPrompt } from "../../src/execution/prompts";
|
|
8
|
+
import type { UserStory } from "../../src/prd";
|
|
9
|
+
import { buildVerifierPrompt } from "../../src/tdd/prompts";
|
|
10
|
+
|
|
11
|
+
const mockStory: UserStory = {
|
|
12
|
+
id: "US-001",
|
|
13
|
+
title: "Add login endpoint",
|
|
14
|
+
description: "Implement POST /api/login endpoint",
|
|
15
|
+
acceptanceCriteria: [
|
|
16
|
+
"Accepts username and password",
|
|
17
|
+
"Returns JWT token on success",
|
|
18
|
+
"Returns 401 on invalid credentials",
|
|
19
|
+
],
|
|
20
|
+
tags: [],
|
|
21
|
+
dependencies: [],
|
|
22
|
+
status: "pending",
|
|
23
|
+
passes: false,
|
|
24
|
+
escalations: [],
|
|
25
|
+
attempts: 0,
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const mockConstitution: ConstitutionResult = {
|
|
29
|
+
content: "# Constitution\n\n- Use TypeScript\n- Write tests\n- No console.log",
|
|
30
|
+
tokens: 15,
|
|
31
|
+
truncated: false,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
describe("buildSingleSessionPrompt", () => {
|
|
35
|
+
test("builds basic prompt without context or constitution", () => {
|
|
36
|
+
const prompt = buildSingleSessionPrompt(mockStory);
|
|
37
|
+
|
|
38
|
+
expect(prompt).toContain("# Task: Add login endpoint");
|
|
39
|
+
expect(prompt).toContain("Implement POST /api/login endpoint");
|
|
40
|
+
expect(prompt).toContain("Accepts username and password");
|
|
41
|
+
expect(prompt).toContain("Returns JWT token on success");
|
|
42
|
+
expect(prompt).toContain("test-after approach");
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("includes context when provided", () => {
|
|
46
|
+
const context = "## Relevant Files\n\n- src/auth.ts\n- src/jwt.ts";
|
|
47
|
+
const prompt = buildSingleSessionPrompt(mockStory, context);
|
|
48
|
+
|
|
49
|
+
expect(prompt).toContain("# Task: Add login endpoint");
|
|
50
|
+
expect(prompt).toContain("## Relevant Files");
|
|
51
|
+
expect(prompt).toContain("src/auth.ts");
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("includes constitution when provided", () => {
|
|
55
|
+
const prompt = buildSingleSessionPrompt(mockStory, undefined, mockConstitution);
|
|
56
|
+
|
|
57
|
+
expect(prompt).toContain("# CONSTITUTION (follow these rules strictly)");
|
|
58
|
+
expect(prompt).toContain("Use TypeScript");
|
|
59
|
+
expect(prompt).toContain("Write tests");
|
|
60
|
+
expect(prompt).toContain("No console.log");
|
|
61
|
+
expect(prompt).toContain("# Task: Add login endpoint");
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
test("includes both constitution and context", () => {
|
|
65
|
+
const context = "## Relevant Files\n\n- src/auth.ts";
|
|
66
|
+
const prompt = buildSingleSessionPrompt(mockStory, context, mockConstitution);
|
|
67
|
+
|
|
68
|
+
expect(prompt).toContain("# CONSTITUTION");
|
|
69
|
+
expect(prompt).toContain("# Task: Add login endpoint");
|
|
70
|
+
expect(prompt).toContain("## Relevant Files");
|
|
71
|
+
|
|
72
|
+
// Constitution should come before context
|
|
73
|
+
const constitutionPos = prompt.indexOf("# CONSTITUTION");
|
|
74
|
+
const contextPos = prompt.indexOf("## Relevant Files");
|
|
75
|
+
expect(constitutionPos).toBeLessThan(contextPos);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("uses separator between sections", () => {
|
|
79
|
+
const context = "## Context";
|
|
80
|
+
const prompt = buildSingleSessionPrompt(mockStory, context, mockConstitution);
|
|
81
|
+
|
|
82
|
+
expect(prompt).toContain("---");
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
describe("buildBatchPrompt", () => {
|
|
87
|
+
const mockStories: UserStory[] = [
|
|
88
|
+
{
|
|
89
|
+
id: "US-001",
|
|
90
|
+
title: "Add login endpoint",
|
|
91
|
+
description: "Implement POST /api/login",
|
|
92
|
+
acceptanceCriteria: ["Returns JWT token"],
|
|
93
|
+
tags: [],
|
|
94
|
+
dependencies: [],
|
|
95
|
+
status: "pending",
|
|
96
|
+
passes: false,
|
|
97
|
+
escalations: [],
|
|
98
|
+
attempts: 0,
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: "US-002",
|
|
102
|
+
title: "Add logout endpoint",
|
|
103
|
+
description: "Implement POST /api/logout",
|
|
104
|
+
acceptanceCriteria: ["Invalidates JWT token"],
|
|
105
|
+
tags: [],
|
|
106
|
+
dependencies: [],
|
|
107
|
+
status: "pending",
|
|
108
|
+
passes: false,
|
|
109
|
+
escalations: [],
|
|
110
|
+
attempts: 0,
|
|
111
|
+
},
|
|
112
|
+
];
|
|
113
|
+
|
|
114
|
+
test("builds batch prompt for multiple stories", () => {
|
|
115
|
+
const prompt = buildBatchPrompt(mockStories);
|
|
116
|
+
|
|
117
|
+
expect(prompt).toContain("# Batch Task: 2 Stories");
|
|
118
|
+
expect(prompt).toContain("Story 1: US-001 — Add login endpoint");
|
|
119
|
+
expect(prompt).toContain("Story 2: US-002 — Add logout endpoint");
|
|
120
|
+
expect(prompt).toContain("Implement POST /api/login");
|
|
121
|
+
expect(prompt).toContain("Implement POST /api/logout");
|
|
122
|
+
expect(prompt).toContain("Commit each story separately");
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
test("includes context when provided", () => {
|
|
126
|
+
const context = "## Auth Module\n\nUse JWT lib";
|
|
127
|
+
const prompt = buildBatchPrompt(mockStories, context);
|
|
128
|
+
|
|
129
|
+
expect(prompt).toContain("# Batch Task: 2 Stories");
|
|
130
|
+
expect(prompt).toContain("## Auth Module");
|
|
131
|
+
expect(prompt).toContain("Use JWT lib");
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
test("includes constitution when provided", () => {
|
|
135
|
+
const prompt = buildBatchPrompt(mockStories, undefined, mockConstitution);
|
|
136
|
+
|
|
137
|
+
expect(prompt).toContain("# CONSTITUTION (follow these rules strictly)");
|
|
138
|
+
expect(prompt).toContain("Use TypeScript");
|
|
139
|
+
expect(prompt).toContain("# Batch Task: 2 Stories");
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test("includes both constitution and context", () => {
|
|
143
|
+
const context = "## Context";
|
|
144
|
+
const prompt = buildBatchPrompt(mockStories, context, mockConstitution);
|
|
145
|
+
|
|
146
|
+
expect(prompt).toContain("# CONSTITUTION");
|
|
147
|
+
expect(prompt).toContain("# Batch Task");
|
|
148
|
+
expect(prompt).toContain("## Context");
|
|
149
|
+
|
|
150
|
+
// Constitution should come before context
|
|
151
|
+
const constitutionPos = prompt.indexOf("# CONSTITUTION");
|
|
152
|
+
const contextPos = prompt.indexOf("## Context");
|
|
153
|
+
expect(constitutionPos).toBeLessThan(contextPos);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
test("lists all acceptance criteria for each story", () => {
|
|
157
|
+
const prompt = buildBatchPrompt(mockStories);
|
|
158
|
+
|
|
159
|
+
expect(prompt).toContain("Returns JWT token");
|
|
160
|
+
expect(prompt).toContain("Invalidates JWT token");
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
describe("ASSET_CHECK Error Formatting (BUG-18) - Context Integration", () => {
|
|
165
|
+
test("context markdown with ASSET_CHECK errors should be included in prompt", () => {
|
|
166
|
+
const story: UserStory = {
|
|
167
|
+
id: "US-001",
|
|
168
|
+
title: "Add finder module",
|
|
169
|
+
description: "Implement finder functionality",
|
|
170
|
+
acceptanceCriteria: ["Finder works", "Tests pass"],
|
|
171
|
+
tags: [],
|
|
172
|
+
dependencies: [],
|
|
173
|
+
status: "pending",
|
|
174
|
+
passes: false,
|
|
175
|
+
escalations: [],
|
|
176
|
+
attempts: 3,
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
// Simulate context markdown with ASSET_CHECK formatting (from context builder)
|
|
180
|
+
const contextMarkdown = `## ⚠️ MANDATORY: Missing Files from Previous Attempts
|
|
181
|
+
|
|
182
|
+
**CRITICAL:** Previous attempts failed because these files were not created.
|
|
183
|
+
You MUST create these exact files. Do NOT use alternative filenames.
|
|
184
|
+
|
|
185
|
+
**Required files:**
|
|
186
|
+
- \`src/finder.ts\`
|
|
187
|
+
- \`test/finder.test.ts\``;
|
|
188
|
+
|
|
189
|
+
const prompt = buildSingleSessionPrompt(story, contextMarkdown);
|
|
190
|
+
|
|
191
|
+
// Should contain mandatory file creation instructions from context
|
|
192
|
+
expect(prompt).toContain("MANDATORY");
|
|
193
|
+
expect(prompt).toContain("MUST create these exact files");
|
|
194
|
+
expect(prompt).toContain("src/finder.ts");
|
|
195
|
+
expect(prompt).toContain("test/finder.test.ts");
|
|
196
|
+
expect(prompt).toContain("Do NOT use alternative filenames");
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
test("ASSET_CHECK context should appear BEFORE story description in final prompt", () => {
|
|
200
|
+
const story: UserStory = {
|
|
201
|
+
id: "US-001",
|
|
202
|
+
title: "Add finder module",
|
|
203
|
+
description: "Implement finder functionality",
|
|
204
|
+
acceptanceCriteria: ["Finder works"],
|
|
205
|
+
tags: [],
|
|
206
|
+
dependencies: [],
|
|
207
|
+
status: "pending",
|
|
208
|
+
passes: false,
|
|
209
|
+
escalations: [],
|
|
210
|
+
attempts: 2,
|
|
211
|
+
};
|
|
212
|
+
|
|
213
|
+
const contextMarkdown = `## ⚠️ MANDATORY: Missing Files from Previous Attempts
|
|
214
|
+
|
|
215
|
+
**Required files:**
|
|
216
|
+
- \`src/finder.ts\``;
|
|
217
|
+
|
|
218
|
+
const prompt = buildSingleSessionPrompt(story, contextMarkdown);
|
|
219
|
+
|
|
220
|
+
const mandatoryPos = prompt.indexOf("MANDATORY");
|
|
221
|
+
const descriptionPos = prompt.indexOf("Implement finder functionality");
|
|
222
|
+
|
|
223
|
+
expect(mandatoryPos).toBeGreaterThan(0);
|
|
224
|
+
expect(descriptionPos).toBeGreaterThan(0);
|
|
225
|
+
// Context comes after task in the prompt builder
|
|
226
|
+
expect(descriptionPos).toBeLessThan(mandatoryPos);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
test("context with normal prior errors should not have MANDATORY formatting", () => {
|
|
230
|
+
const story: UserStory = {
|
|
231
|
+
id: "US-001",
|
|
232
|
+
title: "Add feature",
|
|
233
|
+
description: "Add new feature",
|
|
234
|
+
acceptanceCriteria: ["Feature works"],
|
|
235
|
+
tags: [],
|
|
236
|
+
dependencies: [],
|
|
237
|
+
status: "pending",
|
|
238
|
+
passes: false,
|
|
239
|
+
escalations: [],
|
|
240
|
+
attempts: 1,
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
const contextMarkdown = `## Prior Errors
|
|
244
|
+
|
|
245
|
+
\`\`\`
|
|
246
|
+
TypeError: Cannot read property 'foo' of undefined
|
|
247
|
+
Test failed: expected 42, got 41
|
|
248
|
+
\`\`\``;
|
|
249
|
+
|
|
250
|
+
const prompt = buildSingleSessionPrompt(story, contextMarkdown);
|
|
251
|
+
|
|
252
|
+
// Should contain normal error formatting
|
|
253
|
+
expect(prompt).toContain("Prior Errors");
|
|
254
|
+
expect(prompt).toContain("TypeError: Cannot read property 'foo' of undefined");
|
|
255
|
+
|
|
256
|
+
// Should NOT contain mandatory file creation instructions
|
|
257
|
+
expect(prompt).not.toContain("MANDATORY");
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
test("context with mixed ASSET_CHECK and normal errors", () => {
|
|
261
|
+
const story: UserStory = {
|
|
262
|
+
id: "US-001",
|
|
263
|
+
title: "Add module",
|
|
264
|
+
description: "Add new module",
|
|
265
|
+
acceptanceCriteria: ["Module works"],
|
|
266
|
+
tags: [],
|
|
267
|
+
dependencies: [],
|
|
268
|
+
status: "pending",
|
|
269
|
+
passes: false,
|
|
270
|
+
escalations: [],
|
|
271
|
+
attempts: 2,
|
|
272
|
+
};
|
|
273
|
+
|
|
274
|
+
const contextMarkdown = `## ⚠️ MANDATORY: Missing Files from Previous Attempts
|
|
275
|
+
|
|
276
|
+
**Required files:**
|
|
277
|
+
- \`src/module.ts\`
|
|
278
|
+
- \`test/module.test.ts\`
|
|
279
|
+
|
|
280
|
+
## Prior Errors
|
|
281
|
+
|
|
282
|
+
\`\`\`
|
|
283
|
+
TypeError: Module not found
|
|
284
|
+
Test failed: module.foo is not a function
|
|
285
|
+
\`\`\``;
|
|
286
|
+
|
|
287
|
+
const prompt = buildSingleSessionPrompt(story, contextMarkdown);
|
|
288
|
+
|
|
289
|
+
// Should contain both ASSET_CHECK and normal errors
|
|
290
|
+
expect(prompt).toContain("MANDATORY");
|
|
291
|
+
expect(prompt).toContain("src/module.ts");
|
|
292
|
+
expect(prompt).toContain("test/module.test.ts");
|
|
293
|
+
expect(prompt).toContain("Prior Errors");
|
|
294
|
+
expect(prompt).toContain("TypeError: Module not found");
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
test("story without context should not include error sections", () => {
|
|
298
|
+
const story: UserStory = {
|
|
299
|
+
id: "US-001",
|
|
300
|
+
title: "Add feature",
|
|
301
|
+
description: "Add new feature",
|
|
302
|
+
acceptanceCriteria: ["Feature works"],
|
|
303
|
+
tags: [],
|
|
304
|
+
dependencies: [],
|
|
305
|
+
status: "pending",
|
|
306
|
+
passes: false,
|
|
307
|
+
escalations: [],
|
|
308
|
+
attempts: 0,
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
const prompt = buildSingleSessionPrompt(story);
|
|
312
|
+
|
|
313
|
+
expect(prompt).not.toContain("MANDATORY");
|
|
314
|
+
expect(prompt).not.toContain("Prior Errors");
|
|
315
|
+
expect(prompt).not.toContain("ASSET_CHECK");
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
test("batch prompt with ASSET_CHECK context", () => {
|
|
319
|
+
const stories: UserStory[] = [
|
|
320
|
+
{
|
|
321
|
+
id: "US-001",
|
|
322
|
+
title: "Story 1",
|
|
323
|
+
description: "First story",
|
|
324
|
+
acceptanceCriteria: ["AC1"],
|
|
325
|
+
tags: [],
|
|
326
|
+
dependencies: [],
|
|
327
|
+
status: "pending",
|
|
328
|
+
passes: false,
|
|
329
|
+
escalations: [],
|
|
330
|
+
attempts: 1,
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
id: "US-002",
|
|
334
|
+
title: "Story 2",
|
|
335
|
+
description: "Second story",
|
|
336
|
+
acceptanceCriteria: ["AC2"],
|
|
337
|
+
tags: [],
|
|
338
|
+
dependencies: [],
|
|
339
|
+
status: "pending",
|
|
340
|
+
passes: false,
|
|
341
|
+
escalations: [],
|
|
342
|
+
attempts: 0,
|
|
343
|
+
},
|
|
344
|
+
];
|
|
345
|
+
|
|
346
|
+
const contextMarkdown = `## ⚠️ MANDATORY: Missing Files from Previous Attempts
|
|
347
|
+
|
|
348
|
+
**Required files:**
|
|
349
|
+
- \`src/story1.ts\``;
|
|
350
|
+
|
|
351
|
+
const prompt = buildBatchPrompt(stories, contextMarkdown);
|
|
352
|
+
|
|
353
|
+
// Should contain ASSET_CHECK instructions
|
|
354
|
+
expect(prompt).toContain("MANDATORY");
|
|
355
|
+
expect(prompt).toContain("src/story1.ts");
|
|
356
|
+
|
|
357
|
+
// Should still contain both stories
|
|
358
|
+
expect(prompt).toContain("Story 1: US-001");
|
|
359
|
+
expect(prompt).toContain("Story 2: US-002");
|
|
360
|
+
});
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
describe("buildVerifierPrompt", () => {
|
|
364
|
+
const verifierStory: UserStory = {
|
|
365
|
+
id: "US-003",
|
|
366
|
+
title: "Add payment processing",
|
|
367
|
+
description: "Implement Stripe payment integration",
|
|
368
|
+
acceptanceCriteria: [
|
|
369
|
+
"Accepts credit card payments",
|
|
370
|
+
"Returns payment confirmation",
|
|
371
|
+
"Handles payment failures gracefully",
|
|
372
|
+
],
|
|
373
|
+
tags: [],
|
|
374
|
+
dependencies: [],
|
|
375
|
+
status: "pending",
|
|
376
|
+
passes: false,
|
|
377
|
+
escalations: [],
|
|
378
|
+
attempts: 0,
|
|
379
|
+
};
|
|
380
|
+
|
|
381
|
+
test("includes session 3 header", () => {
|
|
382
|
+
const prompt = buildVerifierPrompt(verifierStory);
|
|
383
|
+
expect(prompt).toContain("Session 3: Verify");
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
test("includes story title", () => {
|
|
387
|
+
const prompt = buildVerifierPrompt(verifierStory);
|
|
388
|
+
expect(prompt).toContain("Add payment processing");
|
|
389
|
+
});
|
|
390
|
+
|
|
391
|
+
test("includes all 5 tasks", () => {
|
|
392
|
+
const prompt = buildVerifierPrompt(verifierStory);
|
|
393
|
+
expect(prompt).toContain("1. Run all tests and verify they pass");
|
|
394
|
+
expect(prompt).toContain("2. Review the implementation for quality and correctness");
|
|
395
|
+
expect(prompt).toContain("3. Check that the implementation meets all acceptance criteria");
|
|
396
|
+
expect(prompt).toContain("4. Check if test files were modified by the implementer");
|
|
397
|
+
expect(prompt).toContain("5. If any issues exist, fix them minimally");
|
|
398
|
+
});
|
|
399
|
+
|
|
400
|
+
test("includes acceptance criteria", () => {
|
|
401
|
+
const prompt = buildVerifierPrompt(verifierStory);
|
|
402
|
+
expect(prompt).toContain("1. Accepts credit card payments");
|
|
403
|
+
expect(prompt).toContain("2. Returns payment confirmation");
|
|
404
|
+
expect(prompt).toContain("3. Handles payment failures gracefully");
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
test("includes verdict file instructions", () => {
|
|
408
|
+
const prompt = buildVerifierPrompt(verifierStory);
|
|
409
|
+
expect(prompt).toContain(".nax-verifier-verdict.json");
|
|
410
|
+
expect(prompt).toContain("IMPORTANT — Write Verdict File");
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
test("includes full JSON schema example", () => {
|
|
414
|
+
const prompt = buildVerifierPrompt(verifierStory);
|
|
415
|
+
expect(prompt).toContain('"version": 1');
|
|
416
|
+
expect(prompt).toContain('"approved": true');
|
|
417
|
+
expect(prompt).toContain('"tests"');
|
|
418
|
+
expect(prompt).toContain('"allPassing"');
|
|
419
|
+
expect(prompt).toContain('"passCount"');
|
|
420
|
+
expect(prompt).toContain('"failCount"');
|
|
421
|
+
expect(prompt).toContain('"testModifications"');
|
|
422
|
+
expect(prompt).toContain('"detected"');
|
|
423
|
+
expect(prompt).toContain('"legitimate"');
|
|
424
|
+
expect(prompt).toContain('"reasoning"');
|
|
425
|
+
expect(prompt).toContain('"acceptanceCriteria"');
|
|
426
|
+
expect(prompt).toContain('"allMet"');
|
|
427
|
+
expect(prompt).toContain('"criteria"');
|
|
428
|
+
expect(prompt).toContain('"quality"');
|
|
429
|
+
expect(prompt).toContain('"rating"');
|
|
430
|
+
expect(prompt).toContain('"issues"');
|
|
431
|
+
expect(prompt).toContain('"fixes"');
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
test("specifies when to set approved=false", () => {
|
|
435
|
+
const prompt = buildVerifierPrompt(verifierStory);
|
|
436
|
+
expect(prompt).toContain("approved: false");
|
|
437
|
+
expect(prompt).toContain("Tests are failing and you cannot fix them");
|
|
438
|
+
expect(prompt).toContain("loosened test assertions to mask bugs");
|
|
439
|
+
expect(prompt).toContain("Critical acceptance criteria are not met");
|
|
440
|
+
expect(prompt).toContain("Code quality is poor");
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
test("specifies when to set approved=true", () => {
|
|
444
|
+
const prompt = buildVerifierPrompt(verifierStory);
|
|
445
|
+
expect(prompt).toContain("approved: true");
|
|
446
|
+
expect(prompt).toContain("All tests pass");
|
|
447
|
+
expect(prompt).toContain("Implementation is clean and follows conventions");
|
|
448
|
+
expect(prompt).toContain("All acceptance criteria met");
|
|
449
|
+
expect(prompt).toContain("Any test modifications by implementer are legitimate fixes");
|
|
450
|
+
});
|
|
451
|
+
|
|
452
|
+
test("includes commit message instruction with story title", () => {
|
|
453
|
+
const prompt = buildVerifierPrompt(verifierStory);
|
|
454
|
+
expect(prompt).toContain("fix: verify and adjust Add payment processing");
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
test("existing prompt content preserved — tasks 1-5 all present", () => {
|
|
458
|
+
const prompt = buildVerifierPrompt(verifierStory);
|
|
459
|
+
// Task 1
|
|
460
|
+
expect(prompt).toContain("Run all tests and verify they pass");
|
|
461
|
+
// Task 2
|
|
462
|
+
expect(prompt).toContain("Review the implementation for quality and correctness");
|
|
463
|
+
// Task 3
|
|
464
|
+
expect(prompt).toContain("Check that the implementation meets all acceptance criteria");
|
|
465
|
+
// Task 4
|
|
466
|
+
expect(prompt).toContain("NOT just loosening assertions to mask bugs");
|
|
467
|
+
// Task 5
|
|
468
|
+
expect(prompt).toContain("fix them minimally");
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
test("includes write location instruction for verdict file", () => {
|
|
472
|
+
const prompt = buildVerifierPrompt(verifierStory);
|
|
473
|
+
expect(prompt).toContain("project root");
|
|
474
|
+
});
|
|
475
|
+
});
|