@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,44 +0,0 @@
1
- // C5 (Phase C — fresh-install self-bootstrap): image-presence pre-flight
2
- // helper. Decision #6 (revised pass 3) — `olam bootstrap` is the SOLE
3
- // on-ramp; commands that need an image fail-fast with a named remedy
4
- // instead of auto-pulling.
5
- import { describe, it, expect } from 'vitest';
6
- import { checkImagePresent } from '../image-presence.js';
7
- describe('checkImagePresent', () => {
8
- it('returns present:true when docker image inspect exits 0', () => {
9
- const inspect = () => ({ exitCode: 0 });
10
- const result = checkImagePresent({ imageRef: 'ghcr.io/pleri/olam-devbox:0.2.0', callerCommand: 'olam create' }, inspect);
11
- expect(result.present).toBe(true);
12
- expect(result.stderrLine).toBe('');
13
- });
14
- it('returns present:false with named remedy when inspect exits non-zero', () => {
15
- const inspect = () => ({ exitCode: 1 });
16
- const result = checkImagePresent({ imageRef: 'ghcr.io/pleri/olam-devbox:0.2.0', callerCommand: 'olam create' }, inspect);
17
- expect(result.present).toBe(false);
18
- expect(result.stderrLine).toContain("'ghcr.io/pleri/olam-devbox:0.2.0' not found locally");
19
- expect(result.stderrLine).toContain('olam create does not auto-pull');
20
- expect(result.stderrLine).toContain('Remedy: run `olam bootstrap`');
21
- });
22
- it('names the caller command in the remedy (so operators know which command failed)', () => {
23
- const inspect = () => ({ exitCode: 1 });
24
- const create = checkImagePresent({ imageRef: 'ghcr.io/pleri/olam-devbox:0.2.0', callerCommand: 'olam create' }, inspect);
25
- const hostCp = checkImagePresent({ imageRef: 'ghcr.io/pleri/olam-host-cp:0.2.0', callerCommand: 'olam host-cp start' }, inspect);
26
- const authUp = checkImagePresent({ imageRef: 'ghcr.io/pleri/olam-auth:0.2.0', callerCommand: 'olam auth up' }, inspect);
27
- expect(create.stderrLine).toContain('olam create');
28
- expect(hostCp.stderrLine).toContain('olam host-cp start');
29
- expect(authUp.stderrLine).toContain('olam auth up');
30
- });
31
- it('mentions Decision #6 lineage in the remedy (audit trail for support questions)', () => {
32
- const inspect = () => ({ exitCode: 1 });
33
- const result = checkImagePresent({ imageRef: 'foo:bar', callerCommand: 'olam x' }, inspect);
34
- expect(result.stderrLine).toContain('Decision #6');
35
- expect(result.stderrLine).toContain('olam-fresh-install-self-bootstrap');
36
- });
37
- it('handles inspect timeout / docker daemon down (negative exitCode)', () => {
38
- const inspect = () => ({ exitCode: -1 });
39
- const result = checkImagePresent({ imageRef: 'foo:bar', callerCommand: 'olam x' }, inspect);
40
- expect(result.present).toBe(false);
41
- expect(result.stderrLine).toContain('not found locally');
42
- });
43
- });
44
- //# sourceMappingURL=image-presence.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"image-presence.test.js","sourceRoot":"","sources":["../../src/__tests__/image-presence.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=install-root.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-root.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/install-root.test.ts"],"names":[],"mappings":""}
@@ -1,119 +0,0 @@
1
- // B6 (Phase B — fresh-install self-bootstrap): installRoot + isDevMode
2
- // + resolveBuildScript. 2-condition dev-mode opt-in (OLAM_DEV=1 + packages/
3
- // sibling) — adequate for local-dev / dogfood audience per pass-3 reframe.
4
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
- import * as fs from 'node:fs';
6
- import * as os from 'node:os';
7
- import * as path from 'node:path';
8
- import { installRoot, isDevMode, resolveBuildScript, MissingBuildScriptError, } from '../install-root.js';
9
- describe('installRoot', () => {
10
- it('resolves to the package root from src/install-root.ts', () => {
11
- // From src/, dirname is .../packages/cli/src; .. lands at .../packages/cli.
12
- const root = installRoot();
13
- expect(root.endsWith('/packages/cli')).toBe(true);
14
- });
15
- it('accepts an injected metaUrl for testing', () => {
16
- // Synthetic: pretend we're at /tmp/foo/dist/install-root.js → root /tmp/foo
17
- const fakeUrl = `file:///tmp/foo/dist/install-root.js`;
18
- expect(installRoot(fakeUrl)).toBe('/tmp/foo');
19
- });
20
- });
21
- describe('isDevMode — 2-condition opt-in', () => {
22
- let tmpRoot;
23
- let originalDev;
24
- beforeEach(() => {
25
- originalDev = process.env.OLAM_DEV;
26
- delete process.env.OLAM_DEV;
27
- tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-installroot-'));
28
- });
29
- afterEach(() => {
30
- if (originalDev !== undefined)
31
- process.env.OLAM_DEV = originalDev;
32
- else
33
- delete process.env.OLAM_DEV;
34
- fs.rmSync(tmpRoot, { recursive: true, force: true });
35
- });
36
- /** Synthesize a "package install root" that sits at <tmp>/x/y/packages/cli. */
37
- function makeFakeInstall(root, withMonorepo) {
38
- const pkgRoot = path.join(root, 'packages', 'cli');
39
- fs.mkdirSync(pkgRoot, { recursive: true });
40
- if (withMonorepo) {
41
- // Add the monorepo-marker siblings: packages/ exists (already created
42
- // above) and a top-level package.json. From pkgRoot, two levels up
43
- // (`..`/`..`) is the monorepo root.
44
- fs.writeFileSync(path.join(root, 'package.json'), '{"private": true}');
45
- }
46
- return pkgRoot;
47
- }
48
- it('returns false when OLAM_DEV is not set, even with a packages/ sibling', () => {
49
- const installDir = makeFakeInstall(tmpRoot, /*withMonorepo*/ true);
50
- expect(isDevMode({}, installDir)).toBe(false);
51
- });
52
- it('returns false when OLAM_DEV=1 but no packages/ + package.json siblings', () => {
53
- const installDir = makeFakeInstall(tmpRoot, /*withMonorepo*/ false);
54
- // Note: makeFakeInstall always creates packages/ (as part of the install
55
- // dir layout). For "no monorepo" we just don't write the top-level
56
- // package.json. The check requires BOTH packages/ AND package.json.
57
- expect(isDevMode({ OLAM_DEV: '1' }, installDir)).toBe(false);
58
- });
59
- it('returns true when OLAM_DEV=1 AND both packages/ + package.json siblings exist', () => {
60
- const installDir = makeFakeInstall(tmpRoot, /*withMonorepo*/ true);
61
- expect(isDevMode({ OLAM_DEV: '1' }, installDir)).toBe(true);
62
- });
63
- it('returns false when OLAM_DEV is set to a non-"1" value', () => {
64
- const installDir = makeFakeInstall(tmpRoot, /*withMonorepo*/ true);
65
- expect(isDevMode({ OLAM_DEV: 'true' }, installDir)).toBe(false);
66
- expect(isDevMode({ OLAM_DEV: 'yes' }, installDir)).toBe(false);
67
- expect(isDevMode({ OLAM_DEV: '0' }, installDir)).toBe(false);
68
- });
69
- });
70
- describe('resolveBuildScript', () => {
71
- let tmpRoot;
72
- beforeEach(() => {
73
- tmpRoot = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-resolve-script-'));
74
- });
75
- afterEach(() => {
76
- fs.rmSync(tmpRoot, { recursive: true, force: true });
77
- });
78
- it('returns the absolute path to the script when in dev mode', () => {
79
- const installDir = path.join(tmpRoot, 'packages', 'cli');
80
- fs.mkdirSync(installDir, { recursive: true });
81
- fs.writeFileSync(path.join(tmpRoot, 'package.json'), '{}');
82
- const result = resolveBuildScript({
83
- scriptRelPath: 'packages/adapters/src/docker/build-auth.sh',
84
- env: { OLAM_DEV: '1' },
85
- installRootDir: installDir,
86
- });
87
- expect(result).toBe(path.join(tmpRoot, 'packages/adapters/src/docker/build-auth.sh'));
88
- });
89
- it('throws MissingBuildScriptError when not in dev mode', () => {
90
- const installDir = path.join(tmpRoot, 'packages', 'cli');
91
- fs.mkdirSync(installDir, { recursive: true });
92
- expect(() => resolveBuildScript({
93
- scriptRelPath: 'packages/adapters/src/docker/build-auth.sh',
94
- env: {},
95
- installRootDir: installDir,
96
- })).toThrow(MissingBuildScriptError);
97
- });
98
- it('error message names the remedy (clone + OLAM_DEV=1)', () => {
99
- const installDir = path.join(tmpRoot, 'packages', 'cli');
100
- fs.mkdirSync(installDir, { recursive: true });
101
- try {
102
- resolveBuildScript({
103
- scriptRelPath: 'packages/adapters/src/docker/build-auth.sh',
104
- env: {},
105
- installRootDir: installDir,
106
- });
107
- throw new Error('expected throw');
108
- }
109
- catch (err) {
110
- expect(err).toBeInstanceOf(MissingBuildScriptError);
111
- const msg = err.message;
112
- expect(msg).toContain('git clone');
113
- expect(msg).toContain('OLAM_DEV=1');
114
- expect(msg).toContain('--from-source');
115
- expect(msg).toContain('ghcr.io/pleri');
116
- }
117
- });
118
- });
119
- //# sourceMappingURL=install-root.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-root.test.js","sourceRoot":"","sources":["../../src/__tests__/install-root.test.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Unit tests for keys.ts pure helpers.
3
- *
4
- * Covers readKeysFile (missing/empty/malformed/valid) and the
5
- * env-merge precedence contract (OLAM_LLM_* keys do not overwrite
6
- * existing worldEnv entries).
7
- */
8
- export {};
9
- //# sourceMappingURL=keys.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keys.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/keys.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -1,145 +0,0 @@
1
- /**
2
- * Unit tests for keys.ts pure helpers.
3
- *
4
- * Covers readKeysFile (missing/empty/malformed/valid) and the
5
- * env-merge precedence contract (OLAM_LLM_* keys do not overwrite
6
- * existing worldEnv entries).
7
- */
8
- import { describe, it, expect, beforeEach, afterEach } 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 { readKeysFile, keysFilePath } from '../commands/keys.js';
13
- let tmpHome;
14
- let originalHome;
15
- beforeEach(() => {
16
- tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-keys-test-'));
17
- originalHome = process.env.OLAM_HOME;
18
- process.env.OLAM_HOME = tmpHome;
19
- });
20
- afterEach(() => {
21
- if (originalHome === undefined)
22
- delete process.env.OLAM_HOME;
23
- else
24
- process.env.OLAM_HOME = originalHome;
25
- fs.rmSync(tmpHome, { recursive: true, force: true });
26
- });
27
- // ── keysFilePath ──────────────────────────────────────────────────
28
- describe('keysFilePath', () => {
29
- it('returns path under OLAM_HOME', () => {
30
- expect(keysFilePath()).toBe(path.join(tmpHome, 'keys.yaml'));
31
- });
32
- it('honors OLAM_HOME so tests do not stomp on the real ~/.olam', () => {
33
- expect(keysFilePath()).not.toContain(os.homedir() + path.sep + '.olam');
34
- });
35
- });
36
- // ── readKeysFile ──────────────────────────────────────────────────
37
- describe('readKeysFile', () => {
38
- it('returns null when ~/.olam/keys.yaml does not exist', () => {
39
- expect(readKeysFile()).toBeNull();
40
- });
41
- it('returns null for an empty file', () => {
42
- fs.mkdirSync(tmpHome, { recursive: true });
43
- fs.writeFileSync(keysFilePath(), '');
44
- expect(readKeysFile()).toBeNull();
45
- });
46
- it('returns null for a whitespace-only file', () => {
47
- fs.mkdirSync(tmpHome, { recursive: true });
48
- fs.writeFileSync(keysFilePath(), ' \n\n');
49
- expect(readKeysFile()).toBeNull();
50
- });
51
- it('returns null for malformed YAML', () => {
52
- fs.mkdirSync(tmpHome, { recursive: true });
53
- fs.writeFileSync(keysFilePath(), ': bad: yaml: [}');
54
- expect(readKeysFile()).toBeNull();
55
- });
56
- it('returns null when YAML is not an object (array)', () => {
57
- fs.mkdirSync(tmpHome, { recursive: true });
58
- fs.writeFileSync(keysFilePath(), '- item1\n- item2\n');
59
- expect(readKeysFile()).toBeNull();
60
- });
61
- it('returns null when YAML is a scalar', () => {
62
- fs.mkdirSync(tmpHome, { recursive: true });
63
- fs.writeFileSync(keysFilePath(), 'just a string\n');
64
- expect(readKeysFile()).toBeNull();
65
- });
66
- it('parses a valid single-key file', () => {
67
- fs.mkdirSync(tmpHome, { recursive: true });
68
- fs.writeFileSync(keysFilePath(), 'OPENAI: sk-proj-testvalue\n');
69
- expect(readKeysFile()).toEqual({ OPENAI: 'sk-proj-testvalue' });
70
- });
71
- it('parses multiple keys', () => {
72
- fs.mkdirSync(tmpHome, { recursive: true });
73
- fs.writeFileSync(keysFilePath(), 'OPENAI: sk-proj-aaa\nGEMINI: AIzaBBB\n');
74
- expect(readKeysFile()).toEqual({ OPENAI: 'sk-proj-aaa', GEMINI: 'AIzaBBB' });
75
- });
76
- it('skips non-string values silently', () => {
77
- fs.mkdirSync(tmpHome, { recursive: true });
78
- fs.writeFileSync(keysFilePath(), 'OPENAI: sk-valid\nnumeric: 12345\n');
79
- // numeric is a YAML integer, not a string — should be skipped
80
- const result = readKeysFile();
81
- expect(result).not.toBeNull();
82
- expect(result.OPENAI).toBe('sk-valid');
83
- expect('numeric' in result).toBe(false);
84
- });
85
- it('returns null when all values are non-string', () => {
86
- fs.mkdirSync(tmpHome, { recursive: true });
87
- fs.writeFileSync(keysFilePath(), 'count: 42\nflag: true\n');
88
- expect(readKeysFile()).toBeNull();
89
- });
90
- it('honors OLAM_HOME so tests do not stomp on the real ~/.olam', () => {
91
- fs.mkdirSync(tmpHome, { recursive: true });
92
- fs.writeFileSync(keysFilePath(), 'OPENAI: sentinel\n');
93
- expect(readKeysFile()).toEqual({ OPENAI: 'sentinel' });
94
- expect(keysFilePath()).toBe(path.join(tmpHome, 'keys.yaml'));
95
- });
96
- });
97
- // ── env-merge precedence helper ───────────────────────────────────
98
- //
99
- // The manager.ts injection logic is: only set OLAM_LLM_<KEY> when it
100
- // is NOT already present in worldEnv. Verify that contract here by
101
- // simulating the merge logic used in manager.ts.
102
- function mergeKeysIntoEnv(keys, existing) {
103
- const env = { ...existing };
104
- for (const [k, v] of Object.entries(keys)) {
105
- const envKey = `OLAM_LLM_${k.toUpperCase()}`;
106
- if (!(envKey in env)) {
107
- env[envKey] = v;
108
- }
109
- }
110
- return env;
111
- }
112
- describe('env-merge precedence', () => {
113
- it('injects OLAM_LLM_<UPPER_KEY> for each key', () => {
114
- const result = mergeKeysIntoEnv({ OPENAI: 'sk-abc', GEMINI: 'AIza-xyz' }, {});
115
- expect(result).toEqual({
116
- OLAM_LLM_OPENAI: 'sk-abc',
117
- OLAM_LLM_GEMINI: 'AIza-xyz',
118
- });
119
- });
120
- it('uppercases the key name regardless of file case', () => {
121
- const result = mergeKeysIntoEnv({ openai: 'sk-lower' }, {});
122
- expect(result.OLAM_LLM_OPENAI).toBe('sk-lower');
123
- });
124
- it('does NOT overwrite an existing OLAM_LLM_* entry', () => {
125
- const result = mergeKeysIntoEnv({ OPENAI: 'from-file' }, { OLAM_LLM_OPENAI: 'already-set' });
126
- expect(result.OLAM_LLM_OPENAI).toBe('already-set');
127
- });
128
- it('does NOT overwrite OLAM_TASK or other protected env keys', () => {
129
- const result = mergeKeysIntoEnv({ TASK: 'injected' }, { OLAM_LLM_TASK: 'protected' });
130
- expect(result.OLAM_LLM_TASK).toBe('protected');
131
- });
132
- it('does not inject anything when keys map is empty', () => {
133
- const existing = { OLAM_TASK: 'build feature' };
134
- const result = mergeKeysIntoEnv({}, existing);
135
- expect(result).toEqual(existing);
136
- });
137
- it('preserves all existing env entries unchanged', () => {
138
- const existing = { OLAM_TASK: 'task', OLAM_R2_BUCKET: 'bucket' };
139
- const result = mergeKeysIntoEnv({ OPENAI: 'sk-new' }, existing);
140
- expect(result.OLAM_TASK).toBe('task');
141
- expect(result.OLAM_R2_BUCKET).toBe('bucket');
142
- expect(result.OLAM_LLM_OPENAI).toBe('sk-new');
143
- });
144
- });
145
- //# sourceMappingURL=keys.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keys.test.js","sourceRoot":"","sources":["../../src/__tests__/keys.test.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Unit tests for logs.ts pure helpers.
3
- *
4
- * The colorLine and formatLine functions are exported for testability.
5
- * http.get streaming is exercised by manual `olam logs` invocation against
6
- * a running world (see B1 Verification in the tracker).
7
- */
8
- export {};
9
- //# sourceMappingURL=logs.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logs.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/logs.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -1,124 +0,0 @@
1
- /**
2
- * Unit tests for logs.ts pure helpers.
3
- *
4
- * The colorLine and formatLine functions are exported for testability.
5
- * http.get streaming is exercised by manual `olam logs` invocation against
6
- * a running world (see B1 Verification in the tracker).
7
- */
8
- import { describe, it, expect } from 'vitest';
9
- import { colorLine, formatLine, parseSseEvent } from '../commands/logs.js';
10
- // picocolors is applied in the tests; we test the string content rather than
11
- // exact ANSI codes since ANSI output depends on the terminal environment.
12
- // To make assertions deterministic, we strip ANSI codes via a simple regex.
13
- const ANSI_RE = /\x1b\[[0-9;]*[A-Za-z]/g;
14
- function strip(s) {
15
- return s.replace(ANSI_RE, '');
16
- }
17
- describe('parseSseEvent', () => {
18
- it('returns null for non-data lines', () => {
19
- expect(parseSseEvent('')).toBeNull();
20
- expect(parseSseEvent(': ping')).toBeNull();
21
- expect(parseSseEvent('event: heartbeat')).toBeNull();
22
- expect(parseSseEvent(': connected')).toBeNull();
23
- });
24
- it('returns null for malformed JSON', () => {
25
- expect(parseSseEvent('data: {bad json')).toBeNull();
26
- expect(parseSseEvent('data: not-json')).toBeNull();
27
- });
28
- it('returns null for unknown event types', () => {
29
- expect(parseSseEvent('data: {"type":"unknown","foo":"bar"}')).toBeNull();
30
- expect(parseSseEvent('data: {"type":"error","message":"x"}')).toBeNull();
31
- });
32
- it('parses replay events correctly', () => {
33
- const ev = parseSseEvent('data: {"type":"replay","service":"atlas-core","lines":["a","b"]}');
34
- expect(ev).not.toBeNull();
35
- expect(ev.type).toBe('replay');
36
- if (ev !== null && ev.type === 'replay') {
37
- expect(ev.service).toBe('atlas-core');
38
- expect(ev.lines).toEqual(['a', 'b']);
39
- }
40
- });
41
- it('parses replay events without service field', () => {
42
- const ev = parseSseEvent('data: {"type":"replay","lines":["x"]}');
43
- expect(ev).not.toBeNull();
44
- expect(ev.type).toBe('replay');
45
- });
46
- it('parses line events correctly', () => {
47
- const ev = parseSseEvent('data: {"type":"line","service":"diner-app","line":"server started","ts":1234567}');
48
- expect(ev).not.toBeNull();
49
- expect(ev.type).toBe('line');
50
- if (ev !== null && ev.type === 'line') {
51
- expect(ev.service).toBe('diner-app');
52
- expect(ev.line).toBe('server started');
53
- expect(ev.ts).toBe(1234567);
54
- }
55
- });
56
- it('returns null for replay with non-array lines', () => {
57
- expect(parseSseEvent('data: {"type":"replay","lines":"not-array"}')).toBeNull();
58
- });
59
- it('returns null for line event with non-string line', () => {
60
- expect(parseSseEvent('data: {"type":"line","line":42,"ts":0}')).toBeNull();
61
- });
62
- });
63
- describe('colorLine', () => {
64
- it('returns plain text unchanged', () => {
65
- expect(strip(colorLine('server started'))).toBe('server started');
66
- });
67
- it('colors ERROR lines (output contains the text)', () => {
68
- const result = colorLine('ERROR: database unreachable');
69
- expect(strip(result)).toBe('ERROR: database unreachable');
70
- // Colored output should differ from plain (ANSI codes present or same in no-color mode).
71
- // We verify the content is preserved, not the specific ANSI code.
72
- });
73
- it('colors WARN lines', () => {
74
- const result = colorLine('WARN: slow query detected');
75
- expect(strip(result)).toBe('WARN: slow query detected');
76
- });
77
- it('dims INFO lines', () => {
78
- const result = colorLine('INFO: server listening on port 3000');
79
- expect(strip(result)).toBe('INFO: server listening on port 3000');
80
- });
81
- it('does not false-positive on ERRORS (plural) — word boundary check', () => {
82
- // "ERRORS" should still match \bERROR\b in some regex flavors; check it works
83
- const result = colorLine('ERRORS found: 3');
84
- // "ERRORS" contains "ERROR" — \bERROR\b does NOT match inside "ERRORS"
85
- // because \b is a word boundary and S follows R. Actually \bERROR\b will NOT
86
- // match in "ERRORS" because after the R comes S, not a non-word char. Good.
87
- expect(strip(result)).toBe('ERRORS found: 3');
88
- });
89
- it('preserves multi-word lines', () => {
90
- const line = '2024-01-15T10:00:00Z INFO [atlas-core] Request completed in 42ms';
91
- expect(strip(colorLine(line))).toBe(line);
92
- });
93
- });
94
- describe('formatLine', () => {
95
- it('no prefix when showService=false', () => {
96
- const result = formatLine('hello world', 'atlas-core', false);
97
- expect(strip(result)).toBe('hello world');
98
- });
99
- it('no prefix when showService=true but service is undefined', () => {
100
- const result = formatLine('hello world', undefined, true);
101
- expect(strip(result)).toBe('hello world');
102
- });
103
- it('prepends [service] when showService=true and service provided', () => {
104
- const result = formatLine('server started', 'atlas-core', true);
105
- expect(strip(result)).toContain('[atlas-core]');
106
- expect(strip(result)).toContain('server started');
107
- // Service prefix comes first
108
- const plain = strip(result);
109
- expect(plain.indexOf('[atlas-core]')).toBeLessThan(plain.indexOf('server started'));
110
- });
111
- it('prepends [service] for multi-service stream with diner-app', () => {
112
- const result = formatLine('compiled successfully', 'diner-app', true);
113
- const plain = strip(result);
114
- expect(plain).toContain('[diner-app]');
115
- expect(plain).toContain('compiled successfully');
116
- });
117
- it('applies color AND prefix together — ERROR line with service', () => {
118
- const result = formatLine('ERROR: crash', 'atlas-core', true);
119
- const plain = strip(result);
120
- expect(plain).toContain('[atlas-core]');
121
- expect(plain).toContain('ERROR: crash');
122
- });
123
- });
124
- //# sourceMappingURL=logs.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logs.test.js","sourceRoot":"","sources":["../../src/__tests__/logs.test.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Tests for olam mcp import discovery + validation.
3
- *
4
- * Acceptance:
5
- * discovery_sweep — fixture with 10 MCPs across 4 source paths →
6
- * all 10 discovered + dedupe correct < 500ms
7
- * idempotent_rerun — importing twice imports 10 then 0
8
- * validation_probe — exit 0 + stdout → validated=true; exit 1 → validated=false
9
- */
10
- export {};
11
- //# sourceMappingURL=mcp-import.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-import.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mcp-import.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}