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,51 @@
1
+ import { parseArgs } from "node:util";
2
+ import { addJournalEntry, journalPath, loadConfig, openInEditor, readJournal, recordRun } from "@dx/core";
3
+ import { c, ok, tildify } from "../ui.js";
4
+ export const logCommand = {
5
+ name: "log",
6
+ summary: "Write one line in your work journal, or read it back",
7
+ usage: [
8
+ 'dx log "fixed seat map overflow" add an entry',
9
+ "dx log show the last 7 days",
10
+ "dx log --days 30 show the last 30 days",
11
+ "dx log --edit open the journal file in your editor",
12
+ ].join("\n"),
13
+ async run(argv) {
14
+ const { values, positionals } = parseArgs({
15
+ args: argv,
16
+ allowPositionals: true,
17
+ options: {
18
+ days: { type: "string", short: "d" },
19
+ edit: { type: "boolean", short: "e" },
20
+ },
21
+ });
22
+ if (values.edit) {
23
+ await openInEditor(journalPath(), loadConfig().editor);
24
+ ok(`Opened ${tildify(journalPath())}`);
25
+ return;
26
+ }
27
+ const text = positionals.join(" ").trim();
28
+ if (text) {
29
+ const entry = addJournalEntry(text);
30
+ recordRun("log", true);
31
+ ok(`Logged ${c.dim(`${entry.date} ${entry.time}`)} ${entry.text}`);
32
+ return;
33
+ }
34
+ const days = values.days ? Math.max(1, Number(values.days) || 7) : 7;
35
+ const entries = readJournal({ sinceDays: days });
36
+ if (entries.length === 0) {
37
+ console.log(`Nothing logged in the last ${days} day(s). Add an entry with: dx log "what you did"`);
38
+ return;
39
+ }
40
+ let lastDate = "";
41
+ for (const e of entries) {
42
+ if (e.date !== lastDate) {
43
+ console.log(`${lastDate ? "\n" : ""}${c.bold(e.date)}`);
44
+ lastDate = e.date;
45
+ }
46
+ console.log(` ${c.dim(e.time || " ")} ${e.text}`);
47
+ }
48
+ console.log(c.dim(`\n${entries.length} entr${entries.length === 1 ? "y" : "ies"} · ${tildify(journalPath())}`));
49
+ },
50
+ };
51
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/commands/log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "../command.js";
2
+ export declare const newCommand: Command;
3
+ //# sourceMappingURL=new.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.d.ts","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAI7C,eAAO,MAAM,UAAU,EAAE,OA0GxB,CAAC"}
@@ -0,0 +1,117 @@
1
+ import { execFileSync, spawn } from "node:child_process";
2
+ import path from "node:path";
3
+ import { parseArgs } from "node:util";
4
+ import { copyProject, isValidProjectName, listTemplates, loadConfig, NAME_PLACEHOLDER, readProject, recordRun, resolveSource, saveAsTemplate, templatesDir, } from "@dx/core";
5
+ import { goCommand } from "./go.js";
6
+ import { c, info, ok, tildify, UsageError, warn } from "../ui.js";
7
+ export const newCommand = {
8
+ name: "new",
9
+ aliases: ["create"],
10
+ summary: "Start a new project from one of your templates or a copy of a project, then open it",
11
+ usage: [
12
+ "dx new list your templates",
13
+ "dx new <template> <name> new project from ~/.dx/templates/<template>",
14
+ "dx new <project> <name> new project copied from an existing one",
15
+ "dx new --save <project> <template> save a project as a template",
16
+ "",
17
+ " --in <folder> create it there instead of your first projects folder",
18
+ " --no-install don't install packages",
19
+ " --no-git don't create a git repository",
20
+ " --no-open don't open it afterwards (default: dx go, editor + dev server)",
21
+ " --no-dev open the editor but don't start the dev server",
22
+ "",
23
+ "A git project is copied as what git tracks plus new files it doesn't ignore.",
24
+ "Copies always leave out .git, node_modules, build output and .env files (.env.example is kept).",
25
+ `In template files, ${NAME_PLACEHOLDER} is replaced with the new name, in file names too.`,
26
+ ].join("\n"),
27
+ async run(argv) {
28
+ const { values, positionals } = parseArgs({
29
+ args: argv,
30
+ allowPositionals: true,
31
+ allowNegative: true,
32
+ options: {
33
+ save: { type: "boolean" },
34
+ in: { type: "string" },
35
+ install: { type: "boolean", default: true },
36
+ git: { type: "boolean", default: true },
37
+ open: { type: "boolean", default: true },
38
+ dev: { type: "boolean", default: true },
39
+ },
40
+ });
41
+ const config = loadConfig();
42
+ const [sourceInput, name] = positionals;
43
+ if (!sourceInput) {
44
+ const templates = listTemplates(config);
45
+ if (templates.length === 0) {
46
+ console.log(`No templates yet. They live in ${tildify(templatesDir(config))}, one folder each.`);
47
+ console.log(c.dim("Save one from a project: dx new --save todo-app vite-app"));
48
+ console.log(c.dim("Or copy a project directly: dx new todo-app my-new-app"));
49
+ return;
50
+ }
51
+ console.log(c.bold("Templates") + c.dim(` ${tildify(templatesDir(config))}`));
52
+ for (const t of templates)
53
+ console.log(` ${c.cyan(t.name)}`);
54
+ console.log(c.dim("\nUse one: dx new <template> <name>"));
55
+ return;
56
+ }
57
+ if (!name)
58
+ throw new UsageError(values.save ? "Name the template: dx new --save <project> <template>" : "Name the new project: dx new <template> <name>");
59
+ if (!isValidProjectName(name))
60
+ throw new UsageError(`"${name}" isn't a valid name: use lowercase letters, digits, - _ or .`);
61
+ const source = resolveSource(sourceInput, config);
62
+ if ("candidates" in source) {
63
+ throw new UsageError(source.candidates.length
64
+ ? `"${sourceInput}" matches several projects: ${source.candidates.join(", ")}. Which one?`
65
+ : `No template or project called "${sourceInput}". See templates with: dx new`);
66
+ }
67
+ if (values.save) {
68
+ const result = saveAsTemplate(source, name, config);
69
+ ok(`Saved ${c.bold(source.name)} as template ${c.cyan(name)} (${result.files} files) in ${tildify(result.dir)}`);
70
+ info(`Tip: put ${NAME_PLACEHOLDER} in its files (README title, page title, …) and new projects get their own name there.`);
71
+ recordRun("new.template", true, `${source.name} → ${name}`);
72
+ return;
73
+ }
74
+ const parent = values.in ? path.resolve(values.in) : config.projectsRoots[0];
75
+ if (!parent)
76
+ throw new UsageError("No projects folder configured. Add one with: dx config add-root <path>, or pass --in <folder>.");
77
+ const dest = path.join(parent, name);
78
+ const result = copyProject(source, dest, name);
79
+ ok(`Created ${c.bold(name)} from ${source.kind} ${c.cyan(source.name)}: ${result.files} files` +
80
+ (result.filled ? `, ${result.filled} with the name filled in` : "") +
81
+ c.dim(` ${tildify(dest)}`));
82
+ if (values.git) {
83
+ try {
84
+ execFileSync("git", ["init", "-q"], { cwd: dest, stdio: "ignore", windowsHide: true });
85
+ ok("Created a git repository");
86
+ }
87
+ catch {
88
+ warn("Couldn't create a git repository (is git installed?)");
89
+ }
90
+ }
91
+ const project = readProject(dest);
92
+ if (values.install && project?.kind === "node") {
93
+ const pm = project.packageManager ?? "npm";
94
+ info(`Installing packages with ${pm}…`);
95
+ const code = await runInherit(`${pm} install`, dest);
96
+ if (code === 0)
97
+ ok("Packages installed");
98
+ else
99
+ warn(`${pm} install exited with ${code}; run it again in ${tildify(dest)}`);
100
+ }
101
+ recordRun("new", true, `${name} from ${source.kind} ${source.name}`, "cli", { project: name });
102
+ if (!values.open) {
103
+ info(`Open it with: dx go ${name}`);
104
+ return;
105
+ }
106
+ process.chdir(dest);
107
+ return goCommand.run(values.dev ? ["."] : [".", "--no-dev"]);
108
+ },
109
+ };
110
+ function runInherit(command, cwd) {
111
+ return new Promise((resolve) => {
112
+ const child = spawn(command, { cwd, shell: true, stdio: "inherit" });
113
+ child.once("error", () => resolve(1));
114
+ child.once("exit", (code) => resolve(code ?? 1));
115
+ });
116
+ }
117
+ //# sourceMappingURL=new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"new.js","sourceRoot":"","sources":["../../src/commands/new.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,aAAa,EACb,cAAc,EACd,YAAY,GACb,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAElE,MAAM,CAAC,MAAM,UAAU,GAAY;IACjC,IAAI,EAAE,KAAK;IACX,OAAO,EAAE,CAAC,QAAQ,CAAC;IACnB,OAAO,EAAE,qFAAqF;IAC9F,KAAK,EAAE;QACL,wDAAwD;QACxD,gFAAgF;QAChF,4EAA4E;QAC5E,iEAAiE;QACjE,EAAE;QACF,0EAA0E;QAC1E,2CAA2C;QAC3C,kDAAkD;QAClD,mFAAmF;QACnF,mEAAmE;QACnE,EAAE;QACF,8EAA8E;QAC9E,iGAAiG;QACjG,sBAAsB,gBAAgB,oDAAoD;KAC3F,CAAC,IAAI,CAAC,IAAI,CAAC;IACZ,KAAK,CAAC,GAAG,CAAC,IAAI;QACZ,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,EAAE,IAAI;YACV,gBAAgB,EAAE,IAAI;YACtB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE;gBACP,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gBACzB,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACtB,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;gBAC3C,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;gBACvC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;gBACxC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;aACxC;SACF,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;QAC5B,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC;QAExC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;YACxC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,kCAAkC,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;gBACjG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC,CAAC;gBAC/E,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC,CAAC;gBAC7E,OAAO;YACT,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,KAAK,MAAM,CAAC,IAAI,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;YAC1D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,uDAAuD,CAAC,CAAC,CAAC,gDAAgD,CAAC,CAAC;QAC1J,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,IAAI,IAAI,+DAA+D,CAAC,CAAC;QAE7H,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClD,IAAI,YAAY,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,UAAU,CAClB,MAAM,CAAC,UAAU,CAAC,MAAM;gBACtB,CAAC,CAAC,IAAI,WAAW,+BAA+B,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc;gBAC1F,CAAC,CAAC,kCAAkC,WAAW,+BAA+B,CACjF,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YACpD,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,cAAc,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACjH,IAAI,CAAC,YAAY,gBAAgB,wFAAwF,CAAC,CAAC;YAC3H,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;QAC7E,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,UAAU,CAAC,gGAAgG,CAAC,CAAC;QACpI,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,EAAE,CACA,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,QAAQ;YACzF,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,CAAC,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAC9B,CAAC;QAEF,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,IAAI,CAAC;gBACH,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBACvF,EAAE,CAAC,0BAA0B,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,sDAAsD,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,OAAO,IAAI,OAAO,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC/C,MAAM,EAAE,GAAG,OAAO,CAAC,cAAc,IAAI,KAAK,CAAC;YAC3C,IAAI,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;YACrD,IAAI,IAAI,KAAK,CAAC;gBAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC;;gBACpC,IAAI,CAAC,GAAG,EAAE,wBAAwB,IAAI,qBAAqB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,SAAS,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/F,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/D,CAAC;CACF,CAAC;AAEF,SAAS,UAAU,CAAC,OAAe,EAAE,GAAW;IAC9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Command } from "../command.js";
2
+ export declare const portCommand: Command;
3
+ export declare const killCommand: Command;
4
+ //# sourceMappingURL=port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.d.ts","sourceRoot":"","sources":["../../src/commands/port.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAgD7C,eAAO,MAAM,WAAW,EAAE,OAwCzB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,OAczB,CAAC"}
@@ -0,0 +1,106 @@
1
+ import { parseArgs } from "node:util";
2
+ import { killPort, listListeningPorts, recordRun } from "@dx/core";
3
+ import { c, confirm, ok, table, UsageError, warn } from "../ui.js";
4
+ function portTable(entries) {
5
+ return table(["PORT", "PID", "PROCESS", "COMMAND"], entries.map((e) => [
6
+ c.bold(String(e.port)),
7
+ String(e.pid),
8
+ e.system ? c.dim(e.processName ?? "System") : (e.processName ?? c.dim("?")),
9
+ c.dim(e.commandLine ?? ""),
10
+ ]));
11
+ }
12
+ function parsePort(value) {
13
+ if (value === undefined)
14
+ return undefined;
15
+ const n = Number(value.replace(/^:/, ""));
16
+ if (!Number.isInteger(n) || n < 1 || n > 65535)
17
+ throw new UsageError(`Not a valid port: ${value}`);
18
+ return n;
19
+ }
20
+ async function killFlow(port, yes) {
21
+ const entries = await listListeningPorts(port);
22
+ if (entries.length === 0) {
23
+ console.log(`Nothing is listening on port ${port}.`);
24
+ return 0;
25
+ }
26
+ console.log(portTable(entries));
27
+ const killable = entries.filter((e) => !e.system);
28
+ if (killable.length === 0) {
29
+ warn(`Port ${port} belongs to the operating system; dx won't kill it.`);
30
+ return 1;
31
+ }
32
+ if (!yes && !(await confirm(`\nKill ${killable.length === 1 ? "this process" : `these ${killable.length} processes`}?`))) {
33
+ console.log("Left it running.");
34
+ return 0;
35
+ }
36
+ const { results } = await killPort(port);
37
+ let failed = 0;
38
+ for (const r of results) {
39
+ (r.ok ? ok : warn)(r.message);
40
+ if (!r.ok)
41
+ failed++;
42
+ }
43
+ recordRun("port.kill", failed === 0, `port ${port}: ${results.map((r) => r.message).join("; ")}`);
44
+ return failed === 0 ? 0 : 1;
45
+ }
46
+ export const portCommand = {
47
+ name: "port",
48
+ aliases: ["ports"],
49
+ summary: "See what's listening on a port, and kill it",
50
+ usage: [
51
+ "dx port list listening ports (1024 and up)",
52
+ "dx port --all include low ports and system processes",
53
+ "dx port 3000 show what's on port 3000",
54
+ "dx port 3000 --kill kill it (asks first; add -y to skip the question)",
55
+ "dx port --json",
56
+ ].join("\n"),
57
+ async run(argv) {
58
+ const { values, positionals } = parseArgs({
59
+ args: argv,
60
+ allowPositionals: true,
61
+ options: {
62
+ kill: { type: "boolean", short: "k" },
63
+ yes: { type: "boolean", short: "y" },
64
+ all: { type: "boolean", short: "a" },
65
+ json: { type: "boolean" },
66
+ },
67
+ });
68
+ const port = parsePort(positionals[0]);
69
+ if (values.kill) {
70
+ if (port === undefined)
71
+ throw new UsageError("Which port? e.g. dx port 3000 --kill");
72
+ return killFlow(port, Boolean(values.yes));
73
+ }
74
+ let entries = await listListeningPorts(port);
75
+ if (port === undefined && !values.all)
76
+ entries = entries.filter((e) => e.port >= 1024 && !e.system);
77
+ if (values.json) {
78
+ console.log(JSON.stringify(entries, null, 2));
79
+ return;
80
+ }
81
+ if (entries.length === 0) {
82
+ console.log(port === undefined ? "No listening ports found." : `Nothing is listening on port ${port}.`);
83
+ return;
84
+ }
85
+ console.log(portTable(entries));
86
+ if (port !== undefined)
87
+ console.log(c.dim(`\nKill it with: dx kill ${port}`));
88
+ },
89
+ };
90
+ export const killCommand = {
91
+ name: "kill",
92
+ summary: "Kill whatever is listening on a port",
93
+ usage: "dx kill <port> [-y]",
94
+ async run(argv) {
95
+ const { values, positionals } = parseArgs({
96
+ args: argv,
97
+ allowPositionals: true,
98
+ options: { yes: { type: "boolean", short: "y" } },
99
+ });
100
+ const port = parsePort(positionals[0]);
101
+ if (port === undefined)
102
+ throw new UsageError("Which port? e.g. dx kill 3000");
103
+ return killFlow(port, Boolean(values.yes));
104
+ },
105
+ };
106
+ //# sourceMappingURL=port.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port.js","sourceRoot":"","sources":["../../src/commands/port.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type Project } from "@dx/core";
2
+ import type { Command } from "../command.js";
3
+ export declare function projectLabel(p: Project): string;
4
+ export declare const projectsCommand: Command;
5
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAA0C,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AAChF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAG/C;AAED,eAAO,MAAM,eAAe,EAAE,OA2C7B,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { parseArgs } from "node:util";
2
+ import { findProjects, loadConfig, scanProjects } from "@dx/core";
3
+ import { c, relativeTime, table, tildify } from "../ui.js";
4
+ export function projectLabel(p) {
5
+ const kind = p.packageManager ? `${p.kind}/${p.packageManager}` : p.kind;
6
+ return `${c.bold(p.name)} ${c.dim(kind)} ${c.dim(relativeTime(p.lastActive))}`;
7
+ }
8
+ export const projectsCommand = {
9
+ name: "projects",
10
+ aliases: ["ls"],
11
+ summary: "List your projects, most recently active first",
12
+ usage: "dx projects [search] [--json]",
13
+ async run(argv) {
14
+ const { values, positionals } = parseArgs({
15
+ args: argv,
16
+ allowPositionals: true,
17
+ options: { json: { type: "boolean" } },
18
+ });
19
+ const config = loadConfig();
20
+ const all = scanProjects(config);
21
+ const query = positionals.join(" ");
22
+ const list = query ? findProjects(query, all).candidates : all;
23
+ if (values.json) {
24
+ console.log(JSON.stringify(list, null, 2));
25
+ return;
26
+ }
27
+ if (all.length === 0) {
28
+ console.log(`No projects found in ${config.projectsRoots.map(tildify).join(", ")}.`);
29
+ console.log(c.dim("Add a folder with: dx config add-root <path>"));
30
+ return 1;
31
+ }
32
+ if (list.length === 0) {
33
+ console.log(`No project matches "${query}".`);
34
+ return 1;
35
+ }
36
+ console.log(table(["NAME", "TYPE", "ACTIVE", "DEV", "PATH"], list.map((p) => [
37
+ c.bold(p.name),
38
+ p.packageManager ? `${p.kind}/${p.packageManager}` : p.kind,
39
+ relativeTime(p.lastActive),
40
+ p.devCommand ? c.cyan(p.devCommand) : c.dim("—"),
41
+ c.dim(tildify(p.dir)),
42
+ ])));
43
+ console.log(c.dim(`\n${list.length} project(s). Open one with: dx go <name>`));
44
+ },
45
+ };
46
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type Project } from "@dx/core";
2
+ import { type DashboardClient } from "@dx/web/link";
3
+ import type { Command } from "../command.js";
4
+ /**
5
+ * Stacks run in the dashboard, so they keep going when the terminal closes (dx up), or follow in
6
+ * this terminal and stop with Ctrl+C (dx go).
7
+ */
8
+ interface DevInfo {
9
+ project: string;
10
+ dir: string;
11
+ status: string;
12
+ url?: string;
13
+ localUrl?: string;
14
+ command: string;
15
+ service?: string;
16
+ role?: string;
17
+ errorCount: number;
18
+ lastLine: number;
19
+ services?: DevInfo[];
20
+ note?: string;
21
+ }
22
+ /** Prints a stack's services with their addresses. */
23
+ export declare function printServices(server: DevInfo): void;
24
+ /** Starts a project (its stack, or its dev command) in the dashboard and waits until it's up. */
25
+ export declare function startInDashboard(project: Project, by?: "terminal" | "ai"): Promise<{
26
+ client: DashboardClient;
27
+ server: DevInfo;
28
+ }>;
29
+ /** Follows the output in this terminal until Ctrl+C, which stops it. */
30
+ export declare function follow(client: DashboardClient, project: Project, openWhenReady: boolean): Promise<number>;
31
+ export declare const upCommand: Command;
32
+ export declare const downCommand: Command;
33
+ export {};
34
+ //# sourceMappingURL=stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../../src/commands/stack.ts"],"names":[],"mappings":"AACA,OAAO,EAA2E,KAAK,OAAO,EAAE,MAAM,UAAU,CAAC;AACjH,OAAO,EAAkC,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACpF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C;;;GAGG;AACH,UAAU,OAAO;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAiBD,sDAAsD;AACtD,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAUnD;AAED,iGAAiG;AACjG,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,GAAE,UAAU,GAAG,IAAiB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAKlJ;AAED,wEAAwE;AACxE,wBAAsB,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAiD/G;AAED,eAAO,MAAM,SAAS,EAAE,OAwBvB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,OAgBzB,CAAC"}
@@ -0,0 +1,140 @@
1
+ import { parseArgs } from "node:util";
2
+ import { findProjects, loadConfig, openUrl, readProject, recordRun, scanProjects } from "@dx/core";
3
+ import { ensureDashboard, findDashboard } from "@dx/web/link";
4
+ import { c, info, ok, UsageError, warn } from "../ui.js";
5
+ function resolve(query) {
6
+ if (!query || query === ".") {
7
+ const here = readProject(process.cwd());
8
+ if (here)
9
+ return here;
10
+ if (!query)
11
+ throw new UsageError("Which project? Give its name, or run this inside its folder.");
12
+ throw new UsageError(`${process.cwd()} doesn't look like a project.`);
13
+ }
14
+ const { match, candidates } = findProjects(query, scanProjects(loadConfig()));
15
+ const project = match ?? (candidates.length === 1 ? candidates[0] : undefined);
16
+ if (project)
17
+ return project;
18
+ throw new UsageError(candidates.length ? `Several projects match "${query}": ${candidates.slice(0, 8).map((p) => p.name).join(", ")}` : `No project matches "${query}".`);
19
+ }
20
+ const STATUS = { ready: c.green, starting: c.yellow, failed: c.red, stopped: c.dim };
21
+ /** Prints a stack's services with their addresses. */
22
+ export function printServices(server) {
23
+ const list = server.services ?? [server];
24
+ const width = Math.max(...list.map((s) => (s.service ?? s.project).length));
25
+ for (const s of list) {
26
+ const name = (s.service ?? s.project).padEnd(width);
27
+ const where = s.localUrl ?? s.url;
28
+ const errors = s.errorCount ? c.red(` ${s.errorCount} error(s)`) : "";
29
+ console.log(` ${c.bold(name)} ${(STATUS[s.status] ?? String)(s.status.padEnd(8))} ${where ? c.cyan(where) : c.dim(s.command)}${errors}`);
30
+ }
31
+ if (server.note)
32
+ warn(server.note);
33
+ }
34
+ /** Starts a project (its stack, or its dev command) in the dashboard and waits until it's up. */
35
+ export async function startInDashboard(project, by = "terminal") {
36
+ const client = await ensureDashboard();
37
+ await client.post("/api/dev/start", { dir: project.dir, by });
38
+ const r = await client.post("/api/dev/wait", { dir: project.dir, until: "ready", after: 0, timeoutMs: 120_000 }, 130_000);
39
+ return { client, server: r.server };
40
+ }
41
+ /** Follows the output in this terminal until Ctrl+C, which stops it. */
42
+ export async function follow(client, project, openWhenReady) {
43
+ let after = 0;
44
+ let opened = !openWhenReady;
45
+ const colors = [c.cyan, c.magenta, c.yellow, c.green, c.blue];
46
+ const serviceColor = new Map();
47
+ const tint = (svc) => {
48
+ if (!serviceColor.has(svc))
49
+ serviceColor.set(svc, colors[serviceColor.size % colors.length]);
50
+ return serviceColor.get(svc);
51
+ };
52
+ let interrupted = false;
53
+ const onInterrupt = () => {
54
+ interrupted = true;
55
+ };
56
+ process.on("SIGINT", onInterrupt);
57
+ try {
58
+ for (;;) {
59
+ const r = await client.get(`/api/dev/logs?dir=${encodeURIComponent(project.dir)}&after=${after}`);
60
+ for (const l of r.lines) {
61
+ const prefix = l.service ? tint(l.service)(`${l.service} │ `) : "";
62
+ console.log(prefix + (l.stream === "err" ? c.red(l.text) : l.stream === "dx" ? c.dim(l.text) : l.text));
63
+ after = l.n;
64
+ }
65
+ const server = r.server;
66
+ if (!opened && server?.status === "ready" && (server.localUrl ?? server.url)) {
67
+ opened = true;
68
+ const url = server.localUrl ?? server.url;
69
+ try {
70
+ await openUrl(url);
71
+ ok(`Ready, opened ${c.cyan(url)}`);
72
+ }
73
+ catch {
74
+ ok(`Ready at ${c.cyan(url)}`);
75
+ }
76
+ }
77
+ if (interrupted) {
78
+ info("Stopping…");
79
+ await client.post("/api/dev/stop", { dir: project.dir });
80
+ recordRun("go", true, `${project.name} stopped with Ctrl+C`, "cli", { project: project.name });
81
+ return 0;
82
+ }
83
+ if (!server || server.status === "stopped")
84
+ return 0;
85
+ // A stack keeps going when one service fails; a single dev server is done.
86
+ if (server.status === "failed" && !server.services)
87
+ return 1;
88
+ await new Promise((resolve) => setTimeout(resolve, 500));
89
+ }
90
+ }
91
+ finally {
92
+ process.off("SIGINT", onInterrupt);
93
+ }
94
+ }
95
+ export const upCommand = {
96
+ name: "up",
97
+ summary: "Start a project's whole stack in the background (front end, API, databases…)",
98
+ usage: [
99
+ "dx up the project in this folder",
100
+ "dx up shop a project by name",
101
+ "dx up shop --open and open it in the browser",
102
+ "",
103
+ "Services start in order: databases, then back ends, then front ends. They run in the dx dashboard,",
104
+ "so they keep running after this terminal closes. dx down stops them; dx logs shop -f follows them.",
105
+ ].join("\n"),
106
+ async run(argv) {
107
+ const { values, positionals } = parseArgs({ args: argv, allowPositionals: true, options: { open: { type: "boolean" } } });
108
+ const project = resolve(positionals[0]);
109
+ info(`Starting ${c.bold(project.name)}…`);
110
+ const { server } = await startInDashboard(project);
111
+ printServices(server);
112
+ const url = server.localUrl ?? server.url;
113
+ if (server.status === "ready")
114
+ ok(`${project.name} is up${url ? ` at ${c.cyan(url)}` : ""}`);
115
+ else
116
+ warn(`${project.name} is ${server.status}. dx logs ${project.name} shows why.`);
117
+ if (values.open && url)
118
+ await openUrl(url).catch(() => undefined);
119
+ recordRun("up", server.status === "ready", project.name, "cli", { project: project.name });
120
+ return server.status === "failed" ? 1 : 0;
121
+ },
122
+ };
123
+ export const downCommand = {
124
+ name: "down",
125
+ summary: "Stop a project's stack or dev server running in the dashboard",
126
+ usage: ["dx down the project in this folder", "dx down shop a project by name"].join("\n"),
127
+ async run(argv) {
128
+ const { positionals } = parseArgs({ args: argv, allowPositionals: true });
129
+ const project = resolve(positionals[0]);
130
+ const client = await findDashboard();
131
+ const server = client && (await client.post("/api/dev/stop", { dir: project.dir }));
132
+ if (!server) {
133
+ info(`${project.name} isn't running in the dashboard.`);
134
+ return;
135
+ }
136
+ ok(`Stopped ${project.name}`);
137
+ recordRun("down", true, project.name, "cli", { project: project.name });
138
+ },
139
+ };
140
+ //# sourceMappingURL=stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/commands/stack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "../command.js";
2
+ export declare const summaryCommand: Command;
3
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/commands/summary.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAG7C,eAAO,MAAM,cAAc,EAAE,OAiE5B,CAAC"}