@indigoai-us/hq-cloud 5.28.0 → 5.30.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/bin/sync-runner.d.ts.map +1 -1
- package/dist/bin/sync-runner.js +19 -1
- package/dist/bin/sync-runner.js.map +1 -1
- package/dist/bin/sync-runner.test.js +49 -9
- package/dist/bin/sync-runner.test.js.map +1 -1
- package/dist/cli/sync.d.ts +10 -0
- package/dist/cli/sync.d.ts.map +1 -1
- package/dist/cli/sync.js.map +1 -1
- package/dist/journal.d.ts +43 -0
- package/dist/journal.d.ts.map +1 -1
- package/dist/journal.js +52 -0
- package/dist/journal.js.map +1 -1
- package/dist/journal.test.js +78 -1
- package/dist/journal.test.js.map +1 -1
- package/package.json +1 -1
- package/src/bin/sync-runner.test.ts +53 -9
- package/src/bin/sync-runner.ts +23 -1
- package/src/cli/sync.ts +10 -0
- package/src/journal.test.ts +101 -0
- package/src/journal.ts +52 -0
package/dist/journal.test.js
CHANGED
|
@@ -9,7 +9,7 @@ import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
|
9
9
|
import * as fs from "fs";
|
|
10
10
|
import * as os from "os";
|
|
11
11
|
import * as path from "path";
|
|
12
|
-
import { getJournalPath, getStateDir, readJournal, writeJournal, updateEntry, migrateToV2, appendPullRecord, lastPullRecord, tombstoneEntry, isTombstone, gcTombstones, generatePullId, TOMBSTONE_TTL_MS, } from "./journal.js";
|
|
12
|
+
import { getJournalPath, getStateDir, readJournal, writeJournal, updateEntry, migrateToV2, appendPullRecord, lastPullRecord, tombstoneEntry, isTombstone, gcTombstones, generatePullId, TOMBSTONE_TTL_MS, PERSONAL_VAULT_JOURNAL_SLUG, migratePersonalVaultJournal, } from "./journal.js";
|
|
13
13
|
describe("journal", () => {
|
|
14
14
|
let stateDir;
|
|
15
15
|
beforeEach(() => {
|
|
@@ -356,5 +356,82 @@ describe("journal", () => {
|
|
|
356
356
|
expect(j.files["bogus.md"]).toBeDefined();
|
|
357
357
|
});
|
|
358
358
|
});
|
|
359
|
+
// ── Personal-vault journal-slug collision fix ──────────────────────────────
|
|
360
|
+
//
|
|
361
|
+
// Root cause: the --companies fanout's personal-vault slot journaled under
|
|
362
|
+
// the literal slug "personal", colliding with the companies/personal
|
|
363
|
+
// company (entity slug "personal"). The two targets have different sync
|
|
364
|
+
// roots, so the company's whole-tree delete-plan walked the shared
|
|
365
|
+
// sync-journal.personal.json, resolved the vault's hq-root keys against
|
|
366
|
+
// hqRoot/companies/personal (where they don't exist), tombstoned them as
|
|
367
|
+
// "remote already 404", and dropped them — only for the vault slot to
|
|
368
|
+
// re-upload them next cycle (~190 .claude/skills/* files of churn/sync).
|
|
369
|
+
describe("PERSONAL_VAULT_JOURNAL_SLUG", () => {
|
|
370
|
+
it("is decoupled from the 'personal' company slug", () => {
|
|
371
|
+
expect(PERSONAL_VAULT_JOURNAL_SLUG).not.toBe("personal");
|
|
372
|
+
});
|
|
373
|
+
it("survives sanitizeSlug unchanged (no path/dot/empty mangling)", () => {
|
|
374
|
+
// getJournalPath runs the slug through sanitizeSlug; the sentinel must
|
|
375
|
+
// pass through verbatim (it is all [a-zA-Z0-9_-] and not all [_-]).
|
|
376
|
+
expect(getJournalPath(PERSONAL_VAULT_JOURNAL_SLUG)).toBe(path.join(stateDir, `sync-journal.${PERSONAL_VAULT_JOURNAL_SLUG}.json`));
|
|
377
|
+
});
|
|
378
|
+
it("maps to a different journal file than 'personal'", () => {
|
|
379
|
+
expect(getJournalPath(PERSONAL_VAULT_JOURNAL_SLUG)).not.toBe(getJournalPath("personal"));
|
|
380
|
+
});
|
|
381
|
+
});
|
|
382
|
+
describe("migratePersonalVaultJournal", () => {
|
|
383
|
+
const legacyJournal = () => ({
|
|
384
|
+
version: "2",
|
|
385
|
+
lastSync: "2026-05-22T00:00:00.000Z",
|
|
386
|
+
files: {
|
|
387
|
+
".claude/skills/deep-plan/SKILL.md": {
|
|
388
|
+
hash: "abc123",
|
|
389
|
+
size: 42,
|
|
390
|
+
syncedAt: "2026-05-22T00:00:00.000Z",
|
|
391
|
+
direction: "up",
|
|
392
|
+
},
|
|
393
|
+
},
|
|
394
|
+
pulls: [],
|
|
395
|
+
});
|
|
396
|
+
it("seeds the reserved slug from the legacy 'personal' journal when absent", () => {
|
|
397
|
+
writeJournal("personal", legacyJournal());
|
|
398
|
+
expect(fs.existsSync(getJournalPath(PERSONAL_VAULT_JOURNAL_SLUG))).toBe(false);
|
|
399
|
+
migratePersonalVaultJournal();
|
|
400
|
+
expect(fs.existsSync(getJournalPath(PERSONAL_VAULT_JOURNAL_SLUG))).toBe(true);
|
|
401
|
+
const seeded = readJournal(PERSONAL_VAULT_JOURNAL_SLUG);
|
|
402
|
+
// The hq-root-relative vault entry is preserved so it is NOT re-uploaded.
|
|
403
|
+
expect(seeded.files[".claude/skills/deep-plan/SKILL.md"]).toEqual(legacyJournal().files[".claude/skills/deep-plan/SKILL.md"]);
|
|
404
|
+
// Legacy journal is left intact (still used by the companies/personal company).
|
|
405
|
+
expect(fs.existsSync(getJournalPath("personal"))).toBe(true);
|
|
406
|
+
});
|
|
407
|
+
it("is idempotent — does not clobber an existing reserved-slug journal", () => {
|
|
408
|
+
// Pre-existing reserved-slug journal with distinct content.
|
|
409
|
+
const existing = {
|
|
410
|
+
version: "2",
|
|
411
|
+
lastSync: "2026-05-22T12:00:00.000Z",
|
|
412
|
+
files: {
|
|
413
|
+
"core/keep-me.md": {
|
|
414
|
+
hash: "keep",
|
|
415
|
+
size: 7,
|
|
416
|
+
syncedAt: "2026-05-22T12:00:00.000Z",
|
|
417
|
+
direction: "up",
|
|
418
|
+
},
|
|
419
|
+
},
|
|
420
|
+
pulls: [],
|
|
421
|
+
};
|
|
422
|
+
writeJournal(PERSONAL_VAULT_JOURNAL_SLUG, existing);
|
|
423
|
+
writeJournal("personal", legacyJournal());
|
|
424
|
+
migratePersonalVaultJournal();
|
|
425
|
+
const after = readJournal(PERSONAL_VAULT_JOURNAL_SLUG);
|
|
426
|
+
expect(after.files["core/keep-me.md"]).toBeDefined();
|
|
427
|
+
// The legacy entry was NOT copied over the existing reserved journal.
|
|
428
|
+
expect(after.files[".claude/skills/deep-plan/SKILL.md"]).toBeUndefined();
|
|
429
|
+
});
|
|
430
|
+
it("no-ops when the legacy 'personal' journal is absent", () => {
|
|
431
|
+
expect(fs.existsSync(getJournalPath("personal"))).toBe(false);
|
|
432
|
+
migratePersonalVaultJournal();
|
|
433
|
+
expect(fs.existsSync(getJournalPath(PERSONAL_VAULT_JOURNAL_SLUG))).toBe(false);
|
|
434
|
+
});
|
|
435
|
+
});
|
|
359
436
|
});
|
|
360
437
|
//# sourceMappingURL=journal.test.js.map
|
package/dist/journal.test.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journal.test.js","sourceRoot":"","sources":["../src/journal.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"journal.test.js","sourceRoot":"","sources":["../src/journal.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -26,6 +26,7 @@ import type {
|
|
|
26
26
|
WatcherSurface,
|
|
27
27
|
} from "./sync-runner.js";
|
|
28
28
|
import { FakeClock } from "../watcher.js";
|
|
29
|
+
import { PERSONAL_VAULT_JOURNAL_SLUG } from "../journal.js";
|
|
29
30
|
import type { SyncResult, SyncOptions } from "../cli/sync.js";
|
|
30
31
|
import type { ShareResult, ShareOptions } from "../cli/share.js";
|
|
31
32
|
import type {
|
|
@@ -35,6 +36,26 @@ import type {
|
|
|
35
36
|
} from "../vault-client.js";
|
|
36
37
|
import { VaultAuthError } from "../vault-client.js";
|
|
37
38
|
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Hermetic journal state — the runner now calls migratePersonalVaultJournal()
|
|
41
|
+
// on every --companies fanout (one-time seed of the reserved vault journal
|
|
42
|
+
// slug). Point HQ_STATE_DIR at a throwaway temp dir for every test so that
|
|
43
|
+
// seed can never read or write the developer's real ~/.hq journals.
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
let __runnerTestStateDir: string | undefined;
|
|
47
|
+
beforeEach(() => {
|
|
48
|
+
__runnerTestStateDir = fs.mkdtempSync(path.join(os.tmpdir(), "hq-runner-state-"));
|
|
49
|
+
process.env.HQ_STATE_DIR = __runnerTestStateDir;
|
|
50
|
+
});
|
|
51
|
+
afterEach(() => {
|
|
52
|
+
if (__runnerTestStateDir) {
|
|
53
|
+
fs.rmSync(__runnerTestStateDir, { recursive: true, force: true });
|
|
54
|
+
__runnerTestStateDir = undefined;
|
|
55
|
+
}
|
|
56
|
+
delete process.env.HQ_STATE_DIR;
|
|
57
|
+
});
|
|
58
|
+
|
|
38
59
|
// ---------------------------------------------------------------------------
|
|
39
60
|
// Capturing writer — collects writes so we can assert on the ndjson stream
|
|
40
61
|
// ---------------------------------------------------------------------------
|
|
@@ -581,13 +602,22 @@ describe("per-company fanout", () => {
|
|
|
581
602
|
.filter((e): e is Extract<RunnerEvent, { type: "progress" }> =>
|
|
582
603
|
e.type === "progress",
|
|
583
604
|
);
|
|
605
|
+
// A pull-only run (default direction) stamps every progress event
|
|
606
|
+
// `direction: "down"` so the menubar can label these as downloads.
|
|
584
607
|
expect(progressEvents).toEqual([
|
|
585
|
-
{
|
|
608
|
+
{
|
|
609
|
+
type: "progress",
|
|
610
|
+
company: "acme",
|
|
611
|
+
path: "notes.md",
|
|
612
|
+
bytes: 42,
|
|
613
|
+
direction: "down",
|
|
614
|
+
},
|
|
586
615
|
{
|
|
587
616
|
type: "progress",
|
|
588
617
|
company: "acme",
|
|
589
618
|
path: "shared/doc.md",
|
|
590
619
|
bytes: 1024,
|
|
620
|
+
direction: "down",
|
|
591
621
|
message: "draft update",
|
|
592
622
|
},
|
|
593
623
|
]);
|
|
@@ -1367,8 +1397,16 @@ describe("--direction", () => {
|
|
|
1367
1397
|
.filter((e): e is Extract<RunnerEvent, { type: "progress" }> =>
|
|
1368
1398
|
e.type === "progress",
|
|
1369
1399
|
);
|
|
1400
|
+
// Push-phase progress events stamp `direction: "up"` so the menubar
|
|
1401
|
+
// labels them as uploads in the activity log.
|
|
1370
1402
|
expect(progress).toEqual([
|
|
1371
|
-
{
|
|
1403
|
+
{
|
|
1404
|
+
type: "progress",
|
|
1405
|
+
company: "acme",
|
|
1406
|
+
path: "docs/a.md",
|
|
1407
|
+
bytes: 100,
|
|
1408
|
+
direction: "up",
|
|
1409
|
+
},
|
|
1372
1410
|
]);
|
|
1373
1411
|
});
|
|
1374
1412
|
});
|
|
@@ -1417,14 +1455,19 @@ describe("personal slot fanout", () => {
|
|
|
1417
1455
|
expect(planEvent).toBeDefined();
|
|
1418
1456
|
|
|
1419
1457
|
const lastEntry = planEvent.companies[planEvent.companies.length - 1];
|
|
1458
|
+
// Display slug stays "personal" (menubar UI); only the journal slug is
|
|
1459
|
+
// decoupled to the reserved sentinel to avoid colliding with the
|
|
1460
|
+
// companies/personal company journal.
|
|
1420
1461
|
expect(lastEntry.slug).toBe("personal");
|
|
1421
1462
|
expect(lastEntry.uid).toBe("prs_older");
|
|
1422
1463
|
expect((lastEntry as Record<string, unknown>).bucketName).toBe("hq-vault-prs-older");
|
|
1423
1464
|
expect((lastEntry as Record<string, unknown>).personalMode).toBe(true);
|
|
1424
|
-
expect((lastEntry as Record<string, unknown>).journalSlug).toBe(
|
|
1465
|
+
expect((lastEntry as Record<string, unknown>).journalSlug).toBe(
|
|
1466
|
+
PERSONAL_VAULT_JOURNAL_SLUG,
|
|
1467
|
+
);
|
|
1425
1468
|
});
|
|
1426
1469
|
|
|
1427
|
-
it("B: syncFn invoked with personalMode: true + journalSlug
|
|
1470
|
+
it("B: syncFn invoked with personalMode: true + reserved journalSlug for personal slot", async () => {
|
|
1428
1471
|
const syncSpy = vi.fn().mockResolvedValue(defaultSyncResult());
|
|
1429
1472
|
const deps = makeDeps({
|
|
1430
1473
|
createVaultClient: () =>
|
|
@@ -1446,7 +1489,7 @@ describe("personal slot fanout", () => {
|
|
|
1446
1489
|
expect(personalCall).toBeDefined();
|
|
1447
1490
|
const personalArgs = personalCall![0];
|
|
1448
1491
|
expect(personalArgs.personalMode).toBe(true);
|
|
1449
|
-
expect(personalArgs.journalSlug).toBe(
|
|
1492
|
+
expect(personalArgs.journalSlug).toBe(PERSONAL_VAULT_JOURNAL_SLUG);
|
|
1450
1493
|
});
|
|
1451
1494
|
|
|
1452
1495
|
it("C: company slots' syncFn args do NOT contain personalMode or journalSlug", async () => {
|
|
@@ -1484,10 +1527,11 @@ describe("personal slot fanout", () => {
|
|
|
1484
1527
|
// .git/, companies/, core/, data/, personal/, repos/, workspace/ are
|
|
1485
1528
|
// skipped; every other top-level entry under hq_root is shared. The
|
|
1486
1529
|
// runner enforces this by passing pre-filtered top-level paths to share()
|
|
1487
|
-
// along with personalMode: true +
|
|
1488
|
-
// keys files hq-root-relative and writes the
|
|
1530
|
+
// along with personalMode: true + the reserved personal-vault journalSlug
|
|
1531
|
+
// so share() keys files hq-root-relative and writes the vault journal
|
|
1532
|
+
// (decoupled from the companies/personal company journal).
|
|
1489
1533
|
|
|
1490
|
-
it("D: shareFn invoked with personalMode: true + journalSlug
|
|
1534
|
+
it("D: shareFn invoked with personalMode: true + reserved journalSlug for personal slot (push side)", async () => {
|
|
1491
1535
|
const shareSpy = vi.fn().mockResolvedValue(defaultShareResult());
|
|
1492
1536
|
const tmpHqRoot = fs.mkdtempSync(path.join(os.tmpdir(), "hq-runner-test-"));
|
|
1493
1537
|
try {
|
|
@@ -1523,7 +1567,7 @@ describe("personal slot fanout", () => {
|
|
|
1523
1567
|
journalSlug?: string;
|
|
1524
1568
|
};
|
|
1525
1569
|
expect(personalArgs.personalMode).toBe(true);
|
|
1526
|
-
expect(personalArgs.journalSlug).toBe(
|
|
1570
|
+
expect(personalArgs.journalSlug).toBe(PERSONAL_VAULT_JOURNAL_SLUG);
|
|
1527
1571
|
} finally {
|
|
1528
1572
|
fs.rmSync(tmpHqRoot, { recursive: true, force: true });
|
|
1529
1573
|
}
|
package/src/bin/sync-runner.ts
CHANGED
|
@@ -99,6 +99,10 @@ import {
|
|
|
99
99
|
type PushReceiver,
|
|
100
100
|
type SyncEngineFn,
|
|
101
101
|
} from "../sync/push-receiver.js";
|
|
102
|
+
import {
|
|
103
|
+
PERSONAL_VAULT_JOURNAL_SLUG,
|
|
104
|
+
migratePersonalVaultJournal,
|
|
105
|
+
} from "../journal.js";
|
|
102
106
|
|
|
103
107
|
/**
|
|
104
108
|
* Sync direction for a run.
|
|
@@ -809,13 +813,25 @@ export async function runRunner(
|
|
|
809
813
|
uid: pick.uid,
|
|
810
814
|
bucketName: pick.bucketName,
|
|
811
815
|
personalMode: true,
|
|
812
|
-
|
|
816
|
+
// Reserved sentinel slug — decoupled from the `companies/personal`
|
|
817
|
+
// company slug to avoid sharing `sync-journal.personal.json`. The
|
|
818
|
+
// display `slug` stays "personal" (menubar UI); only the journal
|
|
819
|
+
// shard changes. See PERSONAL_VAULT_JOURNAL_SLUG for the full
|
|
820
|
+
// root-cause writeup.
|
|
821
|
+
journalSlug: PERSONAL_VAULT_JOURNAL_SLUG,
|
|
813
822
|
});
|
|
814
823
|
}
|
|
815
824
|
}
|
|
816
825
|
|
|
817
826
|
emit({ type: "fanout-plan", companies: plan });
|
|
818
827
|
|
|
828
|
+
// One-time seed of the reserved personal-vault journal from the legacy
|
|
829
|
+
// "personal" journal, so switching the vault slot off the colliding slug
|
|
830
|
+
// does NOT trigger a mass re-upload of the HQ overlay on first run. No-op
|
|
831
|
+
// when the new journal already exists or the legacy one is absent, and
|
|
832
|
+
// harmless even when the personal-vault slot is not in the plan.
|
|
833
|
+
migratePersonalVaultJournal();
|
|
834
|
+
|
|
819
835
|
// ---- fanout -----------------------------------------------------------
|
|
820
836
|
const syncFn = deps.sync ?? defaultSync;
|
|
821
837
|
const shareFn = deps.share ?? defaultShare;
|
|
@@ -897,7 +913,13 @@ export async function runRunner(
|
|
|
897
913
|
company: companyLabel,
|
|
898
914
|
path: event.path,
|
|
899
915
|
bytes: event.bytes,
|
|
916
|
+
// Stamp the transfer direction from the in-flight phase so the
|
|
917
|
+
// menubar can label each file uploaded vs downloaded. The inner
|
|
918
|
+
// share()/sync() emitters don't know the phase — only this tagger,
|
|
919
|
+
// which mirrors the up/down counter bump above.
|
|
920
|
+
direction: activePhase === "push" ? "up" : "down",
|
|
900
921
|
...(event.message ? { message: event.message } : {}),
|
|
922
|
+
...(event.deleted ? { deleted: event.deleted } : {}),
|
|
901
923
|
});
|
|
902
924
|
} else if (event.type === "conflict") {
|
|
903
925
|
emit({
|
package/src/cli/sync.ts
CHANGED
|
@@ -81,6 +81,16 @@ export type SyncProgressEvent =
|
|
|
81
81
|
message?: string;
|
|
82
82
|
/** True when this event reports a remote DeleteObject (no upload). */
|
|
83
83
|
deleted?: boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Transfer direction for this file, stamped by the runner's per-company
|
|
86
|
+
* tagger from the in-flight phase: `"up"` for a push (local→S3 upload),
|
|
87
|
+
* `"down"` for a pull (S3→local download). Optional because the inner
|
|
88
|
+
* `share()`/`sync()` emitters don't know the run-level phase — only the
|
|
89
|
+
* runner's `tagAndEmit` does, and it sets this when re-emitting to stdout.
|
|
90
|
+
* Consumers (the menubar activity log) use it to label each file
|
|
91
|
+
* uploaded vs downloaded.
|
|
92
|
+
*/
|
|
93
|
+
direction?: "up" | "down";
|
|
84
94
|
}
|
|
85
95
|
| { type: "error"; path: string; message: string }
|
|
86
96
|
| {
|
package/src/journal.test.ts
CHANGED
|
@@ -24,6 +24,8 @@ import {
|
|
|
24
24
|
gcTombstones,
|
|
25
25
|
generatePullId,
|
|
26
26
|
TOMBSTONE_TTL_MS,
|
|
27
|
+
PERSONAL_VAULT_JOURNAL_SLUG,
|
|
28
|
+
migratePersonalVaultJournal,
|
|
27
29
|
} from "./journal.js";
|
|
28
30
|
import type { SyncJournal, PullRecord } from "./types.js";
|
|
29
31
|
|
|
@@ -422,4 +424,103 @@ describe("journal", () => {
|
|
|
422
424
|
expect(j.files["bogus.md"]).toBeDefined();
|
|
423
425
|
});
|
|
424
426
|
});
|
|
427
|
+
|
|
428
|
+
// ── Personal-vault journal-slug collision fix ──────────────────────────────
|
|
429
|
+
//
|
|
430
|
+
// Root cause: the --companies fanout's personal-vault slot journaled under
|
|
431
|
+
// the literal slug "personal", colliding with the companies/personal
|
|
432
|
+
// company (entity slug "personal"). The two targets have different sync
|
|
433
|
+
// roots, so the company's whole-tree delete-plan walked the shared
|
|
434
|
+
// sync-journal.personal.json, resolved the vault's hq-root keys against
|
|
435
|
+
// hqRoot/companies/personal (where they don't exist), tombstoned them as
|
|
436
|
+
// "remote already 404", and dropped them — only for the vault slot to
|
|
437
|
+
// re-upload them next cycle (~190 .claude/skills/* files of churn/sync).
|
|
438
|
+
describe("PERSONAL_VAULT_JOURNAL_SLUG", () => {
|
|
439
|
+
it("is decoupled from the 'personal' company slug", () => {
|
|
440
|
+
expect(PERSONAL_VAULT_JOURNAL_SLUG).not.toBe("personal");
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
it("survives sanitizeSlug unchanged (no path/dot/empty mangling)", () => {
|
|
444
|
+
// getJournalPath runs the slug through sanitizeSlug; the sentinel must
|
|
445
|
+
// pass through verbatim (it is all [a-zA-Z0-9_-] and not all [_-]).
|
|
446
|
+
expect(getJournalPath(PERSONAL_VAULT_JOURNAL_SLUG)).toBe(
|
|
447
|
+
path.join(
|
|
448
|
+
stateDir,
|
|
449
|
+
`sync-journal.${PERSONAL_VAULT_JOURNAL_SLUG}.json`,
|
|
450
|
+
),
|
|
451
|
+
);
|
|
452
|
+
});
|
|
453
|
+
|
|
454
|
+
it("maps to a different journal file than 'personal'", () => {
|
|
455
|
+
expect(getJournalPath(PERSONAL_VAULT_JOURNAL_SLUG)).not.toBe(
|
|
456
|
+
getJournalPath("personal"),
|
|
457
|
+
);
|
|
458
|
+
});
|
|
459
|
+
});
|
|
460
|
+
|
|
461
|
+
describe("migratePersonalVaultJournal", () => {
|
|
462
|
+
const legacyJournal = (): SyncJournal => ({
|
|
463
|
+
version: "2",
|
|
464
|
+
lastSync: "2026-05-22T00:00:00.000Z",
|
|
465
|
+
files: {
|
|
466
|
+
".claude/skills/deep-plan/SKILL.md": {
|
|
467
|
+
hash: "abc123",
|
|
468
|
+
size: 42,
|
|
469
|
+
syncedAt: "2026-05-22T00:00:00.000Z",
|
|
470
|
+
direction: "up",
|
|
471
|
+
},
|
|
472
|
+
},
|
|
473
|
+
pulls: [],
|
|
474
|
+
});
|
|
475
|
+
|
|
476
|
+
it("seeds the reserved slug from the legacy 'personal' journal when absent", () => {
|
|
477
|
+
writeJournal("personal", legacyJournal());
|
|
478
|
+
expect(fs.existsSync(getJournalPath(PERSONAL_VAULT_JOURNAL_SLUG))).toBe(false);
|
|
479
|
+
|
|
480
|
+
migratePersonalVaultJournal();
|
|
481
|
+
|
|
482
|
+
expect(fs.existsSync(getJournalPath(PERSONAL_VAULT_JOURNAL_SLUG))).toBe(true);
|
|
483
|
+
const seeded = readJournal(PERSONAL_VAULT_JOURNAL_SLUG);
|
|
484
|
+
// The hq-root-relative vault entry is preserved so it is NOT re-uploaded.
|
|
485
|
+
expect(seeded.files[".claude/skills/deep-plan/SKILL.md"]).toEqual(
|
|
486
|
+
legacyJournal().files[".claude/skills/deep-plan/SKILL.md"],
|
|
487
|
+
);
|
|
488
|
+
// Legacy journal is left intact (still used by the companies/personal company).
|
|
489
|
+
expect(fs.existsSync(getJournalPath("personal"))).toBe(true);
|
|
490
|
+
});
|
|
491
|
+
|
|
492
|
+
it("is idempotent — does not clobber an existing reserved-slug journal", () => {
|
|
493
|
+
// Pre-existing reserved-slug journal with distinct content.
|
|
494
|
+
const existing: SyncJournal = {
|
|
495
|
+
version: "2",
|
|
496
|
+
lastSync: "2026-05-22T12:00:00.000Z",
|
|
497
|
+
files: {
|
|
498
|
+
"core/keep-me.md": {
|
|
499
|
+
hash: "keep",
|
|
500
|
+
size: 7,
|
|
501
|
+
syncedAt: "2026-05-22T12:00:00.000Z",
|
|
502
|
+
direction: "up",
|
|
503
|
+
},
|
|
504
|
+
},
|
|
505
|
+
pulls: [],
|
|
506
|
+
};
|
|
507
|
+
writeJournal(PERSONAL_VAULT_JOURNAL_SLUG, existing);
|
|
508
|
+
writeJournal("personal", legacyJournal());
|
|
509
|
+
|
|
510
|
+
migratePersonalVaultJournal();
|
|
511
|
+
|
|
512
|
+
const after = readJournal(PERSONAL_VAULT_JOURNAL_SLUG);
|
|
513
|
+
expect(after.files["core/keep-me.md"]).toBeDefined();
|
|
514
|
+
// The legacy entry was NOT copied over the existing reserved journal.
|
|
515
|
+
expect(after.files[".claude/skills/deep-plan/SKILL.md"]).toBeUndefined();
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
it("no-ops when the legacy 'personal' journal is absent", () => {
|
|
519
|
+
expect(fs.existsSync(getJournalPath("personal"))).toBe(false);
|
|
520
|
+
|
|
521
|
+
migratePersonalVaultJournal();
|
|
522
|
+
|
|
523
|
+
expect(fs.existsSync(getJournalPath(PERSONAL_VAULT_JOURNAL_SLUG))).toBe(false);
|
|
524
|
+
});
|
|
525
|
+
});
|
|
425
526
|
});
|
package/src/journal.ts
CHANGED
|
@@ -60,6 +60,58 @@ export function getJournalPath(slug: string): string {
|
|
|
60
60
|
);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Reserved journal slug for the personal-vault fanout slot in the `--companies`
|
|
65
|
+
* runner. The vault slot uploads the whole HQ overlay (`.claude/`, `core/`,
|
|
66
|
+
* `personal/`, …) and journals hq-root-relative keys; its `syncRoot` is the HQ
|
|
67
|
+
* root itself.
|
|
68
|
+
*
|
|
69
|
+
* It MUST NOT share a journal with any real cloud company. Previously the slot
|
|
70
|
+
* used the literal slug `"personal"`, which collided with the
|
|
71
|
+
* `companies/personal` company (whose entity slug is also `"personal"`). The
|
|
72
|
+
* two targets have different sync roots, so the company's whole-tree
|
|
73
|
+
* `computeDeletePlan` walked the shared `sync-journal.personal.json`, resolved
|
|
74
|
+
* the vault's hq-root keys against `hqRoot/companies/personal` (where they
|
|
75
|
+
* don't exist), tombstoned them as "remote already 404", and dropped them from
|
|
76
|
+
* the journal — only for the vault slot to re-upload them next cycle. ~190
|
|
77
|
+
* `.claude/skills/*` files churned every sync.
|
|
78
|
+
*
|
|
79
|
+
* This sentinel value can never be produced by a real company slug from the
|
|
80
|
+
* entity service (which yields URL-safe lowercase slugs without leading
|
|
81
|
+
* underscores), and it survives `sanitizeSlug` unchanged (only `[a-zA-Z0-9_-]`
|
|
82
|
+
* chars; the embedded letters keep it off the all-`[_-]` reject path).
|
|
83
|
+
*/
|
|
84
|
+
export const PERSONAL_VAULT_JOURNAL_SLUG = "__hq_personal_vault__";
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* One-time seed migration for the personal-vault journal slug.
|
|
88
|
+
*
|
|
89
|
+
* Before this fix the personal-vault slot journaled under the slug
|
|
90
|
+
* `"personal"`. After the fix it journals under
|
|
91
|
+
* `PERSONAL_VAULT_JOURNAL_SLUG`. Without a seed, the first run under the new
|
|
92
|
+
* slug would start from an empty journal and re-upload the entire HQ overlay.
|
|
93
|
+
*
|
|
94
|
+
* To avoid that mass re-upload, this copies the legacy `sync-journal.personal.json`
|
|
95
|
+
* to `sync-journal.__hq_personal_vault__.json` exactly once: only when the new
|
|
96
|
+
* file does NOT exist and the legacy file DOES. Idempotent — a no-op when the
|
|
97
|
+
* new file already exists or the legacy file is absent.
|
|
98
|
+
*
|
|
99
|
+
* The legacy `personal` journal is left untouched (it is still the journal for
|
|
100
|
+
* the real `companies/personal` company). After the seed, both journals
|
|
101
|
+
* converge after one cleanup cycle: the legacy `personal` journal tombstones
|
|
102
|
+
* the now-foreign hq-root keys once; the new vault journal tombstones any
|
|
103
|
+
* companies/personal-relative keys once. That single convergence pass is
|
|
104
|
+
* expected and harmless.
|
|
105
|
+
*/
|
|
106
|
+
export function migratePersonalVaultJournal(): void {
|
|
107
|
+
const newPath = getJournalPath(PERSONAL_VAULT_JOURNAL_SLUG);
|
|
108
|
+
if (fs.existsSync(newPath)) return;
|
|
109
|
+
const legacyPath = getJournalPath("personal");
|
|
110
|
+
if (!fs.existsSync(legacyPath)) return;
|
|
111
|
+
const legacy = readJournal("personal");
|
|
112
|
+
writeJournal(PERSONAL_VAULT_JOURNAL_SLUG, legacy);
|
|
113
|
+
}
|
|
114
|
+
|
|
63
115
|
/**
|
|
64
116
|
* Read a per-company journal from disk.
|
|
65
117
|
*
|