@pleri/olam-cli 0.1.81 → 0.1.82

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.
@@ -0,0 +1,86 @@
1
+ /**
2
+ * olam implode — destroy ALL local olam global install + configs so the
3
+ * next `npm install -g @pleri/olam-cli` lands on a clean machine.
4
+ *
5
+ * Wipes (in order):
6
+ * 1. Docker containers matching `olam-*` (worlds first, then stack).
7
+ * 2. Docker images matching `olam-*:*` and `ghcr.io/pleri/olam-*:*`.
8
+ * 3. Docker volumes matching `olam-*`.
9
+ * 4. Docker networks matching `olam-*`.
10
+ * 5. The `~/.olam/` tree (worlds, vault, workspaces, cache, log).
11
+ * 6. The global npm package `@pleri/olam-cli` (last — the command
12
+ * uninstalls itself, so anything after this never runs).
13
+ *
14
+ * Default invocation is dry-run. `--yes` actually destroys after a
15
+ * typed-confirmation prompt ("type implode to proceed"). `--include-dirty`
16
+ * is REQUIRED if any world has uncommitted/unpushed work — the dirty list
17
+ * is printed so the operator can see what's about to disappear.
18
+ *
19
+ * NEVER touches:
20
+ * - `~/.claude/` (Claude Code operator config — not olam's).
21
+ * - Any project-level `.olam/` directories.
22
+ * - Repos in `~/Projects/`.
23
+ *
24
+ * The `--keep-X` flags scope the destruction. `--keep-images` skips step 2,
25
+ * `--keep-vault` preserves `~/.olam/auth-data/` while still wiping the rest
26
+ * of `~/.olam/`, `--keep-npm` skips step 6, etc.
27
+ */
28
+ import type { Command } from 'commander';
29
+ export interface ExecResult {
30
+ readonly exitCode: number;
31
+ readonly stdout: string;
32
+ readonly stderr: string;
33
+ }
34
+ export type ExecFn = (cmd: string, args: readonly string[]) => ExecResult;
35
+ export interface ImplodeOptions {
36
+ readonly yes: boolean;
37
+ readonly includeDirty: boolean;
38
+ readonly keepWorlds: boolean;
39
+ readonly keepImages: boolean;
40
+ readonly keepVault: boolean;
41
+ readonly keepNpm: boolean;
42
+ readonly keepVolumes: boolean;
43
+ readonly keepNetworks: boolean;
44
+ readonly json: boolean;
45
+ /** Test seam: skip the typed-confirmation prompt and use this answer. */
46
+ readonly confirmAnswer?: string;
47
+ /** Test seam: inject docker / npm exec calls. */
48
+ readonly exec?: ExecFn;
49
+ /** Test seam: override `~/.olam` for sandboxed runs. */
50
+ readonly olamHome?: string;
51
+ }
52
+ export interface WorldEntry {
53
+ readonly id: string;
54
+ readonly bytes: number;
55
+ readonly dirty: boolean;
56
+ readonly note: string;
57
+ readonly path: string;
58
+ }
59
+ export interface Survey {
60
+ readonly containers: readonly string[];
61
+ readonly images: readonly string[];
62
+ readonly volumes: readonly string[];
63
+ readonly networks: readonly string[];
64
+ readonly worlds: readonly WorldEntry[];
65
+ readonly homeBytesNonWorld: number;
66
+ readonly npmInstalled: boolean;
67
+ readonly npmGlobalRoot: string | null;
68
+ }
69
+ /**
70
+ * Build a complete survey of every olam-owned resource on the machine.
71
+ * Pure function — no destruction. Safe to call any time.
72
+ */
73
+ export declare function surveyOlam(opts?: {
74
+ exec?: ExecFn;
75
+ olamHome?: string;
76
+ }): Survey;
77
+ export declare function renderSurvey(survey: Survey, opts: ImplodeOptions): string;
78
+ export interface ImplodeResult {
79
+ readonly removed: string[];
80
+ readonly skipped: string[];
81
+ readonly errors: string[];
82
+ }
83
+ export declare function executeImplode(survey: Survey, opts: ImplodeOptions): Promise<ImplodeResult>;
84
+ export declare function registerImplode(program: Command): void;
85
+ export declare function runImplode(opts: ImplodeOptions): Promise<number>;
86
+ //# sourceMappingURL=implode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implode.d.ts","sourceRoot":"","sources":["../../src/commands/implode.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAOH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMzC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,UAAU,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,yEAAyE;IACzE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,iDAAiD;IACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AA0BD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,MAAM,CAyDlF;AA2FD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,MAAM,CAoDzE;AAWD,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,aAAa,CAAC,CA4GxB;AAqBD,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkCtD;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAoDtE"}
@@ -0,0 +1,468 @@
1
+ /**
2
+ * olam implode — destroy ALL local olam global install + configs so the
3
+ * next `npm install -g @pleri/olam-cli` lands on a clean machine.
4
+ *
5
+ * Wipes (in order):
6
+ * 1. Docker containers matching `olam-*` (worlds first, then stack).
7
+ * 2. Docker images matching `olam-*:*` and `ghcr.io/pleri/olam-*:*`.
8
+ * 3. Docker volumes matching `olam-*`.
9
+ * 4. Docker networks matching `olam-*`.
10
+ * 5. The `~/.olam/` tree (worlds, vault, workspaces, cache, log).
11
+ * 6. The global npm package `@pleri/olam-cli` (last — the command
12
+ * uninstalls itself, so anything after this never runs).
13
+ *
14
+ * Default invocation is dry-run. `--yes` actually destroys after a
15
+ * typed-confirmation prompt ("type implode to proceed"). `--include-dirty`
16
+ * is REQUIRED if any world has uncommitted/unpushed work — the dirty list
17
+ * is printed so the operator can see what's about to disappear.
18
+ *
19
+ * NEVER touches:
20
+ * - `~/.claude/` (Claude Code operator config — not olam's).
21
+ * - Any project-level `.olam/` directories.
22
+ * - Repos in `~/Projects/`.
23
+ *
24
+ * The `--keep-X` flags scope the destruction. `--keep-images` skips step 2,
25
+ * `--keep-vault` preserves `~/.olam/auth-data/` while still wiping the rest
26
+ * of `~/.olam/`, `--keep-npm` skips step 6, etc.
27
+ */
28
+ import { execFileSync } from 'node:child_process';
29
+ import * as fs from 'node:fs';
30
+ import * as os from 'node:os';
31
+ import * as path from 'node:path';
32
+ import { createInterface } from 'node:readline/promises';
33
+ import pc from 'picocolors';
34
+ import { printError, printHeader, printInfo, printSuccess, printWarning } from '../output.js';
35
+ // ────────────────────────────── Defaults ────────────────────────────────
36
+ const NPM_PACKAGE = '@pleri/olam-cli';
37
+ /** Real exec backed by `execFileSync`. Captures rc + stdout + stderr. */
38
+ const realExec = (cmd, args) => {
39
+ try {
40
+ const stdout = execFileSync(cmd, [...args], {
41
+ encoding: 'utf-8',
42
+ stdio: ['ignore', 'pipe', 'pipe'],
43
+ });
44
+ return { exitCode: 0, stdout, stderr: '' };
45
+ }
46
+ catch (err) {
47
+ const e = err;
48
+ return {
49
+ exitCode: e.status ?? 1,
50
+ stdout: typeof e.stdout === 'string' ? e.stdout : (e.stdout?.toString('utf-8') ?? ''),
51
+ stderr: typeof e.stderr === 'string' ? e.stderr : (e.stderr?.toString('utf-8') ?? ''),
52
+ };
53
+ }
54
+ };
55
+ // ────────────────────────────── Survey ──────────────────────────────────
56
+ /**
57
+ * Build a complete survey of every olam-owned resource on the machine.
58
+ * Pure function — no destruction. Safe to call any time.
59
+ */
60
+ export function surveyOlam(opts = {}) {
61
+ const exec = opts.exec ?? realExec;
62
+ const home = opts.olamHome ?? path.join(os.homedir(), '.olam');
63
+ // Docker resources — group by prefix. We use --format to keep output
64
+ // parseable; --filter name= matches as a substring so we tighten with
65
+ // a startsWith check after the fact.
66
+ const containers = listDocker(exec, ['ps', '-a', '--format', '{{.Names}}']).filter((n) => n.startsWith('olam-'));
67
+ const images = listDocker(exec, ['images', '--format', '{{.Repository}}:{{.Tag}}']).filter((ref) => ref.startsWith('olam-') ||
68
+ ref.startsWith('ghcr.io/pleri/olam-') ||
69
+ ref.startsWith('ghcr.io/pleri/olam'));
70
+ const volumes = listDocker(exec, ['volume', 'ls', '--format', '{{.Name}}']).filter((n) => n.startsWith('olam-'));
71
+ const networks = listDocker(exec, ['network', 'ls', '--format', '{{.Name}}']).filter((n) => n.startsWith('olam-') && n !== 'olam-host-cp-internal-default');
72
+ // Worlds — each ~/.olam/worlds/<id>/ subdir, with size + dirty check.
73
+ const worlds = [];
74
+ const worldsDir = path.join(home, 'worlds');
75
+ if (fs.existsSync(worldsDir)) {
76
+ for (const entry of fs.readdirSync(worldsDir, { withFileTypes: true })) {
77
+ if (!entry.isDirectory())
78
+ continue;
79
+ const wPath = path.join(worldsDir, entry.name);
80
+ const bytes = dirSize(wPath);
81
+ const { dirty, note } = inspectWorldGitState(wPath);
82
+ worlds.push({ id: entry.name, bytes, dirty, note, path: wPath });
83
+ }
84
+ }
85
+ // ~/.olam/* size minus worlds (which we count separately so reviewers
86
+ // can see how much data is in the vault / cache vs in worlds).
87
+ const homeBytesNonWorld = fs.existsSync(home)
88
+ ? Math.max(0, dirSize(home) - worlds.reduce((acc, w) => acc + w.bytes, 0))
89
+ : 0;
90
+ // npm: is the package installed globally? Where?
91
+ const npmRoot = exec('npm', ['root', '-g']);
92
+ const npmGlobalRoot = npmRoot.exitCode === 0 ? npmRoot.stdout.trim() : null;
93
+ const npmInstalled = npmGlobalRoot !== null && fs.existsSync(path.join(npmGlobalRoot, NPM_PACKAGE));
94
+ return {
95
+ containers,
96
+ images,
97
+ volumes,
98
+ networks,
99
+ worlds,
100
+ homeBytesNonWorld,
101
+ npmInstalled,
102
+ npmGlobalRoot,
103
+ };
104
+ }
105
+ function listDocker(exec, args) {
106
+ const r = exec('docker', args);
107
+ if (r.exitCode !== 0)
108
+ return [];
109
+ return r.stdout
110
+ .split('\n')
111
+ .map((s) => s.trim())
112
+ .filter((s) => s.length > 0);
113
+ }
114
+ function dirSize(p) {
115
+ let total = 0;
116
+ try {
117
+ const stack = [p];
118
+ while (stack.length > 0) {
119
+ const cur = stack.pop();
120
+ let entries;
121
+ try {
122
+ entries = fs.readdirSync(cur, { withFileTypes: true });
123
+ }
124
+ catch {
125
+ continue;
126
+ }
127
+ for (const e of entries) {
128
+ const full = path.join(cur, e.name);
129
+ try {
130
+ if (e.isDirectory())
131
+ stack.push(full);
132
+ else if (e.isFile())
133
+ total += fs.statSync(full).size;
134
+ }
135
+ catch {
136
+ // Skip unreadable entries.
137
+ }
138
+ }
139
+ }
140
+ }
141
+ catch {
142
+ // Ignored.
143
+ }
144
+ return total;
145
+ }
146
+ function inspectWorldGitState(worldPath) {
147
+ // A world is "dirty" if any of its repos has uncommitted or unpushed
148
+ // changes. Cheap check: look for repo subdirs with .git, run a
149
+ // `git status --porcelain` + `git rev-list @{upstream}..HEAD` per repo.
150
+ const repoNotes = [];
151
+ let dirty = false;
152
+ try {
153
+ for (const entry of fs.readdirSync(worldPath, { withFileTypes: true })) {
154
+ if (!entry.isDirectory())
155
+ continue;
156
+ const repo = path.join(worldPath, entry.name);
157
+ const gitDir = path.join(repo, '.git');
158
+ if (!fs.existsSync(gitDir))
159
+ continue;
160
+ try {
161
+ const status = execFileSync('git', ['status', '--porcelain'], {
162
+ cwd: repo,
163
+ encoding: 'utf-8',
164
+ stdio: ['ignore', 'pipe', 'ignore'],
165
+ }).trim();
166
+ if (status.length > 0) {
167
+ dirty = true;
168
+ repoNotes.push(`${entry.name}: uncommitted`);
169
+ continue;
170
+ }
171
+ }
172
+ catch {
173
+ // Skip repos that aren't real worktrees.
174
+ continue;
175
+ }
176
+ try {
177
+ const ahead = execFileSync('git', ['rev-list', '--count', '@{upstream}..HEAD'], { cwd: repo, encoding: 'utf-8', stdio: ['ignore', 'pipe', 'ignore'] }).trim();
178
+ if (ahead && ahead !== '0') {
179
+ dirty = true;
180
+ repoNotes.push(`${entry.name}: ${ahead} unpushed`);
181
+ }
182
+ }
183
+ catch {
184
+ // No upstream — count as dirty so unpushed local commits aren't
185
+ // silently destroyed.
186
+ dirty = true;
187
+ repoNotes.push(`${entry.name}: no-upstream`);
188
+ }
189
+ }
190
+ }
191
+ catch {
192
+ // Worldwise read failure — surface as a note but don't claim dirty.
193
+ }
194
+ return { dirty, note: repoNotes.join('; ') };
195
+ }
196
+ // ────────────────────────────── Render ──────────────────────────────────
197
+ export function renderSurvey(survey, opts) {
198
+ if (opts.json) {
199
+ return JSON.stringify({
200
+ containers: survey.containers,
201
+ images: survey.images,
202
+ volumes: survey.volumes,
203
+ networks: survey.networks,
204
+ worlds: survey.worlds.map((w) => ({
205
+ id: w.id,
206
+ bytes: w.bytes,
207
+ dirty: w.dirty,
208
+ note: w.note,
209
+ })),
210
+ homeBytesNonWorld: survey.homeBytesNonWorld,
211
+ npmInstalled: survey.npmInstalled,
212
+ npmGlobalRoot: survey.npmGlobalRoot,
213
+ }, null, 2);
214
+ }
215
+ const lines = [];
216
+ const dirtyWorlds = survey.worlds.filter((w) => w.dirty);
217
+ const cleanWorlds = survey.worlds.filter((w) => !w.dirty);
218
+ const worldBytes = survey.worlds.reduce((acc, w) => acc + w.bytes, 0);
219
+ lines.push(pc.bold(pc.red('— olam implode survey —')));
220
+ lines.push('');
221
+ lines.push(` containers (olam-*): ${survey.containers.length}`);
222
+ lines.push(` images: ${survey.images.length}`);
223
+ lines.push(` volumes: ${survey.volumes.length}`);
224
+ lines.push(` networks: ${survey.networks.length}`);
225
+ lines.push(` worlds: ${survey.worlds.length} (${dirtyWorlds.length} dirty, ${cleanWorlds.length} clean)`);
226
+ lines.push(` ~/.olam/* (non-world): ${formatBytes(survey.homeBytesNonWorld)}`);
227
+ lines.push(` worlds total: ${formatBytes(worldBytes)}`);
228
+ lines.push(` npm package installed: ${survey.npmInstalled ? `yes (at ${survey.npmGlobalRoot}/${NPM_PACKAGE})` : 'no'}`);
229
+ if (dirtyWorlds.length > 0) {
230
+ lines.push('');
231
+ lines.push(pc.yellow(` ⚠ dirty worlds (${dirtyWorlds.length}) — pass --include-dirty to destroy:`));
232
+ for (const w of dirtyWorlds) {
233
+ lines.push(` - ${w.id} ${formatBytes(w.bytes)} (${w.note})`);
234
+ }
235
+ }
236
+ lines.push('');
237
+ lines.push(pc.dim(' Run with --yes to actually destroy. Default is dry-run.'));
238
+ return lines.join('\n');
239
+ }
240
+ function formatBytes(n) {
241
+ if (n < 1024)
242
+ return `${n} B`;
243
+ if (n < 1024 * 1024)
244
+ return `${(n / 1024).toFixed(1)} KB`;
245
+ if (n < 1024 * 1024 * 1024)
246
+ return `${(n / 1024 / 1024).toFixed(1)} MB`;
247
+ return `${(n / 1024 / 1024 / 1024).toFixed(2)} GB`;
248
+ }
249
+ export async function executeImplode(survey, opts) {
250
+ const exec = opts.exec ?? realExec;
251
+ const home = opts.olamHome ?? path.join(os.homedir(), '.olam');
252
+ const removed = [];
253
+ const skipped = [];
254
+ const errors = [];
255
+ // Step 1: stop + remove containers (worlds first so the host-cp
256
+ // socket-proxy chain stays alive long enough to kill them gracefully).
257
+ if (!opts.keepWorlds) {
258
+ const sortedContainers = [...survey.containers].sort((a, b) => {
259
+ const aWorld = isWorldContainer(a);
260
+ const bWorld = isWorldContainer(b);
261
+ if (aWorld && !bWorld)
262
+ return -1;
263
+ if (!aWorld && bWorld)
264
+ return 1;
265
+ return 0;
266
+ });
267
+ for (const name of sortedContainers) {
268
+ const r = exec('docker', ['rm', '-f', name]);
269
+ if (r.exitCode === 0)
270
+ removed.push(`container:${name}`);
271
+ else
272
+ errors.push(`container:${name}: ${r.stderr.trim()}`);
273
+ }
274
+ }
275
+ else {
276
+ for (const c of survey.containers)
277
+ skipped.push(`container:${c}`);
278
+ }
279
+ // Step 2: images.
280
+ if (!opts.keepImages) {
281
+ for (const ref of survey.images) {
282
+ // Skip images that are still in use by a kept container.
283
+ const r = exec('docker', ['rmi', '-f', ref]);
284
+ if (r.exitCode === 0)
285
+ removed.push(`image:${ref}`);
286
+ else
287
+ errors.push(`image:${ref}: ${r.stderr.trim()}`);
288
+ }
289
+ }
290
+ else {
291
+ for (const i of survey.images)
292
+ skipped.push(`image:${i}`);
293
+ }
294
+ // Step 3: volumes.
295
+ if (!opts.keepVolumes && !opts.keepVault) {
296
+ for (const v of survey.volumes) {
297
+ const r = exec('docker', ['volume', 'rm', '-f', v]);
298
+ if (r.exitCode === 0)
299
+ removed.push(`volume:${v}`);
300
+ else
301
+ errors.push(`volume:${v}: ${r.stderr.trim()}`);
302
+ }
303
+ }
304
+ else if (opts.keepVault) {
305
+ // Vault preservation: keep olam-auth-data + olam-mcp-auth-data, drop the rest.
306
+ for (const v of survey.volumes) {
307
+ if (v === 'olam-auth-data' || v === 'olam-mcp-auth-data') {
308
+ skipped.push(`volume:${v} (--keep-vault)`);
309
+ continue;
310
+ }
311
+ const r = exec('docker', ['volume', 'rm', '-f', v]);
312
+ if (r.exitCode === 0)
313
+ removed.push(`volume:${v}`);
314
+ else
315
+ errors.push(`volume:${v}: ${r.stderr.trim()}`);
316
+ }
317
+ }
318
+ else {
319
+ for (const v of survey.volumes)
320
+ skipped.push(`volume:${v}`);
321
+ }
322
+ // Step 4: networks.
323
+ if (!opts.keepNetworks) {
324
+ for (const n of survey.networks) {
325
+ const r = exec('docker', ['network', 'rm', n]);
326
+ if (r.exitCode === 0)
327
+ removed.push(`network:${n}`);
328
+ else
329
+ errors.push(`network:${n}: ${r.stderr.trim()}`);
330
+ }
331
+ }
332
+ else {
333
+ for (const n of survey.networks)
334
+ skipped.push(`network:${n}`);
335
+ }
336
+ // Step 5: ~/.olam/ tree. Selective when --keep-vault.
337
+ if (fs.existsSync(home)) {
338
+ if (opts.keepVault) {
339
+ // Wipe everything under ~/.olam/ except auth-data.
340
+ for (const entry of fs.readdirSync(home, { withFileTypes: true })) {
341
+ if (entry.name === 'auth-data') {
342
+ skipped.push(`fs:~/.olam/auth-data (--keep-vault)`);
343
+ continue;
344
+ }
345
+ const target = path.join(home, entry.name);
346
+ try {
347
+ fs.rmSync(target, { recursive: true, force: true });
348
+ removed.push(`fs:${target}`);
349
+ }
350
+ catch (err) {
351
+ errors.push(`fs:${target}: ${err.message}`);
352
+ }
353
+ }
354
+ }
355
+ else {
356
+ try {
357
+ fs.rmSync(home, { recursive: true, force: true });
358
+ removed.push(`fs:${home}`);
359
+ }
360
+ catch (err) {
361
+ errors.push(`fs:${home}: ${err.message}`);
362
+ }
363
+ }
364
+ }
365
+ // Step 6: npm package — last, since it removes this command itself.
366
+ if (!opts.keepNpm && survey.npmInstalled) {
367
+ const r = exec('npm', ['uninstall', '-g', NPM_PACKAGE]);
368
+ if (r.exitCode === 0)
369
+ removed.push(`npm:${NPM_PACKAGE}`);
370
+ else
371
+ errors.push(`npm:${NPM_PACKAGE}: ${r.stderr.trim()}`);
372
+ }
373
+ else if (opts.keepNpm) {
374
+ skipped.push(`npm:${NPM_PACKAGE}`);
375
+ }
376
+ return { removed, skipped, errors };
377
+ }
378
+ function isWorldContainer(name) {
379
+ // World containers look like `olam-<world-id>-devbox` or `olam-<world-id>-cp`.
380
+ // Stack containers are exactly `olam-host-cp`, `olam-auth`, `olam-mcp-auth`,
381
+ // `olam-docker-socket-proxy`.
382
+ const stack = new Set(['olam-host-cp', 'olam-auth', 'olam-mcp-auth', 'olam-docker-socket-proxy']);
383
+ return !stack.has(name);
384
+ }
385
+ // ────────────────────────────── Confirm prompt ───────────────────────────
386
+ async function readConfirmation() {
387
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
388
+ const answer = await rl.question('Type "implode" to proceed: ');
389
+ rl.close();
390
+ return answer.trim();
391
+ }
392
+ // ────────────────────────────── Command wiring ───────────────────────────
393
+ export function registerImplode(program) {
394
+ program
395
+ .command('implode')
396
+ .description('Destroy ALL local olam install + configs (containers, images, volumes, ~/.olam/, npm package). Default is dry-run.')
397
+ .option('-y, --yes', 'Actually destroy (default is dry-run)', false)
398
+ .option('--include-dirty', 'Also destroy worlds with uncommitted/unpushed work', false)
399
+ .option('--keep-worlds', 'Skip world container destruction', false)
400
+ .option('--keep-images', 'Skip docker image removal', false)
401
+ .option('--keep-vault', 'Preserve auth-service credentials (~/.olam/auth-data + olam-*-data volumes)', false)
402
+ .option('--keep-npm', 'Skip global npm package uninstall', false)
403
+ .option('--keep-volumes', 'Skip docker volume removal', false)
404
+ .option('--keep-networks', 'Skip docker network removal', false)
405
+ .option('--json', 'Emit machine-readable JSON survey', false)
406
+ .action(async (raw) => {
407
+ const opts = {
408
+ yes: raw.yes === true,
409
+ includeDirty: raw.includeDirty === true,
410
+ keepWorlds: raw.keepWorlds === true,
411
+ keepImages: raw.keepImages === true,
412
+ keepVault: raw.keepVault === true,
413
+ keepNpm: raw.keepNpm === true,
414
+ keepVolumes: raw.keepVolumes === true,
415
+ keepNetworks: raw.keepNetworks === true,
416
+ json: raw.json === true,
417
+ };
418
+ const exitCode = await runImplode(opts);
419
+ process.exitCode = exitCode;
420
+ });
421
+ }
422
+ export async function runImplode(opts) {
423
+ const survey = surveyOlam({ exec: opts.exec, olamHome: opts.olamHome });
424
+ if (opts.json && !opts.yes) {
425
+ process.stdout.write(renderSurvey(survey, opts) + '\n');
426
+ return 0;
427
+ }
428
+ if (!opts.yes) {
429
+ process.stdout.write(renderSurvey(survey, opts) + '\n');
430
+ return 0;
431
+ }
432
+ // --yes path: hard checks before destruction.
433
+ const dirty = survey.worlds.filter((w) => w.dirty);
434
+ if (dirty.length > 0 && !opts.includeDirty && !opts.keepWorlds) {
435
+ printError(`Refusing to destroy ${dirty.length} world(s) with uncommitted/unpushed work. Pass --include-dirty to override or --keep-worlds to skip world destruction.`);
436
+ for (const w of dirty) {
437
+ process.stderr.write(` - ${w.id} (${w.note})\n`);
438
+ }
439
+ return 2;
440
+ }
441
+ process.stdout.write(renderSurvey(survey, opts) + '\n');
442
+ printWarning('This will permanently destroy the resources listed above.');
443
+ printInfo('Project files', '~/Projects/* and ~/.claude/ are NOT touched.');
444
+ const answer = opts.confirmAnswer ?? (await readConfirmation());
445
+ if (answer !== 'implode') {
446
+ printError(`Confirmation failed (got "${answer}", expected "implode"). Aborting.`);
447
+ return 3;
448
+ }
449
+ printHeader('Imploding olam');
450
+ const result = await executeImplode(survey, opts);
451
+ for (const r of result.removed)
452
+ printSuccess(`removed ${r}`);
453
+ for (const s of result.skipped)
454
+ printInfo('skipped', s);
455
+ for (const e of result.errors)
456
+ printError(e);
457
+ printHeader('Implode complete');
458
+ printInfo('Removed', String(result.removed.length));
459
+ printInfo('Skipped', String(result.skipped.length));
460
+ printInfo('Errors', String(result.errors.length));
461
+ process.stdout.write('\n');
462
+ process.stdout.write(`To reinstall a fresh copy:\n`);
463
+ process.stdout.write(` ${pc.cyan(`npm install -g ${NPM_PACKAGE}`)}\n`);
464
+ process.stdout.write(` ${pc.cyan('olam init')}\n`);
465
+ process.stdout.write(` ${pc.cyan('olam auth login')}\n`);
466
+ return result.errors.length > 0 ? 1 : 0;
467
+ }
468
+ //# sourceMappingURL=implode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implode.js","sourceRoot":"","sources":["../../src/commands/implode.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "auth": "sha256:ee6b1d1046933c76acc8d28cd83ac3871bc69057d2401014252872dc5ec42db7",
3
- "devbox": "sha256:bffba99ffb7ecaa7038bf1bed4de1a17e34ad90ce956cf5b25855ea13900b668",
4
- "host-cp": "sha256:bd752b9631b1f593573c51e76bd7488d86527e822a9f4f53d1f16d43ecab4c75",
3
+ "devbox": "sha256:0b7a8ed93e55bec3cd12351689a6213daa87a9fc7531b9dfcfb0513ba62add61",
4
+ "host-cp": "sha256:ab8540c92b84b0fff082d9221b0792f0ccdfe7053143be261122b148501b0fc6",
5
5
  "mcp-auth": "sha256:e47169ad3fbc9cab216248fecbc56874343a5daab84b1f18d67529b7d415cf95",
6
6
  "$schema_version": 1,
7
- "$published_version": "0.1.81",
7
+ "$published_version": "0.1.82",
8
8
  "$registry": "ghcr.io/pleri"
9
9
  }