@nathapp/nax 0.50.3 → 0.51.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 +30 -0
- package/dist/nax.js +393 -197
- package/package.json +1 -3
- package/bin/nax.ts +0 -1195
- package/src/acceptance/fix-generator.ts +0 -322
- package/src/acceptance/generator.ts +0 -415
- package/src/acceptance/index.ts +0 -42
- package/src/acceptance/refinement.ts +0 -224
- package/src/acceptance/templates/cli.ts +0 -47
- package/src/acceptance/templates/component.ts +0 -78
- package/src/acceptance/templates/e2e.ts +0 -43
- package/src/acceptance/templates/index.ts +0 -21
- package/src/acceptance/templates/snapshot.ts +0 -50
- package/src/acceptance/templates/unit.ts +0 -48
- package/src/acceptance/types.ts +0 -138
- package/src/agents/acp/adapter.ts +0 -888
- package/src/agents/acp/cost.ts +0 -9
- package/src/agents/acp/index.ts +0 -7
- package/src/agents/acp/interaction-bridge.ts +0 -126
- package/src/agents/acp/parser.ts +0 -119
- package/src/agents/acp/spawn-client.ts +0 -373
- package/src/agents/acp/types.ts +0 -22
- package/src/agents/aider/adapter.ts +0 -135
- package/src/agents/claude/adapter.ts +0 -258
- package/src/agents/claude/complete.ts +0 -80
- package/src/agents/claude/cost.ts +0 -16
- package/src/agents/claude/execution.ts +0 -215
- package/src/agents/claude/index.ts +0 -3
- package/src/agents/claude/interactive.ts +0 -77
- package/src/agents/claude/plan.ts +0 -179
- package/src/agents/codex/adapter.ts +0 -153
- package/src/agents/cost/calculate.ts +0 -154
- package/src/agents/cost/index.ts +0 -10
- package/src/agents/cost/parse.ts +0 -97
- package/src/agents/cost/pricing.ts +0 -59
- package/src/agents/cost/types.ts +0 -45
- package/src/agents/gemini/adapter.ts +0 -177
- package/src/agents/index.ts +0 -18
- package/src/agents/opencode/adapter.ts +0 -106
- package/src/agents/registry.ts +0 -136
- package/src/agents/shared/decompose.ts +0 -154
- package/src/agents/shared/model-resolution.ts +0 -43
- package/src/agents/shared/types-extended.ts +0 -164
- package/src/agents/shared/validation.ts +0 -69
- package/src/agents/shared/version-detection.ts +0 -109
- package/src/agents/types.ts +0 -205
- package/src/analyze/classifier.ts +0 -282
- package/src/analyze/index.ts +0 -16
- package/src/analyze/scanner.ts +0 -171
- package/src/analyze/types.ts +0 -51
- package/src/cli/accept.ts +0 -108
- package/src/cli/agents.ts +0 -87
- package/src/cli/analyze-parser.ts +0 -291
- package/src/cli/analyze.ts +0 -352
- package/src/cli/config-descriptions.ts +0 -219
- package/src/cli/config-diff.ts +0 -103
- package/src/cli/config-display.ts +0 -285
- package/src/cli/config-get.ts +0 -55
- package/src/cli/config.ts +0 -14
- package/src/cli/constitution.ts +0 -17
- package/src/cli/diagnose-analysis.ts +0 -159
- package/src/cli/diagnose-formatter.ts +0 -87
- package/src/cli/diagnose.ts +0 -203
- package/src/cli/generate.ts +0 -250
- package/src/cli/index.ts +0 -42
- package/src/cli/init-context.ts +0 -405
- package/src/cli/init-detect.ts +0 -303
- package/src/cli/init.ts +0 -296
- package/src/cli/interact.ts +0 -295
- package/src/cli/plan.ts +0 -509
- package/src/cli/plugins.ts +0 -122
- package/src/cli/prompts-export.ts +0 -58
- package/src/cli/prompts-init.ts +0 -200
- package/src/cli/prompts-main.ts +0 -183
- package/src/cli/prompts-shared.ts +0 -70
- package/src/cli/prompts-tdd.ts +0 -88
- package/src/cli/prompts.ts +0 -17
- package/src/cli/runs.ts +0 -174
- package/src/cli/status-cost.ts +0 -151
- package/src/cli/status-features.ts +0 -405
- package/src/cli/status.ts +0 -13
- package/src/commands/common.ts +0 -171
- package/src/commands/diagnose.ts +0 -17
- package/src/commands/index.ts +0 -9
- package/src/commands/logs-formatter.ts +0 -201
- package/src/commands/logs-reader.ts +0 -171
- package/src/commands/logs.ts +0 -103
- package/src/commands/precheck.ts +0 -86
- package/src/commands/runs.ts +0 -220
- package/src/commands/unlock.ts +0 -96
- package/src/config/defaults.ts +0 -218
- package/src/config/index.ts +0 -22
- package/src/config/loader.ts +0 -143
- package/src/config/merge.ts +0 -106
- package/src/config/merger.ts +0 -147
- package/src/config/path-security.ts +0 -121
- package/src/config/paths.ts +0 -27
- package/src/config/permissions.ts +0 -63
- package/src/config/runtime-types.ts +0 -522
- package/src/config/schema-types.ts +0 -53
- package/src/config/schema.ts +0 -60
- package/src/config/schemas.ts +0 -426
- package/src/config/test-strategy.ts +0 -71
- package/src/config/types.ts +0 -57
- package/src/config/validate.ts +0 -103
- package/src/constitution/generator.ts +0 -158
- package/src/constitution/generators/aider.ts +0 -41
- package/src/constitution/generators/claude.ts +0 -35
- package/src/constitution/generators/cursor.ts +0 -36
- package/src/constitution/generators/opencode.ts +0 -38
- package/src/constitution/generators/types.ts +0 -33
- package/src/constitution/generators/windsurf.ts +0 -36
- package/src/constitution/index.ts +0 -11
- package/src/constitution/loader.ts +0 -121
- package/src/constitution/types.ts +0 -31
- package/src/context/auto-detect.ts +0 -228
- package/src/context/builder.ts +0 -299
- package/src/context/elements.ts +0 -122
- package/src/context/formatter.ts +0 -107
- package/src/context/generator.ts +0 -343
- package/src/context/generators/aider.ts +0 -34
- package/src/context/generators/claude.ts +0 -28
- package/src/context/generators/codex.ts +0 -28
- package/src/context/generators/cursor.ts +0 -28
- package/src/context/generators/gemini.ts +0 -28
- package/src/context/generators/opencode.ts +0 -30
- package/src/context/generators/windsurf.ts +0 -28
- package/src/context/greenfield.ts +0 -114
- package/src/context/index.ts +0 -34
- package/src/context/injector.ts +0 -279
- package/src/context/parent-context.ts +0 -39
- package/src/context/test-scanner.ts +0 -370
- package/src/context/types.ts +0 -98
- package/src/decompose/apply.ts +0 -50
- package/src/decompose/builder.ts +0 -181
- package/src/decompose/index.ts +0 -8
- package/src/decompose/sections/codebase.ts +0 -26
- package/src/decompose/sections/constraints.ts +0 -32
- package/src/decompose/sections/index.ts +0 -4
- package/src/decompose/sections/sibling-stories.ts +0 -25
- package/src/decompose/sections/target-story.ts +0 -31
- package/src/decompose/types.ts +0 -55
- package/src/decompose/validators/complexity.ts +0 -45
- package/src/decompose/validators/coverage.ts +0 -134
- package/src/decompose/validators/dependency.ts +0 -91
- package/src/decompose/validators/index.ts +0 -35
- package/src/decompose/validators/overlap.ts +0 -128
- package/src/errors.ts +0 -67
- package/src/execution/batching.ts +0 -157
- package/src/execution/crash-heartbeat.ts +0 -77
- package/src/execution/crash-recovery.ts +0 -79
- package/src/execution/crash-signals.ts +0 -165
- package/src/execution/crash-writer.ts +0 -154
- package/src/execution/deferred-review.ts +0 -105
- package/src/execution/dry-run.ts +0 -81
- package/src/execution/escalation/escalation.ts +0 -46
- package/src/execution/escalation/index.ts +0 -13
- package/src/execution/escalation/tier-escalation.ts +0 -346
- package/src/execution/escalation/tier-outcome.ts +0 -143
- package/src/execution/executor-types.ts +0 -73
- package/src/execution/helpers.ts +0 -38
- package/src/execution/index.ts +0 -27
- package/src/execution/iteration-runner.ts +0 -160
- package/src/execution/lifecycle/acceptance-loop.ts +0 -309
- package/src/execution/lifecycle/headless-formatter.ts +0 -83
- package/src/execution/lifecycle/index.ts +0 -11
- package/src/execution/lifecycle/parallel-lifecycle.ts +0 -101
- package/src/execution/lifecycle/precheck-runner.ts +0 -140
- package/src/execution/lifecycle/run-cleanup.ts +0 -81
- package/src/execution/lifecycle/run-completion.ts +0 -247
- package/src/execution/lifecycle/run-initialization.ts +0 -187
- package/src/execution/lifecycle/run-regression.ts +0 -305
- package/src/execution/lifecycle/run-setup.ts +0 -240
- package/src/execution/lifecycle/story-size-prompts.ts +0 -123
- package/src/execution/lock.ts +0 -129
- package/src/execution/parallel-coordinator.ts +0 -281
- package/src/execution/parallel-executor-rectification-pass.ts +0 -117
- package/src/execution/parallel-executor-rectify.ts +0 -136
- package/src/execution/parallel-executor.ts +0 -330
- package/src/execution/parallel-worker.ts +0 -149
- package/src/execution/parallel.ts +0 -13
- package/src/execution/pid-registry.ts +0 -275
- package/src/execution/pipeline-result-handler.ts +0 -221
- package/src/execution/progress.ts +0 -27
- package/src/execution/queue-handler.ts +0 -109
- package/src/execution/runner-completion.ts +0 -171
- package/src/execution/runner-execution.ts +0 -243
- package/src/execution/runner-setup.ts +0 -86
- package/src/execution/runner.ts +0 -265
- package/src/execution/sequential-executor.ts +0 -219
- package/src/execution/status-file.ts +0 -264
- package/src/execution/status-writer.ts +0 -181
- package/src/execution/story-context.ts +0 -266
- package/src/execution/story-selector.ts +0 -76
- package/src/execution/test-output-parser.ts +0 -14
- package/src/execution/timeout-handler.ts +0 -100
- package/src/hooks/index.ts +0 -2
- package/src/hooks/runner.ts +0 -280
- package/src/hooks/types.ts +0 -79
- package/src/interaction/chain.ts +0 -170
- package/src/interaction/index.ts +0 -61
- package/src/interaction/init.ts +0 -84
- package/src/interaction/plugins/auto.ts +0 -243
- package/src/interaction/plugins/cli.ts +0 -300
- package/src/interaction/plugins/telegram.ts +0 -384
- package/src/interaction/plugins/webhook.ts +0 -286
- package/src/interaction/state.ts +0 -171
- package/src/interaction/triggers.ts +0 -250
- package/src/interaction/types.ts +0 -170
- package/src/logger/formatters.ts +0 -84
- package/src/logger/index.ts +0 -16
- package/src/logger/logger.ts +0 -296
- package/src/logger/types.ts +0 -48
- package/src/logging/formatter.ts +0 -355
- package/src/logging/index.ts +0 -22
- package/src/logging/types.ts +0 -93
- package/src/metrics/aggregator.ts +0 -191
- package/src/metrics/index.ts +0 -14
- package/src/metrics/tracker.ts +0 -200
- package/src/metrics/types.ts +0 -115
- package/src/optimizer/index.ts +0 -63
- package/src/optimizer/noop.optimizer.ts +0 -24
- package/src/optimizer/rule-based.optimizer.ts +0 -248
- package/src/optimizer/types.ts +0 -53
- package/src/pipeline/event-bus.ts +0 -297
- package/src/pipeline/events.ts +0 -130
- package/src/pipeline/index.ts +0 -19
- package/src/pipeline/runner.ts +0 -149
- package/src/pipeline/stages/acceptance-setup.ts +0 -144
- package/src/pipeline/stages/acceptance.ts +0 -215
- package/src/pipeline/stages/autofix.ts +0 -262
- package/src/pipeline/stages/completion.ts +0 -110
- package/src/pipeline/stages/constitution.ts +0 -63
- package/src/pipeline/stages/context.ts +0 -122
- package/src/pipeline/stages/execution.ts +0 -359
- package/src/pipeline/stages/index.ts +0 -86
- package/src/pipeline/stages/optimizer.ts +0 -74
- package/src/pipeline/stages/prompt.ts +0 -79
- package/src/pipeline/stages/queue-check.ts +0 -103
- package/src/pipeline/stages/rectify.ts +0 -101
- package/src/pipeline/stages/regression.ts +0 -99
- package/src/pipeline/stages/review.ts +0 -94
- package/src/pipeline/stages/routing.ts +0 -276
- package/src/pipeline/stages/verify.ts +0 -286
- package/src/pipeline/subscribers/events-writer.ts +0 -135
- package/src/pipeline/subscribers/hooks.ts +0 -179
- package/src/pipeline/subscribers/interaction.ts +0 -103
- package/src/pipeline/subscribers/registry.ts +0 -73
- package/src/pipeline/subscribers/reporters.ts +0 -174
- package/src/pipeline/types.ts +0 -220
- package/src/plugins/extensions.ts +0 -225
- package/src/plugins/index.ts +0 -33
- package/src/plugins/loader.ts +0 -352
- package/src/plugins/plugin-logger.ts +0 -41
- package/src/plugins/registry.ts +0 -168
- package/src/plugins/types.ts +0 -206
- package/src/plugins/validator.ts +0 -352
- package/src/prd/index.ts +0 -220
- package/src/prd/schema.ts +0 -268
- package/src/prd/types.ts +0 -273
- package/src/prd/validate.ts +0 -41
- package/src/precheck/checks-agents.ts +0 -63
- package/src/precheck/checks-blockers.ts +0 -23
- package/src/precheck/checks-cli.ts +0 -68
- package/src/precheck/checks-config.ts +0 -102
- package/src/precheck/checks-git.ts +0 -117
- package/src/precheck/checks-system.ts +0 -101
- package/src/precheck/checks-warnings.ts +0 -221
- package/src/precheck/checks.ts +0 -36
- package/src/precheck/index.ts +0 -374
- package/src/precheck/story-size-gate.ts +0 -144
- package/src/precheck/types.ts +0 -31
- package/src/prompts/builder.ts +0 -166
- package/src/prompts/index.ts +0 -2
- package/src/prompts/loader.ts +0 -43
- package/src/prompts/sections/conventions.ts +0 -19
- package/src/prompts/sections/hermetic.ts +0 -41
- package/src/prompts/sections/index.ts +0 -12
- package/src/prompts/sections/isolation.ts +0 -70
- package/src/prompts/sections/role-task.ts +0 -182
- package/src/prompts/sections/story.ts +0 -55
- package/src/prompts/sections/verdict.ts +0 -70
- package/src/prompts/types.ts +0 -21
- package/src/queue/index.ts +0 -2
- package/src/queue/manager.ts +0 -254
- package/src/queue/types.ts +0 -54
- package/src/review/index.ts +0 -8
- package/src/review/orchestrator.ts +0 -154
- package/src/review/runner.ts +0 -303
- package/src/review/types.ts +0 -70
- package/src/routing/batch-route.ts +0 -35
- package/src/routing/builder.ts +0 -81
- package/src/routing/chain.ts +0 -75
- package/src/routing/content-hash.ts +0 -25
- package/src/routing/index.ts +0 -20
- package/src/routing/loader.ts +0 -62
- package/src/routing/router.ts +0 -305
- package/src/routing/strategies/adaptive.ts +0 -215
- package/src/routing/strategies/index.ts +0 -8
- package/src/routing/strategies/keyword.ts +0 -180
- package/src/routing/strategies/llm-prompts.ts +0 -224
- package/src/routing/strategies/llm.ts +0 -320
- package/src/routing/strategies/manual.ts +0 -50
- package/src/routing/strategy.ts +0 -102
- package/src/tdd/cleanup.ts +0 -120
- package/src/tdd/index.ts +0 -22
- package/src/tdd/isolation.ts +0 -117
- package/src/tdd/orchestrator.ts +0 -406
- package/src/tdd/prompts.ts +0 -40
- package/src/tdd/rectification-gate.ts +0 -274
- package/src/tdd/session-runner.ts +0 -263
- package/src/tdd/types.ts +0 -84
- package/src/tdd/verdict-reader.ts +0 -266
- package/src/tdd/verdict.ts +0 -152
- package/src/tui/App.tsx +0 -265
- package/src/tui/components/AgentPanel.tsx +0 -75
- package/src/tui/components/CostOverlay.tsx +0 -118
- package/src/tui/components/HelpOverlay.tsx +0 -107
- package/src/tui/components/StatusBar.tsx +0 -63
- package/src/tui/components/StoriesPanel.tsx +0 -177
- package/src/tui/hooks/useKeyboard.ts +0 -142
- package/src/tui/hooks/useLayout.ts +0 -137
- package/src/tui/hooks/usePipelineEvents.ts +0 -183
- package/src/tui/hooks/usePty.ts +0 -189
- package/src/tui/index.tsx +0 -38
- package/src/tui/types.ts +0 -76
- package/src/utils/errors.ts +0 -12
- package/src/utils/git.ts +0 -245
- package/src/utils/json-file.ts +0 -72
- package/src/utils/log-test-output.ts +0 -25
- package/src/utils/path-security.ts +0 -73
- package/src/utils/queue-writer.ts +0 -54
- package/src/verification/crash-detector.ts +0 -34
- package/src/verification/executor.ts +0 -250
- package/src/verification/index.ts +0 -12
- package/src/verification/orchestrator-types.ts +0 -154
- package/src/verification/orchestrator.ts +0 -76
- package/src/verification/parser.ts +0 -220
- package/src/verification/rectification-loop.ts +0 -172
- package/src/verification/rectification.ts +0 -108
- package/src/verification/runners.ts +0 -129
- package/src/verification/smart-runner.ts +0 -307
- package/src/verification/strategies/acceptance.ts +0 -136
- package/src/verification/strategies/regression.ts +0 -90
- package/src/verification/strategies/scoped.ts +0 -154
- package/src/verification/types.ts +0 -117
- package/src/version.ts +0 -40
- package/src/worktree/dispatcher.ts +0 -6
- package/src/worktree/index.ts +0 -2
- package/src/worktree/manager.ts +0 -193
- package/src/worktree/merge.ts +0 -302
- package/src/worktree/types.ts +0 -4
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tier Escalation Outcome Handlers
|
|
3
|
-
*
|
|
4
|
-
* Extracted from tier-escalation.ts: handles outcomes when escalation
|
|
5
|
-
* is not possible (no tier available or max attempts reached).
|
|
6
|
-
*
|
|
7
|
-
* Phase 3 (ADR-005): Replaced direct fireHook() calls with event bus emissions.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { getSafeLogger } from "../../logger";
|
|
11
|
-
import { pipelineEventBus } from "../../pipeline/event-bus";
|
|
12
|
-
import { markStoryFailed, markStoryPaused, savePRD } from "../../prd";
|
|
13
|
-
import type { FailureCategory } from "../../tdd/types";
|
|
14
|
-
import { appendProgress } from "../progress";
|
|
15
|
-
import type { EscalationHandlerContext, EscalationHandlerResult } from "./tier-escalation";
|
|
16
|
-
import { resolveMaxAttemptsOutcome } from "./tier-escalation";
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Handle case when no tier is available for escalation
|
|
20
|
-
*/
|
|
21
|
-
export async function handleNoTierAvailable(
|
|
22
|
-
ctx: EscalationHandlerContext,
|
|
23
|
-
failureCategory?: FailureCategory,
|
|
24
|
-
): Promise<EscalationHandlerResult> {
|
|
25
|
-
const logger = getSafeLogger();
|
|
26
|
-
const outcome = resolveMaxAttemptsOutcome(failureCategory);
|
|
27
|
-
|
|
28
|
-
if (outcome === "pause") {
|
|
29
|
-
const pausedPrd = { ...ctx.prd };
|
|
30
|
-
markStoryPaused(pausedPrd, ctx.story.id);
|
|
31
|
-
await savePRD(pausedPrd, ctx.prdPath);
|
|
32
|
-
|
|
33
|
-
logger?.warn("execution", "Story paused - no tier available (needs human review)", {
|
|
34
|
-
storyId: ctx.story.id,
|
|
35
|
-
failureCategory,
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
if (ctx.featureDir) {
|
|
39
|
-
await appendProgress(
|
|
40
|
-
ctx.featureDir,
|
|
41
|
-
ctx.story.id,
|
|
42
|
-
"paused",
|
|
43
|
-
`${ctx.story.title} — Execution stopped (needs human review)`,
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
pipelineEventBus.emit({
|
|
48
|
-
type: "story:paused",
|
|
49
|
-
storyId: ctx.story.id,
|
|
50
|
-
reason: `Execution stopped (${failureCategory ?? "unknown"} requires human review)`,
|
|
51
|
-
cost: ctx.totalCost,
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
return { outcome: "paused", prdDirty: true, prd: pausedPrd };
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Outcome is "fail"
|
|
58
|
-
const failedPrd = { ...ctx.prd };
|
|
59
|
-
markStoryFailed(failedPrd, ctx.story.id, failureCategory, undefined);
|
|
60
|
-
await savePRD(failedPrd, ctx.prdPath);
|
|
61
|
-
|
|
62
|
-
logger?.error("execution", "Story failed - execution failed", {
|
|
63
|
-
storyId: ctx.story.id,
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
if (ctx.featureDir) {
|
|
67
|
-
await appendProgress(ctx.featureDir, ctx.story.id, "failed", `${ctx.story.title} — Execution failed`);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
pipelineEventBus.emit({
|
|
71
|
-
type: "story:failed",
|
|
72
|
-
storyId: ctx.story.id,
|
|
73
|
-
story: ctx.story,
|
|
74
|
-
reason: "Execution failed",
|
|
75
|
-
countsTowardEscalation: true,
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
return { outcome: "failed", prdDirty: true, prd: failedPrd };
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Handle case when max attempts are reached
|
|
83
|
-
*/
|
|
84
|
-
export async function handleMaxAttemptsReached(
|
|
85
|
-
ctx: EscalationHandlerContext,
|
|
86
|
-
failureCategory?: FailureCategory,
|
|
87
|
-
): Promise<EscalationHandlerResult> {
|
|
88
|
-
const logger = getSafeLogger();
|
|
89
|
-
const outcome = resolveMaxAttemptsOutcome(failureCategory);
|
|
90
|
-
|
|
91
|
-
if (outcome === "pause") {
|
|
92
|
-
const pausedPrd = { ...ctx.prd };
|
|
93
|
-
markStoryPaused(pausedPrd, ctx.story.id);
|
|
94
|
-
await savePRD(pausedPrd, ctx.prdPath);
|
|
95
|
-
|
|
96
|
-
logger?.warn("execution", "Story paused - max attempts reached (needs human review)", {
|
|
97
|
-
storyId: ctx.story.id,
|
|
98
|
-
failureCategory,
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
if (ctx.featureDir) {
|
|
102
|
-
await appendProgress(
|
|
103
|
-
ctx.featureDir,
|
|
104
|
-
ctx.story.id,
|
|
105
|
-
"paused",
|
|
106
|
-
`${ctx.story.title} — Max attempts reached (needs human review)`,
|
|
107
|
-
);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
pipelineEventBus.emit({
|
|
111
|
-
type: "story:paused",
|
|
112
|
-
storyId: ctx.story.id,
|
|
113
|
-
reason: `Max attempts reached (${failureCategory ?? "unknown"} requires human review)`,
|
|
114
|
-
cost: ctx.totalCost,
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
return { outcome: "paused", prdDirty: true, prd: pausedPrd };
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Outcome is "fail"
|
|
121
|
-
const failedPrd = { ...ctx.prd };
|
|
122
|
-
markStoryFailed(failedPrd, ctx.story.id, failureCategory, undefined);
|
|
123
|
-
await savePRD(failedPrd, ctx.prdPath);
|
|
124
|
-
|
|
125
|
-
logger?.error("execution", "Story failed - max attempts reached", {
|
|
126
|
-
storyId: ctx.story.id,
|
|
127
|
-
failureCategory,
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
if (ctx.featureDir) {
|
|
131
|
-
await appendProgress(ctx.featureDir, ctx.story.id, "failed", `${ctx.story.title} — Max attempts reached`);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
pipelineEventBus.emit({
|
|
135
|
-
type: "story:failed",
|
|
136
|
-
storyId: ctx.story.id,
|
|
137
|
-
story: ctx.story,
|
|
138
|
-
reason: "Max attempts reached",
|
|
139
|
-
countsTowardEscalation: true,
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
return { outcome: "failed", prdDirty: true, prd: failedPrd };
|
|
143
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sequential Executor Types (ADR-005, Phase 4)
|
|
3
|
-
*
|
|
4
|
-
* Extracted from sequential-executor.ts to slim it below 200 lines.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { NaxConfig } from "../config";
|
|
8
|
-
import type { LoadedHooksConfig } from "../hooks";
|
|
9
|
-
import type { InteractionChain } from "../interaction/chain";
|
|
10
|
-
import type { StoryMetrics } from "../metrics";
|
|
11
|
-
import type { PipelineEventEmitter } from "../pipeline/events";
|
|
12
|
-
import type { RoutingResult } from "../pipeline/types";
|
|
13
|
-
import type { AgentGetFn } from "../pipeline/types";
|
|
14
|
-
import type { PluginRegistry } from "../plugins";
|
|
15
|
-
import type { PRD, UserStory } from "../prd/types";
|
|
16
|
-
import type { StoryBatch } from "./batching";
|
|
17
|
-
import type { DeferredReviewResult } from "./deferred-review";
|
|
18
|
-
import type { PidRegistry } from "./pid-registry";
|
|
19
|
-
import type { StatusWriter } from "./status-writer";
|
|
20
|
-
|
|
21
|
-
export interface SequentialExecutionContext {
|
|
22
|
-
prdPath: string;
|
|
23
|
-
workdir: string;
|
|
24
|
-
config: NaxConfig;
|
|
25
|
-
hooks: LoadedHooksConfig;
|
|
26
|
-
feature: string;
|
|
27
|
-
featureDir?: string;
|
|
28
|
-
dryRun: boolean;
|
|
29
|
-
useBatch: boolean;
|
|
30
|
-
pluginRegistry: PluginRegistry;
|
|
31
|
-
eventEmitter?: PipelineEventEmitter;
|
|
32
|
-
statusWriter: StatusWriter;
|
|
33
|
-
logFilePath?: string;
|
|
34
|
-
runId: string;
|
|
35
|
-
startTime: number;
|
|
36
|
-
batchPlan: StoryBatch[];
|
|
37
|
-
interactionChain?: InteractionChain | null;
|
|
38
|
-
/** Protocol-aware agent resolver (ACP wiring). Falls back to standalone getAgent when absent. */
|
|
39
|
-
agentGetFn?: AgentGetFn;
|
|
40
|
-
/** PID registry for crash recovery — register child PIDs so they can be killed on SIGTERM. */
|
|
41
|
-
pidRegistry?: PidRegistry;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export interface SequentialExecutionResult {
|
|
45
|
-
prd: PRD;
|
|
46
|
-
iterations: number;
|
|
47
|
-
storiesCompleted: number;
|
|
48
|
-
totalCost: number;
|
|
49
|
-
allStoryMetrics: StoryMetrics[];
|
|
50
|
-
exitReason: "completed" | "cost-limit" | "max-iterations" | "stalled" | "no-stories" | "pre-merge-aborted";
|
|
51
|
-
deferredReview?: DeferredReviewResult;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Build a preview routing from cached story.routing or config defaults.
|
|
56
|
-
* The pipeline routing stage performs full classification and overwrites ctx.routing.
|
|
57
|
-
* This preview is used only for logging, status display, and event emission.
|
|
58
|
-
*/
|
|
59
|
-
export function buildPreviewRouting(story: UserStory, config: NaxConfig): RoutingResult {
|
|
60
|
-
const cached = story.routing;
|
|
61
|
-
const defaultComplexity = "medium" as const;
|
|
62
|
-
const defaultTier = "balanced" as const;
|
|
63
|
-
const defaultStrategy = "test-after" as const;
|
|
64
|
-
return {
|
|
65
|
-
complexity: (cached?.complexity as RoutingResult["complexity"]) ?? defaultComplexity,
|
|
66
|
-
modelTier:
|
|
67
|
-
(cached?.modelTier as RoutingResult["modelTier"]) ??
|
|
68
|
-
(config.autoMode.complexityRouting?.[defaultComplexity] as RoutingResult["modelTier"]) ??
|
|
69
|
-
defaultTier,
|
|
70
|
-
testStrategy: (cached?.testStrategy as RoutingResult["testStrategy"]) ?? defaultStrategy,
|
|
71
|
-
reasoning: cached ? "cached from story.routing" : "preview (pending pipeline routing stage)",
|
|
72
|
-
};
|
|
73
|
-
}
|
package/src/execution/helpers.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Execution Helper Functions
|
|
3
|
-
*
|
|
4
|
-
* Re-export barrel for backward compatibility.
|
|
5
|
-
* Story context: ./story-context
|
|
6
|
-
* Lock management: ./lock
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Error Handling Pattern for Ngent
|
|
11
|
-
*
|
|
12
|
-
* 1. Critical Errors (invalid config, missing required files, security violations):
|
|
13
|
-
* - Action: throw Error with descriptive message
|
|
14
|
-
*
|
|
15
|
-
* 2. Expected Conditions (no more stories, queue empty, optional feature unavailable):
|
|
16
|
-
* - Action: return null or undefined
|
|
17
|
-
*
|
|
18
|
-
* 3. Validation Issues (multiple collected errors, partial data problems):
|
|
19
|
-
* - Action: collect errors in array and return as { errors: string[] }
|
|
20
|
-
*
|
|
21
|
-
* 4. Non-Fatal Warnings (context build failures, optional file missing, rate limit):
|
|
22
|
-
* - Action: console.warn() + continue execution
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
// Story context building
|
|
26
|
-
export {
|
|
27
|
-
type ExecutionResult,
|
|
28
|
-
hookCtx,
|
|
29
|
-
maybeGetContext,
|
|
30
|
-
buildStoryContext,
|
|
31
|
-
buildStoryContextFull,
|
|
32
|
-
getAllReadyStories,
|
|
33
|
-
type StoryCounts,
|
|
34
|
-
formatProgress,
|
|
35
|
-
} from "./story-context";
|
|
36
|
-
|
|
37
|
-
// Lock management
|
|
38
|
-
export { acquireLock, releaseLock } from "./lock";
|
package/src/execution/index.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
export type { RunOptions, RunResult } from "./runner";
|
|
2
|
-
export { run } from "./runner";
|
|
3
|
-
export type { FailureCategory } from "../tdd/types";
|
|
4
|
-
export { appendProgress } from "./progress";
|
|
5
|
-
export { groupStoriesIntoBatches, type StoryBatch } from "./batching";
|
|
6
|
-
export { escalateTier, getTierConfig, calculateMaxIterations } from "./escalation";
|
|
7
|
-
export { readQueueFile, clearQueueFile } from "./queue-handler";
|
|
8
|
-
export {
|
|
9
|
-
hookCtx,
|
|
10
|
-
maybeGetContext,
|
|
11
|
-
buildStoryContext,
|
|
12
|
-
getAllReadyStories,
|
|
13
|
-
acquireLock,
|
|
14
|
-
releaseLock,
|
|
15
|
-
formatProgress,
|
|
16
|
-
type ExecutionResult,
|
|
17
|
-
type StoryCounts,
|
|
18
|
-
} from "./helpers";
|
|
19
|
-
export {
|
|
20
|
-
installCrashHandlers,
|
|
21
|
-
startHeartbeat,
|
|
22
|
-
stopHeartbeat,
|
|
23
|
-
writeExitSummary,
|
|
24
|
-
resetCrashHandlers,
|
|
25
|
-
type CrashRecoveryContext,
|
|
26
|
-
} from "./crash-recovery";
|
|
27
|
-
export { PidRegistry } from "./pid-registry";
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Iteration Runner (ADR-005, Phase 4)
|
|
3
|
-
*
|
|
4
|
-
* Runs a single story through the pipeline.
|
|
5
|
-
* Extracted from sequential-executor.ts to slim it below 120 lines.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { join } from "node:path";
|
|
9
|
-
import { loadConfigForWorkdir } from "../config/loader";
|
|
10
|
-
import { getSafeLogger } from "../logger";
|
|
11
|
-
import type { StoryMetrics } from "../metrics";
|
|
12
|
-
import { runPipeline } from "../pipeline/runner";
|
|
13
|
-
import type { PipelineRunResult } from "../pipeline/runner";
|
|
14
|
-
import { defaultPipeline } from "../pipeline/stages";
|
|
15
|
-
import type { PipelineContext } from "../pipeline/types";
|
|
16
|
-
import type { PRD } from "../prd/types";
|
|
17
|
-
import { captureGitRef } from "../utils/git";
|
|
18
|
-
import { handleDryRun } from "./dry-run";
|
|
19
|
-
import type { SequentialExecutionContext } from "./executor-types";
|
|
20
|
-
import { handlePipelineFailure, handlePipelineSuccess } from "./pipeline-result-handler";
|
|
21
|
-
import type { StorySelection } from "./story-selector";
|
|
22
|
-
|
|
23
|
-
export interface IterationResult {
|
|
24
|
-
prd: PRD;
|
|
25
|
-
storiesCompletedDelta: number;
|
|
26
|
-
costDelta: number;
|
|
27
|
-
prdDirty: boolean;
|
|
28
|
-
finalAction?: string;
|
|
29
|
-
reason?: string;
|
|
30
|
-
/** Set when finalAction === "decomposed" — number of sub-stories created */
|
|
31
|
-
subStoryCount?: number;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export async function runIteration(
|
|
35
|
-
ctx: SequentialExecutionContext,
|
|
36
|
-
prd: PRD,
|
|
37
|
-
selection: StorySelection,
|
|
38
|
-
iterations: number,
|
|
39
|
-
totalCost: number,
|
|
40
|
-
allStoryMetrics: StoryMetrics[],
|
|
41
|
-
): Promise<IterationResult> {
|
|
42
|
-
const logger = getSafeLogger();
|
|
43
|
-
const { story, storiesToExecute, routing, isBatchExecution } = selection;
|
|
44
|
-
|
|
45
|
-
if (ctx.dryRun) {
|
|
46
|
-
const dryRunResult = await handleDryRun({
|
|
47
|
-
prd,
|
|
48
|
-
prdPath: ctx.prdPath,
|
|
49
|
-
storiesToExecute,
|
|
50
|
-
routing,
|
|
51
|
-
statusWriter: ctx.statusWriter,
|
|
52
|
-
pluginRegistry: ctx.pluginRegistry,
|
|
53
|
-
runId: ctx.runId,
|
|
54
|
-
totalCost,
|
|
55
|
-
iterations,
|
|
56
|
-
});
|
|
57
|
-
return {
|
|
58
|
-
prd,
|
|
59
|
-
storiesCompletedDelta: dryRunResult.storiesCompletedDelta,
|
|
60
|
-
costDelta: 0,
|
|
61
|
-
prdDirty: dryRunResult.prdDirty,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const storyStartTime = Date.now();
|
|
66
|
-
const storyGitRef = await captureGitRef(ctx.workdir);
|
|
67
|
-
|
|
68
|
-
// BUG-067: Accumulate cost from all prior failed attempts (stored in priorFailures by handleTierEscalation)
|
|
69
|
-
const accumulatedAttemptCost = (story.priorFailures || []).reduce((sum, f) => sum + (f.cost || 0), 0);
|
|
70
|
-
|
|
71
|
-
// PKG-003: Resolve per-package effective config once per story (not per-stage)
|
|
72
|
-
const effectiveConfig = story.workdir
|
|
73
|
-
? await _iterationRunnerDeps.loadConfigForWorkdir(join(ctx.workdir, "nax", "config.json"), story.workdir)
|
|
74
|
-
: ctx.config;
|
|
75
|
-
|
|
76
|
-
const pipelineContext: PipelineContext = {
|
|
77
|
-
config: ctx.config,
|
|
78
|
-
effectiveConfig,
|
|
79
|
-
prd,
|
|
80
|
-
story,
|
|
81
|
-
stories: storiesToExecute,
|
|
82
|
-
routing,
|
|
83
|
-
workdir: ctx.workdir,
|
|
84
|
-
prdPath: ctx.prdPath,
|
|
85
|
-
featureDir: ctx.featureDir,
|
|
86
|
-
hooks: ctx.hooks,
|
|
87
|
-
plugins: ctx.pluginRegistry,
|
|
88
|
-
storyStartTime: new Date().toISOString(),
|
|
89
|
-
storyGitRef: storyGitRef ?? undefined,
|
|
90
|
-
interaction: ctx.interactionChain ?? undefined,
|
|
91
|
-
agentGetFn: ctx.agentGetFn,
|
|
92
|
-
pidRegistry: ctx.pidRegistry,
|
|
93
|
-
accumulatedAttemptCost: accumulatedAttemptCost > 0 ? accumulatedAttemptCost : undefined,
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
ctx.statusWriter.setPrd(prd);
|
|
97
|
-
ctx.statusWriter.setCurrentStory({
|
|
98
|
-
storyId: story.id,
|
|
99
|
-
title: story.title,
|
|
100
|
-
complexity: routing.complexity,
|
|
101
|
-
tddStrategy: routing.testStrategy,
|
|
102
|
-
model: routing.modelTier,
|
|
103
|
-
attempt: (story.attempts ?? 0) + 1,
|
|
104
|
-
phase: "routing",
|
|
105
|
-
});
|
|
106
|
-
await ctx.statusWriter.update(totalCost, iterations);
|
|
107
|
-
|
|
108
|
-
const pipelineResult = await runPipeline(defaultPipeline, pipelineContext, ctx.eventEmitter);
|
|
109
|
-
const currentPrd = pipelineResult.context.prd;
|
|
110
|
-
|
|
111
|
-
const handlerCtx = {
|
|
112
|
-
config: ctx.config,
|
|
113
|
-
prd: currentPrd,
|
|
114
|
-
prdPath: ctx.prdPath,
|
|
115
|
-
workdir: ctx.workdir,
|
|
116
|
-
featureDir: ctx.featureDir,
|
|
117
|
-
hooks: ctx.hooks,
|
|
118
|
-
feature: ctx.feature,
|
|
119
|
-
totalCost,
|
|
120
|
-
startTime: ctx.startTime,
|
|
121
|
-
runId: ctx.runId,
|
|
122
|
-
pluginRegistry: ctx.pluginRegistry,
|
|
123
|
-
story,
|
|
124
|
-
storiesToExecute,
|
|
125
|
-
routing: pipelineResult.context.routing ?? routing,
|
|
126
|
-
isBatchExecution,
|
|
127
|
-
allStoryMetrics,
|
|
128
|
-
storyGitRef,
|
|
129
|
-
interactionChain: ctx.interactionChain,
|
|
130
|
-
storyStartTime,
|
|
131
|
-
};
|
|
132
|
-
|
|
133
|
-
if (pipelineResult.success) {
|
|
134
|
-
const r = await handlePipelineSuccess(handlerCtx, pipelineResult);
|
|
135
|
-
return {
|
|
136
|
-
prd: r.prd,
|
|
137
|
-
storiesCompletedDelta: r.storiesCompletedDelta,
|
|
138
|
-
costDelta: r.costDelta,
|
|
139
|
-
prdDirty: r.prdDirty,
|
|
140
|
-
finalAction: pipelineResult.finalAction,
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
const r = await handlePipelineFailure(handlerCtx, pipelineResult);
|
|
144
|
-
return {
|
|
145
|
-
prd: r.prd,
|
|
146
|
-
storiesCompletedDelta: 0,
|
|
147
|
-
costDelta: r.costDelta,
|
|
148
|
-
prdDirty: r.prdDirty,
|
|
149
|
-
finalAction: pipelineResult.finalAction,
|
|
150
|
-
reason: pipelineResult.reason,
|
|
151
|
-
subStoryCount: pipelineResult.subStoryCount,
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* Swappable dependencies for testing (avoids mock.module() which leaks in Bun 1.x).
|
|
157
|
-
*/
|
|
158
|
-
export const _iterationRunnerDeps = {
|
|
159
|
-
loadConfigForWorkdir,
|
|
160
|
-
};
|