@nathapp/nax 0.50.3 → 0.51.2
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/README.md +177 -104
- package/dist/nax.js +417 -213
- 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
package/src/cli/runs.ts
DELETED
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Runs CLI Commands
|
|
3
|
-
*
|
|
4
|
-
* Display run history from JSONL log files.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { existsSync, readdirSync } from "node:fs";
|
|
8
|
-
import { join } from "node:path";
|
|
9
|
-
import { NaxError } from "../errors";
|
|
10
|
-
import { getLogger } from "../logger";
|
|
11
|
-
import type { LogEntry } from "../logger/types";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Options for runs list command.
|
|
15
|
-
*/
|
|
16
|
-
export interface RunsListOptions {
|
|
17
|
-
/** Feature name */
|
|
18
|
-
feature: string;
|
|
19
|
-
/** Project directory */
|
|
20
|
-
workdir: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Options for runs show command.
|
|
25
|
-
*/
|
|
26
|
-
export interface RunsShowOptions {
|
|
27
|
-
/** Run ID to display */
|
|
28
|
-
runId: string;
|
|
29
|
-
/** Feature name */
|
|
30
|
-
feature: string;
|
|
31
|
-
/** Project directory */
|
|
32
|
-
workdir: string;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Parse JSONL log file and extract run events.
|
|
37
|
-
*
|
|
38
|
-
* @param logPath - Path to .jsonl log file
|
|
39
|
-
* @returns Array of log entries
|
|
40
|
-
*/
|
|
41
|
-
async function parseRunLog(logPath: string): Promise<LogEntry[]> {
|
|
42
|
-
const logger = getLogger();
|
|
43
|
-
try {
|
|
44
|
-
const content = await Bun.file(logPath).text();
|
|
45
|
-
const lines = content.trim().split("\n").filter(Boolean);
|
|
46
|
-
return lines.map((line) => JSON.parse(line) as LogEntry);
|
|
47
|
-
} catch (err) {
|
|
48
|
-
logger.warn("cli", "Failed to parse run log", { logPath, error: (err as Error).message });
|
|
49
|
-
return [];
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* List all runs for a feature.
|
|
55
|
-
*
|
|
56
|
-
* @param options - Command options
|
|
57
|
-
*
|
|
58
|
-
* @example
|
|
59
|
-
* ```bash
|
|
60
|
-
* nax runs list -f auth-system
|
|
61
|
-
* ```
|
|
62
|
-
*/
|
|
63
|
-
export async function runsListCommand(options: RunsListOptions): Promise<void> {
|
|
64
|
-
const logger = getLogger();
|
|
65
|
-
const { feature, workdir } = options;
|
|
66
|
-
|
|
67
|
-
const runsDir = join(workdir, "nax", "features", feature, "runs");
|
|
68
|
-
|
|
69
|
-
if (!existsSync(runsDir)) {
|
|
70
|
-
logger.info("cli", "No runs found for feature", { feature, hint: `Directory not found: ${runsDir}` });
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// List all .jsonl files in runs directory
|
|
75
|
-
const files = readdirSync(runsDir).filter((f) => f.endsWith(".jsonl"));
|
|
76
|
-
|
|
77
|
-
if (files.length === 0) {
|
|
78
|
-
logger.info("cli", "No runs found for feature", { feature });
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
logger.info("cli", `Runs for ${feature}`, { count: files.length });
|
|
83
|
-
|
|
84
|
-
// Parse each run file and extract run.start event
|
|
85
|
-
for (const file of files.sort().reverse()) {
|
|
86
|
-
const logPath = join(runsDir, file);
|
|
87
|
-
const entries = await parseRunLog(logPath);
|
|
88
|
-
|
|
89
|
-
// Find run.start and run.complete events
|
|
90
|
-
const startEvent = entries.find((e) => e.message === "run.start");
|
|
91
|
-
const completeEvent = entries.find((e) => e.message === "run.complete");
|
|
92
|
-
|
|
93
|
-
if (!startEvent) {
|
|
94
|
-
logger.warn("cli", "Run log missing run.start event", { file });
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
const runId = startEvent.data?.runId || file.replace(".jsonl", "");
|
|
99
|
-
const startedAt = startEvent.timestamp;
|
|
100
|
-
const status = completeEvent ? "completed" : "in-progress";
|
|
101
|
-
const totalCost = completeEvent?.data?.totalCost || 0;
|
|
102
|
-
const storiesCompleted = completeEvent?.data?.storiesCompleted || 0;
|
|
103
|
-
const totalStories = completeEvent?.data?.totalStories || 0;
|
|
104
|
-
|
|
105
|
-
logger.info("cli", ` ${runId}`, {
|
|
106
|
-
status,
|
|
107
|
-
startedAt,
|
|
108
|
-
totalCost,
|
|
109
|
-
storiesCompleted,
|
|
110
|
-
totalStories,
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
/**
|
|
116
|
-
* Show detailed information for a specific run.
|
|
117
|
-
*
|
|
118
|
-
* @param options - Command options
|
|
119
|
-
*
|
|
120
|
-
* @example
|
|
121
|
-
* ```bash
|
|
122
|
-
* nax runs show run-20260220-103045 -f auth-system
|
|
123
|
-
* ```
|
|
124
|
-
*/
|
|
125
|
-
export async function runsShowCommand(options: RunsShowOptions): Promise<void> {
|
|
126
|
-
const logger = getLogger();
|
|
127
|
-
const { runId, feature, workdir } = options;
|
|
128
|
-
|
|
129
|
-
const logPath = join(workdir, "nax", "features", feature, "runs", `${runId}.jsonl`);
|
|
130
|
-
|
|
131
|
-
if (!existsSync(logPath)) {
|
|
132
|
-
logger.error("cli", "Run not found", { runId, feature, logPath });
|
|
133
|
-
throw new NaxError("Run not found", "RUN_NOT_FOUND", { runId, feature, logPath });
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const entries = await parseRunLog(logPath);
|
|
137
|
-
|
|
138
|
-
// Find key events
|
|
139
|
-
const startEvent = entries.find((e) => e.message === "run.start");
|
|
140
|
-
const completeEvent = entries.find((e) => e.message === "run.complete");
|
|
141
|
-
const storyEvents = entries.filter((e) => e.stage === "execution" && e.data?.storyId);
|
|
142
|
-
|
|
143
|
-
if (!startEvent) {
|
|
144
|
-
logger.error("cli", "Run log missing run.start event", { runId });
|
|
145
|
-
throw new NaxError("Run log missing run.start event", "INVALID_RUN_LOG", { runId });
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// Display run summary
|
|
149
|
-
logger.info("cli", `Run: ${runId}`, {
|
|
150
|
-
feature,
|
|
151
|
-
startedAt: startEvent.timestamp,
|
|
152
|
-
completedAt: completeEvent?.timestamp,
|
|
153
|
-
status: completeEvent ? "completed" : "in-progress",
|
|
154
|
-
});
|
|
155
|
-
|
|
156
|
-
if (completeEvent) {
|
|
157
|
-
logger.info("cli", "Run Summary", {
|
|
158
|
-
totalStories: completeEvent.data?.totalStories,
|
|
159
|
-
storiesCompleted: completeEvent.data?.storiesCompleted,
|
|
160
|
-
storiesFailed: completeEvent.data?.storiesFailed,
|
|
161
|
-
totalCost: completeEvent.data?.totalCost,
|
|
162
|
-
totalDurationMs: completeEvent.data?.totalDurationMs,
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Display per-story events
|
|
167
|
-
logger.info("cli", "Story Events", { count: storyEvents.length });
|
|
168
|
-
for (const event of storyEvents) {
|
|
169
|
-
logger.info("cli", ` ${event.data?.storyId}: ${event.message}`, {
|
|
170
|
-
timestamp: event.timestamp,
|
|
171
|
-
data: event.data,
|
|
172
|
-
});
|
|
173
|
-
}
|
|
174
|
-
}
|
package/src/cli/status-cost.ts
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Status Cost Metrics
|
|
3
|
-
*
|
|
4
|
-
* Extracted from status.ts: cost metrics display functions for CLI output.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { getLogger } from "../logger";
|
|
8
|
-
import { calculateAggregateMetrics, getLastRun, loadRunMetrics } from "../metrics";
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Display aggregate cost metrics across all runs.
|
|
12
|
-
*
|
|
13
|
-
* @param workdir - Project root directory
|
|
14
|
-
*
|
|
15
|
-
* @example
|
|
16
|
-
* ```bash
|
|
17
|
-
* nax status --cost
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
20
|
-
export async function displayCostMetrics(workdir: string): Promise<void> {
|
|
21
|
-
const logger = getLogger();
|
|
22
|
-
const runs = await loadRunMetrics(workdir);
|
|
23
|
-
|
|
24
|
-
if (runs.length === 0) {
|
|
25
|
-
logger.info("cli", "No metrics data available yet", { hint: "Run nax run to generate metrics" });
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const aggregate = calculateAggregateMetrics(runs);
|
|
30
|
-
|
|
31
|
-
logger.info("cli", "Cost Metrics (All Runs)", {
|
|
32
|
-
totalRuns: aggregate.totalRuns,
|
|
33
|
-
totalStories: aggregate.totalStories,
|
|
34
|
-
totalCost: aggregate.totalCost,
|
|
35
|
-
avgCostPerStory: aggregate.avgCostPerStory,
|
|
36
|
-
avgCostPerFeature: aggregate.avgCostPerFeature,
|
|
37
|
-
firstPassRate: aggregate.firstPassRate,
|
|
38
|
-
escalationRate: aggregate.escalationRate,
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Display metrics from the most recent run.
|
|
44
|
-
*
|
|
45
|
-
* @param workdir - Project root directory
|
|
46
|
-
*
|
|
47
|
-
* @example
|
|
48
|
-
* ```bash
|
|
49
|
-
* nax status --cost --last
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
export async function displayLastRunMetrics(workdir: string): Promise<void> {
|
|
53
|
-
const logger = getLogger();
|
|
54
|
-
const runs = await loadRunMetrics(workdir);
|
|
55
|
-
|
|
56
|
-
if (runs.length === 0) {
|
|
57
|
-
logger.info("cli", "No metrics data available yet", { hint: "Run nax run to generate metrics" });
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const lastRun = getLastRun(runs);
|
|
62
|
-
if (!lastRun) {
|
|
63
|
-
return;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
logger.info("cli", `Last Run: ${lastRun.feature}`, {
|
|
67
|
-
runId: lastRun.runId,
|
|
68
|
-
startedAt: lastRun.startedAt,
|
|
69
|
-
completedAt: lastRun.completedAt,
|
|
70
|
-
durationMs: lastRun.totalDurationMs,
|
|
71
|
-
totalStories: lastRun.totalStories,
|
|
72
|
-
storiesCompleted: lastRun.storiesCompleted,
|
|
73
|
-
storiesFailed: lastRun.storiesFailed,
|
|
74
|
-
totalCost: lastRun.totalCost,
|
|
75
|
-
avgCostPerStory: lastRun.totalCost / lastRun.totalStories,
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
// Show top 5 most expensive stories
|
|
79
|
-
const sortedStories = [...lastRun.stories].sort((a, b) => b.cost - a.cost);
|
|
80
|
-
const topStories = sortedStories.slice(0, 5);
|
|
81
|
-
|
|
82
|
-
if (topStories.length > 0) {
|
|
83
|
-
logger.info("cli", "Top 5 Most Expensive Stories", {
|
|
84
|
-
stories: topStories.map((s) => ({
|
|
85
|
-
storyId: s.storyId,
|
|
86
|
-
cost: s.cost,
|
|
87
|
-
model: s.modelUsed,
|
|
88
|
-
attempts: s.attempts,
|
|
89
|
-
})),
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Display per-model efficiency metrics.
|
|
96
|
-
*
|
|
97
|
-
* @param workdir - Project root directory
|
|
98
|
-
*
|
|
99
|
-
* @example
|
|
100
|
-
* ```bash
|
|
101
|
-
* nax status --cost --model
|
|
102
|
-
* ```
|
|
103
|
-
*/
|
|
104
|
-
export async function displayModelEfficiency(workdir: string): Promise<void> {
|
|
105
|
-
const logger = getLogger();
|
|
106
|
-
const runs = await loadRunMetrics(workdir);
|
|
107
|
-
|
|
108
|
-
if (runs.length === 0) {
|
|
109
|
-
logger.info("cli", "No metrics data available yet", { hint: "Run nax run to generate metrics" });
|
|
110
|
-
return;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const aggregate = calculateAggregateMetrics(runs);
|
|
114
|
-
|
|
115
|
-
// Sort models by total cost (descending)
|
|
116
|
-
const sortedModels = Object.entries(aggregate.modelEfficiency).sort(([, a], [, b]) => b.totalCost - a.totalCost);
|
|
117
|
-
|
|
118
|
-
if (sortedModels.length === 0) {
|
|
119
|
-
logger.info("cli", "No model data available");
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
logger.info("cli", "Model Efficiency", {
|
|
124
|
-
models: sortedModels.map(([modelName, stats]) => ({
|
|
125
|
-
model: modelName,
|
|
126
|
-
attempts: stats.attempts,
|
|
127
|
-
passRate: stats.passRate,
|
|
128
|
-
avgCost: stats.avgCost,
|
|
129
|
-
totalCost: stats.totalCost,
|
|
130
|
-
})),
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
// Show complexity accuracy
|
|
134
|
-
const sortedComplexity = Object.entries(aggregate.complexityAccuracy).sort(
|
|
135
|
-
([, a], [, b]) => b.predicted - a.predicted,
|
|
136
|
-
);
|
|
137
|
-
|
|
138
|
-
if (sortedComplexity.length === 0) {
|
|
139
|
-
logger.info("cli", "No complexity data available");
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
logger.info("cli", "Complexity Prediction Accuracy", {
|
|
144
|
-
complexities: sortedComplexity.map(([complexity, stats]) => ({
|
|
145
|
-
complexity,
|
|
146
|
-
predicted: stats.predicted,
|
|
147
|
-
actualTierUsed: stats.actualTierUsed,
|
|
148
|
-
mismatchRate: stats.mismatchRate,
|
|
149
|
-
})),
|
|
150
|
-
});
|
|
151
|
-
}
|