dx-devkit 0.0.0-stage → 1.1.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 (172) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/LICENSE +21 -0
  3. package/README.md +475 -2
  4. package/bin/dx-mcp.js +2 -0
  5. package/dist/command.d.ts +9 -0
  6. package/dist/command.d.ts.map +1 -0
  7. package/dist/command.js +2 -0
  8. package/dist/command.js.map +1 -0
  9. package/dist/commands/ai.d.ts +7 -0
  10. package/dist/commands/ai.d.ts.map +1 -0
  11. package/dist/commands/ai.js +148 -0
  12. package/dist/commands/ai.js.map +1 -0
  13. package/dist/commands/clean.d.ts +3 -0
  14. package/dist/commands/clean.d.ts.map +1 -0
  15. package/dist/commands/clean.js +72 -0
  16. package/dist/commands/clean.js.map +1 -0
  17. package/dist/commands/deps.d.ts +3 -0
  18. package/dist/commands/deps.d.ts.map +1 -0
  19. package/dist/commands/deps.js +98 -0
  20. package/dist/commands/deps.js.map +1 -0
  21. package/dist/commands/go.d.ts +3 -0
  22. package/dist/commands/go.d.ts.map +1 -0
  23. package/dist/commands/go.js +202 -0
  24. package/dist/commands/go.js.map +1 -0
  25. package/dist/commands/log.d.ts +3 -0
  26. package/dist/commands/log.d.ts.map +1 -0
  27. package/dist/commands/log.js +51 -0
  28. package/dist/commands/log.js.map +1 -0
  29. package/dist/commands/new.d.ts +3 -0
  30. package/dist/commands/new.d.ts.map +1 -0
  31. package/dist/commands/new.js +117 -0
  32. package/dist/commands/new.js.map +1 -0
  33. package/dist/commands/port.d.ts +4 -0
  34. package/dist/commands/port.d.ts.map +1 -0
  35. package/dist/commands/port.js +106 -0
  36. package/dist/commands/port.js.map +1 -0
  37. package/dist/commands/projects.d.ts +5 -0
  38. package/dist/commands/projects.d.ts.map +1 -0
  39. package/dist/commands/projects.js +46 -0
  40. package/dist/commands/projects.js.map +1 -0
  41. package/dist/commands/stack.d.ts +34 -0
  42. package/dist/commands/stack.d.ts.map +1 -0
  43. package/dist/commands/stack.js +140 -0
  44. package/dist/commands/stack.js.map +1 -0
  45. package/dist/commands/summary.d.ts +3 -0
  46. package/dist/commands/summary.d.ts.map +1 -0
  47. package/dist/commands/summary.js +88 -0
  48. package/dist/commands/summary.js.map +1 -0
  49. package/dist/commands/system.d.ts +5 -0
  50. package/dist/commands/system.d.ts.map +1 -0
  51. package/dist/commands/system.js +104 -0
  52. package/dist/commands/system.js.map +1 -0
  53. package/dist/commands/ui.d.ts +3 -0
  54. package/dist/commands/ui.d.ts.map +1 -0
  55. package/dist/commands/ui.js +96 -0
  56. package/dist/commands/ui.js.map +1 -0
  57. package/dist/index.d.ts +3 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +103 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/ui.d.ts +27 -0
  62. package/dist/ui.d.ts.map +1 -0
  63. package/dist/ui.js +104 -0
  64. package/dist/ui.js.map +1 -0
  65. package/node_modules/@dx/core/dist/config.d.ts +46 -0
  66. package/node_modules/@dx/core/dist/config.d.ts.map +1 -0
  67. package/node_modules/@dx/core/dist/config.js +131 -0
  68. package/node_modules/@dx/core/dist/config.js.map +1 -0
  69. package/node_modules/@dx/core/dist/fuzzy.d.ts +15 -0
  70. package/node_modules/@dx/core/dist/fuzzy.d.ts.map +1 -0
  71. package/node_modules/@dx/core/dist/fuzzy.js +63 -0
  72. package/node_modules/@dx/core/dist/fuzzy.js.map +1 -0
  73. package/node_modules/@dx/core/dist/index.d.ts +17 -0
  74. package/node_modules/@dx/core/dist/index.d.ts.map +1 -0
  75. package/node_modules/@dx/core/dist/index.js +19 -0
  76. package/node_modules/@dx/core/dist/index.js.map +1 -0
  77. package/node_modules/@dx/core/dist/runs.d.ts +19 -0
  78. package/node_modules/@dx/core/dist/runs.d.ts.map +1 -0
  79. package/node_modules/@dx/core/dist/runs.js +41 -0
  80. package/node_modules/@dx/core/dist/runs.js.map +1 -0
  81. package/node_modules/@dx/core/dist/tools/aiSetup.d.ts +58 -0
  82. package/node_modules/@dx/core/dist/tools/aiSetup.d.ts.map +1 -0
  83. package/node_modules/@dx/core/dist/tools/aiSetup.js +243 -0
  84. package/node_modules/@dx/core/dist/tools/aiSetup.js.map +1 -0
  85. package/node_modules/@dx/core/dist/tools/cleanup.d.ts +61 -0
  86. package/node_modules/@dx/core/dist/tools/cleanup.d.ts.map +1 -0
  87. package/node_modules/@dx/core/dist/tools/cleanup.js +171 -0
  88. package/node_modules/@dx/core/dist/tools/cleanup.js.map +1 -0
  89. package/node_modules/@dx/core/dist/tools/deps.d.ts +57 -0
  90. package/node_modules/@dx/core/dist/tools/deps.d.ts.map +1 -0
  91. package/node_modules/@dx/core/dist/tools/deps.js +151 -0
  92. package/node_modules/@dx/core/dist/tools/deps.js.map +1 -0
  93. package/node_modules/@dx/core/dist/tools/devErrors.d.ts +74 -0
  94. package/node_modules/@dx/core/dist/tools/devErrors.d.ts.map +1 -0
  95. package/node_modules/@dx/core/dist/tools/devErrors.js +261 -0
  96. package/node_modules/@dx/core/dist/tools/devErrors.js.map +1 -0
  97. package/node_modules/@dx/core/dist/tools/doctor.d.ts +12 -0
  98. package/node_modules/@dx/core/dist/tools/doctor.d.ts.map +1 -0
  99. package/node_modules/@dx/core/dist/tools/doctor.js +176 -0
  100. package/node_modules/@dx/core/dist/tools/doctor.js.map +1 -0
  101. package/node_modules/@dx/core/dist/tools/github.d.ts +31 -0
  102. package/node_modules/@dx/core/dist/tools/github.d.ts.map +1 -0
  103. package/node_modules/@dx/core/dist/tools/github.js +80 -0
  104. package/node_modules/@dx/core/dist/tools/github.js.map +1 -0
  105. package/node_modules/@dx/core/dist/tools/journal.d.ts +23 -0
  106. package/node_modules/@dx/core/dist/tools/journal.d.ts.map +1 -0
  107. package/node_modules/@dx/core/dist/tools/journal.js +80 -0
  108. package/node_modules/@dx/core/dist/tools/journal.js.map +1 -0
  109. package/node_modules/@dx/core/dist/tools/launch.d.ts +24 -0
  110. package/node_modules/@dx/core/dist/tools/launch.d.ts.map +1 -0
  111. package/node_modules/@dx/core/dist/tools/launch.js +137 -0
  112. package/node_modules/@dx/core/dist/tools/launch.js.map +1 -0
  113. package/node_modules/@dx/core/dist/tools/ports.d.ts +42 -0
  114. package/node_modules/@dx/core/dist/tools/ports.d.ts.map +1 -0
  115. package/node_modules/@dx/core/dist/tools/ports.js +220 -0
  116. package/node_modules/@dx/core/dist/tools/ports.js.map +1 -0
  117. package/node_modules/@dx/core/dist/tools/projects.d.ts +58 -0
  118. package/node_modules/@dx/core/dist/tools/projects.d.ts.map +1 -0
  119. package/node_modules/@dx/core/dist/tools/projects.js +208 -0
  120. package/node_modules/@dx/core/dist/tools/projects.js.map +1 -0
  121. package/node_modules/@dx/core/dist/tools/scaffold.d.ts +40 -0
  122. package/node_modules/@dx/core/dist/tools/scaffold.d.ts.map +1 -0
  123. package/node_modules/@dx/core/dist/tools/scaffold.js +188 -0
  124. package/node_modules/@dx/core/dist/tools/scaffold.js.map +1 -0
  125. package/node_modules/@dx/core/dist/tools/stacks.d.ts +119 -0
  126. package/node_modules/@dx/core/dist/tools/stacks.d.ts.map +1 -0
  127. package/node_modules/@dx/core/dist/tools/stacks.js +386 -0
  128. package/node_modules/@dx/core/dist/tools/stacks.js.map +1 -0
  129. package/node_modules/@dx/core/dist/tools/summary.d.ts +87 -0
  130. package/node_modules/@dx/core/dist/tools/summary.d.ts.map +1 -0
  131. package/node_modules/@dx/core/dist/tools/summary.js +331 -0
  132. package/node_modules/@dx/core/dist/tools/summary.js.map +1 -0
  133. package/node_modules/@dx/core/package.json +20 -0
  134. package/node_modules/@dx/mcp/dist/index.d.ts +3 -0
  135. package/node_modules/@dx/mcp/dist/index.d.ts.map +1 -0
  136. package/node_modules/@dx/mcp/dist/index.js +540 -0
  137. package/node_modules/@dx/mcp/dist/index.js.map +1 -0
  138. package/node_modules/@dx/mcp/package.json +8 -0
  139. package/node_modules/@dx/web/dist/api.d.ts +13 -0
  140. package/node_modules/@dx/web/dist/api.d.ts.map +1 -0
  141. package/node_modules/@dx/web/dist/api.js +351 -0
  142. package/node_modules/@dx/web/dist/api.js.map +1 -0
  143. package/node_modules/@dx/web/dist/background.d.ts +2 -0
  144. package/node_modules/@dx/web/dist/background.d.ts.map +1 -0
  145. package/node_modules/@dx/web/dist/background.js +24 -0
  146. package/node_modules/@dx/web/dist/background.js.map +1 -0
  147. package/node_modules/@dx/web/dist/check.d.ts +39 -0
  148. package/node_modules/@dx/web/dist/check.d.ts.map +1 -0
  149. package/node_modules/@dx/web/dist/check.js +97 -0
  150. package/node_modules/@dx/web/dist/check.js.map +1 -0
  151. package/node_modules/@dx/web/dist/dev.d.ts +109 -0
  152. package/node_modules/@dx/web/dist/dev.d.ts.map +1 -0
  153. package/node_modules/@dx/web/dist/dev.js +645 -0
  154. package/node_modules/@dx/web/dist/dev.js.map +1 -0
  155. package/node_modules/@dx/web/dist/link.d.ts +45 -0
  156. package/node_modules/@dx/web/dist/link.d.ts.map +1 -0
  157. package/node_modules/@dx/web/dist/link.js +150 -0
  158. package/node_modules/@dx/web/dist/link.js.map +1 -0
  159. package/node_modules/@dx/web/dist/proxy.d.ts +21 -0
  160. package/node_modules/@dx/web/dist/proxy.d.ts.map +1 -0
  161. package/node_modules/@dx/web/dist/proxy.js +140 -0
  162. package/node_modules/@dx/web/dist/proxy.js.map +1 -0
  163. package/node_modules/@dx/web/dist/server.d.ts +33 -0
  164. package/node_modules/@dx/web/dist/server.d.ts.map +1 -0
  165. package/node_modules/@dx/web/dist/server.js +184 -0
  166. package/node_modules/@dx/web/dist/server.js.map +1 -0
  167. package/node_modules/@dx/web/package.json +26 -0
  168. package/node_modules/@dx/web/public/app.js +1553 -0
  169. package/node_modules/@dx/web/public/icon.svg +1 -0
  170. package/node_modules/@dx/web/public/index.html +47 -0
  171. package/node_modules/@dx/web/public/styles.css +1124 -0
  172. package/package.json +52 -4
@@ -0,0 +1,151 @@
1
+ import { exec } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { loadConfig } from "../config.js";
5
+ import { commandExists } from "./doctor.js";
6
+ import { findProjects, scanProjects } from "./projects.js";
7
+ const TIMEOUT_MS = 180_000;
8
+ export async function auditDependencies(options = {}) {
9
+ const config = options.config ?? loadConfig();
10
+ let projects = scanProjects(config).filter((p) => p.kind === "node");
11
+ if (options.query)
12
+ projects = findProjects(options.query, projects).candidates;
13
+ if (options.activeDays !== undefined) {
14
+ const cutoff = (options.now ?? new Date()).getTime() - options.activeDays * 86_400_000;
15
+ projects = projects.filter((p) => p.lastActive >= cutoff);
16
+ }
17
+ const reports = [];
18
+ let done = 0;
19
+ let next = 0;
20
+ const worker = async () => {
21
+ while (next < projects.length) {
22
+ const project = projects[next++];
23
+ options.onProgress?.(done, projects.length, project.name);
24
+ reports.push(await auditProject(project));
25
+ done++;
26
+ }
27
+ };
28
+ await Promise.all(Array.from({ length: Math.min(options.concurrency ?? 4, projects.length) }, worker));
29
+ options.onProgress?.(done, projects.length, "");
30
+ return reports.sort((a, b) => severityRank(b) - severityRank(a) || b.outdated.length - a.outdated.length);
31
+ }
32
+ async function auditProject(project) {
33
+ const pm = project.packageManager ?? "npm";
34
+ const report = { project: project.name, dir: project.dir, packageManager: pm, outdated: [], notes: [] };
35
+ if (pm === "yarn" || pm === "bun") {
36
+ report.skipped = `${pm} projects aren't supported yet`;
37
+ return report;
38
+ }
39
+ if (pm === "pnpm" && !(await commandExists("pnpm"))) {
40
+ report.skipped = "pnpm isn't installed";
41
+ return report;
42
+ }
43
+ const has = (f) => fs.existsSync(path.join(project.dir, f));
44
+ const [outdated, audit] = await Promise.all([
45
+ runJson(project.dir, pm === "pnpm" ? "pnpm outdated --format json" : "npm outdated --json"),
46
+ has(pm === "pnpm" ? "pnpm-lock.yaml" : "package-lock.json")
47
+ ? runJson(project.dir, `${pm} audit --json`)
48
+ : Promise.resolve({ error: "no lockfile, so the audit can't run (run an install first)" }),
49
+ ]);
50
+ if ("json" in outdated)
51
+ report.outdated = parseOutdated(outdated.json);
52
+ else
53
+ report.notes.push(`outdated check failed: ${outdated.error}`);
54
+ if (!has("node_modules"))
55
+ report.notes.push("not installed, so current versions are unknown");
56
+ if ("json" in audit) {
57
+ const counts = parseAuditCounts(audit.json);
58
+ if (counts)
59
+ report.vulnerabilities = counts;
60
+ else
61
+ report.notes.push(`audit failed: ${auditError(audit.json) ?? "unexpected output"}`);
62
+ }
63
+ else {
64
+ report.notes.push(audit.error);
65
+ }
66
+ return report;
67
+ }
68
+ /**
69
+ * Runs a package manager command that prints JSON. `npm outdated` and `npm audit` exit with 1
70
+ * when they find something, so the exit code is ignored as long as the output is JSON.
71
+ */
72
+ function runJson(cwd, command) {
73
+ return new Promise((resolve) => {
74
+ exec(command, { cwd, timeout: TIMEOUT_MS, windowsHide: true, maxBuffer: 64 * 1024 * 1024, env: { ...process.env, NO_UPDATE_NOTIFIER: "1" } }, (err, stdout, stderr) => {
75
+ const text = String(stdout).trim();
76
+ if (!text) {
77
+ if (!err)
78
+ return resolve({ json: {} });
79
+ const killed = err.killed;
80
+ return resolve({ error: killed ? "timed out" : firstLine(String(stderr)) || err.message });
81
+ }
82
+ try {
83
+ resolve({ json: JSON.parse(text) });
84
+ }
85
+ catch {
86
+ resolve({ error: firstLine(String(stderr)) || "output wasn't JSON" });
87
+ }
88
+ });
89
+ });
90
+ }
91
+ /** Reads `npm outdated --json` or `pnpm outdated --format json`. */
92
+ export function parseOutdated(json) {
93
+ if (!json || typeof json !== "object" || Array.isArray(json))
94
+ return [];
95
+ const out = [];
96
+ for (const [name, raw] of Object.entries(json)) {
97
+ // npm prints an array when the same package is outdated in several workspaces.
98
+ const entry = (Array.isArray(raw) ? raw[0] : raw);
99
+ if (!entry?.latest)
100
+ continue;
101
+ const current = entry.current && entry.current !== "MISSING" ? entry.current : undefined;
102
+ const base = current ?? entry.wanted;
103
+ out.push({ name, current, wanted: entry.wanted, latest: entry.latest, major: isMajorBump(base, entry.latest) });
104
+ }
105
+ return out.sort((a, b) => Number(b.major) - Number(a.major) || a.name.localeCompare(b.name));
106
+ }
107
+ /** Reads the totals from `npm audit --json` (v2 and v1) or `pnpm audit --json`. */
108
+ export function parseAuditCounts(json) {
109
+ const v = json?.metadata?.vulnerabilities;
110
+ if (!v || typeof v !== "object")
111
+ return undefined;
112
+ const n = (k) => (typeof v[k] === "number" ? v[k] : 0);
113
+ const counts = { critical: n("critical"), high: n("high"), moderate: n("moderate"), low: n("low"), info: n("info"), total: 0 };
114
+ counts.total = typeof v.total === "number" ? v.total : counts.critical + counts.high + counts.moderate + counts.low + counts.info;
115
+ return counts;
116
+ }
117
+ function auditError(json) {
118
+ const e = json?.error;
119
+ return e?.summary ? firstLine(e.summary) : e?.code;
120
+ }
121
+ /** "2 critical, 1 high" (most severe first), or "none". */
122
+ export function describeVulnerabilities(v) {
123
+ if (!v)
124
+ return "?";
125
+ const parts = ["critical", "high", "moderate", "low"].filter((k) => v[k] > 0).map((k) => `${v[k]} ${k}`);
126
+ return parts.length ? parts.join(", ") : "none";
127
+ }
128
+ function severityRank(r) {
129
+ const v = r.vulnerabilities;
130
+ if (!v)
131
+ return -1;
132
+ return v.critical * 1_000_000 + v.high * 10_000 + v.moderate * 100 + v.low;
133
+ }
134
+ /** 1.x → 2.x, and for 0.x versions 0.4 → 0.5 too, since those count as breaking in semver. */
135
+ export function isMajorBump(from, to) {
136
+ const parse = (v) => {
137
+ const m = /(\d+)(?:\.(\d+))?/.exec(v ?? "");
138
+ return m ? [Number(m[1]), Number(m[2] ?? 0)] : undefined;
139
+ };
140
+ const a = parse(from);
141
+ const b = parse(to);
142
+ if (!a || !b)
143
+ return false;
144
+ if (b[0] !== a[0])
145
+ return b[0] > a[0];
146
+ return a[0] === 0 && b[1] > a[1];
147
+ }
148
+ function firstLine(text) {
149
+ return text.split(/\r?\n/).map((l) => l.replace(/^npm (ERR!|error)\s*/i, "").trim()).find(Boolean) ?? "";
150
+ }
151
+ //# sourceMappingURL=deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/tools/deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Finds errors in a dev server's output as it streams: TypeScript, Vite and esbuild, webpack and
3
+ * Next.js, Node stack traces, Python tracebacks, Go panics and plain "Error:" lines. Lines that
4
+ * follow an error (stack frames, code frames) are grouped into it, its file:line is pulled out,
5
+ * and when the server rebuilds cleanly afterwards the error is marked resolved.
6
+ */
7
+ export interface OutputLine {
8
+ /** Increasing line number, as the dev server manager numbers them. */
9
+ n: number;
10
+ stream: "out" | "err" | "dx";
11
+ text: string;
12
+ }
13
+ export interface DevError {
14
+ /** Stable for the same error in the same place, so repeats are counted instead of listed. */
15
+ id: string;
16
+ kind: "typescript" | "build" | "runtime" | "python" | "go" | "exit" | "error";
17
+ message: string;
18
+ file?: string;
19
+ line?: number;
20
+ column?: number;
21
+ /** The error's own lines: the message, then stack or code frame (at most 30). */
22
+ lines: string[];
23
+ count: number;
24
+ firstLine: number;
25
+ lastLine: number;
26
+ firstSeen: string;
27
+ lastSeen: string;
28
+ /** True once the server rebuilt or reloaded cleanly after the error was last seen. */
29
+ resolved: boolean;
30
+ /** The stack service whose output it came from. */
31
+ service?: string;
32
+ }
33
+ interface Start {
34
+ kind: DevError["kind"];
35
+ message: string;
36
+ file?: string;
37
+ line?: number;
38
+ column?: number;
39
+ /** Python tracebacks run until the exception line, whatever the indentation. */
40
+ untilException?: boolean;
41
+ /** The message is on the next line. */
42
+ needsMessage?: boolean;
43
+ }
44
+ /** A line that starts an error, or undefined. */
45
+ export declare function matchErrorStart(text: string): Start | undefined;
46
+ /** A line that says the server rebuilt or reloaded cleanly. */
47
+ export declare function isSuccessLine(text: string): boolean;
48
+ /** The first file:line in the error that isn't inside node_modules or Node's own code. */
49
+ export declare function findLocation(lines: string[]): {
50
+ file: string;
51
+ line: number;
52
+ column?: number;
53
+ } | undefined;
54
+ /** Feed it every output line; it keeps the errors it found. */
55
+ export declare class ErrorTracker {
56
+ private list;
57
+ private open?;
58
+ /** The last few lines, because Node prints a SyntaxError's file:line above the error. */
59
+ private recent;
60
+ push(line: OutputLine, now?: Date): void;
61
+ private handle;
62
+ /** Ends the error being collected; call when the output goes quiet. */
63
+ flush(now?: Date): void;
64
+ /** Errors still current, newest first. `all` includes resolved ones. */
65
+ errors(options?: {
66
+ all?: boolean;
67
+ after?: number;
68
+ }): DevError[];
69
+ clear(): void;
70
+ private close;
71
+ private record;
72
+ }
73
+ export {};
74
+ //# sourceMappingURL=devErrors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devErrors.d.ts","sourceRoot":"","sources":["../../src/tools/devErrors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,CAAC,EAAE,MAAM,CAAC;IACV,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,QAAQ;IACvB,6FAA6F;IAC7F,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9E,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,QAAQ,EAAE,OAAO,CAAC;IAClB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,KAAK;IACb,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gFAAgF;IAChF,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uCAAuC;IACvC,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAKD,iDAAiD;AACjD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CA+C/D;AAmBD,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYnD;AAKD,0FAA0F;AAC1F,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAiBzG;AAED,+DAA+D;AAC/D,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAkB;IAC9B,OAAO,CAAC,IAAI,CAAC,CAAgH;IAC7H,yFAAyF;IACzF,OAAO,CAAC,MAAM,CAAgB;IAE9B,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,OAAa,GAAG,IAAI;IAQ9C,OAAO,CAAC,MAAM;IAqDd,uEAAuE;IACvE,KAAK,CAAC,GAAG,OAAa,GAAG,IAAI;IAI7B,wEAAwE;IACxE,MAAM,CAAC,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GAAG,QAAQ,EAAE;IAMnE,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,MAAM;CA2Cf"}
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Finds errors in a dev server's output as it streams: TypeScript, Vite and esbuild, webpack and
3
+ * Next.js, Node stack traces, Python tracebacks, Go panics and plain "Error:" lines. Lines that
4
+ * follow an error (stack frames, code frames) are grouped into it, its file:line is pulled out,
5
+ * and when the server rebuilds cleanly afterwards the error is marked resolved.
6
+ */
7
+ const MAX_BLOCK = 30;
8
+ const MAX_ERRORS = 200;
9
+ /** A line that starts an error, or undefined. */
10
+ export function matchErrorStart(text) {
11
+ let m;
12
+ // tsc: src/a.ts(12,5): error TS2322: Type … and the pretty form: src/a.ts:12:5 - error TS2322: …
13
+ if ((m = /^(.+?)\((\d+),(\d+)\): error (TS\d+): (.*)$/.exec(text))) {
14
+ return { kind: "typescript", file: m[1].trim(), line: +m[2], column: +m[3], message: `${m[4]}: ${m[5]}` };
15
+ }
16
+ if ((m = /^(.+?):(\d+):(\d+) - error (TS\d+): (.*)$/.exec(text))) {
17
+ return { kind: "typescript", file: m[1].trim(), line: +m[2], column: +m[3], message: `${m[4]}: ${m[5]}` };
18
+ }
19
+ // Go compiler: ./main.go:12:5: undefined: foo
20
+ if ((m = /^(\.{0,2}\/?[\w./\\-]+\.go):(\d+):(\d+): (.*)$/.exec(text))) {
21
+ return { kind: "go", file: m[1], line: +m[2], column: +m[3], message: m[4] };
22
+ }
23
+ if ((m = /^panic: (.*)$/.exec(text)))
24
+ return { kind: "go", message: `panic: ${m[1]}` };
25
+ if (/^Traceback \(most recent call last\):/.test(text))
26
+ return { kind: "python", message: "Traceback", untilException: true };
27
+ // esbuild / Vite: ✘ [ERROR] Could not resolve "x"
28
+ if ((m = /^\s*(?:✘|X) \[ERROR\] (.*)$/.exec(text)))
29
+ return { kind: "build", message: m[1] };
30
+ // Vite: [vite] Internal server error: … / [plugin:vite:react-babel] … / Pre-transform error: …
31
+ // Anchored (after an optional timestamp), so a line of echoed source code that mentions them isn't one.
32
+ const stamp = String.raw `^\s*(?:\d{1,2}:\d{2}:\d{2}(?:\s*[AP]M)?\s+)?`;
33
+ if ((m = new RegExp(`${stamp}\\[vite\\] (?:Internal server error|error|Pre-transform error): (.*)$`, "i").exec(text)))
34
+ return { kind: "build", message: m[1] };
35
+ if ((m = /^\s*\[plugin:([^\]]+)\] (.*)$/.exec(text)))
36
+ return { kind: "build", message: `${m[2]} (${m[1]})` };
37
+ if ((m = new RegExp(`${stamp}(?:\\[vite\\] )?Pre-transform error: (.*)$`).exec(text)))
38
+ return { kind: "build", message: m[1] };
39
+ // webpack / Next.js
40
+ if (/^\s*(?:⨯ )?Failed to compile\.?/.test(text))
41
+ return { kind: "build", message: "Failed to compile" };
42
+ if ((m = /^\s*Module not found: (.*)$/.exec(text)))
43
+ return { kind: "build", message: `Module not found: ${m[1]}` };
44
+ if ((m = /^\s*⨯ (.*)$/.exec(text))) {
45
+ // Next.js prints "⨯ ./src/app/page.tsx:3:1" and the message on the next line.
46
+ const loc = findLocation([m[1]]);
47
+ if (loc && m[1].trim().replace(/^\.\//, "").length <= loc.file.replace(/^\.\//, "").length + 12) {
48
+ return { kind: "build", message: "", needsMessage: true, ...loc };
49
+ }
50
+ return { kind: "build", message: m[1] };
51
+ }
52
+ if ((m = /^\s*ERROR in (.*)$/.exec(text)))
53
+ return { kind: "build", message: m[1] };
54
+ // Node: TypeError: x is not a function / Error [ERR_MODULE_NOT_FOUND]: … / Uncaught …
55
+ if ((m = /^\s*(?:Uncaught\s+)?((?:[A-Z]\w*)?(?:Error|Exception))(?: \[\w+\])?: (.*)$/.exec(text))) {
56
+ return { kind: "runtime", message: `${m[1]}: ${m[2]}` };
57
+ }
58
+ if ((m = /^\s*(?:\(node:\d+\) )?(Unhandled(?:Promise)?Rejection\w*):? ?(.*)$/.exec(text))) {
59
+ return { kind: "runtime", message: `${m[1]}${m[2] ? `: ${m[2]}` : ""}` };
60
+ }
61
+ // Anything that says it's an error. Not "0 errors", "error-boundary.tsx" or "errorHandler".
62
+ if ((m = /^\s*(?:\[[^\]]*\]\s*)?(?:ERROR|Error|error)(?:\s*\[[^\]]*\])?\s*[:!-]\s*(.+)$/.exec(text))) {
63
+ return { kind: "error", message: m[1].trim() };
64
+ }
65
+ return undefined;
66
+ }
67
+ /** A line that belongs to the error above it: stack frames, code frames, indented detail. */
68
+ function isContinuation(text, untilException) {
69
+ if (untilException)
70
+ return true;
71
+ if (!text.trim())
72
+ return false;
73
+ return (/^\s+/.test(text) ||
74
+ /^\s*at /.test(text) ||
75
+ /^\s*>?\s*\d+\s*\|/.test(text) ||
76
+ /^\s*\|/.test(text) ||
77
+ /^\s*\^+\s*$/.test(text) ||
78
+ /^(?:File|file):/.test(text) ||
79
+ /^goroutine \d+/.test(text) ||
80
+ /\.go:\d+/.test(text) ||
81
+ /^Import trace for requested module:/.test(text));
82
+ }
83
+ /** A line that says the server rebuilt or reloaded cleanly. */
84
+ export function isSuccessLine(text) {
85
+ return (/\bhmr update\b/i.test(text) ||
86
+ /\bpage reload\b/i.test(text) ||
87
+ /compiled successfully/i.test(text) ||
88
+ /✓ (?:Compiled|Ready)/.test(text) ||
89
+ /\bFound 0 errors\b/.test(text) ||
90
+ /\bready in \d/i.test(text) ||
91
+ /\bbuilt in \d/i.test(text) ||
92
+ /webpack compiled successfully/i.test(text) ||
93
+ /^\s*Compiled\b(?!.*(?:error|warning))/i.test(text));
94
+ }
95
+ const SOURCE_EXT = "(?:[cm]?[jt]sx?|vue|svelte|astro|mdx?|css|scss|sass|less|html|json|py|go|rs|rb|php|java|kt|cs)";
96
+ const LOCATION = new RegExp(`((?:[A-Za-z]:)?[^\\s()'"<>|:]*\\.${SOURCE_EXT}):(\\d+)(?::(\\d+))?`);
97
+ /** The first file:line in the error that isn't inside node_modules or Node's own code. */
98
+ export function findLocation(lines) {
99
+ // Python lists the innermost frame last: take the last frame in the user's own code.
100
+ const py = lines
101
+ .map((l) => /File "([^"]+)", line (\d+)/.exec(l))
102
+ .filter((m) => !!m && !/site-packages|[\\/]lib[\\/]python|^</.test(m[1]));
103
+ if (py.length)
104
+ return { file: py[py.length - 1][1], line: +py[py.length - 1][2] };
105
+ for (const raw of lines) {
106
+ const text = raw
107
+ .replace(/^\s*at\s+/, "")
108
+ .replace(/file:\/\/\/([A-Za-z]:)/g, "$1")
109
+ .replace(/file:\/\//g, "");
110
+ const m = LOCATION.exec(text);
111
+ if (m && !/node_modules|node:internal|^node:/.test(m[1]) && !/[\\/]\.vite[\\/]deps/.test(m[1])) {
112
+ return { file: m[1], line: +m[2], column: m[3] ? +m[3] : undefined };
113
+ }
114
+ }
115
+ return undefined;
116
+ }
117
+ /** Feed it every output line; it keeps the errors it found. */
118
+ export class ErrorTracker {
119
+ list = [];
120
+ open;
121
+ /** The last few lines, because Node prints a SyntaxError's file:line above the error. */
122
+ recent = [];
123
+ push(line, now = new Date()) {
124
+ this.handle(line, now);
125
+ if (line.stream !== "dx") {
126
+ this.recent.push(line.text);
127
+ if (this.recent.length > 6)
128
+ this.recent.shift();
129
+ }
130
+ }
131
+ handle(line, now) {
132
+ const text = line.text;
133
+ if (line.stream === "dx") {
134
+ this.close(now);
135
+ const exit = /^Exited with (.+)\.$/.exec(text);
136
+ if (exit && exit[1] !== "0")
137
+ this.record({ kind: "exit", message: `The dev server exited with ${exit[1]}` }, [text], line.n, line.n, now);
138
+ return;
139
+ }
140
+ if (this.open) {
141
+ const start = this.open.start;
142
+ if (start.needsMessage && text.trim()) {
143
+ start.message = text.trim();
144
+ start.needsMessage = false;
145
+ this.open.lines.push(text);
146
+ this.open.lastLine = line.n;
147
+ return;
148
+ }
149
+ if (start.untilException) {
150
+ this.open.lines.push(text);
151
+ this.open.lastLine = line.n;
152
+ const exc = /^(\w+(?:\.\w+)*(?:Error|Exception|Exit|Interrupt)\w*)(?:: (.*))?$/.exec(text);
153
+ if (exc) {
154
+ start.message = exc[2] ? `${exc[1]}: ${exc[2]}` : exc[1];
155
+ start.untilException = false;
156
+ this.close(now);
157
+ }
158
+ else if (this.open.lines.length >= MAX_BLOCK * 2)
159
+ this.close(now);
160
+ return;
161
+ }
162
+ // esbuild puts a blank line between the message and its location: allow one.
163
+ if (!text.trim() && start.kind === "build" && !start.file && !this.open.blankSeen) {
164
+ this.open.blankSeen = true;
165
+ return;
166
+ }
167
+ if (isContinuation(text, false) && this.open.lines.length < MAX_BLOCK && !matchErrorStart(text.trim())) {
168
+ this.open.lines.push(text);
169
+ this.open.lastLine = line.n;
170
+ // esbuild prints the location on the line after the message.
171
+ if (!start.file) {
172
+ const loc = findLocation([text]);
173
+ if (loc)
174
+ Object.assign(start, loc);
175
+ }
176
+ return;
177
+ }
178
+ this.close(now);
179
+ }
180
+ if (isSuccessLine(text)) {
181
+ for (const e of this.list)
182
+ e.resolved = true;
183
+ return;
184
+ }
185
+ const start = matchErrorStart(text);
186
+ if (start)
187
+ this.open = { start, lines: [text], firstLine: line.n, lastLine: line.n, before: [...this.recent] };
188
+ }
189
+ /** Ends the error being collected; call when the output goes quiet. */
190
+ flush(now = new Date()) {
191
+ this.close(now);
192
+ }
193
+ /** Errors still current, newest first. `all` includes resolved ones. */
194
+ errors(options = {}) {
195
+ return this.list
196
+ .filter((e) => (options.all || !e.resolved) && (options.after === undefined || e.lastLine > options.after))
197
+ .sort((a, b) => b.lastLine - a.lastLine);
198
+ }
199
+ clear() {
200
+ this.list = [];
201
+ this.open = undefined;
202
+ }
203
+ close(now) {
204
+ if (!this.open)
205
+ return;
206
+ const { start, lines, firstLine, lastLine, before } = this.open;
207
+ this.open = undefined;
208
+ this.record(start, lines, firstLine, lastLine, now, before);
209
+ }
210
+ record(start, lines, firstLine, lastLine, now, before = []) {
211
+ let loc = start.file ? { file: start.file, line: start.line, column: start.column } : findLocation(lines);
212
+ if (!loc && start.kind === "runtime") {
213
+ // Node's SyntaxError: "path/to/file.js:12" alone on a line, then the code, a caret, a blank line, the error.
214
+ for (let i = before.length - 1; i >= 0; i--) {
215
+ const m = /^((?:[A-Za-z]:)?[^\s()'"<>|:]+\.[A-Za-z0-9]+):(\d+)$/.exec(before[i].trim());
216
+ if (m && !/node_modules|^node:/.test(m[1])) {
217
+ loc = { file: m[1], line: +m[2], column: undefined };
218
+ lines = [lines[0], ...before.slice(i), ...lines.slice(1)];
219
+ break;
220
+ }
221
+ }
222
+ }
223
+ const full = start.message || "Build error";
224
+ const message = full.length > 300 ? full.slice(0, 297) + "…" : full;
225
+ const id = hash(`${start.kind}|${message.replace(/\d+/g, "#")}|${loc?.file ?? ""}:${loc?.line ?? ""}`);
226
+ const at = now.toISOString();
227
+ const existing = this.list.find((e) => e.id === id);
228
+ if (existing) {
229
+ existing.count++;
230
+ existing.lastLine = lastLine;
231
+ existing.lastSeen = at;
232
+ existing.lines = lines.slice(0, MAX_BLOCK);
233
+ existing.resolved = false;
234
+ return;
235
+ }
236
+ this.list.push({
237
+ id,
238
+ kind: start.kind,
239
+ message,
240
+ file: loc?.file,
241
+ line: loc?.line,
242
+ column: loc?.column,
243
+ lines: lines.slice(0, MAX_BLOCK),
244
+ count: 1,
245
+ firstLine,
246
+ lastLine,
247
+ firstSeen: at,
248
+ lastSeen: at,
249
+ resolved: false,
250
+ });
251
+ if (this.list.length > MAX_ERRORS)
252
+ this.list.splice(0, this.list.length - MAX_ERRORS);
253
+ }
254
+ }
255
+ function hash(s) {
256
+ let h = 2166136261;
257
+ for (let i = 0; i < s.length; i++)
258
+ h = Math.imul(h ^ s.charCodeAt(i), 16777619);
259
+ return (h >>> 0).toString(36);
260
+ }
261
+ //# sourceMappingURL=devErrors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devErrors.js","sourceRoot":"","sources":["../../src/tools/devErrors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface Check {
2
+ name: string;
3
+ status: "ok" | "warn" | "fail";
4
+ detail: string;
5
+ /** How to fix it: a command to run, or what to do. AI agents get this through MCP and can do it. */
6
+ fix?: string;
7
+ }
8
+ /** Checks that everything dx relies on works on this machine. */
9
+ export declare function runDoctor(): Promise<Check[]>;
10
+ /** Returns the resolved path of a command, or undefined if it can't be found. */
11
+ export declare function commandExists(command: string): Promise<string | undefined>;
12
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/tools/doctor.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,oGAAoG;IACpG,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,iEAAiE;AACjE,wBAAsB,SAAS,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAsIlD;AAuBD,iFAAiF;AACjF,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAWhF"}