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,148 @@
1
+ import { parseArgs } from "node:util";
2
+ import { autoConnectAiTools, connectAiTools, disconnectAiTools, findProjects, listAiTools, loadConfig, recordRun, saveConfig, scanProjects, } from "@dx/core";
3
+ import { findDashboard } from "@dx/web/link";
4
+ import { c, info, ok, UsageError, warn } from "../ui.js";
5
+ const IDS = ["claude-code", "claude-desktop", "cursor", "windsurf", "vscode"];
6
+ export const setupCommand = {
7
+ name: "setup",
8
+ summary: "Connect dx to your AI tools (Claude Code, Claude Desktop, Cursor, Windsurf, VS Code)",
9
+ usage: [
10
+ "dx setup connect dx to every AI tool installed here (it also does this by itself on first use)",
11
+ "dx setup --list show which tools are installed and connected",
12
+ "dx setup --undo remove dx from every AI tool, and stop connecting new ones",
13
+ "dx setup cursor only this tool: claude-code, claude-desktop, cursor, windsurf or vscode",
14
+ "",
15
+ "Connected tools can run your projects' dev servers, read their output and errors, and check pages.",
16
+ ].join("\n"),
17
+ async run(argv) {
18
+ const { values, positionals } = parseArgs({
19
+ args: argv,
20
+ allowPositionals: true,
21
+ options: { list: { type: "boolean" }, undo: { type: "boolean" } },
22
+ });
23
+ for (const p of positionals)
24
+ if (!IDS.includes(p))
25
+ throw new UsageError(`Unknown AI tool: ${p}. One of: ${IDS.join(", ")}`);
26
+ const ids = positionals.length ? positionals : undefined;
27
+ if (values.list) {
28
+ for (const t of await listAiTools()) {
29
+ const state = !t.installed && !t.connected ? c.dim("not installed") : t.connected ? (t.current ? c.green("connected") : c.yellow("points at an old copy of dx")) : c.yellow("not connected");
30
+ console.log(` ${t.name.padEnd(15)} ${state}`);
31
+ }
32
+ return;
33
+ }
34
+ if (values.undo) {
35
+ const results = await disconnectAiTools(ids);
36
+ if (!ids)
37
+ saveConfig({ ...loadConfig(), autoConnectAi: false });
38
+ if (!results.length)
39
+ info("dx isn't connected to any AI tool.");
40
+ for (const r of results)
41
+ (r.ok ? ok : warn)(`${r.name}: ${r.message}`);
42
+ if (!ids)
43
+ info(c.dim("dx won't connect itself to new AI tools. Run dx setup to turn that back on."));
44
+ recordRun("setup", results.every((r) => r.ok), `disconnected ${results.map((r) => r.name).join(", ") || "nothing"}`);
45
+ return results.every((r) => r.ok) ? 0 : 1;
46
+ }
47
+ if (!ids && loadConfig().autoConnectAi === false)
48
+ saveConfig({ ...loadConfig(), autoConnectAi: true });
49
+ const results = await connectAiTools(ids);
50
+ if (!results.length) {
51
+ info("No AI tools found. dx works with Claude Code, Claude Desktop, Cursor, Windsurf and VS Code.");
52
+ return;
53
+ }
54
+ for (const r of results)
55
+ (r.ok ? ok : warn)(`${r.name}: ${r.message}`);
56
+ recordRun("setup", results.every((r) => r.ok), results.map((r) => `${r.name}: ${r.message}`).join("; "));
57
+ return results.every((r) => r.ok) ? 0 : 1;
58
+ },
59
+ };
60
+ /** Runs once, the first time dx is used, so connecting AI tools needs no setup step. */
61
+ export async function firstRunSetup() {
62
+ const config = loadConfig();
63
+ if (config.aiToolsSeen !== undefined || config.autoConnectAi === false)
64
+ return;
65
+ try {
66
+ const results = await autoConnectAiTools();
67
+ const done = results.filter((r) => r.ok);
68
+ if (done.length) {
69
+ info(c.dim(`dx connected itself to ${done.map((r) => r.name).join(", ")}, so they can run and check your apps. Undo: dx setup --undo`));
70
+ }
71
+ }
72
+ catch {
73
+ // Never let this get in the way of the command that was asked for.
74
+ }
75
+ }
76
+ function pick(query) {
77
+ const { match, candidates } = findProjects(query, scanProjects(loadConfig()));
78
+ const project = match ?? (candidates.length === 1 ? candidates[0] : undefined);
79
+ if (project)
80
+ return project;
81
+ throw new Error(candidates.length ? `Several projects match "${query}": ${candidates.slice(0, 8).map((p) => p.name).join(", ")}` : `No project matches "${query}".`);
82
+ }
83
+ export const logsCommand = {
84
+ name: "logs",
85
+ summary: "Show a dev server's output from the dashboard (one an AI agent started, say)",
86
+ usage: ["dx logs todo-app print its output so far", "dx logs todo-app -f and keep following it (Ctrl+C stops)"].join("\n"),
87
+ async run(argv) {
88
+ const { values, positionals } = parseArgs({ args: argv, allowPositionals: true, options: { follow: { type: "boolean", short: "f" } } });
89
+ if (!positionals[0])
90
+ throw new UsageError("Which project?");
91
+ const project = pick(positionals[0]);
92
+ const client = await findDashboard();
93
+ if (!client) {
94
+ info(`${project.name} isn't running in the dashboard. Start it with dx ui, or ask your AI tool to.`);
95
+ return 1;
96
+ }
97
+ let after = 0;
98
+ const show = async () => {
99
+ const r = await client.get(`/api/dev/logs?dir=${encodeURIComponent(project.dir)}&after=${after}`);
100
+ for (const l of r.lines)
101
+ console.log(l.stream === "err" ? c.red(l.text) : l.stream === "dx" ? c.cyan(l.text) : l.text);
102
+ if (r.lines.length)
103
+ after = r.lines[r.lines.length - 1].n;
104
+ return r.server;
105
+ };
106
+ const server = await show();
107
+ if (!server) {
108
+ info(`${project.name} isn't running in the dashboard.`);
109
+ return 1;
110
+ }
111
+ if (!values.follow)
112
+ return;
113
+ await new Promise((resolve) => {
114
+ const timer = setInterval(() => void show().catch(() => (clearInterval(timer), resolve())), 1000);
115
+ process.once("SIGINT", () => (clearInterval(timer), resolve()));
116
+ });
117
+ },
118
+ };
119
+ export const errorsCommand = {
120
+ name: "errors",
121
+ summary: "Errors in the dev servers running in the dashboard, with file and line",
122
+ usage: ["dx errors every running server", "dx errors todo-app one project", "dx errors --all include errors a clean rebuild resolved"].join("\n"),
123
+ async run(argv) {
124
+ const { values, positionals } = parseArgs({ args: argv, allowPositionals: true, options: { all: { type: "boolean" } } });
125
+ const dir = positionals[0] ? pick(positionals[0]).dir : "";
126
+ const client = await findDashboard();
127
+ const list = client
128
+ ? await client.get(`/api/dev/errors?dir=${encodeURIComponent(dir)}${values.all ? "&all=1" : ""}`)
129
+ : [];
130
+ if (!list.length) {
131
+ info("No dev servers are running in the dashboard.");
132
+ return;
133
+ }
134
+ let total = 0;
135
+ for (const s of list) {
136
+ console.log(c.bold(s.project));
137
+ if (!s.errors.length)
138
+ console.log(` ${c.green("✓")} no errors`);
139
+ for (const e of s.errors) {
140
+ total++;
141
+ const where = e.file ? c.cyan(` ${e.file}${e.line ? `:${e.line}` : ""}${e.column ? `:${e.column}` : ""}`) : "";
142
+ console.log(` ${e.resolved ? c.dim("resolved") : c.red("✗")} ${e.message}${where}${e.count > 1 ? c.dim(` ×${e.count}`) : ""}`);
143
+ }
144
+ }
145
+ return total ? 1 : 0;
146
+ },
147
+ };
148
+ //# sourceMappingURL=ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai.js","sourceRoot":"","sources":["../../src/commands/ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "../command.js";
2
+ export declare const cleanCommand: Command;
3
+ //# sourceMappingURL=clean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,YAAY,EAAE,OA4E1B,CAAC"}
@@ -0,0 +1,72 @@
1
+ import { parseArgs } from "node:util";
2
+ import { deleteCleanup, findCleanup, formatBytes, loadConfig, recordRun } from "@dx/core";
3
+ import { c, confirm, info, ok, relativeTime, table, tildify, UsageError, warn } from "../ui.js";
4
+ export const cleanCommand = {
5
+ name: "clean",
6
+ summary: "Free disk space: delete node_modules and build folders in projects you haven't touched lately",
7
+ usage: [
8
+ "dx clean projects idle for 30+ days: show what can go, then ask before deleting",
9
+ "dx clean --days 90 only projects idle for 90+ days",
10
+ "dx clean --list only show them",
11
+ "dx clean -y delete without asking",
12
+ "dx clean --json the list as JSON",
13
+ "",
14
+ "Only folders an install or build recreates. In a git repo, only folders git ignores,",
15
+ "so a committed build/ folder is never touched. Run npm install to get node_modules back.",
16
+ ].join("\n"),
17
+ async run(argv) {
18
+ const { values } = parseArgs({
19
+ args: argv,
20
+ options: {
21
+ days: { type: "string", short: "d" },
22
+ list: { type: "boolean", short: "l" },
23
+ yes: { type: "boolean", short: "y" },
24
+ json: { type: "boolean" },
25
+ },
26
+ });
27
+ const days = values.days === undefined ? 30 : Number(values.days);
28
+ if (!Number.isInteger(days) || days < 0)
29
+ throw new UsageError("--days must be a whole number, 0 or more.");
30
+ const progress = Boolean(process.stderr.isTTY) && !values.json;
31
+ const scan = await findCleanup({
32
+ days,
33
+ config: loadConfig(),
34
+ onProgress: progress
35
+ ? (done, total, name) => process.stderr.write(`\r\x1b[2K${c.dim(`Measuring ${done + 1}/${total} ${name}`)}`)
36
+ : undefined,
37
+ });
38
+ if (progress)
39
+ process.stderr.write("\r\x1b[2K");
40
+ if (values.json) {
41
+ console.log(JSON.stringify(scan, null, 2));
42
+ return;
43
+ }
44
+ if (scan.items.length === 0) {
45
+ console.log(scan.projectsScanned
46
+ ? `Nothing to clean in the ${scan.projectsScanned} project(s) idle for ${days}+ days.`
47
+ : `No project has been idle for ${days}+ days.`);
48
+ return;
49
+ }
50
+ console.log(table(["PROJECT", "FOLDER", "SIZE", "IDLE"], scan.items.map((i) => [c.bold(i.project), i.relative, formatBytes(i.bytes), c.dim(relativeTime(i.lastActive))])));
51
+ const projects = new Set(scan.items.map((i) => i.project)).size;
52
+ console.log(`\n${c.bold(formatBytes(scan.totalBytes))} in ${scan.items.length} folder(s) across ${projects} project(s) idle for ${days}+ days.`);
53
+ if (values.list)
54
+ return;
55
+ if (!values.yes && !(await confirm(`Delete them?`))) {
56
+ info(process.stdin.isTTY ? "Nothing deleted." : "Nothing deleted. Run it in a terminal to be asked, or add -y.");
57
+ return;
58
+ }
59
+ const results = await deleteCleanup(scan.items);
60
+ const freed = results.reduce((n, r) => n + r.bytes, 0);
61
+ const failed = results.filter((r) => !r.ok);
62
+ for (const r of failed)
63
+ warn(`${tildify(r.dir)}: ${r.message}`);
64
+ ok(`Freed ${formatBytes(freed)} (${results.length - failed.length} folder(s) deleted)`);
65
+ if (scan.items.some((i) => i.relative.endsWith("node_modules"))) {
66
+ info(`Run ${c.cyan("npm install")} in a project to get its node_modules back.`);
67
+ }
68
+ recordRun("clean", failed.length === 0, `${formatBytes(freed)} freed, ${failed.length} failed`);
69
+ return failed.length ? 1 : 0;
70
+ },
71
+ };
72
+ //# sourceMappingURL=clean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1F,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEhG,MAAM,CAAC,MAAM,YAAY,GAAY;IACnC,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,+FAA+F;IACxG,KAAK,EAAE;QACL,8FAA8F;QAC9F,uDAAuD;QACvD,sCAAsC;QACtC,6CAA6C;QAC7C,wCAAwC;QACxC,EAAE;QACF,sFAAsF;QACtF,0FAA0F;KAC3F,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,KAAK,CAAC,GAAG,CAAC,IAAI;QACZ,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;YAC3B,IAAI,EAAE,IAAI;YACV,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;gBACpC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;gBACrC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;gBACpC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;aAC1B;SACF,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,2CAA2C,CAAC,CAAC;QAE3G,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QAC/D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC;YAC7B,IAAI;YACJ,MAAM,EAAE,UAAU,EAAE;YACpB,UAAU,EAAE,QAAQ;gBAClB,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC7G,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;QACH,IAAI,QAAQ;YAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAEhD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,eAAe;gBAClB,CAAC,CAAC,2BAA2B,IAAI,CAAC,eAAe,wBAAwB,IAAI,SAAS;gBACtF,CAAC,CAAC,gCAAgC,IAAI,SAAS,CAClD,CAAC;YACF,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CACT,KAAK,CACH,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAChH,CACF,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,qBAAqB,QAAQ,wBAAwB,IAAI,SAAS,CACpI,CAAC;QACF,IAAI,MAAM,CAAC,IAAI;YAAE,OAAO;QAExB,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,+DAA+D,CAAC,CAAC;YACjH,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,EAAE,CAAC,SAAS,WAAW,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,qBAAqB,CAAC,CAAC;QACxF,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;YAChE,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,6CAA6C,CAAC,CAAC;QAClF,CAAC;QACD,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;QAChG,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "../command.js";
2
+ export declare const depsCommand: Command;
3
+ //# sourceMappingURL=deps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/commands/deps.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,WAAW,EAAE,OAyFzB,CAAC"}
@@ -0,0 +1,98 @@
1
+ import { parseArgs } from "node:util";
2
+ import { auditDependencies, describeVulnerabilities, loadConfig, recordRun } from "@dx/core";
3
+ import { c, table, tildify, UsageError, warn } from "../ui.js";
4
+ export const depsCommand = {
5
+ name: "deps",
6
+ aliases: ["audit"],
7
+ summary: "Outdated packages and known vulnerabilities across all your Node projects",
8
+ usage: [
9
+ "dx deps every Node project (npm outdated + npm audit in each)",
10
+ "dx deps todo-app only projects matching a name",
11
+ "dx deps --active 30 only projects active in the last 30 days",
12
+ "dx deps --details also list each outdated package",
13
+ "dx deps --json the raw report",
14
+ "",
15
+ "It asks the npm registry, so it needs the internet and takes a few seconds per project.",
16
+ "Nothing is changed: fix with npm update / npm audit fix in the project.",
17
+ ].join("\n"),
18
+ async run(argv) {
19
+ const { values, positionals } = parseArgs({
20
+ args: argv,
21
+ allowPositionals: true,
22
+ options: {
23
+ active: { type: "string", short: "a" },
24
+ details: { type: "boolean", short: "d" },
25
+ json: { type: "boolean" },
26
+ },
27
+ });
28
+ const activeDays = values.active === undefined ? undefined : Number(values.active);
29
+ if (activeDays !== undefined && (!Number.isInteger(activeDays) || activeDays < 1)) {
30
+ throw new UsageError("--active must be a whole number of days, 1 or more.");
31
+ }
32
+ const query = positionals.join(" ").trim() || undefined;
33
+ const progress = Boolean(process.stderr.isTTY) && !values.json;
34
+ const started = Date.now();
35
+ const reports = await auditDependencies({
36
+ query,
37
+ activeDays,
38
+ config: loadConfig(),
39
+ onProgress: progress
40
+ ? (done, total, name) => process.stderr.write(`\r\x1b[2K${c.dim(`Checking ${Math.min(done + 1, total)}/${total} ${name}`)}`)
41
+ : undefined,
42
+ });
43
+ if (progress)
44
+ process.stderr.write("\r\x1b[2K");
45
+ if (values.json) {
46
+ console.log(JSON.stringify(reports, null, 2));
47
+ return;
48
+ }
49
+ if (reports.length === 0) {
50
+ console.log(query ? `No Node project matches "${query}".` : "No Node projects found.");
51
+ return 1;
52
+ }
53
+ const checked = reports.filter((r) => !r.skipped);
54
+ console.log(table(["PROJECT", "OUTDATED", "MAJOR", "VULNERABILITIES", "PATH"], reports.map((r) => [
55
+ c.bold(r.project),
56
+ r.skipped ? c.dim("—") : String(r.outdated.length),
57
+ r.skipped ? c.dim("—") : majorCell(r),
58
+ r.skipped ? c.dim(r.skipped) : vulnCell(r),
59
+ c.dim(tildify(r.dir)),
60
+ ])));
61
+ if (values.details) {
62
+ for (const r of checked) {
63
+ if (!r.outdated.length)
64
+ continue;
65
+ console.log(`\n${c.bold(r.project)}`);
66
+ console.log(table(["PACKAGE", "CURRENT", "WANTED", "LATEST"], r.outdated.map((p) => [p.name, p.current ?? c.dim("—"), p.wanted ?? c.dim("—"), p.major ? c.yellow(p.latest) : p.latest])));
67
+ }
68
+ }
69
+ for (const r of checked)
70
+ for (const n of r.notes)
71
+ warn(`${r.project}: ${n}`);
72
+ const vulnerable = checked.filter((r) => (r.vulnerabilities?.total ?? 0) > 0);
73
+ const outdated = checked.reduce((n, r) => n + r.outdated.length, 0);
74
+ console.log(`\n${checked.length} project(s) checked in ${Math.round((Date.now() - started) / 1000)}s: ` +
75
+ `${outdated} outdated package(s), ${vulnerable.length} project(s) with known vulnerabilities.`);
76
+ if (vulnerable.length)
77
+ console.log(c.dim("Fix in a project with: npm audit fix (details: npm audit)"));
78
+ if (!values.details && outdated)
79
+ console.log(c.dim("Each package: dx deps --details"));
80
+ recordRun("deps", true, `${checked.length} checked, ${vulnerable.length} vulnerable, ${outdated} outdated`);
81
+ },
82
+ };
83
+ function majorCell(r) {
84
+ const n = r.outdated.filter((p) => p.major).length;
85
+ return n ? c.yellow(String(n)) : "0";
86
+ }
87
+ function vulnCell(r) {
88
+ const text = describeVulnerabilities(r.vulnerabilities);
89
+ const v = r.vulnerabilities;
90
+ if (!v)
91
+ return c.dim(text);
92
+ if (v.critical || v.high)
93
+ return c.red(text);
94
+ if (v.moderate || v.low)
95
+ return c.yellow(text);
96
+ return c.green(text);
97
+ }
98
+ //# sourceMappingURL=deps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/commands/deps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "../command.js";
2
+ export declare const goCommand: Command;
3
+ //# sourceMappingURL=go.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../src/commands/go.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAK7C,eAAO,MAAM,SAAS,EAAE,OA6GvB,CAAC"}
@@ -0,0 +1,202 @@
1
+ import { spawn } from "node:child_process";
2
+ import path from "node:path";
3
+ import { parseArgs } from "node:util";
4
+ import { ensureDashboard } from "@dx/web/link";
5
+ import { detectStack, findProjects, getProjectPort, killPort, listListeningPorts, loadConfig, openInEditor, openTerminal, openUrl, readProject, recordRun, scanProjects, waitForPort, } from "@dx/core";
6
+ import { projectLabel } from "./projects.js";
7
+ import { follow } from "./stack.js";
8
+ import { c, confirm, info, ok, pick, tildify, UsageError, warn } from "../ui.js";
9
+ export const goCommand = {
10
+ name: "go",
11
+ aliases: ["open"],
12
+ summary: "Open a project in your editor and start its dev server",
13
+ usage: [
14
+ "dx go [search] [options]",
15
+ "",
16
+ " -w, --window run the dev server in a new terminal window instead of this one",
17
+ " --no-dev only open the editor",
18
+ " --no-editor only start the dev server",
19
+ " --no-browser don't open the browser when the server is ready",
20
+ "",
21
+ "Without a search, picks from your most recently active projects.",
22
+ "Use . for the project in the current folder: dx go .",
23
+ ].join("\n"),
24
+ async run(argv) {
25
+ const { values, positionals } = parseArgs({
26
+ args: argv,
27
+ allowPositionals: true,
28
+ allowNegative: true,
29
+ options: {
30
+ window: { type: "boolean", short: "w" },
31
+ dev: { type: "boolean", default: true },
32
+ editor: { type: "boolean", default: true },
33
+ browser: { type: "boolean", default: true },
34
+ },
35
+ });
36
+ const config = loadConfig();
37
+ const query = positionals.join(" ").trim();
38
+ let project;
39
+ if (query === ".") {
40
+ project = readProject(process.cwd());
41
+ if (!project)
42
+ throw new UsageError(`${process.cwd()} doesn't look like a project (no package.json, go.mod, .git, …).`);
43
+ }
44
+ else {
45
+ const projects = scanProjects(config);
46
+ if (projects.length === 0)
47
+ throw new UsageError("No projects found. Add a folder with: dx config add-root <path>");
48
+ project = await choose(query, projects);
49
+ }
50
+ if (!project)
51
+ return 1;
52
+ console.log(`${c.bold(project.name)} ${c.dim(tildify(project.dir))}`);
53
+ if (values.editor) {
54
+ const editor = project.editor ?? config.editor;
55
+ try {
56
+ await openInEditor(project.dir, editor);
57
+ ok(`Opened in ${editor}`);
58
+ }
59
+ catch (err) {
60
+ warn(`Couldn't open ${editor}: ${err.message}`);
61
+ }
62
+ }
63
+ if (!values.dev) {
64
+ recordRun("go", true, project.name, "cli", { project: project.name });
65
+ return;
66
+ }
67
+ const stack = detectStack(project);
68
+ if (stack) {
69
+ if (values.window) {
70
+ await openTerminal(project.dir, "dx go . --no-editor", project.name);
71
+ ok(`Started the stack in a new terminal window`);
72
+ return;
73
+ }
74
+ info(`Starting ${stack.services.map((s) => c.cyan(s.name)).join(", ")} in order ${c.dim("(Ctrl+C stops them all)")}\n`);
75
+ const client = await ensureDashboard();
76
+ await client.post("/api/dev/start", { dir: project.dir, by: "terminal" });
77
+ return follow(client, project, values.browser);
78
+ }
79
+ if (!project.devCommand) {
80
+ info(`No dev command found. Add one in ${tildify(path.join(project.dir, ".devrc.json"))}: { "dev": "..." }`);
81
+ recordRun("go", true, project.name, "cli", { project: project.name });
82
+ return;
83
+ }
84
+ const port = getProjectPort(project);
85
+ if (port !== undefined) {
86
+ const decision = await handleBusyPort(project, port);
87
+ if (decision === "already-running") {
88
+ if (values.browser && project.url)
89
+ await openBrowser(project.url);
90
+ recordRun("go", true, `${project.name} (already running)`, "cli", { project: project.name });
91
+ return;
92
+ }
93
+ }
94
+ const timeoutMs = config.devServerTimeout * 1000;
95
+ if (values.window) {
96
+ await openTerminal(project.dir, project.devCommand, project.name);
97
+ ok(`Started ${c.cyan(project.devCommand)} in a new terminal window`);
98
+ if (values.browser && port !== undefined && project.url)
99
+ await openWhenReady(project.url, port, timeoutMs);
100
+ recordRun("go", true, project.name, "cli", { project: project.name });
101
+ return;
102
+ }
103
+ info(`Running ${c.cyan(project.devCommand)} ${c.dim("(Ctrl+C to stop)")}\n`);
104
+ const startedAt = Date.now();
105
+ const { code, interrupted } = await runForeground(project, values.browser && port !== undefined ? port : undefined, timeoutMs);
106
+ // Stopping the server with Ctrl+C is the normal way to finish, not a failure.
107
+ if (interrupted) {
108
+ recordRun("go", true, `${project.name} dev stopped with Ctrl+C`, "cli", { project: project.name, ms: Date.now() - startedAt });
109
+ return 0;
110
+ }
111
+ recordRun("go", code === 0, `${project.name} dev exited with ${code}`, "cli", { project: project.name, ms: Date.now() - startedAt });
112
+ return code;
113
+ },
114
+ };
115
+ async function choose(query, projects) {
116
+ const { match, candidates } = findProjects(query, projects);
117
+ if (match)
118
+ return match;
119
+ if (candidates.length === 0) {
120
+ console.log(`No project matches "${query}". See them all with: dx projects`);
121
+ return undefined;
122
+ }
123
+ if (candidates.length === 1)
124
+ return candidates[0];
125
+ console.log(query ? `Several projects match "${query}":` : "Recent projects:");
126
+ return pick(candidates.slice(0, 12), projectLabel);
127
+ }
128
+ /**
129
+ * If the project's port is taken: when it's this project's own dev server, reuse it;
130
+ * otherwise offer to kill whatever holds it.
131
+ */
132
+ async function handleBusyPort(project, port) {
133
+ let entries;
134
+ try {
135
+ entries = await listListeningPorts(port);
136
+ }
137
+ catch {
138
+ return "free"; // can't inspect ports; let the dev server report a clash itself
139
+ }
140
+ if (entries.length === 0)
141
+ return "free";
142
+ const dir = project.dir.toLowerCase();
143
+ const own = entries.find((e) => e.commandLine?.toLowerCase().includes(dir));
144
+ if (own) {
145
+ ok(`Already running on port ${port} (PID ${own.pid}), opening it`);
146
+ return "already-running";
147
+ }
148
+ const who = entries.map((e) => `${e.processName ?? "unknown"} (PID ${e.pid})`).join(", ");
149
+ warn(`Port ${port} is already used by ${who}.`);
150
+ if (await confirm(`Kill it and continue?`)) {
151
+ const { results } = await killPort(port);
152
+ for (const r of results)
153
+ (r.ok ? ok : warn)(r.message);
154
+ return "free";
155
+ }
156
+ info("Starting anyway; the dev server may pick another port.");
157
+ return "busy";
158
+ }
159
+ async function openWhenReady(url, port, timeoutMs, signal) {
160
+ const ready = await waitForPort(port, timeoutMs, signal);
161
+ if (signal?.aborted)
162
+ return;
163
+ if (!ready) {
164
+ warn(`Port ${port} didn't open within ${Math.round(timeoutMs / 1000)}s, so the browser wasn't opened.`);
165
+ return;
166
+ }
167
+ await openBrowser(url);
168
+ }
169
+ async function openBrowser(url) {
170
+ try {
171
+ await openUrl(url);
172
+ ok(`Ready, opened ${c.cyan(url)}`);
173
+ }
174
+ catch (err) {
175
+ warn(`Couldn't open the browser: ${err.message}. The app is at ${url}`);
176
+ }
177
+ }
178
+ function runForeground(project, port, timeoutMs) {
179
+ return new Promise((resolve) => {
180
+ const child = spawn(project.devCommand, { cwd: project.dir, shell: true, stdio: "inherit" });
181
+ const abort = new AbortController();
182
+ // Ctrl+C reaches the dev server directly; dx just notes it and waits for the server to shut down.
183
+ let interrupted = false;
184
+ const onInterrupt = () => {
185
+ interrupted = true;
186
+ };
187
+ process.on("SIGINT", onInterrupt);
188
+ if (port !== undefined && project.url)
189
+ void openWhenReady(project.url, port, timeoutMs, abort.signal);
190
+ const finish = (code) => {
191
+ abort.abort();
192
+ process.off("SIGINT", onInterrupt);
193
+ resolve({ code, interrupted });
194
+ };
195
+ child.once("error", (err) => {
196
+ warn(`Couldn't start the dev server: ${err.message}`);
197
+ finish(1);
198
+ });
199
+ child.once("exit", (code, signal) => finish(code ?? (signal ? 130 : 1)));
200
+ });
201
+ }
202
+ //# sourceMappingURL=go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.js","sourceRoot":"","sources":["../../src/commands/go.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "../command.js";
2
+ export declare const logCommand: Command;
3
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,UAAU,EAAE,OA8CxB,CAAC"}