@indigoai-us/hq-cloud 6.1.0 → 6.2.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/bin/sync-runner.d.ts.map +1 -1
  2. package/dist/bin/sync-runner.js +18 -0
  3. package/dist/bin/sync-runner.js.map +1 -1
  4. package/dist/cli/index.d.ts +2 -2
  5. package/dist/cli/index.d.ts.map +1 -1
  6. package/dist/cli/index.js +2 -2
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/cli/reindex.d.ts +4 -11
  9. package/dist/cli/reindex.d.ts.map +1 -1
  10. package/dist/cli/reindex.js +336 -30
  11. package/dist/cli/reindex.js.map +1 -1
  12. package/dist/cli/reindex.test.d.ts +3 -3
  13. package/dist/cli/reindex.test.js +36 -11
  14. package/dist/cli/reindex.test.js.map +1 -1
  15. package/dist/cli/rescue-core.d.ts +36 -0
  16. package/dist/cli/rescue-core.d.ts.map +1 -0
  17. package/dist/cli/rescue-core.js +1536 -0
  18. package/dist/cli/rescue-core.js.map +1 -0
  19. package/dist/cli/rescue-drift-reconcile.test.js +33 -10
  20. package/dist/cli/rescue-drift-reconcile.test.js.map +1 -1
  21. package/dist/cli/rescue-mtime-preserve.test.js +36 -12
  22. package/dist/cli/rescue-mtime-preserve.test.js.map +1 -1
  23. package/dist/cli/rescue.d.ts +4 -10
  24. package/dist/cli/rescue.d.ts.map +1 -1
  25. package/dist/cli/rescue.js +14 -37
  26. package/dist/cli/rescue.js.map +1 -1
  27. package/dist/cli/rescue.reindex.test.js +9 -8
  28. package/dist/cli/rescue.reindex.test.js.map +1 -1
  29. package/dist/cli/rescue.test.js +1 -10
  30. package/dist/cli/rescue.test.js.map +1 -1
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +2 -2
  34. package/dist/index.js.map +1 -1
  35. package/dist/lib/conflict-index.d.ts +40 -0
  36. package/dist/lib/conflict-index.d.ts.map +1 -1
  37. package/dist/lib/conflict-index.js +121 -0
  38. package/dist/lib/conflict-index.js.map +1 -1
  39. package/dist/lib/conflict.test.js +145 -1
  40. package/dist/lib/conflict.test.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/bin/sync-runner.ts +18 -0
  43. package/src/cli/index.ts +2 -2
  44. package/src/cli/reindex.test.ts +45 -12
  45. package/src/cli/reindex.ts +345 -36
  46. package/src/cli/rescue-core.ts +1650 -0
  47. package/src/cli/rescue-drift-reconcile.test.ts +33 -12
  48. package/src/cli/rescue-mtime-preserve.test.ts +36 -15
  49. package/src/cli/rescue.reindex.test.ts +9 -8
  50. package/src/cli/rescue.test.ts +1 -11
  51. package/src/cli/rescue.ts +15 -40
  52. package/src/index.ts +2 -2
  53. package/src/lib/conflict-index.ts +146 -0
  54. package/src/lib/conflict.test.ts +171 -0
  55. package/scripts/reindex.sh +0 -318
  56. package/scripts/replace-rescue.sh +0 -1522
@@ -1,45 +1,351 @@
1
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.
2
+ * hq reindex — surfaces namespaced skills as Claude Code skill wrappers under
3
+ * .claude/skills/<ns>:<skill>/ (one symlink per source file), mirrors
4
+ * personal/{knowledge,policies,workers,settings}/<entry> into core/<type>/,
5
+ * prunes orphan wrappers + legacy command symlinks, and regenerates the
6
+ * workers registry.
5
7
  *
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`.
8
+ * The logic historically lived in a bundled bash script (scripts/reindex.sh)
9
+ * that this module exec'd via `bash`. It is now implemented natively in
10
+ * TypeScript so the package ships a single, testable code path with no runtime
11
+ * dependency on a shipped shell script. Behaviour is preserved exactly: the
12
+ * same skill wrappers, personal-overlay mirrors, legacy-symlink cleanup, and
13
+ * idempotent re-runs as before. Historically the script ran directly as a
14
+ * Claude Code hook inside hq-core (named "master-sync"); the hq-core hook
15
+ * remains a thin shim over `hq reindex`.
12
16
  */
13
17
  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
+ import * as fs from "fs";
19
+ import * as path from "path";
20
+ // --- small fs helpers (each mirrors a bash test operator) -------------------
21
+ /** `[ -d "$p" ]` — exists and is a directory (follows symlinks). */
22
+ function isDir(p) {
23
+ try {
24
+ return fs.statSync(p).isDirectory();
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ /** `[ -f "$p" ]` — exists and is a regular file (follows symlinks). */
31
+ function isFile(p) {
32
+ try {
33
+ return fs.statSync(p).isFile();
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ /** `[ -e "$p" ]` — exists, dereferencing symlinks (a broken symlink is false). */
40
+ function existsFollow(p) {
41
+ try {
42
+ fs.statSync(p);
43
+ return true;
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ /** `[ -x "$p" ]` — exists and is executable. */
50
+ function isExecutable(p) {
51
+ try {
52
+ fs.accessSync(p, fs.constants.X_OK);
53
+ return true;
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
59
+ /** lstat without throwing (null when the path doesn't exist). */
60
+ function lstatOrNull(p) {
61
+ try {
62
+ return fs.lstatSync(p);
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
68
+ /** readlink without throwing (null when not a symlink / missing). */
69
+ function readlinkOrNull(p) {
70
+ try {
71
+ return fs.readlinkSync(p);
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
18
77
  /**
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.
78
+ * Entries of `dir` matching a bash `dir/*` glob: dotfiles excluded (no
79
+ * dotglob), sorted lexicographically (bash glob order). Missing dir [].
22
80
  */
23
- export function reindexScriptPath() {
24
- return path.resolve(__dirname, "..", "..", "scripts", "reindex.sh");
81
+ function globEntries(dir) {
82
+ let names;
83
+ try {
84
+ names = fs.readdirSync(dir);
85
+ }
86
+ catch {
87
+ return [];
88
+ }
89
+ return names.filter((n) => !n.startsWith(".")).sort();
90
+ }
91
+ function warn(msg) {
92
+ process.stderr.write(`${msg}\n`);
93
+ }
94
+ // --- legacy `.claude/commands/<ns>/<skill>.md` symlink matcher --------------
95
+ // Mirrors the bash `case` patterns; `*` matches any chars (including `/`).
96
+ function isLegacyCommandTarget(t) {
97
+ return (/^\.\.\/\.\.\/\.\.\/companies\/.*\/skills\/.*\/SKILL\.md$/.test(t) ||
98
+ /^\.\.\/\.\.\/\.\.\/core\/skills\/.*\/SKILL\.md$/.test(t) ||
99
+ /^\.\.\/\.\.\/\.\.\/personal\/skills\/.*\/SKILL\.md$/.test(t) ||
100
+ /^\.\.\/\.\.\/\.\.\/core\/packages\/.*\/skills\/.*\/SKILL\.md$/.test(t));
25
101
  }
26
102
  /**
27
- * Run reindex against an HQ root. Synchronous — the script is cheap and
103
+ * Run reindex against an HQ root. Synchronous — the work is cheap and
28
104
  * 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).
105
+ * status. Diagnostics are written to stderr so the caller's stdout stays clean
106
+ * (hooks must not emit stdout that the agent interprets).
32
107
  */
33
108
  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`);
109
+ const rawRoot = opts.repoRoot ?? process.cwd();
110
+ if (!isDir(rawRoot)) {
111
+ warn(`reindex: REPO_ROOT '${rawRoot}' is not a directory`);
41
112
  return { status: 1 };
42
113
  }
43
- return { status: res.status ?? 1 };
114
+ const root = path.resolve(rawRoot);
115
+ fs.mkdirSync(path.join(root, ".claude", "skills"), { recursive: true });
116
+ // --- Build (namespace, src_rel) pairs -------------------------------------
117
+ const pairs = [];
118
+ const addNs = (ns, srcRel) => {
119
+ if (isDir(path.join(root, srcRel)))
120
+ pairs.push({ ns, srcRel });
121
+ };
122
+ for (const slug of globEntries(path.join(root, "companies"))) {
123
+ if (isDir(path.join(root, "companies", slug))) {
124
+ addNs(slug, `companies/${slug}/skills`);
125
+ }
126
+ }
127
+ addNs("core", "core/skills");
128
+ addNs("personal", "personal/skills");
129
+ for (const pack of globEntries(path.join(root, "core", "packages"))) {
130
+ if (isDir(path.join(root, "core", "packages", pack))) {
131
+ addNs(pack, `core/packages/${pack}/skills`);
132
+ }
133
+ }
134
+ // --- Cleanup pass A: drop legacy .claude/commands/<ns>/<skill>.md links ----
135
+ const commandsDir = path.join(root, ".claude", "commands");
136
+ if (isDir(commandsDir)) {
137
+ for (const nsName of globEntries(commandsDir)) {
138
+ const cmdNsDir = path.join(commandsDir, nsName);
139
+ // Only real directories (bash `*/`); folder-level symlinks are left for
140
+ // a human to resolve. lstat().isDirectory() is false for a symlink, so
141
+ // this single check covers both bash guards.
142
+ const st = lstatOrNull(cmdNsDir);
143
+ if (!st || !st.isDirectory())
144
+ continue;
145
+ for (const f of globEntries(cmdNsDir)) {
146
+ if (!f.endsWith(".md"))
147
+ continue;
148
+ const fp = path.join(cmdNsDir, f);
149
+ const fst = lstatOrNull(fp);
150
+ if (!fst || !fst.isSymbolicLink())
151
+ continue;
152
+ const target = readlinkOrNull(fp);
153
+ if (target && isLegacyCommandTarget(target)) {
154
+ try {
155
+ fs.rmSync(fp);
156
+ }
157
+ catch {
158
+ /* best-effort */
159
+ }
160
+ }
161
+ }
162
+ // rmdir if empty; ignore "directory not empty".
163
+ try {
164
+ fs.rmdirSync(cmdNsDir);
165
+ }
166
+ catch {
167
+ /* not empty / gone — fine */
168
+ }
169
+ }
170
+ }
171
+ // --- Skill wrapper creation -----------------------------------------------
172
+ const expectedWrappers = new Set();
173
+ const seen = new Set();
174
+ for (const { ns, srcRel } of pairs) {
175
+ // First writer for a namespace wins.
176
+ if (seen.has(ns)) {
177
+ warn(`reindex: namespace '${ns}' already claimed by an earlier source; skipping ${srcRel}`);
178
+ continue;
179
+ }
180
+ seen.add(ns);
181
+ const srcAbs = path.join(root, srcRel);
182
+ for (const skillName of globEntries(srcAbs)) {
183
+ const skillPath = path.join(srcAbs, skillName);
184
+ if (!isDir(skillPath))
185
+ continue;
186
+ // Skip `_shared`, `_template`, etc. (dotfiles already excluded by glob).
187
+ if (skillName.startsWith("_"))
188
+ continue;
189
+ if (!isFile(path.join(skillPath, "SKILL.md")))
190
+ continue;
191
+ const wrapperName = `${ns}:${skillName}`;
192
+ const wrapper = path.join(root, ".claude", "skills", wrapperName);
193
+ expectedWrappers.add(wrapperName);
194
+ const wst = lstatOrNull(wrapper);
195
+ // If something non-directory, non-symlink occupies the slot, bail.
196
+ if (wst && !wst.isSymbolicLink() && !wst.isDirectory()) {
197
+ warn(`reindex: ${wrapper} exists and is not a directory; skipping`);
198
+ continue;
199
+ }
200
+ // If it's a symlink (legacy directory-symlink form), replace it with a
201
+ // real directory of per-file symlinks.
202
+ if (wst && wst.isSymbolicLink()) {
203
+ try {
204
+ fs.rmSync(wrapper);
205
+ }
206
+ catch {
207
+ /* best-effort */
208
+ }
209
+ }
210
+ fs.mkdirSync(wrapper, { recursive: true });
211
+ // Symlink every (non-hidden) entry in the source skill folder. The
212
+ // wrapper lives three levels below REPO_ROOT.
213
+ for (const entry of globEntries(skillPath)) {
214
+ const entryPath = path.join(skillPath, entry);
215
+ if (!existsFollow(entryPath))
216
+ continue;
217
+ const linkPath = path.join(wrapper, entry);
218
+ const relativeTarget = `../../../${srcRel}/${skillName}/${entry}`;
219
+ const lst = lstatOrNull(linkPath);
220
+ if (lst && lst.isSymbolicLink()) {
221
+ const current = readlinkOrNull(linkPath);
222
+ if (current === relativeTarget)
223
+ continue;
224
+ warn(`reindex: .claude/skills/${wrapperName}/${entry} already points to '${current}' (expected '${relativeTarget}'); leaving alone`);
225
+ continue;
226
+ }
227
+ else if (lst) {
228
+ warn(`reindex: ${linkPath} already exists and is not a symlink; skipping`);
229
+ continue;
230
+ }
231
+ fs.symlinkSync(relativeTarget, linkPath);
232
+ }
233
+ // Prune symlinks in the wrapper whose source entry no longer exists.
234
+ for (const entry of globEntries(wrapper)) {
235
+ const linkPath = path.join(wrapper, entry);
236
+ const lst = lstatOrNull(linkPath);
237
+ if (!lst || !lst.isSymbolicLink())
238
+ continue;
239
+ if (existsFollow(linkPath))
240
+ continue;
241
+ try {
242
+ fs.rmSync(linkPath);
243
+ }
244
+ catch {
245
+ /* best-effort */
246
+ }
247
+ }
248
+ }
249
+ }
250
+ // --- Cleanup pass B: drop orphan <ns>:<skill> wrappers --------------------
251
+ const skillsDir = path.join(root, ".claude", "skills");
252
+ for (const entry of globEntries(skillsDir)) {
253
+ const entryPath = path.join(skillsDir, entry);
254
+ const lst = lstatOrNull(entryPath);
255
+ if (!lst)
256
+ continue; // accept broken symlinks (lstat still succeeds)
257
+ if (!entry.includes(":"))
258
+ continue; // not a namespaced wrapper
259
+ if (expectedWrappers.has(entry))
260
+ continue; // maintained this run
261
+ // A wrapper is "managed" only when its namespace prefix matches the
262
+ // namespace encoded in its symlink target — this distinguishes
263
+ // script-produced wrappers from hand-authored composite wrappers.
264
+ const ns = entry.slice(0, entry.indexOf(":"));
265
+ const matchTarget = (t, p) => {
266
+ if (!t)
267
+ return false;
268
+ if (t.startsWith(`${p}/personal/skills/`))
269
+ return ns === "personal";
270
+ if (t.startsWith(`${p}/core/skills/`))
271
+ return ns === "core";
272
+ if (t.startsWith(`${p}/companies/${ns}/skills/`))
273
+ return true;
274
+ if (t.startsWith(`${p}/core/packages/${ns}/skills/`))
275
+ return true;
276
+ return false;
277
+ };
278
+ let isManaged = false;
279
+ if (lst.isSymbolicLink()) {
280
+ // (a) directory-style symlink wrapper (older shape): 2-level target.
281
+ isManaged = matchTarget(readlinkOrNull(entryPath), "../..");
282
+ }
283
+ else if (lst.isDirectory()) {
284
+ // (b) real directory of per-file symlinks (current shape): 3-level.
285
+ for (const f of globEntries(entryPath)) {
286
+ const fp = path.join(entryPath, f);
287
+ const fst = lstatOrNull(fp);
288
+ if (!fst || !fst.isSymbolicLink())
289
+ continue;
290
+ if (matchTarget(readlinkOrNull(fp), "../../..")) {
291
+ isManaged = true;
292
+ break;
293
+ }
294
+ }
295
+ }
296
+ if (!isManaged)
297
+ continue;
298
+ // Managed-namespace wrapper with no corresponding live source → drop.
299
+ try {
300
+ if (lst.isSymbolicLink()) {
301
+ fs.rmSync(entryPath);
302
+ }
303
+ else if (lst.isDirectory()) {
304
+ fs.rmSync(entryPath, { recursive: true, force: true });
305
+ }
306
+ }
307
+ catch {
308
+ /* best-effort */
309
+ }
310
+ }
311
+ // --- Personal type mirroring ----------------------------------------------
312
+ // Mirror personal/<type>/<entry> into core/<type>/<entry> as symlinks.
313
+ for (const type of ["knowledge", "policies", "workers", "settings"]) {
314
+ const personalDir = path.join(root, "personal", type);
315
+ const coreDir = path.join(root, "core", type);
316
+ if (!isDir(personalDir))
317
+ continue;
318
+ fs.mkdirSync(coreDir, { recursive: true });
319
+ for (const entry of globEntries(personalDir)) {
320
+ const entryPath = path.join(personalDir, entry);
321
+ if (!existsFollow(entryPath))
322
+ continue;
323
+ const linkPath = path.join(coreDir, entry);
324
+ const relativeTarget = `../../personal/${type}/${entry}`;
325
+ const lst = lstatOrNull(linkPath);
326
+ if (lst && lst.isSymbolicLink()) {
327
+ const current = readlinkOrNull(linkPath);
328
+ if (current === relativeTarget)
329
+ continue;
330
+ warn(`reindex: core/${type}/${entry} already points to '${current}' (expected '${relativeTarget}'); leaving alone`);
331
+ continue;
332
+ }
333
+ else if (lst) {
334
+ warn(`reindex: core/${type}/${entry} already exists and is not a symlink; skipping`);
335
+ continue;
336
+ }
337
+ fs.symlinkSync(relativeTarget, linkPath);
338
+ }
339
+ }
340
+ // --- Workers registry regeneration ----------------------------------------
341
+ // Source of truth: each worker.yaml. The registry is a derived index — the
342
+ // generator (when present in the operated-on tree) keeps it in sync.
343
+ // Best-effort and idempotent; never fails the reindex.
344
+ const genScript = path.join(root, "core", "scripts", "generate-workers-registry.sh");
345
+ if (isExecutable(genScript)) {
346
+ // Route the generator's stdout+stderr to our stderr (`>&2 2>&1`).
347
+ spawnSync("bash", [genScript], { stdio: ["ignore", 2, 2] });
348
+ }
349
+ return { status: 0 };
44
350
  }
45
351
  //# sourceMappingURL=reindex.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"reindex.js","sourceRoot":"","sources":["../../src/cli/reindex.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,10 @@
2
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/reindex.sh; these tests exercise it via
6
- * the reindex() wrapper against a temp HQ tree, asserting the observable
5
+ * The logic is implemented natively in TypeScript in ./reindex.ts; these tests
6
+ * exercise reindex() directly against a temp HQ tree, asserting the observable
7
7
  * filesystem outcomes (skill wrappers, personal-overlay mirroring) rather than
8
- * re-deriving the bash internals.
8
+ * re-deriving the implementation internals.
9
9
  */
10
10
  export {};
11
11
  //# sourceMappingURL=reindex.test.d.ts.map
@@ -2,23 +2,16 @@
2
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/reindex.sh; these tests exercise it via
6
- * the reindex() wrapper against a temp HQ tree, asserting the observable
5
+ * The logic is implemented natively in TypeScript in ./reindex.ts; these tests
6
+ * exercise reindex() directly against a temp HQ tree, asserting the observable
7
7
  * filesystem outcomes (skill wrappers, personal-overlay mirroring) rather than
8
- * re-deriving the bash internals.
8
+ * re-deriving the implementation internals.
9
9
  */
10
10
  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 { reindex, reindexScriptPath } from "./reindex.js";
15
- describe("reindexScriptPath", () => {
16
- it("resolves to the bundled script and the file exists", () => {
17
- const p = reindexScriptPath();
18
- expect(p.endsWith(path.join("scripts", "reindex.sh"))).toBe(true);
19
- expect(fs.existsSync(p)).toBe(true);
20
- });
21
- });
14
+ import { reindex } from "./reindex.js";
22
15
  describe("reindex", () => {
23
16
  let root;
24
17
  beforeEach(() => {
@@ -69,5 +62,37 @@ describe("reindex", () => {
69
62
  expect(reindex({ repoRoot: root }).status).toBe(0);
70
63
  expect(fs.readlinkSync(path.join(root, ".claude/skills/core:demo/SKILL.md"))).toBe("../../../core/skills/demo/SKILL.md");
71
64
  });
65
+ it("skips `_`-prefixed and dotfile skill folders", () => {
66
+ writeSkill("core/skills/_template");
67
+ fs.mkdirSync(path.join(root, "core/skills/.hidden"), { recursive: true });
68
+ fs.writeFileSync(path.join(root, "core/skills/.hidden/SKILL.md"), "x\n");
69
+ writeSkill("core/skills/real");
70
+ reindex({ repoRoot: root });
71
+ expect(fs.existsSync(path.join(root, ".claude/skills/core:real"))).toBe(true);
72
+ expect(fs.existsSync(path.join(root, ".claude/skills/core:_template"))).toBe(false);
73
+ expect(fs.existsSync(path.join(root, ".claude/skills/core:.hidden"))).toBe(false);
74
+ });
75
+ it("removes legacy .claude/commands/<ns>/<skill>.md bridge symlinks", () => {
76
+ const cmdDir = path.join(root, ".claude/commands/core");
77
+ fs.mkdirSync(cmdDir, { recursive: true });
78
+ // Legacy bridge symlink (matches the cleanup pattern) → removed.
79
+ fs.symlinkSync("../../../core/skills/demo/SKILL.md", path.join(cmdDir, "demo.md"));
80
+ // A real file (non-symlink) → preserved.
81
+ fs.writeFileSync(path.join(cmdDir, "keep.md"), "manual\n");
82
+ reindex({ repoRoot: root });
83
+ expect(fs.existsSync(path.join(cmdDir, "demo.md"))).toBe(false);
84
+ expect(fs.existsSync(path.join(cmdDir, "keep.md"))).toBe(true);
85
+ });
86
+ it("leaves hand-authored composite wrappers (unmanaged namespace) alone", () => {
87
+ // A wrapper whose namespace ('vendor') is not a managed namespace and
88
+ // whose target points into core/skills/<other> — must not be pruned.
89
+ const wrapper = path.join(root, ".claude/skills/vendor:tool");
90
+ fs.mkdirSync(wrapper, { recursive: true });
91
+ writeSkill("core/skills/helper");
92
+ fs.symlinkSync("../../../core/skills/helper/SKILL.md", path.join(wrapper, "SKILL.md"));
93
+ reindex({ repoRoot: root });
94
+ expect(fs.existsSync(wrapper)).toBe(true);
95
+ expect(fs.lstatSync(path.join(wrapper, "SKILL.md")).isSymbolicLink()).toBe(true);
96
+ });
72
97
  });
73
98
  //# sourceMappingURL=reindex.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reindex.test.js","sourceRoot":"","sources":["../../src/cli/reindex.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reindex.test.js","sourceRoot":"","sources":["../../src/cli/reindex.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export interface RunRescueResult {
2
+ status: number;
3
+ }
4
+ interface Config {
5
+ ref: string;
6
+ sourceRepo: string;
7
+ dryRun: boolean;
8
+ assumeYes: boolean;
9
+ cloudUpdate: boolean;
10
+ extraPreserve: string[];
11
+ preserveSubpaths: string[];
12
+ narrowPaths: string[];
13
+ hqRootOverride: string;
14
+ historyCheck: boolean;
15
+ floorShaOverride: string;
16
+ doBackup: boolean;
17
+ backupRoot: string;
18
+ backupRetentionDays: string;
19
+ }
20
+ /**
21
+ * Parse the rescue argv exactly as the bash `while case` loop did, including
22
+ * validation and the same exit codes (1 unknown/usage, 2 bad option). Throws
23
+ * ExitError on any validation failure.
24
+ */
25
+ export declare function parseRescueArgs(argv: string[]): Config;
26
+ /**
27
+ * Execute a fully-parsed rescue. `argv` are the same flags the bash script
28
+ * accepted; `env` defaults to process.env (GH_TOKEN is read from it). Returns
29
+ * the process-equivalent exit status. Never throws for normal control-flow
30
+ * exits — those are mapped to the returned status.
31
+ */
32
+ export declare function runRescue(argv: string[], opts?: {
33
+ env?: NodeJS.ProcessEnv;
34
+ }): RunRescueResult;
35
+ export {};
36
+ //# sourceMappingURL=rescue-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rescue-core.d.ts","sourceRoot":"","sources":["../../src/cli/rescue-core.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;CAChB;AAyBD,UAAU,MAAM;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAwFD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAuJtD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAA;CAAO,GACrC,eAAe,CAkCjB"}