@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,322 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Fix Story Generator
|
|
3
|
-
*
|
|
4
|
-
* Generates fix stories from failed acceptance criteria.
|
|
5
|
-
* Maps failed ACs to related stories and creates targeted fix descriptions.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import type { AgentAdapter } from "../agents/types";
|
|
9
|
-
import type { ModelDef, NaxConfig } from "../config/schema";
|
|
10
|
-
import { getLogger } from "../logger";
|
|
11
|
-
import type { PRD, UserStory } from "../prd/types";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* A fix story generated from a failed acceptance criterion.
|
|
15
|
-
*
|
|
16
|
-
* Fix stories are appended to the PRD and executed through the normal pipeline.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```ts
|
|
20
|
-
* const fixStory: FixStory = {
|
|
21
|
-
* id: "US-FIX-001",
|
|
22
|
-
* title: "Fix: AC-2 TTL expiry timing",
|
|
23
|
-
* failedAC: "AC-2",
|
|
24
|
-
* testOutput: "Expected undefined, got 'value'",
|
|
25
|
-
* relatedStories: ["US-002"],
|
|
26
|
-
* description: "Update TTL implementation to properly expire entries...",
|
|
27
|
-
* };
|
|
28
|
-
* ```
|
|
29
|
-
*/
|
|
30
|
-
export interface FixStory {
|
|
31
|
-
/** Story ID (e.g., "US-FIX-001") */
|
|
32
|
-
id: string;
|
|
33
|
-
/** Story title */
|
|
34
|
-
title: string;
|
|
35
|
-
/** Failed AC identifier (e.g., "AC-2") */
|
|
36
|
-
failedAC: string;
|
|
37
|
-
/** Test output showing actual vs expected */
|
|
38
|
-
testOutput: string;
|
|
39
|
-
/** Original stories that built this functionality */
|
|
40
|
-
relatedStories: string[];
|
|
41
|
-
/** LLM-generated fix description */
|
|
42
|
-
description: string;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Options for generating fix stories.
|
|
47
|
-
*
|
|
48
|
-
* @example
|
|
49
|
-
* ```ts
|
|
50
|
-
* const options: GenerateFixStoriesOptions = {
|
|
51
|
-
* failedACs: ["AC-2", "AC-5"],
|
|
52
|
-
* testOutput: "...",
|
|
53
|
-
* prd: loadedPRD,
|
|
54
|
-
* specContent: "# Feature...",
|
|
55
|
-
* workdir: "/project",
|
|
56
|
-
* modelDef: { provider: "anthropic", model: "claude-sonnet-4-5" },
|
|
57
|
-
* };
|
|
58
|
-
* ```
|
|
59
|
-
*/
|
|
60
|
-
export interface GenerateFixStoriesOptions {
|
|
61
|
-
/** Failed AC identifiers */
|
|
62
|
-
failedACs: string[];
|
|
63
|
-
/** Full test output from bun test */
|
|
64
|
-
testOutput: string;
|
|
65
|
-
/** Current PRD with all stories */
|
|
66
|
-
prd: PRD;
|
|
67
|
-
/** Original spec.md content */
|
|
68
|
-
specContent: string;
|
|
69
|
-
/** Working directory */
|
|
70
|
-
workdir: string;
|
|
71
|
-
/** Model definition for LLM call */
|
|
72
|
-
modelDef: ModelDef;
|
|
73
|
-
/** Global config */
|
|
74
|
-
config: NaxConfig;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Map failed ACs to related stories.
|
|
79
|
-
*
|
|
80
|
-
* Uses heuristics to find which stories likely implemented the failed AC:
|
|
81
|
-
* 1. Stories with matching AC in acceptanceCriteria
|
|
82
|
-
* 2. Stories with similar keywords in description
|
|
83
|
-
* 3. Recently completed stories (if no better match)
|
|
84
|
-
*
|
|
85
|
-
* @param failedAC - Failed AC identifier (e.g., "AC-2")
|
|
86
|
-
* @param prd - Current PRD
|
|
87
|
-
* @returns Array of related story IDs
|
|
88
|
-
*
|
|
89
|
-
* @example
|
|
90
|
-
* ```ts
|
|
91
|
-
* const related = findRelatedStories("AC-2", prd);
|
|
92
|
-
* // Returns: ["US-002", "US-005"]
|
|
93
|
-
* ```
|
|
94
|
-
*/
|
|
95
|
-
export function findRelatedStories(failedAC: string, prd: PRD): string[] {
|
|
96
|
-
const relatedStoryIds: string[] = [];
|
|
97
|
-
|
|
98
|
-
// Strategy 1: Find stories with this AC in their acceptanceCriteria
|
|
99
|
-
for (const story of prd.userStories) {
|
|
100
|
-
for (const ac of story.acceptanceCriteria) {
|
|
101
|
-
if (ac.includes(failedAC)) {
|
|
102
|
-
relatedStoryIds.push(story.id);
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
// If we found stories with matching AC, return those
|
|
109
|
-
if (relatedStoryIds.length > 0) {
|
|
110
|
-
return relatedStoryIds;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
// Strategy 2: Return all passed stories (fallback)
|
|
114
|
-
// The LLM will figure out which code is relevant
|
|
115
|
-
const passedStories = prd.userStories.filter((s) => s.status === "passed").map((s) => s.id);
|
|
116
|
-
|
|
117
|
-
return passedStories.slice(0, 5); // Limit to 5 most recent
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Build LLM prompt for generating a fix story.
|
|
122
|
-
*
|
|
123
|
-
* @param failedAC - Failed AC identifier
|
|
124
|
-
* @param acText - Original AC text from spec
|
|
125
|
-
* @param testOutput - Test failure output
|
|
126
|
-
* @param relatedStories - Related story IDs
|
|
127
|
-
* @param prd - Current PRD
|
|
128
|
-
* @returns Formatted prompt string
|
|
129
|
-
*/
|
|
130
|
-
export function buildFixPrompt(
|
|
131
|
-
failedAC: string,
|
|
132
|
-
acText: string,
|
|
133
|
-
testOutput: string,
|
|
134
|
-
relatedStories: string[],
|
|
135
|
-
prd: PRD,
|
|
136
|
-
): string {
|
|
137
|
-
const relatedStoriesText = relatedStories
|
|
138
|
-
.map((id) => {
|
|
139
|
-
const story = prd.userStories.find((s) => s.id === id);
|
|
140
|
-
if (!story) return "";
|
|
141
|
-
return `${story.id}: ${story.title}\n ${story.description}`;
|
|
142
|
-
})
|
|
143
|
-
.filter(Boolean)
|
|
144
|
-
.join("\n\n");
|
|
145
|
-
|
|
146
|
-
return `You are a debugging expert. A feature acceptance test has failed.
|
|
147
|
-
|
|
148
|
-
FAILED ACCEPTANCE CRITERION:
|
|
149
|
-
${failedAC}: ${acText}
|
|
150
|
-
|
|
151
|
-
TEST FAILURE OUTPUT:
|
|
152
|
-
${testOutput}
|
|
153
|
-
|
|
154
|
-
RELATED STORIES (implemented this functionality):
|
|
155
|
-
${relatedStoriesText}
|
|
156
|
-
|
|
157
|
-
Your task: Generate a fix story description that will make the acceptance test pass.
|
|
158
|
-
|
|
159
|
-
Requirements:
|
|
160
|
-
1. Analyze the test failure to understand the root cause
|
|
161
|
-
2. Identify what needs to change in the code
|
|
162
|
-
3. Write a clear, actionable fix description (2-4 sentences)
|
|
163
|
-
4. Focus on the specific issue, not general improvements
|
|
164
|
-
5. Reference the relevant story IDs if needed
|
|
165
|
-
|
|
166
|
-
Respond with ONLY the fix description (no JSON, no markdown, just the description text).`;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
/**
|
|
170
|
-
* Generate fix stories from failed acceptance criteria.
|
|
171
|
-
*
|
|
172
|
-
* For each failed AC:
|
|
173
|
-
* 1. Find related stories
|
|
174
|
-
* 2. Build LLM prompt with context
|
|
175
|
-
* 3. Generate fix description
|
|
176
|
-
* 4. Create FixStory object
|
|
177
|
-
*
|
|
178
|
-
* @param adapter - Agent adapter for LLM calls
|
|
179
|
-
* @param options - Generation options
|
|
180
|
-
* @returns Array of generated fix stories
|
|
181
|
-
*
|
|
182
|
-
* @example
|
|
183
|
-
* ```ts
|
|
184
|
-
* const adapter = new ClaudeCodeAdapter();
|
|
185
|
-
* const fixStories = await generateFixStories(adapter, {
|
|
186
|
-
* failedACs: ["AC-2", "AC-5"],
|
|
187
|
-
* testOutput: "...",
|
|
188
|
-
* prd: loadedPRD,
|
|
189
|
-
* specContent: "...",
|
|
190
|
-
* workdir: "/project",
|
|
191
|
-
* modelDef: { provider: "anthropic", model: "claude-sonnet-4-5" },
|
|
192
|
-
* });
|
|
193
|
-
*
|
|
194
|
-
* // Append to PRD
|
|
195
|
-
* prd.userStories.push(...fixStories.map(convertToUserStory));
|
|
196
|
-
* ```
|
|
197
|
-
*/
|
|
198
|
-
export async function generateFixStories(
|
|
199
|
-
adapter: AgentAdapter,
|
|
200
|
-
options: GenerateFixStoriesOptions,
|
|
201
|
-
): Promise<FixStory[]> {
|
|
202
|
-
const { failedACs, testOutput, prd, specContent, modelDef } = options;
|
|
203
|
-
|
|
204
|
-
const fixStories: FixStory[] = [];
|
|
205
|
-
|
|
206
|
-
// Parse spec to get AC text
|
|
207
|
-
const acTextMap = parseACTextFromSpec(specContent);
|
|
208
|
-
|
|
209
|
-
const logger = getLogger();
|
|
210
|
-
for (let i = 0; i < failedACs.length; i++) {
|
|
211
|
-
const failedAC = failedACs[i];
|
|
212
|
-
const acText = acTextMap[failedAC] || "No description available";
|
|
213
|
-
|
|
214
|
-
logger.info("acceptance", "Generating fix for failed AC", { failedAC });
|
|
215
|
-
|
|
216
|
-
// Find related stories
|
|
217
|
-
const relatedStories = findRelatedStories(failedAC, prd);
|
|
218
|
-
|
|
219
|
-
if (relatedStories.length === 0) {
|
|
220
|
-
logger.warn("acceptance", "⚠ No related stories found for failed AC — skipping", { failedAC });
|
|
221
|
-
continue;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Build prompt
|
|
225
|
-
const prompt = buildFixPrompt(failedAC, acText, testOutput, relatedStories, prd);
|
|
226
|
-
|
|
227
|
-
try {
|
|
228
|
-
// Call adapter to generate fix description
|
|
229
|
-
const fixDescription = await adapter.complete(prompt, {
|
|
230
|
-
model: modelDef.model,
|
|
231
|
-
config: options.config,
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
fixStories.push({
|
|
235
|
-
id: `US-FIX-${String(i + 1).padStart(3, "0")}`,
|
|
236
|
-
title: `Fix: ${failedAC} — ${acText.slice(0, 50)}`,
|
|
237
|
-
failedAC,
|
|
238
|
-
testOutput,
|
|
239
|
-
relatedStories,
|
|
240
|
-
description: fixDescription,
|
|
241
|
-
});
|
|
242
|
-
|
|
243
|
-
logger.info("acceptance", "✓ Generated fix story", { storyId: fixStories[fixStories.length - 1].id });
|
|
244
|
-
} catch (error) {
|
|
245
|
-
logger.warn("acceptance", "⚠ Error generating fix", {
|
|
246
|
-
failedAC,
|
|
247
|
-
error: (error as Error).message,
|
|
248
|
-
});
|
|
249
|
-
// Use fallback
|
|
250
|
-
fixStories.push({
|
|
251
|
-
id: `US-FIX-${String(i + 1).padStart(3, "0")}`,
|
|
252
|
-
title: `Fix: ${failedAC}`,
|
|
253
|
-
failedAC,
|
|
254
|
-
testOutput,
|
|
255
|
-
relatedStories,
|
|
256
|
-
description: `Fix the implementation to make ${failedAC} pass. Related stories: ${relatedStories.join(", ")}.`,
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
return fixStories;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Parse AC text from spec.md content.
|
|
266
|
-
*
|
|
267
|
-
* Extracts AC-N lines and maps them to their text descriptions.
|
|
268
|
-
*
|
|
269
|
-
* @param specContent - Full spec.md content
|
|
270
|
-
* @returns Map of AC ID to text (e.g., { "AC-2": "set(key, value, ttl)..." })
|
|
271
|
-
*
|
|
272
|
-
* @example
|
|
273
|
-
* ```ts
|
|
274
|
-
* const spec = "- AC-1: handles empty input\n- AC-2: TTL expiry";
|
|
275
|
-
* const map = parseACTextFromSpec(spec);
|
|
276
|
-
* // Returns: { "AC-1": "handles empty input", "AC-2": "TTL expiry" }
|
|
277
|
-
* ```
|
|
278
|
-
*/
|
|
279
|
-
export function parseACTextFromSpec(specContent: string): Record<string, string> {
|
|
280
|
-
const map: Record<string, string> = {};
|
|
281
|
-
const lines = specContent.split("\n");
|
|
282
|
-
|
|
283
|
-
for (const line of lines) {
|
|
284
|
-
const acMatch = line.match(/^\s*-?\s*(?:\[.\])?\s*(AC-\d+):\s*(.+)$/i);
|
|
285
|
-
if (acMatch) {
|
|
286
|
-
const id = acMatch[1].toUpperCase();
|
|
287
|
-
const text = acMatch[2].trim();
|
|
288
|
-
map[id] = text;
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
return map;
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Convert a FixStory to a UserStory for PRD insertion.
|
|
297
|
-
*
|
|
298
|
-
* @param fixStory - Fix story to convert
|
|
299
|
-
* @returns UserStory object ready for PRD
|
|
300
|
-
*
|
|
301
|
-
* @example
|
|
302
|
-
* ```ts
|
|
303
|
-
* const fixStory: FixStory = { id: "US-FIX-001", ... };
|
|
304
|
-
* const userStory = convertFixStoryToUserStory(fixStory);
|
|
305
|
-
* prd.userStories.push(userStory);
|
|
306
|
-
* ```
|
|
307
|
-
*/
|
|
308
|
-
export function convertFixStoryToUserStory(fixStory: FixStory): UserStory {
|
|
309
|
-
return {
|
|
310
|
-
id: fixStory.id,
|
|
311
|
-
title: fixStory.title,
|
|
312
|
-
description: fixStory.description,
|
|
313
|
-
acceptanceCriteria: [`Fix ${fixStory.failedAC}`],
|
|
314
|
-
tags: ["fix", "acceptance-failure"],
|
|
315
|
-
dependencies: fixStory.relatedStories,
|
|
316
|
-
status: "pending",
|
|
317
|
-
passes: false,
|
|
318
|
-
escalations: [],
|
|
319
|
-
attempts: 0,
|
|
320
|
-
contextFiles: [],
|
|
321
|
-
};
|
|
322
|
-
}
|