@pleri/olam-cli 0.1.69 → 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 (250) hide show
  1. package/dist/cli-version.d.ts +16 -0
  2. package/dist/cli-version.d.ts.map +1 -0
  3. package/dist/cli-version.js +39 -0
  4. package/dist/cli-version.js.map +1 -0
  5. package/dist/commands/create.d.ts.map +1 -1
  6. package/dist/commands/create.js +2 -0
  7. package/dist/commands/create.js.map +1 -1
  8. package/dist/commands/host-cp.d.ts.map +1 -1
  9. package/dist/commands/host-cp.js +10 -0
  10. package/dist/commands/host-cp.js.map +1 -1
  11. package/dist/commands/runbooks.d.ts +13 -0
  12. package/dist/commands/runbooks.d.ts.map +1 -0
  13. package/dist/commands/runbooks.js +189 -0
  14. package/dist/commands/runbooks.js.map +1 -0
  15. package/dist/commands/world-snapshot.d.ts +1 -0
  16. package/dist/commands/world-snapshot.d.ts.map +1 -1
  17. package/dist/commands/world-snapshot.js +126 -1
  18. package/dist/commands/world-snapshot.js.map +1 -1
  19. package/dist/commands/worldspec/compile.d.ts +20 -0
  20. package/dist/commands/worldspec/compile.d.ts.map +1 -0
  21. package/dist/commands/worldspec/compile.js +130 -0
  22. package/dist/commands/worldspec/compile.js.map +1 -0
  23. package/dist/commands/worldspec/index.d.ts +12 -0
  24. package/dist/commands/worldspec/index.d.ts.map +1 -0
  25. package/dist/commands/worldspec/index.js +23 -0
  26. package/dist/commands/worldspec/index.js.map +1 -0
  27. package/dist/commands/worldspec/init.d.ts +15 -0
  28. package/dist/commands/worldspec/init.d.ts.map +1 -0
  29. package/dist/commands/worldspec/init.js +166 -0
  30. package/dist/commands/worldspec/init.js.map +1 -0
  31. package/dist/commands/worldspec/schema.d.ts +11 -0
  32. package/dist/commands/worldspec/schema.d.ts.map +1 -0
  33. package/dist/commands/worldspec/schema.js +55 -0
  34. package/dist/commands/worldspec/schema.js.map +1 -0
  35. package/dist/commands/worldspec/validate.d.ts +15 -0
  36. package/dist/commands/worldspec/validate.d.ts.map +1 -0
  37. package/dist/commands/worldspec/validate.js +66 -0
  38. package/dist/commands/worldspec/validate.js.map +1 -0
  39. package/dist/exit-codes.d.ts +32 -0
  40. package/dist/exit-codes.d.ts.map +1 -1
  41. package/dist/exit-codes.js +32 -0
  42. package/dist/exit-codes.js.map +1 -1
  43. package/dist/image-digests.json +5 -5
  44. package/dist/index.js +4726 -1231
  45. package/dist/index.js.map +1 -1
  46. package/dist/mcp-server.js +1424 -321
  47. package/host-cp/compose.yaml +6 -0
  48. package/host-cp/src/global-config-source.mjs +71 -0
  49. package/host-cp/src/listening-server-poller.mjs +1 -1
  50. package/host-cp/src/plan-orchestrator.mjs +20 -1
  51. package/host-cp/src/port-bridge-manager.mjs +1 -1
  52. package/host-cp/src/server.mjs +46 -7
  53. package/host-cp/src/version-status.mjs +36 -0
  54. package/package.json +4 -2
  55. package/dist/__tests__/audit-publish-deps-contract.test.d.ts +0 -26
  56. package/dist/__tests__/audit-publish-deps-contract.test.d.ts.map +0 -1
  57. package/dist/__tests__/audit-publish-deps-contract.test.js +0 -86
  58. package/dist/__tests__/audit-publish-deps-contract.test.js.map +0 -1
  59. package/dist/__tests__/auth-status.test.d.ts +0 -2
  60. package/dist/__tests__/auth-status.test.d.ts.map +0 -1
  61. package/dist/__tests__/auth-status.test.js +0 -291
  62. package/dist/__tests__/auth-status.test.js.map +0 -1
  63. package/dist/__tests__/auth-upgrade.test.d.ts +0 -9
  64. package/dist/__tests__/auth-upgrade.test.d.ts.map +0 -1
  65. package/dist/__tests__/auth-upgrade.test.js +0 -397
  66. package/dist/__tests__/auth-upgrade.test.js.map +0 -1
  67. package/dist/__tests__/bootstrap-tag-mcp-auth.test.d.ts +0 -22
  68. package/dist/__tests__/bootstrap-tag-mcp-auth.test.d.ts.map +0 -1
  69. package/dist/__tests__/bootstrap-tag-mcp-auth.test.js +0 -63
  70. package/dist/__tests__/bootstrap-tag-mcp-auth.test.js.map +0 -1
  71. package/dist/__tests__/cli-mcp-revoke.test.d.ts +0 -8
  72. package/dist/__tests__/cli-mcp-revoke.test.d.ts.map +0 -1
  73. package/dist/__tests__/cli-mcp-revoke.test.js +0 -124
  74. package/dist/__tests__/cli-mcp-revoke.test.js.map +0 -1
  75. package/dist/__tests__/config.test.d.ts +0 -2
  76. package/dist/__tests__/config.test.d.ts.map +0 -1
  77. package/dist/__tests__/config.test.js +0 -95
  78. package/dist/__tests__/config.test.js.map +0 -1
  79. package/dist/__tests__/create-app-urls.test.d.ts +0 -2
  80. package/dist/__tests__/create-app-urls.test.d.ts.map +0 -1
  81. package/dist/__tests__/create-app-urls.test.js +0 -102
  82. package/dist/__tests__/create-app-urls.test.js.map +0 -1
  83. package/dist/__tests__/docker-host.test.d.ts +0 -14
  84. package/dist/__tests__/docker-host.test.d.ts.map +0 -1
  85. package/dist/__tests__/docker-host.test.js +0 -109
  86. package/dist/__tests__/docker-host.test.js.map +0 -1
  87. package/dist/__tests__/enter.test.d.ts +0 -2
  88. package/dist/__tests__/enter.test.d.ts.map +0 -1
  89. package/dist/__tests__/enter.test.js +0 -90
  90. package/dist/__tests__/enter.test.js.map +0 -1
  91. package/dist/__tests__/help-output.test.d.ts +0 -2
  92. package/dist/__tests__/help-output.test.d.ts.map +0 -1
  93. package/dist/__tests__/help-output.test.js +0 -74
  94. package/dist/__tests__/help-output.test.js.map +0 -1
  95. package/dist/__tests__/host-cp-gh-token.test.d.ts +0 -9
  96. package/dist/__tests__/host-cp-gh-token.test.d.ts.map +0 -1
  97. package/dist/__tests__/host-cp-gh-token.test.js +0 -119
  98. package/dist/__tests__/host-cp-gh-token.test.js.map +0 -1
  99. package/dist/__tests__/host-cp.test.d.ts +0 -9
  100. package/dist/__tests__/host-cp.test.d.ts.map +0 -1
  101. package/dist/__tests__/host-cp.test.js +0 -327
  102. package/dist/__tests__/host-cp.test.js.map +0 -1
  103. package/dist/__tests__/image-presence.test.d.ts +0 -2
  104. package/dist/__tests__/image-presence.test.d.ts.map +0 -1
  105. package/dist/__tests__/image-presence.test.js +0 -44
  106. package/dist/__tests__/image-presence.test.js.map +0 -1
  107. package/dist/__tests__/install-root.test.d.ts +0 -2
  108. package/dist/__tests__/install-root.test.d.ts.map +0 -1
  109. package/dist/__tests__/install-root.test.js +0 -119
  110. package/dist/__tests__/install-root.test.js.map +0 -1
  111. package/dist/__tests__/keys.test.d.ts +0 -9
  112. package/dist/__tests__/keys.test.d.ts.map +0 -1
  113. package/dist/__tests__/keys.test.js +0 -145
  114. package/dist/__tests__/keys.test.js.map +0 -1
  115. package/dist/__tests__/logs.test.d.ts +0 -9
  116. package/dist/__tests__/logs.test.d.ts.map +0 -1
  117. package/dist/__tests__/logs.test.js +0 -124
  118. package/dist/__tests__/logs.test.js.map +0 -1
  119. package/dist/__tests__/mcp-import.test.d.ts +0 -11
  120. package/dist/__tests__/mcp-import.test.d.ts.map +0 -1
  121. package/dist/__tests__/mcp-import.test.js +0 -134
  122. package/dist/__tests__/mcp-import.test.js.map +0 -1
  123. package/dist/__tests__/protocol-version.test.d.ts +0 -2
  124. package/dist/__tests__/protocol-version.test.d.ts.map +0 -1
  125. package/dist/__tests__/protocol-version.test.js +0 -170
  126. package/dist/__tests__/protocol-version.test.js.map +0 -1
  127. package/dist/__tests__/ps.test.d.ts +0 -2
  128. package/dist/__tests__/ps.test.d.ts.map +0 -1
  129. package/dist/__tests__/ps.test.js +0 -172
  130. package/dist/__tests__/ps.test.js.map +0 -1
  131. package/dist/__tests__/registry-allowlist.test.d.ts +0 -2
  132. package/dist/__tests__/registry-allowlist.test.d.ts.map +0 -1
  133. package/dist/__tests__/registry-allowlist.test.js +0 -129
  134. package/dist/__tests__/registry-allowlist.test.js.map +0 -1
  135. package/dist/__tests__/services.test.d.ts +0 -8
  136. package/dist/__tests__/services.test.d.ts.map +0 -1
  137. package/dist/__tests__/services.test.js +0 -185
  138. package/dist/__tests__/services.test.js.map +0 -1
  139. package/dist/__tests__/status-app-urls.test.d.ts +0 -2
  140. package/dist/__tests__/status-app-urls.test.d.ts.map +0 -1
  141. package/dist/__tests__/status-app-urls.test.js +0 -125
  142. package/dist/__tests__/status-app-urls.test.js.map +0 -1
  143. package/dist/__tests__/upgrade-gh-token-contract.test.d.ts +0 -19
  144. package/dist/__tests__/upgrade-gh-token-contract.test.d.ts.map +0 -1
  145. package/dist/__tests__/upgrade-gh-token-contract.test.js +0 -63
  146. package/dist/__tests__/upgrade-gh-token-contract.test.js.map +0 -1
  147. package/dist/__tests__/upgrade.test.d.ts +0 -9
  148. package/dist/__tests__/upgrade.test.d.ts.map +0 -1
  149. package/dist/__tests__/upgrade.test.js +0 -586
  150. package/dist/__tests__/upgrade.test.js.map +0 -1
  151. package/dist/commands/__tests__/__fixtures__/upgrade-helpers.d.ts +0 -6
  152. package/dist/commands/__tests__/__fixtures__/upgrade-helpers.d.ts.map +0 -1
  153. package/dist/commands/__tests__/__fixtures__/upgrade-helpers.js +0 -26
  154. package/dist/commands/__tests__/__fixtures__/upgrade-helpers.js.map +0 -1
  155. package/dist/commands/__tests__/begin.test.d.ts +0 -7
  156. package/dist/commands/__tests__/begin.test.d.ts.map +0 -1
  157. package/dist/commands/__tests__/begin.test.js +0 -72
  158. package/dist/commands/__tests__/begin.test.js.map +0 -1
  159. package/dist/commands/__tests__/bootstrap.test.d.ts +0 -2
  160. package/dist/commands/__tests__/bootstrap.test.d.ts.map +0 -1
  161. package/dist/commands/__tests__/bootstrap.test.js +0 -370
  162. package/dist/commands/__tests__/bootstrap.test.js.map +0 -1
  163. package/dist/commands/__tests__/carry-uncommitted.test.d.ts +0 -14
  164. package/dist/commands/__tests__/carry-uncommitted.test.d.ts.map +0 -1
  165. package/dist/commands/__tests__/carry-uncommitted.test.js +0 -83
  166. package/dist/commands/__tests__/carry-uncommitted.test.js.map +0 -1
  167. package/dist/commands/__tests__/clean.test.d.ts +0 -9
  168. package/dist/commands/__tests__/clean.test.d.ts.map +0 -1
  169. package/dist/commands/__tests__/clean.test.js +0 -105
  170. package/dist/commands/__tests__/clean.test.js.map +0 -1
  171. package/dist/commands/__tests__/crystallize.test.d.ts +0 -2
  172. package/dist/commands/__tests__/crystallize.test.d.ts.map +0 -1
  173. package/dist/commands/__tests__/crystallize.test.js +0 -133
  174. package/dist/commands/__tests__/crystallize.test.js.map +0 -1
  175. package/dist/commands/__tests__/diagnose.test.d.ts +0 -9
  176. package/dist/commands/__tests__/diagnose.test.d.ts.map +0 -1
  177. package/dist/commands/__tests__/diagnose.test.js +0 -108
  178. package/dist/commands/__tests__/diagnose.test.js.map +0 -1
  179. package/dist/commands/__tests__/openHostCpUrl.test.d.ts +0 -2
  180. package/dist/commands/__tests__/openHostCpUrl.test.d.ts.map +0 -1
  181. package/dist/commands/__tests__/openHostCpUrl.test.js +0 -63
  182. package/dist/commands/__tests__/openHostCpUrl.test.js.map +0 -1
  183. package/dist/commands/__tests__/refresh.test.d.ts +0 -13
  184. package/dist/commands/__tests__/refresh.test.d.ts.map +0 -1
  185. package/dist/commands/__tests__/refresh.test.js +0 -170
  186. package/dist/commands/__tests__/refresh.test.js.map +0 -1
  187. package/dist/commands/__tests__/status.test.d.ts +0 -8
  188. package/dist/commands/__tests__/status.test.d.ts.map +0 -1
  189. package/dist/commands/__tests__/status.test.js +0 -62
  190. package/dist/commands/__tests__/status.test.js.map +0 -1
  191. package/dist/commands/__tests__/stop.test.d.ts +0 -5
  192. package/dist/commands/__tests__/stop.test.d.ts.map +0 -1
  193. package/dist/commands/__tests__/stop.test.js +0 -30
  194. package/dist/commands/__tests__/stop.test.js.map +0 -1
  195. package/dist/commands/__tests__/update.test.d.ts +0 -7
  196. package/dist/commands/__tests__/update.test.d.ts.map +0 -1
  197. package/dist/commands/__tests__/update.test.js +0 -224
  198. package/dist/commands/__tests__/update.test.js.map +0 -1
  199. package/dist/commands/__tests__/upgrade.all-three.test.d.ts +0 -19
  200. package/dist/commands/__tests__/upgrade.all-three.test.d.ts.map +0 -1
  201. package/dist/commands/__tests__/upgrade.all-three.test.js +0 -80
  202. package/dist/commands/__tests__/upgrade.all-three.test.js.map +0 -1
  203. package/dist/commands/__tests__/upgrade.compose-path.test.d.ts +0 -20
  204. package/dist/commands/__tests__/upgrade.compose-path.test.d.ts.map +0 -1
  205. package/dist/commands/__tests__/upgrade.compose-path.test.js +0 -140
  206. package/dist/commands/__tests__/upgrade.compose-path.test.js.map +0 -1
  207. package/dist/commands/__tests__/upgrade.history.test.d.ts +0 -15
  208. package/dist/commands/__tests__/upgrade.history.test.d.ts.map +0 -1
  209. package/dist/commands/__tests__/upgrade.history.test.js +0 -199
  210. package/dist/commands/__tests__/upgrade.history.test.js.map +0 -1
  211. package/dist/commands/__tests__/upgrade.lock.test.d.ts +0 -15
  212. package/dist/commands/__tests__/upgrade.lock.test.d.ts.map +0 -1
  213. package/dist/commands/__tests__/upgrade.lock.test.js +0 -253
  214. package/dist/commands/__tests__/upgrade.lock.test.js.map +0 -1
  215. package/dist/commands/__tests__/upgrade.olam-tag.test.d.ts +0 -21
  216. package/dist/commands/__tests__/upgrade.olam-tag.test.d.ts.map +0 -1
  217. package/dist/commands/__tests__/upgrade.olam-tag.test.js +0 -114
  218. package/dist/commands/__tests__/upgrade.olam-tag.test.js.map +0 -1
  219. package/dist/commands/__tests__/upgrade.poll.test.d.ts +0 -14
  220. package/dist/commands/__tests__/upgrade.poll.test.d.ts.map +0 -1
  221. package/dist/commands/__tests__/upgrade.poll.test.js +0 -136
  222. package/dist/commands/__tests__/upgrade.poll.test.js.map +0 -1
  223. package/dist/commands/__tests__/upgrade.recreate.test.d.ts +0 -17
  224. package/dist/commands/__tests__/upgrade.recreate.test.d.ts.map +0 -1
  225. package/dist/commands/__tests__/upgrade.recreate.test.js +0 -83
  226. package/dist/commands/__tests__/upgrade.recreate.test.js.map +0 -1
  227. package/dist/commands/__tests__/upgrade.rollback.test.d.ts +0 -12
  228. package/dist/commands/__tests__/upgrade.rollback.test.d.ts.map +0 -1
  229. package/dist/commands/__tests__/upgrade.rollback.test.js +0 -255
  230. package/dist/commands/__tests__/upgrade.rollback.test.js.map +0 -1
  231. package/dist/commands/__tests__/upgrade.sha-capture.test.d.ts +0 -12
  232. package/dist/commands/__tests__/upgrade.sha-capture.test.d.ts.map +0 -1
  233. package/dist/commands/__tests__/upgrade.sha-capture.test.js +0 -63
  234. package/dist/commands/__tests__/upgrade.sha-capture.test.js.map +0 -1
  235. package/dist/commands/__tests__/upgrade.smoke.test.d.ts +0 -19
  236. package/dist/commands/__tests__/upgrade.smoke.test.d.ts.map +0 -1
  237. package/dist/commands/__tests__/upgrade.smoke.test.js +0 -87
  238. package/dist/commands/__tests__/upgrade.smoke.test.js.map +0 -1
  239. package/dist/commands/__tests__/upgrade.swap.test.d.ts +0 -19
  240. package/dist/commands/__tests__/upgrade.swap.test.d.ts.map +0 -1
  241. package/dist/commands/__tests__/upgrade.swap.test.js +0 -312
  242. package/dist/commands/__tests__/upgrade.swap.test.js.map +0 -1
  243. package/dist/commands/__tests__/world-upgrade.test.d.ts +0 -8
  244. package/dist/commands/__tests__/world-upgrade.test.d.ts.map +0 -1
  245. package/dist/commands/__tests__/world-upgrade.test.js +0 -73
  246. package/dist/commands/__tests__/world-upgrade.test.js.map +0 -1
  247. package/dist/lib/__tests__/symlink-reconcile.test.d.ts +0 -2
  248. package/dist/lib/__tests__/symlink-reconcile.test.d.ts.map +0 -1
  249. package/dist/lib/__tests__/symlink-reconcile.test.js +0 -106
  250. package/dist/lib/__tests__/symlink-reconcile.test.js.map +0 -1
@@ -1,185 +0,0 @@
1
- /**
2
- * Unit tests for services.ts and mcp-auth integration in upgrade.ts.
3
- *
4
- * Mirrors upgrade.test.ts philosophy: stateless helpers and injectable deps only.
5
- * Real docker subprocess not spawned.
6
- */
7
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
8
- import * as fs from 'node:fs';
9
- import * as os from 'node:os';
10
- import * as path from 'node:path';
11
- // ── exports surface ───────────────────────────────────────────────
12
- describe('services.ts exports', () => {
13
- it('exports servicesUp, servicesDown, servicesStatus, registerServices', async () => {
14
- const mod = await import('../commands/services.js');
15
- expect(typeof mod.servicesUp).toBe('function');
16
- expect(typeof mod.servicesDown).toBe('function');
17
- expect(typeof mod.servicesStatus).toBe('function');
18
- expect(typeof mod.registerServices).toBe('function');
19
- expect(typeof mod.McpAuthContainerController).toBe('function');
20
- });
21
- });
22
- // ── ImageDigests mcp-auth field ───────────────────────────────────
23
- describe('ImageDigests mcp-auth optional field', () => {
24
- it('loadImageDigests parses json without mcp-auth (backward compat)', async () => {
25
- const { loadImageDigests } = await import('../commands/bootstrap.js');
26
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-digest-test-'));
27
- const distDir = path.join(dir, 'dist');
28
- fs.mkdirSync(distDir);
29
- fs.writeFileSync(path.join(distDir, 'image-digests.json'), JSON.stringify({
30
- 'host-cp': 'sha256:' + 'a'.repeat(64),
31
- auth: 'sha256:' + 'b'.repeat(64),
32
- devbox: 'sha256:' + 'c'.repeat(64),
33
- $registry: 'ghcr.io/pleri',
34
- }));
35
- const digests = loadImageDigests(dir);
36
- expect(digests['host-cp']).toMatch(/^sha256:/);
37
- expect(digests['mcp-auth']).toBeUndefined();
38
- fs.rmSync(dir, { recursive: true, force: true });
39
- });
40
- it('loadImageDigests parses json with mcp-auth present', async () => {
41
- const { loadImageDigests } = await import('../commands/bootstrap.js');
42
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-digest-mcp-'));
43
- const distDir = path.join(dir, 'dist');
44
- fs.mkdirSync(distDir);
45
- fs.writeFileSync(path.join(distDir, 'image-digests.json'), JSON.stringify({
46
- 'host-cp': 'sha256:' + 'a'.repeat(64),
47
- auth: 'sha256:' + 'b'.repeat(64),
48
- devbox: 'sha256:' + 'c'.repeat(64),
49
- 'mcp-auth': 'sha256:' + 'd'.repeat(64),
50
- $registry: 'ghcr.io/pleri',
51
- }));
52
- const digests = loadImageDigests(dir);
53
- expect(digests['mcp-auth']).toMatch(/^sha256:/);
54
- fs.rmSync(dir, { recursive: true, force: true });
55
- });
56
- });
57
- // ── runUpgradePullByDigest — mcp-auth integration ─────────────────
58
- function ok(stdout = '') {
59
- return { exitCode: 0, stdout, stderr: '' };
60
- }
61
- function makeMockDocker() {
62
- const calls = [];
63
- return {
64
- docker: {
65
- info: vi.fn(async () => ok()),
66
- pull: vi.fn(async (ref) => {
67
- calls.push(ref);
68
- return ok();
69
- }),
70
- inspectLabel: vi.fn(async () => ok('1\n')),
71
- tag: vi.fn(async () => ok()),
72
- },
73
- calls,
74
- };
75
- }
76
- const FIXTURE_DIGESTS_3 = {
77
- 'host-cp': 'sha256:' + 'a'.repeat(64),
78
- auth: 'sha256:' + 'b'.repeat(64),
79
- devbox: 'sha256:' + 'c'.repeat(64),
80
- $registry: 'ghcr.io/pleri',
81
- $published_version: '0.1.16',
82
- };
83
- const FIXTURE_DIGESTS_4 = {
84
- ...FIXTURE_DIGESTS_3,
85
- 'mcp-auth': 'sha256:' + 'd'.repeat(64),
86
- };
87
- describe('runUpgradePullByDigest — mcp-auth pull', () => {
88
- beforeEach(() => {
89
- vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
90
- vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
91
- });
92
- afterEach(() => vi.restoreAllMocks());
93
- it('pulls 4 images when mcp-auth digest is in digests', async () => {
94
- const { runUpgradePullByDigest } = await import('../commands/upgrade.js');
95
- const { docker, calls } = makeMockDocker();
96
- await runUpgradePullByDigest({
97
- docker,
98
- digests: FIXTURE_DIGESTS_4,
99
- composeFile: '/tmp/nonexistent-compose.yaml',
100
- runComposeImpl: () => ({ ok: true, stdout: '', stderr: '' }),
101
- recreateAuth: async () => ({ ok: true }),
102
- recreateMcpAuth: async () => ({ ok: true }),
103
- tagImpl: () => ({ ok: true }),
104
- });
105
- expect(calls).toHaveLength(4);
106
- expect(calls.some((r) => r.includes('olam-mcp-auth@'))).toBe(true);
107
- });
108
- it('pulls only 3 images when mcp-auth digest absent (old tarball)', async () => {
109
- const { runUpgradePullByDigest } = await import('../commands/upgrade.js');
110
- const { docker, calls } = makeMockDocker();
111
- await runUpgradePullByDigest({
112
- docker,
113
- digests: FIXTURE_DIGESTS_3,
114
- composeFile: '/tmp/nonexistent-compose.yaml',
115
- runComposeImpl: () => ({ ok: true, stdout: '', stderr: '' }),
116
- recreateAuth: async () => ({ ok: true }),
117
- tagImpl: () => ({ ok: true }),
118
- });
119
- expect(calls).toHaveLength(3);
120
- expect(calls.every((r) => !r.includes('mcp-auth'))).toBe(true);
121
- });
122
- it('exits EXIT_GENERIC_ERROR when mcp-auth recreate fails', async () => {
123
- const { runUpgradePullByDigest } = await import('../commands/upgrade.js');
124
- const { EXIT_GENERIC_ERROR } = await import('../exit-codes.js');
125
- const { docker } = makeMockDocker();
126
- const result = await runUpgradePullByDigest({
127
- docker,
128
- digests: FIXTURE_DIGESTS_4,
129
- composeFile: '/tmp/nonexistent-compose.yaml',
130
- runComposeImpl: () => ({ ok: true, stdout: '', stderr: '' }),
131
- recreateAuth: async () => ({ ok: true }),
132
- recreateMcpAuth: async () => ({ ok: false, error: 'health timeout' }),
133
- tagImpl: () => ({ ok: true }),
134
- });
135
- expect(result.exitCode).toBe(EXIT_GENERIC_ERROR);
136
- expect(result.summary).toContain('mcp-auth');
137
- });
138
- it('exits 0 and skips mcp-auth recreate when digest absent', async () => {
139
- const { runUpgradePullByDigest } = await import('../commands/upgrade.js');
140
- const { docker } = makeMockDocker();
141
- let mcpRecreateCalled = false;
142
- const result = await runUpgradePullByDigest({
143
- docker,
144
- digests: FIXTURE_DIGESTS_3,
145
- composeFile: '/tmp/nonexistent-compose.yaml',
146
- runComposeImpl: () => ({ ok: true, stdout: '', stderr: '' }),
147
- recreateAuth: async () => ({ ok: true }),
148
- recreateMcpAuth: async () => {
149
- mcpRecreateCalled = true;
150
- return { ok: true };
151
- },
152
- tagImpl: () => ({ ok: true }),
153
- });
154
- expect(result.exitCode).toBe(0);
155
- expect(mcpRecreateCalled).toBe(false);
156
- });
157
- it('mcp-auth tagged to olam-mcp-auth:local when digest present', async () => {
158
- const { runUpgradePullByDigest } = await import('../commands/upgrade.js');
159
- const { docker } = makeMockDocker();
160
- const tagCalls = [];
161
- await runUpgradePullByDigest({
162
- docker,
163
- digests: FIXTURE_DIGESTS_4,
164
- composeFile: '/tmp/nonexistent-compose.yaml',
165
- runComposeImpl: () => ({ ok: true, stdout: '', stderr: '' }),
166
- recreateAuth: async () => ({ ok: true }),
167
- recreateMcpAuth: async () => ({ ok: true }),
168
- tagImpl: (from, to) => {
169
- tagCalls.push({ from, to });
170
- return { ok: true };
171
- },
172
- });
173
- const mcpTag = tagCalls.find((t) => t.to === 'olam-mcp-auth:local');
174
- expect(mcpTag).toBeDefined();
175
- expect(mcpTag?.from).toContain('olam-mcp-auth@sha256:');
176
- });
177
- });
178
- // ── olam auth up deprecation — exports shape ─────────────────────
179
- describe('auth.ts import shape', () => {
180
- it('registerAuth is still exported from auth.ts', async () => {
181
- const mod = await import('../commands/auth.js');
182
- expect(typeof mod.registerAuth).toBe('function');
183
- });
184
- });
185
- //# sourceMappingURL=services.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"services.test.js","sourceRoot":"","sources":["../../src/__tests__/services.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=status-app-urls.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-app-urls.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/status-app-urls.test.ts"],"names":[],"mappings":""}
@@ -1,125 +0,0 @@
1
- import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { Command } from 'commander';
3
- // Mock loadContext before importing the command so vitest can intercept
4
- vi.mock('../context.js', () => ({ loadContext: vi.fn() }));
5
- // After mock declaration, import the mocked function and the command registrar
6
- const { loadContext } = await import('../context.js');
7
- const { registerStatus } = await import('../commands/status.js');
8
- const ANSI_RE = /\x1b\[[0-9;]*[A-Za-z]/g;
9
- function strip(s) {
10
- return s.replace(ANSI_RE, '');
11
- }
12
- const SAMPLE_URLS = [
13
- { repoName: 'atlas-core', internalPort: 3000, hostPort: 13000, url: 'http://localhost:13000' },
14
- { repoName: 'diner-app', internalPort: 4000, hostPort: 14000, url: 'http://localhost:14000' },
15
- ];
16
- function makeWorld(overrides) {
17
- return {
18
- id: 'test-world-1',
19
- name: 'Test World',
20
- status: 'running',
21
- repos: ['olam'],
22
- branch: 'main',
23
- portOffset: 0,
24
- workspacePath: '/home/olam/workspace/olam',
25
- computeProvider: 'docker',
26
- totalCostUsd: 0.0042,
27
- thoughtCount: 7,
28
- createdAt: '2026-05-01T10:00:00.000Z',
29
- updatedAt: '2026-05-01T11:00:00.000Z',
30
- ...overrides,
31
- };
32
- }
33
- function makeCtx(world) {
34
- return {
35
- worldManager: {
36
- getWorld: vi.fn().mockReturnValue(world),
37
- },
38
- costTracker: {
39
- getWorldCost: vi.fn().mockReturnValue(0.0042),
40
- },
41
- };
42
- }
43
- describe('olam status — appPortUrls output', () => {
44
- let logSpy;
45
- beforeEach(() => {
46
- logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
47
- vi.mocked(loadContext).mockReset();
48
- });
49
- afterEach(() => {
50
- logSpy.mockRestore();
51
- vi.unstubAllEnvs();
52
- });
53
- async function runStatus(worldId = 'test-world-1', extraArgs = []) {
54
- const program = new Command().exitOverride();
55
- registerStatus(program);
56
- await program.parseAsync(['node', 'cli', 'status', worldId, ...extraArgs]);
57
- }
58
- it('prints Dashboard and Apps block when appPortUrls is present', async () => {
59
- const world = makeWorld({ appPortUrls: SAMPLE_URLS });
60
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
61
- await runStatus();
62
- const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
63
- expect(output).toContain('http://localhost:19080'); // dashboard
64
- expect(output).toContain('atlas-core');
65
- expect(output).toContain('http://localhost:13000');
66
- expect(output).toContain('diner-app');
67
- expect(output).toContain('http://localhost:14000');
68
- });
69
- it('prints first app URL with "Apps" label, subsequent with empty label', async () => {
70
- const world = makeWorld({ appPortUrls: SAMPLE_URLS });
71
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
72
- await runStatus();
73
- const lines = logSpy.mock.calls.map((args) => strip(String(args[0])));
74
- const appsLine = lines.find((l) => l.includes('Apps') && l.includes('atlas-core'));
75
- expect(appsLine).toBeDefined();
76
- // Second app URL line uses empty label (14 spaces of padding)
77
- const dinerLine = lines.find((l) => l.includes('diner-app') && l.includes('http://localhost:14000'));
78
- expect(dinerLine).toBeDefined();
79
- expect(dinerLine).not.toMatch(/Apps/);
80
- });
81
- it('does NOT print Apps block when appPortUrls is absent', async () => {
82
- const world = makeWorld(); // no appPortUrls
83
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
84
- await runStatus();
85
- const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
86
- expect(output).not.toContain('Apps');
87
- expect(output).toContain('http://localhost:19080'); // dashboard still present
88
- });
89
- it('does NOT print Apps block when appPortUrls is empty array', async () => {
90
- const world = makeWorld({ appPortUrls: [] });
91
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
92
- await runStatus();
93
- const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
94
- expect(output).not.toContain('Apps');
95
- });
96
- it('--json output includes appPortUrls array', async () => {
97
- const world = makeWorld({ appPortUrls: SAMPLE_URLS });
98
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
99
- await runStatus('test-world-1', ['--json']);
100
- const jsonCall = logSpy.mock.calls.find((args) => String(args[0]).startsWith('{'));
101
- expect(jsonCall).toBeDefined();
102
- const parsed = JSON.parse(String(jsonCall[0]));
103
- expect(parsed.appPortUrls).toEqual(SAMPLE_URLS);
104
- expect(parsed.dashboardUrl).toBe('http://localhost:19080');
105
- });
106
- it('--json output without appPortUrls omits the field', async () => {
107
- const world = makeWorld(); // no appPortUrls
108
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
109
- await runStatus('test-world-1', ['--json']);
110
- const jsonCall = logSpy.mock.calls.find((args) => String(args[0]).startsWith('{'));
111
- expect(jsonCall).toBeDefined();
112
- const parsed = JSON.parse(String(jsonCall[0]));
113
- expect(parsed.appPortUrls).toBeUndefined();
114
- expect(parsed.dashboardUrl).toBe('http://localhost:19080');
115
- });
116
- it('uses portOffset to compute correct dashboardUrl', async () => {
117
- const world = makeWorld({ portOffset: 200, appPortUrls: SAMPLE_URLS });
118
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
119
- await runStatus('test-world-1', ['--json']);
120
- const jsonCall = logSpy.mock.calls.find((args) => String(args[0]).startsWith('{'));
121
- const parsed = JSON.parse(String(jsonCall[0]));
122
- expect(parsed.dashboardUrl).toBe('http://localhost:19280'); // 19080 + 200
123
- });
124
- });
125
- //# sourceMappingURL=status-app-urls.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-app-urls.test.js","sourceRoot":"","sources":["../../src/__tests__/status-app-urls.test.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * upgrade-gh-token-contract.test.ts — contractual regression test for
3
- * the GH_TOKEN forwarding through `olam upgrade`.
4
- *
5
- * Bug history: `olam host-cp start` correctly captured the operator's
6
- * gh-CLI token (via `captureGhToken()` → `buildComposeEnv(authSecret,
7
- * ghToken)`) and injected it into the host-cp container env. But
8
- * `olam upgrade -y` used a DIFFERENT call shape —
9
- * `buildComposeEnv(authSecret)` (single arg) — which omitted the token.
10
- * Every upgrade silently dropped GH_TOKEN, leaving the new container
11
- * with `GH_TOKEN=` (empty). The dashboard's PR filter + Cmd+K palette
12
- * silently 500'd because pr-merge-poller + /api/prs both gated on a
13
- * non-empty token.
14
- *
15
- * Pin the contract: every `buildComposeEnv` call site in upgrade.ts
16
- * MUST pass both authSecret AND captureGhToken().
17
- */
18
- export {};
19
- //# sourceMappingURL=upgrade-gh-token-contract.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade-gh-token-contract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/upgrade-gh-token-contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -1,63 +0,0 @@
1
- /**
2
- * upgrade-gh-token-contract.test.ts — contractual regression test for
3
- * the GH_TOKEN forwarding through `olam upgrade`.
4
- *
5
- * Bug history: `olam host-cp start` correctly captured the operator's
6
- * gh-CLI token (via `captureGhToken()` → `buildComposeEnv(authSecret,
7
- * ghToken)`) and injected it into the host-cp container env. But
8
- * `olam upgrade -y` used a DIFFERENT call shape —
9
- * `buildComposeEnv(authSecret)` (single arg) — which omitted the token.
10
- * Every upgrade silently dropped GH_TOKEN, leaving the new container
11
- * with `GH_TOKEN=` (empty). The dashboard's PR filter + Cmd+K palette
12
- * silently 500'd because pr-merge-poller + /api/prs both gated on a
13
- * non-empty token.
14
- *
15
- * Pin the contract: every `buildComposeEnv` call site in upgrade.ts
16
- * MUST pass both authSecret AND captureGhToken().
17
- */
18
- import { describe, it, expect } from 'vitest';
19
- import * as fs from 'node:fs';
20
- import * as path from 'node:path';
21
- import { fileURLToPath } from 'node:url';
22
- const __filename = fileURLToPath(import.meta.url);
23
- const __dirname = path.dirname(__filename);
24
- const UPGRADE_PATH = path.join(__dirname, '..', 'commands', 'upgrade.ts');
25
- describe('upgrade.ts GH_TOKEN forwarding contract', () => {
26
- it('imports captureGhToken from ./host-cp.js', () => {
27
- const src = fs.readFileSync(UPGRADE_PATH, 'utf-8');
28
- // The host-cp.js import line must include captureGhToken so the
29
- // upgrade path can re-capture the operator's token at recreate time.
30
- const hostCpImport = src.match(/import\s*\{[^}]*\}\s*from\s*['"]\.\/host-cp\.js['"]/);
31
- expect(hostCpImport).not.toBeNull();
32
- expect(hostCpImport[0]).toMatch(/\bcaptureGhToken\b/);
33
- });
34
- it('every buildComposeEnv call passes captureGhToken() as the second arg', () => {
35
- const src = fs.readFileSync(UPGRADE_PATH, 'utf-8');
36
- // Find every `buildComposeEnv(...)` invocation. The args may include
37
- // a nested call like `captureGhToken()` — `[^)]+` would stop at the
38
- // FIRST `)` (the inner paren). Capture ~120 chars after the name
39
- // and check the full slice for the captureGhToken signature.
40
- const callOffsets = [];
41
- const re = /buildComposeEnv\s*\(/g;
42
- let m;
43
- while ((m = re.exec(src)) != null) {
44
- callOffsets.push(m.index);
45
- }
46
- expect(callOffsets.length).toBeGreaterThan(0);
47
- for (const off of callOffsets) {
48
- const slice = src.slice(off, off + 120);
49
- expect(slice, `buildComposeEnv call must include captureGhToken(). Slice:\n${slice}`)
50
- .toMatch(/captureGhToken\s*\(\s*\)/);
51
- }
52
- });
53
- it('contract holds across forward-upgrade, rollback, and source-mode call sites', () => {
54
- // Sanity: at least 4 call sites exist (forward upgrade, source-mode
55
- // build, rollback, source-mode SPA build) per the original code
56
- // shape. If a future refactor consolidates them, this test should
57
- // still hold per-call.
58
- const src = fs.readFileSync(UPGRADE_PATH, 'utf-8');
59
- const callCount = (src.match(/buildComposeEnv\s*\(/g) ?? []).length;
60
- expect(callCount).toBeGreaterThanOrEqual(4);
61
- });
62
- });
63
- //# sourceMappingURL=upgrade-gh-token-contract.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade-gh-token-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/upgrade-gh-token-contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAE1E,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACnD,gEAAgE;QAChE,qEAAqE;QACrE,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACtF,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,CAAC,YAAa,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAEnD,qEAAqE;QACrE,oEAAoE;QACpE,iEAAiE;QACjE,6DAA6D;QAC7D,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,uBAAuB,CAAC;QACnC,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YAClC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,EAAE,+DAA+D,KAAK,EAAE,CAAC;iBAClF,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,oEAAoE;QACpE,gEAAgE;QAChE,kEAAkE;QAClE,uBAAuB;QACvB,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACpE,MAAM,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Unit tests for upgrade.ts pure helpers.
3
- *
4
- * Only tests the stateless, side-effect-free helpers. The full upgrade
5
- * pipeline (git, npm, docker) is too side-effectful to integration-test
6
- * inside the devbox — same philosophy as host-cp.test.ts.
7
- */
8
- export {};
9
- //# sourceMappingURL=upgrade.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/upgrade.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}