@indigoai-us/hq-cloud 5.48.3 → 6.0.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 (56) hide show
  1. package/dist/cli/index.d.ts +2 -2
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +2 -2
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/reindex.d.ts +23 -0
  6. package/dist/cli/reindex.d.ts.map +1 -0
  7. package/dist/cli/reindex.js +45 -0
  8. package/dist/cli/reindex.js.map +1 -0
  9. package/dist/cli/reindex.test.d.ts +11 -0
  10. package/dist/cli/reindex.test.d.ts.map +1 -0
  11. package/dist/cli/{master-sync.test.js → reindex.test.js} +15 -15
  12. package/dist/cli/reindex.test.js.map +1 -0
  13. package/dist/cli/rescue-drift-reconcile.test.d.ts +2 -0
  14. package/dist/cli/rescue-drift-reconcile.test.d.ts.map +1 -0
  15. package/dist/cli/rescue-drift-reconcile.test.js +139 -0
  16. package/dist/cli/rescue-drift-reconcile.test.js.map +1 -0
  17. package/dist/cli/rescue.d.ts.map +1 -1
  18. package/dist/cli/rescue.js +16 -1
  19. package/dist/cli/rescue.js.map +1 -1
  20. package/dist/cli/rescue.reindex.test.d.ts +2 -0
  21. package/dist/cli/rescue.reindex.test.d.ts.map +1 -0
  22. package/dist/cli/rescue.reindex.test.js +41 -0
  23. package/dist/cli/rescue.reindex.test.js.map +1 -0
  24. package/dist/cli/share.test.js +2 -2
  25. package/dist/cli/share.test.js.map +1 -1
  26. package/dist/cli/sync.d.ts +9 -0
  27. package/dist/cli/sync.d.ts.map +1 -1
  28. package/dist/cli/sync.js +17 -0
  29. package/dist/cli/sync.js.map +1 -1
  30. package/dist/cli/sync.test.js +20 -0
  31. package/dist/cli/sync.test.js.map +1 -1
  32. package/dist/index.d.ts +2 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +2 -2
  35. package/dist/index.js.map +1 -1
  36. package/package.json +1 -1
  37. package/scripts/{master-sync.sh → reindex.sh} +10 -10
  38. package/scripts/replace-rescue.sh +48 -19
  39. package/src/cli/index.ts +3 -3
  40. package/src/cli/{master-sync.test.ts → reindex.test.ts} +14 -14
  41. package/src/cli/reindex.ts +57 -0
  42. package/src/cli/rescue-drift-reconcile.test.ts +158 -0
  43. package/src/cli/rescue.reindex.test.ts +46 -0
  44. package/src/cli/rescue.ts +15 -1
  45. package/src/cli/share.test.ts +2 -2
  46. package/src/cli/sync.test.ts +23 -0
  47. package/src/cli/sync.ts +27 -0
  48. package/src/index.ts +3 -3
  49. package/dist/cli/master-sync.d.ts +0 -22
  50. package/dist/cli/master-sync.d.ts.map +0 -1
  51. package/dist/cli/master-sync.js +0 -44
  52. package/dist/cli/master-sync.js.map +0 -1
  53. package/dist/cli/master-sync.test.d.ts +0 -11
  54. package/dist/cli/master-sync.test.d.ts.map +0 -1
  55. package/dist/cli/master-sync.test.js.map +0 -1
  56. package/src/cli/master-sync.ts +0 -56
@@ -16,8 +16,8 @@ export { accept, parseToken } from "./accept.js";
16
16
  export type { AcceptOptions, AcceptResult } from "./accept.js";
17
17
  export { promote } from "./promote.js";
18
18
  export type { PromoteOptions, PromoteResult } from "./promote.js";
19
- export { masterSync, masterSyncScriptPath } from "./master-sync.js";
20
- export type { MasterSyncOptions, MasterSyncResult } from "./master-sync.js";
19
+ export { reindex, reindexScriptPath } from "./reindex.js";
20
+ export type { ReindexOptions, ReindexResult } from "./reindex.js";
21
21
  export { rescue, rescueScriptPath, buildRescueArgs } from "./rescue.js";
22
22
  export type { RescueOptions, RescueResult } from "./rescue.js";
23
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlE,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACpE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAI5E,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE5E,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC1D,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAGxF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjD,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAIlE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACxE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
package/dist/cli/index.js CHANGED
@@ -12,8 +12,8 @@ export { invite, listInvites, revokeInvite } from "./invite.js";
12
12
  export { accept, parseToken } from "./accept.js";
13
13
  export { promote } from "./promote.js";
14
14
  // Skill/personal-overlay mirroring + workers-registry regen (formerly the
15
- // hq-core master-sync.sh hook).
16
- export { masterSync, masterSyncScriptPath } from "./master-sync.js";
15
+ // hq-core master-sync.sh hook; `hq reindex`).
16
+ export { reindex, reindexScriptPath } from "./reindex.js";
17
17
  // Drift-preserving HQ-core re-sync (formerly bundled only inside the HQ Sync
18
18
  // menubar app). Now shared between the app and `hq rescue`.
19
19
  export { rescue, rescueScriptPath, buildRescueArgs } from "./rescue.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG1D,8BAA8B;AAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,0EAA0E;AAC1E,gCAAgC;AAChC,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAGpE,6EAA6E;AAC7E,4DAA4D;AAC5D,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAG1D,8BAA8B;AAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,0EAA0E;AAC1E,8CAA8C;AAC9C,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAG1D,6EAA6E;AAC7E,4DAA4D;AAC5D,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Absolute path to the bundled reindex.sh. From the compiled module at
3
+ * dist/cli/reindex.js, the package root is two levels up; the script lives
4
+ * at <package-root>/scripts/reindex.sh.
5
+ */
6
+ export declare function reindexScriptPath(): string;
7
+ export interface ReindexOptions {
8
+ /** HQ root to operate on. Defaults to process.cwd(). */
9
+ repoRoot?: string;
10
+ }
11
+ export interface ReindexResult {
12
+ /** Exit status of the underlying script (0 = success). */
13
+ status: number;
14
+ }
15
+ /**
16
+ * Run reindex against an HQ root. Synchronous — the script is cheap and
17
+ * idempotent, and callers (the hook shim, sync/rescue, tests) want the exit
18
+ * status. stdout/stderr from the script are forwarded to stderr so the
19
+ * caller's stdout stays clean (hooks must not emit stdout that the agent
20
+ * interprets).
21
+ */
22
+ export declare function reindex(opts?: ReindexOptions): ReindexResult;
23
+ //# sourceMappingURL=reindex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reindex.d.ts","sourceRoot":"","sources":["../../src/cli/reindex.ts"],"names":[],"mappings":"AAmBA;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CAAC,IAAI,GAAE,cAAmB,GAAG,aAAa,CAWhE"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * hq reindex — surfaces namespaced skills as Claude Code skill wrappers,
3
+ * mirrors personal/{knowledge,policies,workers,settings} into core/, prunes
4
+ * orphan wrappers, and regenerates the workers registry.
5
+ *
6
+ * The implementation lives in scripts/reindex.sh, shipped with this package.
7
+ * This module resolves that script relative to the package (dist/cli → package
8
+ * root) and execs it against the caller's HQ root. Historically the script ran
9
+ * directly as a Claude Code hook inside hq-core (named "master-sync"); it now
10
+ * lives here so a single copy is maintained, and the hq-core hook is a thin
11
+ * shim over `hq reindex`.
12
+ */
13
+ import { spawnSync } from "child_process";
14
+ import { fileURLToPath } from "url";
15
+ import path from "path";
16
+ const __filename = fileURLToPath(import.meta.url);
17
+ const __dirname = path.dirname(__filename);
18
+ /**
19
+ * Absolute path to the bundled reindex.sh. From the compiled module at
20
+ * dist/cli/reindex.js, the package root is two levels up; the script lives
21
+ * at <package-root>/scripts/reindex.sh.
22
+ */
23
+ export function reindexScriptPath() {
24
+ return path.resolve(__dirname, "..", "..", "scripts", "reindex.sh");
25
+ }
26
+ /**
27
+ * Run reindex against an HQ root. Synchronous — the script is cheap and
28
+ * idempotent, and callers (the hook shim, sync/rescue, tests) want the exit
29
+ * status. stdout/stderr from the script are forwarded to stderr so the
30
+ * caller's stdout stays clean (hooks must not emit stdout that the agent
31
+ * interprets).
32
+ */
33
+ export function reindex(opts = {}) {
34
+ const repoRoot = opts.repoRoot ?? process.cwd();
35
+ const script = reindexScriptPath();
36
+ const res = spawnSync("bash", [script, repoRoot], {
37
+ stdio: ["ignore", "inherit", "inherit"],
38
+ });
39
+ if (res.error) {
40
+ process.stderr.write(`reindex: failed to run ${script}: ${res.error.message}\n`);
41
+ return { status: 1 };
42
+ }
43
+ return { status: res.status ?? 1 };
44
+ }
45
+ //# sourceMappingURL=reindex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../src/cli/reindex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AACtE,CAAC;AAYD;;;;;;GAMG;AACH,MAAM,UAAU,OAAO,CAAC,OAAuB,EAAE;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;QAChD,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;KACxC,CAAC,CAAC;IACH,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QACjF,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACvB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;AACrC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Unit tests for `hq reindex` (the formerly-bash hq-core hook, now shipped
3
+ * in this package and invoked via the CLI).
4
+ *
5
+ * The logic itself lives in scripts/reindex.sh; these tests exercise it via
6
+ * the reindex() wrapper against a temp HQ tree, asserting the observable
7
+ * filesystem outcomes (skill wrappers, personal-overlay mirroring) rather than
8
+ * re-deriving the bash internals.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=reindex.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reindex.test.d.ts","sourceRoot":"","sources":["../../src/cli/reindex.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
@@ -1,9 +1,9 @@
1
1
  /**
2
- * Unit tests for `hq master-sync` (the formerly-bash hq-core hook, now shipped
2
+ * Unit tests for `hq reindex` (the formerly-bash hq-core hook, now shipped
3
3
  * in this package and invoked via the CLI).
4
4
  *
5
- * The logic itself lives in scripts/master-sync.sh; these tests exercise it via
6
- * the masterSync() wrapper against a temp HQ tree, asserting the observable
5
+ * The logic itself lives in scripts/reindex.sh; these tests exercise it via
6
+ * the reindex() wrapper against a temp HQ tree, asserting the observable
7
7
  * filesystem outcomes (skill wrappers, personal-overlay mirroring) rather than
8
8
  * re-deriving the bash internals.
9
9
  */
@@ -11,15 +11,15 @@ import { describe, it, expect, beforeEach, afterEach } from "vitest";
11
11
  import * as fs from "fs";
12
12
  import * as path from "path";
13
13
  import * as os from "os";
14
- import { masterSync, masterSyncScriptPath } from "./master-sync.js";
15
- describe("masterSyncScriptPath", () => {
14
+ import { reindex, reindexScriptPath } from "./reindex.js";
15
+ describe("reindexScriptPath", () => {
16
16
  it("resolves to the bundled script and the file exists", () => {
17
- const p = masterSyncScriptPath();
18
- expect(p.endsWith(path.join("scripts", "master-sync.sh"))).toBe(true);
17
+ const p = reindexScriptPath();
18
+ expect(p.endsWith(path.join("scripts", "reindex.sh"))).toBe(true);
19
19
  expect(fs.existsSync(p)).toBe(true);
20
20
  });
21
21
  });
22
- describe("masterSync", () => {
22
+ describe("reindex", () => {
23
23
  let root;
24
24
  beforeEach(() => {
25
25
  root = fs.mkdtempSync(path.join(os.tmpdir(), "ms-test-"));
@@ -36,7 +36,7 @@ describe("masterSync", () => {
36
36
  writeSkill("core/skills/demo");
37
37
  fs.writeFileSync(path.join(root, "core/skills/demo/helper.md"), "h\n");
38
38
  writeSkill("companies/acme/skills/widget");
39
- const { status } = masterSync({ repoRoot: root });
39
+ const { status } = reindex({ repoRoot: root });
40
40
  expect(status).toBe(0);
41
41
  const coreWrapper = path.join(root, ".claude/skills/core:demo");
42
42
  expect(fs.lstatSync(path.join(coreWrapper, "SKILL.md")).isSymbolicLink()).toBe(true);
@@ -49,7 +49,7 @@ describe("masterSync", () => {
49
49
  it("mirrors the personal overlay into core/<type>/", () => {
50
50
  fs.mkdirSync(path.join(root, "personal/policies"), { recursive: true });
51
51
  fs.writeFileSync(path.join(root, "personal/policies/myrule.md"), "rule\n");
52
- const { status } = masterSync({ repoRoot: root });
52
+ const { status } = reindex({ repoRoot: root });
53
53
  expect(status).toBe(0);
54
54
  const link = path.join(root, "core/policies/myrule.md");
55
55
  expect(fs.lstatSync(link).isSymbolicLink()).toBe(true);
@@ -57,17 +57,17 @@ describe("masterSync", () => {
57
57
  });
58
58
  it("prunes orphan managed wrappers when the source skill disappears", () => {
59
59
  writeSkill("core/skills/demo");
60
- masterSync({ repoRoot: root });
60
+ reindex({ repoRoot: root });
61
61
  expect(fs.existsSync(path.join(root, ".claude/skills/core:demo"))).toBe(true);
62
62
  fs.rmSync(path.join(root, "core/skills/demo"), { recursive: true, force: true });
63
- masterSync({ repoRoot: root });
63
+ reindex({ repoRoot: root });
64
64
  expect(fs.existsSync(path.join(root, ".claude/skills/core:demo"))).toBe(false);
65
65
  });
66
66
  it("is idempotent — a second run is a no-op", () => {
67
67
  writeSkill("core/skills/demo");
68
- expect(masterSync({ repoRoot: root }).status).toBe(0);
69
- expect(masterSync({ repoRoot: root }).status).toBe(0);
68
+ expect(reindex({ repoRoot: root }).status).toBe(0);
69
+ expect(reindex({ repoRoot: root }).status).toBe(0);
70
70
  expect(fs.readlinkSync(path.join(root, ".claude/skills/core:demo/SKILL.md"))).toBe("../../../core/skills/demo/SKILL.md");
71
71
  });
72
72
  });
73
- //# sourceMappingURL=master-sync.test.js.map
73
+ //# sourceMappingURL=reindex.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reindex.test.js","sourceRoot":"","sources":["../../src/cli/reindex.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rescue-drift-reconcile.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rescue-drift-reconcile.test.d.ts","sourceRoot":"","sources":["../../src/cli/rescue-drift-reconcile.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Integration test for the rescue convergence guard in scripts/replace-rescue.sh.
3
+ *
4
+ * Regression for the false `.drift-*` litter: in `history_floor` mode the
5
+ * rescue overlay flags a scaffold file as USER-EDIT whenever its blob differs
6
+ * from the *old* baseline (floor). HQ's own Stop hooks rewrite scaffold files
7
+ * every session, so a file routinely drifts from the floor yet lands
8
+ * byte-for-byte identical to the *new* upstream HEAD the overlay is about to
9
+ * write — and the old code rescued it into personal/ with a redundant
10
+ * `.drift-<ts>-<pid>` copy. The guard reclassifies "drifted from floor but
11
+ * identical to upstream HEAD" as UNCHANGED (no rescue).
12
+ *
13
+ * The script clones its source from GitHub, so we shim `git clone` to clone a
14
+ * local fixture repo instead. Everything runs under --dry-run (no destructive
15
+ * ops, no backup) and we assert the classification the script reports.
16
+ */
17
+ import { describe, it, expect, beforeAll, afterAll } from "vitest";
18
+ import { execFileSync, spawnSync } from "child_process";
19
+ import * as fs from "fs";
20
+ import * as os from "os";
21
+ import * as path from "path";
22
+ const RESCUE_SCRIPT = path.resolve(process.cwd(), "scripts/replace-rescue.sh");
23
+ function hasGit() {
24
+ try {
25
+ execFileSync("git", ["--version"], { stdio: "ignore" });
26
+ return true;
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ const gitAvailable = hasGit();
33
+ describe.skipIf(!gitAvailable)("rescue drift convergence guard", () => {
34
+ let workDir;
35
+ let upstream;
36
+ let hqRoot;
37
+ let shimDir;
38
+ let floorSha;
39
+ let env;
40
+ const git = (cwd, ...args) => execFileSync("git", args, {
41
+ cwd,
42
+ stdio: ["ignore", "pipe", "pipe"],
43
+ env: {
44
+ ...process.env,
45
+ GIT_AUTHOR_NAME: "t",
46
+ GIT_AUTHOR_EMAIL: "t@t",
47
+ GIT_COMMITTER_NAME: "t",
48
+ GIT_COMMITTER_EMAIL: "t@t",
49
+ },
50
+ })
51
+ .toString()
52
+ .trim();
53
+ beforeAll(() => {
54
+ workDir = fs.mkdtempSync(path.join(os.tmpdir(), "hq-rescue-drift-"));
55
+ // --- Build a local "upstream" repo: floor commit, then a HEAD commit
56
+ // where core/x.md changed (v1 -> v2) and the others stayed put. ---
57
+ upstream = path.join(workDir, "upstream");
58
+ fs.mkdirSync(path.join(upstream, "core"), { recursive: true });
59
+ git(workDir, "init", "-b", "main", "upstream");
60
+ fs.writeFileSync(path.join(upstream, "core/x.md"), "v1\n");
61
+ fs.writeFileSync(path.join(upstream, "core/edited.md"), "base\n");
62
+ fs.writeFileSync(path.join(upstream, "core/keep.md"), "same\n");
63
+ git(upstream, "add", "-A");
64
+ git(upstream, "commit", "-m", "floor");
65
+ floorSha = git(upstream, "rev-parse", "HEAD");
66
+ // HEAD: only x.md advances.
67
+ fs.writeFileSync(path.join(upstream, "core/x.md"), "v2\n");
68
+ git(upstream, "add", "-A");
69
+ git(upstream, "commit", "-m", "head");
70
+ // --- Build the local HQ root being rescued. ---
71
+ hqRoot = path.join(workDir, "hq");
72
+ fs.mkdirSync(path.join(hqRoot, "core"), { recursive: true });
73
+ // `companies/` + `personal/` make it "look like" an HQ root (script guard);
74
+ // both are preserved (never walked).
75
+ fs.mkdirSync(path.join(hqRoot, "personal"), { recursive: true });
76
+ fs.mkdirSync(path.join(hqRoot, "companies"), { recursive: true });
77
+ // Drifted from floor ("v1") but byte-identical to upstream HEAD ("v2").
78
+ // OLD behavior: rescued to personal/x.md (+ .drift on collision).
79
+ // NEW behavior: reconciled as UNCHANGED — no rescue.
80
+ fs.writeFileSync(path.join(hqRoot, "core/x.md"), "v2\n");
81
+ // Genuinely user-edited: differs from both floor and HEAD -> still rescued.
82
+ fs.writeFileSync(path.join(hqRoot, "core/edited.md"), "MINE\n");
83
+ // Untouched vs floor -> UNCHANGED.
84
+ fs.writeFileSync(path.join(hqRoot, "core/keep.md"), "same\n");
85
+ // --- git shim: rewrite `git clone <github-url> dest` to the local fixture. ---
86
+ // Resolve the real git BEFORE the shim is on PATH so we don't recurse.
87
+ const realGit = execFileSync("bash", ["-lc", "command -v git"]).toString().trim() || "/usr/bin/git";
88
+ shimDir = path.join(workDir, "shim");
89
+ fs.mkdirSync(shimDir, { recursive: true });
90
+ const shim = `#!/usr/bin/env bash
91
+ if [ "$1" = "clone" ]; then
92
+ args=()
93
+ for a in "$@"; do
94
+ case "$a" in
95
+ https://github.com/*) a=${JSON.stringify(upstream)} ;;
96
+ esac
97
+ args+=("$a")
98
+ done
99
+ exec ${JSON.stringify(realGit)} "\${args[@]}"
100
+ fi
101
+ exec ${JSON.stringify(realGit)} "$@"
102
+ `;
103
+ fs.writeFileSync(path.join(shimDir, "git"), shim, { mode: 0o755 });
104
+ env = { ...process.env, PATH: `${shimDir}:${process.env.PATH ?? ""}` };
105
+ });
106
+ afterAll(() => {
107
+ if (workDir)
108
+ fs.rmSync(workDir, { recursive: true, force: true });
109
+ });
110
+ function runRescue() {
111
+ return spawnSync("bash", [
112
+ RESCUE_SCRIPT,
113
+ "--hq-root", hqRoot,
114
+ "--source", "test/repo",
115
+ "--ref", "main",
116
+ "--floor-sha", floorSha,
117
+ "--dry-run",
118
+ "--yes",
119
+ "--no-backup",
120
+ ], { env, encoding: "utf-8" });
121
+ }
122
+ it("reconciles a floor-drifted file that is identical to upstream HEAD (no rescue)", () => {
123
+ const r = runRescue();
124
+ const out = `${r.stdout}\n${r.stderr}`;
125
+ // Sanity: ran in history_floor mode against our floor.
126
+ expect(r.status, out).toBe(0);
127
+ expect(out).toContain(`Baseline: ${floorSha}`);
128
+ // The drifted-but-identical-to-HEAD file is reconciled, NOT rescued.
129
+ expect(out).toContain("drift reconciled (identical to upstream HEAD; no rescue): core/x.md");
130
+ expect(out).not.toMatch(/user-edit \(rescue\): core\/x\.md/);
131
+ // The genuinely-edited file is still rescued into personal/.
132
+ expect(out).toContain("user-edit (rescue): core/edited.md -> personal/edited.md");
133
+ // Untouched file classified UNCHANGED.
134
+ expect(out).toContain("unchanged (delete + replace): core/keep.md");
135
+ // Summary reflects exactly one reconcile.
136
+ expect(out).toMatch(/drift reconciled \(== upstream\):\s+1 files/);
137
+ });
138
+ });
139
+ //# sourceMappingURL=rescue-drift-reconcile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rescue-drift-reconcile.test.js","sourceRoot":"","sources":["../../src/cli/rescue-drift-reconcile.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rescue.d.ts","sourceRoot":"","sources":["../../src/cli/rescue.ts"],"names":[],"mappings":"AAuBA;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,MAAM,WAAW,aAAa;IAC5B;mDAC+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;yCACqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;+EAC2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;yBACqB;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;uBACmB;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;kCAC8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;kCAC8B;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;qEACiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,aAAkB,GAAG,MAAM,EAAE,CAiBlE;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,IAAI,GAAE,aAAkB,GAAG,YAAY,CAc7D"}
1
+ {"version":3,"file":"rescue.d.ts","sourceRoot":"","sources":["../../src/cli/rescue.ts"],"names":[],"mappings":"AAwBA;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,MAAM,WAAW,aAAa;IAC5B;mDAC+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;yCACqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;+EAC2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;yBACqB;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB;uBACmB;IACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B,2EAA2E;IAC3E,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;kCAC8B;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;kCAC8B;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;qEACiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,aAAkB,GAAG,MAAM,EAAE,CAiBlE;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CAAC,IAAI,GAAE,aAAkB,GAAG,YAAY,CA2B7D"}
@@ -17,6 +17,7 @@
17
17
  import { spawnSync } from "child_process";
18
18
  import { fileURLToPath } from "url";
19
19
  import path from "path";
20
+ import { reindex } from "./reindex.js";
20
21
  const __filename = fileURLToPath(import.meta.url);
21
22
  const __dirname = path.dirname(__filename);
22
23
  /**
@@ -83,6 +84,20 @@ export function rescue(opts = {}) {
83
84
  process.stderr.write(`rescue: failed to run ${script}: ${res.error.message}\n`);
84
85
  return { status: 1 };
85
86
  }
86
- return { status: res.status ?? 1 };
87
+ const status = res.status ?? 1;
88
+ // A successful, non-dry-run rescue re-lays-down core/, so refresh the
89
+ // generated skill wrappers, personal-overlay mirrors, and workers registry.
90
+ // Best-effort + idempotent — never overrides the rescue's own exit status.
91
+ // repoRoot falls back to process.cwd() (reindex's default) when hqRoot is
92
+ // omitted, matching the rescue script's own cwd-based default.
93
+ if (status === 0 && !opts.dryRun) {
94
+ try {
95
+ reindex({ repoRoot: opts.hqRoot });
96
+ }
97
+ catch {
98
+ // best-effort
99
+ }
100
+ }
101
+ return { status };
87
102
  }
88
103
  //# sourceMappingURL=rescue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rescue.js","sourceRoot":"","sources":["../../src/cli/rescue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rescue.js","sourceRoot":"","sources":["../../src/cli/rescue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rescue.reindex.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rescue.reindex.test.d.ts","sourceRoot":"","sources":["../../src/cli/rescue.reindex.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Wiring tests: `rescue()` runs `reindex()` after a successful, non-dry-run
3
+ * rescue so the generated skill wrappers / personal mirrors / workers registry
4
+ * are refreshed once core/ has been re-laid-down.
5
+ *
6
+ * child_process is mocked so the real replace-rescue.sh never runs, and
7
+ * ./reindex.js is mocked to a spy so we assert the call without spawning.
8
+ */
9
+ import { describe, it, expect, vi, beforeEach } from "vitest";
10
+ vi.mock("child_process", () => ({
11
+ spawnSync: vi.fn(() => ({ status: 0 })),
12
+ }));
13
+ vi.mock("./reindex.js", () => ({
14
+ reindex: vi.fn(() => ({ status: 0 })),
15
+ }));
16
+ import { spawnSync } from "child_process";
17
+ import { reindex } from "./reindex.js";
18
+ import { rescue } from "./rescue.js";
19
+ describe("rescue → reindex", () => {
20
+ beforeEach(() => {
21
+ vi.clearAllMocks();
22
+ spawnSync.mockReturnValue({ status: 0 });
23
+ });
24
+ it("refreshes via reindex after a successful rescue", () => {
25
+ const r = rescue({ hqRoot: "/tmp/hq", assumeYes: true });
26
+ expect(r.status).toBe(0);
27
+ expect(reindex).toHaveBeenCalledTimes(1);
28
+ expect(reindex).toHaveBeenCalledWith({ repoRoot: "/tmp/hq" });
29
+ });
30
+ it("does NOT run reindex on a dry-run", () => {
31
+ rescue({ hqRoot: "/tmp/hq", dryRun: true });
32
+ expect(reindex).not.toHaveBeenCalled();
33
+ });
34
+ it("does NOT run reindex when the rescue script fails", () => {
35
+ spawnSync.mockReturnValueOnce({ status: 1 });
36
+ const r = rescue({ hqRoot: "/tmp/hq", assumeYes: true });
37
+ expect(r.status).toBe(1);
38
+ expect(reindex).not.toHaveBeenCalled();
39
+ });
40
+ });
41
+ //# sourceMappingURL=rescue.reindex.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rescue.reindex.test.js","sourceRoot":"","sources":["../../src/cli/rescue.reindex.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9B,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;CACxC,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;CACtC,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QAClB,SAAiD,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC1D,SAAiD,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;QACtF,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1899,7 +1899,7 @@ describe("share", () => {
1899
1899
  // target's bytes under the link's key while a nested symlink was
1900
1900
  // silently dropped from every push. The link topology never survived a
1901
1901
  // round trip — fresh-machine pulls landed in a state where overlay
1902
- // symlinks just didn't exist until master-sync.sh recreated them
1902
+ // symlinks just didn't exist until reindex.sh recreated them
1903
1903
  // locally. The fix detects symlinks via lstat / Dirent.isSymbolicLink
1904
1904
  // and routes them to a new uploadSymlink primitive that PUTs a
1905
1905
  // zero-byte object with x-amz-meta-hq-symlink-target carrying the
@@ -1933,7 +1933,7 @@ describe("share", () => {
1933
1933
  const realPolicy = path.join(policiesDir, "real.md");
1934
1934
  fs.writeFileSync(realPolicy, "real content");
1935
1935
  const linkPolicy = path.join(policiesDir, "link.md");
1936
- // Mirrors the master-sync.sh overlay shape: relative target pointing
1936
+ // Mirrors the reindex.sh overlay shape: relative target pointing
1937
1937
  // to a sibling in the same dir.
1938
1938
  fs.symlinkSync("real.md", linkPolicy);
1939
1939
  const result = await share({