@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,129 +0,0 @@
1
- // C4 (Phase C — fresh-install self-bootstrap): registry allowlist for
2
- // OLAM_DEVBOX_IMAGE overrides. Flag-only override (env-var form was
3
- // dropped per Decision #19 to avoid ambient bypass via shell inheritance).
4
- import { describe, it, expect } from 'vitest';
5
- import { decideAllowlist, resolveDevboxImageOverride } from '../registry-allowlist.js';
6
- describe('decideAllowlist — default allowlist (ghcr.io/pleri/*)', () => {
7
- it('accepts the canonical olam-devbox image with a tag', () => {
8
- const d = decideAllowlist({
9
- imageRef: 'ghcr.io/pleri/olam-devbox:0.2.0',
10
- allowCustomRegistry: false,
11
- });
12
- expect(d.allowedByDefault).toBe(true);
13
- expect(d.accepted).toBe(true);
14
- expect(d.stderrLine).toBe('');
15
- });
16
- it('accepts olam-devbox@sha256: digest references', () => {
17
- const d = decideAllowlist({
18
- imageRef: 'ghcr.io/pleri/olam-devbox@sha256:abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789',
19
- allowCustomRegistry: false,
20
- });
21
- expect(d.accepted).toBe(true);
22
- });
23
- it('accepts atlas-devbox under the pleri namespace (Decision #15)', () => {
24
- const d = decideAllowlist({
25
- imageRef: 'ghcr.io/pleri/olam-devbox-atlas:1.2.3',
26
- allowCustomRegistry: false,
27
- });
28
- expect(d.allowedByDefault).toBe(true);
29
- expect(d.accepted).toBe(true);
30
- });
31
- it('accepts host-cp + auth images for the publish-workflow', () => {
32
- expect(decideAllowlist({ imageRef: 'ghcr.io/pleri/olam-host-cp:0.2.0', allowCustomRegistry: false }).accepted).toBe(true);
33
- expect(decideAllowlist({ imageRef: 'ghcr.io/pleri/olam-auth:0.2.0', allowCustomRegistry: false }).accepted).toBe(true);
34
- });
35
- });
36
- describe('decideAllowlist — out-of-allowlist refs', () => {
37
- it('rejects a generic Docker Hub ref without the flag', () => {
38
- const d = decideAllowlist({
39
- imageRef: 'docker.io/library/ubuntu:24.04',
40
- allowCustomRegistry: false,
41
- });
42
- expect(d.accepted).toBe(false);
43
- expect(d.stderrLine).toContain('outside allowed registries');
44
- expect(d.stderrLine).toContain('--allow-custom-registry');
45
- });
46
- it('rejects a different ghcr.io org without the flag', () => {
47
- const d = decideAllowlist({
48
- imageRef: 'ghcr.io/atlas/atlas-devbox:1.2.3',
49
- allowCustomRegistry: false,
50
- });
51
- expect(d.accepted).toBe(false);
52
- });
53
- it('rejects an attacker-controlled registry without the flag', () => {
54
- const d = decideAllowlist({
55
- imageRef: 'evil.example/evil-devbox:latest',
56
- allowCustomRegistry: false,
57
- });
58
- expect(d.accepted).toBe(false);
59
- expect(d.stderrLine).toContain('outside allowed registries');
60
- });
61
- it('accepts an out-of-allowlist ref WITH the flag and emits a warning', () => {
62
- const d = decideAllowlist({
63
- imageRef: 'ghcr.io/atlas/atlas-devbox:1.2.3',
64
- allowCustomRegistry: true,
65
- });
66
- expect(d.accepted).toBe(true);
67
- expect(d.allowedByDefault).toBe(false);
68
- expect(d.stderrLine).toContain('Warning');
69
- expect(d.stderrLine).toContain("'ghcr.io/atlas/atlas-devbox:1.2.3'");
70
- expect(d.stderrLine).toContain('--allow-custom-registry was specified');
71
- });
72
- it('keeps stderr empty for default-allowed refs even when the flag is set', () => {
73
- const d = decideAllowlist({
74
- imageRef: 'ghcr.io/pleri/olam-devbox:0.2.0',
75
- allowCustomRegistry: true,
76
- });
77
- expect(d.accepted).toBe(true);
78
- expect(d.stderrLine).toBe('');
79
- });
80
- });
81
- describe('decideAllowlist — pattern boundaries', () => {
82
- it('rejects look-alike namespace ghcr.io/pleri-evil/...', () => {
83
- const d = decideAllowlist({
84
- imageRef: 'ghcr.io/pleri-evil/olam-devbox:0.2.0',
85
- allowCustomRegistry: false,
86
- });
87
- expect(d.accepted).toBe(false);
88
- });
89
- it('rejects look-alike registry ghcr.io.evil.com/pleri/...', () => {
90
- const d = decideAllowlist({
91
- imageRef: 'ghcr.io.evil.com/pleri/olam-devbox:0.2.0',
92
- allowCustomRegistry: false,
93
- });
94
- expect(d.accepted).toBe(false);
95
- });
96
- it('rejects nested-namespace ghcr.io/pleri/foo/bar:tag (only one path segment after pleri/ allowed)', () => {
97
- const d = decideAllowlist({
98
- imageRef: 'ghcr.io/pleri/foo/bar:0.2.0',
99
- allowCustomRegistry: false,
100
- });
101
- expect(d.accepted).toBe(false);
102
- });
103
- });
104
- describe('resolveDevboxImageOverride — precedence', () => {
105
- it('returns undefined when neither flag nor env var is set', () => {
106
- expect(resolveDevboxImageOverride(undefined, {})).toBeUndefined();
107
- });
108
- it('returns the flag value when only the flag is set', () => {
109
- expect(resolveDevboxImageOverride('ghcr.io/atlas/foo:1', {})).toBe('ghcr.io/atlas/foo:1');
110
- });
111
- it('returns the env value when only the env var is set', () => {
112
- expect(resolveDevboxImageOverride(undefined, { OLAM_DEVBOX_IMAGE: 'ghcr.io/atlas/foo:1' })).toBe('ghcr.io/atlas/foo:1');
113
- });
114
- it('flag takes precedence over env var when both are set', () => {
115
- expect(resolveDevboxImageOverride('ghcr.io/from-flag/img:1', {
116
- OLAM_DEVBOX_IMAGE: 'ghcr.io/from-env/img:1',
117
- })).toBe('ghcr.io/from-flag/img:1');
118
- });
119
- it('treats empty/whitespace flag value as unset and falls back to env', () => {
120
- expect(resolveDevboxImageOverride(' ', { OLAM_DEVBOX_IMAGE: 'ghcr.io/from-env/img:1' })).toBe('ghcr.io/from-env/img:1');
121
- });
122
- it('treats empty/whitespace env value as unset', () => {
123
- expect(resolveDevboxImageOverride(undefined, { OLAM_DEVBOX_IMAGE: ' ' })).toBeUndefined();
124
- });
125
- it('trims trailing whitespace in returned values', () => {
126
- expect(resolveDevboxImageOverride(' ghcr.io/atlas/foo:1 ', {})).toBe('ghcr.io/atlas/foo:1');
127
- });
128
- });
129
- //# sourceMappingURL=registry-allowlist.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry-allowlist.test.js","sourceRoot":"","sources":["../../src/__tests__/registry-allowlist.test.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * Unit tests for services.ts and mcp-auth integration in upgrade.ts.
3
- *
4
- * Mirrors upgrade.test.ts philosophy: stateless helpers and injectable deps only.
5
- * Real docker subprocess not spawned.
6
- */
7
- export {};
8
- //# sourceMappingURL=services.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"services.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/services.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -1,185 +0,0 @@
1
- /**
2
- * Unit tests for services.ts and mcp-auth integration in upgrade.ts.
3
- *
4
- * Mirrors upgrade.test.ts philosophy: stateless helpers and injectable deps only.
5
- * Real docker subprocess not spawned.
6
- */
7
- import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
8
- import * as fs from 'node:fs';
9
- import * as os from 'node:os';
10
- import * as path from 'node:path';
11
- // ── exports surface ───────────────────────────────────────────────
12
- describe('services.ts exports', () => {
13
- it('exports servicesUp, servicesDown, servicesStatus, registerServices', async () => {
14
- const mod = await import('../commands/services.js');
15
- expect(typeof mod.servicesUp).toBe('function');
16
- expect(typeof mod.servicesDown).toBe('function');
17
- expect(typeof mod.servicesStatus).toBe('function');
18
- expect(typeof mod.registerServices).toBe('function');
19
- expect(typeof mod.McpAuthContainerController).toBe('function');
20
- });
21
- });
22
- // ── ImageDigests mcp-auth field ───────────────────────────────────
23
- describe('ImageDigests mcp-auth optional field', () => {
24
- it('loadImageDigests parses json without mcp-auth (backward compat)', async () => {
25
- const { loadImageDigests } = await import('../commands/bootstrap.js');
26
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-digest-test-'));
27
- const distDir = path.join(dir, 'dist');
28
- fs.mkdirSync(distDir);
29
- fs.writeFileSync(path.join(distDir, 'image-digests.json'), JSON.stringify({
30
- 'host-cp': 'sha256:' + 'a'.repeat(64),
31
- auth: 'sha256:' + 'b'.repeat(64),
32
- devbox: 'sha256:' + 'c'.repeat(64),
33
- $registry: 'ghcr.io/pleri',
34
- }));
35
- const digests = loadImageDigests(dir);
36
- expect(digests['host-cp']).toMatch(/^sha256:/);
37
- expect(digests['mcp-auth']).toBeUndefined();
38
- fs.rmSync(dir, { recursive: true, force: true });
39
- });
40
- it('loadImageDigests parses json with mcp-auth present', async () => {
41
- const { loadImageDigests } = await import('../commands/bootstrap.js');
42
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'olam-digest-mcp-'));
43
- const distDir = path.join(dir, 'dist');
44
- fs.mkdirSync(distDir);
45
- fs.writeFileSync(path.join(distDir, 'image-digests.json'), JSON.stringify({
46
- 'host-cp': 'sha256:' + 'a'.repeat(64),
47
- auth: 'sha256:' + 'b'.repeat(64),
48
- devbox: 'sha256:' + 'c'.repeat(64),
49
- 'mcp-auth': 'sha256:' + 'd'.repeat(64),
50
- $registry: 'ghcr.io/pleri',
51
- }));
52
- const digests = loadImageDigests(dir);
53
- expect(digests['mcp-auth']).toMatch(/^sha256:/);
54
- fs.rmSync(dir, { recursive: true, force: true });
55
- });
56
- });
57
- // ── runUpgradePullByDigest — mcp-auth integration ─────────────────
58
- function ok(stdout = '') {
59
- return { exitCode: 0, stdout, stderr: '' };
60
- }
61
- function makeMockDocker() {
62
- const calls = [];
63
- return {
64
- docker: {
65
- info: vi.fn(async () => ok()),
66
- pull: vi.fn(async (ref) => {
67
- calls.push(ref);
68
- return ok();
69
- }),
70
- inspectLabel: vi.fn(async () => ok('1\n')),
71
- tag: vi.fn(async () => ok()),
72
- },
73
- calls,
74
- };
75
- }
76
- const FIXTURE_DIGESTS_3 = {
77
- 'host-cp': 'sha256:' + 'a'.repeat(64),
78
- auth: 'sha256:' + 'b'.repeat(64),
79
- devbox: 'sha256:' + 'c'.repeat(64),
80
- $registry: 'ghcr.io/pleri',
81
- $published_version: '0.1.16',
82
- };
83
- const FIXTURE_DIGESTS_4 = {
84
- ...FIXTURE_DIGESTS_3,
85
- 'mcp-auth': 'sha256:' + 'd'.repeat(64),
86
- };
87
- describe('runUpgradePullByDigest — mcp-auth pull', () => {
88
- beforeEach(() => {
89
- vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
90
- vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
91
- });
92
- afterEach(() => vi.restoreAllMocks());
93
- it('pulls 4 images when mcp-auth digest is in digests', async () => {
94
- const { runUpgradePullByDigest } = await import('../commands/upgrade.js');
95
- const { docker, calls } = makeMockDocker();
96
- await runUpgradePullByDigest({
97
- docker,
98
- digests: FIXTURE_DIGESTS_4,
99
- composeFile: '/tmp/nonexistent-compose.yaml',
100
- runComposeImpl: () => ({ ok: true, stdout: '', stderr: '' }),
101
- recreateAuth: async () => ({ ok: true }),
102
- recreateMcpAuth: async () => ({ ok: true }),
103
- tagImpl: () => ({ ok: true }),
104
- });
105
- expect(calls).toHaveLength(4);
106
- expect(calls.some((r) => r.includes('olam-mcp-auth@'))).toBe(true);
107
- });
108
- it('pulls only 3 images when mcp-auth digest absent (old tarball)', async () => {
109
- const { runUpgradePullByDigest } = await import('../commands/upgrade.js');
110
- const { docker, calls } = makeMockDocker();
111
- await runUpgradePullByDigest({
112
- docker,
113
- digests: FIXTURE_DIGESTS_3,
114
- composeFile: '/tmp/nonexistent-compose.yaml',
115
- runComposeImpl: () => ({ ok: true, stdout: '', stderr: '' }),
116
- recreateAuth: async () => ({ ok: true }),
117
- tagImpl: () => ({ ok: true }),
118
- });
119
- expect(calls).toHaveLength(3);
120
- expect(calls.every((r) => !r.includes('mcp-auth'))).toBe(true);
121
- });
122
- it('exits EXIT_GENERIC_ERROR when mcp-auth recreate fails', async () => {
123
- const { runUpgradePullByDigest } = await import('../commands/upgrade.js');
124
- const { EXIT_GENERIC_ERROR } = await import('../exit-codes.js');
125
- const { docker } = makeMockDocker();
126
- const result = await runUpgradePullByDigest({
127
- docker,
128
- digests: FIXTURE_DIGESTS_4,
129
- composeFile: '/tmp/nonexistent-compose.yaml',
130
- runComposeImpl: () => ({ ok: true, stdout: '', stderr: '' }),
131
- recreateAuth: async () => ({ ok: true }),
132
- recreateMcpAuth: async () => ({ ok: false, error: 'health timeout' }),
133
- tagImpl: () => ({ ok: true }),
134
- });
135
- expect(result.exitCode).toBe(EXIT_GENERIC_ERROR);
136
- expect(result.summary).toContain('mcp-auth');
137
- });
138
- it('exits 0 and skips mcp-auth recreate when digest absent', async () => {
139
- const { runUpgradePullByDigest } = await import('../commands/upgrade.js');
140
- const { docker } = makeMockDocker();
141
- let mcpRecreateCalled = false;
142
- const result = await runUpgradePullByDigest({
143
- docker,
144
- digests: FIXTURE_DIGESTS_3,
145
- composeFile: '/tmp/nonexistent-compose.yaml',
146
- runComposeImpl: () => ({ ok: true, stdout: '', stderr: '' }),
147
- recreateAuth: async () => ({ ok: true }),
148
- recreateMcpAuth: async () => {
149
- mcpRecreateCalled = true;
150
- return { ok: true };
151
- },
152
- tagImpl: () => ({ ok: true }),
153
- });
154
- expect(result.exitCode).toBe(0);
155
- expect(mcpRecreateCalled).toBe(false);
156
- });
157
- it('mcp-auth tagged to olam-mcp-auth:local when digest present', async () => {
158
- const { runUpgradePullByDigest } = await import('../commands/upgrade.js');
159
- const { docker } = makeMockDocker();
160
- const tagCalls = [];
161
- await runUpgradePullByDigest({
162
- docker,
163
- digests: FIXTURE_DIGESTS_4,
164
- composeFile: '/tmp/nonexistent-compose.yaml',
165
- runComposeImpl: () => ({ ok: true, stdout: '', stderr: '' }),
166
- recreateAuth: async () => ({ ok: true }),
167
- recreateMcpAuth: async () => ({ ok: true }),
168
- tagImpl: (from, to) => {
169
- tagCalls.push({ from, to });
170
- return { ok: true };
171
- },
172
- });
173
- const mcpTag = tagCalls.find((t) => t.to === 'olam-mcp-auth:local');
174
- expect(mcpTag).toBeDefined();
175
- expect(mcpTag?.from).toContain('olam-mcp-auth@sha256:');
176
- });
177
- });
178
- // ── olam auth up deprecation — exports shape ─────────────────────
179
- describe('auth.ts import shape', () => {
180
- it('registerAuth is still exported from auth.ts', async () => {
181
- const mod = await import('../commands/auth.js');
182
- expect(typeof mod.registerAuth).toBe('function');
183
- });
184
- });
185
- //# sourceMappingURL=services.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"services.test.js","sourceRoot":"","sources":["../../src/__tests__/services.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=status-app-urls.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-app-urls.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/status-app-urls.test.ts"],"names":[],"mappings":""}
@@ -1,125 +0,0 @@
1
- import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
2
- import { Command } from 'commander';
3
- // Mock loadContext before importing the command so vitest can intercept
4
- vi.mock('../context.js', () => ({ loadContext: vi.fn() }));
5
- // After mock declaration, import the mocked function and the command registrar
6
- const { loadContext } = await import('../context.js');
7
- const { registerStatus } = await import('../commands/status.js');
8
- const ANSI_RE = /\x1b\[[0-9;]*[A-Za-z]/g;
9
- function strip(s) {
10
- return s.replace(ANSI_RE, '');
11
- }
12
- const SAMPLE_URLS = [
13
- { repoName: 'atlas-core', internalPort: 3000, hostPort: 13000, url: 'http://localhost:13000' },
14
- { repoName: 'diner-app', internalPort: 4000, hostPort: 14000, url: 'http://localhost:14000' },
15
- ];
16
- function makeWorld(overrides) {
17
- return {
18
- id: 'test-world-1',
19
- name: 'Test World',
20
- status: 'running',
21
- repos: ['olam'],
22
- branch: 'main',
23
- portOffset: 0,
24
- workspacePath: '/home/olam/workspace/olam',
25
- computeProvider: 'docker',
26
- totalCostUsd: 0.0042,
27
- thoughtCount: 7,
28
- createdAt: '2026-05-01T10:00:00.000Z',
29
- updatedAt: '2026-05-01T11:00:00.000Z',
30
- ...overrides,
31
- };
32
- }
33
- function makeCtx(world) {
34
- return {
35
- worldManager: {
36
- getWorld: vi.fn().mockReturnValue(world),
37
- },
38
- costTracker: {
39
- getWorldCost: vi.fn().mockReturnValue(0.0042),
40
- },
41
- };
42
- }
43
- describe('olam status — appPortUrls output', () => {
44
- let logSpy;
45
- beforeEach(() => {
46
- logSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
47
- vi.mocked(loadContext).mockReset();
48
- });
49
- afterEach(() => {
50
- logSpy.mockRestore();
51
- vi.unstubAllEnvs();
52
- });
53
- async function runStatus(worldId = 'test-world-1', extraArgs = []) {
54
- const program = new Command().exitOverride();
55
- registerStatus(program);
56
- await program.parseAsync(['node', 'cli', 'status', worldId, ...extraArgs]);
57
- }
58
- it('prints Dashboard and Apps block when appPortUrls is present', async () => {
59
- const world = makeWorld({ appPortUrls: SAMPLE_URLS });
60
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
61
- await runStatus();
62
- const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
63
- expect(output).toContain('http://localhost:19080'); // dashboard
64
- expect(output).toContain('atlas-core');
65
- expect(output).toContain('http://localhost:13000');
66
- expect(output).toContain('diner-app');
67
- expect(output).toContain('http://localhost:14000');
68
- });
69
- it('prints first app URL with "Apps" label, subsequent with empty label', async () => {
70
- const world = makeWorld({ appPortUrls: SAMPLE_URLS });
71
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
72
- await runStatus();
73
- const lines = logSpy.mock.calls.map((args) => strip(String(args[0])));
74
- const appsLine = lines.find((l) => l.includes('Apps') && l.includes('atlas-core'));
75
- expect(appsLine).toBeDefined();
76
- // Second app URL line uses empty label (14 spaces of padding)
77
- const dinerLine = lines.find((l) => l.includes('diner-app') && l.includes('http://localhost:14000'));
78
- expect(dinerLine).toBeDefined();
79
- expect(dinerLine).not.toMatch(/Apps/);
80
- });
81
- it('does NOT print Apps block when appPortUrls is absent', async () => {
82
- const world = makeWorld(); // no appPortUrls
83
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
84
- await runStatus();
85
- const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
86
- expect(output).not.toContain('Apps');
87
- expect(output).toContain('http://localhost:19080'); // dashboard still present
88
- });
89
- it('does NOT print Apps block when appPortUrls is empty array', async () => {
90
- const world = makeWorld({ appPortUrls: [] });
91
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
92
- await runStatus();
93
- const output = logSpy.mock.calls.map((args) => strip(String(args[0]))).join('\n');
94
- expect(output).not.toContain('Apps');
95
- });
96
- it('--json output includes appPortUrls array', async () => {
97
- const world = makeWorld({ appPortUrls: SAMPLE_URLS });
98
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
99
- await runStatus('test-world-1', ['--json']);
100
- const jsonCall = logSpy.mock.calls.find((args) => String(args[0]).startsWith('{'));
101
- expect(jsonCall).toBeDefined();
102
- const parsed = JSON.parse(String(jsonCall[0]));
103
- expect(parsed.appPortUrls).toEqual(SAMPLE_URLS);
104
- expect(parsed.dashboardUrl).toBe('http://localhost:19080');
105
- });
106
- it('--json output without appPortUrls omits the field', async () => {
107
- const world = makeWorld(); // no appPortUrls
108
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
109
- await runStatus('test-world-1', ['--json']);
110
- const jsonCall = logSpy.mock.calls.find((args) => String(args[0]).startsWith('{'));
111
- expect(jsonCall).toBeDefined();
112
- const parsed = JSON.parse(String(jsonCall[0]));
113
- expect(parsed.appPortUrls).toBeUndefined();
114
- expect(parsed.dashboardUrl).toBe('http://localhost:19080');
115
- });
116
- it('uses portOffset to compute correct dashboardUrl', async () => {
117
- const world = makeWorld({ portOffset: 200, appPortUrls: SAMPLE_URLS });
118
- vi.mocked(loadContext).mockResolvedValue({ ctx: makeCtx(world) });
119
- await runStatus('test-world-1', ['--json']);
120
- const jsonCall = logSpy.mock.calls.find((args) => String(args[0]).startsWith('{'));
121
- const parsed = JSON.parse(String(jsonCall[0]));
122
- expect(parsed.dashboardUrl).toBe('http://localhost:19280'); // 19080 + 200
123
- });
124
- });
125
- //# sourceMappingURL=status-app-urls.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status-app-urls.test.js","sourceRoot":"","sources":["../../src/__tests__/status-app-urls.test.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- /**
2
- * upgrade-gh-token-contract.test.ts — contractual regression test for
3
- * the GH_TOKEN forwarding through `olam upgrade`.
4
- *
5
- * Bug history: `olam host-cp start` correctly captured the operator's
6
- * gh-CLI token (via `captureGhToken()` → `buildComposeEnv(authSecret,
7
- * ghToken)`) and injected it into the host-cp container env. But
8
- * `olam upgrade -y` used a DIFFERENT call shape —
9
- * `buildComposeEnv(authSecret)` (single arg) — which omitted the token.
10
- * Every upgrade silently dropped GH_TOKEN, leaving the new container
11
- * with `GH_TOKEN=` (empty). The dashboard's PR filter + Cmd+K palette
12
- * silently 500'd because pr-merge-poller + /api/prs both gated on a
13
- * non-empty token.
14
- *
15
- * Pin the contract: every `buildComposeEnv` call site in upgrade.ts
16
- * MUST pass both authSecret AND captureGhToken().
17
- */
18
- export {};
19
- //# sourceMappingURL=upgrade-gh-token-contract.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade-gh-token-contract.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/upgrade-gh-token-contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -1,63 +0,0 @@
1
- /**
2
- * upgrade-gh-token-contract.test.ts — contractual regression test for
3
- * the GH_TOKEN forwarding through `olam upgrade`.
4
- *
5
- * Bug history: `olam host-cp start` correctly captured the operator's
6
- * gh-CLI token (via `captureGhToken()` → `buildComposeEnv(authSecret,
7
- * ghToken)`) and injected it into the host-cp container env. But
8
- * `olam upgrade -y` used a DIFFERENT call shape —
9
- * `buildComposeEnv(authSecret)` (single arg) — which omitted the token.
10
- * Every upgrade silently dropped GH_TOKEN, leaving the new container
11
- * with `GH_TOKEN=` (empty). The dashboard's PR filter + Cmd+K palette
12
- * silently 500'd because pr-merge-poller + /api/prs both gated on a
13
- * non-empty token.
14
- *
15
- * Pin the contract: every `buildComposeEnv` call site in upgrade.ts
16
- * MUST pass both authSecret AND captureGhToken().
17
- */
18
- import { describe, it, expect } from 'vitest';
19
- import * as fs from 'node:fs';
20
- import * as path from 'node:path';
21
- import { fileURLToPath } from 'node:url';
22
- const __filename = fileURLToPath(import.meta.url);
23
- const __dirname = path.dirname(__filename);
24
- const UPGRADE_PATH = path.join(__dirname, '..', 'commands', 'upgrade.ts');
25
- describe('upgrade.ts GH_TOKEN forwarding contract', () => {
26
- it('imports captureGhToken from ./host-cp.js', () => {
27
- const src = fs.readFileSync(UPGRADE_PATH, 'utf-8');
28
- // The host-cp.js import line must include captureGhToken so the
29
- // upgrade path can re-capture the operator's token at recreate time.
30
- const hostCpImport = src.match(/import\s*\{[^}]*\}\s*from\s*['"]\.\/host-cp\.js['"]/);
31
- expect(hostCpImport).not.toBeNull();
32
- expect(hostCpImport[0]).toMatch(/\bcaptureGhToken\b/);
33
- });
34
- it('every buildComposeEnv call passes captureGhToken() as the second arg', () => {
35
- const src = fs.readFileSync(UPGRADE_PATH, 'utf-8');
36
- // Find every `buildComposeEnv(...)` invocation. The args may include
37
- // a nested call like `captureGhToken()` — `[^)]+` would stop at the
38
- // FIRST `)` (the inner paren). Capture ~120 chars after the name
39
- // and check the full slice for the captureGhToken signature.
40
- const callOffsets = [];
41
- const re = /buildComposeEnv\s*\(/g;
42
- let m;
43
- while ((m = re.exec(src)) != null) {
44
- callOffsets.push(m.index);
45
- }
46
- expect(callOffsets.length).toBeGreaterThan(0);
47
- for (const off of callOffsets) {
48
- const slice = src.slice(off, off + 120);
49
- expect(slice, `buildComposeEnv call must include captureGhToken(). Slice:\n${slice}`)
50
- .toMatch(/captureGhToken\s*\(\s*\)/);
51
- }
52
- });
53
- it('contract holds across forward-upgrade, rollback, and source-mode call sites', () => {
54
- // Sanity: at least 4 call sites exist (forward upgrade, source-mode
55
- // build, rollback, source-mode SPA build) per the original code
56
- // shape. If a future refactor consolidates them, this test should
57
- // still hold per-call.
58
- const src = fs.readFileSync(UPGRADE_PATH, 'utf-8');
59
- const callCount = (src.match(/buildComposeEnv\s*\(/g) ?? []).length;
60
- expect(callCount).toBeGreaterThanOrEqual(4);
61
- });
62
- });
63
- //# sourceMappingURL=upgrade-gh-token-contract.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade-gh-token-contract.test.js","sourceRoot":"","sources":["../../src/__tests__/upgrade-gh-token-contract.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAE1E,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACnD,gEAAgE;QAChE,qEAAqE;QACrE,MAAM,YAAY,GAAG,GAAG,CAAC,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACtF,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,CAAC,YAAa,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAEnD,qEAAqE;QACrE,oEAAoE;QACpE,iEAAiE;QACjE,6DAA6D;QAC7D,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,uBAAuB,CAAC;QACnC,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YAClC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;YACxC,MAAM,CAAC,KAAK,EAAE,+DAA+D,KAAK,EAAE,CAAC;iBAClF,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,oEAAoE;QACpE,gEAAgE;QAChE,kEAAkE;QAClE,uBAAuB;QACvB,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACpE,MAAM,CAAC,SAAS,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Unit tests for upgrade.ts pure helpers.
3
- *
4
- * Only tests the stateless, side-effect-free helpers. The full upgrade
5
- * pipeline (git, npm, docker) is too side-effectful to integration-test
6
- * inside the devbox — same philosophy as host-cp.test.ts.
7
- */
8
- export {};
9
- //# sourceMappingURL=upgrade.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"upgrade.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/upgrade.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}