@heyditto/cli 2.32.3 → 2.34.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.
@@ -0,0 +1,360 @@
1
+ import { createHash } from "node:crypto";
2
+ import { spawn } from "node:child_process";
3
+ import { constants } from "node:fs";
4
+ import { lstat, open, realpath } from "node:fs/promises";
5
+ import path from "node:path";
6
+ export const LOCAL_REVIEW_MAX_BYTES = 16 * 1024 * 1024;
7
+ export const LOCAL_REVIEW_MAX_FILES = 4096;
8
+ export const LOCAL_REVIEW_MAX_JSON_BYTES = 24 * 1024 * 1024;
9
+ const utf8 = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
10
+ const order = (a, b) => Buffer.compare(Buffer.from(a), Buffer.from(b));
11
+ /** Git is only ever queried. In particular capture does not write the index,
12
+ * create commits, stash changes, invoke hooks, or use external diff drivers. */
13
+ export async function reviewGit(cwd, args, input, signal) {
14
+ const filterConfig = [];
15
+ if (args[0] === "diff") {
16
+ // --no-ext-diff/--no-textconv do not disable clean/process filters. Read
17
+ // names only (never credential/config values) and override each configured
18
+ // driver for this invocation, so preview cannot run Git LFS or custom code.
19
+ const keys = await reviewGit(cwd, ["config", "--null", "--name-only", "--list"], undefined, signal);
20
+ const drivers = new Set();
21
+ // Config subsections are arbitrary bytes, unlike snapshot paths. Match
22
+ // the ASCII filter framing before UTF-8 decoding, ignoring unrelated keys.
23
+ // A matching driver's bytes must round-trip exactly for safe -c overrides.
24
+ for (const key of keys.toString("latin1").split("\0")) {
25
+ const driver = /^filter\.([\s\S]*)\.(?:clean|smudge|process|required)$/i.exec(key)?.[1];
26
+ if (driver === undefined)
27
+ continue;
28
+ // Git splits each -c argument at its first '='; such a subsection
29
+ // cannot be overridden exactly, so never proceed to a diff with it.
30
+ if (driver.includes("="))
31
+ throw new Error("local review cannot safely disable a Git filter driver whose name contains '='; fix that filter configuration before retrying");
32
+ try {
33
+ drivers.add(utf8.decode(Buffer.from(driver, "latin1")));
34
+ }
35
+ catch {
36
+ throw new Error("local review cannot safely disable a non-UTF-8 Git filter driver; fix that filter configuration before retrying");
37
+ }
38
+ }
39
+ for (const driver of drivers)
40
+ for (const [setting, value] of [["clean", ""], ["smudge", ""], ["process", ""], ["required", "false"]])
41
+ filterConfig.push("-c", `filter.${driver}.${setting}=${value}`);
42
+ }
43
+ return new Promise((resolve, reject) => {
44
+ const child = spawn("git", ["-c", "core.fsmonitor=false", ...filterConfig, ...args], {
45
+ cwd, env: { ...process.env, GIT_OPTIONAL_LOCKS: "0", GIT_NO_LAZY_FETCH: "1", GIT_TERMINAL_PROMPT: "0" }, stdio: ["pipe", "pipe", "pipe"], signal,
46
+ });
47
+ const chunks = [], errors = [];
48
+ let size = 0, overflow = false;
49
+ child.stdout.on("data", (chunk) => {
50
+ size += chunk.length;
51
+ if (size > 40 * 1024 * 1024) {
52
+ overflow = true;
53
+ child.kill();
54
+ }
55
+ else
56
+ chunks.push(chunk);
57
+ });
58
+ child.stderr.on("data", (chunk) => { if (errors.reduce((n, c) => n + c.length, 0) < 4000)
59
+ errors.push(chunk); });
60
+ child.on("error", reject);
61
+ child.stdin.on("error", () => { });
62
+ child.on("close", (code) => {
63
+ if (overflow)
64
+ return reject(new Error("git output exceeds the local review capture limit"));
65
+ if (code !== 0)
66
+ return reject(new Error(`git ${args[0]} failed: ${Buffer.concat(errors).toString("utf8").trim().slice(0, 500)}`));
67
+ resolve(Buffer.concat(chunks));
68
+ });
69
+ child.stdin.end(input);
70
+ });
71
+ }
72
+ function names(data) {
73
+ try {
74
+ return utf8.decode(data).split("\0").filter(Boolean);
75
+ }
76
+ catch {
77
+ throw new Error("local review requires UTF-8 Git paths; unsupported names abort capture before upload rather than changing or omitting path identity");
78
+ }
79
+ }
80
+ function safePath(file) {
81
+ if (!file || Buffer.byteLength(file) > 1024 || /[\0\r\n\\:]/.test(file) || file.startsWith("/"))
82
+ throw new Error("unsupported path in local review snapshot");
83
+ if (file.split("/").some(p => !p || p === "." || p === ".." || p.toLowerCase() === ".git"))
84
+ throw new Error("unsafe path in local review snapshot");
85
+ }
86
+ async function entries(cwd, ref, index, signal) {
87
+ if (!index && !ref)
88
+ return new Map();
89
+ const rows = names(await reviewGit(cwd, index ? ["ls-files", "--stage", "-z"] : ["ls-tree", "-rz", "--full-tree", ref], undefined, signal));
90
+ const out = new Map();
91
+ for (const row of rows) {
92
+ const tab = row.indexOf("\t");
93
+ if (tab < 0)
94
+ throw new Error("invalid git tree entry");
95
+ const fields = row.slice(0, tab).split(" "), file = row.slice(tab + 1);
96
+ safePath(file);
97
+ if (index && fields[2] !== "0")
98
+ throw new Error("resolve unmerged index entries before reviewing a working diff");
99
+ out.set(file, { mode: fields[0], oid: fields[index ? 1 : 2] });
100
+ }
101
+ return out;
102
+ }
103
+ async function objectSizes(cwd, ids, signal) {
104
+ const out = new Map();
105
+ if (!ids.length)
106
+ return out;
107
+ const rows = (await reviewGit(cwd, ["cat-file", "--batch-check=%(objectname) %(objecttype) %(objectsize)"], ids.join("\n") + "\n", signal)).toString("ascii").trim().split("\n");
108
+ for (const row of rows) {
109
+ const [id, type, size] = row.split(" ");
110
+ if (type !== "blob" || !/^\d+$/.test(size))
111
+ throw new Error("local review requires available Git blob objects; materialize missing objects manually before retrying (capture never fetches)");
112
+ out.set(id, Number(size));
113
+ }
114
+ return out;
115
+ }
116
+ async function blobs(cwd, ids, signal) {
117
+ const out = new Map();
118
+ if (!ids.length)
119
+ return out;
120
+ const data = await reviewGit(cwd, ["cat-file", "--batch"], ids.join("\n") + "\n", signal);
121
+ let offset = 0;
122
+ for (const expected of ids) {
123
+ const end = data.indexOf(10, offset);
124
+ if (end < 0)
125
+ throw new Error("truncated Git object response");
126
+ const [id, type, rawSize] = data.subarray(offset, end).toString("ascii").split(" ");
127
+ const size = Number(rawSize), start = end + 1;
128
+ if (id !== expected || type !== "blob" || !Number.isSafeInteger(size) || size < 0 || start + size >= data.length || data[start + size] !== 10)
129
+ throw new Error("invalid Git object response");
130
+ out.set(id, data.subarray(start, start + size));
131
+ offset = start + size + 1;
132
+ }
133
+ if (offset !== data.length)
134
+ throw new Error("unexpected trailing Git object response");
135
+ return out;
136
+ }
137
+ class SkipFile extends Error {
138
+ }
139
+ /** Reject symlinks (including parent directories); do not follow them outside
140
+ * the checkout. Verify the opened inode and stat again after reading. */
141
+ async function workingFile(root, file, read) {
142
+ const absolute = path.join(root, file);
143
+ let before;
144
+ try {
145
+ let parent = root;
146
+ for (const part of file.split("/").slice(0, -1)) {
147
+ parent = path.join(parent, part);
148
+ const stat = await lstat(parent);
149
+ if (stat.isFile())
150
+ return undefined; // A tracked directory was replaced by a file.
151
+ if (stat.isSymbolicLink() || !stat.isDirectory())
152
+ throw new SkipFile("symlink or non-directory parent");
153
+ }
154
+ before = await lstat(absolute);
155
+ }
156
+ catch (error) {
157
+ if (["ENOENT", "ENOTDIR"].includes(error.code ?? ""))
158
+ return undefined;
159
+ throw error;
160
+ }
161
+ if (before.isDirectory())
162
+ return undefined; // A tracked file was replaced by a directory.
163
+ if (!before.isFile() || before.isSymbolicLink())
164
+ throw new SkipFile("symlink or non-regular file");
165
+ const mode = (before.mode & 0o111) ? "100755" : "100644";
166
+ if (!read)
167
+ return { size: before.size, mode };
168
+ const handle = await open(absolute, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
169
+ try {
170
+ const opened = await handle.stat();
171
+ if (!opened.isFile() || opened.dev !== before.dev || opened.ino !== before.ino || opened.size !== before.size)
172
+ throw new Error(`file changed while capturing ${file}; retry the review`);
173
+ if (opened.size > LOCAL_REVIEW_MAX_BYTES)
174
+ throw new Error(`file is too large for local review: ${file}`);
175
+ const data = await handle.readFile();
176
+ const after = await handle.stat(), named = await lstat(absolute);
177
+ const resolved = await realpath(absolute);
178
+ if (!resolved.startsWith(root + path.sep) || named.isSymbolicLink() || named.dev !== opened.dev || named.ino !== opened.ino || after.size !== opened.size || after.mtimeMs !== opened.mtimeMs || after.ctimeMs !== opened.ctimeMs || data.length !== opened.size)
179
+ throw new Error(`file changed while capturing ${file}; retry the review`);
180
+ return { size: data.length, mode, data };
181
+ }
182
+ finally {
183
+ await handle.close();
184
+ }
185
+ }
186
+ function textFile(data) {
187
+ if (data.includes(0))
188
+ return false;
189
+ try {
190
+ utf8.decode(data);
191
+ return true;
192
+ }
193
+ catch {
194
+ return false;
195
+ }
196
+ }
197
+ export function snapshotDigest(snapshot) {
198
+ const hash = createHash("sha256");
199
+ hash.update(`ditto-review-local-v1\0${snapshot.mode}\0${snapshot.baseSha ?? ""}\0`);
200
+ for (const [tree, files] of [["base", snapshot.baseFiles], ["head", snapshot.headFiles]]) {
201
+ for (const file of [...files].sort((a, b) => order(a.path, b.path)))
202
+ hash.update(`${tree}\0${file.path}\0${file.mode || "100644"}\0${file.contentBase64}\0`);
203
+ }
204
+ for (const file of [...snapshot.changedPaths].sort(order))
205
+ hash.update(`changed\0${file}\0`);
206
+ for (const file of [...snapshot.omittedContext].sort(order))
207
+ hash.update(`omitted\0${file}\0`);
208
+ hash.update(`context\0${snapshot.contextComplete}\0`);
209
+ for (const skip of [...snapshot.skipped].sort((a, b) => order(a.path, b.path) || order(a.reason, b.reason)))
210
+ hash.update(`skip\0${skip.path}\0${skip.reason}\0`);
211
+ return hash.digest("hex");
212
+ }
213
+ export async function captureReviewSnapshot(options = {}) {
214
+ if (options.staged && options.base)
215
+ throw new Error("--staged and --base cannot be used together");
216
+ const root = await realpath(utf8.decode(await reviewGit(options.cwd ?? process.cwd(), ["rev-parse", "--show-toplevel"], undefined, options.signal)).replace(/\r?\n$/, ""));
217
+ let head;
218
+ try {
219
+ head = (await reviewGit(root, ["rev-parse", "--verify", "HEAD"], undefined, options.signal)).toString("ascii").trim();
220
+ }
221
+ catch {
222
+ const branch = (await reviewGit(root, ["symbolic-ref", "-q", "HEAD"], undefined, options.signal)).toString("utf8").trim();
223
+ if ((await reviewGit(root, ["for-each-ref", "--format=%(objectname)", branch], undefined, options.signal)).length)
224
+ throw new Error("cannot resolve repository HEAD");
225
+ }
226
+ let baseSha = head;
227
+ if (options.base) {
228
+ if (!head)
229
+ throw new Error("--base requires a committed HEAD");
230
+ const ref = (await reviewGit(root, ["rev-parse", "--verify", "--end-of-options", `${options.base}^{commit}`], undefined, options.signal)).toString("ascii").trim();
231
+ baseSha = (await reviewGit(root, ["merge-base", head, ref], undefined, options.signal)).toString("ascii").trim();
232
+ }
233
+ const mode = options.staged ? "staged" : options.base ? "base" : "workspace";
234
+ let honorFileMode = true;
235
+ try {
236
+ honorFileMode = (await reviewGit(root, ["config", "--bool", "core.fileMode"], undefined, options.signal)).toString("ascii").trim() !== "false";
237
+ }
238
+ catch { /* Git's default is true. */ }
239
+ const base = await entries(root, baseSha, false, options.signal), index = await entries(root, undefined, true, options.signal);
240
+ const untracked = options.staged ? [] : names(await reviewGit(root, ["ls-files", "--others", "--exclude-standard", "-z"], undefined, options.signal));
241
+ const headPaths = new Set([...index.keys(), ...untracked]);
242
+ const changes = baseSha ? names(await reviewGit(root, ["diff", ...(options.staged ? ["--cached"] : []), "--no-ext-diff", "--no-textconv", "--no-renames", "--name-only", "-z", baseSha, "--"], undefined, options.signal)) : [...headPaths];
243
+ const changedPaths = [...new Set([...changes, ...untracked])].sort(order);
244
+ if (changedPaths.length > LOCAL_REVIEW_MAX_FILES)
245
+ throw new Error("changed paths exceed the local review limit of 4096; narrow the diff");
246
+ const changed = new Set(changedPaths);
247
+ const all = [...new Set([...base.keys(), ...headPaths])];
248
+ all.forEach(safePath);
249
+ const regular = (entry) => !!entry && (entry.mode === "100644" || entry.mode === "100755");
250
+ const ids = [...new Set([...base.values(), ...(options.staged ? index.values() : [])].filter(regular).map(e => e.oid))];
251
+ const sizes = await objectSizes(root, ids, options.signal);
252
+ const metadata = new Map();
253
+ const skipped = [];
254
+ for (const file of all) {
255
+ if (options.signal?.aborted)
256
+ throw options.signal.reason;
257
+ const b = base.get(file), h = index.get(file);
258
+ if ((b && !regular(b)) || (headPaths.has(file) && h && !regular(h))) {
259
+ skipped.push({ path: file, reason: "symlink or submodule" });
260
+ continue;
261
+ }
262
+ try {
263
+ const working = !options.staged && changed.has(file) && headPaths.has(file) ? await workingFile(root, file, false) : undefined;
264
+ // Unchanged surrounding context intentionally comes from the pinned
265
+ // comparison tree. Avoid thousands of live reads (and attribute/filter
266
+ // execution) for bytes Git did not select as changes.
267
+ metadata.set(file, { baseSize: b ? sizes.get(b.oid) : 0, headSize: options.staged ? (h ? sizes.get(h.oid) : 0) : changed.has(file) ? (working?.size ?? 0) : b ? sizes.get(b.oid) : 0 });
268
+ }
269
+ catch (error) {
270
+ if (error instanceof SkipFile)
271
+ skipped.push({ path: file, reason: error.message });
272
+ else
273
+ throw error;
274
+ }
275
+ }
276
+ const distance = (file) => {
277
+ const parts = file.split("/");
278
+ return Math.min(...changedPaths.map(p => { const target = p.split("/"); let n = 0; while (n < parts.length - 1 && n < target.length - 1 && parts[n] === target[n])
279
+ n++; return parts.length + target.length - 2 * n; }), 10000);
280
+ };
281
+ const prioritized = all.filter(f => metadata.has(f)).sort((a, b) => Number(changed.has(b)) - Number(changed.has(a)) || distance(a) - distance(b) || order(a, b));
282
+ let total = 0, baseCount = 0, headCount = 0;
283
+ const selected = [], omittedContext = [];
284
+ for (const file of prioritized) {
285
+ const size = metadata.get(file);
286
+ const nextBase = baseCount + Number(base.has(file)), nextHead = headCount + Number(headPaths.has(file));
287
+ if (total + size.baseSize + size.headSize > LOCAL_REVIEW_MAX_BYTES || nextBase > LOCAL_REVIEW_MAX_FILES || nextHead > LOCAL_REVIEW_MAX_FILES) {
288
+ if (changed.has(file))
289
+ throw new Error(`changed files exceed local review limits (16 MiB, 4096 files/tree); narrow the diff before reviewing: ${file}`);
290
+ omittedContext.push(file);
291
+ continue;
292
+ }
293
+ selected.push(file);
294
+ total += size.baseSize + size.headSize;
295
+ baseCount = nextBase;
296
+ headCount = nextHead;
297
+ }
298
+ const selectedIds = [...new Set(selected.flatMap(file => [base.get(file), ...(options.staged ? [index.get(file)] : [])].filter((e) => regular(e)).map(e => e.oid)))];
299
+ const content = await blobs(root, selectedIds, options.signal);
300
+ const baseFiles = [], headFiles = [];
301
+ for (const file of selected) {
302
+ const b = base.get(file), h = index.get(file);
303
+ const before = b ? content.get(b.oid) : undefined;
304
+ let after, headMode = "100644";
305
+ try {
306
+ if (options.staged) {
307
+ after = h ? content.get(h.oid) : undefined;
308
+ headMode = h?.mode ?? "100644";
309
+ }
310
+ else if (!changed.has(file)) {
311
+ after = before;
312
+ headMode = b?.mode ?? "100644";
313
+ }
314
+ else if (headPaths.has(file)) {
315
+ const value = await workingFile(root, file, true);
316
+ after = value?.data;
317
+ headMode = honorFileMode ? value?.mode ?? "100644" : h?.mode ?? "100644";
318
+ }
319
+ }
320
+ catch (error) {
321
+ if (error instanceof SkipFile) {
322
+ skipped.push({ path: file, reason: error.message });
323
+ continue;
324
+ }
325
+ throw error;
326
+ }
327
+ if ((before && !textFile(before)) || (after && !textFile(after))) {
328
+ skipped.push({ path: file, reason: "binary or non-UTF-8 file" });
329
+ continue;
330
+ }
331
+ if (before)
332
+ baseFiles.push({ path: file, contentBase64: before.toString("base64"), mode: b.mode });
333
+ if (after)
334
+ headFiles.push({ path: file, contentBase64: after.toString("base64"), mode: headMode });
335
+ }
336
+ baseFiles.sort((a, b) => order(a.path, b.path));
337
+ headFiles.sort((a, b) => order(a.path, b.path));
338
+ omittedContext.sort(order);
339
+ skipped.sort((a, b) => order(a.path, b.path) || order(a.reason, b.reason));
340
+ // Git attributes can normalize worktree bytes (for example CRLF) or ignore
341
+ // file mode. Scope identifies the actual sealed trees, not a lossy name list.
342
+ const baseline = new Map(baseFiles.map(f => [f.path, f]));
343
+ const current = new Map(headFiles.map(f => [f.path, f]));
344
+ const capturedChanges = [...new Set([...baseline.keys(), ...current.keys()])].filter(file => {
345
+ const b = baseline.get(file), h = current.get(file);
346
+ return !b || !h || b.contentBase64 !== h.contentBase64 || b.mode !== h.mode;
347
+ });
348
+ const sealedChanges = [...new Set([...capturedChanges, ...skipped.filter(f => changed.has(f.path)).map(f => f.path)])].sort(order);
349
+ if (sealedChanges.length > LOCAL_REVIEW_MAX_FILES || omittedContext.length > 20000 || skipped.length > 20000)
350
+ throw new Error("local review manifest exceeds path limits; narrow the diff");
351
+ const bytes = [...baseFiles, ...headFiles].reduce((n, f) => n + Buffer.byteLength(f.contentBase64, "base64"), 0);
352
+ if (bytes > LOCAL_REVIEW_MAX_BYTES)
353
+ throw new Error("files grew beyond the local review content limit during capture; retry with a smaller diff");
354
+ const snapshot = { version: 1, mode, ...(options.base ? { baseRef: options.base } : {}), ...(baseSha ? { baseSha } : {}), digest: "", baseFiles, headFiles, changedPaths: sealedChanges, contextComplete: omittedContext.length === 0 && skipped.length === 0, omittedContext, skipped };
355
+ snapshot.digest = snapshotDigest(snapshot);
356
+ if (Buffer.byteLength(JSON.stringify(snapshot)) > LOCAL_REVIEW_MAX_JSON_BYTES)
357
+ throw new Error("local review snapshot exceeds the 24 MiB transport limit; narrow the diff");
358
+ return { root, snapshot, bytes };
359
+ }
360
+ //# sourceMappingURL=review-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-snapshot.js","sourceRoot":"","sources":["../src/review-snapshot.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@heyditto/cli",
3
- "version": "2.32.3",
3
+ "version": "2.34.0",
4
4
  "description": "Ditto Memory CLI — save, search, fetch, and traverse the Ditto memory graph from the shell.",
5
5
  "type": "module",
6
6
  "bin": {