@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
package/src/cli/diagnose.ts
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Diagnose Command
|
|
3
|
-
*
|
|
4
|
-
* Reads run artifacts and produces structured diagnosis report.
|
|
5
|
-
* Pure pattern matching -- no LLM calls, no agents.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { existsSync, readdirSync } from "node:fs";
|
|
9
|
-
import { join } from "node:path";
|
|
10
|
-
import { findProjectDir } from "../config";
|
|
11
|
-
import type { NaxStatusFile } from "../execution/status-file";
|
|
12
|
-
import { getLogger } from "../logger";
|
|
13
|
-
import { loadPRD } from "../prd";
|
|
14
|
-
import { diagnoseStories, generateRecommendations } from "./diagnose-analysis";
|
|
15
|
-
import { formatReport } from "./diagnose-formatter";
|
|
16
|
-
|
|
17
|
-
export interface DiagnoseOptions {
|
|
18
|
-
feature?: string;
|
|
19
|
-
workdir?: string;
|
|
20
|
-
json?: boolean;
|
|
21
|
-
verbose?: boolean;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export type FailurePattern =
|
|
25
|
-
| "GREENFIELD_TDD"
|
|
26
|
-
| "TEST_MISMATCH"
|
|
27
|
-
| "ENVIRONMENTAL"
|
|
28
|
-
| "RATE_LIMITED"
|
|
29
|
-
| "ISOLATION_VIOLATION"
|
|
30
|
-
| "MAX_TIERS_EXHAUSTED"
|
|
31
|
-
| "SESSION_CRASH"
|
|
32
|
-
| "STALLED"
|
|
33
|
-
| "LOCK_STALE"
|
|
34
|
-
| "AUTO_RECOVERED"
|
|
35
|
-
| "UNKNOWN";
|
|
36
|
-
|
|
37
|
-
export interface StoryDiagnosis {
|
|
38
|
-
storyId: string;
|
|
39
|
-
title: string;
|
|
40
|
-
status: string;
|
|
41
|
-
attempts: number;
|
|
42
|
-
tier?: string;
|
|
43
|
-
strategy?: string;
|
|
44
|
-
pattern: FailurePattern;
|
|
45
|
-
symptom?: string;
|
|
46
|
-
fixSuggestion?: string;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface LockCheck {
|
|
50
|
-
lockPresent: boolean;
|
|
51
|
-
pidAlive?: boolean;
|
|
52
|
-
pid?: number;
|
|
53
|
-
fixCommand?: string;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface DiagnosisReport {
|
|
57
|
-
runSummary: {
|
|
58
|
-
feature: string;
|
|
59
|
-
lastRunTime?: string;
|
|
60
|
-
status: string;
|
|
61
|
-
storiesPassed: number;
|
|
62
|
-
storiesFailed: number;
|
|
63
|
-
storiesPending: number;
|
|
64
|
-
cost?: number;
|
|
65
|
-
commitsProduced: number;
|
|
66
|
-
};
|
|
67
|
-
storyBreakdown: StoryDiagnosis[];
|
|
68
|
-
failureAnalysis: StoryDiagnosis[];
|
|
69
|
-
lockCheck: LockCheck;
|
|
70
|
-
recommendations: string[];
|
|
71
|
-
dataSources: {
|
|
72
|
-
prdFound: boolean;
|
|
73
|
-
statusFound: boolean;
|
|
74
|
-
eventsFound: boolean;
|
|
75
|
-
gitLogFound: boolean;
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
function isProcessAlive(pid: number): boolean {
|
|
80
|
-
try {
|
|
81
|
-
const result = Bun.spawnSync(["ps", "-p", String(pid)], { stdout: "ignore", stderr: "ignore" });
|
|
82
|
-
return result.exitCode === 0;
|
|
83
|
-
} catch {
|
|
84
|
-
return false;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
async function loadStatusFile(workdir: string): Promise<NaxStatusFile | null> {
|
|
89
|
-
const statusPath = join(workdir, "nax", "status.json");
|
|
90
|
-
if (!existsSync(statusPath)) return null;
|
|
91
|
-
try {
|
|
92
|
-
return (await Bun.file(statusPath).json()) as NaxStatusFile;
|
|
93
|
-
} catch {
|
|
94
|
-
return null;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
async function countCommitsSince(workdir: string, since?: string): Promise<number> {
|
|
99
|
-
if (!since) return 0;
|
|
100
|
-
try {
|
|
101
|
-
const result = Bun.spawnSync(["git", "log", "--oneline", `--since=${since}`, "--all"], {
|
|
102
|
-
cwd: workdir,
|
|
103
|
-
stdout: "pipe",
|
|
104
|
-
stderr: "ignore",
|
|
105
|
-
});
|
|
106
|
-
if (result.exitCode !== 0) return 0;
|
|
107
|
-
const output = new TextDecoder().decode(result.stdout);
|
|
108
|
-
return output
|
|
109
|
-
.trim()
|
|
110
|
-
.split("\n")
|
|
111
|
-
.filter((line) => line.length > 0).length;
|
|
112
|
-
} catch {
|
|
113
|
-
return 0;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
async function checkLock(workdir: string): Promise<LockCheck> {
|
|
118
|
-
const lockFile = Bun.file(join(workdir, "nax.lock"));
|
|
119
|
-
if (!(await lockFile.exists())) return { lockPresent: false };
|
|
120
|
-
try {
|
|
121
|
-
const lockData = JSON.parse(await lockFile.text());
|
|
122
|
-
const pid = lockData.pid;
|
|
123
|
-
const pidAlive = isProcessAlive(pid);
|
|
124
|
-
if (!pidAlive) return { lockPresent: true, pidAlive: false, pid, fixCommand: "rm nax.lock" };
|
|
125
|
-
return { lockPresent: true, pidAlive: true, pid };
|
|
126
|
-
} catch {
|
|
127
|
-
return { lockPresent: true };
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
/** Run diagnose command */
|
|
132
|
-
export async function diagnoseCommand(options: DiagnoseOptions = {}): Promise<void> {
|
|
133
|
-
const logger = getLogger();
|
|
134
|
-
const workdir = options.workdir ?? process.cwd();
|
|
135
|
-
|
|
136
|
-
const naxSubdir = findProjectDir(workdir);
|
|
137
|
-
let projectDir: string | null = naxSubdir ? join(naxSubdir, "..") : null;
|
|
138
|
-
if (!projectDir && existsSync(join(workdir, "nax"))) {
|
|
139
|
-
projectDir = workdir;
|
|
140
|
-
}
|
|
141
|
-
if (!projectDir) throw new Error("Not in a nax project directory");
|
|
142
|
-
|
|
143
|
-
let feature = options.feature;
|
|
144
|
-
if (!feature) {
|
|
145
|
-
const status = await loadStatusFile(projectDir);
|
|
146
|
-
if (status) {
|
|
147
|
-
feature = status.run.feature;
|
|
148
|
-
} else {
|
|
149
|
-
const featuresDir = join(projectDir, "nax", "features");
|
|
150
|
-
if (!existsSync(featuresDir)) throw new Error("No features found in project");
|
|
151
|
-
const features = readdirSync(featuresDir, { withFileTypes: true })
|
|
152
|
-
.filter((e) => e.isDirectory())
|
|
153
|
-
.map((e) => e.name);
|
|
154
|
-
if (features.length === 0) throw new Error("No features found");
|
|
155
|
-
feature = features[0];
|
|
156
|
-
logger.info("diagnose", "No feature specified, using first found", { feature });
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const featureDir = join(projectDir, "nax", "features", feature);
|
|
161
|
-
const prdPath = join(featureDir, "prd.json");
|
|
162
|
-
if (!existsSync(prdPath)) throw new Error(`Feature not found: ${feature}`);
|
|
163
|
-
|
|
164
|
-
const prd = await loadPRD(prdPath);
|
|
165
|
-
const status = await loadStatusFile(projectDir);
|
|
166
|
-
const lockCheck = await checkLock(projectDir);
|
|
167
|
-
const commitCount = await countCommitsSince(projectDir, status?.run.startedAt);
|
|
168
|
-
|
|
169
|
-
const { storyBreakdown, failureAnalysis } = diagnoseStories(prd, status);
|
|
170
|
-
|
|
171
|
-
const report: DiagnosisReport = {
|
|
172
|
-
runSummary: {
|
|
173
|
-
feature,
|
|
174
|
-
lastRunTime: status?.run.startedAt,
|
|
175
|
-
status: status?.run.status ?? "unknown",
|
|
176
|
-
storiesPassed: prd.userStories.filter((s) => s.status === "passed").length,
|
|
177
|
-
storiesFailed: prd.userStories.filter((s) => s.status === "failed").length,
|
|
178
|
-
storiesPending: prd.userStories.filter(
|
|
179
|
-
(s) => s.status !== "passed" && s.status !== "failed" && s.status !== "skipped",
|
|
180
|
-
).length,
|
|
181
|
-
cost: status?.cost.spent,
|
|
182
|
-
commitsProduced: commitCount,
|
|
183
|
-
},
|
|
184
|
-
storyBreakdown,
|
|
185
|
-
failureAnalysis,
|
|
186
|
-
lockCheck,
|
|
187
|
-
recommendations: [],
|
|
188
|
-
dataSources: {
|
|
189
|
-
prdFound: true,
|
|
190
|
-
statusFound: status !== null,
|
|
191
|
-
eventsFound: false,
|
|
192
|
-
gitLogFound: commitCount > 0,
|
|
193
|
-
},
|
|
194
|
-
};
|
|
195
|
-
|
|
196
|
-
report.recommendations = generateRecommendations(report);
|
|
197
|
-
|
|
198
|
-
if (options.json) {
|
|
199
|
-
console.log(JSON.stringify(report, null, 2));
|
|
200
|
-
} else {
|
|
201
|
-
console.log(formatReport(report, options.verbose ?? false));
|
|
202
|
-
}
|
|
203
|
-
}
|
package/src/cli/generate.ts
DELETED
|
@@ -1,250 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `nax generate` CLI Command (v0.16.1)
|
|
3
|
-
*
|
|
4
|
-
* Generates agent-specific config files from nax/context.md + auto-injected project metadata.
|
|
5
|
-
* Replaces `nax constitution generate`.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { existsSync } from "node:fs";
|
|
9
|
-
import { join } from "node:path";
|
|
10
|
-
import chalk from "chalk";
|
|
11
|
-
import { loadConfig } from "../config/loader";
|
|
12
|
-
import { discoverPackages, generateAll, generateFor, generateForPackage } from "../context/generator";
|
|
13
|
-
import type { AgentType } from "../context/types";
|
|
14
|
-
|
|
15
|
-
/** Options for `nax generate` */
|
|
16
|
-
export interface GenerateCommandOptions {
|
|
17
|
-
/** Path to context file (default: nax/context.md) */
|
|
18
|
-
context?: string;
|
|
19
|
-
/** Output directory (default: project root) */
|
|
20
|
-
output?: string;
|
|
21
|
-
/** Specific agent to generate for */
|
|
22
|
-
agent?: string;
|
|
23
|
-
/** Dry run — preview without writing */
|
|
24
|
-
dryRun?: boolean;
|
|
25
|
-
/** Disable auto-injection of project metadata */
|
|
26
|
-
noAutoInject?: boolean;
|
|
27
|
-
/**
|
|
28
|
-
* Generate for a specific package directory (relative to repo root).
|
|
29
|
-
* Reads <package>/nax/context.md, writes <package>/CLAUDE.md.
|
|
30
|
-
* @example "packages/api"
|
|
31
|
-
*/
|
|
32
|
-
package?: string;
|
|
33
|
-
/**
|
|
34
|
-
* Generate for all discovered packages.
|
|
35
|
-
* Auto-discovers packages with nax/context.md up to 2 levels deep.
|
|
36
|
-
*/
|
|
37
|
-
allPackages?: boolean;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const VALID_AGENTS: AgentType[] = ["claude", "codex", "opencode", "cursor", "windsurf", "aider", "gemini"];
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* `nax generate` command handler.
|
|
44
|
-
*/
|
|
45
|
-
export async function generateCommand(options: GenerateCommandOptions): Promise<void> {
|
|
46
|
-
const workdir = process.cwd();
|
|
47
|
-
const dryRun = options.dryRun ?? false;
|
|
48
|
-
|
|
49
|
-
// Load config early — needed for all paths
|
|
50
|
-
let config: Awaited<ReturnType<typeof loadConfig>>;
|
|
51
|
-
try {
|
|
52
|
-
config = await loadConfig(workdir);
|
|
53
|
-
} catch {
|
|
54
|
-
config = {} as Awaited<ReturnType<typeof loadConfig>>;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// --all-packages: discover and generate for all packages
|
|
58
|
-
if (options.allPackages) {
|
|
59
|
-
if (dryRun) {
|
|
60
|
-
console.log(chalk.yellow("⚠ Dry run — no files will be written"));
|
|
61
|
-
}
|
|
62
|
-
console.log(chalk.blue("→ Discovering packages with nax/context.md..."));
|
|
63
|
-
const packages = await discoverPackages(workdir);
|
|
64
|
-
|
|
65
|
-
if (packages.length === 0) {
|
|
66
|
-
console.log(chalk.yellow(" No packages found (no */nax/context.md or */*/nax/context.md)"));
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
console.log(chalk.blue(`→ Generating agent files for ${packages.length} package(s)...`));
|
|
71
|
-
let errorCount = 0;
|
|
72
|
-
|
|
73
|
-
for (const pkgDir of packages) {
|
|
74
|
-
const results = await generateForPackage(pkgDir, config, dryRun);
|
|
75
|
-
for (const result of results) {
|
|
76
|
-
if (result.error) {
|
|
77
|
-
console.error(chalk.red(`✗ ${pkgDir}: ${result.error}`));
|
|
78
|
-
errorCount++;
|
|
79
|
-
} else {
|
|
80
|
-
const suffix = dryRun ? " (dry run)" : "";
|
|
81
|
-
console.log(chalk.green(`✓ ${pkgDir}/${result.outputFile} (${result.content.length} bytes${suffix})`));
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
if (errorCount > 0) {
|
|
87
|
-
console.error(chalk.red(`\n✗ ${errorCount} generation(s) failed`));
|
|
88
|
-
process.exit(1);
|
|
89
|
-
}
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// --package: generate for a specific package
|
|
94
|
-
if (options.package) {
|
|
95
|
-
const packageDir = join(workdir, options.package);
|
|
96
|
-
if (dryRun) {
|
|
97
|
-
console.log(chalk.yellow("⚠ Dry run — no files will be written"));
|
|
98
|
-
}
|
|
99
|
-
console.log(chalk.blue(`→ Generating agent files for package: ${options.package}`));
|
|
100
|
-
const pkgResults = await generateForPackage(packageDir, config, dryRun);
|
|
101
|
-
let pkgHasError = false;
|
|
102
|
-
for (const result of pkgResults) {
|
|
103
|
-
if (result.error) {
|
|
104
|
-
console.error(chalk.red(`✗ ${result.error}`));
|
|
105
|
-
pkgHasError = true;
|
|
106
|
-
} else {
|
|
107
|
-
const suffix = dryRun ? " (dry run)" : "";
|
|
108
|
-
console.log(chalk.green(`✓ ${options.package}/${result.outputFile} (${result.content.length} bytes${suffix})`));
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
if (pkgHasError) process.exit(1);
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const contextPath = options.context ? join(workdir, options.context) : join(workdir, "nax/context.md");
|
|
116
|
-
const outputDir = options.output ? join(workdir, options.output) : workdir;
|
|
117
|
-
const autoInject = !options.noAutoInject;
|
|
118
|
-
|
|
119
|
-
// Validate context file
|
|
120
|
-
if (!existsSync(contextPath)) {
|
|
121
|
-
console.error(chalk.red(`✗ Context file not found: ${contextPath}`));
|
|
122
|
-
console.error(chalk.yellow(" Create nax/context.md first, or run `nax init` to scaffold it."));
|
|
123
|
-
process.exit(1);
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Validate agent if specified
|
|
127
|
-
if (options.agent && !VALID_AGENTS.includes(options.agent as AgentType)) {
|
|
128
|
-
console.error(chalk.red(`✗ Unknown agent: ${options.agent}`));
|
|
129
|
-
console.error(chalk.yellow(` Valid agents: ${VALID_AGENTS.join(", ")}`));
|
|
130
|
-
process.exit(1);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
if (dryRun) {
|
|
134
|
-
console.log(chalk.yellow("⚠ Dry run — no files will be written"));
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
console.log(chalk.blue(`→ Loading context from ${contextPath}`));
|
|
138
|
-
if (autoInject) {
|
|
139
|
-
console.log(chalk.dim(" Auto-injecting project metadata..."));
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
const genOptions = {
|
|
143
|
-
contextPath,
|
|
144
|
-
outputDir,
|
|
145
|
-
workdir,
|
|
146
|
-
dryRun,
|
|
147
|
-
autoInject,
|
|
148
|
-
};
|
|
149
|
-
|
|
150
|
-
try {
|
|
151
|
-
if (options.agent) {
|
|
152
|
-
// CLI --agent flag: single specific agent (overrides config)
|
|
153
|
-
const agent = options.agent as AgentType;
|
|
154
|
-
console.log(chalk.blue(`→ Generating config for ${agent}...`));
|
|
155
|
-
|
|
156
|
-
const result = await generateFor(agent, genOptions, config);
|
|
157
|
-
|
|
158
|
-
if (result.error) {
|
|
159
|
-
console.error(chalk.red(`✗ ${agent}: ${result.error}`));
|
|
160
|
-
process.exit(1);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
const suffix = dryRun ? " (dry run)" : "";
|
|
164
|
-
console.log(chalk.green(`✓ ${agent} → ${result.outputFile} (${result.content.length} bytes${suffix})`));
|
|
165
|
-
} else {
|
|
166
|
-
// No --agent flag: use config.generate.agents filter, or generate all
|
|
167
|
-
let configAgents = config?.generate?.agents;
|
|
168
|
-
|
|
169
|
-
// Detect misplaced generate config (autoMode.generate.agents) and warn
|
|
170
|
-
const misplacedAgents = (config?.autoMode as unknown as Record<string, unknown> | undefined)?.generate as
|
|
171
|
-
| { agents?: string[] }
|
|
172
|
-
| undefined;
|
|
173
|
-
if (!configAgents && misplacedAgents?.agents && misplacedAgents.agents.length > 0) {
|
|
174
|
-
console.warn(
|
|
175
|
-
chalk.yellow(
|
|
176
|
-
'⚠ Warning: "generate.agents" is nested under "autoMode" in your config — it should be at the top level.',
|
|
177
|
-
),
|
|
178
|
-
);
|
|
179
|
-
console.warn(chalk.yellow(' Move it to: { "generate": { "agents": [...] } }'));
|
|
180
|
-
configAgents = misplacedAgents.agents as Array<
|
|
181
|
-
"claude" | "codex" | "opencode" | "cursor" | "windsurf" | "aider" | "gemini"
|
|
182
|
-
>;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
const agentFilter = configAgents && configAgents.length > 0 ? configAgents : null;
|
|
186
|
-
|
|
187
|
-
if (agentFilter) {
|
|
188
|
-
console.log(chalk.blue(`→ Generating configs for: ${agentFilter.join(", ")} (from config)...`));
|
|
189
|
-
} else {
|
|
190
|
-
console.log(chalk.blue("→ Generating configs for all agents..."));
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// Pass agentFilter to generateAll so only matching agents are written to disk
|
|
194
|
-
const results = await generateAll(genOptions, config, agentFilter ?? undefined);
|
|
195
|
-
|
|
196
|
-
let errorCount = 0;
|
|
197
|
-
|
|
198
|
-
for (const result of results) {
|
|
199
|
-
if (result.error) {
|
|
200
|
-
console.error(chalk.red(`✗ ${result.agent}: ${result.error}`));
|
|
201
|
-
errorCount++;
|
|
202
|
-
} else {
|
|
203
|
-
const suffix = dryRun ? " (dry run)" : "";
|
|
204
|
-
console.log(
|
|
205
|
-
chalk.green(`✓ ${result.agent} → ${result.outputFile} (${result.content.length} bytes${suffix})`),
|
|
206
|
-
);
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
if (errorCount > 0) {
|
|
211
|
-
console.error(chalk.red(`\n✗ ${errorCount} generation(s) failed`));
|
|
212
|
-
process.exit(1);
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
// Auto-generate per-package agent files when packages with nax/context.md are discovered
|
|
216
|
-
const packages = await discoverPackages(workdir);
|
|
217
|
-
if (packages.length > 0) {
|
|
218
|
-
console.log(
|
|
219
|
-
chalk.blue(`\n→ Discovered ${packages.length} package(s) with nax/context.md — generating agent files...`),
|
|
220
|
-
);
|
|
221
|
-
let pkgErrorCount = 0;
|
|
222
|
-
for (const pkgDir of packages) {
|
|
223
|
-
const pkgResults = await generateForPackage(pkgDir, config, dryRun);
|
|
224
|
-
for (const result of pkgResults) {
|
|
225
|
-
if (result.error) {
|
|
226
|
-
console.error(chalk.red(`✗ ${pkgDir}: ${result.error}`));
|
|
227
|
-
pkgErrorCount++;
|
|
228
|
-
} else {
|
|
229
|
-
const suffix = dryRun ? " (dry run)" : "";
|
|
230
|
-
const rel = pkgDir.startsWith(workdir) ? pkgDir.slice(workdir.length + 1) : pkgDir;
|
|
231
|
-
console.log(chalk.green(`✓ ${rel}/${result.outputFile} (${result.content.length} bytes${suffix})`));
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
if (pkgErrorCount > 0) {
|
|
236
|
-
console.error(chalk.red(`\n✗ ${pkgErrorCount} package generation(s) failed`));
|
|
237
|
-
process.exit(1);
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
if (!dryRun) {
|
|
243
|
-
console.log(chalk.green(`\n✓ Agent configs written to ${outputDir}`));
|
|
244
|
-
}
|
|
245
|
-
} catch (err) {
|
|
246
|
-
const error = err instanceof Error ? err.message : String(err);
|
|
247
|
-
console.error(chalk.red(`✗ Generation failed: ${error}`));
|
|
248
|
-
process.exit(1);
|
|
249
|
-
}
|
|
250
|
-
}
|
package/src/cli/index.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI Utilities
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
export { analyzeFeature } from "./analyze";
|
|
6
|
-
export { planCommand } from "./plan";
|
|
7
|
-
export { acceptCommand, type AcceptOptions } from "./accept";
|
|
8
|
-
export {
|
|
9
|
-
displayCostMetrics,
|
|
10
|
-
displayLastRunMetrics,
|
|
11
|
-
displayModelEfficiency,
|
|
12
|
-
displayFeatureStatus,
|
|
13
|
-
type FeatureStatusOptions,
|
|
14
|
-
} from "./status";
|
|
15
|
-
export {
|
|
16
|
-
runsListCommand,
|
|
17
|
-
runsShowCommand,
|
|
18
|
-
type RunsListOptions,
|
|
19
|
-
type RunsShowOptions,
|
|
20
|
-
} from "./runs";
|
|
21
|
-
export {
|
|
22
|
-
promptsCommand,
|
|
23
|
-
promptsInitCommand,
|
|
24
|
-
exportPromptCommand,
|
|
25
|
-
type PromptsCommandOptions,
|
|
26
|
-
type PromptsInitCommandOptions,
|
|
27
|
-
type ExportPromptCommandOptions,
|
|
28
|
-
} from "./prompts";
|
|
29
|
-
export { initCommand, type InitOptions } from "./init";
|
|
30
|
-
export { pluginsListCommand } from "./plugins";
|
|
31
|
-
export { diagnoseCommand, type DiagnoseOptions } from "./diagnose";
|
|
32
|
-
export {
|
|
33
|
-
interactListCommand,
|
|
34
|
-
interactRespondCommand,
|
|
35
|
-
interactCancelCommand,
|
|
36
|
-
type InteractListOptions,
|
|
37
|
-
type InteractRespondOptions,
|
|
38
|
-
type InteractCancelOptions,
|
|
39
|
-
} from "./interact";
|
|
40
|
-
export { generateCommand, type GenerateCommandOptions } from "./generate";
|
|
41
|
-
export { configCommand, type ConfigCommandOptions } from "./config";
|
|
42
|
-
export { agentsListCommand } from "./agents";
|