@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,397 +0,0 @@
1
- /**
2
- * Unit tests for auth-upgrade.ts pure helpers.
3
- *
4
- * Only tests the stateless, side-effect-free helpers. The full upgrade
5
- * pipeline (docker build, stop, rm, start) is too side-effectful to
6
- * integration-test inside the devbox — same philosophy as upgrade.test.ts.
7
- */
8
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
9
- import * as fs from 'node:fs';
10
- import * as os from 'node:os';
11
- import * as path from 'node:path';
12
- import { validateAuthRepoRoot, parseAuthUpgradeOpts, smokeTestCodexProvider, runAuthUpgradePullByDigest, } from '../commands/auth-upgrade.js';
13
- import {} from '../commands/bootstrap.js';
14
- import { EXIT_BOOTSTRAP_PULL_FAILED, EXIT_GENERIC_ERROR, EXIT_PROTOCOL_MISMATCH, } from '../exit-codes.js';
15
- // ── validateAuthRepoRoot ──────────────────────────────────────────
16
- describe('validateAuthRepoRoot', () => {
17
- let tmpDir;
18
- beforeEach(() => {
19
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-auth-upgrade-test-'));
20
- });
21
- afterEach(() => {
22
- fs.rmSync(tmpDir, { recursive: true, force: true });
23
- });
24
- it('returns ok:false when the marker file is absent', () => {
25
- const result = validateAuthRepoRoot(tmpDir);
26
- expect(result.ok).toBe(false);
27
- if (!result.ok) {
28
- expect(result.error).toMatch(/packages\/auth-service\/Dockerfile/);
29
- expect(result.error).toMatch(/olam repo root/i);
30
- }
31
- });
32
- it('returns ok:true when packages/auth-service/Dockerfile exists', () => {
33
- const authServiceDir = path.join(tmpDir, 'packages/auth-service');
34
- fs.mkdirSync(authServiceDir, { recursive: true });
35
- fs.writeFileSync(path.join(authServiceDir, 'Dockerfile'), 'FROM node:22-slim');
36
- const result = validateAuthRepoRoot(tmpDir);
37
- expect(result.ok).toBe(true);
38
- });
39
- it('error message includes the expected path', () => {
40
- const result = validateAuthRepoRoot('/nonexistent-definitely-not-a-real-path');
41
- expect(result.ok).toBe(false);
42
- if (!result.ok) {
43
- expect(result.error).toContain('Dockerfile');
44
- }
45
- });
46
- it('error message includes a remediation hint', () => {
47
- const result = validateAuthRepoRoot(tmpDir);
48
- expect(result.ok).toBe(false);
49
- if (!result.ok) {
50
- expect(result.error).toContain('olam auth upgrade');
51
- }
52
- });
53
- });
54
- // ── parseAuthUpgradeOpts ──────────────────────────────────────────
55
- describe('parseAuthUpgradeOpts', () => {
56
- it('defaults all options to false when called with empty object', () => {
57
- const opts = parseAuthUpgradeOpts({});
58
- expect(opts.yes).toBe(false);
59
- expect(opts.skipRecreate).toBe(false);
60
- });
61
- it('sets yes:true when raw.yes is true', () => {
62
- expect(parseAuthUpgradeOpts({ yes: true }).yes).toBe(true);
63
- });
64
- it('sets yes:false when raw.yes is false', () => {
65
- expect(parseAuthUpgradeOpts({ yes: false }).yes).toBe(false);
66
- });
67
- it('sets yes:false when raw.yes is undefined', () => {
68
- expect(parseAuthUpgradeOpts({ yes: undefined }).yes).toBe(false);
69
- });
70
- it('sets skipRecreate:true when raw.skipRecreate is true', () => {
71
- expect(parseAuthUpgradeOpts({ skipRecreate: true }).skipRecreate).toBe(true);
72
- });
73
- it('sets skipRecreate:false when raw.skipRecreate is undefined', () => {
74
- expect(parseAuthUpgradeOpts({}).skipRecreate).toBe(false);
75
- });
76
- it('accepts both options at once', () => {
77
- const opts = parseAuthUpgradeOpts({ yes: true, skipRecreate: true });
78
- expect(opts.yes).toBe(true);
79
- expect(opts.skipRecreate).toBe(true);
80
- });
81
- it('defaults fromSource to false', () => {
82
- expect(parseAuthUpgradeOpts({}).fromSource).toBe(false);
83
- });
84
- it('sets fromSource:true when raw.fromSource is true', () => {
85
- expect(parseAuthUpgradeOpts({ fromSource: true }).fromSource).toBe(true);
86
- });
87
- it('result is a plain object (no mutation of input)', () => {
88
- const raw = { yes: true };
89
- const opts = parseAuthUpgradeOpts(raw);
90
- expect(opts).not.toBe(raw);
91
- });
92
- });
93
- // ── smokeTestCodexProvider ────────────────────────────────────────
94
- // These tests verify that the smoke gate correctly distinguishes a stale
95
- // (pre-codex) image from a current one. A stale image returns a
96
- // claude.com loginUrl for provider=codex; a current image returns an
97
- // OpenAI verification URL.
98
- describe('smokeTestCodexProvider', () => {
99
- beforeEach(() => {
100
- vi.stubGlobal('fetch', undefined);
101
- });
102
- afterEach(() => {
103
- vi.unstubAllGlobals();
104
- });
105
- function makeResponse(body, status = 200) {
106
- return new Response(JSON.stringify(body), {
107
- status,
108
- headers: { 'Content-Type': 'application/json' },
109
- });
110
- }
111
- it('returns ok:true when codex response has no claude.com loginUrl', async () => {
112
- vi.stubGlobal('fetch', async () => makeResponse({
113
- verificationUriComplete: 'https://login.microsoftonline.com/common/oauth2/v2.0/deviceauth',
114
- userCode: 'TEST-CODE',
115
- state: 'abc123',
116
- }));
117
- const result = await smokeTestCodexProvider(null);
118
- expect(result.ok).toBe(true);
119
- });
120
- it('returns ok:false when codex response contains a claude.com loginUrl (stale image)', async () => {
121
- vi.stubGlobal('fetch', async () => makeResponse({
122
- loginUrl: 'https://claude.com/oauth/authorize?...',
123
- state: 'pkce-state',
124
- }));
125
- const result = await smokeTestCodexProvider(null);
126
- expect(result.ok).toBe(false);
127
- if (!result.ok) {
128
- expect(result.error).toMatch(/claude\.com/);
129
- expect(result.error).toMatch(/stale/i);
130
- }
131
- });
132
- it('returns ok:false when codex response contains a claude.ai loginUrl', async () => {
133
- vi.stubGlobal('fetch', async () => makeResponse({ loginUrl: 'https://claude.ai/oauth/authorize' }));
134
- const result = await smokeTestCodexProvider(null);
135
- expect(result.ok).toBe(false);
136
- });
137
- it('returns ok:true for 502 (OpenAI unreachable) — not a stale-image failure', async () => {
138
- vi.stubGlobal('fetch', async () => makeResponse({ error: 'OpenAI device auth endpoint unavailable' }, 502));
139
- const result = await smokeTestCodexProvider(null);
140
- expect(result.ok).toBe(true);
141
- });
142
- it('returns ok:false when fetch throws (network error)', async () => {
143
- vi.stubGlobal('fetch', async () => { throw new Error('ECONNREFUSED'); });
144
- const result = await smokeTestCodexProvider(null);
145
- expect(result.ok).toBe(false);
146
- if (!result.ok) {
147
- expect(result.error).toMatch(/ECONNREFUSED/);
148
- }
149
- });
150
- it('sends X-Olam-Secret header when authSecret is provided', async () => {
151
- let capturedHeaders;
152
- vi.stubGlobal('fetch', async (_url, init) => {
153
- capturedHeaders = init.headers;
154
- return makeResponse({ userCode: 'X' });
155
- });
156
- await smokeTestCodexProvider('super-secret');
157
- expect(capturedHeaders?.['X-Olam-Secret']).toBe('super-secret');
158
- });
159
- it('omits X-Olam-Secret header when authSecret is null', async () => {
160
- let capturedHeaders;
161
- vi.stubGlobal('fetch', async (_url, init) => {
162
- capturedHeaders = init.headers;
163
- return makeResponse({ userCode: 'X' });
164
- });
165
- await smokeTestCodexProvider(null);
166
- expect(capturedHeaders?.['X-Olam-Secret']).toBeUndefined();
167
- });
168
- });
169
- // ── runAuthUpgradePullByDigest — orchestrator (Phase C — C6) ─────
170
- const FIXTURE_DIGESTS = {
171
- 'host-cp': 'sha256:' + 'a'.repeat(64),
172
- auth: 'sha256:' + 'b'.repeat(64),
173
- devbox: 'sha256:' + 'c'.repeat(64),
174
- $registry: 'ghcr.io/pleri',
175
- $published_version: '0.1.16',
176
- };
177
- function ok(stdout = '') {
178
- return { exitCode: 0, stdout, stderr: '' };
179
- }
180
- function err(stderr, exitCode = 1) {
181
- return { exitCode, stdout: '', stderr };
182
- }
183
- function makeMockDocker(opts = {}) {
184
- const calls = opts.calls ?? { pull: [], inspect: [] };
185
- return {
186
- info: vi.fn(async () => (opts.infoOk === false ? err('cannot connect to docker') : ok())),
187
- pull: vi.fn(async (ref) => {
188
- calls.pull.push(ref);
189
- return opts.pullResults?.get(ref) ?? ok();
190
- }),
191
- inspectLabel: vi.fn(async (ref, label) => {
192
- calls.inspect.push(`${ref}#${label}`);
193
- const value = opts.inspectLabels?.get(ref) ?? '1';
194
- return ok(`${value}\n`);
195
- }),
196
- tag: vi.fn(async () => ok()),
197
- };
198
- }
199
- describe('runAuthUpgradePullByDigest — happy path', () => {
200
- beforeEach(() => {
201
- vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
202
- vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
203
- });
204
- afterEach(() => {
205
- vi.restoreAllMocks();
206
- });
207
- it('exits 0 when daemon up + pull succeeds + handshake passes + recreate succeeds', async () => {
208
- const docker = makeMockDocker();
209
- const tagCalls = [];
210
- let recreated = 0;
211
- const result = await runAuthUpgradePullByDigest({
212
- docker,
213
- digests: FIXTURE_DIGESTS,
214
- tagImpl: (from, to) => {
215
- tagCalls.push({ from, to });
216
- return { ok: true };
217
- },
218
- recreateAuth: async () => {
219
- recreated++;
220
- return { ok: true };
221
- },
222
- });
223
- expect(result.exitCode).toBe(0);
224
- expect(result.summary).toContain('upgraded');
225
- expect(tagCalls).toHaveLength(1);
226
- expect(tagCalls[0]?.from).toContain(`olam-auth@${FIXTURE_DIGESTS.auth}`);
227
- expect(tagCalls[0]?.to).toBe('olam-auth:local');
228
- expect(recreated).toBe(1);
229
- });
230
- it('pulls only olam-auth (not host-cp / devbox)', async () => {
231
- const calls = { pull: [], inspect: [] };
232
- const docker = makeMockDocker({ calls });
233
- await runAuthUpgradePullByDigest({
234
- docker,
235
- digests: FIXTURE_DIGESTS,
236
- tagImpl: () => ({ ok: true }),
237
- recreateAuth: async () => ({ ok: true }),
238
- });
239
- expect(calls.pull).toHaveLength(1);
240
- expect(calls.pull[0]).toBe(`ghcr.io/pleri/olam-auth@${FIXTURE_DIGESTS.auth}`);
241
- });
242
- it('honours deps.registry override', async () => {
243
- const calls = { pull: [], inspect: [] };
244
- const docker = makeMockDocker({ calls });
245
- await runAuthUpgradePullByDigest({
246
- docker,
247
- digests: FIXTURE_DIGESTS,
248
- registry: 'localhost:5000/test',
249
- tagImpl: () => ({ ok: true }),
250
- recreateAuth: async () => ({ ok: true }),
251
- });
252
- expect(calls.pull[0]).toContain('localhost:5000/test/olam-auth');
253
- });
254
- });
255
- describe('runAuthUpgradePullByDigest — failure paths', () => {
256
- beforeEach(() => {
257
- vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
258
- vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
259
- });
260
- afterEach(() => {
261
- vi.restoreAllMocks();
262
- });
263
- it('exits EXIT_GENERIC_ERROR (1) when docker daemon not reachable', async () => {
264
- const docker = makeMockDocker({ infoOk: false });
265
- const result = await runAuthUpgradePullByDigest({
266
- docker,
267
- digests: FIXTURE_DIGESTS,
268
- tagImpl: () => ({ ok: true }),
269
- recreateAuth: async () => ({ ok: true }),
270
- });
271
- expect(result.exitCode).toBe(EXIT_GENERIC_ERROR);
272
- expect(result.summary).toContain('docker daemon');
273
- });
274
- it('exits EXIT_BOOTSTRAP_PULL_FAILED (3) when the auth pull fails terminally', async () => {
275
- const docker = makeMockDocker({
276
- pullResults: new Map([
277
- [`ghcr.io/pleri/olam-auth@${FIXTURE_DIGESTS.auth}`, err('manifest unknown', 1)],
278
- ]),
279
- });
280
- let recreated = 0;
281
- const result = await runAuthUpgradePullByDigest({
282
- docker,
283
- digests: FIXTURE_DIGESTS,
284
- tagImpl: () => ({ ok: true }),
285
- recreateAuth: async () => {
286
- recreated++;
287
- return { ok: true };
288
- },
289
- });
290
- expect(result.exitCode).toBe(EXIT_BOOTSTRAP_PULL_FAILED);
291
- expect(result.summary).toContain('pull failed');
292
- expect(recreated).toBe(0); // bailed before recreate
293
- });
294
- it('exits EXIT_PROTOCOL_MISMATCH (4) when LABEL declares non-overlapping versions', async () => {
295
- const docker = makeMockDocker({
296
- inspectLabels: new Map([
297
- [`ghcr.io/pleri/olam-auth@${FIXTURE_DIGESTS.auth}`, '99'],
298
- ]),
299
- });
300
- const result = await runAuthUpgradePullByDigest({
301
- docker,
302
- digests: FIXTURE_DIGESTS,
303
- tagImpl: () => ({ ok: true }),
304
- recreateAuth: async () => ({ ok: true }),
305
- });
306
- expect(result.exitCode).toBe(EXIT_PROTOCOL_MISMATCH);
307
- expect(result.summary).toContain('auth');
308
- });
309
- it('exits EXIT_PROTOCOL_MISMATCH when LABEL is missing', async () => {
310
- const docker = makeMockDocker({
311
- inspectLabels: new Map([
312
- [`ghcr.io/pleri/olam-auth@${FIXTURE_DIGESTS.auth}`, '<no value>'],
313
- ]),
314
- });
315
- const result = await runAuthUpgradePullByDigest({
316
- docker,
317
- digests: FIXTURE_DIGESTS,
318
- tagImpl: () => ({ ok: true }),
319
- recreateAuth: async () => ({ ok: true }),
320
- });
321
- expect(result.exitCode).toBe(EXIT_PROTOCOL_MISMATCH);
322
- });
323
- it('exits EXIT_GENERIC_ERROR when docker tag fails', async () => {
324
- const docker = makeMockDocker();
325
- const result = await runAuthUpgradePullByDigest({
326
- docker,
327
- digests: FIXTURE_DIGESTS,
328
- tagImpl: () => ({ ok: false, error: 'image not found' }),
329
- recreateAuth: async () => ({ ok: true }),
330
- });
331
- expect(result.exitCode).toBe(EXIT_GENERIC_ERROR);
332
- expect(result.summary).toContain('tag failed');
333
- });
334
- it('exits EXIT_GENERIC_ERROR when auth recreate fails', async () => {
335
- const docker = makeMockDocker();
336
- const result = await runAuthUpgradePullByDigest({
337
- docker,
338
- digests: FIXTURE_DIGESTS,
339
- tagImpl: () => ({ ok: true }),
340
- recreateAuth: async () => ({ ok: false, error: 'health check failed' }),
341
- });
342
- expect(result.exitCode).toBe(EXIT_GENERIC_ERROR);
343
- expect(result.summary).toContain('auth recreate');
344
- });
345
- });
346
- // ── --from-source dev-mode gating (Phase C — C6) ──────────────────
347
- describe('--from-source flag gating — outside dev mode', () => {
348
- let originalDev;
349
- beforeEach(() => {
350
- originalDev = process.env.OLAM_DEV;
351
- delete process.env.OLAM_DEV;
352
- });
353
- afterEach(() => {
354
- if (originalDev === undefined) {
355
- delete process.env.OLAM_DEV;
356
- }
357
- else {
358
- process.env.OLAM_DEV = originalDev;
359
- }
360
- });
361
- it('MissingBuildScriptError is the hint surfaced when --from-source runs outside dev mode', async () => {
362
- const { isDevMode, MissingBuildScriptError } = await import('../install-root.js');
363
- expect(isDevMode()).toBe(false);
364
- const e = new MissingBuildScriptError('packages/adapters/src/docker/build-auth.sh');
365
- expect(e.message).toMatch(/Build script .* not available/);
366
- expect(e.message).toMatch(/OLAM_DEV=1/);
367
- expect(e.message).toMatch(/--from-source/);
368
- });
369
- });
370
- describe('--from-source flag gating — inside dev mode', () => {
371
- let originalDev;
372
- let tmpDir;
373
- beforeEach(() => {
374
- originalDev = process.env.OLAM_DEV;
375
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-auth-c6-fromsource-'));
376
- process.env.OLAM_DEV = '1';
377
- });
378
- afterEach(() => {
379
- if (originalDev === undefined) {
380
- delete process.env.OLAM_DEV;
381
- }
382
- else {
383
- process.env.OLAM_DEV = originalDev;
384
- }
385
- fs.rmSync(tmpDir, { recursive: true, force: true });
386
- });
387
- it('isDevMode returns true when OLAM_DEV=1 + packages/ sibling exists', async () => {
388
- const repoRoot = path.join(tmpDir, 'repo');
389
- const installRootDir = path.join(repoRoot, 'packages', 'cli');
390
- fs.mkdirSync(installRootDir, { recursive: true });
391
- fs.mkdirSync(path.join(repoRoot, 'packages'), { recursive: true });
392
- fs.writeFileSync(path.join(repoRoot, 'package.json'), '{}');
393
- const { isDevMode } = await import('../install-root.js');
394
- expect(isDevMode(process.env, installRootDir)).toBe(true);
395
- });
396
- });
397
- //# sourceMappingURL=auth-upgrade.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth-upgrade.test.js","sourceRoot":"","sources":["../../src/__tests__/auth-upgrade.test.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- /**
2
- * bootstrap-tag-mcp-auth.test.ts — contractual regression for the
3
- * fix that makes `olam bootstrap` tag mcp-auth.
4
- *
5
- * Bug history: PR #361 added `'mcp-auth'?: string` to the
6
- * ImageDigests type and started PUBLISHING image-digests.json with
7
- * the field, but `olam bootstrap` never read it. The image was
8
- * neither pulled nor tagged. Downstream `olam auth up` (called
9
- * during bootstrap chain + by the D3 conformance CI smoke) failed
10
- * with: "mcp-auth image 'olam-mcp-auth:local' not found locally".
11
- * Every fresh-machine install + the D3 fixture-asserts CI job
12
- * silently broke for ~24h until #366's CI run surfaced it.
13
- *
14
- * Pin the contract: when the digests blob carries an `mcp-auth` key,
15
- * bootstrap.ts MUST (a) reference it in the imageRefs construction,
16
- * (b) tag the pulled digest as `olam-mcp-auth:local` (the
17
- * services.ts MCP_AUTH_LOCAL_TAG constant). The previous PR-validator
18
- * pattern wins again — string-level assertion against the source is
19
- * the cheapest enforcement.
20
- */
21
- export {};
22
- //# sourceMappingURL=bootstrap-tag-mcp-auth.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap-tag-mcp-auth.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/bootstrap-tag-mcp-auth.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
@@ -1,63 +0,0 @@
1
- /**
2
- * bootstrap-tag-mcp-auth.test.ts — contractual regression for the
3
- * fix that makes `olam bootstrap` tag mcp-auth.
4
- *
5
- * Bug history: PR #361 added `'mcp-auth'?: string` to the
6
- * ImageDigests type and started PUBLISHING image-digests.json with
7
- * the field, but `olam bootstrap` never read it. The image was
8
- * neither pulled nor tagged. Downstream `olam auth up` (called
9
- * during bootstrap chain + by the D3 conformance CI smoke) failed
10
- * with: "mcp-auth image 'olam-mcp-auth:local' not found locally".
11
- * Every fresh-machine install + the D3 fixture-asserts CI job
12
- * silently broke for ~24h until #366's CI run surfaced it.
13
- *
14
- * Pin the contract: when the digests blob carries an `mcp-auth` key,
15
- * bootstrap.ts MUST (a) reference it in the imageRefs construction,
16
- * (b) tag the pulled digest as `olam-mcp-auth:local` (the
17
- * services.ts MCP_AUTH_LOCAL_TAG constant). The previous PR-validator
18
- * pattern wins again — string-level assertion against the source is
19
- * the cheapest enforcement.
20
- */
21
- import { describe, it, expect } from 'vitest';
22
- import * as fs from 'node:fs';
23
- import * as path from 'node:path';
24
- import { fileURLToPath } from 'node:url';
25
- const __filename = fileURLToPath(import.meta.url);
26
- const __dirname = path.dirname(__filename);
27
- const BOOTSTRAP_PATH = path.join(__dirname, '..', 'commands', 'bootstrap.ts');
28
- describe("bootstrap.ts mcp-auth tagging contract", () => {
29
- it('imageRefs handles mcp-auth as a possible entry', () => {
30
- const src = fs.readFileSync(BOOTSTRAP_PATH, 'utf-8');
31
- // The imageRefs name union (or push) must include mcp-auth.
32
- expect(src).toMatch(/['"]mcp-auth['"]/);
33
- // Push or array-literal entry, either is fine.
34
- expect(src).toMatch(/olam-mcp-auth@\$\{/);
35
- });
36
- it('tagPlan tags mcp-auth as olam-mcp-auth:local when digest is present', () => {
37
- const src = fs.readFileSync(BOOTSTRAP_PATH, 'utf-8');
38
- // The canonical local tag — services.ts expects exactly this string.
39
- expect(src).toMatch(/['"]olam-mcp-auth:local['"]/);
40
- // The push must be guarded so older image-digests.json without
41
- // the field still bootstrap successfully. Either via .find() with a
42
- // 'mcp-auth' string check or an `if (digests['mcp-auth'])` style.
43
- expect(src).toMatch(/['"]mcp-auth['"][\s\S]{0,100}olam-mcp-auth:local/);
44
- });
45
- it('the guarded push pattern survives', () => {
46
- const src = fs.readFileSync(BOOTSTRAP_PATH, 'utf-8');
47
- // Either pattern is acceptable; the key invariant is "guarded".
48
- const hasFindPattern = /imageRefs\.find\(/.test(src);
49
- const hasIfPattern = /if\s*\(\s*digests\[['"]mcp-auth['"]\]\s*\)/.test(src);
50
- expect(hasFindPattern || hasIfPattern).toBe(true);
51
- });
52
- it('handshake + tag spinner messages are NOT hardcoded to "3 images"', () => {
53
- // Once mcp-auth is in the pull list, "3" is wrong. This guards
54
- // against a future revert that puts the literal back.
55
- const src = fs.readFileSync(BOOTSTRAP_PATH, 'utf-8');
56
- // The handshake success log line should reference the count
57
- // dynamically, not a literal "3".
58
- expect(src).not.toMatch(/handshake passed \(all 3 images\)/);
59
- // Either dynamic interpolation (`${count} images`) or absent.
60
- expect(src).toMatch(/handshake passed \(all \$\{[^}]+\.length\} images\)/);
61
- });
62
- });
63
- //# sourceMappingURL=bootstrap-tag-mcp-auth.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap-tag-mcp-auth.test.js","sourceRoot":"","sources":["../../src/__tests__/bootstrap-tag-mcp-auth.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;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,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;AAE9E,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrD,4DAA4D;QAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;QACxC,+CAA+C;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrD,qEAAqE;QACrE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QAEnD,+DAA+D;QAC/D,oEAAoE;QACpE,kEAAkE;QAClE,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,kDAAkD,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QACrD,gEAAgE;QAChE,MAAM,cAAc,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrD,MAAM,YAAY,GAAG,4CAA4C,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5E,MAAM,CAAC,cAAc,IAAI,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,+DAA+D;QAC/D,sDAAsD;QACtD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAErD,4DAA4D;QAC5D,kCAAkC;QAClC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAC7D,8DAA8D;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Tests for `olam mcp revoke`.
3
- *
4
- * Acceptance: revoke_drops_token (with mock mcp-auth server),
5
- * multi_tenant_false_noop (no HTTP call, warning printed).
6
- */
7
- export {};
8
- //# sourceMappingURL=cli-mcp-revoke.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-mcp-revoke.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cli-mcp-revoke.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}