@indigoai-us/hq-cloud 6.15.16 → 6.15.17

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,315 @@
1
+ /**
2
+ * Regression test for `hq rescue` clobbering root-level ignore files.
3
+ *
4
+ * The bug: `.gitignore` / `.hqignore` (and friends) are release-shipped, so the
5
+ * generic USER-EDIT classifier moved a locally-tuned copy into `personal/` as a
6
+ * `.drift-<ts>-<pid>` archive and let the overlay lay the release copy down. On
7
+ * a real HQ root that silently dropped the operator's exclusion rules: the git
8
+ * mirror started walking a 62 GB `workspace/` again (killed at its 120s
9
+ * timeout, every pass), and the sync engine walked far more than intended until
10
+ * its 15-minute STS credentials expired mid-run — surfacing as a red
11
+ * "Sync failed" in the desktop app.
12
+ *
13
+ * These files are machine-local tuning, not scaffold: a rescue must never
14
+ * overwrite an edited one. The fix classifies an edited root ignore file as
15
+ * KEEP-LOCAL — left untouched on disk and excluded from the overlay — while an
16
+ * unedited one still tracks the release, and every other user-edited file is
17
+ * still rescued into `personal/` exactly as before.
18
+ *
19
+ * Runs the real (non-dry-run) rescue so the assertions are about bytes on disk,
20
+ * not just the classifier's log line. The rescue clones its source from GitHub,
21
+ * so we shim `git clone` to clone a local fixture repo instead.
22
+ */
23
+ import { describe, it, expect, beforeAll, afterAll } from "vitest";
24
+ import { execFileSync } from "child_process";
25
+ import * as fs from "fs";
26
+ import * as os from "os";
27
+ import * as path from "path";
28
+ import { runRescue } from "./rescue-core.js";
29
+ function has(bin, ...args) {
30
+ try {
31
+ execFileSync(bin, args, { stdio: "ignore" });
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ // Needs git (fixture + clone) and rsync (overlay).
39
+ const toolsAvailable = has("git", "--version") && has("rsync", "--version");
40
+ /**
41
+ * Env for a fixture run. `GH_TOKEN`/`GITHUB_TOKEN` are stripped on purpose: with
42
+ * one set, the rescue clones `https://x-access-token:<token>@github.com/...`,
43
+ * which the `https://github.com/*` shim pattern does not rewrite — the test
44
+ * would then leave its fixture and attempt a real authenticated network clone.
45
+ */
46
+ function fixtureEnv(shimDir) {
47
+ const env = {
48
+ ...process.env,
49
+ PATH: `${shimDir}:${process.env.PATH ?? ""}`,
50
+ };
51
+ delete env.GH_TOKEN;
52
+ delete env.GITHUB_TOKEN;
53
+ return env;
54
+ }
55
+ /** Run the rescue in-process, capturing its stdout/stderr. */
56
+ function runRescueCapture(argv, env) {
57
+ let stdout = "";
58
+ let stderr = "";
59
+ const origOut = process.stdout.write.bind(process.stdout);
60
+ const origErr = process.stderr.write.bind(process.stderr);
61
+ process.stdout.write = ((chunk) => {
62
+ stdout += String(chunk);
63
+ return true;
64
+ });
65
+ process.stderr.write = ((chunk) => {
66
+ stderr += String(chunk);
67
+ return true;
68
+ });
69
+ let status;
70
+ try {
71
+ status = runRescue(argv, { env }).status;
72
+ }
73
+ finally {
74
+ process.stdout.write = origOut;
75
+ process.stderr.write = origErr;
76
+ }
77
+ return { status, stdout, stderr };
78
+ }
79
+ describe.skipIf(!toolsAvailable)("rescue keeps locally-edited root ignore files", () => {
80
+ let workDir;
81
+ let upstream;
82
+ let hqRoot;
83
+ let shimDir;
84
+ let floorSha;
85
+ let out = "";
86
+ const git = (cwd, ...args) => execFileSync("git", args, {
87
+ cwd,
88
+ stdio: ["ignore", "pipe", "pipe"],
89
+ env: {
90
+ ...process.env,
91
+ GIT_AUTHOR_NAME: "t",
92
+ GIT_AUTHOR_EMAIL: "t@t",
93
+ GIT_COMMITTER_NAME: "t",
94
+ GIT_COMMITTER_EMAIL: "t@t",
95
+ },
96
+ })
97
+ .toString()
98
+ .trim();
99
+ const read = (rel) => fs.readFileSync(path.join(hqRoot, rel), "utf-8");
100
+ beforeAll(() => {
101
+ workDir = fs.mkdtempSync(path.join(os.tmpdir(), "hq-rescue-ignore-"));
102
+ // --- upstream: floor commit, then a HEAD that advances every ignore file --
103
+ upstream = path.join(workDir, "upstream");
104
+ fs.mkdirSync(path.join(upstream, "core/docs"), { recursive: true });
105
+ git(workDir, "init", "-b", "main", "upstream");
106
+ fs.writeFileSync(path.join(upstream, ".gitignore"), "release-git\n");
107
+ fs.writeFileSync(path.join(upstream, ".hqignore"), "release-hq\n");
108
+ fs.writeFileSync(path.join(upstream, ".claudeignore"), "release-claude\n");
109
+ fs.writeFileSync(path.join(upstream, ".hqinclude"), "release-include\n");
110
+ fs.writeFileSync(path.join(upstream, "core/docs/.gitignore"), "release-nested\n");
111
+ fs.writeFileSync(path.join(upstream, "core/edited.md"), "base\n");
112
+ git(upstream, "add", "-A");
113
+ git(upstream, "commit", "-m", "floor");
114
+ floorSha = git(upstream, "rev-parse", "HEAD");
115
+ // HEAD moves all four ignore files on, so "release wins" is observable.
116
+ fs.writeFileSync(path.join(upstream, ".gitignore"), "release-git\nv2\n");
117
+ fs.writeFileSync(path.join(upstream, ".hqignore"), "release-hq\nv2\n");
118
+ fs.writeFileSync(path.join(upstream, ".claudeignore"), "release-claude\nv2\n");
119
+ fs.writeFileSync(path.join(upstream, ".hqinclude"), "release-include\nv2\n");
120
+ fs.writeFileSync(path.join(upstream, "core/docs/.gitignore"), "release-nested\nv2\n");
121
+ git(upstream, "add", "-A");
122
+ git(upstream, "commit", "-m", "head");
123
+ // --- the local HQ root being rescued ------------------------------------
124
+ hqRoot = path.join(workDir, "hq");
125
+ fs.mkdirSync(path.join(hqRoot, "core/docs"), { recursive: true });
126
+ // `companies/` + `personal/` make it look like an HQ root (script guard).
127
+ fs.mkdirSync(path.join(hqRoot, "personal"), { recursive: true });
128
+ fs.mkdirSync(path.join(hqRoot, "companies"), { recursive: true });
129
+ // Root ignore files the operator tuned: differ from BOTH floor and HEAD.
130
+ // These are the regression — they must survive byte-for-byte.
131
+ fs.writeFileSync(path.join(hqRoot, ".gitignore"), "release-git\n/workspace/\n");
132
+ fs.writeFileSync(path.join(hqRoot, ".hqignore"), "release-hq\n*.mp4\n");
133
+ // Untouched root ignore file (matches floor): still tracks the release.
134
+ fs.writeFileSync(path.join(hqRoot, ".claudeignore"), "release-claude\n");
135
+ // A NESTED .gitignore is scaffold, not machine-local tuning: still rescued.
136
+ fs.writeFileSync(path.join(hqRoot, "core/docs/.gitignore"), "release-nested\nMINE\n");
137
+ // A root ignore file managed through a symlink (dotfiles repo): the
138
+ // generic top-level-symlink arm used to `skip` it, after which `rsync -a`
139
+ // replaced the receiver symlink with the release's regular file.
140
+ fs.writeFileSync(path.join(hqRoot, "personal/my-hqinclude"), "from-dotfiles\n");
141
+ fs.symlinkSync("personal/my-hqinclude", path.join(hqRoot, ".hqinclude"));
142
+ // Control: an ordinary user-edited file is still rescued into personal/.
143
+ fs.writeFileSync(path.join(hqRoot, "core/edited.md"), "MINE\n");
144
+ // --- git shim: rewrite `git clone <github-url> dest` to the fixture ------
145
+ const realGit = execFileSync("bash", ["-lc", "command -v git"]).toString().trim() ||
146
+ "/usr/bin/git";
147
+ shimDir = path.join(workDir, "shim");
148
+ fs.mkdirSync(shimDir, { recursive: true });
149
+ const shim = `#!/usr/bin/env bash
150
+ if [ "$1" = "clone" ]; then
151
+ args=()
152
+ for a in "$@"; do
153
+ case "$a" in
154
+ https://github.com/*) a=${JSON.stringify(upstream)} ;;
155
+ esac
156
+ args+=("$a")
157
+ done
158
+ exec ${JSON.stringify(realGit)} "\${args[@]}"
159
+ fi
160
+ exec ${JSON.stringify(realGit)} "$@"
161
+ `;
162
+ fs.writeFileSync(path.join(shimDir, "git"), shim, { mode: 0o755 });
163
+ const env = fixtureEnv(shimDir);
164
+ // --- run the real rescue (non-dry-run) ----------------------------------
165
+ const r = runRescueCapture([
166
+ "--hq-root",
167
+ hqRoot,
168
+ "--source",
169
+ "test/repo",
170
+ "--ref",
171
+ "main",
172
+ "--floor-sha",
173
+ floorSha,
174
+ "--yes",
175
+ "--no-backup",
176
+ ], env);
177
+ out = `${r.stdout}\n${r.stderr}`;
178
+ if (r.status !== 0)
179
+ throw new Error(`rescue failed (${r.status}):\n${out}`);
180
+ });
181
+ afterAll(() => {
182
+ if (workDir)
183
+ fs.rmSync(workDir, { recursive: true, force: true });
184
+ });
185
+ it("ran in history_floor mode against our floor", () => {
186
+ expect(out).toContain(`Baseline: ${floorSha}`);
187
+ });
188
+ it("leaves an edited root .gitignore byte-for-byte intact (the regression)", () => {
189
+ expect(read(".gitignore")).toBe("release-git\n/workspace/\n");
190
+ });
191
+ it("leaves an edited root .hqignore byte-for-byte intact (the regression)", () => {
192
+ expect(read(".hqignore")).toBe("release-hq\n*.mp4\n");
193
+ });
194
+ it("does not archive edited root ignore files into personal/", () => {
195
+ const litter = fs
196
+ .readdirSync(path.join(hqRoot, "personal"))
197
+ .filter((n) => n.startsWith(".gitignore") || n.startsWith(".hqignore"));
198
+ expect(litter, `unexpected personal/ archive: ${litter.join(", ")}`).toEqual([]);
199
+ });
200
+ it("reports edited root ignore files as keep-local, not rescue", () => {
201
+ expect(out).toContain("kept local: .gitignore");
202
+ expect(out).toContain("kept local: .hqignore");
203
+ expect(out).not.toMatch(/rescued: \.gitignore/);
204
+ expect(out).not.toMatch(/rescued: \.hqignore/);
205
+ expect(out).toMatch(/user-edit\s+\(kept local\):\s+3 files/);
206
+ expect(out).toMatch(/kept-local: 3/);
207
+ });
208
+ it("preserves a root ignore file managed as a symlink", () => {
209
+ const p = path.join(hqRoot, ".hqinclude");
210
+ expect(fs.lstatSync(p).isSymbolicLink(), ".hqinclude is no longer a symlink").toBe(true);
211
+ expect(fs.readlinkSync(p)).toBe("personal/my-hqinclude");
212
+ expect(fs.readFileSync(p, "utf-8")).toBe("from-dotfiles\n");
213
+ expect(out).toContain("kept local: .hqinclude");
214
+ });
215
+ it("still ships release updates for an UNEDITED root ignore file", () => {
216
+ expect(read(".claudeignore")).toBe("release-claude\nv2\n");
217
+ });
218
+ it("still rescues a user-edited NESTED .gitignore (carve-out is root-only)", () => {
219
+ expect(read("core/docs/.gitignore")).toBe("release-nested\nv2\n");
220
+ expect(fs.readFileSync(path.join(hqRoot, "personal/docs/.gitignore"), "utf-8")).toBe("release-nested\nMINE\n");
221
+ });
222
+ it("still rescues an ordinary user-edited file into personal/", () => {
223
+ expect(fs.readFileSync(path.join(hqRoot, "personal/edited.md"), "utf-8")).toBe("MINE\n");
224
+ expect(out).toContain("rescued: core/edited.md -> personal/edited.md");
225
+ });
226
+ });
227
+ /**
228
+ * KEEP-LOCAL must require *proof* that the operator edited the file, which only
229
+ * a floor comparison provides. In `head_compare` mode — first-ever run, a
230
+ * missing or unreachable last-sync stamp, `--no-history-check` — "differs from
231
+ * HEAD" is all we know, and an untouched ignore file from an older release
232
+ * looks identical to an edited one. Keeping it there would pin a stale file
233
+ * locally forever instead of letting it track the release, so this mode falls
234
+ * back to the pre-existing rescue behaviour.
235
+ */
236
+ describe.skipIf(!toolsAvailable)("rescue keep-local requires a floor-proven edit", () => {
237
+ let workDir;
238
+ let hqRoot;
239
+ let out = "";
240
+ const git = (cwd, ...args) => execFileSync("git", args, {
241
+ cwd,
242
+ stdio: ["ignore", "pipe", "pipe"],
243
+ env: {
244
+ ...process.env,
245
+ GIT_AUTHOR_NAME: "t",
246
+ GIT_AUTHOR_EMAIL: "t@t",
247
+ GIT_COMMITTER_NAME: "t",
248
+ GIT_COMMITTER_EMAIL: "t@t",
249
+ },
250
+ })
251
+ .toString()
252
+ .trim();
253
+ beforeAll(() => {
254
+ workDir = fs.mkdtempSync(path.join(os.tmpdir(), "hq-rescue-nofloor-"));
255
+ const upstream = path.join(workDir, "upstream");
256
+ fs.mkdirSync(upstream, { recursive: true });
257
+ git(workDir, "init", "-b", "main", "upstream");
258
+ fs.writeFileSync(path.join(upstream, ".gitignore"), "release-git\nv2\n");
259
+ git(upstream, "add", "-A");
260
+ git(upstream, "commit", "-m", "head");
261
+ hqRoot = path.join(workDir, "hq");
262
+ fs.mkdirSync(path.join(hqRoot, "personal"), { recursive: true });
263
+ fs.mkdirSync(path.join(hqRoot, "companies"), { recursive: true });
264
+ // Stale-but-untouched: an older release's copy, indistinguishable from an
265
+ // edit without a floor to compare against.
266
+ fs.writeFileSync(path.join(hqRoot, ".gitignore"), "release-git\n");
267
+ const realGit = execFileSync("bash", ["-lc", "command -v git"]).toString().trim() ||
268
+ "/usr/bin/git";
269
+ const shimDir = path.join(workDir, "shim");
270
+ fs.mkdirSync(shimDir, { recursive: true });
271
+ fs.writeFileSync(path.join(shimDir, "git"), `#!/usr/bin/env bash
272
+ if [ "$1" = "clone" ]; then
273
+ args=()
274
+ for a in "$@"; do
275
+ case "$a" in
276
+ https://github.com/*) a=${JSON.stringify(upstream)} ;;
277
+ esac
278
+ args+=("$a")
279
+ done
280
+ exec ${JSON.stringify(realGit)} "\${args[@]}"
281
+ fi
282
+ exec ${JSON.stringify(realGit)} "$@"
283
+ `, { mode: 0o755 });
284
+ // No --floor-sha: the rescue falls back to head_compare.
285
+ const r = runRescueCapture([
286
+ "--hq-root",
287
+ hqRoot,
288
+ "--source",
289
+ "test/repo",
290
+ "--ref",
291
+ "main",
292
+ "--no-history-check",
293
+ "--yes",
294
+ "--no-backup",
295
+ ], fixtureEnv(shimDir));
296
+ out = `${r.stdout}\n${r.stderr}`;
297
+ if (r.status !== 0)
298
+ throw new Error(`rescue failed (${r.status}):\n${out}`);
299
+ });
300
+ afterAll(() => {
301
+ if (workDir)
302
+ fs.rmSync(workDir, { recursive: true, force: true });
303
+ });
304
+ it("ran in head_compare mode (no usable floor)", () => {
305
+ expect(out).toContain("Baseline: HEAD compare");
306
+ });
307
+ it("does not keep-local without floor-proven evidence of an edit", () => {
308
+ expect(out).not.toContain("kept local: .gitignore");
309
+ expect(out).toMatch(/user-edit\s+\(kept local\):\s+0 files/);
310
+ });
311
+ it("lets the release update a stale root .gitignore in this mode", () => {
312
+ expect(fs.readFileSync(path.join(hqRoot, ".gitignore"), "utf-8")).toBe("release-git\nv2\n");
313
+ });
314
+ });
315
+ //# sourceMappingURL=rescue-keep-local-ignore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rescue-keep-local-ignore.test.js","sourceRoot":"","sources":["../../src/cli/rescue-keep-local-ignore.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@indigoai-us/hq-cloud",
3
- "version": "6.15.16",
3
+ "version": "6.15.17",
4
4
  "description": "HQ by Indigo cloud sync engine — bidirectional S3 sync for mobile access",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",