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,331 @@
1
+ import { execFile } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import { promisify } from "node:util";
4
+ import { dxPath, ensureDxHome, loadConfig } from "../config.js";
5
+ import { readRuns } from "../runs.js";
6
+ import { fetchGithubActivity, githubToken, mostCommonOwner } from "./github.js";
7
+ import { localDate, localTime, readJournal } from "./journal.js";
8
+ import { scanProjects } from "./projects.js";
9
+ const run = promisify(execFile);
10
+ const FIELD = "\x1f";
11
+ const MAX_PARALLEL = 6;
12
+ export async function buildSummary(options = {}) {
13
+ const days = Math.max(1, Math.floor(options.days ?? 7));
14
+ const now = options.now ?? new Date();
15
+ const start = new Date(now.getFullYear(), now.getMonth(), now.getDate() - (days - 1));
16
+ const config = options.config ?? loadConfig();
17
+ const all = scanProjects(config);
18
+ const repos = all.filter((p) => p.hasGit);
19
+ const projects = [];
20
+ const skipped = [];
21
+ const uncommitted = [];
22
+ const remotes = [];
23
+ let gitMissing = false;
24
+ const authors = new Set();
25
+ await inBatches(repos, MAX_PARALLEL, async (project) => {
26
+ try {
27
+ const who = options.allAuthors ? [] : await gitIdentity(project.dir);
28
+ who.forEach((w) => authors.add(w));
29
+ const commits = await commitsSince(project, start, who);
30
+ if (commits.length)
31
+ projects.push({ project: project.name, dir: project.dir, commits });
32
+ if (commits.length || project.lastActive >= start.getTime()) {
33
+ const files = await changedFiles(project.dir);
34
+ if (files)
35
+ uncommitted.push({ project: project.name, files });
36
+ }
37
+ if (options.github && !config.githubUser) {
38
+ const url = await gitOutput(project.dir, ["remote", "get-url", "origin"]);
39
+ if (url)
40
+ remotes.push(url);
41
+ }
42
+ }
43
+ catch (err) {
44
+ const e = err;
45
+ if (e.code === "ENOENT")
46
+ gitMissing = true;
47
+ skipped.push({ project: project.name, reason: firstLine(e.stderr) || e.message });
48
+ }
49
+ });
50
+ if (gitMissing && projects.length === 0) {
51
+ throw new Error("Git isn't installed or isn't on your PATH, so there are no commits to summarize.");
52
+ }
53
+ projects.sort((a, b) => b.commits.length - a.commits.length || a.project.localeCompare(b.project));
54
+ skipped.sort((a, b) => a.project.localeCompare(b.project));
55
+ uncommitted.sort((a, b) => b.files - a.files || a.project.localeCompare(b.project));
56
+ let github;
57
+ if (options.github) {
58
+ const user = config.githubUser || mostCommonOwner(remotes);
59
+ if (!user) {
60
+ github = { error: "no GitHub username: set it with dx config github <username>" };
61
+ }
62
+ else {
63
+ try {
64
+ github = await fetchGithubActivity(user, localDate(start), await githubToken());
65
+ }
66
+ catch (err) {
67
+ github = { error: err.message };
68
+ }
69
+ }
70
+ }
71
+ return {
72
+ from: localDate(start),
73
+ to: localDate(now),
74
+ days,
75
+ author: options.allAuthors ? "everyone" : [...authors].join(", ") || "you",
76
+ projects,
77
+ journal: readJournal({ sinceDays: days, now }),
78
+ skipped,
79
+ time: timePerProject(projects, readRuns(0), start, all.map((p) => p.name)),
80
+ uncommitted,
81
+ github,
82
+ };
83
+ }
84
+ /**
85
+ * Combines commit days with `dx go` runs from the run log. Old run records have no project field,
86
+ * so for those the project is read from the start of the detail text.
87
+ */
88
+ export function timePerProject(projects, runs, start, knownNames) {
89
+ const byName = new Map();
90
+ const get = (name) => {
91
+ let t = byName.get(name);
92
+ if (!t)
93
+ byName.set(name, (t = { project: name, days: 0, commits: 0, opens: 0, devMs: 0, dayset: new Set() }));
94
+ return t;
95
+ };
96
+ for (const p of projects) {
97
+ const t = get(p.project);
98
+ t.commits += p.commits.length;
99
+ p.commits.forEach((c) => t.dayset.add(c.date));
100
+ }
101
+ const names = [...knownNames].sort((a, b) => b.length - a.length);
102
+ for (const r of runs) {
103
+ if (r.tool !== "go")
104
+ continue;
105
+ const at = new Date(r.at);
106
+ if (Number.isNaN(at.getTime()) || at < start)
107
+ continue;
108
+ const name = r.project ?? names.find((n) => r.detail === n || r.detail?.startsWith(`${n} `) || r.detail?.startsWith(`${n}:`));
109
+ if (!name)
110
+ continue;
111
+ const t = get(name);
112
+ // Each dx go writes one record (a foreground run writes it when the server stops), so one record is one open.
113
+ t.opens++;
114
+ t.devMs += r.ms ?? 0;
115
+ t.dayset.add(localDate(at));
116
+ }
117
+ return [...byName.values()]
118
+ .map(({ dayset, ...t }) => ({ ...t, days: dayset.size }))
119
+ .sort((a, b) => b.days - a.days || b.commits - a.commits || a.project.localeCompare(b.project));
120
+ }
121
+ async function changedFiles(dir) {
122
+ const out = await gitOutput(dir, ["status", "--porcelain"]);
123
+ return out ? out.split(/\r?\n/).filter(Boolean).length : 0;
124
+ }
125
+ async function gitOutput(dir, args) {
126
+ try {
127
+ const { stdout } = await run("git", ["-C", dir, ...args], { windowsHide: true, maxBuffer: 16 * 1024 * 1024 });
128
+ return stdout.trim();
129
+ }
130
+ catch {
131
+ return "";
132
+ }
133
+ }
134
+ /** Your name and email as git knows them for this repo (a repo can override the global ones). */
135
+ async function gitIdentity(dir) {
136
+ const read = async (key) => {
137
+ try {
138
+ const { stdout } = await run("git", ["-C", dir, "config", key], { windowsHide: true });
139
+ return stdout.trim();
140
+ }
141
+ catch {
142
+ return "";
143
+ }
144
+ };
145
+ const [name, email] = await Promise.all([read("user.name"), read("user.email")]);
146
+ const who = [name, email].filter(Boolean);
147
+ if (who.length === 0)
148
+ throw new Error("git has no user.name or user.email set, so your commits can't be told apart");
149
+ return who;
150
+ }
151
+ async function commitsSince(project, start, authors) {
152
+ const args = [
153
+ "-C",
154
+ project.dir,
155
+ "log",
156
+ "--all",
157
+ "--no-merges",
158
+ `--since=${start.toISOString()}`,
159
+ `--format=%H${FIELD}%aI${FIELD}%s`,
160
+ ];
161
+ // Several --author patterns match any of them: commits made under your name or your email.
162
+ if (authors.length)
163
+ args.push("--fixed-strings", ...authors.map((a) => `--author=${a}`));
164
+ try {
165
+ const { stdout } = await run("git", args, { windowsHide: true, maxBuffer: 16 * 1024 * 1024 });
166
+ return parseGitLog(stdout);
167
+ }
168
+ catch (err) {
169
+ // A repo with no commits yet isn't an error, it just has nothing to report.
170
+ if (/does not have any commits|unknown revision/i.test(String(err.stderr)))
171
+ return [];
172
+ throw err;
173
+ }
174
+ }
175
+ /** Parses `git log --format=%H<US>%aI<US>%s` output. Newest first, like git prints it. */
176
+ export function parseGitLog(stdout) {
177
+ const commits = [];
178
+ for (const line of stdout.split(/\r?\n/)) {
179
+ const [hash, iso, ...rest] = line.split(FIELD);
180
+ if (!hash || !iso)
181
+ continue;
182
+ const at = new Date(iso);
183
+ if (Number.isNaN(at.getTime()))
184
+ continue;
185
+ commits.push({ hash, date: localDate(at), time: localTime(at), subject: rest.join(FIELD).trim() });
186
+ }
187
+ return commits;
188
+ }
189
+ const WEEKDAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
190
+ const MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
191
+ const COMMITS_PER_PROJECT = 12;
192
+ /** "2026-11-02" → "Mon 2 Nov" */
193
+ export function dayLabel(date) {
194
+ const [y, m, d] = date.split("-").map(Number);
195
+ const at = new Date(y, m - 1, d);
196
+ return `${WEEKDAYS[at.getDay()]} ${d} ${MONTHS[m - 1]}`;
197
+ }
198
+ /** "27 Oct – 2 Nov 2026", or "Mon 2 Nov 2026" for one day. */
199
+ export function rangeLabel(from, to) {
200
+ const year = to.slice(0, 4);
201
+ if (from === to)
202
+ return `${dayLabel(to)} ${year}`;
203
+ const short = (date) => dayLabel(date).split(" ").slice(1).join(" ");
204
+ const fromLabel = from.slice(0, 4) === year ? short(from) : `${short(from)} ${from.slice(0, 4)}`;
205
+ return `${fromLabel} – ${short(to)} ${year}`;
206
+ }
207
+ /** The summary as markdown, ready to paste. */
208
+ export function formatSummary(s) {
209
+ const commitCount = s.projects.reduce((n, p) => n + p.commits.length, 0);
210
+ const out = [`# Work summary · ${rangeLabel(s.from, s.to)}`, ""];
211
+ const gh = s.github && "user" in s.github ? s.github : undefined;
212
+ const prCount = gh ? gh.merged.length + gh.reviewed.length : 0;
213
+ const totals = [
214
+ plural(commitCount, "commit") + (s.projects.length ? ` in ${plural(s.projects.length, "project")}` : ""),
215
+ ...(gh ? [`${gh.merged.length} PR(s) merged`, `${gh.reviewed.length} reviewed`] : []),
216
+ plural(s.journal.length, "journal entry", "journal entries"),
217
+ ];
218
+ out.push(`**${totals.join(" · ")}**`, "");
219
+ if (commitCount === 0 && s.journal.length === 0 && prCount === 0) {
220
+ out.push(`Nothing to report: no commits and no journal entries in the last ${plural(s.days, "day")}.`, "");
221
+ out.push(...uncommittedSection(s), ...skippedNote(s));
222
+ return out.join("\n").trimEnd() + "\n";
223
+ }
224
+ if (s.journal.length) {
225
+ out.push("## Journal", "");
226
+ let day = "";
227
+ for (const e of s.journal) {
228
+ if (e.date !== day) {
229
+ if (day)
230
+ out.push("");
231
+ out.push(`**${dayLabel(e.date)}**`);
232
+ day = e.date;
233
+ }
234
+ out.push(`- ${e.text}`);
235
+ }
236
+ out.push("");
237
+ }
238
+ if (gh && prCount) {
239
+ out.push("## Pull requests", "");
240
+ const line = (pr) => `- ${pr.title} ([${pr.repo}#${pr.number}](${pr.url}))${pr.date ? ` · ${dayLabel(pr.date).split(" ")[0]}` : ""}`;
241
+ if (gh.merged.length)
242
+ out.push("**Merged**", ...gh.merged.map(line), "");
243
+ if (gh.reviewed.length)
244
+ out.push("**Reviewed**", ...gh.reviewed.map(line), "");
245
+ }
246
+ if (s.projects.length) {
247
+ out.push("## Commits", "");
248
+ for (const p of s.projects) {
249
+ out.push(`### ${p.project} (${p.commits.length})`, "");
250
+ // Oldest first reads like a story of the week; identical subjects (amends, retries) once, with a count.
251
+ const counts = new Map();
252
+ const unique = [...p.commits].reverse().filter((c) => {
253
+ const key = c.subject.toLowerCase();
254
+ counts.set(key, (counts.get(key) ?? 0) + 1);
255
+ return counts.get(key) === 1;
256
+ });
257
+ for (const c of unique.slice(0, COMMITS_PER_PROJECT)) {
258
+ const times = counts.get(c.subject.toLowerCase()) ?? 1;
259
+ out.push(`- ${c.subject || "(no message)"}${times > 1 ? ` ×${times}` : ""} · ${dayLabel(c.date).split(" ")[0]}`);
260
+ }
261
+ if (unique.length > COMMITS_PER_PROJECT)
262
+ out.push(`- …and ${unique.length - COMMITS_PER_PROJECT} more`);
263
+ out.push("");
264
+ }
265
+ }
266
+ if (s.time.length) {
267
+ out.push("## Where the time went", "");
268
+ for (const t of s.time) {
269
+ const parts = [plural(t.days, "day")];
270
+ if (t.commits)
271
+ parts.push(plural(t.commits, "commit"));
272
+ if (t.opens)
273
+ parts.push(`opened ${t.opens}×`);
274
+ if (t.devMs >= 60_000)
275
+ parts.push(`${formatDuration(t.devMs)} dev server`);
276
+ out.push(`- ${t.project}: ${parts.join(" · ")}`);
277
+ }
278
+ out.push("");
279
+ }
280
+ out.push(...uncommittedSection(s), ...skippedNote(s));
281
+ return out.join("\n").trimEnd() + "\n";
282
+ }
283
+ function uncommittedSection(s) {
284
+ if (!s.uncommitted.length)
285
+ return [];
286
+ return ["## Not committed yet", "", ...s.uncommitted.map((u) => `- ${u.project}: ${plural(u.files, "changed file")}`), ""];
287
+ }
288
+ function skippedNote(s) {
289
+ const notes = [];
290
+ if (s.skipped.length)
291
+ notes.push(`_Couldn't read ${s.skipped.map((x) => x.project).join(", ")}; run \`dx summary\` in a terminal for details._`);
292
+ if (s.github && "error" in s.github)
293
+ notes.push(`_No pull requests: ${s.github.error}._`);
294
+ else if (s.github && !s.github.authenticated)
295
+ notes.push("_Pull requests from public repos only; set GITHUB_TOKEN to include private ones._");
296
+ return notes.length ? [...notes, ""] : [];
297
+ }
298
+ /** 4_500_000 → "1h 15m" */
299
+ export function formatDuration(ms) {
300
+ const minutes = Math.round(ms / 60_000);
301
+ const h = Math.floor(minutes / 60);
302
+ const m = minutes % 60;
303
+ return h ? (m ? `${h}h ${m}m` : `${h}h`) : `${m}m`;
304
+ }
305
+ /** Saves the markdown to ~/.dx/summaries/<last day>.md and returns the path. */
306
+ export function saveSummary(markdown, summary) {
307
+ ensureDxHome();
308
+ const dir = dxPath("summaries");
309
+ fs.mkdirSync(dir, { recursive: true });
310
+ const file = dxPath("summaries", `${summary.to}.md`);
311
+ fs.writeFileSync(file, markdown, "utf8");
312
+ return file;
313
+ }
314
+ export function summariesDir() {
315
+ return dxPath("summaries");
316
+ }
317
+ function plural(n, one, many = `${one}s`) {
318
+ return `${n} ${n === 1 ? one : many}`;
319
+ }
320
+ function firstLine(text) {
321
+ return (text ?? "").split(/\r?\n/).map((l) => l.replace(/^(fatal|error):\s*/i, "").trim()).find(Boolean) ?? "";
322
+ }
323
+ async function inBatches(items, size, fn) {
324
+ let next = 0;
325
+ const worker = async () => {
326
+ while (next < items.length)
327
+ await fn(items[next++]);
328
+ };
329
+ await Promise.all(Array.from({ length: Math.min(size, items.length) }, worker));
330
+ }
331
+ //# sourceMappingURL=summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/tools/summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "@dx/core",
3
+ "version": "1.1.0",
4
+ "license": "MIT",
5
+ "private": true,
6
+ "description": "The tools themselves. No dependencies beyond Node, so every front end can bundle it.",
7
+ "type": "module",
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "default": "./dist/index.js"
15
+ }
16
+ },
17
+ "files": [
18
+ "dist"
19
+ ]
20
+ }
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}