@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.
- package/LICENSE +21 -0
- package/README.md +41 -2
- package/dist/bin.d.ts +3 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +4 -0
- package/dist/bin.js.map +1 -0
- package/dist/collector/server.d.ts +28 -0
- package/dist/collector/server.d.ts.map +1 -0
- package/dist/collector/server.js +1258 -0
- package/dist/collector/server.js.map +1 -0
- package/dist/collector/test-runs.d.ts +40 -0
- package/dist/collector/test-runs.d.ts.map +1 -0
- package/dist/collector/test-runs.js +153 -0
- package/dist/collector/test-runs.js.map +1 -0
- package/dist/commands/baseline.d.ts +25 -0
- package/dist/commands/baseline.d.ts.map +1 -0
- package/dist/commands/baseline.js +151 -0
- package/dist/commands/baseline.js.map +1 -0
- package/dist/commands/capture.d.ts +13 -0
- package/dist/commands/capture.d.ts.map +1 -0
- package/dist/commands/capture.js +277 -0
- package/dist/commands/capture.js.map +1 -0
- package/dist/commands/compare.d.ts +17 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +95 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/coverage.d.ts +9 -0
- package/dist/commands/coverage.d.ts.map +1 -0
- package/dist/commands/coverage.js +124 -0
- package/dist/commands/coverage.js.map +1 -0
- package/dist/commands/dev.d.ts +19 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +296 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/diagnose.d.ts +22 -0
- package/dist/commands/diagnose.d.ts.map +1 -0
- package/dist/commands/diagnose.js +235 -0
- package/dist/commands/diagnose.js.map +1 -0
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +176 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/export.d.ts +9 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +55 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +203 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/mcp.d.ts +12 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +32 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/regression-shared.d.ts +12 -0
- package/dist/commands/regression-shared.d.ts.map +1 -0
- package/dist/commands/regression-shared.js +149 -0
- package/dist/commands/regression-shared.js.map +1 -0
- package/dist/commands/runs.d.ts +13 -0
- package/dist/commands/runs.d.ts.map +1 -0
- package/dist/commands/runs.js +85 -0
- package/dist/commands/runs.js.map +1 -0
- package/dist/commands/status.d.ts +7 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +70 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +15 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +209 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/http.d.ts +7 -0
- package/dist/http.d.ts.map +1 -0
- package/dist/http.js +54 -0
- package/dist/http.js.map +1 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +16 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +60 -0
- package/dist/output.js.map +1 -0
- package/dist/program.d.ts +4 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +54 -0
- package/dist/program.js.map +1 -0
- package/dist/project.d.ts +35 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +169 -0
- package/dist/project.js.map +1 -0
- package/dist/runtime.d.ts +26 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +89 -0
- package/dist/runtime.js.map +1 -0
- package/dist/session.d.ts +10 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +23 -0
- package/dist/session.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- 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":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAqB,MAAM,oBAAoB,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAExD,OAAO,EACL,aAAa,EACb,qBAAqB,GAEtB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,cAAc,CAAA;AAC3E,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAElB,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAQ3C,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,GACnB,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC3B,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC5B,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3B,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QACvE,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,IAAuB,EACvB,YAAoB,EACpB,KAAa,EACb,WAAmB,EACnB,WAA0B,EAC1B,KAAK,GAAG,KAAK,EACb,eAAqF;IAErF,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAA;IAC/C,MAAM,UAAU,GACd,gBAAgB,KAAK,SAAS,IAAI,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE;QAC9D,CAAC,CAAC,gBAAgB;QAClB,CAAC,CAAC,eAAe,EAAE,OAAO,KAAK,IAAI;YACjC,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,SAAS,CAAA;IACjB,OAAO;QACL,GAAG,IAAI;QACP,uBAAuB,EAAE,YAAY;QACrC,eAAe,EAAE,KAAK;QACtB,sBAAsB,EAAE,WAAW;QACnC,sBAAsB,EAAE,WAAW;QACnC,eAAe,EAAE,KAAK,IAAI,eAAe,EAAE,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;QACvE,uBAAuB,EAAE,eAAe,EAAE,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;QAC5E,wBAAwB,EAAE,eAAe,EAAE,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG;QAC9E,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,sBAAsB,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,OAA4C,EAC5C,QAAkB;IAElB,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,CAAA;IACjE,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACtC,IAAI,OAAO,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;QACtC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAA;IACrE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAA;AAC3E,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,UAAkB;IACvD,MAAM,QAAQ,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;IACnD,IAAI,CAAC,QAAQ;QAAE,OAAM;IACrB,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACb,oDAAoD,QAAQ,CAAC,YAAY,SAAS,QAAQ,CAAC,GAAG,IAAI,CACnG,CAAA;IACH,CAAC;IACD,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,OAAmB,EACnB,QAAkB,EAClB,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAEnB,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,CAAA;IACxC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,4BAA4B,OAAO,CAAC,GAAG,6CAA6C,CACrF,CAAA;IACH,CAAC;IACD,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;IAC3D,CAAC;IACD,MAAM,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAC5C,MAAM,YAAY,GAAG,MAAM,mBAAmB,EAAE,CAAA;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,aAAa,EAAE,CAAA;IAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAA;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;IAC5B,MAAM,eAAe,GAAG,qBAAqB,CAC3C,MAAM,CAAC,eAAe,CAAC,OAAO,EAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAC9B,CAAA;IAED,WAAW,CAAC,WAAW,CAAC,CAAA;IACxB,YAAY,CAAC,0BAA0B,WAAW,EAAE,CAAC,CAAA;IACrD,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC;QACrC,IAAI,EAAE,MAAM,CAAC,SAAS,CAAC,IAAI;QAC3B,KAAK;QACL,WAAW;QACX,MAAM;QACN,YAAY;QACZ,UAAU,EAAE,OAAO,CAAC,GAAG;QACvB,QAAQ,EAAE,IAAI;QACd,eAAe;QACf,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KACpD,CAAC,CAAA;IAEF,MAAM,YAAY,GAAG,oBAAoB,SAAS,CAAC,IAAI,EAAE,CAAA;IACzD,MAAM,KAAK,GAAiB;QAC1B,OAAO,EAAE,CAAC;QACV,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS;QACT,UAAU,EAAE,OAAO,CAAC,GAAG;QACvB,WAAW;QACX,YAAY,EAAE,SAAS,CAAC,GAAG;QAC3B,YAAY;QACZ,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,KAAK;QACL,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,OAAO;KACnD,CAAA;IACD,MAAM,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;IAE3C,UAAU,CAAC,MAAM,EAAE,aAAa,SAAS,CAAC,GAAG,EAAE,CAAC,CAAA;IAChD,UAAU,CACR,MAAM,EACN,aAAa,YAAY,wBAAwB,EACjD,4CAA4C,CAC7C,CAAA;IACD,IAAI,OAAO,CAAC,WAAW;QAAE,UAAU,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IAC7E,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;QAC5B,UAAU,CACR,MAAM,EACN,kCAAkC,eAAe,CAAC,MAAM,GAAG,EAC3D,mEAAmE,CACpE,CAAA;IACH,CAAC;SAAM,IAAI,eAAe,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChD,UAAU,CACR,MAAM,EACN,6CAA6C,EAC7C,8DAA8D,CAC/D,CAAA;IACH,CAAC;SAAM,CAAC;QACN,UAAU,CACR,MAAM,EACN,2BAA2B,EAC3B,uEAAuE,CACxE,CAAA;IACH,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;QACjC,UAAU,CACR,MAAM,EACN,+BAA+B,EAC/B,gDAAgD,CACjD,CAAA;IACH,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAA;IAC3F,CAAC;IAED,IAAI,OAAO,CAAC,IAAI;QAAE,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;IAE5C,MAAM,UAAU,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;IACpD,MAAM,GAAG,GAAG,mBAAmB,CAC7B,OAAO,CAAC,GAAG,EACX,YAAY,EACZ,KAAK,EACL,WAAW,EACX,OAAO,CAAC,WAAW,EACnB,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,EACnC,MAAM,CAAC,eAAe,CACvB,CAAA;IAED,IAAI,KAAK,GAAwB,IAAI,CAAA;IACrC,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,IAAI,WAAW,GAAoC,IAAI,CAAA;IACvD,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;QAC/C,WAAW,GAAG,OAAO,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,QAAgB,EAAiB,EAAE;QACzD,IAAI,YAAY;YAAE,OAAM;QACxB,YAAY,GAAG,IAAI,CAAA;QACnB,MAAM,cAAc,CAAC,KAAK,CAAC,CAAA;QAC3B,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;QACvB,MAAM,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACrC,yEAAyE;QACzE,2DAA2D;QAC3D,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,SAAS;gBAAE,OAAO,CAAC,UAAU,EAAE,CAAA;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;QACD,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAA;IACzB,CAAC,CAAA;IAED,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC1B,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;QAC3B,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IACF,yEAAyE;IACzE,4EAA4E;IAC5E,2EAA2E;IAC3E,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAgB,EAAE,EAAE;QACzC,IAAK,OAAqC,EAAE,IAAI,KAAK,UAAU,EAAE,CAAC;YAChE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAA;QAClB,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,YAAY,CAAC,qBAAqB,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACvF,CAAC;IACD,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,EAAE;QACjD,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,GAAG;QACH,KAAK,EAAE,SAAS;QAChB,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;QACnC,uEAAuE;QACvE,4DAA4D;QAC5D,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;KACvC,CAAC,CAAA;IAEF,MAAM,WAAW,GAAG,KAAK,CAAA;IACzB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;QACxB,0EAA0E;QAC1E,qEAAqE;QACrE,IAAI,WAAW,CAAC,GAAG,IAAI,iBAAiB,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1D,kBAAkB,CAAC,WAAW,CAAC,CAAA;QACjC,CAAC;QACD,IAAI,CAAC;YACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACxD,CAAC;QAAC,MAAM,CAAC;YACP,mCAAmC;QACrC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QACrE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC,CAAC,CAAA;IACF,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;QAClC,KAAK,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAA;IAC/B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnB,YAAY,CAAC,mBAAmB,CAAC,CAAA;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;AAC1D,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QACrB,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAQ,KAA+B,CAAC,IAAI,KAAK,OAAO,CAAA;IAC1D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,KAA0B;IACtD,IAAI,CAAC,KAAK;QAAE,OAAM;IAClB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACd,SAAS,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;gBAC7D,KAAK,EAAE,QAAQ;gBACf,WAAW,EAAE,IAAI;aAClB,CAAC,CAAA;QACJ,CAAC;QACD,OAAM;IACR,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAA;IACrB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACrB,OAAM;IACR,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,MAAsB,EAAW,EAAE;QACtD,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YAC1B,OAAO,IAAI,CAAA;QACb,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAA;QACd,CAAC;IACH,CAAC,CAAA;IACD,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;QACpF,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACvB,CAAC;IACD,MAAM,YAAY,GAAG,GAAY,EAAE,CACjC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC,CAAA;IAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;IACnC,OAAO,YAAY,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC/C,MAAM,KAAK,CAAC,EAAE,CAAC,CAAA;IACjB,CAAC;IACD,IAAI,YAAY,EAAE,EAAE,CAAC;QACnB,WAAW,CAAC,SAAS,CAAC,CAAA;QACtB,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAA;QACrC,OAAO,YAAY,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,EAAE,CAAC;YACnD,MAAM,KAAK,CAAC,EAAE,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAmB;IAC7C,IAAI,CAAC,KAAK,CAAC,GAAG;QAAE,OAAM;IACtB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,SAAS,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;YAC7D,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,IAAI;SAClB,CAAC,CAAA;QACF,OAAM;IACR,CAAC;IACD,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,KAAK,CAAC,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAgB,EAAE,GAAW;IAC9D,OAAO;SACJ,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,sDAAsD,CAAC;SACnE,MAAM,CAAC,QAAQ,EAAE,2CAA2C,CAAC;SAC7D,MAAM,CAAC,SAAS,EAAE,uBAAuB,CAAC;SAC1C,MAAM,CAAC,iBAAiB,EAAE,kDAAkD,CAAC;SAC7E,QAAQ,CAAC,eAAe,EAAE,+CAA+C,CAAC;SAC1E,MAAM,CAAC,KAAK,EAAE,QAAkB,EAAE,OAAmB,EAAE,EAAE;QACxD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAA;QACjD,IAAI,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAA;IACzC,CAAC,CAAC,CAAA;AACN,CAAC"}
|
|
@@ -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"}
|