@pleri/olam-cli 0.1.70 → 0.1.72

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 (241) hide show
  1. package/dist/commands/create.d.ts.map +1 -1
  2. package/dist/commands/create.js +2 -0
  3. package/dist/commands/create.js.map +1 -1
  4. package/dist/commands/runbooks.d.ts +13 -0
  5. package/dist/commands/runbooks.d.ts.map +1 -0
  6. package/dist/commands/runbooks.js +189 -0
  7. package/dist/commands/runbooks.js.map +1 -0
  8. package/dist/commands/world-snapshot.d.ts +1 -0
  9. package/dist/commands/world-snapshot.d.ts.map +1 -1
  10. package/dist/commands/world-snapshot.js +126 -1
  11. package/dist/commands/world-snapshot.js.map +1 -1
  12. package/dist/commands/worldspec/compile.d.ts +20 -0
  13. package/dist/commands/worldspec/compile.d.ts.map +1 -0
  14. package/dist/commands/worldspec/compile.js +130 -0
  15. package/dist/commands/worldspec/compile.js.map +1 -0
  16. package/dist/commands/worldspec/index.d.ts +12 -0
  17. package/dist/commands/worldspec/index.d.ts.map +1 -0
  18. package/dist/commands/worldspec/index.js +23 -0
  19. package/dist/commands/worldspec/index.js.map +1 -0
  20. package/dist/commands/worldspec/init.d.ts +15 -0
  21. package/dist/commands/worldspec/init.d.ts.map +1 -0
  22. package/dist/commands/worldspec/init.js +166 -0
  23. package/dist/commands/worldspec/init.js.map +1 -0
  24. package/dist/commands/worldspec/schema.d.ts +11 -0
  25. package/dist/commands/worldspec/schema.d.ts.map +1 -0
  26. package/dist/commands/worldspec/schema.js +55 -0
  27. package/dist/commands/worldspec/schema.js.map +1 -0
  28. package/dist/commands/worldspec/validate.d.ts +15 -0
  29. package/dist/commands/worldspec/validate.d.ts.map +1 -0
  30. package/dist/commands/worldspec/validate.js +66 -0
  31. package/dist/commands/worldspec/validate.js.map +1 -0
  32. package/dist/exit-codes.d.ts +32 -0
  33. package/dist/exit-codes.d.ts.map +1 -1
  34. package/dist/exit-codes.js +32 -0
  35. package/dist/exit-codes.js.map +1 -1
  36. package/dist/image-digests.json +5 -5
  37. package/dist/index.js +4379 -897
  38. package/dist/index.js.map +1 -1
  39. package/dist/mcp-server.js +1252 -286
  40. package/host-cp/src/global-config-source.mjs +71 -0
  41. package/host-cp/src/listening-server-poller.mjs +1 -1
  42. package/host-cp/src/plan-orchestrator.mjs +20 -1
  43. package/host-cp/src/port-bridge-manager.mjs +1 -1
  44. package/host-cp/src/server.mjs +46 -7
  45. package/package.json +4 -2
  46. package/dist/__tests__/audit-publish-deps-contract.test.d.ts +0 -26
  47. package/dist/__tests__/audit-publish-deps-contract.test.d.ts.map +0 -1
  48. package/dist/__tests__/audit-publish-deps-contract.test.js +0 -86
  49. package/dist/__tests__/audit-publish-deps-contract.test.js.map +0 -1
  50. package/dist/__tests__/auth-status.test.d.ts +0 -2
  51. package/dist/__tests__/auth-status.test.d.ts.map +0 -1
  52. package/dist/__tests__/auth-status.test.js +0 -291
  53. package/dist/__tests__/auth-status.test.js.map +0 -1
  54. package/dist/__tests__/auth-upgrade.test.d.ts +0 -9
  55. package/dist/__tests__/auth-upgrade.test.d.ts.map +0 -1
  56. package/dist/__tests__/auth-upgrade.test.js +0 -397
  57. package/dist/__tests__/auth-upgrade.test.js.map +0 -1
  58. package/dist/__tests__/bootstrap-tag-mcp-auth.test.d.ts +0 -22
  59. package/dist/__tests__/bootstrap-tag-mcp-auth.test.d.ts.map +0 -1
  60. package/dist/__tests__/bootstrap-tag-mcp-auth.test.js +0 -63
  61. package/dist/__tests__/bootstrap-tag-mcp-auth.test.js.map +0 -1
  62. package/dist/__tests__/cli-mcp-revoke.test.d.ts +0 -8
  63. package/dist/__tests__/cli-mcp-revoke.test.d.ts.map +0 -1
  64. package/dist/__tests__/cli-mcp-revoke.test.js +0 -124
  65. package/dist/__tests__/cli-mcp-revoke.test.js.map +0 -1
  66. package/dist/__tests__/config.test.d.ts +0 -2
  67. package/dist/__tests__/config.test.d.ts.map +0 -1
  68. package/dist/__tests__/config.test.js +0 -95
  69. package/dist/__tests__/config.test.js.map +0 -1
  70. package/dist/__tests__/create-app-urls.test.d.ts +0 -2
  71. package/dist/__tests__/create-app-urls.test.d.ts.map +0 -1
  72. package/dist/__tests__/create-app-urls.test.js +0 -102
  73. package/dist/__tests__/create-app-urls.test.js.map +0 -1
  74. package/dist/__tests__/docker-host.test.d.ts +0 -14
  75. package/dist/__tests__/docker-host.test.d.ts.map +0 -1
  76. package/dist/__tests__/docker-host.test.js +0 -109
  77. package/dist/__tests__/docker-host.test.js.map +0 -1
  78. package/dist/__tests__/enter.test.d.ts +0 -2
  79. package/dist/__tests__/enter.test.d.ts.map +0 -1
  80. package/dist/__tests__/enter.test.js +0 -90
  81. package/dist/__tests__/enter.test.js.map +0 -1
  82. package/dist/__tests__/help-output.test.d.ts +0 -2
  83. package/dist/__tests__/help-output.test.d.ts.map +0 -1
  84. package/dist/__tests__/help-output.test.js +0 -74
  85. package/dist/__tests__/help-output.test.js.map +0 -1
  86. package/dist/__tests__/host-cp-gh-token.test.d.ts +0 -9
  87. package/dist/__tests__/host-cp-gh-token.test.d.ts.map +0 -1
  88. package/dist/__tests__/host-cp-gh-token.test.js +0 -129
  89. package/dist/__tests__/host-cp-gh-token.test.js.map +0 -1
  90. package/dist/__tests__/host-cp.test.d.ts +0 -9
  91. package/dist/__tests__/host-cp.test.d.ts.map +0 -1
  92. package/dist/__tests__/host-cp.test.js +0 -335
  93. package/dist/__tests__/host-cp.test.js.map +0 -1
  94. package/dist/__tests__/image-presence.test.d.ts +0 -2
  95. package/dist/__tests__/image-presence.test.d.ts.map +0 -1
  96. package/dist/__tests__/image-presence.test.js +0 -44
  97. package/dist/__tests__/image-presence.test.js.map +0 -1
  98. package/dist/__tests__/install-root.test.d.ts +0 -2
  99. package/dist/__tests__/install-root.test.d.ts.map +0 -1
  100. package/dist/__tests__/install-root.test.js +0 -119
  101. package/dist/__tests__/install-root.test.js.map +0 -1
  102. package/dist/__tests__/keys.test.d.ts +0 -9
  103. package/dist/__tests__/keys.test.d.ts.map +0 -1
  104. package/dist/__tests__/keys.test.js +0 -145
  105. package/dist/__tests__/keys.test.js.map +0 -1
  106. package/dist/__tests__/logs.test.d.ts +0 -9
  107. package/dist/__tests__/logs.test.d.ts.map +0 -1
  108. package/dist/__tests__/logs.test.js +0 -124
  109. package/dist/__tests__/logs.test.js.map +0 -1
  110. package/dist/__tests__/mcp-import.test.d.ts +0 -11
  111. package/dist/__tests__/mcp-import.test.d.ts.map +0 -1
  112. package/dist/__tests__/mcp-import.test.js +0 -134
  113. package/dist/__tests__/mcp-import.test.js.map +0 -1
  114. package/dist/__tests__/protocol-version.test.d.ts +0 -2
  115. package/dist/__tests__/protocol-version.test.d.ts.map +0 -1
  116. package/dist/__tests__/protocol-version.test.js +0 -170
  117. package/dist/__tests__/protocol-version.test.js.map +0 -1
  118. package/dist/__tests__/ps.test.d.ts +0 -2
  119. package/dist/__tests__/ps.test.d.ts.map +0 -1
  120. package/dist/__tests__/ps.test.js +0 -172
  121. package/dist/__tests__/ps.test.js.map +0 -1
  122. package/dist/__tests__/registry-allowlist.test.d.ts +0 -2
  123. package/dist/__tests__/registry-allowlist.test.d.ts.map +0 -1
  124. package/dist/__tests__/registry-allowlist.test.js +0 -129
  125. package/dist/__tests__/registry-allowlist.test.js.map +0 -1
  126. package/dist/__tests__/services.test.d.ts +0 -8
  127. package/dist/__tests__/services.test.d.ts.map +0 -1
  128. package/dist/__tests__/services.test.js +0 -185
  129. package/dist/__tests__/services.test.js.map +0 -1
  130. package/dist/__tests__/status-app-urls.test.d.ts +0 -2
  131. package/dist/__tests__/status-app-urls.test.d.ts.map +0 -1
  132. package/dist/__tests__/status-app-urls.test.js +0 -125
  133. package/dist/__tests__/status-app-urls.test.js.map +0 -1
  134. package/dist/__tests__/upgrade-gh-token-contract.test.d.ts +0 -19
  135. package/dist/__tests__/upgrade-gh-token-contract.test.d.ts.map +0 -1
  136. package/dist/__tests__/upgrade-gh-token-contract.test.js +0 -63
  137. package/dist/__tests__/upgrade-gh-token-contract.test.js.map +0 -1
  138. package/dist/__tests__/upgrade.test.d.ts +0 -9
  139. package/dist/__tests__/upgrade.test.d.ts.map +0 -1
  140. package/dist/__tests__/upgrade.test.js +0 -586
  141. package/dist/__tests__/upgrade.test.js.map +0 -1
  142. package/dist/commands/__tests__/__fixtures__/upgrade-helpers.d.ts +0 -6
  143. package/dist/commands/__tests__/__fixtures__/upgrade-helpers.d.ts.map +0 -1
  144. package/dist/commands/__tests__/__fixtures__/upgrade-helpers.js +0 -26
  145. package/dist/commands/__tests__/__fixtures__/upgrade-helpers.js.map +0 -1
  146. package/dist/commands/__tests__/begin.test.d.ts +0 -7
  147. package/dist/commands/__tests__/begin.test.d.ts.map +0 -1
  148. package/dist/commands/__tests__/begin.test.js +0 -72
  149. package/dist/commands/__tests__/begin.test.js.map +0 -1
  150. package/dist/commands/__tests__/bootstrap.test.d.ts +0 -2
  151. package/dist/commands/__tests__/bootstrap.test.d.ts.map +0 -1
  152. package/dist/commands/__tests__/bootstrap.test.js +0 -370
  153. package/dist/commands/__tests__/bootstrap.test.js.map +0 -1
  154. package/dist/commands/__tests__/carry-uncommitted.test.d.ts +0 -14
  155. package/dist/commands/__tests__/carry-uncommitted.test.d.ts.map +0 -1
  156. package/dist/commands/__tests__/carry-uncommitted.test.js +0 -83
  157. package/dist/commands/__tests__/carry-uncommitted.test.js.map +0 -1
  158. package/dist/commands/__tests__/clean.test.d.ts +0 -9
  159. package/dist/commands/__tests__/clean.test.d.ts.map +0 -1
  160. package/dist/commands/__tests__/clean.test.js +0 -105
  161. package/dist/commands/__tests__/clean.test.js.map +0 -1
  162. package/dist/commands/__tests__/crystallize.test.d.ts +0 -2
  163. package/dist/commands/__tests__/crystallize.test.d.ts.map +0 -1
  164. package/dist/commands/__tests__/crystallize.test.js +0 -133
  165. package/dist/commands/__tests__/crystallize.test.js.map +0 -1
  166. package/dist/commands/__tests__/diagnose.test.d.ts +0 -9
  167. package/dist/commands/__tests__/diagnose.test.d.ts.map +0 -1
  168. package/dist/commands/__tests__/diagnose.test.js +0 -108
  169. package/dist/commands/__tests__/diagnose.test.js.map +0 -1
  170. package/dist/commands/__tests__/openHostCpUrl.test.d.ts +0 -2
  171. package/dist/commands/__tests__/openHostCpUrl.test.d.ts.map +0 -1
  172. package/dist/commands/__tests__/openHostCpUrl.test.js +0 -63
  173. package/dist/commands/__tests__/openHostCpUrl.test.js.map +0 -1
  174. package/dist/commands/__tests__/refresh.test.d.ts +0 -13
  175. package/dist/commands/__tests__/refresh.test.d.ts.map +0 -1
  176. package/dist/commands/__tests__/refresh.test.js +0 -170
  177. package/dist/commands/__tests__/refresh.test.js.map +0 -1
  178. package/dist/commands/__tests__/status.test.d.ts +0 -8
  179. package/dist/commands/__tests__/status.test.d.ts.map +0 -1
  180. package/dist/commands/__tests__/status.test.js +0 -62
  181. package/dist/commands/__tests__/status.test.js.map +0 -1
  182. package/dist/commands/__tests__/stop.test.d.ts +0 -5
  183. package/dist/commands/__tests__/stop.test.d.ts.map +0 -1
  184. package/dist/commands/__tests__/stop.test.js +0 -30
  185. package/dist/commands/__tests__/stop.test.js.map +0 -1
  186. package/dist/commands/__tests__/update.test.d.ts +0 -7
  187. package/dist/commands/__tests__/update.test.d.ts.map +0 -1
  188. package/dist/commands/__tests__/update.test.js +0 -224
  189. package/dist/commands/__tests__/update.test.js.map +0 -1
  190. package/dist/commands/__tests__/upgrade.all-three.test.d.ts +0 -19
  191. package/dist/commands/__tests__/upgrade.all-three.test.d.ts.map +0 -1
  192. package/dist/commands/__tests__/upgrade.all-three.test.js +0 -80
  193. package/dist/commands/__tests__/upgrade.all-three.test.js.map +0 -1
  194. package/dist/commands/__tests__/upgrade.compose-path.test.d.ts +0 -20
  195. package/dist/commands/__tests__/upgrade.compose-path.test.d.ts.map +0 -1
  196. package/dist/commands/__tests__/upgrade.compose-path.test.js +0 -140
  197. package/dist/commands/__tests__/upgrade.compose-path.test.js.map +0 -1
  198. package/dist/commands/__tests__/upgrade.history.test.d.ts +0 -15
  199. package/dist/commands/__tests__/upgrade.history.test.d.ts.map +0 -1
  200. package/dist/commands/__tests__/upgrade.history.test.js +0 -199
  201. package/dist/commands/__tests__/upgrade.history.test.js.map +0 -1
  202. package/dist/commands/__tests__/upgrade.lock.test.d.ts +0 -15
  203. package/dist/commands/__tests__/upgrade.lock.test.d.ts.map +0 -1
  204. package/dist/commands/__tests__/upgrade.lock.test.js +0 -253
  205. package/dist/commands/__tests__/upgrade.lock.test.js.map +0 -1
  206. package/dist/commands/__tests__/upgrade.olam-tag.test.d.ts +0 -21
  207. package/dist/commands/__tests__/upgrade.olam-tag.test.d.ts.map +0 -1
  208. package/dist/commands/__tests__/upgrade.olam-tag.test.js +0 -114
  209. package/dist/commands/__tests__/upgrade.olam-tag.test.js.map +0 -1
  210. package/dist/commands/__tests__/upgrade.poll.test.d.ts +0 -14
  211. package/dist/commands/__tests__/upgrade.poll.test.d.ts.map +0 -1
  212. package/dist/commands/__tests__/upgrade.poll.test.js +0 -136
  213. package/dist/commands/__tests__/upgrade.poll.test.js.map +0 -1
  214. package/dist/commands/__tests__/upgrade.recreate.test.d.ts +0 -17
  215. package/dist/commands/__tests__/upgrade.recreate.test.d.ts.map +0 -1
  216. package/dist/commands/__tests__/upgrade.recreate.test.js +0 -83
  217. package/dist/commands/__tests__/upgrade.recreate.test.js.map +0 -1
  218. package/dist/commands/__tests__/upgrade.rollback.test.d.ts +0 -12
  219. package/dist/commands/__tests__/upgrade.rollback.test.d.ts.map +0 -1
  220. package/dist/commands/__tests__/upgrade.rollback.test.js +0 -255
  221. package/dist/commands/__tests__/upgrade.rollback.test.js.map +0 -1
  222. package/dist/commands/__tests__/upgrade.sha-capture.test.d.ts +0 -12
  223. package/dist/commands/__tests__/upgrade.sha-capture.test.d.ts.map +0 -1
  224. package/dist/commands/__tests__/upgrade.sha-capture.test.js +0 -63
  225. package/dist/commands/__tests__/upgrade.sha-capture.test.js.map +0 -1
  226. package/dist/commands/__tests__/upgrade.smoke.test.d.ts +0 -19
  227. package/dist/commands/__tests__/upgrade.smoke.test.d.ts.map +0 -1
  228. package/dist/commands/__tests__/upgrade.smoke.test.js +0 -87
  229. package/dist/commands/__tests__/upgrade.smoke.test.js.map +0 -1
  230. package/dist/commands/__tests__/upgrade.swap.test.d.ts +0 -19
  231. package/dist/commands/__tests__/upgrade.swap.test.d.ts.map +0 -1
  232. package/dist/commands/__tests__/upgrade.swap.test.js +0 -312
  233. package/dist/commands/__tests__/upgrade.swap.test.js.map +0 -1
  234. package/dist/commands/__tests__/world-upgrade.test.d.ts +0 -8
  235. package/dist/commands/__tests__/world-upgrade.test.d.ts.map +0 -1
  236. package/dist/commands/__tests__/world-upgrade.test.js +0 -73
  237. package/dist/commands/__tests__/world-upgrade.test.js.map +0 -1
  238. package/dist/lib/__tests__/symlink-reconcile.test.d.ts +0 -2
  239. package/dist/lib/__tests__/symlink-reconcile.test.d.ts.map +0 -1
  240. package/dist/lib/__tests__/symlink-reconcile.test.js +0 -106
  241. 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,8 +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
- export {};
8
- //# sourceMappingURL=world-upgrade.test.d.ts.map
@@ -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,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=symlink-reconcile.test.d.ts.map
@@ -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":"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"}