@nathapp/nax 0.21.0 → 0.22.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/.mcp.json +8 -0
- package/docs/ROADMAP.md +20 -5
- package/docs/adr/ADR-005-implementation-plan.md +655 -0
- package/docs/adr/ADR-005-pipeline-re-architecture.md +464 -0
- package/package.json +1 -1
- package/src/agents/claude.ts +44 -9
- package/src/config/types.ts +11 -0
- package/src/execution/dry-run.ts +81 -0
- package/src/execution/escalation/tier-outcome.ts +29 -44
- package/src/execution/executor-types.ts +65 -0
- package/src/execution/index.ts +0 -17
- package/src/execution/iteration-runner.ts +132 -0
- package/src/execution/lifecycle/index.ts +0 -1
- package/src/execution/lifecycle/run-regression.ts +5 -5
- package/src/execution/pipeline-result-handler.ts +51 -254
- package/src/execution/sequential-executor.ts +72 -316
- package/src/execution/story-selector.ts +75 -0
- package/src/pipeline/event-bus.ts +276 -0
- package/src/pipeline/runner.ts +51 -77
- package/src/pipeline/stages/autofix.ts +133 -0
- package/src/pipeline/stages/completion.ts +22 -30
- package/src/pipeline/stages/index.ts +30 -13
- package/src/pipeline/stages/rectify.ts +93 -0
- package/src/pipeline/stages/regression.ts +88 -0
- package/src/pipeline/stages/review.ts +19 -153
- package/src/pipeline/stages/verify.ts +18 -2
- package/src/pipeline/subscribers/hooks.ts +133 -0
- package/src/pipeline/subscribers/interaction.ts +68 -0
- package/src/pipeline/subscribers/reporters.ts +174 -0
- package/src/pipeline/types.ts +10 -1
- package/src/review/orchestrator.ts +105 -0
- package/src/tdd/prompts.ts +1 -1
- package/src/verification/index.ts +1 -1
- package/src/verification/orchestrator-types.ts +145 -0
- package/src/verification/orchestrator.ts +76 -0
- package/src/{execution/post-verify-rectification.ts → verification/rectification-loop.ts} +13 -20
- package/src/verification/{gate.ts → runners.ts} +17 -105
- package/src/verification/strategies/acceptance.ts +133 -0
- package/src/verification/strategies/regression.ts +90 -0
- package/src/verification/strategies/scoped.ts +123 -0
- package/test/COVERAGE-GAPS.md +333 -0
- package/test/{acceptance → e2e}/cm-003-default-view.test.ts +1 -0
- package/test/{integration/e2e.test.ts → e2e/plan-analyze-run.test.ts} +1 -0
- package/test/integration/{agent-validation.test.ts → cli/agent-validation.test.ts} +3 -3
- package/test/integration/{cli-config-default-edge-cases.test.ts → cli/cli-config-default-edge-cases.test.ts} +6 -5
- package/test/integration/{cli-config-default-view.test.ts → cli/cli-config-default-view.test.ts} +8 -7
- package/test/integration/{cli-config-diff.test.ts → cli/cli-config-diff.test.ts} +3 -2
- package/test/integration/{cli-config.test.ts → cli/cli-config.test.ts} +3 -2
- package/test/integration/{cli-diagnose.test.ts → cli/cli-diagnose.test.ts} +5 -4
- package/test/integration/{cli-logs.test.ts → cli/cli-logs.test.ts} +12 -3
- package/test/integration/{cli-plugins.test.ts → cli/cli-plugins.test.ts} +4 -3
- package/test/integration/{cli-precheck.test.ts → cli/cli-precheck.test.ts} +4 -3
- package/test/integration/{cli-run-headless.test.ts → cli/cli-run-headless.test.ts} +3 -2
- package/test/integration/{cli.test.ts → cli/cli.test.ts} +2 -1
- package/test/integration/{precheck-integration.test.ts → cli/precheck-integration.test.ts} +10 -9
- package/test/integration/{precheck-orchestrator.test.ts → cli/precheck-orchestrator.test.ts} +4 -3
- package/test/integration/{precheck.test.ts → cli/precheck.test.ts} +5 -4
- package/test/integration/{config-loader.test.ts → config/config-loader.test.ts} +2 -1
- package/test/integration/{config.test.ts → config/config.test.ts} +2 -2
- package/test/integration/config/merger.test.ts +1 -0
- package/test/integration/config/paths.test.ts +1 -0
- package/test/integration/{security-loader.test.ts → config/security-loader.test.ts} +2 -2
- package/test/integration/{context-integration.test.ts → context/context-integration.test.ts} +7 -6
- package/test/integration/{path-security.test.ts → context/context-path-security.test.ts} +2 -2
- package/test/integration/{context-provider-injection.test.ts → context/context-provider-injection.test.ts} +7 -6
- package/test/integration/{context-verification-integration.test.ts → context/context-verification-integration.test.ts} +5 -4
- package/test/integration/{s5-greenfield-fallback.test.ts → context/s5-greenfield-fallback.test.ts} +4 -3
- package/test/integration/{isolation.test.ts → execution/execution-isolation.test.ts} +1 -1
- package/test/integration/{execution.test.ts → execution/execution.test.ts} +8 -8
- package/test/integration/{parallel.test.ts → execution/parallel.test.ts} +2 -1
- package/test/integration/{prd-pause.test.ts → execution/prd-pause.test.ts} +2 -2
- package/test/integration/{prd-resolvers.test.ts → execution/prd-resolvers.test.ts} +3 -2
- package/test/integration/{progress.test.ts → execution/progress.test.ts} +1 -1
- package/test/integration/execution/runner-batching.test.ts +682 -0
- package/test/integration/{runner-config-plugins.test.ts → execution/runner-config-plugins.test.ts} +3 -2
- package/test/integration/execution/runner-escalation.test.ts +561 -0
- package/test/integration/{runner-fixes.test.ts → execution/runner-fixes.test.ts} +4 -3
- package/test/integration/{runner-plugin-integration.test.ts → execution/runner-plugin-integration.test.ts} +6 -5
- package/test/integration/execution/runner-queue-and-attempts.test.ts +476 -0
- package/test/integration/{status-file-integration.test.ts → execution/status-file-integration.test.ts} +9 -8
- package/test/integration/{status-file.test.ts → execution/status-file.test.ts} +3 -2
- package/test/integration/{status-writer.test.ts → execution/status-writer.test.ts} +5 -4
- package/test/integration/{story-id-in-events.test.ts → execution/story-id-in-events.test.ts} +9 -8
- package/test/integration/{interaction-chain-pipeline.test.ts → interaction/interaction-chain-pipeline.test.ts} +26 -14
- package/test/integration/{hooks.test.ts → pipeline/hooks.test.ts} +4 -2
- package/test/integration/{pipeline-acceptance.test.ts → pipeline/pipeline-acceptance.test.ts} +7 -6
- package/test/integration/{pipeline-events.test.ts → pipeline/pipeline-events.test.ts} +7 -6
- package/test/integration/{pipeline.test.ts → pipeline/pipeline.test.ts} +9 -7
- package/test/integration/{reporter-lifecycle.test.ts → pipeline/reporter-lifecycle.test.ts} +9 -7
- package/test/integration/{verify-stage.test.ts → pipeline/verify-stage.test.ts} +7 -5
- package/test/integration/{analyze-integration.test.ts → plan/analyze-integration.test.ts} +3 -2
- package/test/integration/{analyze-scanner.test.ts → plan/analyze-scanner.test.ts} +8 -7
- package/test/integration/{logger.test.ts → plan/logger.test.ts} +1 -1
- package/test/integration/{plan.test.ts → plan/plan.test.ts} +3 -3
- package/test/integration/plugins/config-integration.test.ts +1 -0
- package/test/integration/plugins/config-resolution.test.ts +1 -0
- package/test/integration/plugins/loader.test.ts +1 -0
- package/test/integration/plugins/{registry.test.ts → plugins-registry.test.ts} +1 -0
- package/test/integration/plugins/validator.test.ts +1 -0
- package/test/integration/{review-config-commands.test.ts → review/review-config-commands.test.ts} +4 -3
- package/test/integration/{review-config-schema.test.ts → review/review-config-schema.test.ts} +3 -2
- package/test/integration/{review-plugin-integration.test.ts → review/review-plugin-integration.test.ts} +5 -4
- package/test/integration/{review.test.ts → review/review.test.ts} +3 -2
- package/test/integration/routing/plugin-routing-advanced.test.ts +461 -0
- package/test/integration/{plugin-routing.test.ts → routing/plugin-routing-core.test.ts} +9 -403
- package/test/integration/{routing-stage-bug-021.test.ts → routing/routing-stage-bug-021.test.ts} +8 -7
- package/test/integration/{routing-stage-greenfield.test.ts → routing/routing-stage-greenfield.test.ts} +7 -6
- package/test/integration/{tdd-cleanup.test.ts → tdd/tdd-cleanup.test.ts} +1 -1
- package/test/integration/tdd/tdd-orchestrator-core.test.ts +565 -0
- package/test/integration/tdd/tdd-orchestrator-failureCategory.test.ts +355 -0
- package/test/integration/tdd/tdd-orchestrator-fallback.test.ts +311 -0
- package/test/integration/tdd/tdd-orchestrator-lite.test.ts +289 -0
- package/test/integration/tdd/tdd-orchestrator-prompts.test.ts +260 -0
- package/test/integration/tdd/tdd-orchestrator-verdict.test.ts +536 -0
- package/test/integration/tmp/headless-test/test.jsonl +30 -0
- package/test/integration/{test-scanner.test.ts → verification/test-scanner.test.ts} +1 -1
- package/test/integration/{verification-asset-check.test.ts → verification/verification-asset-check.test.ts} +3 -2
- package/test/unit/acceptance.test.ts +1 -0
- package/test/unit/agent-stderr-capture.test.ts +1 -0
- package/test/unit/agents/claude.test.ts +1 -0
- package/test/unit/analyze-classifier.test.ts +1 -0
- package/test/unit/auto-detect.test.ts +1 -0
- package/test/unit/cli-status.test.ts +1 -0
- package/test/unit/commands/common.test.ts +1 -0
- package/test/unit/commands/logs.test.ts +1 -0
- package/test/unit/commands/unlock.test.ts +1 -0
- package/test/unit/config/defaults.test.ts +1 -0
- package/test/unit/config/regression-gate-schema.test.ts +1 -0
- package/test/unit/config/smart-runner-flag.test.ts +1 -0
- package/test/unit/constitution-generators.test.ts +1 -0
- package/test/unit/constitution.test.ts +1 -0
- package/test/unit/context/context-autodetect.test.ts +297 -0
- package/test/unit/context/context-build.test.ts +575 -0
- package/test/unit/context/context-coverage.test.ts +236 -0
- package/test/unit/context/context-error.test.ts +93 -0
- package/test/unit/context/context-estimate-tokens.test.ts +201 -0
- package/test/unit/context/context-format.test.ts +302 -0
- package/test/unit/context/context-isolation.test.ts +267 -0
- package/test/unit/context/context-sort.test.ts +93 -0
- package/test/unit/context/context-story.test.ts +108 -0
- package/test/{context → unit/context}/prior-failures.test.ts +5 -4
- package/test/unit/context.test.ts +1 -0
- package/test/unit/crash-recovery.test.ts +1 -0
- package/test/unit/escalation.test.ts +1 -0
- package/test/unit/execution/lifecycle/run-completion.test.ts +1 -0
- package/test/unit/execution/lifecycle/run-regression.test.ts +2 -0
- package/test/{execution → unit/execution}/pid-registry.test.ts +2 -1
- package/test/{execution → unit/execution}/structured-failure.test.ts +3 -2
- package/test/unit/execution-logging-stderr.test.ts +1 -0
- package/test/unit/execution-stage.test.ts +1 -0
- package/test/unit/fix-generator.test.ts +1 -0
- package/test/unit/greenfield.test.ts +1 -0
- package/test/unit/interaction/human-review-trigger.test.ts +1 -0
- package/test/unit/interaction-network-failures.test.ts +1 -0
- package/test/unit/interaction-plugins.test.ts +1 -0
- package/test/unit/logging/formatter.test.ts +1 -0
- package/test/unit/merge.test.ts +1 -0
- package/test/unit/pipeline/event-bus.test.ts +105 -0
- package/test/unit/pipeline/routing-partial-override.test.ts +1 -0
- package/test/unit/pipeline/runner-retry.test.ts +89 -0
- package/test/unit/pipeline/stages/autofix.test.ts +97 -0
- package/test/unit/pipeline/stages/rectify.test.ts +101 -0
- package/test/unit/pipeline/stages/regression-stage.test.ts +69 -0
- package/test/unit/pipeline/stages/verify.test.ts +1 -0
- package/test/unit/pipeline/subscribers/hooks.test.ts +45 -0
- package/test/unit/pipeline/subscribers/interaction.test.ts +31 -0
- package/test/unit/pipeline/subscribers/reporters.test.ts +90 -0
- package/test/unit/pipeline/verify-smart-runner.test.ts +1 -0
- package/test/unit/prd-auto-default.test.ts +1 -0
- package/test/unit/prd-failure-category.test.ts +1 -0
- package/test/unit/prd-get-next-story.test.ts +1 -0
- package/test/unit/precheck-checks.test.ts +1 -0
- package/test/unit/precheck-story-size-gate.test.ts +1 -0
- package/test/unit/precheck-types.test.ts +1 -0
- package/test/unit/prompts.test.ts +1 -0
- package/test/unit/rectification.test.ts +2 -1
- package/test/unit/registry.test.ts +1 -0
- package/test/unit/routing/routing-stability.test.ts +1 -0
- package/test/unit/routing/strategies/llm.test.ts +1 -0
- package/test/unit/routing-advanced.test.ts +313 -0
- package/test/unit/routing-core.test.ts +341 -0
- package/test/unit/routing-strategies.test.ts +442 -0
- package/test/unit/storyid-events.test.ts +1 -0
- package/test/{ui → unit/ui}/tui-controls.test.ts +8 -7
- package/test/{ui → unit/ui}/tui-cost-and-pty.test.ts +4 -3
- package/test/{ui → unit/ui}/tui-layout.test.ts +5 -4
- package/test/{ui → unit/ui}/tui-stories.test.ts +5 -4
- package/test/unit/{isolation.test.ts → unit-isolation.test.ts} +1 -0
- package/test/unit/{helpers.test.ts → utils-helpers.test.ts} +1 -0
- package/test/unit/verdict.test.ts +1 -0
- package/test/unit/verification/orchestrator-types.test.ts +54 -0
- package/test/unit/verification/orchestrator.test.ts +66 -0
- package/test/unit/verification/smart-runner-config.test.ts +1 -0
- package/test/unit/verification/smart-runner-discovery.test.ts +8 -7
- package/test/unit/verification/strategies/acceptance.test.ts +33 -0
- package/test/unit/verification/strategies/regression.test.ts +87 -0
- package/test/unit/verification/strategies/scoped.test.ts +100 -0
- package/test/unit/worktree-manager.test.ts +1 -0
- package/src/execution/lifecycle/story-hooks.ts +0 -38
- package/src/execution/post-verify.ts +0 -193
- package/src/execution/rectification.ts +0 -13
- package/src/execution/verification.ts +0 -72
- package/test/integration/rectification-flow.test.ts +0 -512
- package/test/integration/runner.test.ts +0 -1679
- package/test/integration/tdd-orchestrator.test.ts +0 -1762
- package/test/unit/execution/post-verify-regression.test.ts +0 -362
- package/test/unit/execution/post-verify.test.ts +0 -236
- package/test/unit/routing.test.ts +0 -1039
- /package/test/{integration → helpers}/helpers.test.ts +0 -0
- /package/test/integration/worktree/{merge.test.ts → worktree-merge.test.ts} +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// RE-ARCH: keep
|
|
1
2
|
/**
|
|
2
3
|
* Integration tests for precheck integration with nax run
|
|
3
4
|
*
|
|
@@ -19,11 +20,11 @@ import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
|
19
20
|
const skipInCI = process.env.CI ? test.skip : test;
|
|
20
21
|
import { mkdirSync, rmSync } from "node:fs";
|
|
21
22
|
import { join } from "node:path";
|
|
22
|
-
import type { NaxConfig } from "
|
|
23
|
-
import { DEFAULT_CONFIG } from "
|
|
24
|
-
import { run } from "
|
|
25
|
-
import type { PRD } from "
|
|
26
|
-
import { loadPRD } from "
|
|
23
|
+
import type { NaxConfig } from "../../../src/config";
|
|
24
|
+
import { DEFAULT_CONFIG } from "../../../src/config";
|
|
25
|
+
import { run } from "../../../src/execution";
|
|
26
|
+
import type { PRD } from "../../../src/prd";
|
|
27
|
+
import { loadPRD } from "../../../src/prd";
|
|
27
28
|
|
|
28
29
|
describe("Precheck Integration with nax run", () => {
|
|
29
30
|
let testDir: string;
|
|
@@ -34,7 +35,7 @@ describe("Precheck Integration with nax run", () => {
|
|
|
34
35
|
savedSkipPrecheck = process.env.NAX_SKIP_PRECHECK;
|
|
35
36
|
delete process.env.NAX_SKIP_PRECHECK;
|
|
36
37
|
|
|
37
|
-
testDir = join(import.meta.dir, "..", "..", ".tmp", `precheck-integration-${Date.now()}`);
|
|
38
|
+
testDir = join(import.meta.dir, "..", "..", "..", ".tmp", `precheck-integration-${Date.now()}`);
|
|
38
39
|
mkdirSync(testDir, { recursive: true });
|
|
39
40
|
|
|
40
41
|
// Initialize as git repo to pass git checks
|
|
@@ -152,7 +153,7 @@ describe("Precheck Integration with nax run", () => {
|
|
|
152
153
|
|
|
153
154
|
test("AC4: --skip-precheck bypasses precheck validations", async () => {
|
|
154
155
|
// Create non-git temp directory (will fail precheck)
|
|
155
|
-
const nonGitDir = join(import.meta.dir, "..", "..", ".tmp", `non-git-${Date.now()}`);
|
|
156
|
+
const nonGitDir = join(import.meta.dir, "..", "..", "..", ".tmp", `non-git-${Date.now()}`);
|
|
156
157
|
mkdirSync(nonGitDir, { recursive: true });
|
|
157
158
|
|
|
158
159
|
try {
|
|
@@ -242,7 +243,7 @@ describe("Precheck Integration with nax run", () => {
|
|
|
242
243
|
|
|
243
244
|
test("AC2: Tier 1 blocker aborts run with descriptive error", async () => {
|
|
244
245
|
// Create directory with uncommitted changes (will fail working-tree-clean check)
|
|
245
|
-
const dirtyDir = join(import.meta.dir, "..", "..", ".tmp", `dirty-${Date.now()}`);
|
|
246
|
+
const dirtyDir = join(import.meta.dir, "..", "..", "..", ".tmp", `dirty-${Date.now()}`);
|
|
246
247
|
mkdirSync(dirtyDir, { recursive: true });
|
|
247
248
|
|
|
248
249
|
try {
|
|
@@ -421,7 +422,7 @@ describe("Precheck Integration with nax run", () => {
|
|
|
421
422
|
|
|
422
423
|
test("AC6: failed precheck updates status.json", async () => {
|
|
423
424
|
// Create non-git directory (will fail precheck)
|
|
424
|
-
const nonGitDir = join(import.meta.dir, "..", "..", ".tmp", `non-git-status-${Date.now()}`);
|
|
425
|
+
const nonGitDir = join(import.meta.dir, "..", "..", "..", ".tmp", `non-git-status-${Date.now()}`);
|
|
425
426
|
mkdirSync(nonGitDir, { recursive: true });
|
|
426
427
|
|
|
427
428
|
try {
|
package/test/integration/{precheck-orchestrator.test.ts → cli/precheck-orchestrator.test.ts}
RENAMED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// RE-ARCH: keep
|
|
1
2
|
/**
|
|
2
3
|
* US-002: Precheck orchestrator with formatted output
|
|
3
4
|
*
|
|
@@ -14,9 +15,9 @@ const skipInCI = process.env.CI ? test.skip : test;
|
|
|
14
15
|
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
15
16
|
import { tmpdir } from "node:os";
|
|
16
17
|
import { join } from "node:path";
|
|
17
|
-
import type { NaxConfig } from "
|
|
18
|
-
import type { PRD } from "
|
|
19
|
-
import { EXIT_CODES, runPrecheck } from "
|
|
18
|
+
import type { NaxConfig } from "../../../src/config";
|
|
19
|
+
import type { PRD } from "../../../src/prd/types";
|
|
20
|
+
import { EXIT_CODES, runPrecheck } from "../../../src/precheck";
|
|
20
21
|
|
|
21
22
|
// Helper to create a minimal valid git environment
|
|
22
23
|
async function setupGitRepo(dir: string): Promise<void> {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// RE-ARCH: keep
|
|
1
2
|
/**
|
|
2
3
|
* Integration tests for precheck functionality
|
|
3
4
|
*
|
|
@@ -15,10 +16,10 @@ const describeWithClaude = process.env.CI ? describe.skip : describe;
|
|
|
15
16
|
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
16
17
|
import { tmpdir } from "node:os";
|
|
17
18
|
import { join } from "node:path";
|
|
18
|
-
import type { NaxConfig } from "
|
|
19
|
-
import type { PRD, UserStory } from "
|
|
20
|
-
import { runPrecheck } from "
|
|
21
|
-
import type { PrecheckResult } from "
|
|
19
|
+
import type { NaxConfig } from "../../../src/config";
|
|
20
|
+
import type { PRD, UserStory } from "../../../src/prd/types";
|
|
21
|
+
import { runPrecheck } from "../../../src/precheck";
|
|
22
|
+
import type { PrecheckResult } from "../../../src/precheck/types";
|
|
22
23
|
|
|
23
24
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
24
25
|
// Test fixtures
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// RE-ARCH: keep
|
|
1
2
|
/**
|
|
2
3
|
* Config Loader Tests
|
|
3
4
|
*
|
|
@@ -18,7 +19,7 @@ import { existsSync, renameSync } from "node:fs";
|
|
|
18
19
|
import { tmpdir } from "node:os";
|
|
19
20
|
import { homedir } from "node:os";
|
|
20
21
|
import { join } from "node:path";
|
|
21
|
-
import { globalConfigPath, loadConfig } from "
|
|
22
|
+
import { globalConfigPath, loadConfig } from "../../../src/config/loader";
|
|
22
23
|
|
|
23
24
|
describe("Config Loader - Backward Compatibility", () => {
|
|
24
25
|
let tempDir: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { DEFAULT_CONFIG, NaxConfigSchema } from "
|
|
3
|
-
import type { TddStrategy, TestStrategy } from "
|
|
2
|
+
import { DEFAULT_CONFIG, NaxConfigSchema } from "../../../src/config/schema";
|
|
3
|
+
import type { TddStrategy, TestStrategy } from "../../../src/config/schema";
|
|
4
4
|
|
|
5
5
|
describe("Config Validation", () => {
|
|
6
6
|
test("accepts valid default config", () => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, test, beforeEach, afterEach } from "bun:test";
|
|
2
|
-
import { loadPlugins, _setPluginErrorSink, _resetPluginErrorSink } from "
|
|
3
|
-
import { loadCustomStrategy } from "
|
|
2
|
+
import { loadPlugins, _setPluginErrorSink, _resetPluginErrorSink } from "../../../src/plugins/loader";
|
|
3
|
+
import { loadCustomStrategy } from "../../../src/routing/loader";
|
|
4
4
|
import { resolve } from "node:path";
|
|
5
5
|
import * as fs from "node:fs/promises";
|
|
6
6
|
|
package/test/integration/{context-integration.test.ts → context/context-integration.test.ts}
RENAMED
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
// RE-ARCH: keep
|
|
1
2
|
/**
|
|
2
3
|
* Integration tests for context builder with execution runner
|
|
3
4
|
*/
|
|
4
5
|
|
|
5
6
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
6
|
-
import { DEFAULT_CONFIG } from "
|
|
7
|
-
import { buildContext, formatContextAsMarkdown } from "
|
|
8
|
-
import type { ContextBudget, StoryContext } from "
|
|
9
|
-
import { run } from "
|
|
10
|
-
import type { RunOptions } from "
|
|
11
|
-
import type { PRD, UserStory } from "
|
|
7
|
+
import { DEFAULT_CONFIG } from "../../../src/config";
|
|
8
|
+
import { buildContext, formatContextAsMarkdown } from "../../../src/context/builder";
|
|
9
|
+
import type { ContextBudget, StoryContext } from "../../../src/context/types";
|
|
10
|
+
import { run } from "../../../src/execution/runner";
|
|
11
|
+
import type { RunOptions } from "../../../src/execution/runner";
|
|
12
|
+
import type { PRD, UserStory } from "../../../src/prd";
|
|
12
13
|
|
|
13
14
|
// Sample PRD for testing
|
|
14
15
|
const createTestPRD = (stories: Partial<UserStory>[]): PRD => ({
|
|
@@ -2,8 +2,8 @@ import { afterAll, beforeAll, describe, expect, test } from "bun:test";
|
|
|
2
2
|
import { existsSync, mkdirSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
import { MAX_DIRECTORY_DEPTH, isWithinDirectory, validateDirectory, validateFilePath } from "
|
|
6
|
-
import { findProjectDir } from "
|
|
5
|
+
import { MAX_DIRECTORY_DEPTH, isWithinDirectory, validateDirectory, validateFilePath } from "../../../src/config";
|
|
6
|
+
import { findProjectDir } from "../../../src/config/loader";
|
|
7
7
|
|
|
8
8
|
// Create a temporary test directory
|
|
9
9
|
const testRoot = join(tmpdir(), `nax-path-test-${Date.now()}`);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// RE-ARCH: keep
|
|
1
2
|
/**
|
|
2
3
|
* Context Provider Injection Tests (US-002)
|
|
3
4
|
*
|
|
@@ -7,12 +8,12 @@
|
|
|
7
8
|
*/
|
|
8
9
|
|
|
9
10
|
import { afterEach, beforeEach, describe, expect, mock, test } from "bun:test";
|
|
10
|
-
import { DEFAULT_CONFIG } from "
|
|
11
|
-
import { contextStage } from "
|
|
12
|
-
import type { PipelineContext } from "
|
|
13
|
-
import { PluginRegistry } from "
|
|
14
|
-
import type { IContextProvider, NaxPlugin } from "
|
|
15
|
-
import type { PRD, UserStory } from "
|
|
11
|
+
import { DEFAULT_CONFIG } from "../../../src/config/schema";
|
|
12
|
+
import { contextStage } from "../../../src/pipeline/stages/context";
|
|
13
|
+
import type { PipelineContext } from "../../../src/pipeline/types";
|
|
14
|
+
import { PluginRegistry } from "../../../src/plugins/registry";
|
|
15
|
+
import type { IContextProvider, NaxPlugin } from "../../../src/plugins/types";
|
|
16
|
+
import type { PRD, UserStory } from "../../../src/prd/types";
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* Create a minimal test context for context stage testing
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// RE-ARCH: keep
|
|
1
2
|
/**
|
|
2
3
|
* Integration tests for contextFiles/expectedFiles split
|
|
3
4
|
* Verifies that context builder and verification use the correct resolvers
|
|
@@ -7,10 +8,10 @@ import { describe, expect, test } from "bun:test";
|
|
|
7
8
|
import fs from "node:fs/promises";
|
|
8
9
|
import os from "node:os";
|
|
9
10
|
import path from "node:path";
|
|
10
|
-
import { buildContext } from "
|
|
11
|
-
import type { ContextBudget, StoryContext } from "
|
|
12
|
-
import { getContextFiles, getExpectedFiles } from "
|
|
13
|
-
import type { PRD, UserStory } from "
|
|
11
|
+
import { buildContext } from "../../../src/context/builder";
|
|
12
|
+
import type { ContextBudget, StoryContext } from "../../../src/context/types";
|
|
13
|
+
import { getContextFiles, getExpectedFiles } from "../../../src/prd";
|
|
14
|
+
import type { PRD, UserStory } from "../../../src/prd";
|
|
14
15
|
|
|
15
16
|
const createTestPRD = (stories: Partial<UserStory>[]): PRD => ({
|
|
16
17
|
project: "test-project",
|
package/test/integration/{s5-greenfield-fallback.test.ts → context/s5-greenfield-fallback.test.ts}
RENAMED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// RE-ARCH: keep
|
|
1
2
|
/**
|
|
2
3
|
* S5: Strategy Fallback Tests
|
|
3
4
|
*
|
|
@@ -8,9 +9,9 @@
|
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
import { describe, expect, test } from "bun:test";
|
|
11
|
-
import { resolveMaxAttemptsOutcome } from "
|
|
12
|
-
import type { UserStory } from "
|
|
13
|
-
import type { FailureCategory } from "
|
|
12
|
+
import { resolveMaxAttemptsOutcome } from "../../../src/execution/runner";
|
|
13
|
+
import type { UserStory } from "../../../src/prd";
|
|
14
|
+
import type { FailureCategory } from "../../../src/tdd/types";
|
|
14
15
|
|
|
15
16
|
describe("S5: greenfield-no-tests fallback", () => {
|
|
16
17
|
/**
|
|
@@ -3,7 +3,7 @@ import { execSync } from "node:child_process";
|
|
|
3
3
|
import { mkdtempSync, rmSync } from "node:fs";
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { join } from "node:path";
|
|
6
|
-
import { isSourceFile, isTestFile, verifyTestWriterIsolation } from "
|
|
6
|
+
import { isSourceFile, isTestFile, verifyTestWriterIsolation } from "../../../src/tdd";
|
|
7
7
|
|
|
8
8
|
describe("isTestFile", () => {
|
|
9
9
|
test("matches test/ directory", () => {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
2
|
-
import { DEFAULT_CONFIG } from "
|
|
3
|
-
import { run } from "
|
|
4
|
-
import type { RunOptions } from "
|
|
5
|
-
import { initLogger, resetLogger } from "
|
|
6
|
-
import type { PRD, UserStory } from "
|
|
2
|
+
import { DEFAULT_CONFIG } from "../../../src/config";
|
|
3
|
+
import { run } from "../../../src/execution/runner";
|
|
4
|
+
import type { RunOptions } from "../../../src/execution/runner";
|
|
5
|
+
import { initLogger, resetLogger } from "../../../src/logger";
|
|
6
|
+
import type { PRD, UserStory } from "../../../src/prd";
|
|
7
7
|
|
|
8
8
|
// Sample PRD for testing
|
|
9
9
|
const createTestPRD = (stories: Partial<UserStory>[]): PRD => ({
|
|
@@ -521,7 +521,7 @@ describe("execution runner — lite mode routing", () => {
|
|
|
521
521
|
|
|
522
522
|
test("config tdd.strategy='lite' routes complex stories to three-session-tdd-lite", async () => {
|
|
523
523
|
// Using routeTask directly to verify routing decision
|
|
524
|
-
const { routeTask } = await import("
|
|
524
|
+
const { routeTask } = await import("../../../src/routing");
|
|
525
525
|
|
|
526
526
|
const configWithLiteStrategy = {
|
|
527
527
|
...DEFAULT_CONFIG,
|
|
@@ -541,7 +541,7 @@ describe("execution runner — lite mode routing", () => {
|
|
|
541
541
|
});
|
|
542
542
|
|
|
543
543
|
test("config tdd.strategy='strict' routes complex stories to three-session-tdd", async () => {
|
|
544
|
-
const { routeTask } = await import("
|
|
544
|
+
const { routeTask } = await import("../../../src/routing");
|
|
545
545
|
|
|
546
546
|
const configWithStrictStrategy = {
|
|
547
547
|
...DEFAULT_CONFIG,
|
|
@@ -561,7 +561,7 @@ describe("execution runner — lite mode routing", () => {
|
|
|
561
561
|
});
|
|
562
562
|
|
|
563
563
|
test("config tdd.strategy='auto' routes complex UI-tagged stories to three-session-tdd-lite", async () => {
|
|
564
|
-
const { routeTask } = await import("
|
|
564
|
+
const { routeTask } = await import("../../../src/routing");
|
|
565
565
|
|
|
566
566
|
// With auto strategy + ui tag + complex story → three-session-tdd-lite
|
|
567
567
|
// (T3: complex/expert with lite tags → three-session-tdd-lite)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// RE-ARCH: keep
|
|
1
2
|
/**
|
|
2
3
|
* Parallel Execution Tests
|
|
3
4
|
*
|
|
@@ -9,7 +10,7 @@
|
|
|
9
10
|
*/
|
|
10
11
|
|
|
11
12
|
import { describe, expect, test } from "bun:test";
|
|
12
|
-
import type { UserStory } from "
|
|
13
|
+
import type { UserStory } from "../../../src/prd/types";
|
|
13
14
|
|
|
14
15
|
describe("Parallel Execution", () => {
|
|
15
16
|
describe("Story Grouping", () => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { countStories, generateHumanHaltSummary, getNextStory, isStalled, markStoryPaused } from "
|
|
3
|
-
import type { PRD } from "
|
|
2
|
+
import { countStories, generateHumanHaltSummary, getNextStory, isStalled, markStoryPaused } from "../../../src/prd";
|
|
3
|
+
import type { PRD } from "../../../src/prd/types";
|
|
4
4
|
|
|
5
5
|
describe("PRD pause functionality", () => {
|
|
6
6
|
const createTestPRD = (): PRD => ({
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
// RE-ARCH: keep
|
|
1
2
|
/**
|
|
2
3
|
* Tests for PRD resolver functions: getContextFiles and getExpectedFiles
|
|
3
4
|
*/
|
|
4
5
|
|
|
5
6
|
import { describe, expect, test } from "bun:test";
|
|
6
|
-
import { getContextFiles, getExpectedFiles } from "
|
|
7
|
-
import type { UserStory } from "
|
|
7
|
+
import { getContextFiles, getExpectedFiles } from "../../../src/prd";
|
|
8
|
+
import type { UserStory } from "../../../src/prd";
|
|
8
9
|
|
|
9
10
|
const createStory = (partial: Partial<UserStory>): UserStory => ({
|
|
10
11
|
id: "US-001",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import { appendProgress } from "
|
|
2
|
+
import { appendProgress } from "../../../src/execution/progress";
|
|
3
3
|
|
|
4
4
|
describe("appendProgress", () => {
|
|
5
5
|
test("creates progress.txt and appends entry", async () => {
|