@momentiq/dark-factory-cli 1.0.0 → 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.
- package/README.md +35 -38
- package/dist/adapters/codex-sdk.d.ts +66 -0
- package/dist/adapters/codex-sdk.d.ts.map +1 -1
- package/dist/adapters/codex-sdk.js +321 -4
- package/dist/adapters/codex-sdk.js.map +1 -1
- package/dist/adapters/critic-result-schema.d.ts +5 -0
- package/dist/adapters/critic-result-schema.d.ts.map +1 -1
- package/dist/adapters/critic-result-schema.js +10 -0
- package/dist/adapters/critic-result-schema.js.map +1 -1
- package/dist/adapters/cursor-cli.d.ts +19 -1
- package/dist/adapters/cursor-cli.d.ts.map +1 -1
- package/dist/adapters/cursor-cli.js +96 -14
- package/dist/adapters/cursor-cli.js.map +1 -1
- package/dist/branch-protection/spec-default.yaml +2 -2
- package/dist/cli.js +127 -81
- package/dist/cli.js.map +1 -1
- package/dist/commands/show.d.ts +11 -0
- package/dist/commands/show.d.ts.map +1 -0
- package/dist/commands/show.js +78 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/status.d.ts +6 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +85 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/compact/index.d.ts +2 -0
- package/dist/compact/index.d.ts.map +1 -0
- package/dist/compact/index.js +3 -0
- package/dist/compact/index.js.map +1 -0
- package/dist/compact/lockfile.d.ts +53 -0
- package/dist/compact/lockfile.d.ts.map +1 -0
- package/dist/compact/lockfile.js +626 -0
- package/dist/compact/lockfile.js.map +1 -0
- package/dist/cycle-doc-validator/validate_cycle_doc.py +39 -9
- package/dist/doctor.d.ts +34 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +390 -1
- package/dist/doctor.js.map +1 -1
- package/dist/handoff/handoff-verb.d.ts.map +1 -1
- package/dist/handoff/handoff-verb.js +6 -3
- package/dist/handoff/handoff-verb.js.map +1 -1
- package/dist/handoff/ports.d.ts +8 -0
- package/dist/handoff/ports.d.ts.map +1 -1
- package/dist/handoff/real-clients.js +1 -1
- package/dist/handoff/real-clients.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/show-status-core.d.ts +63 -0
- package/dist/lib/show-status-core.d.ts.map +1 -0
- package/dist/lib/show-status-core.js +156 -0
- package/dist/lib/show-status-core.js.map +1 -0
- package/dist/mcp/prompts.d.ts.map +1 -1
- package/dist/mcp/prompts.js +113 -78
- package/dist/mcp/prompts.js.map +1 -1
- package/dist/mcp/resources.js +1 -1
- package/dist/mcp/resources.js.map +1 -1
- package/dist/mcp/tools/findings.d.ts +0 -22
- package/dist/mcp/tools/findings.d.ts.map +1 -1
- package/dist/mcp/tools/findings.js +5 -73
- package/dist/mcp/tools/findings.js.map +1 -1
- package/dist/mcp/tools/handoff.d.ts.map +1 -1
- package/dist/mcp/tools/handoff.js +10 -17
- package/dist/mcp/tools/handoff.js.map +1 -1
- package/dist/mcp/tools/review-bypass.d.ts.map +1 -1
- package/dist/mcp/tools/review-bypass.js +1 -1
- package/dist/mcp/tools/review-bypass.js.map +1 -1
- package/dist/policy/baseline.d.ts.map +1 -1
- package/dist/policy/baseline.js +11 -3
- package/dist/policy/baseline.js.map +1 -1
- package/dist/prompt.d.ts.map +1 -1
- package/dist/prompt.js +18 -3
- package/dist/prompt.js.map +1 -1
- package/dist/report.d.ts +24 -0
- package/dist/report.d.ts.map +1 -1
- package/dist/report.js +85 -0
- package/dist/report.js.map +1 -1
- package/dist/runner.d.ts +4 -0
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +127 -2
- package/dist/runner.js.map +1 -1
- package/dist/trusted-surface/rebind.d.ts.map +1 -1
- package/dist/trusted-surface/rebind.js +185 -1
- package/dist/trusted-surface/rebind.js.map +1 -1
- package/package.json +6 -2
|
@@ -0,0 +1,626 @@
|
|
|
1
|
+
// ADR 0001 — bounded lockfile strategy (issue #67).
|
|
2
|
+
//
|
|
3
|
+
// Per-lockfile-format extractors + renderer. The compactor walks a
|
|
4
|
+
// unified-diff section (per the cycle's "diff --git ..." → next
|
|
5
|
+
// "diff --git ..." boundary), identifies the lockfile kind by
|
|
6
|
+
// filename, parses the +/- lines into a CompactedLockfileDelta, and
|
|
7
|
+
// renders a stable text stub the prompt builder splices in.
|
|
8
|
+
//
|
|
9
|
+
// See `docs/ADR/0001-bounded-lockfile-strategy.md` for the full
|
|
10
|
+
// design + format spec. This module implements §§ 2.2.1, 2.3, 2.4.1,
|
|
11
|
+
// 3.6, 3.7 of that ADR.
|
|
12
|
+
import { createHash } from "node:crypto";
|
|
13
|
+
import { matchAnyGlob, matchGlob } from "../glob.js";
|
|
14
|
+
// ADR § 2.4.1 — byte caps on the prompt-rendered surfaces. The 250KB
|
|
15
|
+
// cap on compactedDiff is the LOAD-BEARING fix for codex round-2
|
|
16
|
+
// performance blocker: even after compaction, a mono-repo with
|
|
17
|
+
// hundreds of compacted lockfiles must not overflow the model
|
|
18
|
+
// context window. 250KB ≈ 60K tokens, leaving headroom below the
|
|
19
|
+
// smallest critic context window.
|
|
20
|
+
//
|
|
21
|
+
// The 50KB cap on compactedContent applies per-file: a single
|
|
22
|
+
// lockfile with thousands of packages can still produce a large
|
|
23
|
+
// `packages-after:` stub. Truncation preserves content-sha256 over
|
|
24
|
+
// the FULL pre-truncation body so audit recovery remains possible.
|
|
25
|
+
export const MAX_COMPACTED_DIFF_BYTES = 250_000;
|
|
26
|
+
export const MAX_COMPACTED_CONTENT_BYTES = 50_000;
|
|
27
|
+
// ADR § 2.2 — shipped default glob list, substituted at packet-build
|
|
28
|
+
// time when generatedFilePolicy.globs is omitted. § 3.7 documents
|
|
29
|
+
// why we do NOT merge with explicit globs: the default list will
|
|
30
|
+
// grow over CLI versions, and silently expanding an operator's
|
|
31
|
+
// match set is a surprise vector.
|
|
32
|
+
export const DEFAULT_GENERATED_LOCKFILE_GLOBS = [
|
|
33
|
+
"**/package-lock.json",
|
|
34
|
+
"**/npm-shrinkwrap.json",
|
|
35
|
+
"**/pnpm-lock.yaml",
|
|
36
|
+
"**/yarn.lock",
|
|
37
|
+
];
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Identification
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
export function identifyLockfileKind(path) {
|
|
42
|
+
const base = path.split("/").pop() ?? path;
|
|
43
|
+
if (base === "package-lock.json" || base === "npm-shrinkwrap.json")
|
|
44
|
+
return "npm";
|
|
45
|
+
if (base === "pnpm-lock.yaml")
|
|
46
|
+
return "pnpm";
|
|
47
|
+
if (base === "yarn.lock")
|
|
48
|
+
return "yarn";
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
// ADR § 2.2.1 — effective-mode resolver. Override precedence is
|
|
52
|
+
// strictly per-path; the packet builder triggers compaction whenever
|
|
53
|
+
// ANY path has effectiveMode !== "full", not when policy.mode !== "full".
|
|
54
|
+
export function effectiveMode(path, policy) {
|
|
55
|
+
for (const override of policy.overrides ?? []) {
|
|
56
|
+
if (matchGlob(path, override.glob))
|
|
57
|
+
return override.mode;
|
|
58
|
+
}
|
|
59
|
+
const effectiveGlobs = policy.globs ?? DEFAULT_GENERATED_LOCKFILE_GLOBS;
|
|
60
|
+
if (matchAnyGlob(path, effectiveGlobs))
|
|
61
|
+
return policy.mode;
|
|
62
|
+
return "full";
|
|
63
|
+
}
|
|
64
|
+
// ---------------------------------------------------------------------------
|
|
65
|
+
// Extraction
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
export function extractFromUnifiedDiff(perFileDiff, path) {
|
|
68
|
+
const lockfileKind = identifyLockfileKind(path);
|
|
69
|
+
if (lockfileKind === undefined) {
|
|
70
|
+
return {
|
|
71
|
+
path,
|
|
72
|
+
lockfileKind: "npm",
|
|
73
|
+
addedLines: 0,
|
|
74
|
+
removedLines: 0,
|
|
75
|
+
patchSha256: sha256(perFileDiff),
|
|
76
|
+
packages: [],
|
|
77
|
+
parseError: `unknown-lockfile-kind: ${path}`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
const { added, removed } = countAddedRemoved(perFileDiff);
|
|
81
|
+
const patchSha256 = sha256(perFileDiff);
|
|
82
|
+
try {
|
|
83
|
+
let packages;
|
|
84
|
+
switch (lockfileKind) {
|
|
85
|
+
case "npm":
|
|
86
|
+
packages = extractNpm(perFileDiff);
|
|
87
|
+
break;
|
|
88
|
+
case "pnpm":
|
|
89
|
+
packages = extractPnpm(perFileDiff);
|
|
90
|
+
break;
|
|
91
|
+
case "yarn":
|
|
92
|
+
packages = extractYarn(perFileDiff);
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
path,
|
|
97
|
+
lockfileKind,
|
|
98
|
+
addedLines: added,
|
|
99
|
+
removedLines: removed,
|
|
100
|
+
patchSha256,
|
|
101
|
+
packages,
|
|
102
|
+
...(packages.length === 0 ? { notes: ["lockfile-metadata-only"] } : {}),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
107
|
+
return {
|
|
108
|
+
path,
|
|
109
|
+
lockfileKind,
|
|
110
|
+
addedLines: added,
|
|
111
|
+
removedLines: removed,
|
|
112
|
+
patchSha256,
|
|
113
|
+
packages: [],
|
|
114
|
+
parseError: message,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// npm — walk hunks; track last-seen `"node_modules/<name>":` marker.
|
|
119
|
+
// Each `+/-"version"` or `+/-"integrity"` line attributes to the
|
|
120
|
+
// last-seen marker. Pure-add and pure-remove blocks are detected by
|
|
121
|
+
// the marker line itself appearing on a `+` or `-` line.
|
|
122
|
+
function extractNpm(diff) {
|
|
123
|
+
const byName = new Map();
|
|
124
|
+
let lastName = null;
|
|
125
|
+
// Match "node_modules/<name>" entries; ignore workspace ("") and
|
|
126
|
+
// bare "packages/<name>" entries.
|
|
127
|
+
const markerRe = /^([+\- ])\s*"node_modules\/(@?[^"]+)":\s*\{/;
|
|
128
|
+
const versionRe = /^([+\- ])\s*"version":\s*"([^"]+)"/;
|
|
129
|
+
const integrityRe = /^([+\- ])\s*"integrity":\s*"([^"]+)"/;
|
|
130
|
+
let saw = false;
|
|
131
|
+
for (const line of diff.split("\n")) {
|
|
132
|
+
const m = markerRe.exec(line);
|
|
133
|
+
if (m) {
|
|
134
|
+
saw = true;
|
|
135
|
+
lastName = m[2] ?? null;
|
|
136
|
+
// Skip nested packages like "node_modules/foo/node_modules/bar"
|
|
137
|
+
// for v1; record the inner name only.
|
|
138
|
+
if (lastName?.includes("/node_modules/")) {
|
|
139
|
+
const parts = lastName.split("/node_modules/");
|
|
140
|
+
lastName = parts[parts.length - 1] ?? lastName;
|
|
141
|
+
}
|
|
142
|
+
if (!lastName)
|
|
143
|
+
continue;
|
|
144
|
+
let acc = byName.get(lastName);
|
|
145
|
+
if (!acc) {
|
|
146
|
+
acc = { sawAddMarker: false, sawRemoveMarker: false };
|
|
147
|
+
byName.set(lastName, acc);
|
|
148
|
+
}
|
|
149
|
+
if (m[1] === "+")
|
|
150
|
+
acc.sawAddMarker = true;
|
|
151
|
+
else if (m[1] === "-")
|
|
152
|
+
acc.sawRemoveMarker = true;
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
if (!lastName)
|
|
156
|
+
continue;
|
|
157
|
+
const acc = byName.get(lastName);
|
|
158
|
+
if (!acc)
|
|
159
|
+
continue;
|
|
160
|
+
const vm = versionRe.exec(line);
|
|
161
|
+
if (vm) {
|
|
162
|
+
saw = true;
|
|
163
|
+
if (vm[1] === "+")
|
|
164
|
+
acc.addVersion = vm[2] ?? "";
|
|
165
|
+
else if (vm[1] === "-")
|
|
166
|
+
acc.removeVersion = vm[2] ?? "";
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
const im = integrityRe.exec(line);
|
|
170
|
+
if (im) {
|
|
171
|
+
if (im[1] === "+")
|
|
172
|
+
acc.addIntegrity = im[2] ?? "";
|
|
173
|
+
else if (im[1] === "-")
|
|
174
|
+
acc.removeIntegrity = im[2] ?? "";
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if (!saw) {
|
|
179
|
+
throw new Error("npm: no node_modules entries found in diff");
|
|
180
|
+
}
|
|
181
|
+
const out = [];
|
|
182
|
+
for (const [name, acc] of byName) {
|
|
183
|
+
// Pure add: sawAddMarker AND not sawRemoveMarker
|
|
184
|
+
// Pure remove: sawRemoveMarker AND not sawAddMarker
|
|
185
|
+
// Upgrade: any version change or integrity change without
|
|
186
|
+
// marker-only flip
|
|
187
|
+
if (acc.sawAddMarker && !acc.sawRemoveMarker) {
|
|
188
|
+
out.push({
|
|
189
|
+
kind: "add",
|
|
190
|
+
name,
|
|
191
|
+
...(acc.addVersion !== undefined ? { version: acc.addVersion } : {}),
|
|
192
|
+
...(acc.addIntegrity !== undefined ? { integrity: acc.addIntegrity } : {}),
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
else if (acc.sawRemoveMarker && !acc.sawAddMarker) {
|
|
196
|
+
out.push({
|
|
197
|
+
kind: "remove",
|
|
198
|
+
name,
|
|
199
|
+
...(acc.removeVersion !== undefined ? { oldVersion: acc.removeVersion } : {}),
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
else if (acc.addVersion !== undefined || acc.removeVersion !== undefined) {
|
|
203
|
+
out.push({
|
|
204
|
+
kind: "upgrade",
|
|
205
|
+
name,
|
|
206
|
+
...(acc.removeVersion !== undefined ? { oldVersion: acc.removeVersion } : {}),
|
|
207
|
+
...(acc.addVersion !== undefined ? { newVersion: acc.addVersion } : {}),
|
|
208
|
+
...(acc.removeIntegrity !== undefined
|
|
209
|
+
? { oldIntegrity: acc.removeIntegrity }
|
|
210
|
+
: {}),
|
|
211
|
+
...(acc.addIntegrity !== undefined ? { integrity: acc.addIntegrity } : {}),
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
// Else: marker-only inside a context block — ignore.
|
|
215
|
+
}
|
|
216
|
+
return out;
|
|
217
|
+
}
|
|
218
|
+
// pnpm — walk hunks; match `+/- /<name>@<version>:` spec lines.
|
|
219
|
+
// Group by name; if both + and - versions exist, it's an upgrade.
|
|
220
|
+
// Track integrity from the immediate-following indented line.
|
|
221
|
+
function extractPnpm(diff) {
|
|
222
|
+
const adds = [];
|
|
223
|
+
const removes = [];
|
|
224
|
+
const lines = diff.split("\n");
|
|
225
|
+
const specRe = /^([+\- ])\s*\/(@?[^@/]+(?:\/[^@/]+)?)@([^:()]+)(?:\([^)]+\))?:/;
|
|
226
|
+
const integrityRe = /^([+\- ])\s*integrity:\s*(\S+)/;
|
|
227
|
+
let pending = null;
|
|
228
|
+
let pendingSign = null;
|
|
229
|
+
let saw = false;
|
|
230
|
+
function flush() {
|
|
231
|
+
if (!pending || !pendingSign)
|
|
232
|
+
return;
|
|
233
|
+
(pendingSign === "+" ? adds : removes).push(pending);
|
|
234
|
+
pending = null;
|
|
235
|
+
pendingSign = null;
|
|
236
|
+
}
|
|
237
|
+
for (const line of lines) {
|
|
238
|
+
const m = specRe.exec(line);
|
|
239
|
+
if (m && (m[1] === "+" || m[1] === "-")) {
|
|
240
|
+
saw = true;
|
|
241
|
+
flush();
|
|
242
|
+
pending = { name: m[2] ?? "", version: m[3] ?? "" };
|
|
243
|
+
pendingSign = m[1];
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
if (pending && pendingSign) {
|
|
247
|
+
const im = integrityRe.exec(line);
|
|
248
|
+
if (im && (im[1] === pendingSign)) {
|
|
249
|
+
pending.integrity = im[2] ?? "";
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
// Any non-matching line ends the pending block.
|
|
253
|
+
// (We don't flush eagerly — wait for next spec or EOF.)
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
flush();
|
|
257
|
+
if (!saw) {
|
|
258
|
+
throw new Error("pnpm: no /<name>@<version>: entries found in diff");
|
|
259
|
+
}
|
|
260
|
+
const byName = new Map();
|
|
261
|
+
for (const a of adds) {
|
|
262
|
+
const e = byName.get(a.name) ?? {};
|
|
263
|
+
e.add = a;
|
|
264
|
+
byName.set(a.name, e);
|
|
265
|
+
}
|
|
266
|
+
for (const r of removes) {
|
|
267
|
+
const e = byName.get(r.name) ?? {};
|
|
268
|
+
e.remove = r;
|
|
269
|
+
byName.set(r.name, e);
|
|
270
|
+
}
|
|
271
|
+
const out = [];
|
|
272
|
+
for (const [name, e] of byName) {
|
|
273
|
+
if (e.add && e.remove) {
|
|
274
|
+
out.push({
|
|
275
|
+
kind: "upgrade",
|
|
276
|
+
name,
|
|
277
|
+
oldVersion: e.remove.version,
|
|
278
|
+
newVersion: e.add.version,
|
|
279
|
+
...(e.remove.integrity !== undefined ? { oldIntegrity: e.remove.integrity } : {}),
|
|
280
|
+
...(e.add.integrity !== undefined ? { integrity: e.add.integrity } : {}),
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
else if (e.add) {
|
|
284
|
+
out.push({
|
|
285
|
+
kind: "add",
|
|
286
|
+
name,
|
|
287
|
+
version: e.add.version,
|
|
288
|
+
...(e.add.integrity !== undefined ? { integrity: e.add.integrity } : {}),
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
else if (e.remove) {
|
|
292
|
+
out.push({
|
|
293
|
+
kind: "remove",
|
|
294
|
+
name,
|
|
295
|
+
oldVersion: e.remove.version,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return out;
|
|
300
|
+
}
|
|
301
|
+
// yarn — walk hunks; match `+/-<name>@<spec>:` top-level entries.
|
|
302
|
+
// Each entry's body has `version "X"` and `integrity sha512-...`
|
|
303
|
+
// lines (also +/-).
|
|
304
|
+
function extractYarn(diff) {
|
|
305
|
+
const adds = new Map();
|
|
306
|
+
const removes = new Map();
|
|
307
|
+
const lines = diff.split("\n");
|
|
308
|
+
// yarn spec line: ^<sign><name>@<range>: (no leading whitespace
|
|
309
|
+
// for the spec line; nested entries are indented two spaces).
|
|
310
|
+
const specRe = /^([+\-])(@?[^@\s]+)@[^:]+:/;
|
|
311
|
+
const versionRe = /^([+\- ])\s+version\s+"([^"]+)"/;
|
|
312
|
+
const integrityRe = /^([+\- ])\s+integrity\s+(\S+)/;
|
|
313
|
+
let currentSign = null;
|
|
314
|
+
let currentName = null;
|
|
315
|
+
let saw = false;
|
|
316
|
+
// Context-line spec matcher: same as specRe but with a leading
|
|
317
|
+
// single space (` `) in place of `+`/`-`. Matching a context spec
|
|
318
|
+
// line ENDS the current +/- block so a context-line body doesn't
|
|
319
|
+
// leak into the previous +/- block's fields (the yarn case where
|
|
320
|
+
// `qux@^3.1.0:` follows `-baz@^0.5.1:` without separator).
|
|
321
|
+
const contextSpecRe = /^ (@?[^@\s]+)@[^:]+:/;
|
|
322
|
+
for (const line of lines) {
|
|
323
|
+
const m = specRe.exec(line);
|
|
324
|
+
if (m) {
|
|
325
|
+
saw = true;
|
|
326
|
+
currentSign = m[1];
|
|
327
|
+
currentName = m[2] ?? null;
|
|
328
|
+
if (currentName) {
|
|
329
|
+
const map = currentSign === "+" ? adds : removes;
|
|
330
|
+
if (!map.has(currentName))
|
|
331
|
+
map.set(currentName, { name: currentName });
|
|
332
|
+
}
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
// A context spec line clears the current +/- block context so
|
|
336
|
+
// its body's version/integrity (also context) don't overwrite
|
|
337
|
+
// the prior block's fields.
|
|
338
|
+
if (contextSpecRe.test(line)) {
|
|
339
|
+
currentSign = null;
|
|
340
|
+
currentName = null;
|
|
341
|
+
continue;
|
|
342
|
+
}
|
|
343
|
+
if (!currentName || !currentSign)
|
|
344
|
+
continue;
|
|
345
|
+
const map = currentSign === "+" ? adds : removes;
|
|
346
|
+
const entry = map.get(currentName);
|
|
347
|
+
if (!entry)
|
|
348
|
+
continue;
|
|
349
|
+
const vm = versionRe.exec(line);
|
|
350
|
+
if (vm) {
|
|
351
|
+
// Only accept body lines whose sign matches the current
|
|
352
|
+
// block's sign. Context (` `) lines belong to context-block
|
|
353
|
+
// sections, NOT to +/- blocks.
|
|
354
|
+
if (vm[1] === currentSign) {
|
|
355
|
+
entry.version = vm[2] ?? "";
|
|
356
|
+
}
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
const im = integrityRe.exec(line);
|
|
360
|
+
if (im) {
|
|
361
|
+
if (im[1] === currentSign) {
|
|
362
|
+
entry.integrity = im[2] ?? "";
|
|
363
|
+
}
|
|
364
|
+
continue;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
if (!saw) {
|
|
368
|
+
throw new Error("yarn: no top-level <name>@<range>: entries found in diff");
|
|
369
|
+
}
|
|
370
|
+
const allNames = new Set([...adds.keys(), ...removes.keys()]);
|
|
371
|
+
const out = [];
|
|
372
|
+
for (const name of allNames) {
|
|
373
|
+
const a = adds.get(name);
|
|
374
|
+
const r = removes.get(name);
|
|
375
|
+
if (a && r) {
|
|
376
|
+
out.push({
|
|
377
|
+
kind: "upgrade",
|
|
378
|
+
name,
|
|
379
|
+
...(r.version !== undefined ? { oldVersion: r.version } : {}),
|
|
380
|
+
...(a.version !== undefined ? { newVersion: a.version } : {}),
|
|
381
|
+
...(r.integrity !== undefined ? { oldIntegrity: r.integrity } : {}),
|
|
382
|
+
...(a.integrity !== undefined ? { integrity: a.integrity } : {}),
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
else if (a) {
|
|
386
|
+
out.push({
|
|
387
|
+
kind: "add",
|
|
388
|
+
name,
|
|
389
|
+
...(a.version !== undefined ? { version: a.version } : {}),
|
|
390
|
+
...(a.integrity !== undefined ? { integrity: a.integrity } : {}),
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
else if (r) {
|
|
394
|
+
out.push({
|
|
395
|
+
kind: "remove",
|
|
396
|
+
name,
|
|
397
|
+
...(r.version !== undefined ? { oldVersion: r.version } : {}),
|
|
398
|
+
});
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
return out;
|
|
402
|
+
}
|
|
403
|
+
// ---------------------------------------------------------------------------
|
|
404
|
+
// Rendering
|
|
405
|
+
// ---------------------------------------------------------------------------
|
|
406
|
+
export function renderDiffStub(delta) {
|
|
407
|
+
if (delta.parseError !== undefined) {
|
|
408
|
+
return [
|
|
409
|
+
`diff --git a/${delta.path} b/${delta.path}`,
|
|
410
|
+
`[DF-COMPACT v1 PARSE-ERROR]`,
|
|
411
|
+
`files:`,
|
|
412
|
+
` - +${delta.addedLines} -${delta.removedLines} patch-sha256: ${delta.patchSha256}`,
|
|
413
|
+
`error: ${delta.parseError}`,
|
|
414
|
+
`[DF-COMPACT end]`,
|
|
415
|
+
``,
|
|
416
|
+
].join("\n");
|
|
417
|
+
}
|
|
418
|
+
const sortedPackages = sortPackages(delta.packages);
|
|
419
|
+
const pkgLines = sortedPackages.map(renderPackageLine);
|
|
420
|
+
const lines = [
|
|
421
|
+
`diff --git a/${delta.path} b/${delta.path}`,
|
|
422
|
+
`[DF-COMPACT v1 ${delta.lockfileKind}]`,
|
|
423
|
+
`files:`,
|
|
424
|
+
` - +${delta.addedLines} -${delta.removedLines} patch-sha256: ${delta.patchSha256}`,
|
|
425
|
+
];
|
|
426
|
+
if (sortedPackages.length === 0) {
|
|
427
|
+
lines.push(`notes: ${(delta.notes ?? []).join(",") || "lockfile-metadata-only"}`);
|
|
428
|
+
}
|
|
429
|
+
else {
|
|
430
|
+
lines.push(`packages:`);
|
|
431
|
+
lines.push(...pkgLines);
|
|
432
|
+
}
|
|
433
|
+
lines.push(`[DF-COMPACT end]`);
|
|
434
|
+
lines.push(``);
|
|
435
|
+
return lines.join("\n");
|
|
436
|
+
}
|
|
437
|
+
function sortPackages(pkgs) {
|
|
438
|
+
return [...pkgs].sort((a, b) => {
|
|
439
|
+
if (a.name !== b.name)
|
|
440
|
+
return a.name < b.name ? -1 : 1;
|
|
441
|
+
const order = { add: 0, remove: 1, upgrade: 2 };
|
|
442
|
+
return (order[a.kind] ?? 99) - (order[b.kind] ?? 99);
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
function renderPackageLine(p) {
|
|
446
|
+
if (p.kind === "add") {
|
|
447
|
+
const v = p.version ?? "unknown";
|
|
448
|
+
const i = p.integrity ?? "unknown";
|
|
449
|
+
return ` + ${p.name}@${v} integrity=${i}`;
|
|
450
|
+
}
|
|
451
|
+
if (p.kind === "remove") {
|
|
452
|
+
const v = p.oldVersion ?? "unknown";
|
|
453
|
+
return ` - ${p.name}@${v}`;
|
|
454
|
+
}
|
|
455
|
+
// upgrade
|
|
456
|
+
const ov = p.oldVersion ?? "unknown";
|
|
457
|
+
const nv = p.newVersion ?? "unknown";
|
|
458
|
+
const oi = p.oldIntegrity ?? "unknown";
|
|
459
|
+
const ni = p.integrity ?? "unknown";
|
|
460
|
+
return ` ~ ${p.name} ${ov} → ${nv} (integrity: ${oi} → ${ni})`;
|
|
461
|
+
}
|
|
462
|
+
// renderContentStub: produces a packages-after stub for the
|
|
463
|
+
// `<file>` block. Cap at MAX_COMPACTED_CONTENT_BYTES with truncation
|
|
464
|
+
// marker. content-sha256 always hashes the full pre-truncation body
|
|
465
|
+
// so audit recovery is possible.
|
|
466
|
+
export function renderContentStub(input) {
|
|
467
|
+
const header = [
|
|
468
|
+
`[DF-COMPACT v1 ${input.lockfileKind} full-content omitted]`,
|
|
469
|
+
`files:`,
|
|
470
|
+
` - bytes: ${input.bytesBefore}`,
|
|
471
|
+
` - content-sha256: ${input.contentSha256}`,
|
|
472
|
+
`packages-after:`,
|
|
473
|
+
];
|
|
474
|
+
const headerJoined = header.join("\n") + "\n";
|
|
475
|
+
// Sort packages by name for determinism.
|
|
476
|
+
const sorted = [...input.packagesAfter].sort((a, b) => (a.name < b.name ? -1 : 1));
|
|
477
|
+
const out = [...header];
|
|
478
|
+
let runningBytes = Buffer.byteLength(headerJoined, "utf8");
|
|
479
|
+
let elided = 0;
|
|
480
|
+
for (const p of sorted) {
|
|
481
|
+
const line = ` - ${p.name}@${p.version} integrity=${p.integrity ?? "unknown"}`;
|
|
482
|
+
const lineBytes = Buffer.byteLength(line + "\n", "utf8");
|
|
483
|
+
// Budget for the truncation marker + final newline.
|
|
484
|
+
const reserve = 80;
|
|
485
|
+
if (runningBytes + lineBytes + reserve > MAX_COMPACTED_CONTENT_BYTES) {
|
|
486
|
+
elided++;
|
|
487
|
+
continue;
|
|
488
|
+
}
|
|
489
|
+
if (elided > 0) {
|
|
490
|
+
// We're past the budget — keep counting.
|
|
491
|
+
elided++;
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
out.push(line);
|
|
495
|
+
runningBytes += lineBytes;
|
|
496
|
+
}
|
|
497
|
+
if (elided > 0) {
|
|
498
|
+
out.push(`[DF-COMPACT TRUNCATED — ${elided} more packages elided]`);
|
|
499
|
+
}
|
|
500
|
+
return out.join("\n");
|
|
501
|
+
}
|
|
502
|
+
// ---------------------------------------------------------------------------
|
|
503
|
+
// Diff-walker — splits a fullDiff into per-file sections and routes
|
|
504
|
+
// matched paths through the extractor/renderer. § 2.1.1 (pipeline
|
|
505
|
+
// order): operates on the UNTRUNCATED fullDiff so source-file hunks
|
|
506
|
+
// that previously overflowed now fit after lockfile sections collapse.
|
|
507
|
+
// ---------------------------------------------------------------------------
|
|
508
|
+
export function compactDiff(fullDiff, policy) {
|
|
509
|
+
const sections = splitDiffByFile(fullDiff);
|
|
510
|
+
const outSections = [];
|
|
511
|
+
const matchedFiles = new Map();
|
|
512
|
+
const parseErrorPaths = [];
|
|
513
|
+
let elidedLockfileSections = 0;
|
|
514
|
+
let runningBytes = 0;
|
|
515
|
+
let capHit = false;
|
|
516
|
+
for (const section of sections) {
|
|
517
|
+
const path = section.path;
|
|
518
|
+
if (path === null) {
|
|
519
|
+
// Header-only section (no path discovered, e.g. binary diff).
|
|
520
|
+
pushSection(outSections, section.text, runningBytes);
|
|
521
|
+
runningBytes += Buffer.byteLength(section.text, "utf8");
|
|
522
|
+
continue;
|
|
523
|
+
}
|
|
524
|
+
const mode = effectiveMode(path, policy);
|
|
525
|
+
if (mode === "full") {
|
|
526
|
+
const sectionBytes = Buffer.byteLength(section.text, "utf8");
|
|
527
|
+
if (runningBytes + sectionBytes > MAX_COMPACTED_DIFF_BYTES) {
|
|
528
|
+
capHit = true;
|
|
529
|
+
break;
|
|
530
|
+
}
|
|
531
|
+
outSections.push(section.text);
|
|
532
|
+
runningBytes += sectionBytes;
|
|
533
|
+
continue;
|
|
534
|
+
}
|
|
535
|
+
if (mode === "omit") {
|
|
536
|
+
const stub = `diff --git a/${path} b/${path}\n` +
|
|
537
|
+
`[DF-COMPACT v1 omit-by-policy ${path}]\n\n`;
|
|
538
|
+
const stubBytes = Buffer.byteLength(stub, "utf8");
|
|
539
|
+
if (runningBytes + stubBytes > MAX_COMPACTED_DIFF_BYTES) {
|
|
540
|
+
capHit = true;
|
|
541
|
+
elidedLockfileSections++;
|
|
542
|
+
break;
|
|
543
|
+
}
|
|
544
|
+
outSections.push(stub);
|
|
545
|
+
runningBytes += stubBytes;
|
|
546
|
+
const kind = identifyLockfileKind(path);
|
|
547
|
+
if (kind !== undefined)
|
|
548
|
+
matchedFiles.set(path, kind);
|
|
549
|
+
continue;
|
|
550
|
+
}
|
|
551
|
+
// mode === "compact"
|
|
552
|
+
const extracted = extractFromUnifiedDiff(section.text, path);
|
|
553
|
+
if (extracted.parseError !== undefined)
|
|
554
|
+
parseErrorPaths.push(path);
|
|
555
|
+
const stub = renderDiffStub(extracted);
|
|
556
|
+
const stubBytes = Buffer.byteLength(stub, "utf8");
|
|
557
|
+
if (runningBytes + stubBytes > MAX_COMPACTED_DIFF_BYTES) {
|
|
558
|
+
capHit = true;
|
|
559
|
+
elidedLockfileSections++;
|
|
560
|
+
break;
|
|
561
|
+
}
|
|
562
|
+
outSections.push(stub);
|
|
563
|
+
runningBytes += stubBytes;
|
|
564
|
+
matchedFiles.set(path, extracted.lockfileKind);
|
|
565
|
+
}
|
|
566
|
+
if (capHit) {
|
|
567
|
+
outSections.push(`[DF-COMPACT TRUNCATED — ${elidedLockfileSections} more lockfile sections elided (cap=${MAX_COMPACTED_DIFF_BYTES})]\n`);
|
|
568
|
+
}
|
|
569
|
+
return {
|
|
570
|
+
compactedDiff: outSections.join(""),
|
|
571
|
+
matchedFiles,
|
|
572
|
+
parseErrorPaths,
|
|
573
|
+
};
|
|
574
|
+
}
|
|
575
|
+
function pushSection(outSections, text, runningBytes) {
|
|
576
|
+
// Helper kept for clarity; cap-check happens at caller.
|
|
577
|
+
outSections.push(text);
|
|
578
|
+
}
|
|
579
|
+
// Split a unified diff into per-file sections, preserving each
|
|
580
|
+
// section's trailing newline. A section starts at "diff --git " and
|
|
581
|
+
// ends at the next "diff --git " (or EOF).
|
|
582
|
+
export function splitDiffByFile(diff) {
|
|
583
|
+
const out = [];
|
|
584
|
+
const headerRe = /^diff --git a\/(.+?) b\/(.+?)$/;
|
|
585
|
+
const lines = diff.split("\n");
|
|
586
|
+
let current = [];
|
|
587
|
+
let currentPath = null;
|
|
588
|
+
function flush() {
|
|
589
|
+
if (current.length === 0)
|
|
590
|
+
return;
|
|
591
|
+
const text = current.join("\n") + (current[current.length - 1] === "" ? "" : "\n");
|
|
592
|
+
out.push({ path: currentPath, text });
|
|
593
|
+
current = [];
|
|
594
|
+
currentPath = null;
|
|
595
|
+
}
|
|
596
|
+
for (const line of lines) {
|
|
597
|
+
if (line.startsWith("diff --git ")) {
|
|
598
|
+
flush();
|
|
599
|
+
const m = headerRe.exec(line);
|
|
600
|
+
currentPath = m?.[2] ?? null;
|
|
601
|
+
}
|
|
602
|
+
current.push(line);
|
|
603
|
+
}
|
|
604
|
+
flush();
|
|
605
|
+
return out;
|
|
606
|
+
}
|
|
607
|
+
// ---------------------------------------------------------------------------
|
|
608
|
+
// Utilities
|
|
609
|
+
// ---------------------------------------------------------------------------
|
|
610
|
+
function countAddedRemoved(diff) {
|
|
611
|
+
let added = 0;
|
|
612
|
+
let removed = 0;
|
|
613
|
+
for (const line of diff.split("\n")) {
|
|
614
|
+
if (line.startsWith("+++ ") || line.startsWith("--- "))
|
|
615
|
+
continue;
|
|
616
|
+
if (line.startsWith("+"))
|
|
617
|
+
added++;
|
|
618
|
+
else if (line.startsWith("-"))
|
|
619
|
+
removed++;
|
|
620
|
+
}
|
|
621
|
+
return { added, removed };
|
|
622
|
+
}
|
|
623
|
+
function sha256(input) {
|
|
624
|
+
return createHash("sha256").update(input).digest("hex");
|
|
625
|
+
}
|
|
626
|
+
//# sourceMappingURL=lockfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/compact/lockfile.ts"],"names":[],"mappings":"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"}
|