@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,80 +0,0 @@
1
- /**
2
- * Verifies Phase 2a A4 sequential build orchestration: `olam upgrade` invokes
3
- * `bash build-auth.sh` → `bash build-devbox.sh` → `bash build-host-cp.sh` in
4
- * that order with `OLAM_TAG=olam-next` env, and the devbox step uses inherit
5
- * stdio (live tee) for cold-cache visibility.
6
- *
7
- * The CLI source is read as text and parsed for the load-bearing invariants:
8
- * - Build scripts listed in correct order
9
- * - OLAM_TAG=olam-next env propagated
10
- * - Devbox uses tee (inherit stdio) per F13 audit fix
11
- * - Other two use silent runStep capture
12
- *
13
- * Direct integration testing (spawning real `bash build-*.sh`) lives at
14
- * tests/integration/build-scripts-olam-tag.sh — manual smoke; not in CI.
15
- *
16
- * Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.all-three.test.ts`
17
- */
18
- import { describe, it, expect } from 'vitest';
19
- import * as fs from 'node:fs';
20
- import * as path from 'node:path';
21
- import { REPO_ROOT } from './__fixtures__/upgrade-helpers.js';
22
- const UPGRADE_TS = path.join(REPO_ROOT, 'packages', 'cli', 'src', 'commands', 'upgrade.ts');
23
- describe('Phase 2a A4 — sequential build orchestration', () => {
24
- let body;
25
- it('reads the upgrade.ts source', () => {
26
- body = fs.readFileSync(UPGRADE_TS, 'utf-8');
27
- expect(body.length).toBeGreaterThan(1000);
28
- });
29
- it('declares OLAM_TAG=olam-next env for the build steps', () => {
30
- body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
31
- expect(body).toMatch(/OLAM_TAG:\s*['"]olam-next['"]/);
32
- });
33
- it('lists the three build scripts in correct order (auth → devbox → host-cp) inside buildScripts[]', () => {
34
- body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
35
- // Scope the order check to the buildScripts array literal (other mentions
36
- // of build-host-cp.sh exist in the file's doc comment + the printed plan).
37
- const arrayMatch = body.match(/buildScripts:[\s\S]*?=\s*\[[\s\S]*?\];/);
38
- expect(arrayMatch).not.toBeNull();
39
- const arrayBody = arrayMatch[0];
40
- const authIdx = arrayBody.indexOf('build-auth.sh');
41
- const devboxIdx = arrayBody.indexOf('build-devbox.sh');
42
- const hostCpIdx = arrayBody.indexOf('build-host-cp.sh');
43
- expect(authIdx).toBeGreaterThan(0);
44
- expect(devboxIdx).toBeGreaterThan(authIdx);
45
- expect(hostCpIdx).toBeGreaterThan(devboxIdx);
46
- });
47
- it('marks the devbox step as tee:true (inherit stdio) for cold-cache visibility (F13 fix)', () => {
48
- body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
49
- // The devbox entry in the buildScripts array should have tee: true.
50
- // Look for the literal "build-devbox.sh" entry and verify the same line
51
- // (or nearby) sets tee: true.
52
- const devboxLine = body
53
- .split('\n')
54
- .find((line) => line.includes('build-devbox.sh') && line.includes('tee'));
55
- expect(devboxLine).toBeDefined();
56
- expect(devboxLine).toMatch(/tee:\s*true/);
57
- });
58
- it('marks auth + host-cp steps as tee:false (silent runStep)', () => {
59
- body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
60
- const lines = body.split('\n');
61
- const authLine = lines.find((line) => line.includes('build-auth.sh') && line.includes('tee'));
62
- const hostCpLine = lines.find((line) => line.includes('build-host-cp.sh') && line.includes('tee'));
63
- expect(authLine).toMatch(/tee:\s*false/);
64
- expect(hostCpLine).toMatch(/tee:\s*false/);
65
- });
66
- it('uses spawnSync with stdio: inherit for the tee branch', () => {
67
- body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
68
- // The tee branch should call spawnSync with stdio: 'inherit'.
69
- expect(body).toMatch(/spawnSync\([\s\S]*?stdio:\s*['"]inherit['"]/);
70
- });
71
- it('failure path exits with code 1 on any build script failure', () => {
72
- body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
73
- // The orchestration loop should set process.exitCode = 1 on failure.
74
- // Look for the buildScripts loop body containing the exitCode = 1 pattern.
75
- const loopMatch = body.match(/for\s*\(\s*const\s+step\s+of\s+buildScripts[\s\S]*?\n\s*\}\n/);
76
- expect(loopMatch).not.toBeNull();
77
- expect(loopMatch[0]).toMatch(/process\.exitCode\s*=\s*1/);
78
- });
79
- });
80
- //# sourceMappingURL=upgrade.all-three.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.all-three.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.all-three.test.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- /**
2
- * Regression test for: findComposeFile() resolves bundled path, not cwd.
3
- *
4
- * Before this fix, upgrade.ts used `path.join(process.cwd(), 'packages/host-cp/compose.yaml')`
5
- * at three callsites, which broke `olam upgrade` when run from outside the
6
- * monorepo root (the npm-installed binary case).
7
- *
8
- * Two test layers:
9
- * 1. Source-text invariants — all three callsites in upgrade.ts now use
10
- * findComposeFile() from host-cp.ts; that function prioritises the
11
- * bundled (import.meta.url-relative) path over process.cwd().
12
- * 2. Subprocess functional — spawns an inline Node.js ESM script that
13
- * re-runs the findComposeFile candidate logic with a controlled cwd
14
- * (a plain tmpdir with no monorepo structure) and a fake bundled file,
15
- * asserting the bundled path is returned.
16
- *
17
- * Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.compose-path.test.ts`
18
- */
19
- export {};
20
- //# sourceMappingURL=upgrade.compose-path.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.compose-path.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.compose-path.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG"}
@@ -1,140 +0,0 @@
1
- /**
2
- * Regression test for: findComposeFile() resolves bundled path, not cwd.
3
- *
4
- * Before this fix, upgrade.ts used `path.join(process.cwd(), 'packages/host-cp/compose.yaml')`
5
- * at three callsites, which broke `olam upgrade` when run from outside the
6
- * monorepo root (the npm-installed binary case).
7
- *
8
- * Two test layers:
9
- * 1. Source-text invariants — all three callsites in upgrade.ts now use
10
- * findComposeFile() from host-cp.ts; that function prioritises the
11
- * bundled (import.meta.url-relative) path over process.cwd().
12
- * 2. Subprocess functional — spawns an inline Node.js ESM script that
13
- * re-runs the findComposeFile candidate logic with a controlled cwd
14
- * (a plain tmpdir with no monorepo structure) and a fake bundled file,
15
- * asserting the bundled path is returned.
16
- *
17
- * Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.compose-path.test.ts`
18
- */
19
- import { describe, it, expect } from 'vitest';
20
- import * as fs from 'node:fs';
21
- import * as os from 'node:os';
22
- import * as path from 'node:path';
23
- import { spawnSync } from 'node:child_process';
24
- import { REPO_ROOT } from './__fixtures__/upgrade-helpers.js';
25
- const HOST_CP_TS = path.join(REPO_ROOT, 'packages', 'cli', 'src', 'commands', 'host-cp.ts');
26
- const UPGRADE_TS = path.join(REPO_ROOT, 'packages', 'cli', 'src', 'commands', 'upgrade.ts');
27
- describe('host-cp.ts — findComposeFile source invariants', () => {
28
- let src;
29
- it('reads host-cp.ts source', () => {
30
- src = fs.readFileSync(HOST_CP_TS, 'utf-8');
31
- expect(src.length).toBeGreaterThan(1000);
32
- });
33
- it('exports findComposeFile (not just defines it)', () => {
34
- src ??= fs.readFileSync(HOST_CP_TS, 'utf-8');
35
- expect(src).toMatch(/export\s+function\s+findComposeFile\(\)/);
36
- });
37
- it('checks bundled (import.meta.url) path before cwd-based paths', () => {
38
- src ??= fs.readFileSync(HOST_CP_TS, 'utf-8');
39
- const fnMatch = src.match(/export\s+function\s+findComposeFile[\s\S]*?\n\}/);
40
- expect(fnMatch).not.toBeNull();
41
- const fnBody = fnMatch[0];
42
- // Bundled candidate uses import.meta.url (not process.cwd)
43
- const metaUrlIdx = fnBody.indexOf('import.meta.url');
44
- const cwdIdx = fnBody.indexOf('process.cwd()');
45
- expect(metaUrlIdx).toBeGreaterThan(0);
46
- expect(cwdIdx).toBeGreaterThan(metaUrlIdx);
47
- });
48
- it('falls through candidates array and returns last-resort cwd path', () => {
49
- src ??= fs.readFileSync(HOST_CP_TS, 'utf-8');
50
- // Must have a for-loop that returns on existsSync hit
51
- expect(src).toMatch(/for\s*\(const c of candidates\)/);
52
- expect(src).toMatch(/if\s*\(fs\.existsSync\(c\)\)\s*return c/);
53
- });
54
- });
55
- describe('upgrade.ts — findComposeFile callsite audit', () => {
56
- let body;
57
- it('reads upgrade.ts source', () => {
58
- body = fs.readFileSync(UPGRADE_TS, 'utf-8');
59
- expect(body.length).toBeGreaterThan(1000);
60
- });
61
- it('imports findComposeFile from host-cp.js', () => {
62
- body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
63
- expect(body).toMatch(/import\s*\{[^}]*findComposeFile[^}]*\}\s*from\s*['"]\.\/host-cp\.js['"]/);
64
- });
65
- it('primary binary-upgrade callsite uses deps.composeFile ?? findComposeFile()', () => {
66
- body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
67
- expect(body).toMatch(/deps\.composeFile\s*\?\?\s*findComposeFile\(\)/);
68
- // Must NOT fall back to path.join(process.cwd(), ...) at this callsite
69
- expect(body).not.toMatch(/deps\.composeFile\s*\?\?\s*path\.join\s*\(\s*process\.cwd\(\)/);
70
- });
71
- it('rollback callsite (handleRollback) uses findComposeFile()', () => {
72
- body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
73
- const rollbackStart = body.indexOf('async function handleRollback');
74
- expect(rollbackStart).toBeGreaterThan(0);
75
- const rollbackBody = body.slice(rollbackStart, rollbackStart + 3000);
76
- expect(rollbackBody).toMatch(/const composeFile\s*=\s*findComposeFile\(\)/);
77
- expect(rollbackBody).not.toMatch(/path\.join\s*\(\s*cwd\s*,\s*'packages\/host-cp\/compose\.yaml'\)/);
78
- });
79
- it('all three callsites use findComposeFile() — count ≥ 3', () => {
80
- body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
81
- const count = (body.match(/findComposeFile\(\)/g) ?? []).length;
82
- expect(count).toBeGreaterThanOrEqual(3);
83
- });
84
- it('no hardcoded compose path at invocation sites outside validateRepoRoot', () => {
85
- body ??= fs.readFileSync(UPGRADE_TS, 'utf-8');
86
- // validateRepoRoot legitimately uses path.join(cwd, 'packages/host-cp/compose.yaml')
87
- // as a repo-root marker check — skip it. Everything after it must use findComposeFile().
88
- const afterValidateRoot = body.slice(body.indexOf('async function handleRollback'));
89
- const hardcoded = (afterValidateRoot.match(/path\.join\s*\(\s*(cwd|process\.cwd\(\))\s*,\s*['"]packages\/host-cp\/compose\.yaml['"]\s*\)/g) ?? []).length;
90
- expect(hardcoded).toBe(0);
91
- });
92
- });
93
- describe('findComposeFile() — functional: bundled path returned from non-monorepo cwd', () => {
94
- it('returns the bundled (import.meta.url-relative) path, not the cwd-rooted one', () => {
95
- // Arrange: a tmpdir tree that mimics an npm-installed package layout:
96
- // <tmpdir>/pkg/commands/host-cp.js ← simulates import.meta.url
97
- // <tmpdir>/pkg/host-cp/compose.yaml ← simulates bundled compose
98
- // cwd is a plain directory with no packages/host-cp/ subtree.
99
- const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-compose-test-'));
100
- try {
101
- const pkgDir = path.join(tmpDir, 'pkg');
102
- const fakeBundledCompose = path.join(pkgDir, 'host-cp', 'compose.yaml');
103
- // The simulated import.meta.url points into <pkgDir>/commands/
104
- const fakeImportMetaUrl = 'file://' + path.join(pkgDir, 'commands', 'host-cp.js');
105
- const cwdDir = path.join(tmpDir, 'some-project');
106
- fs.mkdirSync(path.dirname(fakeBundledCompose), { recursive: true });
107
- fs.writeFileSync(fakeBundledCompose, '# fake bundled compose\n');
108
- fs.mkdirSync(cwdDir, { recursive: true });
109
- // Inline the findComposeFile candidate logic with the controlled import.meta.url.
110
- // This mirrors the exact logic in host-cp.ts without depending on the full module.
111
- const script = `
112
- import * as fs from 'node:fs';
113
- import * as path from 'node:path';
114
- const importMetaUrl = ${JSON.stringify(fakeImportMetaUrl)};
115
- const candidates = [
116
- path.resolve(path.dirname(new URL(importMetaUrl).pathname), '../host-cp/compose.yaml'),
117
- path.resolve(process.cwd(), 'packages/host-cp/compose.yaml'),
118
- path.resolve(process.cwd(), '../packages/host-cp/compose.yaml'),
119
- ];
120
- for (const c of candidates) {
121
- if (fs.existsSync(c)) { process.stdout.write(c); process.exit(0); }
122
- }
123
- process.stdout.write(path.resolve(process.cwd(), 'packages/host-cp/compose.yaml'));
124
- `.trim();
125
- const result = spawnSync('node', ['--input-type=module'], {
126
- input: script,
127
- cwd: cwdDir,
128
- encoding: 'utf-8',
129
- });
130
- expect(result.status).toBe(0);
131
- expect(result.stdout).toBe(fakeBundledCompose);
132
- // Must NOT be the cwd-rooted path
133
- expect(result.stdout).not.toBe(path.join(cwdDir, 'packages/host-cp/compose.yaml'));
134
- }
135
- finally {
136
- fs.rmSync(tmpDir, { recursive: true, force: true });
137
- }
138
- });
139
- });
140
- //# sourceMappingURL=upgrade.compose-path.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.compose-path.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.compose-path.test.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Phase 2c — verifies C1 (~/.olam/upgrade.log JSONL writer) + C2 (--history flag).
3
- *
4
- * Tests:
5
- * - appendUpgradeLog: open-per-write, mkdir defensively
6
- * - readUpgradeLog: ENOENT → empty; corrupt JSON skipped + stderr warn
7
- * - formatHistoryTable / formatHistoryJson: render shape
8
- * - formatDuration: ms / s / m / h
9
- * - parseHistoryOpts: --history -n <N> --json
10
- * - handleHistory wired from upgrade.ts
11
- *
12
- * Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.history.test.ts`
13
- */
14
- export {};
15
- //# sourceMappingURL=upgrade.history.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.history.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.history.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -1,199 +0,0 @@
1
- /**
2
- * Phase 2c — verifies C1 (~/.olam/upgrade.log JSONL writer) + C2 (--history flag).
3
- *
4
- * Tests:
5
- * - appendUpgradeLog: open-per-write, mkdir defensively
6
- * - readUpgradeLog: ENOENT → empty; corrupt JSON skipped + stderr warn
7
- * - formatHistoryTable / formatHistoryJson: render shape
8
- * - formatDuration: ms / s / m / h
9
- * - parseHistoryOpts: --history -n <N> --json
10
- * - handleHistory wired from upgrade.ts
11
- *
12
- * Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.history.test.ts`
13
- */
14
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
15
- import * as fs from 'node:fs';
16
- import * as os from 'node:os';
17
- import * as path from 'node:path';
18
- import { appendUpgradeLog, readUpgradeLog, formatHistoryTable, formatHistoryJson, formatDuration, } from '../upgrade-log.js';
19
- import { parseHistoryOpts } from '../upgrade-history.js';
20
- let tmpHome;
21
- let tmpLogPath;
22
- beforeEach(() => {
23
- tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-history-test-'));
24
- tmpLogPath = path.join(tmpHome, '.olam', 'upgrade.log');
25
- });
26
- afterEach(() => {
27
- try {
28
- fs.rmSync(tmpHome, { recursive: true, force: true });
29
- }
30
- catch {
31
- /* best effort */
32
- }
33
- });
34
- function makeRow(overrides = {}) {
35
- return {
36
- ts: '2026-05-07T10:00:00.000Z',
37
- started_at: 1000,
38
- ended_at: 2000,
39
- sha_target: '1234567890abcdef1234567890abcdef12345678',
40
- sha_before: { hostCp: 'aaaaaaaa', authService: 'aaaaaaaa', devbox: 'aaaaaaaa' },
41
- sha_after: { hostCp: '12345678', authService: '12345678', devbox: '12345678' },
42
- status: 'success',
43
- failed_step: null,
44
- durations_ms: { 'git pull': 200, 'bash build-host-cp.sh': 800 },
45
- ...overrides,
46
- };
47
- }
48
- describe('appendUpgradeLog', () => {
49
- it('creates ~/.olam/ defensively before append', () => {
50
- // Note: HOME is set to tmpHome by beforeEach.
51
- const expectedPath = path.join(tmpHome, '.olam', 'upgrade.log');
52
- expect(fs.existsSync(path.dirname(expectedPath))).toBe(false);
53
- appendUpgradeLog(makeRow(), tmpLogPath);
54
- expect(fs.existsSync(path.dirname(expectedPath))).toBe(true);
55
- expect(fs.existsSync(expectedPath)).toBe(true);
56
- });
57
- it('appends one JSONL row per call (newline-terminated)', () => {
58
- appendUpgradeLog(makeRow({ ts: '2026-05-07T10:00:00.000Z' }), tmpLogPath);
59
- appendUpgradeLog(makeRow({ ts: '2026-05-07T10:05:00.000Z' }), tmpLogPath);
60
- const logPath = path.join(tmpHome, '.olam', 'upgrade.log');
61
- const raw = fs.readFileSync(logPath, 'utf-8');
62
- const lines = raw.split('\n').filter((l) => l.length > 0);
63
- expect(lines.length).toBe(2);
64
- const parsed1 = JSON.parse(lines[0]);
65
- const parsed2 = JSON.parse(lines[1]);
66
- expect(parsed1.ts).toBe('2026-05-07T10:00:00.000Z');
67
- expect(parsed2.ts).toBe('2026-05-07T10:05:00.000Z');
68
- });
69
- it('failure to append is swallowed (does not throw)', () => {
70
- // Make ~/.olam unwritable: replace with a regular file.
71
- fs.mkdirSync(tmpHome, { recursive: true });
72
- fs.writeFileSync(path.join(tmpHome, '.olam'), 'this-is-a-file-not-a-dir');
73
- // Should not throw; logs warning to stderr (we don't assert on stderr here).
74
- expect(() => appendUpgradeLog(makeRow(), path.join(tmpHome, '.olam', 'upgrade.log'))).not.toThrow();
75
- });
76
- });
77
- describe('readUpgradeLog', () => {
78
- it('returns empty array when log file is missing', () => {
79
- const rows = readUpgradeLog(10, tmpLogPath);
80
- expect(rows).toEqual([]);
81
- });
82
- it('returns empty array when log file is empty', () => {
83
- fs.mkdirSync(path.join(tmpHome, '.olam'), { recursive: true });
84
- fs.writeFileSync(path.join(tmpHome, '.olam', 'upgrade.log'), '');
85
- expect(readUpgradeLog(10, tmpLogPath)).toEqual([]);
86
- });
87
- it('reads the most-recent N rows (chronological order, last-N)', () => {
88
- for (let i = 0; i < 5; i++) {
89
- appendUpgradeLog(makeRow({ ts: `2026-05-07T${String(i).padStart(2, '0')}:00:00.000Z` }), tmpLogPath);
90
- }
91
- const rows = readUpgradeLog(3, tmpLogPath);
92
- expect(rows.length).toBe(3);
93
- // Should be the LAST three (chronologically — most recent in the file).
94
- expect(rows[0].ts).toBe('2026-05-07T02:00:00.000Z');
95
- expect(rows[1].ts).toBe('2026-05-07T03:00:00.000Z');
96
- expect(rows[2].ts).toBe('2026-05-07T04:00:00.000Z');
97
- });
98
- it('skips corrupt JSON lines + warns to stderr (does not crash)', () => {
99
- fs.mkdirSync(path.join(tmpHome, '.olam'), { recursive: true });
100
- const logPath = path.join(tmpHome, '.olam', 'upgrade.log');
101
- const goodLine = JSON.stringify(makeRow({ ts: '2026-05-07T10:00:00.000Z' }));
102
- const corrupt = '{ this is not valid JSON';
103
- fs.writeFileSync(logPath, `${goodLine}\n${corrupt}\n${goodLine}\n`);
104
- const stderr = vi.spyOn(process.stderr, 'write').mockReturnValue(true);
105
- const rows = readUpgradeLog(10, tmpLogPath);
106
- expect(rows.length).toBe(2); // 2 good, 1 skipped corrupt
107
- expect(stderr).toHaveBeenCalled();
108
- stderr.mockRestore();
109
- });
110
- it('skips rows that lack required fields (defensive shape check)', () => {
111
- fs.mkdirSync(path.join(tmpHome, '.olam'), { recursive: true });
112
- const logPath = path.join(tmpHome, '.olam', 'upgrade.log');
113
- const badShape = JSON.stringify({ random: 'object', without: 'required fields' });
114
- const good = JSON.stringify(makeRow());
115
- fs.writeFileSync(logPath, `${badShape}\n${good}\n`);
116
- const stderr = vi.spyOn(process.stderr, 'write').mockReturnValue(true);
117
- const rows = readUpgradeLog(10, tmpLogPath);
118
- expect(rows.length).toBe(1);
119
- stderr.mockRestore();
120
- });
121
- });
122
- describe('formatHistoryTable', () => {
123
- it('returns friendly first-run message on empty rows', () => {
124
- expect(formatHistoryTable([])).toMatch(/No upgrade history yet/);
125
- });
126
- it('renders header + rows for a populated log', () => {
127
- const out = formatHistoryTable([makeRow()]);
128
- expect(out).toMatch(/TIMESTAMP/);
129
- expect(out).toMatch(/STATUS/);
130
- expect(out).toMatch(/DURATION/);
131
- expect(out).toMatch(/12345678/); // first 8 of sha_target
132
- expect(out).toMatch(/✓ success/);
133
- });
134
- it('marks failed rows with ✗ + step label', () => {
135
- const out = formatHistoryTable([
136
- makeRow({ status: 'failed', failed_step: 'bash build-auth.sh' }),
137
- ]);
138
- expect(out).toMatch(/✗ failed/);
139
- expect(out).toContain('bash build-auth.sh');
140
- });
141
- it('marks rolled_back rows with ↩', () => {
142
- const out = formatHistoryTable([makeRow({ status: 'rolled_back' })]);
143
- expect(out).toMatch(/↩ rolled_back/);
144
- });
145
- });
146
- describe('formatHistoryJson', () => {
147
- it('returns JSONL (one JSON object per line, no trailing newline)', () => {
148
- const out = formatHistoryJson([makeRow({ ts: '2026-05-07T10:00:00.000Z' }), makeRow({ ts: '2026-05-07T10:05:00.000Z' })]);
149
- const lines = out.split('\n');
150
- expect(lines.length).toBe(2);
151
- const parsed1 = JSON.parse(lines[0]);
152
- const parsed2 = JSON.parse(lines[1]);
153
- expect(parsed1.ts).toBe('2026-05-07T10:00:00.000Z');
154
- expect(parsed2.ts).toBe('2026-05-07T10:05:00.000Z');
155
- });
156
- it('returns empty string on empty rows', () => {
157
- expect(formatHistoryJson([])).toBe('');
158
- });
159
- });
160
- describe('formatDuration', () => {
161
- it('renders ms for sub-second', () => {
162
- expect(formatDuration(500)).toBe('500ms');
163
- });
164
- it('renders s for sub-minute', () => {
165
- expect(formatDuration(45_000)).toBe('45s');
166
- });
167
- it('renders m + s for sub-hour', () => {
168
- expect(formatDuration(125_000)).toBe('2m05s');
169
- });
170
- it('renders h + m for hour-plus', () => {
171
- expect(formatDuration(3_780_000)).toBe('1h03m');
172
- });
173
- });
174
- describe('parseHistoryOpts', () => {
175
- it('parses -n string number', () => {
176
- expect(parseHistoryOpts({ n: '5' }).limit).toBe(5);
177
- });
178
- it('parses -n numeric', () => {
179
- expect(parseHistoryOpts({ n: 7 }).limit).toBe(7);
180
- });
181
- it('defaults limit to 10 when -n absent', () => {
182
- expect(parseHistoryOpts({}).limit).toBe(10);
183
- });
184
- it('clamps non-positive -n to default 10', () => {
185
- expect(parseHistoryOpts({ n: '0' }).limit).toBe(10);
186
- expect(parseHistoryOpts({ n: '-3' }).limit).toBe(10);
187
- });
188
- it('parses --json flag', () => {
189
- expect(parseHistoryOpts({ json: true }).json).toBe(true);
190
- expect(parseHistoryOpts({ json: false }).json).toBe(false);
191
- });
192
- });
193
- describe('Phase 2c — wired in handleUpgrade', () => {
194
- it('upgrade.ts dispatches to handleHistory when opts.history', () => {
195
- const upgradeTs = fs.readFileSync(path.join(__dirname, '..', 'upgrade.ts'), 'utf-8');
196
- expect(upgradeTs).toMatch(/if\s*\(opts\.history\)\s*\{[\s\S]*?handleHistory\(/);
197
- });
198
- });
199
- //# sourceMappingURL=upgrade.history.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.history.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.history.test.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Unit tests for `olam upgrade` CLI lock (Phase 2a — A1).
3
- *
4
- * Verifies the contract from `packages/cli/src/commands/upgrade-lock.ts`:
5
- * - Atomic create-or-fail via fs.openSync 'wx'
6
- * - Stale-lock recovery (empty / parse-error / dead-pid / >30min timeout)
7
- * - PID liveness check via process.kill(pid, 0)
8
- * - Command-name check via `ps -p <pid> -o comm=`
9
- * - Idempotent release
10
- * - Concurrent-acquisition refusal
11
- *
12
- * Run: `cd packages/cli && npx vitest run src/commands/__tests__/upgrade.lock.test.ts`
13
- */
14
- export {};
15
- //# sourceMappingURL=upgrade.lock.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.lock.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/upgrade.lock.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}