@pleri/olam-cli 0.1.7

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 (196) hide show
  1. package/dist/__tests__/auth-status.test.d.ts +2 -0
  2. package/dist/__tests__/auth-status.test.d.ts.map +1 -0
  3. package/dist/__tests__/auth-status.test.js +290 -0
  4. package/dist/__tests__/auth-status.test.js.map +1 -0
  5. package/dist/__tests__/auth-upgrade.test.d.ts +9 -0
  6. package/dist/__tests__/auth-upgrade.test.d.ts.map +1 -0
  7. package/dist/__tests__/auth-upgrade.test.js +161 -0
  8. package/dist/__tests__/auth-upgrade.test.js.map +1 -0
  9. package/dist/__tests__/create-app-urls.test.d.ts +2 -0
  10. package/dist/__tests__/create-app-urls.test.d.ts.map +1 -0
  11. package/dist/__tests__/create-app-urls.test.js +102 -0
  12. package/dist/__tests__/create-app-urls.test.js.map +1 -0
  13. package/dist/__tests__/enter.test.d.ts +2 -0
  14. package/dist/__tests__/enter.test.d.ts.map +1 -0
  15. package/dist/__tests__/enter.test.js +90 -0
  16. package/dist/__tests__/enter.test.js.map +1 -0
  17. package/dist/__tests__/host-cp-gh-token.test.d.ts +9 -0
  18. package/dist/__tests__/host-cp-gh-token.test.d.ts.map +1 -0
  19. package/dist/__tests__/host-cp-gh-token.test.js +119 -0
  20. package/dist/__tests__/host-cp-gh-token.test.js.map +1 -0
  21. package/dist/__tests__/host-cp.test.d.ts +9 -0
  22. package/dist/__tests__/host-cp.test.d.ts.map +1 -0
  23. package/dist/__tests__/host-cp.test.js +254 -0
  24. package/dist/__tests__/host-cp.test.js.map +1 -0
  25. package/dist/__tests__/keys.test.d.ts +9 -0
  26. package/dist/__tests__/keys.test.d.ts.map +1 -0
  27. package/dist/__tests__/keys.test.js +145 -0
  28. package/dist/__tests__/keys.test.js.map +1 -0
  29. package/dist/__tests__/logs.test.d.ts +9 -0
  30. package/dist/__tests__/logs.test.d.ts.map +1 -0
  31. package/dist/__tests__/logs.test.js +124 -0
  32. package/dist/__tests__/logs.test.js.map +1 -0
  33. package/dist/__tests__/ps.test.d.ts +2 -0
  34. package/dist/__tests__/ps.test.d.ts.map +1 -0
  35. package/dist/__tests__/ps.test.js +172 -0
  36. package/dist/__tests__/ps.test.js.map +1 -0
  37. package/dist/__tests__/status-app-urls.test.d.ts +2 -0
  38. package/dist/__tests__/status-app-urls.test.d.ts.map +1 -0
  39. package/dist/__tests__/status-app-urls.test.js +125 -0
  40. package/dist/__tests__/status-app-urls.test.js.map +1 -0
  41. package/dist/__tests__/upgrade.test.d.ts +9 -0
  42. package/dist/__tests__/upgrade.test.d.ts.map +1 -0
  43. package/dist/__tests__/upgrade.test.js +262 -0
  44. package/dist/__tests__/upgrade.test.js.map +1 -0
  45. package/dist/commands/__tests__/carry-uncommitted.test.d.ts +14 -0
  46. package/dist/commands/__tests__/carry-uncommitted.test.d.ts.map +1 -0
  47. package/dist/commands/__tests__/carry-uncommitted.test.js +83 -0
  48. package/dist/commands/__tests__/carry-uncommitted.test.js.map +1 -0
  49. package/dist/commands/__tests__/openHostCpUrl.test.d.ts +2 -0
  50. package/dist/commands/__tests__/openHostCpUrl.test.d.ts.map +1 -0
  51. package/dist/commands/__tests__/openHostCpUrl.test.js +63 -0
  52. package/dist/commands/__tests__/openHostCpUrl.test.js.map +1 -0
  53. package/dist/commands/__tests__/refresh.test.d.ts +13 -0
  54. package/dist/commands/__tests__/refresh.test.d.ts.map +1 -0
  55. package/dist/commands/__tests__/refresh.test.js +170 -0
  56. package/dist/commands/__tests__/refresh.test.js.map +1 -0
  57. package/dist/commands/auth-status.d.ts +43 -0
  58. package/dist/commands/auth-status.d.ts.map +1 -0
  59. package/dist/commands/auth-status.js +208 -0
  60. package/dist/commands/auth-status.js.map +1 -0
  61. package/dist/commands/auth-upgrade.d.ts +47 -0
  62. package/dist/commands/auth-upgrade.d.ts.map +1 -0
  63. package/dist/commands/auth-upgrade.js +277 -0
  64. package/dist/commands/auth-upgrade.js.map +1 -0
  65. package/dist/commands/auth.d.ts +16 -0
  66. package/dist/commands/auth.d.ts.map +1 -0
  67. package/dist/commands/auth.js +283 -0
  68. package/dist/commands/auth.js.map +1 -0
  69. package/dist/commands/create.d.ts +8 -0
  70. package/dist/commands/create.d.ts.map +1 -0
  71. package/dist/commands/create.js +512 -0
  72. package/dist/commands/create.js.map +1 -0
  73. package/dist/commands/crystallize.d.ts +8 -0
  74. package/dist/commands/crystallize.d.ts.map +1 -0
  75. package/dist/commands/crystallize.js +101 -0
  76. package/dist/commands/crystallize.js.map +1 -0
  77. package/dist/commands/destroy.d.ts +6 -0
  78. package/dist/commands/destroy.d.ts.map +1 -0
  79. package/dist/commands/destroy.js +54 -0
  80. package/dist/commands/destroy.js.map +1 -0
  81. package/dist/commands/dispatch.d.ts +9 -0
  82. package/dist/commands/dispatch.d.ts.map +1 -0
  83. package/dist/commands/dispatch.js +94 -0
  84. package/dist/commands/dispatch.js.map +1 -0
  85. package/dist/commands/enter.d.ts +63 -0
  86. package/dist/commands/enter.d.ts.map +1 -0
  87. package/dist/commands/enter.js +206 -0
  88. package/dist/commands/enter.js.map +1 -0
  89. package/dist/commands/host-cp.d.ts +191 -0
  90. package/dist/commands/host-cp.d.ts.map +1 -0
  91. package/dist/commands/host-cp.js +797 -0
  92. package/dist/commands/host-cp.js.map +1 -0
  93. package/dist/commands/init.d.ts +9 -0
  94. package/dist/commands/init.d.ts.map +1 -0
  95. package/dist/commands/init.js +143 -0
  96. package/dist/commands/init.js.map +1 -0
  97. package/dist/commands/install.d.ts +22 -0
  98. package/dist/commands/install.d.ts.map +1 -0
  99. package/dist/commands/install.js +203 -0
  100. package/dist/commands/install.js.map +1 -0
  101. package/dist/commands/keys.d.ts +26 -0
  102. package/dist/commands/keys.d.ts.map +1 -0
  103. package/dist/commands/keys.js +151 -0
  104. package/dist/commands/keys.js.map +1 -0
  105. package/dist/commands/lanes.d.ts +18 -0
  106. package/dist/commands/lanes.d.ts.map +1 -0
  107. package/dist/commands/lanes.js +122 -0
  108. package/dist/commands/lanes.js.map +1 -0
  109. package/dist/commands/list.d.ts +6 -0
  110. package/dist/commands/list.d.ts.map +1 -0
  111. package/dist/commands/list.js +39 -0
  112. package/dist/commands/list.js.map +1 -0
  113. package/dist/commands/logs.d.ts +38 -0
  114. package/dist/commands/logs.d.ts.map +1 -0
  115. package/dist/commands/logs.js +177 -0
  116. package/dist/commands/logs.js.map +1 -0
  117. package/dist/commands/observe.d.ts +9 -0
  118. package/dist/commands/observe.d.ts.map +1 -0
  119. package/dist/commands/observe.js +34 -0
  120. package/dist/commands/observe.js.map +1 -0
  121. package/dist/commands/policy-check.d.ts +14 -0
  122. package/dist/commands/policy-check.d.ts.map +1 -0
  123. package/dist/commands/policy-check.js +76 -0
  124. package/dist/commands/policy-check.js.map +1 -0
  125. package/dist/commands/pr.d.ts +17 -0
  126. package/dist/commands/pr.d.ts.map +1 -0
  127. package/dist/commands/pr.js +148 -0
  128. package/dist/commands/pr.js.map +1 -0
  129. package/dist/commands/ps.d.ts +25 -0
  130. package/dist/commands/ps.d.ts.map +1 -0
  131. package/dist/commands/ps.js +164 -0
  132. package/dist/commands/ps.js.map +1 -0
  133. package/dist/commands/refresh-helpers.d.ts +25 -0
  134. package/dist/commands/refresh-helpers.d.ts.map +1 -0
  135. package/dist/commands/refresh-helpers.js +56 -0
  136. package/dist/commands/refresh-helpers.js.map +1 -0
  137. package/dist/commands/refresh.d.ts +23 -0
  138. package/dist/commands/refresh.d.ts.map +1 -0
  139. package/dist/commands/refresh.js +237 -0
  140. package/dist/commands/refresh.js.map +1 -0
  141. package/dist/commands/status.d.ts +6 -0
  142. package/dist/commands/status.d.ts.map +1 -0
  143. package/dist/commands/status.js +51 -0
  144. package/dist/commands/status.js.map +1 -0
  145. package/dist/commands/upgrade.d.ts +67 -0
  146. package/dist/commands/upgrade.d.ts.map +1 -0
  147. package/dist/commands/upgrade.js +358 -0
  148. package/dist/commands/upgrade.js.map +1 -0
  149. package/dist/commands/workspace.d.ts +23 -0
  150. package/dist/commands/workspace.d.ts.map +1 -0
  151. package/dist/commands/workspace.js +198 -0
  152. package/dist/commands/workspace.js.map +1 -0
  153. package/dist/commands/world-snapshot.d.ts +18 -0
  154. package/dist/commands/world-snapshot.d.ts.map +1 -0
  155. package/dist/commands/world-snapshot.js +327 -0
  156. package/dist/commands/world-snapshot.js.map +1 -0
  157. package/dist/context.d.ts +26 -0
  158. package/dist/context.d.ts.map +1 -0
  159. package/dist/context.js +51 -0
  160. package/dist/context.js.map +1 -0
  161. package/dist/index.d.ts +9 -0
  162. package/dist/index.d.ts.map +1 -0
  163. package/dist/index.js +18007 -0
  164. package/dist/index.js.map +1 -0
  165. package/dist/mcp-server.js +32236 -0
  166. package/dist/output.d.ts +10 -0
  167. package/dist/output.d.ts.map +1 -0
  168. package/dist/output.js +31 -0
  169. package/dist/output.js.map +1 -0
  170. package/host-cp/compose.yaml +126 -0
  171. package/host-cp/src/auth-secret-hint.mjs +45 -0
  172. package/host-cp/src/auth.mjs +155 -0
  173. package/host-cp/src/compose-worlds-sources.mjs +170 -0
  174. package/host-cp/src/container-secret-fetcher.mjs +163 -0
  175. package/host-cp/src/docker-events.mjs +184 -0
  176. package/host-cp/src/local-worlds-source.mjs +83 -0
  177. package/host-cp/src/plan-orchestrator.mjs +829 -0
  178. package/host-cp/src/plan-progress.mjs +282 -0
  179. package/host-cp/src/pr-cache.mjs +201 -0
  180. package/host-cp/src/pr-merge-poller.mjs +154 -0
  181. package/host-cp/src/process-poller.mjs +250 -0
  182. package/host-cp/src/proxy.mjs +245 -0
  183. package/host-cp/src/pylon-worlds-source.mjs +68 -0
  184. package/host-cp/src/redact.mjs +67 -0
  185. package/host-cp/src/secret-cache.mjs +104 -0
  186. package/host-cp/src/server.mjs +2215 -0
  187. package/host-cp/src/sse-gate.mjs +117 -0
  188. package/host-cp/src/version-status.mjs +209 -0
  189. package/host-cp/src/workspace-catalog.mjs +149 -0
  190. package/host-cp/src/world-names-store.mjs +176 -0
  191. package/host-cp/src/world-pr-state.mjs +97 -0
  192. package/host-cp/src/world-progress.mjs +322 -0
  193. package/host-cp/src/world-tunnel-manager.mjs +288 -0
  194. package/host-cp/src/worlds-db-source.mjs +191 -0
  195. package/host-cp/src/worlds-source.mjs +59 -0
  196. package/package.json +38 -0
@@ -0,0 +1,358 @@
1
+ /**
2
+ * `olam upgrade` — self-upgrade the local Olam dev stack.
3
+ *
4
+ * Runs the full manual sequence in one command:
5
+ * git fetch + git pull --ff-only
6
+ * npm install
7
+ * npm run build
8
+ * vite build (SPA)
9
+ * bash build-host-cp.sh (image)
10
+ * docker compose up -d --force-recreate
11
+ * wait for /health
12
+ */
13
+ import * as fs from 'node:fs';
14
+ import * as path from 'node:path';
15
+ import { spawnSync } from 'node:child_process';
16
+ import pc from 'picocolors';
17
+ import { printError, printSuccess, printInfo, printWarning, printHeader } from '../output.js';
18
+ import { buildComposeEnv, readAuthSecret, runCompose } from './host-cp.js';
19
+ /**
20
+ * Check whether node_modules is in sync with package-lock.json.
21
+ *
22
+ * npm writes node_modules/.package-lock.json after every successful install.
23
+ * If its mtime is >= package-lock.json's mtime, the last install ran after
24
+ * the last lockfile change — node_modules is current.
25
+ *
26
+ * Returns true → skip install (node_modules reflects the current lockfile).
27
+ * Returns false → run install (lockfile changed or marker absent).
28
+ */
29
+ export function isNodeModulesInSync(cwd) {
30
+ const lockPath = path.join(cwd, 'package-lock.json');
31
+ const markerPath = path.join(cwd, 'node_modules', '.package-lock.json');
32
+ if (!fs.existsSync(lockPath) || !fs.existsSync(markerPath))
33
+ return false;
34
+ try {
35
+ const lockStat = fs.statSync(lockPath);
36
+ const markerStat = fs.statSync(markerPath);
37
+ return markerStat.mtimeMs >= lockStat.mtimeMs;
38
+ }
39
+ catch {
40
+ return false;
41
+ }
42
+ }
43
+ /**
44
+ * Decide whether the npm install step should be skipped.
45
+ *
46
+ * Priority:
47
+ * 1. --skip-install flag → always skip
48
+ * 2. node_modules in sync with lockfile → skip (log reason)
49
+ * 3. otherwise → run install
50
+ */
51
+ export function shouldSkipInstall(opts, cwd) {
52
+ if (opts.skipInstall) {
53
+ return { skip: true, reason: '--skip-install flag set' };
54
+ }
55
+ if (isNodeModulesInSync(cwd)) {
56
+ return { skip: true, reason: 'node_modules in sync with package-lock.json' };
57
+ }
58
+ return { skip: false };
59
+ }
60
+ /** Check cwd looks like the olam repo root. */
61
+ export function validateRepoRoot(cwd) {
62
+ const marker = path.join(cwd, 'packages/host-cp/compose.yaml');
63
+ if (!fs.existsSync(marker)) {
64
+ return {
65
+ ok: false,
66
+ error: `Not an olam repo root (expected ${marker}).\n` +
67
+ 'Run `olam upgrade` from the root of your olam checkout.',
68
+ };
69
+ }
70
+ return { ok: true };
71
+ }
72
+ /** Normalise raw Commander option object into typed opts. */
73
+ export function parseUpgradeOpts(raw) {
74
+ return {
75
+ yes: raw.yes === true,
76
+ skipImage: raw.skipImage === true,
77
+ skipInstall: raw.skipInstall === true,
78
+ branch: raw.branch ?? null,
79
+ };
80
+ }
81
+ /**
82
+ * Extract the JS bundle hash from index.html.
83
+ * Looks for the canonical Vite output pattern: `/assets/index-<hash>.js`.
84
+ */
85
+ export function extractBundleHash(indexHtml) {
86
+ const match = indexHtml.match(/\/assets\/index-([A-Za-z0-9_-]+)\.js/);
87
+ return match ? (match[1] ?? null) : null;
88
+ }
89
+ function runStep(label, cmd, args, opts = {}) {
90
+ const start = Date.now();
91
+ process.stdout.write(` ${pc.dim(label.padEnd(34))}`);
92
+ const result = spawnSync(cmd, [...args], {
93
+ encoding: 'utf-8',
94
+ stdio: ['ignore', 'pipe', 'pipe'],
95
+ cwd: opts.cwd ?? process.cwd(),
96
+ env: { ...process.env, ...(opts.env ?? {}) },
97
+ });
98
+ const durationMs = Date.now() - start;
99
+ const ok = result.status === 0 && result.error === undefined;
100
+ const dur = `${(durationMs / 1000).toFixed(1)}s`;
101
+ process.stdout.write(`${ok ? pc.green('✓') : pc.red('✗')} ${dur}\n`);
102
+ return {
103
+ ok,
104
+ stdout: result.stdout ?? '',
105
+ stderr: result.stderr ?? '',
106
+ durationMs,
107
+ };
108
+ }
109
+ function isGitDirty(cwd) {
110
+ const result = spawnSync('git', ['status', '--porcelain'], {
111
+ encoding: 'utf-8',
112
+ stdio: ['ignore', 'pipe', 'pipe'],
113
+ cwd,
114
+ });
115
+ return (result.stdout ?? '').trim().length > 0;
116
+ }
117
+ function hasGitUpstream(cwd) {
118
+ const result = spawnSync('git', ['rev-parse', '--abbrev-ref', '@{u}'], {
119
+ encoding: 'utf-8',
120
+ stdio: ['ignore', 'pipe', 'pipe'],
121
+ cwd,
122
+ });
123
+ return result.status === 0;
124
+ }
125
+ async function confirm(message) {
126
+ if (!process.stdin.isTTY)
127
+ return true;
128
+ const { createInterface } = await import('node:readline');
129
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
130
+ return new Promise((resolve) => {
131
+ rl.question(`${message} [y/N] `, (answer) => {
132
+ rl.close();
133
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
134
+ });
135
+ });
136
+ }
137
+ async function waitForHealth(timeoutMs = 10_000) {
138
+ const deadline = Date.now() + timeoutMs;
139
+ while (Date.now() < deadline) {
140
+ try {
141
+ const res = await fetch('http://127.0.0.1:19000/health', {
142
+ signal: AbortSignal.timeout(2000),
143
+ });
144
+ if (res.ok)
145
+ return true;
146
+ }
147
+ catch {
148
+ // not up yet
149
+ }
150
+ await new Promise((r) => setTimeout(r, 500));
151
+ }
152
+ return false;
153
+ }
154
+ function readBundleHash(cwd) {
155
+ const indexPath = path.join(cwd, 'packages/control-plane/public/index.html');
156
+ if (!fs.existsSync(indexPath))
157
+ return null;
158
+ return extractBundleHash(fs.readFileSync(indexPath, 'utf-8'));
159
+ }
160
+ // ── Main handler ──────────────────────────────────────────────────
161
+ async function handleUpgrade(opts) {
162
+ const cwd = process.cwd();
163
+ // 1. Verify repo root.
164
+ const rootCheck = validateRepoRoot(cwd);
165
+ if (!rootCheck.ok) {
166
+ printError(rootCheck.error);
167
+ process.exitCode = 1;
168
+ return;
169
+ }
170
+ // 2. Print plan.
171
+ printHeader('olam upgrade');
172
+ const steps = [
173
+ 'git fetch origin --prune',
174
+ 'git pull --ff-only',
175
+ 'npm install',
176
+ 'npm run build (TS workspaces)',
177
+ 'vite build (SPA)',
178
+ ...(opts.skipImage ? [] : [
179
+ 'bash build-host-cp.sh (docker image)',
180
+ 'docker compose up -d --force-recreate',
181
+ 'wait for /health',
182
+ ]),
183
+ ];
184
+ printInfo('Steps', steps.join(', '));
185
+ if (opts.skipImage)
186
+ printInfo('Mode', '--skip-image: no docker rebuild');
187
+ if (opts.skipInstall)
188
+ printInfo('Mode', '--skip-install: npm install will be skipped');
189
+ if (opts.branch)
190
+ printInfo('Branch', opts.branch);
191
+ process.stdout.write('\n');
192
+ // 3. Confirm unless --yes.
193
+ if (!opts.yes) {
194
+ const proceed = await confirm('Proceed?');
195
+ if (!proceed) {
196
+ printInfo('Aborted', 'no changes made');
197
+ return;
198
+ }
199
+ }
200
+ // 4a. Branch switch (--branch).
201
+ if (opts.branch !== null) {
202
+ if (isGitDirty(cwd)) {
203
+ printError(`Working tree is dirty. Stash changes first:\n git stash\nThen retry with --branch ${opts.branch}`);
204
+ process.exitCode = 1;
205
+ return;
206
+ }
207
+ const switchResult = runStep(`git checkout ${opts.branch}`, 'git', ['checkout', opts.branch], { cwd });
208
+ if (!switchResult.ok) {
209
+ printError(`Failed to switch to branch ${opts.branch}:\n${switchResult.stderr}`);
210
+ process.exitCode = 1;
211
+ return;
212
+ }
213
+ }
214
+ // 4b. Dirty check before pull (skip if we just switched).
215
+ if (opts.branch === null && isGitDirty(cwd)) {
216
+ printError('Working tree is dirty. Stash or commit changes first:\n git stash\nThen re-run `olam upgrade`.');
217
+ process.exitCode = 1;
218
+ return;
219
+ }
220
+ // 4c. Upstream check.
221
+ if (!hasGitUpstream(cwd)) {
222
+ printError('Current branch has no upstream remote. Set one first:\n git branch --set-upstream-to=origin/<branch>\nThen re-run `olam upgrade`.');
223
+ process.exitCode = 1;
224
+ return;
225
+ }
226
+ const timings = [];
227
+ // Step a: git fetch.
228
+ const fetchResult = runStep('git fetch origin --prune', 'git', ['fetch', 'origin', '--prune'], { cwd });
229
+ timings.push({ label: 'git fetch', durationMs: fetchResult.durationMs });
230
+ if (!fetchResult.ok) {
231
+ printError(`git fetch failed:\n${fetchResult.stderr}`);
232
+ process.exitCode = 1;
233
+ return;
234
+ }
235
+ // Step b: git pull --ff-only.
236
+ const pullResult = runStep('git pull --ff-only', 'git', ['pull', '--ff-only'], { cwd });
237
+ timings.push({ label: 'git pull', durationMs: pullResult.durationMs });
238
+ if (!pullResult.ok) {
239
+ printError(`git pull --ff-only failed:\n${pullResult.stderr}\n` +
240
+ 'If there are conflicts, resolve them manually then re-run `olam upgrade`.');
241
+ process.exitCode = 1;
242
+ return;
243
+ }
244
+ // Step c: npm install (skip when in sync or --skip-install).
245
+ const installDecision = shouldSkipInstall(opts, cwd);
246
+ if (installDecision.skip) {
247
+ printInfo('npm install', `skipped — ${installDecision.reason}`);
248
+ timings.push({ label: 'npm install', durationMs: 0 });
249
+ }
250
+ else {
251
+ const installResult = runStep('npm install', 'npm', ['install', '--silent', '--no-audit', '--no-fund'], { cwd });
252
+ timings.push({ label: 'npm install', durationMs: installResult.durationMs });
253
+ if (!installResult.ok) {
254
+ printError(`npm install failed:\n${installResult.stderr}\n\n` +
255
+ 'Recovery options:\n' +
256
+ ' • If a native module (e.g. better-sqlite3) failed to compile on your Node version:\n' +
257
+ ' olam upgrade --skip-install\n' +
258
+ ' This skips npm install and uses the existing node_modules.\n' +
259
+ ' • To fix the native module, upgrade it in the relevant package.json,\n' +
260
+ ' run `npm install` manually, then retry `olam upgrade --skip-install`.');
261
+ process.exitCode = 1;
262
+ return;
263
+ }
264
+ }
265
+ // Step d: npm run build (TS workspaces).
266
+ const buildResult = runStep('npm run build', 'npm', ['run', 'build'], { cwd });
267
+ timings.push({ label: 'npm run build', durationMs: buildResult.durationMs });
268
+ if (!buildResult.ok) {
269
+ printError(`npm run build failed:\n${buildResult.stderr}`);
270
+ process.exitCode = 1;
271
+ return;
272
+ }
273
+ // Step e: vite build (SPA).
274
+ const authSecret = readAuthSecret();
275
+ const spaDir = path.join(cwd, 'packages/control-plane/app');
276
+ const spaResult = runStep('vite build (SPA)', 'npx', ['vite', 'build'], { cwd: spaDir, env: buildComposeEnv(authSecret) });
277
+ timings.push({ label: 'vite build (SPA)', durationMs: spaResult.durationMs });
278
+ if (!spaResult.ok) {
279
+ printError(`vite build failed:\n${spaResult.stderr}`);
280
+ process.exitCode = 1;
281
+ return;
282
+ }
283
+ if (opts.skipImage) {
284
+ // Summary — no docker steps.
285
+ process.stdout.write('\n');
286
+ printSuccess('Source rebuilt (--skip-image: docker not touched)');
287
+ const hash = readBundleHash(cwd);
288
+ if (hash)
289
+ printInfo('Bundle hash', hash);
290
+ printTimings(timings);
291
+ return;
292
+ }
293
+ // Step f: docker image build.
294
+ const buildScript = path.join(cwd, 'packages/adapters/src/docker/build-host-cp.sh');
295
+ const imageResult = runStep('bash build-host-cp.sh', 'bash', [buildScript], { cwd });
296
+ timings.push({ label: 'docker image build', durationMs: imageResult.durationMs });
297
+ if (!imageResult.ok) {
298
+ printError(`Docker image build failed:\n${imageResult.stderr}`);
299
+ process.exitCode = 1;
300
+ return;
301
+ }
302
+ // Step g: docker compose up -d --force-recreate.
303
+ const composeFile = path.join(cwd, 'packages/host-cp/compose.yaml');
304
+ process.stdout.write(` ${pc.dim('docker compose recreate'.padEnd(34))}`);
305
+ const composeStart = Date.now();
306
+ const composeResult = runCompose(['up', '-d', '--force-recreate'], composeFile, buildComposeEnv(authSecret));
307
+ const composeDurationMs = Date.now() - composeStart;
308
+ const composeOk = composeResult.ok;
309
+ const composeDur = `${(composeDurationMs / 1000).toFixed(1)}s`;
310
+ process.stdout.write(`${composeOk ? pc.green('✓') : pc.red('✗')} ${composeDur}\n`);
311
+ timings.push({ label: 'container recreate', durationMs: composeDurationMs });
312
+ if (!composeOk) {
313
+ printError(`docker compose up --force-recreate failed:\n${composeResult.stderr}`);
314
+ process.exitCode = 1;
315
+ return;
316
+ }
317
+ // Step h: wait for /health.
318
+ process.stdout.write(` ${pc.dim('waiting for /health'.padEnd(34))}`);
319
+ const healthStart = Date.now();
320
+ const healthy = await waitForHealth(10_000);
321
+ const healthDurationMs = Date.now() - healthStart;
322
+ const healthDur = `${(healthDurationMs / 1000).toFixed(1)}s`;
323
+ process.stdout.write(`${healthy ? pc.green('✓') : pc.yellow('?')} ${healthDur}\n`);
324
+ timings.push({ label: '/health', durationMs: healthDurationMs });
325
+ if (!healthy) {
326
+ printWarning('Host CP started but /health did not respond within 10s. Check: docker logs olam-host-cp');
327
+ }
328
+ // 5. Summary.
329
+ process.stdout.write('\n');
330
+ printSuccess('Upgrade complete');
331
+ const hash = readBundleHash(cwd);
332
+ if (hash)
333
+ printInfo('Bundle hash', hash);
334
+ printTimings(timings);
335
+ }
336
+ function printTimings(timings) {
337
+ const total = timings.reduce((s, t) => s + t.durationMs, 0);
338
+ process.stdout.write('\n');
339
+ for (const t of timings) {
340
+ printInfo(t.label, `${(t.durationMs / 1000).toFixed(1)}s`);
341
+ }
342
+ printInfo('total', `${(total / 1000).toFixed(1)}s`);
343
+ }
344
+ // ── Register ──────────────────────────────────────────────────────
345
+ export function registerUpgrade(program) {
346
+ program
347
+ .command('upgrade')
348
+ .description('Self-upgrade the local Olam dev stack (pull + rebuild + restart host-cp)')
349
+ .option('-y, --yes', 'Skip the confirmation prompt')
350
+ .option('--skip-image', 'Skip docker image rebuild + container recreate (source rebuild only)')
351
+ .option('--skip-install', 'Skip npm install entirely (use existing node_modules as-is). ' +
352
+ 'Useful when a native-module build failure blocks the normal upgrade path.')
353
+ .option('--branch <name>', 'Switch to this branch before pulling (refuses if working tree is dirty)')
354
+ .action(async (opts) => {
355
+ await handleUpgrade(parseUpgradeOpts(opts));
356
+ });
357
+ }
358
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/commands/upgrade.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * olam workspace — manage the named catalog of repo bundles that
3
+ * worlds instantiate from.
4
+ *
5
+ * olam workspace list list all workspaces
6
+ * olam workspace add <name> [--from-config] create from repeated --repo flags
7
+ * [--repo url[:branch]]... or from the current project's
8
+ * [--default-branch <b>] .olam/config.yaml
9
+ * [--force]
10
+ * olam workspace show <name> pretty-print YAML
11
+ * olam workspace remove <name> [--force] delete a workspace
12
+ *
13
+ * Data at `~/.olam/workspaces/<name>.yaml`. Schema is the CF
14
+ * `Workspace` shape + `updatedAt` — see packages/core/src/workspace.
15
+ */
16
+ import type { Command } from 'commander';
17
+ export declare function registerWorkspace(program: Command): void;
18
+ /** Ensure a project-scoped workspace exists, called from `olam init`. */
19
+ export declare function ensureProjectWorkspaceFromConfig(projectRoot: string, workspaceName: string): {
20
+ created: boolean;
21
+ file: string;
22
+ };
23
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8HxD;AAED,yEAAyE;AACzE,wBAAgB,gCAAgC,CAC9C,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA6BpC"}
@@ -0,0 +1,198 @@
1
+ /**
2
+ * olam workspace — manage the named catalog of repo bundles that
3
+ * worlds instantiate from.
4
+ *
5
+ * olam workspace list list all workspaces
6
+ * olam workspace add <name> [--from-config] create from repeated --repo flags
7
+ * [--repo url[:branch]]... or from the current project's
8
+ * [--default-branch <b>] .olam/config.yaml
9
+ * [--force]
10
+ * olam workspace show <name> pretty-print YAML
11
+ * olam workspace remove <name> [--force] delete a workspace
12
+ *
13
+ * Data at `~/.olam/workspaces/<name>.yaml`. Schema is the CF
14
+ * `Workspace` shape + `updatedAt` — see packages/core/src/workspace.
15
+ */
16
+ import * as fs from 'node:fs';
17
+ import * as path from 'node:path';
18
+ import pc from 'picocolors';
19
+ import { stringify as stringifyYaml } from 'yaml';
20
+ import { listWorkspaces, readWorkspace, removeWorkspace, workspacesDir, writeWorkspace, WorkspaceExistsError, WorkspaceNameError, } from '@olam/core/src/workspace/index.js';
21
+ import { loadConfig } from '@olam/core/src/config/loader.js';
22
+ import { printError, printHeader, printInfo, printSuccess } from '../output.js';
23
+ function printWorkspaceNotFound(name) {
24
+ printError(`No workspace named "${name}" under ${workspacesDir()}`);
25
+ }
26
+ /**
27
+ * Parse `url` or `url#branch`. Using `#` (not `:`) as the branch
28
+ * separator because URLs legitimately contain `:` (`https://host:port/...`,
29
+ * `git@host:user/repo`) which makes `url:branch` ambiguous. `#` never
30
+ * appears in a repo URL, so this split is unambiguous.
31
+ */
32
+ function parseRepoFlag(raw) {
33
+ const hashIdx = raw.indexOf('#');
34
+ const url = hashIdx === -1 ? raw : raw.slice(0, hashIdx);
35
+ const branch = hashIdx === -1 ? undefined : raw.slice(hashIdx + 1);
36
+ if (url.length === 0)
37
+ throw new Error(`invalid --repo value "${raw}" (empty url)`);
38
+ if (branch !== undefined && branch.length === 0) {
39
+ throw new Error(`invalid --repo value "${raw}" (empty branch after #)`);
40
+ }
41
+ const nameFromUrl = url
42
+ .replace(/\.git$/, '')
43
+ .split(/[\/:]/)
44
+ .filter(Boolean)
45
+ .at(-1) ?? 'repo';
46
+ return branch ? { name: nameFromUrl, url, branch } : { name: nameFromUrl, url };
47
+ }
48
+ export function registerWorkspace(program) {
49
+ const workspace = program
50
+ .command('workspace')
51
+ .description('Manage the named catalog of repo bundles that worlds instantiate from');
52
+ workspace
53
+ .command('list')
54
+ .description('List all workspaces (name, repoCount, updatedAt)')
55
+ .action(() => {
56
+ const all = listWorkspaces();
57
+ if (all.length === 0) {
58
+ console.log(pc.dim(`No workspaces under ${workspacesDir()}`));
59
+ return;
60
+ }
61
+ printHeader(`${all.length} workspace(s)`);
62
+ for (const ws of all) {
63
+ const when = new Date(ws.updatedAt).toISOString().slice(0, 10);
64
+ console.log(` ${pc.bold(ws.name.padEnd(24))} ${String(ws.repos.length).padEnd(3)} repos ${pc.dim(when)}`);
65
+ }
66
+ });
67
+ workspace
68
+ .command('show')
69
+ .description('Show a workspace as YAML')
70
+ .argument('<name>', 'Workspace name')
71
+ .action((name) => {
72
+ try {
73
+ const ws = readWorkspace(name);
74
+ if (!ws) {
75
+ printWorkspaceNotFound(name);
76
+ process.exitCode = 1;
77
+ return;
78
+ }
79
+ process.stdout.write(stringifyYaml(ws));
80
+ }
81
+ catch (err) {
82
+ printError(err instanceof Error ? err.message : String(err));
83
+ process.exitCode = 1;
84
+ }
85
+ });
86
+ workspace
87
+ .command('remove')
88
+ .description('Delete a workspace (does NOT touch worlds that already referenced it)')
89
+ .argument('<name>', 'Workspace name')
90
+ .option('--force', 'Skip confirmation', false)
91
+ .action((name, _opts) => {
92
+ try {
93
+ if (removeWorkspace(name)) {
94
+ printSuccess(`Removed workspace "${name}"`);
95
+ }
96
+ else {
97
+ printWorkspaceNotFound(name);
98
+ process.exitCode = 1;
99
+ }
100
+ }
101
+ catch (err) {
102
+ printError(err instanceof Error ? err.message : String(err));
103
+ process.exitCode = 1;
104
+ }
105
+ });
106
+ workspace
107
+ .command('add')
108
+ .description('Create a workspace from --from-config (reads current .olam/config.yaml) or repeated --repo flags')
109
+ .argument('<name>', 'Workspace name')
110
+ .option('--from-config', 'Seed from the repos in the current project\'s .olam/config.yaml', false)
111
+ .option('--repo <url>', 'Repeatable. Format: <url> or <url>#<branch>', (val, acc) => {
112
+ acc.push(parseRepoFlag(val));
113
+ return acc;
114
+ }, [])
115
+ .option('--default-branch <branch>', 'Fallback branch for repos that don\'t specify one')
116
+ .option('--force', 'Overwrite an existing workspace with the same name', false)
117
+ .action((name, opts) => {
118
+ try {
119
+ const repos = [...opts.repo];
120
+ if (opts.fromConfig) {
121
+ try {
122
+ const cfg = loadConfig(process.cwd());
123
+ for (const r of cfg.repos) {
124
+ repos.push({
125
+ name: r.name,
126
+ url: r.url,
127
+ ...(r.submodules ? { submodules: true } : {}),
128
+ });
129
+ }
130
+ }
131
+ catch (err) {
132
+ printError(`--from-config: ${err instanceof Error ? err.message : String(err)}`);
133
+ process.exitCode = 1;
134
+ return;
135
+ }
136
+ }
137
+ if (repos.length === 0) {
138
+ printError('No repos provided — pass --from-config or at least one --repo');
139
+ process.exitCode = 1;
140
+ return;
141
+ }
142
+ const ws = {
143
+ name,
144
+ repos,
145
+ ...(opts.defaultBranch ? { defaults: { branch: opts.defaultBranch } } : {}),
146
+ updatedAt: Date.now(),
147
+ };
148
+ writeWorkspace(ws, { force: opts.force });
149
+ const file = path.join(workspacesDir(), `${name}.yaml`);
150
+ printSuccess(`Created workspace "${name}" (${repos.length} repo${repos.length === 1 ? '' : 's'})`);
151
+ printInfo('File', file);
152
+ printInfo('Next', `olam create --name <world> --workspace ${name} --task "..."`);
153
+ }
154
+ catch (err) {
155
+ if (err instanceof WorkspaceExistsError || err instanceof WorkspaceNameError) {
156
+ printError(err.message);
157
+ process.exitCode = 1;
158
+ return;
159
+ }
160
+ printError(err instanceof Error ? err.message : String(err));
161
+ process.exitCode = 1;
162
+ }
163
+ });
164
+ }
165
+ /** Ensure a project-scoped workspace exists, called from `olam init`. */
166
+ export function ensureProjectWorkspaceFromConfig(projectRoot, workspaceName) {
167
+ const existing = (() => {
168
+ try {
169
+ return readWorkspace(workspaceName);
170
+ }
171
+ catch {
172
+ return null;
173
+ }
174
+ })();
175
+ if (existing) {
176
+ return { created: false, file: path.join(workspacesDir(), `${workspaceName}.yaml`) };
177
+ }
178
+ // Derive repos from config.yaml at projectRoot — tolerant of read
179
+ // failure so init still works when config.yaml is minimal.
180
+ const cfg = loadConfig(projectRoot);
181
+ const repos = cfg.repos.map((r) => ({
182
+ name: r.name,
183
+ url: r.url,
184
+ ...(r.submodules ? { submodules: true } : {}),
185
+ }));
186
+ const ws = {
187
+ name: workspaceName,
188
+ repos,
189
+ updatedAt: Date.now(),
190
+ };
191
+ writeWorkspace(ws);
192
+ const file = path.join(workspacesDir(), `${workspaceName}.yaml`);
193
+ return { created: true, file };
194
+ }
195
+ // Silence "fs imported but unused" when caller builds a tree without
196
+ // touching fs directly.
197
+ void fs;
198
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/commands/workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * `olam world snapshot` — Phase A snapshot capture/list commands.
3
+ *
4
+ * Subcommands:
5
+ * create <worldId> --kind gems|node|pg|all
6
+ * Capture installed state (gems, node_modules, postgres data) from a
7
+ * running world into tarballs under ~/.olam/snapshots/<worldId>/.
8
+ * Writes a manifest JSON alongside each tarball.
9
+ *
10
+ * list [--world <id>]
11
+ * List captured snapshots with fingerprints, sizes, and ages.
12
+ *
13
+ * Phase B (auto-restore on create) and Phase C (eviction / auto-capture)
14
+ * are NOT wired here — they live in follow-up PRs.
15
+ */
16
+ import type { Command } from 'commander';
17
+ export declare function registerWorldSnapshot(program: Command): void;
18
+ //# sourceMappingURL=world-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world-snapshot.d.ts","sourceRoot":"","sources":["../../src/commands/world-snapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuBzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8B5D"}