@stacknext/cli 0.0.0-stage → 0.6.1

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
package/dist/http.js ADDED
@@ -0,0 +1,54 @@
1
+ const LOOPBACK_HOSTS = new Set(['127.0.0.1', 'localhost', '[::1]', '::1']);
2
+ export class CollectorApiError extends Error {
3
+ status;
4
+ constructor(message, status) {
5
+ super(message);
6
+ this.name = 'CollectorApiError';
7
+ this.status = status;
8
+ }
9
+ }
10
+ function assertLoopback(baseUrl) {
11
+ let url;
12
+ try {
13
+ url = new URL(baseUrl);
14
+ }
15
+ catch {
16
+ throw new Error(`Invalid collector URL: ${baseUrl}`);
17
+ }
18
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
19
+ throw new Error('Collector URL must use http or https');
20
+ }
21
+ if (!LOOPBACK_HOSTS.has(url.hostname)) {
22
+ throw new Error('StackNext only talks to a loopback collector');
23
+ }
24
+ return url;
25
+ }
26
+ export async function collectorFetch(baseUrl, pathname, token, init = {}) {
27
+ const base = assertLoopback(baseUrl);
28
+ const url = new URL(pathname, base);
29
+ const headers = new Headers(init.headers);
30
+ headers.set('authorization', `Bearer ${token}`);
31
+ const response = await fetch(url, {
32
+ ...init,
33
+ headers,
34
+ signal: init.signal ?? AbortSignal.timeout(5_000),
35
+ });
36
+ return response;
37
+ }
38
+ export async function collectorJson(baseUrl, pathname, token, init = {}) {
39
+ const response = await collectorFetch(baseUrl, pathname, token, init);
40
+ if (!response.ok) {
41
+ let message = `Collector responded with HTTP ${response.status}`;
42
+ try {
43
+ const payload = (await response.json());
44
+ if (payload.error)
45
+ message = payload.error;
46
+ }
47
+ catch {
48
+ // Keep the status-based message.
49
+ }
50
+ throw new CollectorApiError(message, response.status);
51
+ }
52
+ return (await response.json());
53
+ }
54
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;AAE1E,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,MAAM,CAAQ;IAEvB,YAAY,OAAe,EAAE,MAAc;QACzC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAA;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAED,SAAS,cAAc,CAAC,OAAe;IACrC,IAAI,GAAQ,CAAA;IACZ,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,EAAE,CAAC,CAAA;IACtD,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;IACzD,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAA;IACjE,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,QAAgB,EAChB,KAAa,EACb,OAAoB,EAAE;IAEtB,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,CAAA;IACpC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IACnC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACzC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAA;IAC/C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,GAAG,IAAI;QACP,OAAO;QACP,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KAClD,CAAC,CAAA;IACF,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,QAAgB,EAChB,KAAa,EACb,OAAoB,EAAE;IAEtB,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAA;IACrE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,IAAI,OAAO,GAAG,iCAAiC,QAAQ,CAAC,MAAM,EAAE,CAAA;QAChE,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAA;YAC7D,IAAI,OAAO,CAAC,KAAK;gBAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAA;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QACD,MAAM,IAAI,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAA;IACvD,CAAC;IACD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAA;AACrC,CAAC"}
@@ -0,0 +1,22 @@
1
+ export * from './collector/server.js';
2
+ export * from './runtime.js';
3
+ export * from './project.js';
4
+ export * from './output.js';
5
+ export * from './http.js';
6
+ export * from './session.js';
7
+ export * from './program.js';
8
+ export * from './commands/init.js';
9
+ export * from './commands/dev.js';
10
+ export * from './commands/status.js';
11
+ export * from './commands/doctor.js';
12
+ export * from './commands/export.js';
13
+ export * from './commands/mcp.js';
14
+ export * from './commands/capture.js';
15
+ export * from './commands/runs.js';
16
+ export * from './commands/baseline.js';
17
+ export * from './commands/compare.js';
18
+ export * from './commands/uninstall.js';
19
+ export * from './commands/regression-shared.js';
20
+ export * from './version.js';
21
+ export { CLI_VERSION as STACKNEXT_CLI_VERSION } from './version.js';
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA;AAClC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,WAAW,IAAI,qBAAqB,EAAE,MAAM,cAAc,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ export * from './collector/server.js';
2
+ export * from './runtime.js';
3
+ export * from './project.js';
4
+ export * from './output.js';
5
+ export * from './http.js';
6
+ export * from './session.js';
7
+ export * from './program.js';
8
+ export * from './commands/init.js';
9
+ export * from './commands/dev.js';
10
+ export * from './commands/status.js';
11
+ export * from './commands/doctor.js';
12
+ export * from './commands/export.js';
13
+ export * from './commands/mcp.js';
14
+ export * from './commands/capture.js';
15
+ export * from './commands/runs.js';
16
+ export * from './commands/baseline.js';
17
+ export * from './commands/compare.js';
18
+ export * from './commands/uninstall.js';
19
+ export * from './commands/regression-shared.js';
20
+ export * from './version.js';
21
+ export { CLI_VERSION as STACKNEXT_CLI_VERSION } from './version.js';
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,cAAc,CAAA;AAC5B,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,sBAAsB,CAAA;AACpC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,oBAAoB,CAAA;AAClC,cAAc,wBAAwB,CAAA;AACtC,cAAc,uBAAuB,CAAA;AACrC,cAAc,yBAAyB,CAAA;AACvC,cAAc,iCAAiC,CAAA;AAC/C,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,WAAW,IAAI,qBAAqB,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,16 @@
1
+ export declare const style: {
2
+ bold: (text: string) => string;
3
+ dim: (text: string) => string;
4
+ red: (text: string) => string;
5
+ green: (text: string) => string;
6
+ yellow: (text: string) => string;
7
+ cyan: (text: string) => string;
8
+ };
9
+ export declare function printBanner(version: string): void;
10
+ export declare function printSection(title: string): void;
11
+ export declare function printCheck(status: 'pass' | 'warn' | 'fail', label: string, detail?: string): void;
12
+ export declare function errorLine(message: string): void;
13
+ export declare function formatBytes(bytes: number): string;
14
+ export declare function formatDuration(ms: number | null): string;
15
+ export declare function formatRelativeTime(timestamp: number, now?: number): string;
16
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,KAAK;iBACH,MAAM,KAAG,MAAM;gBAChB,MAAM,KAAG,MAAM;gBACf,MAAM,KAAG,MAAM;kBACb,MAAM,KAAG,MAAM;mBACd,MAAM,KAAG,MAAM;iBACjB,MAAM,KAAG,MAAM;CAC7B,CAAA;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAChC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAQN;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAOxD;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,CAM9E"}
package/dist/output.js ADDED
@@ -0,0 +1,60 @@
1
+ const useColor = process.stdout.isTTY === true &&
2
+ process.env.NO_COLOR === undefined &&
3
+ process.env.TERM !== 'dumb';
4
+ function wrap(code, text) {
5
+ return useColor ? `\u001B[${code}m${text}\u001B[0m` : text;
6
+ }
7
+ export const style = {
8
+ bold: (text) => wrap('1', text),
9
+ dim: (text) => wrap('2', text),
10
+ red: (text) => wrap('31', text),
11
+ green: (text) => wrap('32', text),
12
+ yellow: (text) => wrap('33', text),
13
+ cyan: (text) => wrap('36', text),
14
+ };
15
+ export function printBanner(version) {
16
+ console.log(`${style.bold('StackNext')} ${style.dim(`v${version}`)}`);
17
+ }
18
+ export function printSection(title) {
19
+ console.log(`\n${style.bold(title)}`);
20
+ }
21
+ export function printCheck(status, label, detail) {
22
+ const marker = status === 'pass'
23
+ ? style.green('✓')
24
+ : status === 'warn'
25
+ ? style.yellow('!')
26
+ : style.red('✗');
27
+ console.log(`${marker} ${label}${detail ? style.dim(` — ${detail}`) : ''}`);
28
+ }
29
+ export function errorLine(message) {
30
+ console.error(`${style.red('Error')} ${message}`);
31
+ }
32
+ export function formatBytes(bytes) {
33
+ if (bytes < 1024)
34
+ return `${bytes} B`;
35
+ if (bytes < 1024 * 1024)
36
+ return `${(bytes / 1024).toFixed(1)} KiB`;
37
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MiB`;
38
+ }
39
+ export function formatDuration(ms) {
40
+ if (ms === null || !Number.isFinite(ms))
41
+ return '—';
42
+ if (ms < 1_000)
43
+ return `${Math.round(ms)} ms`;
44
+ if (ms < 60_000)
45
+ return `${(ms / 1_000).toFixed(2)} s`;
46
+ const minutes = Math.floor(ms / 60_000);
47
+ const seconds = Math.round((ms % 60_000) / 1_000);
48
+ return `${minutes}m ${seconds}s`;
49
+ }
50
+ export function formatRelativeTime(timestamp, now = Date.now()) {
51
+ const delta = Math.max(0, now - timestamp);
52
+ if (delta < 1_000)
53
+ return 'just now';
54
+ if (delta < 60_000)
55
+ return `${Math.floor(delta / 1_000)}s ago`;
56
+ if (delta < 3_600_000)
57
+ return `${Math.floor(delta / 60_000)}m ago`;
58
+ return `${Math.floor(delta / 3_600_000)}h ago`;
59
+ }
60
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from 'commander';
2
+ export declare function createProgram(cwd?: string): Command;
3
+ export declare function main(argv?: string[], cwd?: string): Promise<void>;
4
+ //# sourceMappingURL=program.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAiBnC,wBAAgB,aAAa,CAAC,GAAG,SAAgB,GAAG,OAAO,CA2B1D;AAED,wBAAsB,IAAI,CACxB,IAAI,GAAE,MAAM,EAAiB,EAC7B,GAAG,SAAgB,GAClB,OAAO,CAAC,IAAI,CAAC,CAWf"}
@@ -0,0 +1,54 @@
1
+ import { Command } from 'commander';
2
+ import { errorLine, style } from './output.js';
3
+ import { registerInitCommand } from './commands/init.js';
4
+ import { registerDevCommand } from './commands/dev.js';
5
+ import { registerStatusCommand } from './commands/status.js';
6
+ import { registerDoctorCommand } from './commands/doctor.js';
7
+ import { registerExportCommand } from './commands/export.js';
8
+ import { registerCoverageCommand } from './commands/coverage.js';
9
+ import { registerDiagnoseCommand } from './commands/diagnose.js';
10
+ import { registerMcpCommand } from './commands/mcp.js';
11
+ import { registerCaptureCommand } from './commands/capture.js';
12
+ import { registerRunsCommand } from './commands/runs.js';
13
+ import { registerBaselineCommand } from './commands/baseline.js';
14
+ import { registerCompareCommand } from './commands/compare.js';
15
+ import { registerUninstallCommand } from './commands/uninstall.js';
16
+ import { CLI_VERSION } from './version.js';
17
+ export function createProgram(cwd = process.cwd()) {
18
+ const program = new Command();
19
+ program
20
+ .name('stacknext')
21
+ .description('Local-first runtime inspection for Next.js App Router applications')
22
+ .version(CLI_VERSION)
23
+ .showHelpAfterError()
24
+ .showSuggestionAfterError()
25
+ .addHelpText('after', '\nRun "stacknext doctor" when data does not appear in the dashboard.');
26
+ registerInitCommand(program, cwd);
27
+ registerDevCommand(program, cwd);
28
+ registerStatusCommand(program, cwd);
29
+ registerDoctorCommand(program, cwd);
30
+ registerExportCommand(program, cwd);
31
+ registerCoverageCommand(program, cwd);
32
+ registerDiagnoseCommand(program, cwd);
33
+ registerCaptureCommand(program, cwd);
34
+ registerRunsCommand(program, cwd);
35
+ registerBaselineCommand(program, cwd);
36
+ registerCompareCommand(program, cwd);
37
+ registerMcpCommand(program, cwd);
38
+ registerUninstallCommand(program, cwd);
39
+ return program;
40
+ }
41
+ export async function main(argv = process.argv, cwd = process.cwd()) {
42
+ const program = createProgram(cwd);
43
+ try {
44
+ await program.parseAsync(argv);
45
+ }
46
+ catch (error) {
47
+ errorLine(error instanceof Error ? error.message : String(error));
48
+ if (process.env.STACKNEXT_DEBUG === '1' && error instanceof Error && error.stack) {
49
+ console.error(style.dim(error.stack));
50
+ }
51
+ process.exitCode = 1;
52
+ }
53
+ }
54
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ export type PackageManager = 'pnpm' | 'npm' | 'yarn' | 'bun';
2
+ export interface ProjectInfo {
3
+ dir: string;
4
+ name: string;
5
+ packageJson: Record<string, unknown>;
6
+ packageManager: PackageManager;
7
+ scripts: Record<string, string>;
8
+ nextVersion: string | null;
9
+ nextMajor: number | null;
10
+ appDir: string | null;
11
+ srcDir: boolean;
12
+ instrumentationPath: string | null;
13
+ instrumentationExists: boolean;
14
+ typescript: boolean;
15
+ configExists: boolean;
16
+ hasDrizzle: boolean;
17
+ hasPrisma: boolean;
18
+ dependencies: Record<string, string>;
19
+ devDependencies: Record<string, string>;
20
+ }
21
+ export declare class ProjectDetectionError extends Error {
22
+ constructor(message: string);
23
+ }
24
+ export declare function detectPackageManager(dir: string): Promise<PackageManager>;
25
+ export declare function findInstrumentationFile(dir: string, srcDir: boolean): Promise<string | null>;
26
+ export declare function detectProject(cwd?: string): Promise<ProjectInfo>;
27
+ export declare function packageManagerCommand(manager: PackageManager, script: string): {
28
+ command: string;
29
+ args: string[];
30
+ };
31
+ export declare function installCommand(manager: PackageManager, packages: string[], dev?: boolean): string;
32
+ export declare function isStackNextIntegrated(source: string): boolean;
33
+ /** True when the project already declares any StackNext package. */
34
+ export declare function stackNextPackages(project: ProjectInfo): string[];
35
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;AAE5D,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACpC,cAAc,EAAE,cAAc,CAAA;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,OAAO,CAAA;IACf,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,qBAAqB,EAAE,OAAO,CAAA;IAC9B,UAAU,EAAE,OAAO,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;IACrB,UAAU,EAAE,OAAO,CAAA;IACnB,SAAS,EAAE,OAAO,CAAA;IAClB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACpC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACxC;AAED,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AA4BD,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAuB/E;AAQD,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB;AAED,wBAAsB,aAAa,CAAC,GAAG,SAAgB,GAAG,OAAO,CAAC,WAAW,CAAC,CAyD7E;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE,MAAM,GACb;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAWrC;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,EAAE,EAClB,GAAG,UAAO,GACT,MAAM,CAYR;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,EAAE,CAMhE"}
@@ -0,0 +1,169 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ export class ProjectDetectionError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = 'ProjectDetectionError';
7
+ }
8
+ }
9
+ async function exists(file) {
10
+ try {
11
+ await access(file);
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ async function readJson(file) {
19
+ return JSON.parse(await readFile(file, 'utf8'));
20
+ }
21
+ function isRecord(value) {
22
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
23
+ }
24
+ function stringRecord(value) {
25
+ if (!isRecord(value))
26
+ return {};
27
+ const output = {};
28
+ for (const [key, entry] of Object.entries(value)) {
29
+ if (typeof entry === 'string')
30
+ output[key] = entry;
31
+ }
32
+ return output;
33
+ }
34
+ export async function detectPackageManager(dir) {
35
+ const lockfiles = [
36
+ ['pnpm-lock.yaml', 'pnpm'],
37
+ ['yarn.lock', 'yarn'],
38
+ ['bun.lock', 'bun'],
39
+ ['bun.lockb', 'bun'],
40
+ ['package-lock.json', 'npm'],
41
+ ['npm-shrinkwrap.json', 'npm'],
42
+ ];
43
+ for (const [file, manager] of lockfiles) {
44
+ if (await exists(path.join(dir, file)))
45
+ return manager;
46
+ }
47
+ const packageJsonPath = path.join(dir, 'package.json');
48
+ if (await exists(packageJsonPath)) {
49
+ const packageJson = await readJson(packageJsonPath);
50
+ if (isRecord(packageJson) && typeof packageJson.packageManager === 'string') {
51
+ const name = packageJson.packageManager.split('@', 1)[0];
52
+ if (name === 'pnpm' || name === 'npm' || name === 'yarn' || name === 'bun') {
53
+ return name;
54
+ }
55
+ }
56
+ }
57
+ return 'npm';
58
+ }
59
+ function parseMajor(version) {
60
+ if (!version)
61
+ return null;
62
+ const match = /(\d+)/.exec(version.replace(/^[^\d]*/, ''));
63
+ return match?.[1] ? Number(match[1]) : null;
64
+ }
65
+ export async function findInstrumentationFile(dir, srcDir) {
66
+ const roots = [srcDir ? path.join(dir, 'src') : null, dir].filter((entry) => entry !== null);
67
+ const extensions = ['ts', 'tsx', 'js', 'mjs', 'jsx'];
68
+ for (const root of roots) {
69
+ for (const extension of extensions) {
70
+ const candidate = path.join(root, `instrumentation.${extension}`);
71
+ if (await exists(candidate))
72
+ return candidate;
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+ export async function detectProject(cwd = process.cwd()) {
78
+ const dir = path.resolve(cwd);
79
+ const packageJsonPath = path.join(dir, 'package.json');
80
+ if (!(await exists(packageJsonPath))) {
81
+ throw new ProjectDetectionError(`No package.json found in ${dir}. Run StackNext from a Next.js project root.`);
82
+ }
83
+ const rawPackageJson = await readJson(packageJsonPath);
84
+ if (!isRecord(rawPackageJson)) {
85
+ throw new ProjectDetectionError('package.json must contain a JSON object');
86
+ }
87
+ const dependencies = stringRecord(rawPackageJson.dependencies);
88
+ const devDependencies = stringRecord(rawPackageJson.devDependencies);
89
+ const allDependencies = { ...devDependencies, ...dependencies };
90
+ const srcDir = await exists(path.join(dir, 'src'));
91
+ let appDir = null;
92
+ if (await exists(path.join(dir, 'app')))
93
+ appDir = 'app';
94
+ else if (await exists(path.join(dir, 'src', 'app')))
95
+ appDir = 'src/app';
96
+ const instrumentationPath = await findInstrumentationFile(dir, srcDir);
97
+ const packageManager = await detectPackageManager(dir);
98
+ let installedNextVersion = null;
99
+ try {
100
+ const installed = await readJson(path.join(dir, 'node_modules', 'next', 'package.json'));
101
+ if (isRecord(installed) && typeof installed.version === 'string') {
102
+ installedNextVersion = installed.version;
103
+ }
104
+ }
105
+ catch {
106
+ // Not installed yet. Fall back to the declared range below.
107
+ }
108
+ const declaredNext = dependencies.next ?? devDependencies.next ?? null;
109
+ const nextVersion = installedNextVersion ?? declaredNext;
110
+ const name = typeof rawPackageJson.name === 'string' && rawPackageJson.name.length > 0
111
+ ? rawPackageJson.name
112
+ : path.basename(dir);
113
+ return {
114
+ dir,
115
+ name,
116
+ packageJson: rawPackageJson,
117
+ packageManager,
118
+ scripts: stringRecord(rawPackageJson.scripts),
119
+ nextVersion,
120
+ nextMajor: parseMajor(nextVersion),
121
+ appDir,
122
+ srcDir,
123
+ instrumentationPath,
124
+ instrumentationExists: instrumentationPath !== null,
125
+ typescript: allDependencies.typescript !== undefined || (await exists(path.join(dir, 'tsconfig.json'))),
126
+ configExists: await exists(path.join(dir, 'stacknext.config.json')),
127
+ hasDrizzle: allDependencies['drizzle-orm'] !== undefined,
128
+ hasPrisma: allDependencies['@prisma/client'] !== undefined || allDependencies.prisma !== undefined,
129
+ dependencies,
130
+ devDependencies,
131
+ };
132
+ }
133
+ export function packageManagerCommand(manager, script) {
134
+ switch (manager) {
135
+ case 'pnpm':
136
+ return { command: 'pnpm', args: ['run', script] };
137
+ case 'yarn':
138
+ return { command: 'yarn', args: [script] };
139
+ case 'bun':
140
+ return { command: 'bun', args: ['run', script] };
141
+ case 'npm':
142
+ return { command: 'npm', args: ['run', script] };
143
+ }
144
+ }
145
+ export function installCommand(manager, packages, dev = true) {
146
+ const suffix = packages.join(' ');
147
+ switch (manager) {
148
+ case 'pnpm':
149
+ return `pnpm add ${dev ? '-D ' : ''}${suffix}`;
150
+ case 'yarn':
151
+ return `yarn add ${dev ? '-D ' : ''}${suffix}`;
152
+ case 'bun':
153
+ return `bun add ${dev ? '-d ' : ''}${suffix}`;
154
+ case 'npm':
155
+ return `npm install ${dev ? '--save-dev ' : ''}${suffix}`;
156
+ }
157
+ }
158
+ export function isStackNextIntegrated(source) {
159
+ return source.includes('@stacknext/next');
160
+ }
161
+ /** True when the project already declares any StackNext package. */
162
+ export function stackNextPackages(project) {
163
+ const names = new Set([
164
+ ...Object.keys(project.dependencies),
165
+ ...Object.keys(project.devDependencies),
166
+ ]);
167
+ return [...names].filter((name) => name.startsWith('@stacknext/'));
168
+ }
169
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { z } from 'zod';
2
+ export declare const RUNTIME_DIR_NAME = ".stacknext";
3
+ export declare const RUNTIME_FILE_NAME = "run.json";
4
+ export declare const runtimeStateSchema: z.ZodObject<{
5
+ version: z.ZodLiteral<1>;
6
+ pid: z.ZodNumber;
7
+ startedAt: z.ZodNumber;
8
+ projectDir: z.ZodString;
9
+ projectName: z.ZodString;
10
+ dashboardUrl: z.ZodString;
11
+ collectorUrl: z.ZodString;
12
+ port: z.ZodNumber;
13
+ token: z.ZodString;
14
+ nextVersion: z.ZodOptional<z.ZodString>;
15
+ command: z.ZodOptional<z.ZodString>;
16
+ }, z.core.$strict>;
17
+ export type RuntimeState = z.infer<typeof runtimeStateSchema>;
18
+ export declare function runtimeDir(projectDir: string): string;
19
+ export declare function runtimeStatePath(projectDir: string): string;
20
+ export declare function generateToken(): string;
21
+ export declare function readRuntimeState(projectDir: string): Promise<RuntimeState | null>;
22
+ export declare function writeRuntimeState(projectDir: string, state: RuntimeState): Promise<string>;
23
+ export declare function removeRuntimeState(projectDir: string): Promise<void>;
24
+ export declare function isProcessAlive(pid: number): boolean;
25
+ export declare function isLoopbackHostname(hostname: string): boolean;
26
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,gBAAgB,eAAe,CAAA;AAC5C,eAAO,MAAM,iBAAiB,aAAa,CAAA;AAE3C,eAAO,MAAM,kBAAkB;;;;;;;;;;;;kBAcpB,CAAA;AAEX,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAA;AAE7D,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAsBvF;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1E;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAO5D"}
@@ -0,0 +1,89 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { chmod, mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { z } from 'zod';
5
+ export const RUNTIME_DIR_NAME = '.stacknext';
6
+ export const RUNTIME_FILE_NAME = 'run.json';
7
+ export const runtimeStateSchema = z
8
+ .object({
9
+ version: z.literal(1),
10
+ pid: z.number().int().positive(),
11
+ startedAt: z.number().int().positive(),
12
+ projectDir: z.string().min(1),
13
+ projectName: z.string().min(1),
14
+ dashboardUrl: z.string().url(),
15
+ collectorUrl: z.string().url(),
16
+ port: z.number().int().positive(),
17
+ token: z.string().min(16),
18
+ nextVersion: z.string().optional(),
19
+ command: z.string().optional(),
20
+ })
21
+ .strict();
22
+ export function runtimeDir(projectDir) {
23
+ return path.join(projectDir, RUNTIME_DIR_NAME);
24
+ }
25
+ export function runtimeStatePath(projectDir) {
26
+ const override = process.env.STACKNEXT_RUNTIME_FILE;
27
+ if (override)
28
+ return path.isAbsolute(override) ? override : path.resolve(projectDir, override);
29
+ return path.join(runtimeDir(projectDir), RUNTIME_FILE_NAME);
30
+ }
31
+ export function generateToken() {
32
+ return randomBytes(32).toString('base64url');
33
+ }
34
+ export async function readRuntimeState(projectDir) {
35
+ const file = runtimeStatePath(projectDir);
36
+ let contents;
37
+ try {
38
+ contents = await readFile(file, 'utf8');
39
+ }
40
+ catch (error) {
41
+ if (error.code === 'ENOENT')
42
+ return null;
43
+ throw error;
44
+ }
45
+ let parsed;
46
+ try {
47
+ parsed = JSON.parse(contents);
48
+ }
49
+ catch {
50
+ throw new Error(`Cannot parse ${file}. Remove it and restart "stacknext dev".`);
51
+ }
52
+ const result = runtimeStateSchema.safeParse(parsed);
53
+ if (!result.success) {
54
+ throw new Error(`Invalid runtime state in ${file}. Remove it and restart "stacknext dev".`);
55
+ }
56
+ return result.data;
57
+ }
58
+ export async function writeRuntimeState(projectDir, state) {
59
+ const dir = runtimeDir(projectDir);
60
+ await mkdir(dir, { recursive: true, mode: 0o700 });
61
+ await chmod(dir, 0o700).catch(() => undefined);
62
+ await writeFile(path.join(dir, '.gitignore'), '*\n', { mode: 0o600 });
63
+ const file = runtimeStatePath(projectDir);
64
+ await mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
65
+ const temporary = `${file}.${process.pid}.tmp`;
66
+ await writeFile(temporary, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
67
+ await chmod(temporary, 0o600).catch(() => undefined);
68
+ await rename(temporary, file);
69
+ return file;
70
+ }
71
+ export async function removeRuntimeState(projectDir) {
72
+ await rm(runtimeStatePath(projectDir), { force: true });
73
+ }
74
+ export function isProcessAlive(pid) {
75
+ try {
76
+ process.kill(pid, 0);
77
+ return true;
78
+ }
79
+ catch (error) {
80
+ return error.code === 'EPERM';
81
+ }
82
+ }
83
+ export function isLoopbackHostname(hostname) {
84
+ return (hostname === '127.0.0.1' ||
85
+ hostname === 'localhost' ||
86
+ hostname === '[::1]' ||
87
+ hostname === '::1');
88
+ }
89
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { RuntimeState } from './runtime.js';
2
+ export declare class NotRunningError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /**
6
+ * Returns runtime state only when the recorded process is still alive. Stale
7
+ * state is removed so the next `dev` run can start cleanly.
8
+ */
9
+ export declare function requireRunningState(projectDir: string): Promise<RuntimeState>;
10
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAcnF"}