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,386 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { stripBom } from "../config.js";
4
+ import { detectPackageManager, guessDevUrl, readProject } from "./projects.js";
5
+ const RUNNER = /\b(turbo|nx|concurrently|npm-run-all|run-p|lerna)\b|pnpm\b[^&|]*\s(-r|--recursive|--parallel|--filter)\b|\b(npm|yarn)\b[^&|]*\s--(workspaces|ws)\b|\byarn workspaces foreach\b/;
6
+ const DATA_IMAGES = /\b(postgres|postgis|mysql|mariadb|mongo|redis|valkey|keydb|rabbitmq|kafka|zookeeper|elasticsearch|opensearch|minio|mailhog|mailpit|localstack|memcached|nats|clickhouse|meilisearch|typesense|azurite|dynamodb|neo4j|cassandra|couchdb|influxdb|qdrant|weaviate|supabase|surrealdb|adminer|pgadmin)\b/i;
7
+ export function detectStack(project) {
8
+ const dir = project.dir;
9
+ const devrc = readJson(path.join(dir, ".devrc.json"));
10
+ const compose = readCompose(dir);
11
+ const infra = compose ? dockerServices(compose.file, compose.services) : [];
12
+ let stack;
13
+ if (devrc?.stack && typeof devrc.stack === "object") {
14
+ stack = fromDevrc(project, devrc.stack, compose);
15
+ }
16
+ else {
17
+ stack = fromProcfile(dir) ?? fromRunner(project) ?? fromDevScripts(project) ?? fromWorkspaces(project);
18
+ if (stack && infra.length) {
19
+ stack.services.unshift(...infra);
20
+ stack.composeFile = compose?.file;
21
+ }
22
+ else if (!stack && infra.length && project.devCommand) {
23
+ // One app plus its database: still a stack.
24
+ stack = {
25
+ source: "compose",
26
+ dir,
27
+ composeFile: compose?.file,
28
+ services: [...infra, { name: "app", role: "frontend", kind: "process", dir, command: project.devCommand, url: project.url, dependsOn: [] }],
29
+ };
30
+ }
31
+ }
32
+ if (!stack)
33
+ return undefined;
34
+ const appServices = stack.services.filter((s) => s.kind === "process").length;
35
+ if (stack.source !== "devrc" && stack.services.length < 2 && !(stack.runner && appServices >= 2))
36
+ return undefined;
37
+ orderDependencies(stack);
38
+ return stack;
39
+ }
40
+ // ------------------------------------------------------------ sources
41
+ function fromDevrc(project, spec, compose) {
42
+ const services = [];
43
+ for (const [rawName, s] of Object.entries(spec)) {
44
+ if (!s || typeof s !== "object")
45
+ continue;
46
+ const name = serviceName(rawName);
47
+ if (s.docker) {
48
+ const c = compose?.services.find((x) => x.name === s.docker);
49
+ services.push({
50
+ name,
51
+ role: s.role ?? "data",
52
+ kind: "docker",
53
+ dir: project.dir,
54
+ command: `docker compose up -d ${s.docker}`,
55
+ composeService: s.docker,
56
+ hostPort: c?.hostPort,
57
+ url: c?.hostPort ? `http://localhost:${c.hostPort}` : undefined,
58
+ dependsOn: (s.dependsOn ?? []).map(serviceName),
59
+ });
60
+ continue;
61
+ }
62
+ let dir = s.dir ? path.resolve(project.dir, s.dir) : project.dir;
63
+ let command = s.dev;
64
+ let url = s.url;
65
+ if (s.project) {
66
+ const other = readProject(path.resolve(project.dir, s.project));
67
+ if (other) {
68
+ dir = other.dir;
69
+ command ??= other.devCommand;
70
+ url ??= other.url;
71
+ }
72
+ }
73
+ if (!command)
74
+ continue;
75
+ services.push({ name, role: s.role ?? roleOf(name, command), kind: "process", dir, command, url, dependsOn: (s.dependsOn ?? []).map(serviceName) });
76
+ }
77
+ if (!services.length)
78
+ return undefined;
79
+ return { source: "devrc", dir: project.dir, services, composeFile: compose?.file };
80
+ }
81
+ /** Procfile lines: `web: bin/rails server -p $PORT`. Ports are handed out like foreman does: 5000, 5100, … */
82
+ function fromProcfile(dir) {
83
+ const file = ["Procfile.dev", "Procfile"].map((f) => path.join(dir, f)).find((f) => fs.existsSync(f));
84
+ if (!file)
85
+ return undefined;
86
+ const services = [];
87
+ for (const line of fs.readFileSync(file, "utf8").split(/\r?\n/)) {
88
+ const m = /^([A-Za-z0-9_-]+):\s*(.+)$/.exec(line.trim());
89
+ if (!m || line.trim().startsWith("#"))
90
+ continue;
91
+ const port = 5000 + services.length * 100;
92
+ const name = serviceName(m[1]);
93
+ const usesPort = /\$\{?PORT\b/.test(m[2]);
94
+ services.push({
95
+ name,
96
+ role: roleOf(name, m[2]),
97
+ kind: "process",
98
+ dir,
99
+ command: m[2],
100
+ env: { PORT: String(port) },
101
+ url: usesPort ? `http://localhost:${port}` : guessDevUrl(m[2]),
102
+ dependsOn: [],
103
+ });
104
+ }
105
+ return services.length >= 2 ? { source: "procfile", dir, services } : undefined;
106
+ }
107
+ /** A root dev script that runs every workspace at once: keep it, and split its output by service. */
108
+ function fromRunner(project) {
109
+ const pkg = readJson(path.join(project.dir, "package.json"));
110
+ const dev = pkg?.scripts?.dev;
111
+ if (!dev || !RUNNER.test(dev))
112
+ return undefined;
113
+ const pm = detectPackageManager(project.dir, pkg);
114
+ const workspaces = workspacePackages(project.dir, pkg).filter((w) => w.scripts.dev);
115
+ const scripts = Object.entries(pkg?.scripts ?? {}).filter(([k]) => /^dev:./.test(k));
116
+ const names = workspaces.length > 0
117
+ ? workspaces.map((w) => ({ name: serviceName(w.folder), command: w.scripts.dev, dir: w.dir, label: w.name }))
118
+ : scripts.map(([k, v]) => ({ name: serviceName(k.slice(4)), command: v, dir: project.dir, label: k }));
119
+ return {
120
+ source: "runner",
121
+ dir: project.dir,
122
+ runner: { command: `${pm} run dev` },
123
+ services: names.map((n) => ({
124
+ name: n.name,
125
+ role: roleOf(n.name, n.command),
126
+ kind: "process",
127
+ dir: n.dir,
128
+ command: n.command,
129
+ url: guessDevUrl(n.command),
130
+ dependsOn: [],
131
+ // The runner prints the package name or script name; remember it to match output prefixes.
132
+ env: { DX_LABEL: n.label },
133
+ })),
134
+ };
135
+ }
136
+ /** Root scripts dev:web, dev:api, … run as separate services. */
137
+ function fromDevScripts(project) {
138
+ const pkg = readJson(path.join(project.dir, "package.json"));
139
+ const scripts = Object.entries(pkg?.scripts ?? {}).filter(([k]) => /^dev:[\w-]+$/.test(k));
140
+ if (scripts.length < 2)
141
+ return undefined;
142
+ const pm = detectPackageManager(project.dir, pkg);
143
+ return {
144
+ source: "scripts",
145
+ dir: project.dir,
146
+ services: scripts.map(([k, v]) => {
147
+ const name = serviceName(k.slice(4));
148
+ return { name, role: roleOf(name, v), kind: "process", dir: project.dir, command: `${pm} run ${k}`, url: guessDevUrl(v), dependsOn: [] };
149
+ }),
150
+ };
151
+ }
152
+ function fromWorkspaces(project) {
153
+ const pkg = readJson(path.join(project.dir, "package.json"));
154
+ const pm = detectPackageManager(project.dir, pkg);
155
+ const services = workspacePackages(project.dir, pkg)
156
+ .filter((w) => w.scripts.dev)
157
+ .map((w) => {
158
+ const name = serviceName(w.folder);
159
+ return { name, role: roleOf(name, w.scripts.dev), kind: "process", dir: w.dir, command: `${pm} run dev`, url: guessDevUrl(w.scripts.dev), dependsOn: [] };
160
+ });
161
+ return services.length >= 2 ? { source: "workspaces", dir: project.dir, services } : undefined;
162
+ }
163
+ function dockerServices(file, services) {
164
+ return services
165
+ .filter((s) => !s.build && s.image && DATA_IMAGES.test(s.image))
166
+ .map((s) => ({
167
+ name: serviceName(s.name),
168
+ role: "data",
169
+ kind: "docker",
170
+ dir: path.dirname(file),
171
+ command: `docker compose up -d ${s.name}`,
172
+ composeService: s.name,
173
+ hostPort: s.hostPort,
174
+ url: s.hostPort ? `http://localhost:${s.hostPort}` : undefined,
175
+ dependsOn: [],
176
+ }));
177
+ }
178
+ // ------------------------------------------------------------ order
179
+ const TIER = { data: 0, backend: 1, other: 2, frontend: 3 };
180
+ /** Guesses what a service is from its name and command. */
181
+ export function roleOf(name, command = "") {
182
+ const n = name.toLowerCase();
183
+ if (/^(db|database|postgres|mysql|redis|mongo|cache|queue)$/.test(n))
184
+ return "data";
185
+ if (/(^|[-_])(api|server|backend|gateway|graphql|functions?|worker|jobs?|queue)([-_]|$)/.test(n))
186
+ return "backend";
187
+ if (/(^|[-_])(web|app|client|frontend|site|ui|admin|dashboard|www|docs|storybook|landing|portal)([-_]|$)/.test(n))
188
+ return "frontend";
189
+ if (/\b(vite|next|nuxt|astro|remix|svelte-kit|ng serve|gatsby|expo|webpack)\b/.test(command))
190
+ return "frontend";
191
+ if (/\b(nodemon|tsx watch|ts-node|uvicorn|gunicorn|flask|rails s|go run|cargo run|nest start|fastify|express)\b/.test(command))
192
+ return "backend";
193
+ return "other";
194
+ }
195
+ /**
196
+ * Turns roles into dependencies, when the stack didn't name its own: data services first, then
197
+ * back ends, then anything else, then front ends. Services in one tier start together.
198
+ */
199
+ function orderDependencies(stack) {
200
+ if (stack.services.some((s) => s.dependsOn.length))
201
+ return;
202
+ for (const s of stack.services) {
203
+ const below = stack.services.filter((o) => TIER[o.role] < TIER[s.role]);
204
+ const nearest = Math.max(-1, ...below.map((o) => TIER[o.role]));
205
+ s.dependsOn = below.filter((o) => TIER[o.role] === nearest).map((o) => o.name);
206
+ }
207
+ }
208
+ /** Groups services into the order they start in: each group only after the one before is ready. */
209
+ export function startOrder(stack) {
210
+ const done = new Set();
211
+ const names = new Set(stack.services.map((s) => s.name));
212
+ const left = [...stack.services];
213
+ const waves = [];
214
+ while (left.length) {
215
+ const wave = left.filter((s) => s.dependsOn.every((d) => done.has(d) || !names.has(d)));
216
+ // A dependency loop: start the rest together rather than never.
217
+ const now = wave.length ? wave : [...left];
218
+ waves.push(now);
219
+ for (const s of now) {
220
+ done.add(s.name);
221
+ left.splice(left.indexOf(s), 1);
222
+ }
223
+ }
224
+ return waves;
225
+ }
226
+ /** The service a browser should open: the first front end, else the first app service. */
227
+ export function mainService(stack) {
228
+ return stack.services.find((s) => s.role === "frontend" && s.kind === "process") ?? stack.services.find((s) => s.kind === "process");
229
+ }
230
+ /** "@acme/Web App" → "web-app" */
231
+ export function serviceName(raw) {
232
+ return (raw
233
+ .replace(/^@[^/]+\//, "")
234
+ .toLowerCase()
235
+ .replace(/[^a-z0-9]+/g, "-")
236
+ .replace(/^-+|-+$/g, "") || "service");
237
+ }
238
+ /**
239
+ * Which service a line from a runner belongs to, and the line without its prefix.
240
+ * turbo: "web:dev: ready" or "@acme/web:dev: ready"; concurrently and npm-run-all: "[api] listening".
241
+ */
242
+ export function splitRunnerLine(text, services) {
243
+ const m = /^(?:\x1b\[[0-9;]*m)*([@\w./-]+):[\w:-]+: ?(.*)$/.exec(text) ?? /^(?:\x1b\[[0-9;]*m)*\[([^\]]+)\] ?(.*)$/.exec(text);
244
+ if (!m)
245
+ return { text };
246
+ const label = m[1];
247
+ const service = services.find((s) => s.env?.DX_LABEL === label || s.name === serviceName(label) || s.env?.DX_LABEL === `dev:${label}`)?.name ?? serviceName(label);
248
+ return { service, text: m[2] };
249
+ }
250
+ /**
251
+ * Writes (or with no services, removes) the "stack" in a project's .devrc.json, keeping the rest
252
+ * of the file. This is how an AI agent sets up a stack dx can't guess, such as two repositories.
253
+ */
254
+ export function saveStackSpec(dir, spec) {
255
+ const file = path.join(dir, ".devrc.json");
256
+ const current = readJson(file) ?? {};
257
+ if (spec && Object.keys(spec).length)
258
+ current.stack = spec;
259
+ else
260
+ delete current.stack;
261
+ fs.writeFileSync(file, JSON.stringify(current, null, 2) + "\n", "utf8");
262
+ return file;
263
+ }
264
+ /** The packages listed in package.json "workspaces" or pnpm-workspace.yaml. Patterns: "apps/*", "packages/**", or a folder. */
265
+ export function workspacePackages(dir, pkg = readJson(path.join(dir, "package.json"))) {
266
+ let patterns = [];
267
+ const ws = pkg?.workspaces;
268
+ if (Array.isArray(ws))
269
+ patterns = ws;
270
+ else if (ws && Array.isArray(ws.packages))
271
+ patterns = ws.packages;
272
+ const pnpm = path.join(dir, "pnpm-workspace.yaml");
273
+ if (!patterns.length && fs.existsSync(pnpm)) {
274
+ let inPackages = false;
275
+ for (const line of fs.readFileSync(pnpm, "utf8").split(/\r?\n/)) {
276
+ if (/^packages:\s*$/.test(line))
277
+ inPackages = true;
278
+ else if (/^\S/.test(line))
279
+ inPackages = false;
280
+ else if (inPackages) {
281
+ const m = /^\s*-\s*['"]?([^'"#]+?)['"]?\s*(#.*)?$/.exec(line);
282
+ if (m)
283
+ patterns.push(m[1]);
284
+ }
285
+ }
286
+ }
287
+ const out = [];
288
+ const seen = new Set();
289
+ for (const pattern of patterns) {
290
+ if (pattern.startsWith("!"))
291
+ continue;
292
+ const base = pattern.replace(/\/\*\*?$/, "");
293
+ const dirs = /\/\*\*?$/.test(pattern) ? subdirs(path.join(dir, base)) : [path.join(dir, pattern)];
294
+ for (const d of dirs) {
295
+ const p = readJson(path.join(d, "package.json"));
296
+ if (!p || seen.has(d))
297
+ continue;
298
+ seen.add(d);
299
+ out.push({ dir: d, folder: path.basename(d), name: p.name ?? path.basename(d), scripts: p.scripts ?? {} });
300
+ }
301
+ }
302
+ return out;
303
+ }
304
+ /**
305
+ * Reads the services of a compose file: just enough YAML for names, image, build and the first
306
+ * published port. Anything it can't read is skipped, never guessed.
307
+ */
308
+ export function readCompose(dir) {
309
+ const file = ["compose.yaml", "compose.yml", "docker-compose.yml", "docker-compose.yaml"].map((f) => path.join(dir, f)).find((f) => fs.existsSync(f));
310
+ if (!file)
311
+ return undefined;
312
+ const lines = fs.readFileSync(file, "utf8").split(/\r?\n/);
313
+ const services = [];
314
+ let inServices = false;
315
+ let serviceIndent = -1;
316
+ let current;
317
+ let inPorts = false;
318
+ for (const raw of lines) {
319
+ const line = raw.replace(/\s+#.*$/, "");
320
+ if (!line.trim() || line.trim().startsWith("#"))
321
+ continue;
322
+ const indent = line.length - line.trimStart().length;
323
+ if (indent === 0) {
324
+ inServices = /^services:\s*$/.test(line);
325
+ current = undefined;
326
+ serviceIndent = -1;
327
+ continue;
328
+ }
329
+ if (!inServices)
330
+ continue;
331
+ if (serviceIndent === -1)
332
+ serviceIndent = indent;
333
+ if (indent === serviceIndent) {
334
+ const m = /^\s*([\w.-]+):\s*$/.exec(line);
335
+ current = m ? { name: m[1] } : undefined;
336
+ if (current)
337
+ services.push(current);
338
+ inPorts = false;
339
+ continue;
340
+ }
341
+ if (!current)
342
+ continue;
343
+ const kv = /^\s*([\w-]+):\s*(.*)$/.exec(line);
344
+ if (kv && indent === serviceIndent + 2) {
345
+ inPorts = kv[1] === "ports";
346
+ if (kv[1] === "image")
347
+ current.image = kv[2].replace(/^['"]|['"]$/g, "");
348
+ if (kv[1] === "build")
349
+ current.build = true;
350
+ if (kv[1] === "ports" && kv[2].startsWith("["))
351
+ current.hostPort ??= hostPortOf(kv[2].slice(1).split(",")[0]);
352
+ continue;
353
+ }
354
+ if (inPorts && /^\s*-\s*/.test(line))
355
+ current.hostPort ??= hostPortOf(line.replace(/^\s*-\s*/, ""));
356
+ }
357
+ return { file, services };
358
+ }
359
+ /** "5432:5432", "127.0.0.1:6379:6379", "8080:80/tcp" → the host port. */
360
+ function hostPortOf(spec) {
361
+ const parts = spec.trim().replace(/^['"]|['"]$/g, "").replace(/\/\w+$/, "").split(":");
362
+ if (parts.length < 2)
363
+ return undefined;
364
+ const n = Number(parts[parts.length - 2]);
365
+ return Number.isInteger(n) && n > 0 ? n : undefined;
366
+ }
367
+ function subdirs(dir) {
368
+ try {
369
+ return fs
370
+ .readdirSync(dir, { withFileTypes: true })
371
+ .filter((e) => e.isDirectory() && !e.name.startsWith(".") && e.name !== "node_modules")
372
+ .map((e) => path.join(dir, e.name));
373
+ }
374
+ catch {
375
+ return [];
376
+ }
377
+ }
378
+ function readJson(file) {
379
+ try {
380
+ return JSON.parse(stripBom(fs.readFileSync(file, "utf8")));
381
+ }
382
+ catch {
383
+ return undefined;
384
+ }
385
+ }
386
+ //# sourceMappingURL=stacks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stacks.js","sourceRoot":"","sources":["../../src/tools/stacks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { type DxConfig } from "../config.js";
2
+ import { type RunRecord } from "../runs.js";
3
+ import { type GithubActivity } from "./github.js";
4
+ import { type JournalEntry } from "./journal.js";
5
+ /**
6
+ * The weekly summary: your git commits across every project plus your work journal, for the last
7
+ * few days, as markdown you can paste into a standup or a weekly update.
8
+ */
9
+ export interface Commit {
10
+ hash: string;
11
+ date: string;
12
+ time: string;
13
+ subject: string;
14
+ }
15
+ export interface ProjectActivity {
16
+ project: string;
17
+ dir: string;
18
+ commits: Commit[];
19
+ }
20
+ export interface WorkSummary {
21
+ /** First day included, YYYY-MM-DD. */
22
+ from: string;
23
+ /** Last day included (today), YYYY-MM-DD. */
24
+ to: string;
25
+ days: number;
26
+ /** Whose commits were counted, e.g. "octocat <me@example.com>", or "everyone". */
27
+ author: string;
28
+ /** Only projects with at least one commit, most commits first. */
29
+ projects: ProjectActivity[];
30
+ journal: JournalEntry[];
31
+ /** Repos git couldn't read; they're left out of the summary rather than failing it. */
32
+ skipped: Array<{
33
+ project: string;
34
+ reason: string;
35
+ }>;
36
+ /** Where the days went: per project, the days with commits or a `dx go`, most days first. */
37
+ time: ProjectTime[];
38
+ /** Repos active in the window that have changes not committed yet. */
39
+ uncommitted: Array<{
40
+ project: string;
41
+ files: number;
42
+ }>;
43
+ /** Pull requests from GitHub, when asked for. `error` says why they're missing. */
44
+ github?: GithubActivity | {
45
+ error: string;
46
+ };
47
+ }
48
+ export interface ProjectTime {
49
+ project: string;
50
+ /** Distinct days with a commit or a `dx go` for this project. */
51
+ days: number;
52
+ commits: number;
53
+ /** How many times it was opened with `dx go` (CLI, Raycast or Claude). */
54
+ opens: number;
55
+ /** How long its dev server ran under `dx go`, in ms. Only counted when dx ran it in the same terminal. */
56
+ devMs: number;
57
+ }
58
+ export interface SummaryOptions {
59
+ /** How many days back, today included (default 7). */
60
+ days?: number;
61
+ now?: Date;
62
+ config?: DxConfig;
63
+ /** Count everyone's commits, not only yours. */
64
+ allAuthors?: boolean;
65
+ /** Also fetch merged and reviewed pull requests from GitHub (needs the internet). */
66
+ github?: boolean;
67
+ }
68
+ export declare function buildSummary(options?: SummaryOptions): Promise<WorkSummary>;
69
+ /**
70
+ * Combines commit days with `dx go` runs from the run log. Old run records have no project field,
71
+ * so for those the project is read from the start of the detail text.
72
+ */
73
+ export declare function timePerProject(projects: ProjectActivity[], runs: RunRecord[], start: Date, knownNames: string[]): ProjectTime[];
74
+ /** Parses `git log --format=%H<US>%aI<US>%s` output. Newest first, like git prints it. */
75
+ export declare function parseGitLog(stdout: string): Commit[];
76
+ /** "2026-11-02" → "Mon 2 Nov" */
77
+ export declare function dayLabel(date: string): string;
78
+ /** "27 Oct – 2 Nov 2026", or "Mon 2 Nov 2026" for one day. */
79
+ export declare function rangeLabel(from: string, to: string): string;
80
+ /** The summary as markdown, ready to paste. */
81
+ export declare function formatSummary(s: WorkSummary): string;
82
+ /** 4_500_000 → "1h 15m" */
83
+ export declare function formatDuration(ms: number): string;
84
+ /** Saves the markdown to ~/.dx/summaries/<last day>.md and returns the path. */
85
+ export declare function saveSummary(markdown: string, summary: WorkSummary): string;
86
+ export declare function summariesDir(): string;
87
+ //# sourceMappingURL=summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/tools/summary.ts"],"names":[],"mappings":"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"}