@stacknext/cli 0.0.0-stage → 0.6.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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +41 -2
  3. package/dist/bin.d.ts +3 -0
  4. package/dist/bin.d.ts.map +1 -0
  5. package/dist/bin.js +4 -0
  6. package/dist/bin.js.map +1 -0
  7. package/dist/collector/server.d.ts +28 -0
  8. package/dist/collector/server.d.ts.map +1 -0
  9. package/dist/collector/server.js +1258 -0
  10. package/dist/collector/server.js.map +1 -0
  11. package/dist/collector/test-runs.d.ts +40 -0
  12. package/dist/collector/test-runs.d.ts.map +1 -0
  13. package/dist/collector/test-runs.js +153 -0
  14. package/dist/collector/test-runs.js.map +1 -0
  15. package/dist/commands/baseline.d.ts +25 -0
  16. package/dist/commands/baseline.d.ts.map +1 -0
  17. package/dist/commands/baseline.js +151 -0
  18. package/dist/commands/baseline.js.map +1 -0
  19. package/dist/commands/capture.d.ts +13 -0
  20. package/dist/commands/capture.d.ts.map +1 -0
  21. package/dist/commands/capture.js +277 -0
  22. package/dist/commands/capture.js.map +1 -0
  23. package/dist/commands/compare.d.ts +17 -0
  24. package/dist/commands/compare.d.ts.map +1 -0
  25. package/dist/commands/compare.js +95 -0
  26. package/dist/commands/compare.js.map +1 -0
  27. package/dist/commands/coverage.d.ts +9 -0
  28. package/dist/commands/coverage.d.ts.map +1 -0
  29. package/dist/commands/coverage.js +124 -0
  30. package/dist/commands/coverage.js.map +1 -0
  31. package/dist/commands/dev.d.ts +19 -0
  32. package/dist/commands/dev.d.ts.map +1 -0
  33. package/dist/commands/dev.js +296 -0
  34. package/dist/commands/dev.js.map +1 -0
  35. package/dist/commands/diagnose.d.ts +22 -0
  36. package/dist/commands/diagnose.d.ts.map +1 -0
  37. package/dist/commands/diagnose.js +235 -0
  38. package/dist/commands/diagnose.js.map +1 -0
  39. package/dist/commands/doctor.d.ts +7 -0
  40. package/dist/commands/doctor.d.ts.map +1 -0
  41. package/dist/commands/doctor.js +176 -0
  42. package/dist/commands/doctor.js.map +1 -0
  43. package/dist/commands/export.d.ts +9 -0
  44. package/dist/commands/export.d.ts.map +1 -0
  45. package/dist/commands/export.js +55 -0
  46. package/dist/commands/export.js.map +1 -0
  47. package/dist/commands/init.d.ts +11 -0
  48. package/dist/commands/init.d.ts.map +1 -0
  49. package/dist/commands/init.js +203 -0
  50. package/dist/commands/init.js.map +1 -0
  51. package/dist/commands/mcp.d.ts +12 -0
  52. package/dist/commands/mcp.d.ts.map +1 -0
  53. package/dist/commands/mcp.js +32 -0
  54. package/dist/commands/mcp.js.map +1 -0
  55. package/dist/commands/regression-shared.d.ts +12 -0
  56. package/dist/commands/regression-shared.d.ts.map +1 -0
  57. package/dist/commands/regression-shared.js +149 -0
  58. package/dist/commands/regression-shared.js.map +1 -0
  59. package/dist/commands/runs.d.ts +13 -0
  60. package/dist/commands/runs.d.ts.map +1 -0
  61. package/dist/commands/runs.js +85 -0
  62. package/dist/commands/runs.js.map +1 -0
  63. package/dist/commands/status.d.ts +7 -0
  64. package/dist/commands/status.d.ts.map +1 -0
  65. package/dist/commands/status.js +70 -0
  66. package/dist/commands/status.js.map +1 -0
  67. package/dist/commands/uninstall.d.ts +15 -0
  68. package/dist/commands/uninstall.d.ts.map +1 -0
  69. package/dist/commands/uninstall.js +209 -0
  70. package/dist/commands/uninstall.js.map +1 -0
  71. package/dist/http.d.ts +7 -0
  72. package/dist/http.d.ts.map +1 -0
  73. package/dist/http.js +54 -0
  74. package/dist/http.js.map +1 -0
  75. package/dist/index.d.ts +22 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +22 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/output.d.ts +16 -0
  80. package/dist/output.d.ts.map +1 -0
  81. package/dist/output.js +60 -0
  82. package/dist/output.js.map +1 -0
  83. package/dist/program.d.ts +4 -0
  84. package/dist/program.d.ts.map +1 -0
  85. package/dist/program.js +54 -0
  86. package/dist/program.js.map +1 -0
  87. package/dist/project.d.ts +35 -0
  88. package/dist/project.d.ts.map +1 -0
  89. package/dist/project.js +169 -0
  90. package/dist/project.js.map +1 -0
  91. package/dist/runtime.d.ts +26 -0
  92. package/dist/runtime.d.ts.map +1 -0
  93. package/dist/runtime.js +89 -0
  94. package/dist/runtime.js.map +1 -0
  95. package/dist/session.d.ts +10 -0
  96. package/dist/session.d.ts.map +1 -0
  97. package/dist/session.js +23 -0
  98. package/dist/session.js.map +1 -0
  99. package/dist/version.d.ts +2 -0
  100. package/dist/version.d.ts.map +1 -0
  101. package/dist/version.js +2 -0
  102. package/dist/version.js.map +1 -0
  103. package/package.json +58 -3
@@ -0,0 +1,296 @@
1
+ import { spawn, spawnSync } from 'node:child_process';
2
+ import { rmSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { nextOtelVerboseStatus } from '@stacknext/core';
5
+ import { loadConfig } from '@stacknext/core/config-file';
6
+ import { detectProject, packageManagerCommand, } from '../project.js';
7
+ import { printBanner, printCheck, printSection, style } from '../output.js';
8
+ import { generateToken, isProcessAlive, readRuntimeState, removeRuntimeState, runtimeStatePath, writeRuntimeState, } from '../runtime.js';
9
+ import { resolveDashboardDir, startCollector } from '../collector/server.js';
10
+ import { CLI_VERSION } from '../version.js';
11
+ function openBrowser(url) {
12
+ const [command, args] = process.platform === 'darwin'
13
+ ? ['open', [url]]
14
+ : process.platform === 'win32'
15
+ ? ['cmd', ['/c', 'start', '', url]]
16
+ : ['xdg-open', [url]];
17
+ try {
18
+ const child = spawn(command, args, { detached: true, stdio: 'ignore' });
19
+ child.unref();
20
+ }
21
+ catch {
22
+ // Opening a browser is best effort.
23
+ }
24
+ }
25
+ export function buildDevEnvironment(base, collectorUrl, token, projectName, nextVersion, debug = false, instrumentation) {
26
+ const inheritedVerbose = base.NEXT_OTEL_VERBOSE;
27
+ const verboseEnv = inheritedVerbose !== undefined && inheritedVerbose.trim() !== ''
28
+ ? inheritedVerbose
29
+ : instrumentation?.verbose === true
30
+ ? '1'
31
+ : undefined;
32
+ return {
33
+ ...base,
34
+ STACKNEXT_COLLECTOR_URL: collectorUrl,
35
+ STACKNEXT_TOKEN: token,
36
+ STACKNEXT_PROJECT_NAME: projectName,
37
+ STACKNEXT_SERVICE_NAME: projectName,
38
+ STACKNEXT_DEBUG: debug || instrumentation?.verbose === true ? '1' : '0',
39
+ STACKNEXT_CAPTURE_FETCH: instrumentation?.captureFetch === false ? '0' : '1',
40
+ STACKNEXT_CAPTURE_ERRORS: instrumentation?.captureErrors === false ? '0' : '1',
41
+ ...(verboseEnv !== undefined ? { NEXT_OTEL_VERBOSE: verboseEnv } : {}),
42
+ ...(nextVersion ? { STACKNEXT_NEXT_VERSION: nextVersion } : {}),
43
+ };
44
+ }
45
+ export function nextDevCommand(project, nextArgs) {
46
+ const base = packageManagerCommand(project.packageManager, 'dev');
47
+ if (nextArgs.length === 0)
48
+ return base;
49
+ if (project.packageManager === 'yarn') {
50
+ return { command: base.command, args: [...base.args, ...nextArgs] };
51
+ }
52
+ return { command: base.command, args: [...base.args, '--', ...nextArgs] };
53
+ }
54
+ async function assertNotAlreadyRunning(projectDir) {
55
+ const existing = await readRuntimeState(projectDir);
56
+ if (!existing)
57
+ return;
58
+ if (isProcessAlive(existing.pid)) {
59
+ throw new Error(`StackNext is already running for this project at ${existing.dashboardUrl} (pid ${existing.pid}).`);
60
+ }
61
+ await removeRuntimeState(projectDir);
62
+ }
63
+ export async function runDev(options, nextArgs, cwd = process.cwd()) {
64
+ const project = await detectProject(cwd);
65
+ if (!project.scripts.dev) {
66
+ throw new Error(`No "dev" script found in ${project.dir}/package.json. Add one that starts Next.js.`);
67
+ }
68
+ if (options.token !== undefined && options.token.length < 16) {
69
+ throw new Error('--token must be at least 16 characters');
70
+ }
71
+ await assertNotAlreadyRunning(project.dir);
72
+ const config = await loadConfig(project.dir);
73
+ const dashboardDir = await resolveDashboardDir();
74
+ const token = options.token ?? generateToken();
75
+ const projectName = config.projectName ?? project.name;
76
+ const startedAt = Date.now();
77
+ const nextOtelVerbose = nextOtelVerboseStatus(config.instrumentation.verbose, process.env.NEXT_OTEL_VERBOSE);
78
+ printBanner(CLI_VERSION);
79
+ printSection(`Starting collector for ${projectName}`);
80
+ const collector = await startCollector({
81
+ port: config.dashboard.port,
82
+ token,
83
+ projectName,
84
+ config,
85
+ dashboardDir,
86
+ projectDir: project.dir,
87
+ autoPort: true,
88
+ nextOtelVerbose,
89
+ log: (message) => console.error(style.dim(message)),
90
+ });
91
+ const collectorUrl = `http://127.0.0.1:${collector.port}`;
92
+ const state = {
93
+ version: 1,
94
+ pid: process.pid,
95
+ startedAt,
96
+ projectDir: project.dir,
97
+ projectName,
98
+ dashboardUrl: collector.url,
99
+ collectorUrl,
100
+ port: collector.port,
101
+ token,
102
+ ...(project.nextVersion ? { nextVersion: project.nextVersion } : {}),
103
+ command: nextDevCommand(project, nextArgs).command,
104
+ };
105
+ await writeRuntimeState(project.dir, state);
106
+ printCheck('pass', `Dashboard ${collector.url}`);
107
+ printCheck('pass', `Ingestion ${collectorUrl}/__stacknext/v1/ingest`, 'bearer token stored in .stacknext/run.json');
108
+ if (project.nextVersion)
109
+ printCheck('pass', `Next.js ${project.nextVersion}`);
110
+ if (nextOtelVerbose.enabled) {
111
+ printCheck('pass', `Verbose Next.js spans enabled (${nextOtelVerbose.source})`, 'NEXT_OTEL_VERBOSE=1 increases span volume and dev-server overhead');
112
+ }
113
+ else if (nextOtelVerbose.source === 'unknown') {
114
+ printCheck('warn', 'NEXT_OTEL_VERBOSE has an unrecognized value', 'Next.js only enables verbose spans for the literal value "1"');
115
+ }
116
+ else {
117
+ printCheck('pass', 'Standard Next.js span set', 'set instrumentation.verbose or NEXT_OTEL_VERBOSE=1 for expanded spans');
118
+ }
119
+ if (!project.instrumentationPath) {
120
+ printCheck('warn', 'No instrumentation file found', 'Run "stacknext init" so the app exports spans.');
121
+ }
122
+ else {
123
+ printCheck('pass', `${path.relative(project.dir, project.instrumentationPath)} detected`);
124
+ }
125
+ if (options.open)
126
+ openBrowser(collector.url);
127
+ const devCommand = nextDevCommand(project, nextArgs);
128
+ const env = buildDevEnvironment(process.env, collectorUrl, token, projectName, project.nextVersion, process.env.STACKNEXT_DEBUG === '1', config.instrumentation);
129
+ let child = null;
130
+ let shuttingDown = false;
131
+ let resolveExit = null;
132
+ const finished = new Promise((resolve) => {
133
+ resolveExit = resolve;
134
+ });
135
+ const shutdown = async (exitCode) => {
136
+ if (shuttingDown)
137
+ return;
138
+ shuttingDown = true;
139
+ await terminateChild(child);
140
+ await collector.close();
141
+ await removeRuntimeState(project.dir);
142
+ // An IPC channel created by a programmatic launcher keeps the event loop
143
+ // alive after cleanup; close it before reporting the exit.
144
+ try {
145
+ if (process.connected)
146
+ process.disconnect();
147
+ }
148
+ catch {
149
+ // The launcher may have closed the channel first.
150
+ }
151
+ resolveExit?.(exitCode);
152
+ };
153
+ process.once('SIGINT', () => {
154
+ void shutdown(130);
155
+ });
156
+ process.once('SIGTERM', () => {
157
+ void shutdown(143);
158
+ });
159
+ // Windows cannot deliver SIGINT/SIGTERM to another console process, so a
160
+ // programmatic launcher can request the same graceful shutdown over the IPC
161
+ // channel it created. Parent processes are always trusted; no network API.
162
+ process.on('message', (message) => {
163
+ if (message?.type === 'shutdown') {
164
+ void shutdown(0);
165
+ }
166
+ });
167
+ if (!options.quiet) {
168
+ printSection(`Starting Next.js (${devCommand.command} ${devCommand.args.join(' ')})`);
169
+ }
170
+ child = spawn(devCommand.command, devCommand.args, {
171
+ cwd: project.dir,
172
+ env,
173
+ stdio: 'inherit',
174
+ shell: process.platform === 'win32',
175
+ // On Unix, put the app in its own process group so shutdown also stops
176
+ // Next.js worker processes. Windows uses taskkill /T below.
177
+ detached: process.platform !== 'win32',
178
+ });
179
+ const activeChild = child;
180
+ process.once('exit', () => {
181
+ // Last-resort synchronous cleanup for unexpected exits. SIGKILL cannot be
182
+ // intercepted; the next `stacknext dev` removes stale runtime state.
183
+ if (activeChild.pid && processGroupAlive(activeChild.pid)) {
184
+ terminateChildSync(activeChild);
185
+ }
186
+ try {
187
+ rmSync(runtimeStatePath(project.dir), { force: true });
188
+ }
189
+ catch {
190
+ // Best effort during process exit.
191
+ }
192
+ });
193
+ child.once('error', (error) => {
194
+ console.error(style.red(`Could not start Next.js: ${error.message}`));
195
+ void shutdown(1);
196
+ });
197
+ child.once('exit', (code, signal) => {
198
+ void shutdown(signal && !shuttingDown ? 1 : (code ?? 0));
199
+ });
200
+ const exitCode = await finished;
201
+ if (!options.quiet) {
202
+ printSection('StackNext stopped');
203
+ console.log(style.dim(`Runtime state removed (${runtimeStatePath(project.dir)})`));
204
+ }
205
+ return exitCode;
206
+ }
207
+ function delay(ms) {
208
+ return new Promise((resolve) => setTimeout(resolve, ms));
209
+ }
210
+ function processGroupAlive(pid) {
211
+ try {
212
+ process.kill(-pid, 0);
213
+ return true;
214
+ }
215
+ catch (error) {
216
+ return error.code === 'EPERM';
217
+ }
218
+ }
219
+ async function terminateChild(child) {
220
+ if (!child)
221
+ return;
222
+ if (process.platform === 'win32') {
223
+ if (child.pid) {
224
+ spawnSync('taskkill', ['/pid', String(child.pid), '/T', '/F'], {
225
+ stdio: 'ignore',
226
+ windowsHide: true,
227
+ });
228
+ }
229
+ return;
230
+ }
231
+ const pid = child.pid;
232
+ if (!pid) {
233
+ child.kill('SIGTERM');
234
+ return;
235
+ }
236
+ const signalGroup = (signal) => {
237
+ try {
238
+ process.kill(-pid, signal);
239
+ return true;
240
+ }
241
+ catch {
242
+ return false;
243
+ }
244
+ };
245
+ if (!signalGroup('SIGTERM') && child.exitCode === null && child.signalCode === null) {
246
+ child.kill('SIGTERM');
247
+ }
248
+ const stillRunning = () => processGroupAlive(pid) || (child.exitCode === null && child.signalCode === null);
249
+ const deadline = Date.now() + 3_000;
250
+ while (stillRunning() && Date.now() < deadline) {
251
+ await delay(50);
252
+ }
253
+ if (stillRunning()) {
254
+ signalGroup('SIGKILL');
255
+ if (child.exitCode === null && child.signalCode === null)
256
+ child.kill('SIGKILL');
257
+ const killDeadline = Date.now() + 500;
258
+ while (stillRunning() && Date.now() < killDeadline) {
259
+ await delay(25);
260
+ }
261
+ }
262
+ }
263
+ function terminateChildSync(child) {
264
+ if (!child.pid)
265
+ return;
266
+ if (process.platform === 'win32') {
267
+ spawnSync('taskkill', ['/pid', String(child.pid), '/T', '/F'], {
268
+ stdio: 'ignore',
269
+ windowsHide: true,
270
+ });
271
+ return;
272
+ }
273
+ try {
274
+ process.kill(-child.pid, 'SIGKILL');
275
+ }
276
+ catch {
277
+ if (child.exitCode === null && child.signalCode === null) {
278
+ child.kill('SIGKILL');
279
+ }
280
+ }
281
+ }
282
+ export function registerDevCommand(program, cwd) {
283
+ program
284
+ .command('dev')
285
+ .description('Start the local collector and the project dev server')
286
+ .option('--open', 'open the dashboard in the default browser')
287
+ .option('--quiet', 'reduce startup output')
288
+ .option('--token <token>', 'use an existing collector token (16+ characters)')
289
+ .argument('[nextArgs...]', 'arguments forwarded to the Next.js dev server')
290
+ .action(async (nextArgs, options) => {
291
+ const code = await runDev(options, nextArgs, cwd);
292
+ if (code !== 0)
293
+ process.exitCode = code;
294
+ });
295
+ }
296
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { Command } from 'commander';
2
+ import { type DiagnosticDetailResponse, type DiagnosticListResponse } from '@stacknext/core';
3
+ export interface DiagnoseOptions {
4
+ json?: boolean;
5
+ id?: string;
6
+ traceId?: string;
7
+ category?: string;
8
+ severity?: string;
9
+ status?: string;
10
+ rule?: string;
11
+ route?: string;
12
+ since?: string;
13
+ until?: string;
14
+ limit?: string;
15
+ offset?: string;
16
+ q?: string;
17
+ }
18
+ export declare function formatDiagnosticList(response: DiagnosticListResponse, now?: number): string;
19
+ export declare function formatDiagnosticDetail(detail: DiagnosticDetailResponse, now?: number): string;
20
+ export declare function runDiagnose(options: DiagnoseOptions, cwd?: string): Promise<number>;
21
+ export declare function registerDiagnoseCommand(program: Command, cwd: string): void;
22
+ //# sourceMappingURL=diagnose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../../src/commands/diagnose.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAML,KAAK,wBAAwB,EAE7B,KAAK,sBAAsB,EAI5B,MAAM,iBAAiB,CAAA;AAWxB,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,CAAC,CAAC,EAAE,MAAM,CAAA;CACX;AAsDD,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,sBAAsB,EAChC,GAAG,SAAa,GACf,MAAM,CAgER;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,wBAAwB,EAChC,GAAG,SAAa,GACf,MAAM,CAuFR;AA2CD,wBAAsB,WAAW,CAC/B,OAAO,EAAE,eAAe,EACxB,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CAwBjB;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAqB3E"}
@@ -0,0 +1,235 @@
1
+ import { DIAGNOSTIC_CATEGORIES, DIAGNOSTIC_RULE_IDS, DIAGNOSTIC_SEVERITIES, DIAGNOSTIC_STATUSES, } from '@stacknext/core';
2
+ import { collectorJson } from '../http.js';
3
+ import { formatDuration, formatRelativeTime, printBanner, style, } from '../output.js';
4
+ import { requireRunningState } from '../session.js';
5
+ import { CLI_VERSION } from '../version.js';
6
+ function parseChoice(value, allowed, label) {
7
+ if (!value)
8
+ return undefined;
9
+ if (!allowed.includes(value)) {
10
+ throw new Error(`Invalid ${label} "${value}". Use one of: ${allowed.join(', ')}`);
11
+ }
12
+ return value;
13
+ }
14
+ function parseTimestamp(value, label) {
15
+ if (!value)
16
+ return undefined;
17
+ const numeric = Number(value);
18
+ if (Number.isFinite(numeric))
19
+ return numeric;
20
+ const parsed = Date.parse(value);
21
+ if (Number.isFinite(parsed))
22
+ return parsed;
23
+ throw new Error(`Invalid ${label} "${value}". Use an ISO timestamp or epoch milliseconds.`);
24
+ }
25
+ function parseInteger(value, label) {
26
+ if (!value)
27
+ return undefined;
28
+ const parsed = Number(value);
29
+ if (!Number.isFinite(parsed) || parsed < 0) {
30
+ throw new Error(`Invalid ${label} "${value}". Use a non-negative number.`);
31
+ }
32
+ return Math.trunc(parsed);
33
+ }
34
+ function severityMarker(severity) {
35
+ if (severity === 'error')
36
+ return style.red('✗');
37
+ if (severity === 'warning')
38
+ return style.yellow('!');
39
+ return style.cyan('·');
40
+ }
41
+ function findingLine(finding, now) {
42
+ const location = finding.route ? ` ${style.dim(finding.route)}` : '';
43
+ const lastSeen = formatRelativeTime(finding.lastSeen, now);
44
+ return `${severityMarker(finding.severity)} ${style.bold(finding.title)}${location}\n ${style.dim(`${finding.status} · ${finding.ruleId} · last ${lastSeen} · ${finding.id}`)}`;
45
+ }
46
+ function evidenceCount(finding) {
47
+ const counts = [];
48
+ if (finding.evidence.spans.length > 0)
49
+ counts.push(`${finding.evidence.spans.length} spans`);
50
+ if (finding.evidence.queries.length > 0)
51
+ counts.push(`${finding.evidence.queries.length} queries`);
52
+ if (finding.evidence.errors.length > 0)
53
+ counts.push(`${finding.evidence.errors.length} errors`);
54
+ return counts.join(', ');
55
+ }
56
+ export function formatDiagnosticList(response, now = Date.now()) {
57
+ const lines = [];
58
+ lines.push(`${style.bold('StackNext diagnostics')} ${style.dim(`v${response.engineVersion} · rules ${response.ruleSetVersion}`)}`);
59
+ lines.push(`Sample ${response.sample.requests} requests, ${response.sample.spans} spans, ${response.sample.errors} errors, ${response.sample.databaseQueries} database queries`);
60
+ lines.push(`Findings ${response.total} total · ${response.counts.bySeverity.error} error, ${response.counts.bySeverity.warning} warning, ${response.counts.bySeverity.info} info`);
61
+ lines.push(`Statuses ${DIAGNOSTIC_STATUSES.map((status) => `${status} ${response.counts.byStatus[status]}`).join(', ')}`);
62
+ lines.push(style.dim('Findings are deterministic evidence from the current retention window, not confirmed root causes.'));
63
+ if (response.items.length === 0) {
64
+ lines.push('');
65
+ lines.push('No diagnostic findings matched the filters.');
66
+ }
67
+ else {
68
+ for (const finding of response.items) {
69
+ lines.push('');
70
+ lines.push(findingLine(finding, now));
71
+ lines.push(` ${finding.summary}`);
72
+ const counts = evidenceCount(finding);
73
+ const trace = finding.traceIds[0];
74
+ if (counts || trace) {
75
+ lines.push(style.dim(` ${counts}${counts && trace ? ' · ' : ''}${trace ? `trace ${trace}` : ''}`));
76
+ }
77
+ lines.push(style.dim(` verify: ${finding.verification[0] ?? 'Review the evidence.'}`));
78
+ }
79
+ if (response.total > response.items.length) {
80
+ lines.push('');
81
+ lines.push(style.dim(`Showing ${response.items.length} of ${response.total}. Use --limit/--offset or narrow the filters.`));
82
+ }
83
+ }
84
+ if (response.notes.length > 0) {
85
+ lines.push('');
86
+ lines.push(style.bold('Notes'));
87
+ for (const note of response.notes)
88
+ lines.push(`· ${note}`);
89
+ }
90
+ lines.push('');
91
+ lines.push(style.bold('Limitations'));
92
+ for (const limitation of response.limitations.slice(0, 4)) {
93
+ lines.push(style.dim(`· ${limitation}`));
94
+ }
95
+ return lines.join('\n');
96
+ }
97
+ export function formatDiagnosticDetail(detail, now = Date.now()) {
98
+ const { finding, trace } = detail;
99
+ const lines = [];
100
+ lines.push(`${style.bold('StackNext diagnostic')} ${style.dim(finding.id)} — ${finding.ruleId}`);
101
+ lines.push('');
102
+ lines.push(findingLine(finding, now));
103
+ lines.push('');
104
+ lines.push(finding.detail);
105
+ lines.push(`Route ${finding.route ?? 'unknown'}${finding.method ? ` · ${finding.method}` : ''}`);
106
+ lines.push(`Window ${new Date(finding.firstSeen).toISOString()} → ${new Date(finding.lastSeen).toISOString()}`);
107
+ lines.push(`Fingerprint ${finding.fingerprint}`);
108
+ lines.push(`Traces ${finding.traceIds.join(', ') || 'none'}`);
109
+ if (finding.evidence.measurements.length > 0) {
110
+ lines.push('');
111
+ lines.push(style.bold('Measurements'));
112
+ for (const measurement of finding.evidence.measurements) {
113
+ lines.push(`· ${measurement.label}: ${String(measurement.value)}${measurement.unit ? ` ${measurement.unit}` : ''}`);
114
+ }
115
+ }
116
+ if (finding.evidence.spans.length > 0) {
117
+ lines.push('');
118
+ lines.push(style.bold('Spans'));
119
+ for (const span of finding.evidence.spans.slice(0, 5)) {
120
+ lines.push(`· ${span.name} — ${formatDuration(span.durationMs)} · ${span.category} · ${span.spanId}`);
121
+ }
122
+ }
123
+ if (finding.evidence.queries.length > 0) {
124
+ lines.push('');
125
+ lines.push(style.bold('Queries'));
126
+ for (const query of finding.evidence.queries.slice(0, 3)) {
127
+ lines.push(`· ${query.databaseSystem}${query.operation ? ` ${query.operation}` : ''} — ${formatDuration(query.durationMs)}`);
128
+ lines.push(style.dim(` ${query.sqlPreview}`));
129
+ }
130
+ }
131
+ if (finding.evidence.errors.length > 0) {
132
+ lines.push('');
133
+ lines.push(style.bold('Errors'));
134
+ for (const error of finding.evidence.errors.slice(0, 3)) {
135
+ lines.push(`· ${error.name}: ${error.message}`);
136
+ lines.push(style.dim(` ${new Date(error.timestamp).toISOString()} · ${error.id}`));
137
+ }
138
+ }
139
+ if (trace) {
140
+ lines.push('');
141
+ lines.push(style.bold('Related trace'));
142
+ lines.push(`${trace.traceId} — ${trace.spanCount} spans, ${trace.databaseQueryCount} queries, ${trace.errorCount} errors, ${formatDuration(trace.durationMs)}`);
143
+ if (trace.missingParentSpanIds.length > 0) {
144
+ lines.push(style.dim(`Missing parent spans: ${trace.missingParentSpanIds.join(', ')}`));
145
+ }
146
+ }
147
+ lines.push('');
148
+ lines.push(style.bold('Verification'));
149
+ for (const step of finding.verification)
150
+ lines.push(`· ${step}`);
151
+ lines.push('');
152
+ lines.push(style.bold('Limitations'));
153
+ for (const limitation of finding.limitations)
154
+ lines.push(style.dim(`· ${limitation}`));
155
+ return lines.join('\n');
156
+ }
157
+ function buildSearch(options) {
158
+ const params = new URLSearchParams();
159
+ const category = parseChoice(options.category, DIAGNOSTIC_CATEGORIES, 'category');
160
+ const severity = parseChoice(options.severity, DIAGNOSTIC_SEVERITIES, 'severity');
161
+ const status = parseChoice(options.status, DIAGNOSTIC_STATUSES, 'status');
162
+ const ruleId = parseChoice(options.rule, DIAGNOSTIC_RULE_IDS, 'rule');
163
+ const since = parseTimestamp(options.since, 'since');
164
+ const until = parseTimestamp(options.until, 'until');
165
+ const limit = parseInteger(options.limit, 'limit');
166
+ const offset = parseInteger(options.offset, 'offset');
167
+ if (category)
168
+ params.set('category', category);
169
+ if (severity)
170
+ params.set('severity', severity);
171
+ if (status)
172
+ params.set('status', status);
173
+ if (ruleId)
174
+ params.set('ruleId', ruleId);
175
+ if (options.traceId)
176
+ params.set('traceId', options.traceId);
177
+ if (options.route)
178
+ params.set('route', options.route);
179
+ if (options.q)
180
+ params.set('q', options.q);
181
+ if (since !== undefined)
182
+ params.set('since', String(since));
183
+ if (until !== undefined)
184
+ params.set('until', String(until));
185
+ if (limit !== undefined)
186
+ params.set('limit', String(limit));
187
+ if (offset !== undefined)
188
+ params.set('offset', String(offset));
189
+ const query = params.toString();
190
+ return query ? `?${query}` : '';
191
+ }
192
+ export async function runDiagnose(options, cwd = process.cwd()) {
193
+ const state = await requireRunningState(cwd);
194
+ if (options.id) {
195
+ const detail = await collectorJson(state.collectorUrl, `/api/diagnostics/${encodeURIComponent(options.id)}`, state.token);
196
+ if (options.json)
197
+ console.log(JSON.stringify(detail, null, 2));
198
+ else
199
+ console.log(formatDiagnosticDetail(detail));
200
+ return 0;
201
+ }
202
+ const response = await collectorJson(state.collectorUrl, `/api/diagnostics${buildSearch(options)}`, state.token);
203
+ if (options.json) {
204
+ console.log(JSON.stringify(response, null, 2));
205
+ }
206
+ else {
207
+ printBanner(CLI_VERSION);
208
+ console.log(formatDiagnosticList(response));
209
+ }
210
+ return 0;
211
+ }
212
+ export function registerDiagnoseCommand(program, cwd) {
213
+ program
214
+ .command('diagnose')
215
+ .description('List deterministic diagnostic findings from the current sample')
216
+ .option('--id <finding-id>', 'show one finding and its related trace evidence')
217
+ .option('--trace-id <trace-id>', 'only findings that reference this trace')
218
+ .option('--category <category>', `filter by category (${DIAGNOSTIC_CATEGORIES.join(', ')})`)
219
+ .option('--severity <severity>', `filter by severity (${DIAGNOSTIC_SEVERITIES.join(', ')})`)
220
+ .option('--status <status>', `filter by status (${DIAGNOSTIC_STATUSES.join(', ')})`)
221
+ .option('--rule <rule-id>', `filter by rule (${DIAGNOSTIC_RULE_IDS.join(', ')})`)
222
+ .option('--route <route>', 'filter by route substring')
223
+ .option('--since <time>', 'only findings active since an ISO timestamp or epoch ms')
224
+ .option('--until <time>', 'only findings active until an ISO timestamp or epoch ms')
225
+ .option('--limit <number>', 'maximum findings to return (1-200)')
226
+ .option('--offset <number>', 'pagination offset')
227
+ .option('-q, --q <text>', 'search titles, summaries, details and fingerprints')
228
+ .option('--json', 'print machine-readable JSON')
229
+ .action(async (options) => {
230
+ const code = await runDiagnose(options, cwd);
231
+ if (code !== 0)
232
+ process.exitCode = code;
233
+ });
234
+ }
235
+ //# sourceMappingURL=diagnose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/commands/diagnose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Command } from 'commander';
2
+ export interface DoctorOptions {
3
+ json?: boolean;
4
+ }
5
+ export declare function runDoctor(options: DoctorOptions, cwd?: string): Promise<number>;
6
+ export declare function registerDoctorCommand(program: Command, cwd: string): void;
7
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAoBxC,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAoBD,wBAAsB,SAAS,CAC7B,OAAO,EAAE,aAAa,EACtB,GAAG,SAAgB,GAClB,OAAO,CAAC,MAAM,CAAC,CA2OjB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CASzE"}