@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.
- package/dist/cli/index.d.ts +2 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/reindex.d.ts +23 -0
- package/dist/cli/reindex.d.ts.map +1 -0
- package/dist/cli/reindex.js +45 -0
- package/dist/cli/reindex.js.map +1 -0
- package/dist/cli/reindex.test.d.ts +11 -0
- package/dist/cli/reindex.test.d.ts.map +1 -0
- package/dist/cli/{master-sync.test.js → reindex.test.js} +15 -15
- package/dist/cli/reindex.test.js.map +1 -0
- package/dist/cli/rescue-drift-reconcile.test.d.ts +2 -0
- package/dist/cli/rescue-drift-reconcile.test.d.ts.map +1 -0
- package/dist/cli/rescue-drift-reconcile.test.js +139 -0
- package/dist/cli/rescue-drift-reconcile.test.js.map +1 -0
- package/dist/cli/rescue.d.ts.map +1 -1
- package/dist/cli/rescue.js +16 -1
- package/dist/cli/rescue.js.map +1 -1
- package/dist/cli/rescue.reindex.test.d.ts +2 -0
- package/dist/cli/rescue.reindex.test.d.ts.map +1 -0
- package/dist/cli/rescue.reindex.test.js +41 -0
- package/dist/cli/rescue.reindex.test.js.map +1 -0
- package/dist/cli/share.test.js +2 -2
- package/dist/cli/share.test.js.map +1 -1
- package/dist/cli/sync.d.ts +9 -0
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js +17 -0
- package/dist/cli/sync.js.map +1 -1
- package/dist/cli/sync.test.js +20 -0
- package/dist/cli/sync.test.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/scripts/{master-sync.sh → reindex.sh} +10 -10
- package/scripts/replace-rescue.sh +48 -19
- package/src/cli/index.ts +3 -3
- package/src/cli/{master-sync.test.ts → reindex.test.ts} +14 -14
- package/src/cli/reindex.ts +57 -0
- package/src/cli/rescue-drift-reconcile.test.ts +158 -0
- package/src/cli/rescue.reindex.test.ts +46 -0
- package/src/cli/rescue.ts +15 -1
- package/src/cli/share.test.ts +2 -2
- package/src/cli/sync.test.ts +23 -0
- package/src/cli/sync.ts +27 -0
- package/src/index.ts +3 -3
- package/dist/cli/master-sync.d.ts +0 -22
- package/dist/cli/master-sync.d.ts.map +0 -1
- package/dist/cli/master-sync.js +0 -44
- package/dist/cli/master-sync.js.map +0 -1
- package/dist/cli/master-sync.test.d.ts +0 -11
- package/dist/cli/master-sync.test.d.ts.map +0 -1
- package/dist/cli/master-sync.test.js.map +0 -1
- package/src/cli/master-sync.ts +0 -56
package/dist/cli/index.d.ts
CHANGED
|
@@ -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 {
|
|
20
|
-
export type {
|
|
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
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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 {
|
|
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";
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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,
|
|
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
|
|
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/
|
|
6
|
-
* the
|
|
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 {
|
|
15
|
-
describe("
|
|
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 =
|
|
18
|
-
expect(p.endsWith(path.join("scripts", "
|
|
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("
|
|
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 } =
|
|
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 } =
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
69
|
-
expect(
|
|
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=
|
|
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 @@
|
|
|
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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"}
|
package/dist/cli/rescue.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rescue.d.ts","sourceRoot":"","sources":["../../src/cli/rescue.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/cli/rescue.js
CHANGED
|
@@ -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
|
-
|
|
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
|
package/dist/cli/rescue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rescue.js","sourceRoot":"","sources":["../../src/cli/rescue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"rescue.js","sourceRoot":"","sources":["../../src/cli/rescue.ts"],"names":[],"mappings":"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"}
|
|
@@ -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"}
|
package/dist/cli/share.test.js
CHANGED
|
@@ -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
|
|
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
|
|
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({
|