@pleri/olam-cli 0.1.70 → 0.1.73
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/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +2 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/runbooks.d.ts +13 -0
- package/dist/commands/runbooks.d.ts.map +1 -0
- package/dist/commands/runbooks.js +189 -0
- package/dist/commands/runbooks.js.map +1 -0
- package/dist/commands/world-snapshot.d.ts +1 -0
- package/dist/commands/world-snapshot.d.ts.map +1 -1
- package/dist/commands/world-snapshot.js +126 -1
- package/dist/commands/world-snapshot.js.map +1 -1
- package/dist/commands/worldspec/compile.d.ts +20 -0
- package/dist/commands/worldspec/compile.d.ts.map +1 -0
- package/dist/commands/worldspec/compile.js +130 -0
- package/dist/commands/worldspec/compile.js.map +1 -0
- package/dist/commands/worldspec/index.d.ts +12 -0
- package/dist/commands/worldspec/index.d.ts.map +1 -0
- package/dist/commands/worldspec/index.js +23 -0
- package/dist/commands/worldspec/index.js.map +1 -0
- package/dist/commands/worldspec/init.d.ts +15 -0
- package/dist/commands/worldspec/init.d.ts.map +1 -0
- package/dist/commands/worldspec/init.js +166 -0
- package/dist/commands/worldspec/init.js.map +1 -0
- package/dist/commands/worldspec/schema.d.ts +11 -0
- package/dist/commands/worldspec/schema.d.ts.map +1 -0
- package/dist/commands/worldspec/schema.js +55 -0
- package/dist/commands/worldspec/schema.js.map +1 -0
- package/dist/commands/worldspec/validate.d.ts +15 -0
- package/dist/commands/worldspec/validate.d.ts.map +1 -0
- package/dist/commands/worldspec/validate.js +66 -0
- package/dist/commands/worldspec/validate.js.map +1 -0
- package/dist/exit-codes.d.ts +32 -0
- package/dist/exit-codes.d.ts.map +1 -1
- package/dist/exit-codes.js +32 -0
- package/dist/exit-codes.js.map +1 -1
- package/dist/image-digests.json +5 -5
- package/dist/index.js +4379 -897
- package/dist/index.js.map +1 -1
- package/dist/mcp-server.js +1252 -286
- package/host-cp/src/global-config-source.mjs +71 -0
- package/host-cp/src/listening-server-poller.mjs +1 -1
- package/host-cp/src/plan-orchestrator.mjs +21 -2
- package/host-cp/src/port-bridge-manager.mjs +1 -1
- package/host-cp/src/server.mjs +46 -7
- package/package.json +4 -2
- package/dist/__tests__/audit-publish-deps-contract.test.d.ts +0 -26
- package/dist/__tests__/audit-publish-deps-contract.test.d.ts.map +0 -1
- package/dist/__tests__/audit-publish-deps-contract.test.js +0 -86
- package/dist/__tests__/audit-publish-deps-contract.test.js.map +0 -1
- package/dist/__tests__/auth-status.test.d.ts +0 -2
- package/dist/__tests__/auth-status.test.d.ts.map +0 -1
- package/dist/__tests__/auth-status.test.js +0 -291
- package/dist/__tests__/auth-status.test.js.map +0 -1
- package/dist/__tests__/auth-upgrade.test.d.ts +0 -9
- package/dist/__tests__/auth-upgrade.test.d.ts.map +0 -1
- package/dist/__tests__/auth-upgrade.test.js +0 -397
- package/dist/__tests__/auth-upgrade.test.js.map +0 -1
- package/dist/__tests__/bootstrap-tag-mcp-auth.test.d.ts +0 -22
- package/dist/__tests__/bootstrap-tag-mcp-auth.test.d.ts.map +0 -1
- package/dist/__tests__/bootstrap-tag-mcp-auth.test.js +0 -63
- package/dist/__tests__/bootstrap-tag-mcp-auth.test.js.map +0 -1
- package/dist/__tests__/cli-mcp-revoke.test.d.ts +0 -8
- package/dist/__tests__/cli-mcp-revoke.test.d.ts.map +0 -1
- package/dist/__tests__/cli-mcp-revoke.test.js +0 -124
- package/dist/__tests__/cli-mcp-revoke.test.js.map +0 -1
- package/dist/__tests__/config.test.d.ts +0 -2
- package/dist/__tests__/config.test.d.ts.map +0 -1
- package/dist/__tests__/config.test.js +0 -95
- package/dist/__tests__/config.test.js.map +0 -1
- package/dist/__tests__/create-app-urls.test.d.ts +0 -2
- package/dist/__tests__/create-app-urls.test.d.ts.map +0 -1
- package/dist/__tests__/create-app-urls.test.js +0 -102
- package/dist/__tests__/create-app-urls.test.js.map +0 -1
- package/dist/__tests__/docker-host.test.d.ts +0 -14
- package/dist/__tests__/docker-host.test.d.ts.map +0 -1
- package/dist/__tests__/docker-host.test.js +0 -109
- package/dist/__tests__/docker-host.test.js.map +0 -1
- package/dist/__tests__/enter.test.d.ts +0 -2
- package/dist/__tests__/enter.test.d.ts.map +0 -1
- package/dist/__tests__/enter.test.js +0 -90
- package/dist/__tests__/enter.test.js.map +0 -1
- package/dist/__tests__/help-output.test.d.ts +0 -2
- package/dist/__tests__/help-output.test.d.ts.map +0 -1
- package/dist/__tests__/help-output.test.js +0 -74
- package/dist/__tests__/help-output.test.js.map +0 -1
- package/dist/__tests__/host-cp-gh-token.test.d.ts +0 -9
- package/dist/__tests__/host-cp-gh-token.test.d.ts.map +0 -1
- package/dist/__tests__/host-cp-gh-token.test.js +0 -129
- package/dist/__tests__/host-cp-gh-token.test.js.map +0 -1
- package/dist/__tests__/host-cp.test.d.ts +0 -9
- package/dist/__tests__/host-cp.test.d.ts.map +0 -1
- package/dist/__tests__/host-cp.test.js +0 -335
- package/dist/__tests__/host-cp.test.js.map +0 -1
- package/dist/__tests__/image-presence.test.d.ts +0 -2
- package/dist/__tests__/image-presence.test.d.ts.map +0 -1
- package/dist/__tests__/image-presence.test.js +0 -44
- package/dist/__tests__/image-presence.test.js.map +0 -1
- package/dist/__tests__/install-root.test.d.ts +0 -2
- package/dist/__tests__/install-root.test.d.ts.map +0 -1
- package/dist/__tests__/install-root.test.js +0 -119
- package/dist/__tests__/install-root.test.js.map +0 -1
- package/dist/__tests__/keys.test.d.ts +0 -9
- package/dist/__tests__/keys.test.d.ts.map +0 -1
- package/dist/__tests__/keys.test.js +0 -145
- package/dist/__tests__/keys.test.js.map +0 -1
- package/dist/__tests__/logs.test.d.ts +0 -9
- package/dist/__tests__/logs.test.d.ts.map +0 -1
- package/dist/__tests__/logs.test.js +0 -124
- package/dist/__tests__/logs.test.js.map +0 -1
- package/dist/__tests__/mcp-import.test.d.ts +0 -11
- package/dist/__tests__/mcp-import.test.d.ts.map +0 -1
- package/dist/__tests__/mcp-import.test.js +0 -134
- package/dist/__tests__/mcp-import.test.js.map +0 -1
- package/dist/__tests__/protocol-version.test.d.ts +0 -2
- package/dist/__tests__/protocol-version.test.d.ts.map +0 -1
- package/dist/__tests__/protocol-version.test.js +0 -170
- package/dist/__tests__/protocol-version.test.js.map +0 -1
- package/dist/__tests__/ps.test.d.ts +0 -2
- package/dist/__tests__/ps.test.d.ts.map +0 -1
- package/dist/__tests__/ps.test.js +0 -172
- package/dist/__tests__/ps.test.js.map +0 -1
- package/dist/__tests__/registry-allowlist.test.d.ts +0 -2
- package/dist/__tests__/registry-allowlist.test.d.ts.map +0 -1
- package/dist/__tests__/registry-allowlist.test.js +0 -129
- package/dist/__tests__/registry-allowlist.test.js.map +0 -1
- package/dist/__tests__/services.test.d.ts +0 -8
- package/dist/__tests__/services.test.d.ts.map +0 -1
- package/dist/__tests__/services.test.js +0 -185
- package/dist/__tests__/services.test.js.map +0 -1
- package/dist/__tests__/status-app-urls.test.d.ts +0 -2
- package/dist/__tests__/status-app-urls.test.d.ts.map +0 -1
- package/dist/__tests__/status-app-urls.test.js +0 -125
- package/dist/__tests__/status-app-urls.test.js.map +0 -1
- package/dist/__tests__/upgrade-gh-token-contract.test.d.ts +0 -19
- package/dist/__tests__/upgrade-gh-token-contract.test.d.ts.map +0 -1
- package/dist/__tests__/upgrade-gh-token-contract.test.js +0 -63
- package/dist/__tests__/upgrade-gh-token-contract.test.js.map +0 -1
- package/dist/__tests__/upgrade.test.d.ts +0 -9
- package/dist/__tests__/upgrade.test.d.ts.map +0 -1
- package/dist/__tests__/upgrade.test.js +0 -586
- package/dist/__tests__/upgrade.test.js.map +0 -1
- package/dist/commands/__tests__/__fixtures__/upgrade-helpers.d.ts +0 -6
- package/dist/commands/__tests__/__fixtures__/upgrade-helpers.d.ts.map +0 -1
- package/dist/commands/__tests__/__fixtures__/upgrade-helpers.js +0 -26
- package/dist/commands/__tests__/__fixtures__/upgrade-helpers.js.map +0 -1
- package/dist/commands/__tests__/begin.test.d.ts +0 -7
- package/dist/commands/__tests__/begin.test.d.ts.map +0 -1
- package/dist/commands/__tests__/begin.test.js +0 -72
- package/dist/commands/__tests__/begin.test.js.map +0 -1
- package/dist/commands/__tests__/bootstrap.test.d.ts +0 -2
- package/dist/commands/__tests__/bootstrap.test.d.ts.map +0 -1
- package/dist/commands/__tests__/bootstrap.test.js +0 -370
- package/dist/commands/__tests__/bootstrap.test.js.map +0 -1
- package/dist/commands/__tests__/carry-uncommitted.test.d.ts +0 -14
- package/dist/commands/__tests__/carry-uncommitted.test.d.ts.map +0 -1
- package/dist/commands/__tests__/carry-uncommitted.test.js +0 -83
- package/dist/commands/__tests__/carry-uncommitted.test.js.map +0 -1
- package/dist/commands/__tests__/clean.test.d.ts +0 -9
- package/dist/commands/__tests__/clean.test.d.ts.map +0 -1
- package/dist/commands/__tests__/clean.test.js +0 -105
- package/dist/commands/__tests__/clean.test.js.map +0 -1
- package/dist/commands/__tests__/crystallize.test.d.ts +0 -2
- package/dist/commands/__tests__/crystallize.test.d.ts.map +0 -1
- package/dist/commands/__tests__/crystallize.test.js +0 -133
- package/dist/commands/__tests__/crystallize.test.js.map +0 -1
- package/dist/commands/__tests__/diagnose.test.d.ts +0 -9
- package/dist/commands/__tests__/diagnose.test.d.ts.map +0 -1
- package/dist/commands/__tests__/diagnose.test.js +0 -108
- package/dist/commands/__tests__/diagnose.test.js.map +0 -1
- package/dist/commands/__tests__/openHostCpUrl.test.d.ts +0 -2
- package/dist/commands/__tests__/openHostCpUrl.test.d.ts.map +0 -1
- package/dist/commands/__tests__/openHostCpUrl.test.js +0 -63
- package/dist/commands/__tests__/openHostCpUrl.test.js.map +0 -1
- package/dist/commands/__tests__/refresh.test.d.ts +0 -13
- package/dist/commands/__tests__/refresh.test.d.ts.map +0 -1
- package/dist/commands/__tests__/refresh.test.js +0 -170
- package/dist/commands/__tests__/refresh.test.js.map +0 -1
- package/dist/commands/__tests__/status.test.d.ts +0 -8
- package/dist/commands/__tests__/status.test.d.ts.map +0 -1
- package/dist/commands/__tests__/status.test.js +0 -62
- package/dist/commands/__tests__/status.test.js.map +0 -1
- package/dist/commands/__tests__/stop.test.d.ts +0 -5
- package/dist/commands/__tests__/stop.test.d.ts.map +0 -1
- package/dist/commands/__tests__/stop.test.js +0 -30
- package/dist/commands/__tests__/stop.test.js.map +0 -1
- package/dist/commands/__tests__/update.test.d.ts +0 -7
- package/dist/commands/__tests__/update.test.d.ts.map +0 -1
- package/dist/commands/__tests__/update.test.js +0 -224
- package/dist/commands/__tests__/update.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.all-three.test.d.ts +0 -19
- package/dist/commands/__tests__/upgrade.all-three.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.all-three.test.js +0 -80
- package/dist/commands/__tests__/upgrade.all-three.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.compose-path.test.d.ts +0 -20
- package/dist/commands/__tests__/upgrade.compose-path.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.compose-path.test.js +0 -140
- package/dist/commands/__tests__/upgrade.compose-path.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.history.test.d.ts +0 -15
- package/dist/commands/__tests__/upgrade.history.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.history.test.js +0 -199
- package/dist/commands/__tests__/upgrade.history.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.lock.test.d.ts +0 -15
- package/dist/commands/__tests__/upgrade.lock.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.lock.test.js +0 -253
- package/dist/commands/__tests__/upgrade.lock.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.olam-tag.test.d.ts +0 -21
- package/dist/commands/__tests__/upgrade.olam-tag.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.olam-tag.test.js +0 -114
- package/dist/commands/__tests__/upgrade.olam-tag.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.poll.test.d.ts +0 -14
- package/dist/commands/__tests__/upgrade.poll.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.poll.test.js +0 -136
- package/dist/commands/__tests__/upgrade.poll.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.recreate.test.d.ts +0 -17
- package/dist/commands/__tests__/upgrade.recreate.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.recreate.test.js +0 -83
- package/dist/commands/__tests__/upgrade.recreate.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.rollback.test.d.ts +0 -12
- package/dist/commands/__tests__/upgrade.rollback.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.rollback.test.js +0 -255
- package/dist/commands/__tests__/upgrade.rollback.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.sha-capture.test.d.ts +0 -12
- package/dist/commands/__tests__/upgrade.sha-capture.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.sha-capture.test.js +0 -63
- package/dist/commands/__tests__/upgrade.sha-capture.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.smoke.test.d.ts +0 -19
- package/dist/commands/__tests__/upgrade.smoke.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.smoke.test.js +0 -87
- package/dist/commands/__tests__/upgrade.smoke.test.js.map +0 -1
- package/dist/commands/__tests__/upgrade.swap.test.d.ts +0 -19
- package/dist/commands/__tests__/upgrade.swap.test.d.ts.map +0 -1
- package/dist/commands/__tests__/upgrade.swap.test.js +0 -312
- package/dist/commands/__tests__/upgrade.swap.test.js.map +0 -1
- package/dist/commands/__tests__/world-upgrade.test.d.ts +0 -8
- package/dist/commands/__tests__/world-upgrade.test.d.ts.map +0 -1
- package/dist/commands/__tests__/world-upgrade.test.js +0 -73
- package/dist/commands/__tests__/world-upgrade.test.js.map +0 -1
- package/dist/lib/__tests__/symlink-reconcile.test.d.ts +0 -2
- package/dist/lib/__tests__/symlink-reconcile.test.d.ts.map +0 -1
- package/dist/lib/__tests__/symlink-reconcile.test.js +0 -106
- package/dist/lib/__tests__/symlink-reconcile.test.js.map +0 -1
|
@@ -1,312 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Phase 2a A6 — atomic 6-tag swap integration tests (real docker).
|
|
3
|
-
*
|
|
4
|
-
* Validates the load-bearing rollback contract:
|
|
5
|
-
* 1. Happy path: swap leaves canonical pointing at :olam-next images;
|
|
6
|
-
* :olam-rollback preserves the previous canonical SHAs.
|
|
7
|
-
* 2. First-upgrade tolerance: missing canonical → rollback-save fails
|
|
8
|
-
* non-fatally; canonical-advance still succeeds.
|
|
9
|
-
* 3. Canonical-advance fatality: missing :olam-next → fatal abort;
|
|
10
|
-
* partialAdvance flag set; summary references --rollback recovery.
|
|
11
|
-
* 4. SIGKILL-recovery checkpoint: :olam-rollback is fully populated
|
|
12
|
-
* BEFORE any canonical-advance touches the canonical tags.
|
|
13
|
-
*
|
|
14
|
-
* Skipped automatically when docker is unavailable (e.g. CI without daemon).
|
|
15
|
-
*
|
|
16
|
-
* Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.swap.test.ts`
|
|
17
|
-
*/
|
|
18
|
-
import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
|
|
19
|
-
import { spawnSync } from 'node:child_process';
|
|
20
|
-
import * as path from 'node:path';
|
|
21
|
-
import { performAtomicSwap, dockerTag, } from '../upgrade.js';
|
|
22
|
-
import { dockerAvailable, REPO_ROOT, ATOMIC_SWAP_FIXTURE_DIR as FIXTURE_DIR } from './__fixtures__/upgrade-helpers.js';
|
|
23
|
-
const HAS_DOCKER = dockerAvailable();
|
|
24
|
-
const TAG_PREFIX = `olam-test-swap-${process.pid}`;
|
|
25
|
-
// Test plan: 3 distinct test images so collisions with real olam-* images
|
|
26
|
-
// can't happen.
|
|
27
|
-
const TEST_PLAN = [
|
|
28
|
-
{
|
|
29
|
-
transient: `${TAG_PREFIX}-a:olam-next`,
|
|
30
|
-
canonical: `${TAG_PREFIX}-a:local`,
|
|
31
|
-
rollback: `${TAG_PREFIX}-a:olam-rollback`,
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
transient: `${TAG_PREFIX}-b:olam-next`,
|
|
35
|
-
canonical: `${TAG_PREFIX}-b:latest`,
|
|
36
|
-
rollback: `${TAG_PREFIX}-b:olam-rollback`,
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
transient: `${TAG_PREFIX}-c:olam-next`,
|
|
40
|
-
canonical: `${TAG_PREFIX}-c:latest`,
|
|
41
|
-
rollback: `${TAG_PREFIX}-c:olam-rollback`,
|
|
42
|
-
},
|
|
43
|
-
];
|
|
44
|
-
const ALL_TEST_TAGS = TEST_PLAN.flatMap((p) => [p.transient, p.canonical, p.rollback]);
|
|
45
|
-
function buildFixtureImage(tag, labelValue) {
|
|
46
|
-
const result = spawnSync('docker', [
|
|
47
|
-
'build',
|
|
48
|
-
'--quiet',
|
|
49
|
-
'--build-arg', `LABEL_VAL=${labelValue}`,
|
|
50
|
-
'--tag', tag,
|
|
51
|
-
'--file', path.join(FIXTURE_DIR, 'Dockerfile.template'),
|
|
52
|
-
FIXTURE_DIR,
|
|
53
|
-
], { stdio: ['ignore', 'pipe', 'pipe'], encoding: 'utf-8' });
|
|
54
|
-
return result.status === 0;
|
|
55
|
-
}
|
|
56
|
-
function imageId(tag) {
|
|
57
|
-
const result = spawnSync('docker', ['inspect', '--format', '{{.Id}}', tag], {
|
|
58
|
-
encoding: 'utf-8',
|
|
59
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
60
|
-
});
|
|
61
|
-
if (result.status !== 0)
|
|
62
|
-
return null;
|
|
63
|
-
return (result.stdout ?? '').trim();
|
|
64
|
-
}
|
|
65
|
-
function imageExists(tag) {
|
|
66
|
-
return imageId(tag) !== null;
|
|
67
|
-
}
|
|
68
|
-
function bakedSha(tag) {
|
|
69
|
-
const result = spawnSync('docker', ['inspect', '--format', '{{index .Config.Labels "olam.build.sha"}}', tag], { encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] });
|
|
70
|
-
if (result.status !== 0)
|
|
71
|
-
return null;
|
|
72
|
-
return (result.stdout ?? '').trim();
|
|
73
|
-
}
|
|
74
|
-
function cleanupTestImages() {
|
|
75
|
-
for (const tag of ALL_TEST_TAGS) {
|
|
76
|
-
spawnSync('docker', ['rmi', '-f', tag], { stdio: ['ignore', 'ignore', 'ignore'] });
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
beforeAll(() => {
|
|
80
|
-
if (!HAS_DOCKER)
|
|
81
|
-
return;
|
|
82
|
-
cleanupTestImages();
|
|
83
|
-
}, 30_000);
|
|
84
|
-
afterAll(() => {
|
|
85
|
-
if (!HAS_DOCKER)
|
|
86
|
-
return;
|
|
87
|
-
cleanupTestImages();
|
|
88
|
-
}, 30_000);
|
|
89
|
-
beforeEach(() => {
|
|
90
|
-
if (!HAS_DOCKER)
|
|
91
|
-
return;
|
|
92
|
-
cleanupTestImages();
|
|
93
|
-
});
|
|
94
|
-
describe('performAtomicSwap — happy path (real docker)', () => {
|
|
95
|
-
it.skipIf(!HAS_DOCKER)('swaps 3 canonical tags atomically; :olam-rollback preserves previous SHAs', () => {
|
|
96
|
-
// Setup: build canonical images at OLD_SHA + transient images at NEW_SHA.
|
|
97
|
-
const OLD_SHA = '1111111111111111111111111111111111111111';
|
|
98
|
-
const NEW_SHA = '2222222222222222222222222222222222222222';
|
|
99
|
-
for (const p of TEST_PLAN) {
|
|
100
|
-
expect(buildFixtureImage(p.canonical, OLD_SHA)).toBe(true);
|
|
101
|
-
expect(buildFixtureImage(p.transient, NEW_SHA)).toBe(true);
|
|
102
|
-
}
|
|
103
|
-
// Capture pre-swap canonical IDs.
|
|
104
|
-
const preCanonicalIds = TEST_PLAN.map((p) => imageId(p.canonical));
|
|
105
|
-
const preTransientIds = TEST_PLAN.map((p) => imageId(p.transient));
|
|
106
|
-
// Execute swap.
|
|
107
|
-
const result = performAtomicSwap(TEST_PLAN);
|
|
108
|
-
// Verify result shape.
|
|
109
|
-
expect(result.ok).toBe(true);
|
|
110
|
-
expect(result.partialAdvance).toBe(false);
|
|
111
|
-
expect(result.steps.length).toBe(3);
|
|
112
|
-
for (const step of result.steps) {
|
|
113
|
-
expect(step.rollbackSaved).toBe(true);
|
|
114
|
-
expect(step.canonicalAdvanced).toBe(true);
|
|
115
|
-
}
|
|
116
|
-
// Verify post-state: canonical now points at NEW_SHA images.
|
|
117
|
-
for (let i = 0; i < TEST_PLAN.length; i++) {
|
|
118
|
-
const p = TEST_PLAN[i];
|
|
119
|
-
expect(bakedSha(p.canonical)).toBe(NEW_SHA);
|
|
120
|
-
// :olam-rollback now points at the OLD canonical image (preserved).
|
|
121
|
-
expect(imageId(p.rollback)).toBe(preCanonicalIds[i]);
|
|
122
|
-
expect(bakedSha(p.rollback)).toBe(OLD_SHA);
|
|
123
|
-
// canonical id must equal pre-swap transient id (sanity).
|
|
124
|
-
expect(imageId(p.canonical)).toBe(preTransientIds[i]);
|
|
125
|
-
}
|
|
126
|
-
}, 60_000);
|
|
127
|
-
});
|
|
128
|
-
describe('performAtomicSwap — first-upgrade tolerance', () => {
|
|
129
|
-
it.skipIf(!HAS_DOCKER)('rollback-save fails non-fatally for missing canonical; canonical-advance still succeeds', () => {
|
|
130
|
-
const NEW_SHA = '3333333333333333333333333333333333333333';
|
|
131
|
-
// Build ONLY transient images; canonical does NOT exist (first-upgrade).
|
|
132
|
-
for (const p of TEST_PLAN) {
|
|
133
|
-
expect(buildFixtureImage(p.transient, NEW_SHA)).toBe(true);
|
|
134
|
-
}
|
|
135
|
-
expect(TEST_PLAN.every((p) => !imageExists(p.canonical))).toBe(true);
|
|
136
|
-
const result = performAtomicSwap(TEST_PLAN);
|
|
137
|
-
// Result.ok is true because canonical-advance succeeded for all.
|
|
138
|
-
expect(result.ok).toBe(true);
|
|
139
|
-
expect(result.partialAdvance).toBe(false);
|
|
140
|
-
// Each step shows rollbackSaved=false (no canonical to preserve)
|
|
141
|
-
// but canonicalAdvanced=true.
|
|
142
|
-
for (const step of result.steps) {
|
|
143
|
-
expect(step.rollbackSaved).toBe(false);
|
|
144
|
-
expect(step.rollbackError).toBeTruthy();
|
|
145
|
-
expect(step.canonicalAdvanced).toBe(true);
|
|
146
|
-
}
|
|
147
|
-
// Post-state: canonical points at the new images; :olam-rollback absent.
|
|
148
|
-
for (const p of TEST_PLAN) {
|
|
149
|
-
expect(imageExists(p.canonical)).toBe(true);
|
|
150
|
-
expect(imageExists(p.rollback)).toBe(false);
|
|
151
|
-
expect(bakedSha(p.canonical)).toBe(NEW_SHA);
|
|
152
|
-
}
|
|
153
|
-
}, 60_000);
|
|
154
|
-
});
|
|
155
|
-
describe('performAtomicSwap — canonical-advance fatality', () => {
|
|
156
|
-
it.skipIf(!HAS_DOCKER)('missing :olam-next aborts the run; partialAdvance flag set; rollback set fully populated', () => {
|
|
157
|
-
const OLD_SHA = '4444444444444444444444444444444444444444';
|
|
158
|
-
const NEW_SHA = '5555555555555555555555555555555555555555';
|
|
159
|
-
// Setup: build canonical for all 3 + transient for ONLY first 2.
|
|
160
|
-
for (const p of TEST_PLAN) {
|
|
161
|
-
expect(buildFixtureImage(p.canonical, OLD_SHA)).toBe(true);
|
|
162
|
-
}
|
|
163
|
-
expect(buildFixtureImage(TEST_PLAN[0].transient, NEW_SHA)).toBe(true);
|
|
164
|
-
expect(buildFixtureImage(TEST_PLAN[1].transient, NEW_SHA)).toBe(true);
|
|
165
|
-
// Image C's transient is NOT built; advance step 6 will fail.
|
|
166
|
-
expect(imageExists(TEST_PLAN[2].transient)).toBe(false);
|
|
167
|
-
const result = performAtomicSwap(TEST_PLAN);
|
|
168
|
-
// Result.ok is false (one canonical failed to advance).
|
|
169
|
-
expect(result.ok).toBe(false);
|
|
170
|
-
expect(result.partialAdvance).toBe(true);
|
|
171
|
-
// Critical: :olam-rollback is FULLY populated for ALL THREE images
|
|
172
|
-
// before any canonical-advance is attempted (Phase 1 of the swap
|
|
173
|
-
// completed first). This is the load-bearing recovery checkpoint.
|
|
174
|
-
for (const p of TEST_PLAN) {
|
|
175
|
-
expect(imageExists(p.rollback)).toBe(true);
|
|
176
|
-
expect(bakedSha(p.rollback)).toBe(OLD_SHA);
|
|
177
|
-
}
|
|
178
|
-
// First two canonicals advanced (mixed state — recoverable via --rollback).
|
|
179
|
-
expect(bakedSha(TEST_PLAN[0].canonical)).toBe(NEW_SHA);
|
|
180
|
-
expect(bakedSha(TEST_PLAN[1].canonical)).toBe(NEW_SHA);
|
|
181
|
-
// Third canonical untouched (still OLD).
|
|
182
|
-
expect(bakedSha(TEST_PLAN[2].canonical)).toBe(OLD_SHA);
|
|
183
|
-
// Steps reflect the partial state.
|
|
184
|
-
expect(result.steps[0].canonicalAdvanced).toBe(true);
|
|
185
|
-
expect(result.steps[1].canonicalAdvanced).toBe(true);
|
|
186
|
-
expect(result.steps[2].canonicalAdvanced).toBe(false);
|
|
187
|
-
// Summary mentions --rollback recovery.
|
|
188
|
-
expect(result.summary).toContain('--rollback');
|
|
189
|
-
expect(result.summary).toContain('PARTIAL');
|
|
190
|
-
}, 60_000);
|
|
191
|
-
});
|
|
192
|
-
describe('performAtomicSwap — SIGKILL recovery invariant', () => {
|
|
193
|
-
it.skipIf(!HAS_DOCKER)(':olam-rollback is fully populated BEFORE any canonical is advanced', () => {
|
|
194
|
-
// This invariant is verified by inspecting the SwapResult's step ordering
|
|
195
|
-
// semantics (Phase 1 saves all rollbacks; Phase 2 advances canonical).
|
|
196
|
-
// The "canonical-advance fatality" test above already verifies the
|
|
197
|
-
// run-time invariant: even when Phase 2 partially fails, all 3 :olam-rollback
|
|
198
|
-
// tags exist. Additional unit-level confirmation: the function MUST
|
|
199
|
-
// visit all `rollback` targets before any `canonical` target.
|
|
200
|
-
// Build all six images at SHA-X (rollback-save will succeed for all).
|
|
201
|
-
const SHA = '7777777777777777777777777777777777777777';
|
|
202
|
-
for (const p of TEST_PLAN) {
|
|
203
|
-
expect(buildFixtureImage(p.canonical, SHA)).toBe(true);
|
|
204
|
-
expect(buildFixtureImage(p.transient, SHA)).toBe(true);
|
|
205
|
-
}
|
|
206
|
-
const result = performAtomicSwap(TEST_PLAN);
|
|
207
|
-
expect(result.ok).toBe(true);
|
|
208
|
-
// All 3 :olam-rollback exist post-swap.
|
|
209
|
-
for (const p of TEST_PLAN) {
|
|
210
|
-
expect(imageExists(p.rollback)).toBe(true);
|
|
211
|
-
}
|
|
212
|
-
}, 60_000);
|
|
213
|
-
});
|
|
214
|
-
describe('dockerTag — direct invocation', () => {
|
|
215
|
-
it.skipIf(!HAS_DOCKER)('returns ok=true for an existing source tag', () => {
|
|
216
|
-
const SHA = '8888888888888888888888888888888888888888';
|
|
217
|
-
expect(buildFixtureImage(TEST_PLAN[0].canonical, SHA)).toBe(true);
|
|
218
|
-
const result = dockerTag(TEST_PLAN[0].canonical, TEST_PLAN[0].rollback);
|
|
219
|
-
expect(result.ok).toBe(true);
|
|
220
|
-
expect(imageExists(TEST_PLAN[0].rollback)).toBe(true);
|
|
221
|
-
}, 30_000);
|
|
222
|
-
it.skipIf(!HAS_DOCKER)('returns ok=false with stderr on missing source', () => {
|
|
223
|
-
const result = dockerTag(`${TAG_PREFIX}-does-not-exist:nope`, `${TAG_PREFIX}-target:test`);
|
|
224
|
-
expect(result.ok).toBe(false);
|
|
225
|
-
expect(result.error).toBeTruthy();
|
|
226
|
-
}, 30_000);
|
|
227
|
-
});
|
|
228
|
-
describe('performAtomicSwap — rollbackCoherent flag (audit A6-001)', () => {
|
|
229
|
-
it.skipIf(!HAS_DOCKER)('rollbackCoherent=true when ALL three :olam-rollback tags written', () => {
|
|
230
|
-
const SHA = '9999999999999999999999999999999999999999';
|
|
231
|
-
for (const p of TEST_PLAN) {
|
|
232
|
-
expect(buildFixtureImage(p.canonical, SHA)).toBe(true);
|
|
233
|
-
expect(buildFixtureImage(p.transient, SHA)).toBe(true);
|
|
234
|
-
}
|
|
235
|
-
const result = performAtomicSwap(TEST_PLAN);
|
|
236
|
-
expect(result.ok).toBe(true);
|
|
237
|
-
expect(result.rollbackCoherent).toBe(true);
|
|
238
|
-
}, 60_000);
|
|
239
|
-
it.skipIf(!HAS_DOCKER)('rollbackCoherent=false when first-upgrade (canonical missing for any image)', () => {
|
|
240
|
-
const SHA = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
|
|
241
|
-
// Build only transients; canonical does not exist → rollback-save fails non-fatally.
|
|
242
|
-
for (const p of TEST_PLAN) {
|
|
243
|
-
expect(buildFixtureImage(p.transient, SHA)).toBe(true);
|
|
244
|
-
}
|
|
245
|
-
const result = performAtomicSwap(TEST_PLAN);
|
|
246
|
-
expect(result.ok).toBe(true); // canonical-advance still succeeds
|
|
247
|
-
expect(result.rollbackCoherent).toBe(false);
|
|
248
|
-
}, 60_000);
|
|
249
|
-
it.skipIf(!HAS_DOCKER)('PARTIAL summary cites --rollback only when rollbackCoherent=true', () => {
|
|
250
|
-
const OLD_SHA = 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';
|
|
251
|
-
const NEW_SHA = 'cccccccccccccccccccccccccccccccccccccccc';
|
|
252
|
-
// Build canonical for all 3 + transient for ONLY first 2 (image C transient missing).
|
|
253
|
-
for (const p of TEST_PLAN) {
|
|
254
|
-
expect(buildFixtureImage(p.canonical, OLD_SHA)).toBe(true);
|
|
255
|
-
}
|
|
256
|
-
expect(buildFixtureImage(TEST_PLAN[0].transient, NEW_SHA)).toBe(true);
|
|
257
|
-
expect(buildFixtureImage(TEST_PLAN[1].transient, NEW_SHA)).toBe(true);
|
|
258
|
-
// C transient absent → canonical-advance step 6 fails.
|
|
259
|
-
const result = performAtomicSwap(TEST_PLAN);
|
|
260
|
-
expect(result.partialAdvance).toBe(true);
|
|
261
|
-
expect(result.rollbackCoherent).toBe(true); // all 3 canonicals existed → all 3 rollbacks saved
|
|
262
|
-
expect(result.summary).toContain('--rollback');
|
|
263
|
-
expect(result.summary).not.toContain('Rollback set INCOHERENT');
|
|
264
|
-
}, 60_000);
|
|
265
|
-
it.skipIf(!HAS_DOCKER)('PARTIAL summary surfaces INCOHERENT warning when partial rollback + partial advance combine', () => {
|
|
266
|
-
const OLD_SHA = 'dddddddddddddddddddddddddddddddddddddddd';
|
|
267
|
-
const NEW_SHA = 'eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
|
|
268
|
-
// Build canonical for ONLY first 2 (image C canonical missing → its rollback-save fails).
|
|
269
|
-
// Build transient for first 2 (image C transient also missing → canonical-advance fails on step 6).
|
|
270
|
-
expect(buildFixtureImage(TEST_PLAN[0].canonical, OLD_SHA)).toBe(true);
|
|
271
|
-
expect(buildFixtureImage(TEST_PLAN[1].canonical, OLD_SHA)).toBe(true);
|
|
272
|
-
expect(buildFixtureImage(TEST_PLAN[0].transient, NEW_SHA)).toBe(true);
|
|
273
|
-
expect(buildFixtureImage(TEST_PLAN[1].transient, NEW_SHA)).toBe(true);
|
|
274
|
-
const result = performAtomicSwap(TEST_PLAN);
|
|
275
|
-
// Result: rollbackCoherent=false (image C's rollback-save failed).
|
|
276
|
-
// partialAdvance=true (images A+B advanced; C did not).
|
|
277
|
-
// Summary: should warn INCOHERENT, NOT recommend --rollback.
|
|
278
|
-
expect(result.partialAdvance).toBe(true);
|
|
279
|
-
expect(result.rollbackCoherent).toBe(false);
|
|
280
|
-
expect(result.summary).toContain('INCOHERENT');
|
|
281
|
-
expect(result.summary).toContain('Manual recovery');
|
|
282
|
-
// Critically: should NOT recommend --rollback (would mislead operator).
|
|
283
|
-
expect(result.summary).not.toMatch(/Run `olam upgrade --rollback`/);
|
|
284
|
-
}, 60_000);
|
|
285
|
-
});
|
|
286
|
-
describe('dockerTag — spawnSync-throw resilience (audit A6-003)', () => {
|
|
287
|
-
it('returns ok=false (does not propagate) on spawnSync errors', () => {
|
|
288
|
-
// We can't easily simulate fork pressure / ENOMEM without elevated perms,
|
|
289
|
-
// but we can verify the function returns a clean DockerTagResult for an
|
|
290
|
-
// invalid input that the docker daemon rejects (matches the error path
|
|
291
|
-
// shape that fork pressure would also follow).
|
|
292
|
-
const result = dockerTag('::invalid-tag-format::', '::another::');
|
|
293
|
-
expect(result.ok).toBe(false);
|
|
294
|
-
expect(result.error).toBeTruthy();
|
|
295
|
-
// The function must NOT throw — it returns a result.
|
|
296
|
-
});
|
|
297
|
-
});
|
|
298
|
-
describe('PRODUCTION_SWAP_PLAN constant', () => {
|
|
299
|
-
it('declares the canonical image:tag triples for all three components', async () => {
|
|
300
|
-
const { PRODUCTION_SWAP_PLAN } = await import('../upgrade.js');
|
|
301
|
-
expect(PRODUCTION_SWAP_PLAN.length).toBe(3);
|
|
302
|
-
const auth = PRODUCTION_SWAP_PLAN.find((p) => p.canonical === 'olam-auth:local');
|
|
303
|
-
expect(auth).toBeDefined();
|
|
304
|
-
expect(auth.transient).toBe('olam-auth:olam-next');
|
|
305
|
-
expect(auth.rollback).toBe('olam-auth:olam-rollback');
|
|
306
|
-
const devbox = PRODUCTION_SWAP_PLAN.find((p) => p.canonical === 'olam-devbox:latest');
|
|
307
|
-
expect(devbox).toBeDefined();
|
|
308
|
-
const hostCp = PRODUCTION_SWAP_PLAN.find((p) => p.canonical === 'olam-host-cp:latest');
|
|
309
|
-
expect(hostCp).toBeDefined();
|
|
310
|
-
});
|
|
311
|
-
});
|
|
312
|
-
//# sourceMappingURL=upgrade.swap.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.swap.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.swap.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"world-upgrade.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/world-upgrade.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for D4 — `olam world upgrade` command (Phase D).
|
|
3
|
-
*
|
|
4
|
-
* doWorldUpgrade is pure (injectable getWorlds/getWorld/stampPin),
|
|
5
|
-
* no @olam/adapters resolution needed.
|
|
6
|
-
*/
|
|
7
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
8
|
-
// Mock heavy transitive dependencies so module graph stays resolvable.
|
|
9
|
-
vi.mock('../context.js', () => ({ loadContext: vi.fn() }));
|
|
10
|
-
vi.mock('@olam/core/src/world/version-pin.js', () => ({
|
|
11
|
-
stampVersionPin: vi.fn().mockReturnValue(true),
|
|
12
|
-
CLI_VERSION: '0.1.5',
|
|
13
|
-
}));
|
|
14
|
-
vi.mock('../world.js', () => ({
|
|
15
|
-
getOrCreateWorldCommand: vi.fn(),
|
|
16
|
-
}));
|
|
17
|
-
const WORLD_A = { id: 'world-a', workspacePath: '/worlds/a', name: 'World A' };
|
|
18
|
-
const WORLD_B = { id: 'world-b', workspacePath: '/worlds/b', name: 'World B' };
|
|
19
|
-
describe('doWorldUpgrade (D4)', () => {
|
|
20
|
-
it('returns [] when neither slug nor --all provided', async () => {
|
|
21
|
-
const { doWorldUpgrade } = await import('../world-upgrade.js');
|
|
22
|
-
const getWorlds = vi.fn().mockReturnValue([WORLD_A]);
|
|
23
|
-
const getWorld = vi.fn();
|
|
24
|
-
const results = await doWorldUpgrade({ getWorlds, getWorld });
|
|
25
|
-
expect(results).toHaveLength(0);
|
|
26
|
-
});
|
|
27
|
-
it('upgrades a single world by slug', async () => {
|
|
28
|
-
const { doWorldUpgrade } = await import('../world-upgrade.js');
|
|
29
|
-
const getWorlds = vi.fn();
|
|
30
|
-
const getWorld = vi.fn().mockReturnValue(WORLD_A);
|
|
31
|
-
const stampPin = vi.fn().mockReturnValue(true);
|
|
32
|
-
const results = await doWorldUpgrade({ slug: 'world-a', getWorlds, getWorld, stampPin });
|
|
33
|
-
expect(results).toHaveLength(1);
|
|
34
|
-
expect(results[0].worldId).toBe('world-a');
|
|
35
|
-
expect(results[0].stamped).toBe(true);
|
|
36
|
-
expect(stampPin).toHaveBeenCalledWith(WORLD_A.workspacePath, expect.any(String));
|
|
37
|
-
});
|
|
38
|
-
it('returns [] when slug not found', async () => {
|
|
39
|
-
const { doWorldUpgrade } = await import('../world-upgrade.js');
|
|
40
|
-
const getWorlds = vi.fn();
|
|
41
|
-
const getWorld = vi.fn().mockReturnValue(undefined);
|
|
42
|
-
const results = await doWorldUpgrade({ slug: 'unknown', getWorlds, getWorld });
|
|
43
|
-
expect(results).toHaveLength(0);
|
|
44
|
-
});
|
|
45
|
-
it('upgrades all worlds with --all', async () => {
|
|
46
|
-
const { doWorldUpgrade } = await import('../world-upgrade.js');
|
|
47
|
-
const getWorlds = vi.fn().mockReturnValue([WORLD_A, WORLD_B]);
|
|
48
|
-
const getWorld = vi.fn();
|
|
49
|
-
const stampPin = vi.fn().mockReturnValue(true);
|
|
50
|
-
const results = await doWorldUpgrade({ all: true, getWorlds, getWorld, stampPin });
|
|
51
|
-
expect(results).toHaveLength(2);
|
|
52
|
-
expect(stampPin).toHaveBeenCalledTimes(2);
|
|
53
|
-
});
|
|
54
|
-
it('dry-run does not call stampPin', async () => {
|
|
55
|
-
const { doWorldUpgrade } = await import('../world-upgrade.js');
|
|
56
|
-
const getWorlds = vi.fn().mockReturnValue([WORLD_A]);
|
|
57
|
-
const getWorld = vi.fn();
|
|
58
|
-
const stampPin = vi.fn();
|
|
59
|
-
const results = await doWorldUpgrade({ all: true, dryRun: true, getWorlds, getWorld, stampPin });
|
|
60
|
-
expect(stampPin).not.toHaveBeenCalled();
|
|
61
|
-
expect(results[0].dryRun).toBe(true);
|
|
62
|
-
expect(results[0].stamped).toBe(false);
|
|
63
|
-
});
|
|
64
|
-
it('idempotent: stamped=false when stampPin returns false (already current)', async () => {
|
|
65
|
-
const { doWorldUpgrade } = await import('../world-upgrade.js');
|
|
66
|
-
const getWorlds = vi.fn();
|
|
67
|
-
const getWorld = vi.fn().mockReturnValue(WORLD_A);
|
|
68
|
-
const stampPin = vi.fn().mockReturnValue(false);
|
|
69
|
-
const results = await doWorldUpgrade({ slug: 'world-a', getWorlds, getWorld, stampPin });
|
|
70
|
-
expect(results[0].stamped).toBe(false);
|
|
71
|
-
});
|
|
72
|
-
});
|
|
73
|
-
//# sourceMappingURL=world-upgrade.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"world-upgrade.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/world-upgrade.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"symlink-reconcile.test.d.ts","sourceRoot":"","sources":["../../../src/lib/__tests__/symlink-reconcile.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
-
import { reconcileSkillSymlinks } from '../symlink-reconcile.js';
|
|
3
|
-
function makeFakeFs(opts) {
|
|
4
|
-
const npmSkills = opts.npmSkills ?? [];
|
|
5
|
-
const claudeSkills = opts.claudeSkills ?? [];
|
|
6
|
-
const danglingSymlinks = new Set(opts.danglingSymlinks ?? []);
|
|
7
|
-
const nonOlamSymlinks = new Set(opts.nonOlamSymlinks ?? []);
|
|
8
|
-
const nonPackageSymlinks = new Set(opts.nonPackageSymlinks ?? []);
|
|
9
|
-
const symlinks = new Map();
|
|
10
|
-
const unlinked = [];
|
|
11
|
-
const allClaude = [
|
|
12
|
-
...claudeSkills,
|
|
13
|
-
...(opts.danglingSymlinks ?? []),
|
|
14
|
-
...(opts.nonOlamSymlinks ?? []),
|
|
15
|
-
...(opts.nonPackageSymlinks ?? []),
|
|
16
|
-
];
|
|
17
|
-
return {
|
|
18
|
-
symlinks,
|
|
19
|
-
unlinked,
|
|
20
|
-
readdirSync: (p) => {
|
|
21
|
-
if (p === '/npm/skills')
|
|
22
|
-
return npmSkills;
|
|
23
|
-
return allClaude;
|
|
24
|
-
},
|
|
25
|
-
existsSync: (p) => {
|
|
26
|
-
// base dirs always exist
|
|
27
|
-
if (p === '/npm/skills' || p === '/claude/skills')
|
|
28
|
-
return true;
|
|
29
|
-
const name = p.split('/').pop();
|
|
30
|
-
// dangling symlink target → does NOT exist
|
|
31
|
-
if (danglingSymlinks.has(name))
|
|
32
|
-
return false;
|
|
33
|
-
// npm skill dir entries exist (for symlink target resolution)
|
|
34
|
-
if (p.startsWith('/npm/skills/') && npmSkills.includes(name))
|
|
35
|
-
return true;
|
|
36
|
-
// claude skill entries: only those declared in claudeSkills exist
|
|
37
|
-
if (p.startsWith('/claude/skills/') && claudeSkills.includes(name))
|
|
38
|
-
return true;
|
|
39
|
-
// readlink targets pointing into a fake npm path: exist iff name is in npmSkills
|
|
40
|
-
if (p.includes('@pleri/olam-cli/plugin/skills/') && npmSkills.includes(name))
|
|
41
|
-
return true;
|
|
42
|
-
return false;
|
|
43
|
-
},
|
|
44
|
-
lstatSync: (p) => {
|
|
45
|
-
const name = p.split('/').pop();
|
|
46
|
-
const isSymlink = danglingSymlinks.has(name) ||
|
|
47
|
-
nonPackageSymlinks.has(name) ||
|
|
48
|
-
claudeSkills.some((s) => s === name);
|
|
49
|
-
return { isSymbolicLink: () => isSymlink };
|
|
50
|
-
},
|
|
51
|
-
readlinkSync: (p) => {
|
|
52
|
-
const name = p.split('/').pop();
|
|
53
|
-
if (nonPackageSymlinks.has(name))
|
|
54
|
-
return `/some/other/path/${name}`;
|
|
55
|
-
return `/usr/local/lib/node_modules/@pleri/olam-cli/plugin/skills/${name}`;
|
|
56
|
-
},
|
|
57
|
-
symlinkSync: (target, linkPath) => {
|
|
58
|
-
symlinks.set(linkPath.split('/').pop(), target);
|
|
59
|
-
},
|
|
60
|
-
unlinkSync: (p) => {
|
|
61
|
-
unlinked.push(p.split('/').pop());
|
|
62
|
-
},
|
|
63
|
-
mkdirSync: vi.fn(),
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
describe('reconcileSkillSymlinks', () => {
|
|
67
|
-
it('adds symlink for new skill in npm source', () => {
|
|
68
|
-
const fakeFs = makeFakeFs({ npmSkills: ['olam-worlds'], claudeSkills: [] });
|
|
69
|
-
const result = reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
|
|
70
|
-
expect(result.added).toContain('olam-worlds');
|
|
71
|
-
expect(fakeFs.symlinks.has('olam-worlds')).toBe(true);
|
|
72
|
-
});
|
|
73
|
-
it('keeps existing valid symlink', () => {
|
|
74
|
-
const fakeFs = makeFakeFs({ npmSkills: ['olam-worlds'], claudeSkills: ['olam-worlds'] });
|
|
75
|
-
const result = reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
|
|
76
|
-
expect(result.kept).toContain('olam-worlds');
|
|
77
|
-
expect(fakeFs.unlinked).toHaveLength(0);
|
|
78
|
-
});
|
|
79
|
-
it('removes dangling olam-* symlink', () => {
|
|
80
|
-
const fakeFs = makeFakeFs({ npmSkills: [], claudeSkills: [], danglingSymlinks: ['olam-old'] });
|
|
81
|
-
const result = reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
|
|
82
|
-
expect(result.removed).toContain('olam-old');
|
|
83
|
-
expect(fakeFs.unlinked).toContain('olam-old');
|
|
84
|
-
});
|
|
85
|
-
it('never touches non-olam-* entries', () => {
|
|
86
|
-
const fakeFs = makeFakeFs({ npmSkills: [], claudeSkills: [], nonOlamSymlinks: ['diakon-skill'] });
|
|
87
|
-
reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
|
|
88
|
-
expect(fakeFs.unlinked).not.toContain('diakon-skill');
|
|
89
|
-
});
|
|
90
|
-
it('never touches olam-* symlinks not pointing into @pleri/olam-cli', () => {
|
|
91
|
-
const fakeFs = makeFakeFs({
|
|
92
|
-
npmSkills: [],
|
|
93
|
-
claudeSkills: [],
|
|
94
|
-
nonPackageSymlinks: ['olam-custom'],
|
|
95
|
-
});
|
|
96
|
-
reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
|
|
97
|
-
expect(fakeFs.unlinked).not.toContain('olam-custom');
|
|
98
|
-
});
|
|
99
|
-
it('handles empty npm skills dir gracefully', () => {
|
|
100
|
-
const fakeFs = makeFakeFs({ npmSkills: [], claudeSkills: [] });
|
|
101
|
-
const result = reconcileSkillSymlinks('/npm/skills', '/claude/skills', fakeFs);
|
|
102
|
-
expect(result.added).toHaveLength(0);
|
|
103
|
-
expect(result.removed).toHaveLength(0);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
//# sourceMappingURL=symlink-reconcile.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"symlink-reconcile.test.js","sourceRoot":"","sources":["../../../src/lib/__tests__/symlink-reconcile.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,SAAS,UAAU,CAAC,IAMnB;IACC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IACvC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;IAC7C,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAC9D,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC;IAElE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,MAAM,SAAS,GAAG;QAChB,GAAG,YAAY;QACf,GAAG,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,EAAE,CAAC;KACnC,CAAC;IAEF,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,WAAW,EAAE,CAAC,CAAS,EAAE,EAAE;YACzB,IAAI,CAAC,KAAK,aAAa;gBAAE,OAAO,SAAS,CAAC;YAC1C,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE;YACxB,yBAAyB;YACzB,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,gBAAgB;gBAAE,OAAO,IAAI,CAAC;YAC/D,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;YACjC,2CAA2C;YAC3C,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC7C,8DAA8D;YAC9D,IAAI,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC1E,kEAAkE;YAClE,IAAI,CAAC,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAChF,iFAAiF;YACjF,IAAI,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC1F,OAAO,KAAK,CAAC;QACf,CAAC;QACD,SAAS,EAAE,CAAC,CAAS,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;YACjC,MAAM,SAAS,GACb,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC1B,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAC5B,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;YACvC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,CAAC,SAAS,EAA6B,CAAC;QACxE,CAAC;QACD,YAAY,EAAE,CAAC,CAAS,EAAE,EAAE;YAC1B,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;YACjC,IAAI,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,oBAAoB,IAAI,EAAE,CAAC;YACpE,OAAO,6DAA6D,IAAI,EAAE,CAAC;QAC7E,CAAC;QACD,WAAW,EAAE,CAAC,MAAc,EAAE,QAAgB,EAAE,EAAE;YAChD,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;QACD,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE;YACxB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC,CAAC;QACrC,CAAC;QACD,SAAS,EAAE,EAAE,CAAC,EAAE,EAAuC;KACxD,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,sBAAsB,CAAC,aAAa,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACzF,MAAM,MAAM,GAAG,sBAAsB,CAAC,aAAa,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC/F,MAAM,MAAM,GAAG,sBAAsB,CAAC,aAAa,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAClG,sBAAsB,CAAC,aAAa,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,MAAM,GAAG,UAAU,CAAC;YACxB,SAAS,EAAE,EAAE;YACb,YAAY,EAAE,EAAE;YAChB,kBAAkB,EAAE,CAAC,aAAa,CAAC;SACpC,CAAC,CAAC;QACH,sBAAsB,CAAC,aAAa,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAChE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,sBAAsB,CAAC,aAAa,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|