@nathapp/nax 0.28.0 → 0.30.0
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/CHANGELOG.md +23 -2
- package/bin/nax.ts +2 -3
- package/dist/nax.js +72753 -0
- package/package.json +11 -3
- package/src/cli/analyze.ts +2 -7
- package/src/cli/config.ts +3 -1
- package/src/config/defaults.ts +1 -0
- package/src/config/schemas.ts +1 -0
- package/src/config/types.ts +1 -0
- package/src/context/builder.ts +10 -1
- package/src/execution/lifecycle/headless-formatter.ts +2 -4
- package/src/prompts/builder.ts +12 -69
- package/src/prompts/sections/isolation.ts +38 -8
- package/src/prompts/sections/role-task.ts +79 -17
- package/src/review/runner.ts +6 -1
- package/src/version.ts +2 -1
- package/.claude/rules/01-project-conventions.md +0 -34
- package/.claude/rules/02-test-architecture.md +0 -39
- package/.claude/rules/03-test-writing.md +0 -58
- package/.claude/rules/04-forbidden-patterns.md +0 -29
- package/.claude/settings.json +0 -15
- package/.githooks/pre-commit +0 -16
- package/.gitlab-ci.yml +0 -103
- package/.mcp.json +0 -8
- package/BRIEF.md +0 -140
- package/CLAUDE.md +0 -143
- package/US-007-IMPLEMENTATION.md +0 -139
- package/biome.json +0 -14
- package/bun.lock +0 -163
- package/bunfig.toml +0 -12
- package/docker-compose.test.yml +0 -15
- package/docs/20260216-fix-plan-context-review.md +0 -56
- package/docs/20260216-relentless-vs-ngent-comparison.md +0 -208
- package/docs/20260216-v02-plan.md +0 -136
- package/docs/20260216-v02-review.md +0 -685
- package/docs/20260217-dogfood-findings.md +0 -56
- package/docs/20260217-p2-plus-plan.md +0 -117
- package/docs/20260217-partial-fixes-plan.md +0 -62
- package/docs/20260217-plan-analyze-spec.md +0 -117
- package/docs/20260217-post-impl-review.md +0 -1137
- package/docs/20260217-quick-wins-plan.md +0 -66
- package/docs/20260217-split-runner-plan.md +0 -75
- package/docs/20260217-v03-impl-plan.md +0 -80
- package/docs/20260217-v03-post-impl-review.md +0 -589
- package/docs/20260217-v04-impl-plan.md +0 -86
- package/docs/20260217-v05-post-impl-review.md +0 -850
- package/docs/20260217-v06-post-impl-review.md +0 -817
- package/docs/20260218-adr003-port-plan.md +0 -151
- package/docs/20260218-review-adr003-verification.md +0 -175
- package/docs/20260219-fix-plan-bug16-19.md +0 -79
- package/docs/20260219-fix-plan-bug20-22.md +0 -114
- package/docs/20260219-plan-llm-routing.md +0 -116
- package/docs/20260219-review-bug20-22-fixes.md +0 -135
- package/docs/20260219-routing-baseline-keyword.md +0 -63
- package/docs/20260220-plan-structured-logging-p1.md +0 -80
- package/docs/20260220-plan-structured-logging-p2.md +0 -37
- package/docs/20260220-review-llm-routing.md +0 -180
- package/docs/20260220-review-post-fix-llm-routing.md +0 -70
- package/docs/20260221-fix-plan-relevantfiles-split.md +0 -101
- package/docs/20260221-fix-plan-routing-mode.md +0 -125
- package/docs/20260221-review-v0.9-implementation.md +0 -379
- package/docs/20260222-fix-plan-v091-routing-isolation.md +0 -197
- package/docs/20260223-fix-plan-prompt-audit.md +0 -62
- package/docs/20260224-nax-roadmap-phases.md +0 -189
- package/docs/20260225-phase2-llm-service-layer.md +0 -401
- package/docs/20260225-review-v0.10.1.md +0 -187
- package/docs/20260303-v010-implementation-plan.md +0 -165
- package/docs/20260304-review-nax.md +0 -492
- package/docs/CLAUDE.md.bak +0 -191
- package/docs/ROADMAP.md +0 -390
- package/docs/SPEC-rectification.md +0 -0
- package/docs/SPEC.md +0 -324
- package/docs/US-001-plugin-loading-verification.md +0 -152
- package/docs/adr/ADR-005-implementation-plan.md +0 -655
- package/docs/adr/ADR-005-pipeline-re-architecture.md +0 -464
- package/docs/architecture-analysis.md +0 -1076
- package/docs/bugs/BUG-21-escalation-null-attempts.md +0 -48
- package/docs/bugs-from-dogfood-run-c.md +0 -243
- package/docs/code-review-20260228.md +0 -612
- package/docs/code-review-v0.15.0.md +0 -629
- package/docs/hook-lifecycle-test-plan.md +0 -149
- package/docs/releases/v0.11.0-and-earlier.md +0 -20
- package/docs/releases/v0.12.0.md +0 -15
- package/docs/releases/v0.13.0.md +0 -14
- package/docs/releases/v0.14.0.md +0 -20
- package/docs/releases/v0.14.1.md +0 -36
- package/docs/releases/v0.14.2.md +0 -51
- package/docs/releases/v0.14.3.md +0 -174
- package/docs/releases/v0.14.4.md +0 -94
- package/docs/releases/v0.15.0.md +0 -502
- package/docs/releases/v0.15.1.md +0 -170
- package/docs/releases/v0.15.3.md +0 -193
- package/docs/specs/bug-039-orphan-processes.md +0 -131
- package/docs/specs/bug-040-review-rectification.md +0 -82
- package/docs/specs/bug-041-cross-story-test-isolation.md +0 -88
- package/docs/specs/bug-042-verifier-failure-capture.md +0 -117
- package/docs/specs/bun-pty-migration.md +0 -171
- package/docs/specs/central-run-registry.md +0 -116
- package/docs/specs/feat-010-smart-runner-git-history.md +0 -96
- package/docs/specs/feat-011-file-context-strategy.md +0 -73
- package/docs/specs/feat-012-tdd-writer-tier.md +0 -79
- package/docs/specs/feat-013-test-after-review.md +0 -89
- package/docs/specs/feat-014-heartbeat-observability.md +0 -127
- package/docs/specs/status-file-consolidation.md +0 -93
- package/docs/specs/status-file-v0.10.1.md +0 -812
- package/docs/specs/trigger-completion.md +0 -145
- package/docs/specs/verification-architecture-v2.md +0 -343
- package/docs/tdd/strategies.md +0 -97
- package/docs/v0.10-global-config.md +0 -206
- package/docs/v0.10-plugin-system.md +0 -415
- package/docs/v0.10-prompt-optimizer.md +0 -234
- package/docs/v0.3-spec.md +0 -244
- package/docs/v0.4-spec.md +0 -140
- package/docs/v0.5-spec.md +0 -237
- package/docs/v0.6-spec.md +0 -371
- package/docs/v0.7-spec.md +0 -177
- package/docs/v0.8-llm-routing.md +0 -206
- package/docs/v0.8-structured-logging.md +0 -132
- package/docs/v0.9.3-prompt-audit.md +0 -112
- package/examples/plugins/console-reporter/index.test.ts +0 -207
- package/examples/plugins/console-reporter/index.ts +0 -110
- package/memory/topic/feat-010-baseref.md +0 -28
- package/memory/topic/feat-013-test-after-deprecation.md +0 -22
- package/nax/config.json +0 -154
- package/nax/features/bug-039-medium/prd.json +0 -45
- package/nax/features/bugfix-v0171/prd.json +0 -52
- package/nax/features/central-run-registry/prd.json +0 -105
- package/nax/features/config-management/prd.json +0 -108
- package/nax/features/config-management/progress.txt +0 -5
- package/nax/features/diagnose/acceptance.test.ts +0 -414
- package/nax/features/diagnose/prd.json +0 -41
- package/nax/features/nax-compliance/prd.json +0 -52
- package/nax/features/nax-compliance/progress.txt +0 -1
- package/nax/features/orchestration-fixes/prd.json +0 -89
- package/nax/features/orchestration-fixes/progress.txt +0 -1
- package/nax/features/plugin-integration/US-007-VERIFICATION.md +0 -259
- package/nax/features/plugin-integration/prd.json +0 -208
- package/nax/features/plugin-integration/progress.txt +0 -5
- package/nax/features/post-rearch-bugfix/prd.json +0 -137
- package/nax/features/precheck/prd.json +0 -205
- package/nax/features/precheck/progress.txt +0 -15
- package/nax/features/prompt-builder/prd.json +0 -152
- package/nax/features/prompt-builder/progress.txt +0 -3
- package/nax/features/review-quality/prd.json +0 -55
- package/nax/features/routing-persistence/prd.json +0 -104
- package/nax/features/routing-persistence/progress.txt +0 -1
- package/nax/features/smart-test-runner/plan.md +0 -7
- package/nax/features/smart-test-runner/prd.json +0 -203
- package/nax/features/smart-test-runner/progress.txt +0 -13
- package/nax/features/smart-test-runner/spec.md +0 -7
- package/nax/features/smart-test-runner/tasks.md +0 -8
- package/nax/features/status-file-consolidation/prd.json +0 -106
- package/nax/features/structured-logging/prd.json +0 -199
- package/nax/features/trigger-completion/prd.json +0 -150
- package/nax/features/trigger-completion/progress.txt +0 -7
- package/nax/features/unlock/prd.json +0 -36
- package/nax/features/v0.18.3-execution-reliability/prd.json +0 -80
- package/nax/features/v0.18.3-execution-reliability/progress.txt +0 -3
- package/nax/features/v0.19.0-hardening/plan.md +0 -7
- package/nax/features/v0.19.0-hardening/prd.json +0 -84
- package/nax/features/v0.19.0-hardening/progress.txt +0 -7
- package/nax/features/v0.19.0-hardening/spec.md +0 -18
- package/nax/features/v0.19.0-hardening/tasks.md +0 -8
- package/nax/features/verify-v2/prd.json +0 -79
- package/nax/features/verify-v2/progress.txt +0 -3
- package/nax/status.json +0 -36
- package/src/prompts/templates/implementer.ts +0 -6
- package/src/prompts/templates/single-session.ts +0 -6
- package/src/prompts/templates/test-writer.ts +0 -6
- package/src/prompts/templates/verifier.ts +0 -6
- package/test/COVERAGE-GAPS.md +0 -333
- package/test/e2e/cm-003-default-view.test.ts +0 -195
- package/test/e2e/plan-analyze-run.test.ts +0 -902
- package/test/helpers/helpers.test.ts +0 -295
- package/test/helpers/timeout.ts +0 -42
- package/test/integration/US-002-TEST-SUMMARY.md +0 -107
- package/test/integration/US-003-TEST-SUMMARY.md +0 -149
- package/test/integration/US-004-TEST-SUMMARY.md +0 -106
- package/test/integration/US-005-TEST-SUMMARY.md +0 -138
- package/test/integration/US-007-TEST-SUMMARY.md +0 -100
- package/test/integration/cli/agent-validation.test.ts +0 -439
- package/test/integration/cli/cli-config-default-edge-cases.test.ts +0 -223
- package/test/integration/cli/cli-config-default-view.test.ts +0 -230
- package/test/integration/cli/cli-config-diff.test.ts +0 -461
- package/test/integration/cli/cli-config-prompts-explain.test.ts +0 -74
- package/test/integration/cli/cli-config.test.ts +0 -737
- package/test/integration/cli/cli-diagnose.test.ts +0 -595
- package/test/integration/cli/cli-logs.test.ts +0 -346
- package/test/integration/cli/cli-plugins.test.ts +0 -679
- package/test/integration/cli/cli-precheck.test.ts +0 -372
- package/test/integration/cli/cli-run-headless.test.ts +0 -174
- package/test/integration/cli/cli.test.ts +0 -76
- package/test/integration/cli/precheck-integration.test.ts +0 -476
- package/test/integration/cli/precheck-orchestrator.test.ts +0 -247
- package/test/integration/cli/precheck.test.ts +0 -806
- package/test/integration/config/config-loader.test.ts +0 -266
- package/test/integration/config/config.test.ts +0 -444
- package/test/integration/config/merger.test.ts +0 -466
- package/test/integration/config/paths.test.ts +0 -52
- package/test/integration/config/security-loader.test.ts +0 -83
- package/test/integration/context/context-integration.test.ts +0 -703
- package/test/integration/context/context-path-security.test.ts +0 -173
- package/test/integration/context/context-provider-injection.test.ts +0 -507
- package/test/integration/context/context-verification-integration.test.ts +0 -296
- package/test/integration/context/s5-greenfield-fallback.test.ts +0 -298
- package/test/integration/execution/execution-isolation.test.ts +0 -143
- package/test/integration/execution/execution.test.ts +0 -634
- package/test/integration/execution/feature-status-write.test.ts +0 -302
- package/test/integration/execution/parallel.test.ts +0 -251
- package/test/integration/execution/prd-pause.test.ts +0 -205
- package/test/integration/execution/prd-resolvers.test.ts +0 -186
- package/test/integration/execution/progress.test.ts +0 -34
- package/test/integration/execution/runner-batching.test.ts +0 -682
- package/test/integration/execution/runner-config-plugins.test.ts +0 -462
- package/test/integration/execution/runner-escalation.test.ts +0 -561
- package/test/integration/execution/runner-fixes.test.ts +0 -400
- package/test/integration/execution/runner-plugin-integration.test.ts +0 -544
- package/test/integration/execution/runner-queue-and-attempts.test.ts +0 -476
- package/test/integration/execution/status-file-integration.test.ts +0 -289
- package/test/integration/execution/status-file.test.ts +0 -380
- package/test/integration/execution/status-writer.test.ts +0 -447
- package/test/integration/execution/story-id-in-events.test.ts +0 -274
- package/test/integration/interaction/interaction-chain-pipeline.test.ts +0 -476
- package/test/integration/pipeline/hooks.test.ts +0 -363
- package/test/integration/pipeline/pipeline-acceptance.test.ts +0 -303
- package/test/integration/pipeline/pipeline-events.test.ts +0 -476
- package/test/integration/pipeline/pipeline.test.ts +0 -660
- package/test/integration/pipeline/reporter-lifecycle.test.ts +0 -862
- package/test/integration/pipeline/verify-stage.test.ts +0 -286
- package/test/integration/plan/analyze-integration.test.ts +0 -262
- package/test/integration/plan/analyze-scanner.test.ts +0 -132
- package/test/integration/plan/logger.test.ts +0 -461
- package/test/integration/plan/plan.test.ts +0 -157
- package/test/integration/plugins/config-integration.test.ts +0 -173
- package/test/integration/plugins/config-resolution.test.ts +0 -523
- package/test/integration/plugins/loader.test.ts +0 -644
- package/test/integration/plugins/plugins-registry.test.ts +0 -747
- package/test/integration/plugins/validator.test.ts +0 -564
- package/test/integration/prompts/pb-004-migration.test.ts +0 -523
- package/test/integration/review/review-config-commands.test.ts +0 -320
- package/test/integration/review/review-config-schema.test.ts +0 -117
- package/test/integration/review/review-plugin-integration.test.ts +0 -729
- package/test/integration/review/review.test.ts +0 -150
- package/test/integration/routing/plugin-routing-advanced.test.ts +0 -461
- package/test/integration/routing/plugin-routing-core.test.ts +0 -527
- package/test/integration/routing/routing-stage-bug-021.test.ts +0 -275
- package/test/integration/routing/routing-stage-greenfield.test.ts +0 -287
- package/test/integration/tdd/tdd-cleanup.test.ts +0 -246
- package/test/integration/tdd/tdd-orchestrator-core.test.ts +0 -565
- package/test/integration/tdd/tdd-orchestrator-failureCategory.test.ts +0 -355
- package/test/integration/tdd/tdd-orchestrator-fallback.test.ts +0 -311
- package/test/integration/tdd/tdd-orchestrator-lite.test.ts +0 -289
- package/test/integration/tdd/tdd-orchestrator-prompts.test.ts +0 -260
- package/test/integration/tdd/tdd-orchestrator-verdict.test.ts +0 -536
- package/test/integration/tmp/headless-test/test.jsonl +0 -30
- package/test/integration/verification/test-scanner.test.ts +0 -403
- package/test/integration/verification/verification-asset-check.test.ts +0 -143
- package/test/integration/worktree/manager.test.ts +0 -218
- package/test/integration/worktree/worktree-merge.test.ts +0 -341
- package/test/manual/logging-formatter-demo.ts +0 -158
- package/test/ui/tui-agent-panel.test.tsx +0 -99
- package/test/ui/tui-pty-integration.test.tsx +0 -146
- package/test/unit/acceptance.test.ts +0 -187
- package/test/unit/agent-stderr-capture.test.ts +0 -147
- package/test/unit/agents/claude.test.ts +0 -107
- package/test/unit/analyze-classifier.test.ts +0 -216
- package/test/unit/analyze.test.ts +0 -224
- package/test/unit/auto-detect.test.ts +0 -250
- package/test/unit/cli-status-project-level.test.ts +0 -283
- package/test/unit/cli-status.test.ts +0 -418
- package/test/unit/commands/common.test.ts +0 -321
- package/test/unit/commands/logs.test.ts +0 -458
- package/test/unit/commands/runs.test.ts +0 -303
- package/test/unit/commands/unlock.test.ts +0 -320
- package/test/unit/config/defaults.test.ts +0 -70
- package/test/unit/config/quality-commands-schema.test.ts +0 -72
- package/test/unit/config/regression-gate-schema.test.ts +0 -160
- package/test/unit/config/smart-runner-flag.test.ts +0 -250
- package/test/unit/constitution-generators.test.ts +0 -161
- package/test/unit/constitution.test.ts +0 -210
- package/test/unit/context/context-autodetect.test.ts +0 -297
- package/test/unit/context/context-build.test.ts +0 -575
- package/test/unit/context/context-coverage.test.ts +0 -236
- package/test/unit/context/context-error.test.ts +0 -93
- package/test/unit/context/context-estimate-tokens.test.ts +0 -201
- package/test/unit/context/context-format.test.ts +0 -302
- package/test/unit/context/context-isolation.test.ts +0 -267
- package/test/unit/context/context-sort.test.ts +0 -93
- package/test/unit/context/context-story.test.ts +0 -108
- package/test/unit/context/prior-failures.test.ts +0 -463
- package/test/unit/context.test.ts +0 -1726
- package/test/unit/cost.test.ts +0 -231
- package/test/unit/crash-recovery.test.ts +0 -309
- package/test/unit/escalation.test.ts +0 -127
- package/test/unit/execution/lifecycle/run-completion.test.ts +0 -240
- package/test/unit/execution/lifecycle/run-regression.test.ts +0 -420
- package/test/unit/execution/pid-registry.test.ts +0 -241
- package/test/unit/execution/sequential-executor.test.ts +0 -235
- package/test/unit/execution/sfc-004-dead-code-cleanup.test.ts +0 -89
- package/test/unit/execution/structured-failure.test.ts +0 -415
- package/test/unit/execution-logging-stderr.test.ts +0 -157
- package/test/unit/execution-stage.test.ts +0 -123
- package/test/unit/fix-generator.test.ts +0 -276
- package/test/unit/formatters.test.ts +0 -468
- package/test/unit/greenfield.test.ts +0 -180
- package/test/unit/hooks/shell-security.test.ts +0 -40
- package/test/unit/interaction/auto-plugin.test.ts +0 -162
- package/test/unit/interaction/human-review-trigger.test.ts +0 -165
- package/test/unit/interaction-network-failures.test.ts +0 -390
- package/test/unit/interaction-plugins.test.ts +0 -472
- package/test/unit/logging/formatter.test.ts +0 -456
- package/test/unit/merge.test.ts +0 -269
- package/test/unit/metrics/aggregator.test.ts +0 -164
- package/test/unit/metrics/tracker.test.ts +0 -186
- package/test/unit/metrics.test.ts +0 -276
- package/test/unit/optimizer/noop.optimizer.test.ts +0 -125
- package/test/unit/optimizer/rule-based.optimizer.test.ts +0 -358
- package/test/unit/pipeline/event-bus.test.ts +0 -105
- package/test/unit/pipeline/routing-partial-override.test.ts +0 -121
- package/test/unit/pipeline/runner-retry.test.ts +0 -89
- package/test/unit/pipeline/stages/autofix.test.ts +0 -97
- package/test/unit/pipeline/stages/completion-review-gate.test.ts +0 -218
- package/test/unit/pipeline/stages/execution-ambiguity.test.ts +0 -311
- package/test/unit/pipeline/stages/execution-merge-conflict.test.ts +0 -218
- package/test/unit/pipeline/stages/rectify.test.ts +0 -101
- package/test/unit/pipeline/stages/regression-stage.test.ts +0 -69
- package/test/unit/pipeline/stages/review.test.ts +0 -201
- package/test/unit/pipeline/stages/routing-idempotence.test.ts +0 -139
- package/test/unit/pipeline/stages/routing-initial-complexity.test.ts +0 -321
- package/test/unit/pipeline/stages/routing-persistence.test.ts +0 -380
- package/test/unit/pipeline/stages/verify.test.ts +0 -267
- package/test/unit/pipeline/subscribers/events-writer.test.ts +0 -227
- package/test/unit/pipeline/subscribers/hooks.test.ts +0 -84
- package/test/unit/pipeline/subscribers/interaction.test.ts +0 -313
- package/test/unit/pipeline/subscribers/registry.test.ts +0 -149
- package/test/unit/pipeline/subscribers/reporters.test.ts +0 -90
- package/test/unit/pipeline/verify-smart-runner.test.ts +0 -345
- package/test/unit/prd-auto-default.test.ts +0 -291
- package/test/unit/prd-failure-category.test.ts +0 -177
- package/test/unit/prd-get-next-story.test.ts +0 -215
- package/test/unit/precheck/checks-warnings.test.ts +0 -114
- package/test/unit/precheck-checks.test.ts +0 -841
- package/test/unit/precheck-story-size-gate.test.ts +0 -288
- package/test/unit/precheck-types.test.ts +0 -143
- package/test/unit/prompts/builder.test.ts +0 -258
- package/test/unit/prompts/loader.test.ts +0 -355
- package/test/unit/prompts/sections/conventions.test.ts +0 -30
- package/test/unit/prompts/sections/isolation.test.ts +0 -35
- package/test/unit/prompts/sections/role-task.test.ts +0 -40
- package/test/unit/prompts/sections/sections.test.ts +0 -238
- package/test/unit/prompts/sections/story.test.ts +0 -45
- package/test/unit/prompts/sections/verdict.test.ts +0 -58
- package/test/unit/prompts.test.ts +0 -476
- package/test/unit/queue.test.ts +0 -237
- package/test/unit/rectification.test.ts +0 -285
- package/test/unit/registry.test.ts +0 -288
- package/test/unit/review/runner.test.ts +0 -117
- package/test/unit/routing/content-hash.test.ts +0 -99
- package/test/unit/routing/routing-stability.test.ts +0 -208
- package/test/unit/routing/strategies/llm.test.ts +0 -306
- package/test/unit/routing-advanced.test.ts +0 -313
- package/test/unit/routing-core.test.ts +0 -341
- package/test/unit/routing-strategies.test.ts +0 -440
- package/test/unit/storyid-events.test.ts +0 -213
- package/test/unit/tdd-verdict.test.ts +0 -492
- package/test/unit/test-output-parser.test.ts +0 -377
- package/test/unit/ui/tui-controls.test.ts +0 -335
- package/test/unit/ui/tui-cost-and-pty.test.ts +0 -190
- package/test/unit/ui/tui-layout.test.ts +0 -379
- package/test/unit/ui/tui-stories.test.ts +0 -333
- package/test/unit/unit-isolation.test.ts +0 -135
- package/test/unit/utils/git.test.ts +0 -50
- package/test/unit/utils/path-security.test.ts +0 -47
- package/test/unit/utils-helpers.test.ts +0 -318
- package/test/unit/verdict.test.ts +0 -325
- package/test/unit/verification/orchestrator-types.test.ts +0 -54
- package/test/unit/verification/orchestrator.test.ts +0 -66
- package/test/unit/verification/smart-runner-config.test.ts +0 -163
- package/test/unit/verification/smart-runner-discovery.test.ts +0 -354
- package/test/unit/verification/smart-runner.test.ts +0 -262
- package/test/unit/verification/strategies/acceptance.test.ts +0 -33
- package/test/unit/verification/strategies/regression.test.ts +0 -87
- package/test/unit/verification/strategies/scoped.test.ts +0 -100
- package/test/unit/worktree-manager.test.ts +0 -159
- package/tsconfig.json +0 -27
|
@@ -1,523 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PB-004: Migrate call sites to PromptBuilder — integration tests
|
|
3
|
-
*
|
|
4
|
-
* These tests are expected to FAIL until:
|
|
5
|
-
* 1. PromptBuilder gains a .withLoader(workdir, config) method
|
|
6
|
-
* 2. The 6 user-facing prompt functions are replaced with PromptBuilder calls
|
|
7
|
-
* 3. Call sites in session-runner.ts and prompt.ts stage are updated
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
11
|
-
import { mkdirSync, mkdtempSync, writeFileSync } from "node:fs";
|
|
12
|
-
import { tmpdir } from "node:os";
|
|
13
|
-
import { join, dirname } from "node:path";
|
|
14
|
-
import type { NaxConfig } from "../../../src/config/types";
|
|
15
|
-
import { PromptBuilder } from "../../../src/prompts/builder";
|
|
16
|
-
import type { UserStory } from "../../../src/prd";
|
|
17
|
-
|
|
18
|
-
// ---------------------------------------------------------------------------
|
|
19
|
-
// Fixtures
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
|
|
22
|
-
function makeStory(overrides: Partial<UserStory> = {}): UserStory {
|
|
23
|
-
return {
|
|
24
|
-
id: "PB-004",
|
|
25
|
-
title: "Migrate call sites to PromptBuilder",
|
|
26
|
-
description: "Replace 6 user-facing prompt functions with PromptBuilder calls.",
|
|
27
|
-
acceptanceCriteria: [
|
|
28
|
-
"All 6 user-facing prompt functions replaced with PromptBuilder calls",
|
|
29
|
-
"Internal prompts remain unchanged",
|
|
30
|
-
"No regression in generated prompt text",
|
|
31
|
-
],
|
|
32
|
-
tags: [],
|
|
33
|
-
dependencies: [],
|
|
34
|
-
status: "pending",
|
|
35
|
-
passes: false,
|
|
36
|
-
escalations: [],
|
|
37
|
-
attempts: 0,
|
|
38
|
-
...overrides,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function makeConfig(overrides: Partial<NaxConfig> = {}): NaxConfig {
|
|
43
|
-
return {
|
|
44
|
-
version: 1,
|
|
45
|
-
models: {
|
|
46
|
-
fast: { provider: "anthropic", model: "haiku" },
|
|
47
|
-
balanced: { provider: "anthropic", model: "sonnet" },
|
|
48
|
-
powerful: { provider: "anthropic", model: "opus" },
|
|
49
|
-
},
|
|
50
|
-
autoMode: {
|
|
51
|
-
enabled: true,
|
|
52
|
-
defaultAgent: "claude",
|
|
53
|
-
fallbackOrder: ["claude"],
|
|
54
|
-
complexityRouting: { simple: "fast", medium: "balanced", complex: "powerful", expert: "powerful" },
|
|
55
|
-
escalation: { enabled: true, tierOrder: [{ tier: "fast", attempts: 3 }] },
|
|
56
|
-
},
|
|
57
|
-
routing: { strategy: "keyword" },
|
|
58
|
-
execution: {
|
|
59
|
-
maxIterations: 10,
|
|
60
|
-
iterationDelayMs: 2000,
|
|
61
|
-
costLimit: 5,
|
|
62
|
-
sessionTimeoutSeconds: 600,
|
|
63
|
-
verificationTimeoutSeconds: 300,
|
|
64
|
-
maxStoriesPerFeature: 500,
|
|
65
|
-
rectification: {
|
|
66
|
-
enabled: true,
|
|
67
|
-
maxRetries: 2,
|
|
68
|
-
fullSuiteTimeoutSeconds: 120,
|
|
69
|
-
maxFailureSummaryChars: 2000,
|
|
70
|
-
abortOnIncreasingFailures: true,
|
|
71
|
-
},
|
|
72
|
-
regressionGate: { enabled: true, timeoutSeconds: 120 },
|
|
73
|
-
contextProviderTokenBudget: 2000,
|
|
74
|
-
},
|
|
75
|
-
quality: {
|
|
76
|
-
requireTypecheck: true,
|
|
77
|
-
requireLint: true,
|
|
78
|
-
requireTests: true,
|
|
79
|
-
commands: {},
|
|
80
|
-
forceExit: false,
|
|
81
|
-
detectOpenHandles: true,
|
|
82
|
-
detectOpenHandlesRetries: 1,
|
|
83
|
-
gracePeriodMs: 5000,
|
|
84
|
-
dangerouslySkipPermissions: true,
|
|
85
|
-
drainTimeoutMs: 2000,
|
|
86
|
-
shell: "/bin/sh",
|
|
87
|
-
stripEnvVars: [],
|
|
88
|
-
environmentalEscalationDivisor: 2,
|
|
89
|
-
},
|
|
90
|
-
tdd: {
|
|
91
|
-
maxRetries: 2,
|
|
92
|
-
autoVerifyIsolation: true,
|
|
93
|
-
strategy: "auto",
|
|
94
|
-
autoApproveVerifier: true,
|
|
95
|
-
},
|
|
96
|
-
constitution: { enabled: false, path: "constitution.md", maxTokens: 2000 },
|
|
97
|
-
analyze: { llmEnhanced: false, model: "balanced", fallbackToKeywords: true, maxCodebaseSummaryTokens: 5000 },
|
|
98
|
-
review: { enabled: false, checks: [], commands: {} },
|
|
99
|
-
plan: { model: "balanced", outputPath: "spec.md" },
|
|
100
|
-
acceptance: { enabled: false, maxRetries: 2, generateTests: false, testPath: "acceptance.test.ts" },
|
|
101
|
-
context: {
|
|
102
|
-
testCoverage: {
|
|
103
|
-
enabled: false,
|
|
104
|
-
detail: "names-only",
|
|
105
|
-
maxTokens: 500,
|
|
106
|
-
testPattern: "**/*.test.ts",
|
|
107
|
-
scopeToStory: false,
|
|
108
|
-
},
|
|
109
|
-
autoDetect: { enabled: false, maxFiles: 5, traceImports: false },
|
|
110
|
-
},
|
|
111
|
-
...overrides,
|
|
112
|
-
} as NaxConfig;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
let tmpDir: string;
|
|
116
|
-
|
|
117
|
-
beforeEach(() => {
|
|
118
|
-
tmpDir = mkdtempSync(join(tmpdir(), "nax-pb004-test-"));
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
afterEach(() => {
|
|
122
|
-
try {
|
|
123
|
-
// best-effort cleanup
|
|
124
|
-
Bun.spawnSync(["rm", "-rf", tmpDir]);
|
|
125
|
-
} catch {
|
|
126
|
-
// ignore
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
// ---------------------------------------------------------------------------
|
|
131
|
-
// 1. PromptBuilder.withLoader API — fails until withLoader is implemented
|
|
132
|
-
// ---------------------------------------------------------------------------
|
|
133
|
-
|
|
134
|
-
describe("PromptBuilder.withLoader(workdir, config)", () => {
|
|
135
|
-
test("withLoader is chainable and returns a PromptBuilder", () => {
|
|
136
|
-
const config = makeConfig();
|
|
137
|
-
// FAILS: withLoader does not exist on PromptBuilder
|
|
138
|
-
const pb = (PromptBuilder.for("test-writer") as any).withLoader(tmpDir, config);
|
|
139
|
-
expect(pb).toBeInstanceOf(PromptBuilder);
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
test("withLoader + no override in config: build succeeds and uses default", async () => {
|
|
143
|
-
const config = makeConfig(); // no prompts.overrides
|
|
144
|
-
const story = makeStory();
|
|
145
|
-
// FAILS: withLoader does not exist on PromptBuilder
|
|
146
|
-
const prompt = await (PromptBuilder.for("test-writer") as any)
|
|
147
|
-
.withLoader(tmpDir, config)
|
|
148
|
-
.story(story)
|
|
149
|
-
.build();
|
|
150
|
-
expect(prompt).toContain(story.title);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
test("withLoader reads override file when config.prompts.overrides is set", async () => {
|
|
154
|
-
const overrideContent = "# CUSTOM_TEST_WRITER_OVERRIDE\nCustom role body from user override.";
|
|
155
|
-
const relPath = ".nax/prompts/test-writer.md";
|
|
156
|
-
const absPath = join(tmpDir, relPath);
|
|
157
|
-
mkdirSync(dirname(absPath), { recursive: true });
|
|
158
|
-
writeFileSync(absPath, overrideContent);
|
|
159
|
-
|
|
160
|
-
const config = makeConfig({ prompts: { overrides: { "test-writer": relPath } } });
|
|
161
|
-
const story = makeStory();
|
|
162
|
-
|
|
163
|
-
// FAILS: withLoader does not exist on PromptBuilder
|
|
164
|
-
const prompt = await (PromptBuilder.for("test-writer") as any)
|
|
165
|
-
.withLoader(tmpDir, config)
|
|
166
|
-
.story(story)
|
|
167
|
-
.build();
|
|
168
|
-
|
|
169
|
-
expect(prompt).toContain("CUSTOM_TEST_WRITER_OVERRIDE");
|
|
170
|
-
// Story context (non-overridable) must still appear
|
|
171
|
-
expect(prompt).toContain(story.title);
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
test("withLoader falls back to default when override file is absent", async () => {
|
|
175
|
-
const config = makeConfig({
|
|
176
|
-
prompts: { overrides: { "test-writer": ".nax/prompts/nonexistent.md" } },
|
|
177
|
-
});
|
|
178
|
-
const story = makeStory({ title: "FALLBACK_STORY_TITLE" });
|
|
179
|
-
|
|
180
|
-
// FAILS: withLoader does not exist on PromptBuilder
|
|
181
|
-
const prompt = await (PromptBuilder.for("test-writer") as any)
|
|
182
|
-
.withLoader(tmpDir, config)
|
|
183
|
-
.story(story)
|
|
184
|
-
.build();
|
|
185
|
-
|
|
186
|
-
expect(prompt).toContain("FALLBACK_STORY_TITLE");
|
|
187
|
-
});
|
|
188
|
-
});
|
|
189
|
-
|
|
190
|
-
// ---------------------------------------------------------------------------
|
|
191
|
-
// 2. Integration — 6 roles produce semantically correct output (no override)
|
|
192
|
-
// Uses withLoader so it fails until migration is complete
|
|
193
|
-
// ---------------------------------------------------------------------------
|
|
194
|
-
|
|
195
|
-
describe("Integration: 6 roles with no override — story title and AC present", () => {
|
|
196
|
-
const story = makeStory({
|
|
197
|
-
title: "ROLE_INTEGRATION_TEST_STORY",
|
|
198
|
-
acceptanceCriteria: ["CRITERIA_ONE", "CRITERIA_TWO"],
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
test("test-writer (strict isolation) contains story title and acceptance criteria", async () => {
|
|
202
|
-
const config = makeConfig();
|
|
203
|
-
// FAILS: withLoader does not exist
|
|
204
|
-
const prompt = await (PromptBuilder.for("test-writer", { isolation: "strict" }) as any)
|
|
205
|
-
.withLoader(tmpDir, config)
|
|
206
|
-
.story(story)
|
|
207
|
-
.build();
|
|
208
|
-
|
|
209
|
-
expect(prompt).toContain("ROLE_INTEGRATION_TEST_STORY");
|
|
210
|
-
expect(prompt).toContain("CRITERIA_ONE");
|
|
211
|
-
expect(prompt).toContain("CRITERIA_TWO");
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
test("test-writer (strict) includes test-only isolation instructions", async () => {
|
|
215
|
-
const config = makeConfig();
|
|
216
|
-
// FAILS: withLoader does not exist
|
|
217
|
-
const prompt = await (PromptBuilder.for("test-writer", { isolation: "strict" }) as any)
|
|
218
|
-
.withLoader(tmpDir, config)
|
|
219
|
-
.story(story)
|
|
220
|
-
.build();
|
|
221
|
-
|
|
222
|
-
const lower = prompt.toLowerCase();
|
|
223
|
-
// Must mention writing tests or test/ directory restriction
|
|
224
|
-
const hasTestInstruction =
|
|
225
|
-
lower.includes("test") &&
|
|
226
|
-
(lower.includes("only") || lower.includes("do not") || lower.includes("don't") || lower.includes("src/"));
|
|
227
|
-
expect(hasTestInstruction).toBe(true);
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
test("test-writer (lite) contains story title and acceptance criteria", async () => {
|
|
231
|
-
const config = makeConfig();
|
|
232
|
-
// FAILS: withLoader does not exist
|
|
233
|
-
const prompt = await (PromptBuilder.for("test-writer", { isolation: "lite" }) as any)
|
|
234
|
-
.withLoader(tmpDir, config)
|
|
235
|
-
.story(story)
|
|
236
|
-
.build();
|
|
237
|
-
|
|
238
|
-
expect(prompt).toContain("ROLE_INTEGRATION_TEST_STORY");
|
|
239
|
-
expect(prompt).toContain("CRITERIA_ONE");
|
|
240
|
-
});
|
|
241
|
-
|
|
242
|
-
test("test-writer (lite) mentions allowing src/ reads or stubs", async () => {
|
|
243
|
-
const config = makeConfig();
|
|
244
|
-
// FAILS: withLoader does not exist
|
|
245
|
-
const prompt = await (PromptBuilder.for("test-writer", { isolation: "lite" }) as any)
|
|
246
|
-
.withLoader(tmpDir, config)
|
|
247
|
-
.story(story)
|
|
248
|
-
.build();
|
|
249
|
-
|
|
250
|
-
const lower = prompt.toLowerCase();
|
|
251
|
-
// Lite mode allows reading source files or creating stubs
|
|
252
|
-
const hasLiteInstruction =
|
|
253
|
-
lower.includes("stub") ||
|
|
254
|
-
lower.includes("may read") ||
|
|
255
|
-
lower.includes("read source") ||
|
|
256
|
-
lower.includes("import from source");
|
|
257
|
-
expect(hasLiteInstruction).toBe(true);
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
test("implementer (standard) contains story title and acceptance criteria", async () => {
|
|
261
|
-
const config = makeConfig();
|
|
262
|
-
// FAILS: withLoader does not exist
|
|
263
|
-
const prompt = await (PromptBuilder.for("implementer", { variant: "standard" }) as any)
|
|
264
|
-
.withLoader(tmpDir, config)
|
|
265
|
-
.story(story)
|
|
266
|
-
.build();
|
|
267
|
-
|
|
268
|
-
expect(prompt).toContain("ROLE_INTEGRATION_TEST_STORY");
|
|
269
|
-
expect(prompt).toContain("CRITERIA_ONE");
|
|
270
|
-
expect(prompt).toContain("CRITERIA_TWO");
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
test("implementer (standard) includes implementation instructions", async () => {
|
|
274
|
-
const config = makeConfig();
|
|
275
|
-
// FAILS: withLoader does not exist
|
|
276
|
-
const prompt = await (PromptBuilder.for("implementer", { variant: "standard" }) as any)
|
|
277
|
-
.withLoader(tmpDir, config)
|
|
278
|
-
.story(story)
|
|
279
|
-
.build();
|
|
280
|
-
|
|
281
|
-
const lower = prompt.toLowerCase();
|
|
282
|
-
const hasImplInstruction =
|
|
283
|
-
lower.includes("implement") ||
|
|
284
|
-
lower.includes("make") ||
|
|
285
|
-
lower.includes("pass");
|
|
286
|
-
expect(hasImplInstruction).toBe(true);
|
|
287
|
-
});
|
|
288
|
-
|
|
289
|
-
test("implementer (lite) contains story title and acceptance criteria", async () => {
|
|
290
|
-
const config = makeConfig();
|
|
291
|
-
// FAILS: withLoader does not exist
|
|
292
|
-
const prompt = await (PromptBuilder.for("implementer", { variant: "lite" }) as any)
|
|
293
|
-
.withLoader(tmpDir, config)
|
|
294
|
-
.story(story)
|
|
295
|
-
.build();
|
|
296
|
-
|
|
297
|
-
expect(prompt).toContain("ROLE_INTEGRATION_TEST_STORY");
|
|
298
|
-
expect(prompt).toContain("CRITERIA_ONE");
|
|
299
|
-
});
|
|
300
|
-
|
|
301
|
-
test("implementer (lite) mentions writing tests AND implementing", async () => {
|
|
302
|
-
const config = makeConfig();
|
|
303
|
-
// FAILS: withLoader does not exist
|
|
304
|
-
const prompt = await (PromptBuilder.for("implementer", { variant: "lite" }) as any)
|
|
305
|
-
.withLoader(tmpDir, config)
|
|
306
|
-
.story(story)
|
|
307
|
-
.build();
|
|
308
|
-
|
|
309
|
-
const lower = prompt.toLowerCase();
|
|
310
|
-
const hasTests = lower.includes("test");
|
|
311
|
-
const hasImpl = lower.includes("implement") || lower.includes("feature");
|
|
312
|
-
expect(hasTests && hasImpl).toBe(true);
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
test("verifier contains story title and acceptance criteria", async () => {
|
|
316
|
-
const config = makeConfig();
|
|
317
|
-
// FAILS: withLoader does not exist
|
|
318
|
-
const prompt = await (PromptBuilder.for("verifier") as any)
|
|
319
|
-
.withLoader(tmpDir, config)
|
|
320
|
-
.story(story)
|
|
321
|
-
.build();
|
|
322
|
-
|
|
323
|
-
expect(prompt).toContain("ROLE_INTEGRATION_TEST_STORY");
|
|
324
|
-
expect(prompt).toContain("CRITERIA_ONE");
|
|
325
|
-
expect(prompt).toContain("CRITERIA_TWO");
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
test("verifier includes verification instructions", async () => {
|
|
329
|
-
const config = makeConfig();
|
|
330
|
-
// FAILS: withLoader does not exist
|
|
331
|
-
const prompt = await (PromptBuilder.for("verifier") as any)
|
|
332
|
-
.withLoader(tmpDir, config)
|
|
333
|
-
.story(story)
|
|
334
|
-
.build();
|
|
335
|
-
|
|
336
|
-
const lower = prompt.toLowerCase();
|
|
337
|
-
const hasVerifyInstruction = lower.includes("verify") || lower.includes("check") || lower.includes("ensure");
|
|
338
|
-
expect(hasVerifyInstruction).toBe(true);
|
|
339
|
-
});
|
|
340
|
-
|
|
341
|
-
test("single-session contains story title and acceptance criteria", async () => {
|
|
342
|
-
const config = makeConfig();
|
|
343
|
-
// FAILS: withLoader does not exist
|
|
344
|
-
const prompt = await (PromptBuilder.for("single-session") as any)
|
|
345
|
-
.withLoader(tmpDir, config)
|
|
346
|
-
.story(story)
|
|
347
|
-
.build();
|
|
348
|
-
|
|
349
|
-
expect(prompt).toContain("ROLE_INTEGRATION_TEST_STORY");
|
|
350
|
-
expect(prompt).toContain("CRITERIA_ONE");
|
|
351
|
-
expect(prompt).toContain("CRITERIA_TWO");
|
|
352
|
-
});
|
|
353
|
-
|
|
354
|
-
test("single-session includes both test and implementation instructions", async () => {
|
|
355
|
-
const config = makeConfig();
|
|
356
|
-
// FAILS: withLoader does not exist
|
|
357
|
-
const prompt = await (PromptBuilder.for("single-session") as any)
|
|
358
|
-
.withLoader(tmpDir, config)
|
|
359
|
-
.story(story)
|
|
360
|
-
.build();
|
|
361
|
-
|
|
362
|
-
const lower = prompt.toLowerCase();
|
|
363
|
-
const hasTests = lower.includes("test");
|
|
364
|
-
const hasImpl = lower.includes("implement") || lower.includes("feature");
|
|
365
|
-
expect(hasTests && hasImpl).toBe(true);
|
|
366
|
-
});
|
|
367
|
-
});
|
|
368
|
-
|
|
369
|
-
// ---------------------------------------------------------------------------
|
|
370
|
-
// 3. Structural: call sites no longer import the 6 old functions
|
|
371
|
-
// FAILS until migration removes/replaces imports in call sites
|
|
372
|
-
// ---------------------------------------------------------------------------
|
|
373
|
-
|
|
374
|
-
describe("Structural: call sites migrated away from old prompt functions", () => {
|
|
375
|
-
test("src/tdd/session-runner.ts does not import buildTestWriterPrompt from ./prompts", async () => {
|
|
376
|
-
const source = await Bun.file(
|
|
377
|
-
new URL("../../../src/tdd/session-runner.ts", import.meta.url).pathname,
|
|
378
|
-
).text();
|
|
379
|
-
|
|
380
|
-
// After migration, session-runner should NOT import these old functions
|
|
381
|
-
expect(source).not.toContain("buildTestWriterPrompt");
|
|
382
|
-
expect(source).not.toContain("buildTestWriterLitePrompt");
|
|
383
|
-
expect(source).not.toContain("buildImplementerPrompt");
|
|
384
|
-
expect(source).not.toContain("buildImplementerLitePrompt");
|
|
385
|
-
expect(source).not.toContain("buildVerifierPrompt");
|
|
386
|
-
});
|
|
387
|
-
|
|
388
|
-
test("src/tdd/session-runner.ts imports PromptBuilder after migration", async () => {
|
|
389
|
-
const source = await Bun.file(
|
|
390
|
-
new URL("../../../src/tdd/session-runner.ts", import.meta.url).pathname,
|
|
391
|
-
).text();
|
|
392
|
-
|
|
393
|
-
// After migration, session-runner should use PromptBuilder
|
|
394
|
-
expect(source).toContain("PromptBuilder");
|
|
395
|
-
});
|
|
396
|
-
|
|
397
|
-
test("src/pipeline/stages/prompt.ts does not import buildSingleSessionPrompt after migration", async () => {
|
|
398
|
-
const source = await Bun.file(
|
|
399
|
-
new URL("../../../src/pipeline/stages/prompt.ts", import.meta.url).pathname,
|
|
400
|
-
).text();
|
|
401
|
-
|
|
402
|
-
// After migration, prompt stage should NOT use the old function
|
|
403
|
-
expect(source).not.toContain("buildSingleSessionPrompt");
|
|
404
|
-
});
|
|
405
|
-
|
|
406
|
-
test("src/pipeline/stages/prompt.ts imports PromptBuilder after migration", async () => {
|
|
407
|
-
const source = await Bun.file(
|
|
408
|
-
new URL("../../../src/pipeline/stages/prompt.ts", import.meta.url).pathname,
|
|
409
|
-
).text();
|
|
410
|
-
|
|
411
|
-
// After migration, prompt stage should use PromptBuilder
|
|
412
|
-
expect(source).toContain("PromptBuilder");
|
|
413
|
-
});
|
|
414
|
-
|
|
415
|
-
test("src/cli/prompts.ts does not dynamically import buildTestWriterPrompt after migration", async () => {
|
|
416
|
-
const source = await Bun.file(
|
|
417
|
-
new URL("../../../src/cli/prompts.ts", import.meta.url).pathname,
|
|
418
|
-
).text();
|
|
419
|
-
|
|
420
|
-
// cli/prompts.ts has a dynamic import of tdd/prompts — after migration it should use PromptBuilder
|
|
421
|
-
expect(source).not.toContain("buildTestWriterPrompt");
|
|
422
|
-
expect(source).not.toContain("buildImplementerPrompt");
|
|
423
|
-
expect(source).not.toContain("buildVerifierPrompt");
|
|
424
|
-
});
|
|
425
|
-
});
|
|
426
|
-
|
|
427
|
-
// ---------------------------------------------------------------------------
|
|
428
|
-
// 4. Internal prompts remain unchanged (regression guard — expected to PASS)
|
|
429
|
-
// ---------------------------------------------------------------------------
|
|
430
|
-
|
|
431
|
-
describe("Internal prompts: not migrated, still accessible", () => {
|
|
432
|
-
test("buildImplementerRectificationPrompt still exported from src/tdd/prompts", async () => {
|
|
433
|
-
const mod = await import("../../../src/tdd/prompts");
|
|
434
|
-
expect(typeof mod.buildImplementerRectificationPrompt).toBe("function");
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
test("buildRectificationPrompt still exported from src/tdd/prompts", async () => {
|
|
438
|
-
const mod = await import("../../../src/tdd/prompts");
|
|
439
|
-
expect(typeof mod.buildRectificationPrompt).toBe("function");
|
|
440
|
-
});
|
|
441
|
-
|
|
442
|
-
test("buildBatchPrompt still exported from src/execution/prompts", async () => {
|
|
443
|
-
const mod = await import("../../../src/execution/prompts");
|
|
444
|
-
expect(typeof mod.buildBatchPrompt).toBe("function");
|
|
445
|
-
});
|
|
446
|
-
|
|
447
|
-
test("buildRoutingPrompt still exported from src/routing/strategies/llm-prompts", async () => {
|
|
448
|
-
const mod = await import("../../../src/routing/strategies/llm-prompts");
|
|
449
|
-
expect(typeof mod.buildRoutingPrompt).toBe("function");
|
|
450
|
-
});
|
|
451
|
-
|
|
452
|
-
test("buildBatchPrompt still exported from src/routing/strategies/llm-prompts", async () => {
|
|
453
|
-
const mod = await import("../../../src/routing/strategies/llm-prompts");
|
|
454
|
-
expect(typeof mod.buildBatchPrompt).toBe("function");
|
|
455
|
-
});
|
|
456
|
-
});
|
|
457
|
-
|
|
458
|
-
// ---------------------------------------------------------------------------
|
|
459
|
-
// 5. withLoader override: context passed through correctly
|
|
460
|
-
// ---------------------------------------------------------------------------
|
|
461
|
-
|
|
462
|
-
describe("PromptBuilder.withLoader override content integration", () => {
|
|
463
|
-
test("override for implementer role replaces role body", async () => {
|
|
464
|
-
const overrideBody = "IMPLEMENTER_CUSTOM_ROLE_BODY_MARKER";
|
|
465
|
-
const relPath = ".nax/prompts/implementer.md";
|
|
466
|
-
const absPath = join(tmpDir, relPath);
|
|
467
|
-
mkdirSync(dirname(absPath), { recursive: true });
|
|
468
|
-
writeFileSync(absPath, overrideBody);
|
|
469
|
-
|
|
470
|
-
const config = makeConfig({ prompts: { overrides: { implementer: relPath } } });
|
|
471
|
-
const story = makeStory({ title: "OVERRIDE_STORY_TITLE" });
|
|
472
|
-
|
|
473
|
-
// FAILS: withLoader does not exist
|
|
474
|
-
const prompt = await (PromptBuilder.for("implementer", { variant: "standard" }) as any)
|
|
475
|
-
.withLoader(tmpDir, config)
|
|
476
|
-
.story(story)
|
|
477
|
-
.build();
|
|
478
|
-
|
|
479
|
-
expect(prompt).toContain(overrideBody);
|
|
480
|
-
// Story context still present (non-overridable)
|
|
481
|
-
expect(prompt).toContain("OVERRIDE_STORY_TITLE");
|
|
482
|
-
});
|
|
483
|
-
|
|
484
|
-
test("override for verifier role replaces role body", async () => {
|
|
485
|
-
const overrideBody = "VERIFIER_CUSTOM_ROLE_BODY_MARKER";
|
|
486
|
-
const relPath = ".nax/prompts/verifier.md";
|
|
487
|
-
const absPath = join(tmpDir, relPath);
|
|
488
|
-
mkdirSync(dirname(absPath), { recursive: true });
|
|
489
|
-
writeFileSync(absPath, overrideBody);
|
|
490
|
-
|
|
491
|
-
const config = makeConfig({ prompts: { overrides: { verifier: relPath } } });
|
|
492
|
-
const story = makeStory({ title: "VERIFIER_OVERRIDE_TITLE" });
|
|
493
|
-
|
|
494
|
-
// FAILS: withLoader does not exist
|
|
495
|
-
const prompt = await (PromptBuilder.for("verifier") as any)
|
|
496
|
-
.withLoader(tmpDir, config)
|
|
497
|
-
.story(story)
|
|
498
|
-
.build();
|
|
499
|
-
|
|
500
|
-
expect(prompt).toContain(overrideBody);
|
|
501
|
-
expect(prompt).toContain("VERIFIER_OVERRIDE_TITLE");
|
|
502
|
-
});
|
|
503
|
-
|
|
504
|
-
test("override for single-session role replaces role body", async () => {
|
|
505
|
-
const overrideBody = "SINGLE_SESSION_CUSTOM_ROLE_BODY_MARKER";
|
|
506
|
-
const relPath = ".nax/prompts/single-session.md";
|
|
507
|
-
const absPath = join(tmpDir, relPath);
|
|
508
|
-
mkdirSync(dirname(absPath), { recursive: true });
|
|
509
|
-
writeFileSync(absPath, overrideBody);
|
|
510
|
-
|
|
511
|
-
const config = makeConfig({ prompts: { overrides: { "single-session": relPath } } });
|
|
512
|
-
const story = makeStory({ title: "SINGLE_SESSION_OVERRIDE_TITLE" });
|
|
513
|
-
|
|
514
|
-
// FAILS: withLoader does not exist
|
|
515
|
-
const prompt = await (PromptBuilder.for("single-session") as any)
|
|
516
|
-
.withLoader(tmpDir, config)
|
|
517
|
-
.story(story)
|
|
518
|
-
.build();
|
|
519
|
-
|
|
520
|
-
expect(prompt).toContain(overrideBody);
|
|
521
|
-
expect(prompt).toContain("SINGLE_SESSION_OVERRIDE_TITLE");
|
|
522
|
-
});
|
|
523
|
-
});
|