diffsplain 0.5.0 → 0.6.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 (91) hide show
  1. package/README.md +17 -12
  2. package/dist/assets/{angular-html-CoQle5-T.js → angular-html-vBvPnd6a.js} +1 -1
  3. package/dist/assets/{angular-ts-BB_A1Lpy.js → angular-ts-CDzF1Z6a.js} +1 -1
  4. package/dist/assets/{apl-B7_4_FNq.js → apl-Bm9bxvP7.js} +1 -1
  5. package/dist/assets/{astro-CXVo4VE4.js → astro-RNrNWCYO.js} +1 -1
  6. package/dist/assets/{blade-BVX41dq7.js → blade-On-NBYUv.js} +1 -1
  7. package/dist/assets/{c-Dhyi8Nd2.js → c-hRmhFgD0.js} +1 -1
  8. package/dist/assets/{cobol-CU5oLeZj.js → cobol-CIqc3k2t.js} +1 -1
  9. package/dist/assets/{coffee-D_FU6gC_.js → coffee-Cd5EyvvS.js} +1 -1
  10. package/dist/assets/{cpp-CxoYLSi3.js → cpp-zXFAAp_S.js} +1 -1
  11. package/dist/assets/{crystal-BdgqBN3z.js → crystal-DRYY4cSw.js} +1 -1
  12. package/dist/assets/{css-wLk1vVwJ.js → css-C4op_MsD.js} +1 -1
  13. package/dist/assets/{edge-DMylWoGl.js → edge-d3rJkErf.js} +1 -1
  14. package/dist/assets/{elixir-Djmgto_Z.js → elixir-DPqlJhYM.js} +1 -1
  15. package/dist/assets/{elm-D7B-eBLA.js → elm-DgU37I8a.js} +1 -1
  16. package/dist/assets/{erb-g1sso1GW.js → erb-CZVB_ntC.js} +1 -1
  17. package/dist/assets/{git-rebase-DEAhxutZ.js → git-rebase-hUkltHZG.js} +1 -1
  18. package/dist/assets/{glimmer-js-CHvGFGMp.js → glimmer-js-5XOT9GQ8.js} +1 -1
  19. package/dist/assets/{glimmer-ts-DvhL705p.js → glimmer-ts-DT7D0Kfq.js} +1 -1
  20. package/dist/assets/{glsl-C8mS_t8I.js → glsl-Br4_Eh5O.js} +1 -1
  21. package/dist/assets/{graphql-DW2pnvqi.js → graphql--BmZ_AYP.js} +1 -1
  22. package/dist/assets/{hack-DYc1d3he.js → hack-CMdqGDoA.js} +1 -1
  23. package/dist/assets/{haml-_5OmzH31.js → haml-DLEOHGmg.js} +1 -1
  24. package/dist/assets/{handlebars-rN-CaXUf.js → handlebars-BfUftoV0.js} +1 -1
  25. package/dist/assets/{html-derivative-BovOubry.js → html-derivative-D5cZE6C4.js} +1 -1
  26. package/dist/assets/{html-DQnaJUjl.js → html-uOgx2iYC.js} +1 -1
  27. package/dist/assets/{http-BKTgwOYc.js → http-cW9c66J_.js} +1 -1
  28. package/dist/assets/{hurl-ChS3_IgD.js → hurl-BztURO2n.js} +1 -1
  29. package/dist/assets/{index-BLtRBc2n.css → index-C2p_1iAk.css} +1 -1
  30. package/dist/assets/{index-CEglkSs-.js → index-DZFM4-3L.js} +11 -11
  31. package/dist/assets/{java-Dgnyk--z.js → java-Cy4mnKaj.js} +1 -1
  32. package/dist/assets/{javascript-BfnrwkRN.js → javascript-_Z02t_9Q.js} +1 -1
  33. package/dist/assets/{jinja-CD2AIvOi.js → jinja-BppBm5gt.js} +1 -1
  34. package/dist/assets/{jison-DmKNw3Pl.js → jison-Dzns436M.js} +1 -1
  35. package/dist/assets/{json-CKB5a8aj.js → json-BYkfLOry.js} +1 -1
  36. package/dist/assets/{jsx-jJXrDRBM.js → jsx-DtAm8NUb.js} +1 -1
  37. package/dist/assets/{julia-G8vVBW-t.js → julia-CLIMRuh0.js} +1 -1
  38. package/dist/assets/{just-DMXLrLZL.js → just-DMg47an6.js} +1 -1
  39. package/dist/assets/{latex-DS3xuxld.js → latex-D05ztCOx.js} +1 -1
  40. package/dist/assets/{liquid-COQnD_C4.js → liquid-DpImQR4t.js} +1 -1
  41. package/dist/assets/{lua-BwMKwosd.js → lua--ZHUYQUU.js} +1 -1
  42. package/dist/assets/{marko-cQCK_WIk.js → marko-Dh3Xi08i.js} +1 -1
  43. package/dist/assets/{mdc-DQUjY13N.js → mdc-Br6Pt78u.js} +1 -1
  44. package/dist/assets/{nginx-C4Kv3DJi.js → nginx-CwSU6U6d.js} +1 -1
  45. package/dist/assets/{nim-ChzLzuYD.js → nim-CBbTwyeq.js} +1 -1
  46. package/dist/assets/{perl-z5xUiWAY.js → perl-D3jQu3LN.js} +1 -1
  47. package/dist/assets/{php-BHqm-Xeh.js → php-BMeXBzlU.js} +1 -1
  48. package/dist/assets/{pug-C9C_Llft.js → pug-BGdY1g5E.js} +1 -1
  49. package/dist/assets/{qml-dtpuwXJZ.js → qml-DsT5biza.js} +1 -1
  50. package/dist/assets/{r-BicQMs_c.js → r-CbS9PfN5.js} +1 -1
  51. package/dist/assets/{razor-D5h00YTZ.js → razor-Bwm8roHi.js} +1 -1
  52. package/dist/assets/{regexp-CTa8S86v.js → regexp-Bc_9DyAu.js} +1 -1
  53. package/dist/assets/{rst-Bg-b-7HK.js → rst-Cj1Aii91.js} +1 -1
  54. package/dist/assets/{ruby-BiWYm056.js → ruby-BPMtFZnc.js} +1 -1
  55. package/dist/assets/{sas-bJTdfgUz.js → sas-CoOau1t2.js} +1 -1
  56. package/dist/assets/{scss-0qkNyHr1.js → scss-CvfaI808.js} +1 -1
  57. package/dist/assets/{shellscript-3sDkDE9z.js → shellscript-B0C-TdLE.js} +1 -1
  58. package/dist/assets/{shellsession-D4EBhEmz.js → shellsession-UhmLiqcA.js} +1 -1
  59. package/dist/assets/{soy-DG9hUwLL.js → soy-D419u0RL.js} +1 -1
  60. package/dist/assets/{sql-B0UoKHkx.js → sql-Do9k0rRn.js} +1 -1
  61. package/dist/assets/{stata-CsQbuXQp.js → stata-x47J6BC4.js} +1 -1
  62. package/dist/assets/{surrealql-D63VLxos.js → surrealql-BERQ6pHu.js} +1 -1
  63. package/dist/assets/{svelte-BApdnAma.js → svelte-dRWkyqKW.js} +1 -1
  64. package/dist/assets/{templ-B64pN6Lz.js → templ-CTq-KoWN.js} +1 -1
  65. package/dist/assets/{tex-DR2UVIPF.js → tex-CdRGjyYI.js} +1 -1
  66. package/dist/assets/{ts-tags-IwhomvQv.js → ts-tags-CgaMqyVb.js} +1 -1
  67. package/dist/assets/{tsx-DROdxqzS.js → tsx-cpBQKcPG.js} +1 -1
  68. package/dist/assets/{twig-BtbUqpR4.js → twig-vbs_PM4-.js} +1 -1
  69. package/dist/assets/{typescript-CHpSjYZL.js → typescript-Cc--nwIo.js} +1 -1
  70. package/dist/assets/{vue-DCvEu_ug.js → vue-CgHwdBmB.js} +1 -1
  71. package/dist/assets/{vue-html-BgL4Rf-L.js → vue-html-BHfoMw47.js} +1 -1
  72. package/dist/assets/{vue-vine-CRNdhPTn.js → vue-vine-_lVRp_NK.js} +1 -1
  73. package/dist/assets/{xml-CkfPxZuz.js → xml-G4NVmTde.js} +1 -1
  74. package/dist/assets/{xsl-CteaoFSV.js → xsl-s0so2M1i.js} +1 -1
  75. package/dist/assets/{yaml-CUr3TDRN.js → yaml-CpsmW05t.js} +1 -1
  76. package/dist/index.html +2 -2
  77. package/package.json +49 -23
  78. package/scripts/access-token.mjs +21 -0
  79. package/scripts/build-diff-data.mjs +260 -39
  80. package/scripts/cache.mjs +301 -0
  81. package/scripts/cli-args.mjs +206 -57
  82. package/scripts/coding-agents.mjs +279 -162
  83. package/scripts/dev.mjs +218 -0
  84. package/scripts/doctor.mjs +265 -46
  85. package/scripts/generate-summaries.mjs +760 -260
  86. package/scripts/mock-agent.mjs +165 -0
  87. package/scripts/present.mjs +394 -85
  88. package/scripts/presenter-runtime.mjs +148 -0
  89. package/scripts/serve-built.mjs +343 -71
  90. package/scripts/summary-path.mjs +24 -7
  91. package/scripts/support-record.mjs +242 -0
@@ -0,0 +1,165 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { createHash } from "node:crypto";
4
+ import {
5
+ mkdirSync,
6
+ readFileSync,
7
+ renameSync,
8
+ rmSync,
9
+ unwatchFile,
10
+ watchFile,
11
+ writeFileSync,
12
+ } from "node:fs";
13
+ import { dirname, resolve } from "node:path";
14
+
15
+ const args = process.argv.slice(2);
16
+
17
+ function option(name, fallback) {
18
+ const index = args.indexOf(name);
19
+ if (index === -1) return fallback;
20
+ const value = args[index + 1];
21
+ if (!value || value.startsWith("--")) throw new Error(`${name} needs a value`);
22
+ return value;
23
+ }
24
+
25
+ const output = resolve(option("--output"));
26
+ const fixture = resolve(option("--fixture"));
27
+ const delay = Number(option("--delay", "750"));
28
+ const startFile = option("--start-file");
29
+ const advanceFile = option("--advance-file");
30
+ if (!Number.isSafeInteger(delay) || delay < 10 || delay > 60_000) {
31
+ throw new Error("--delay must be a whole number from 10 to 60000");
32
+ }
33
+
34
+ let timer;
35
+ let stopped = false;
36
+ let awaitedVersion;
37
+ let releaseStage;
38
+
39
+ function readFixture() {
40
+ const snapshot = JSON.parse(readFileSync(fixture, "utf8"));
41
+ if (!Array.isArray(snapshot.files)) {
42
+ throw new Error("Mock fixture must contain files");
43
+ }
44
+ return snapshot;
45
+ }
46
+
47
+ function writeSnapshot(snapshot) {
48
+ const text = JSON.stringify(snapshot, null, 2);
49
+ const version = createHash("sha256").update(text).digest("hex").slice(0, 12);
50
+ const next = {
51
+ ...snapshot,
52
+ version,
53
+ generatedAt: new Date().toISOString(),
54
+ };
55
+ mkdirSync(dirname(output), { recursive: true });
56
+ const temporary = `${output}.${process.pid}.tmp`;
57
+ writeFileSync(temporary, `${JSON.stringify(next, null, 2)}\n`);
58
+ renameSync(temporary, output);
59
+ return version;
60
+ }
61
+
62
+ function withNotes(snapshot, status, completedFiles) {
63
+ return {
64
+ ...snapshot,
65
+ files: snapshot.files.map((file, index) => ({
66
+ ...file,
67
+ noteReady: index < completedFiles,
68
+ })),
69
+ notes: {
70
+ fresh: status !== "failed",
71
+ complete: status === "complete",
72
+ status,
73
+ completedFiles,
74
+ totalFiles: snapshot.files.length,
75
+ },
76
+ };
77
+ }
78
+
79
+ function scheduleNextStage(publish, index, total) {
80
+ if (index >= total) return;
81
+ if (advanceFile) {
82
+ releaseStage = () => {
83
+ releaseStage = undefined;
84
+ timer = setTimeout(publish, delay);
85
+ };
86
+ return;
87
+ }
88
+ timer = setTimeout(publish, delay);
89
+ }
90
+
91
+ function readAdvanceVersion(path) {
92
+ try {
93
+ return readFileSync(path, "utf8").trim();
94
+ } catch {
95
+ return undefined;
96
+ }
97
+ }
98
+
99
+ function startScenario() {
100
+ clearTimeout(timer);
101
+ awaitedVersion = undefined;
102
+ releaseStage = undefined;
103
+ if (advanceFile) rmSync(resolve(advanceFile), { force: true });
104
+ let fixtureData;
105
+ try {
106
+ fixtureData = readFixture();
107
+ } catch (error) {
108
+ console.error(error instanceof Error ? error.message : String(error));
109
+ return;
110
+ }
111
+ const stages = [
112
+ ["generating", 0, "waiting"],
113
+ ["generating", Math.min(1, fixtureData.files.length), "progress"],
114
+ ["failed", Math.min(1, fixtureData.files.length), "failed"],
115
+ ["generating", Math.min(1, fixtureData.files.length), "retrying"],
116
+ ["complete", fixtureData.files.length, "complete"],
117
+ ];
118
+ let index = 0;
119
+ const publish = () => {
120
+ if (stopped) return;
121
+ const [status, completedFiles, label] = stages[index];
122
+ awaitedVersion = writeSnapshot(
123
+ withNotes(fixtureData, status, completedFiles),
124
+ );
125
+ console.log(`Mock notes: ${label}`);
126
+ index += 1;
127
+ scheduleNextStage(publish, index, stages.length);
128
+ };
129
+ publish();
130
+ }
131
+
132
+ watchFile(fixture, { interval: 100 }, (current, previous) => {
133
+ if (current.mtimeMs !== previous.mtimeMs || current.size !== previous.size) {
134
+ console.log("Mock fixture changed; restarting notes.");
135
+ startScenario();
136
+ }
137
+ });
138
+ process.on("SIGINT", () => {
139
+ stopped = true;
140
+ process.exit(0);
141
+ });
142
+ process.on("SIGTERM", () => {
143
+ stopped = true;
144
+ process.exit(0);
145
+ });
146
+
147
+ if (advanceFile) {
148
+ const resolvedAdvanceFile = resolve(advanceFile);
149
+ watchFile(resolvedAdvanceFile, { interval: 25 }, (current) => {
150
+ if (current.nlink === 0 || !releaseStage) return;
151
+ if (readAdvanceVersion(resolvedAdvanceFile) !== awaitedVersion) return;
152
+ releaseStage();
153
+ });
154
+ }
155
+
156
+ if (startFile) {
157
+ const resolvedStartFile = resolve(startFile);
158
+ watchFile(resolvedStartFile, { interval: 50 }, (current) => {
159
+ if (current.nlink === 0) return;
160
+ unwatchFile(resolvedStartFile);
161
+ startScenario();
162
+ });
163
+ } else {
164
+ startScenario();
165
+ }