@pleri/olam-cli 0.1.145 → 0.1.147

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 (90) hide show
  1. package/dist/commands/skills-doctor.d.ts +14 -0
  2. package/dist/commands/skills-doctor.d.ts.map +1 -0
  3. package/dist/commands/skills-doctor.js +126 -0
  4. package/dist/commands/skills-doctor.js.map +1 -0
  5. package/dist/commands/skills-hook.d.ts +19 -0
  6. package/dist/commands/skills-hook.d.ts.map +1 -0
  7. package/dist/commands/skills-hook.js +99 -0
  8. package/dist/commands/skills-hook.js.map +1 -0
  9. package/dist/commands/skills-migrate-back.d.ts +21 -0
  10. package/dist/commands/skills-migrate-back.d.ts.map +1 -0
  11. package/dist/commands/skills-migrate-back.js +222 -0
  12. package/dist/commands/skills-migrate-back.js.map +1 -0
  13. package/dist/commands/skills-migrate-hooks-back.d.ts +19 -0
  14. package/dist/commands/skills-migrate-hooks-back.d.ts.map +1 -0
  15. package/dist/commands/skills-migrate-hooks-back.js +83 -0
  16. package/dist/commands/skills-migrate-hooks-back.js.map +1 -0
  17. package/dist/commands/skills-migrate-hooks.d.ts +40 -0
  18. package/dist/commands/skills-migrate-hooks.d.ts.map +1 -0
  19. package/dist/commands/skills-migrate-hooks.js +178 -0
  20. package/dist/commands/skills-migrate-hooks.js.map +1 -0
  21. package/dist/commands/skills-migrate.d.ts +33 -0
  22. package/dist/commands/skills-migrate.d.ts.map +1 -0
  23. package/dist/commands/skills-migrate.js +216 -0
  24. package/dist/commands/skills-migrate.js.map +1 -0
  25. package/dist/commands/skills-onboard.d.ts +26 -0
  26. package/dist/commands/skills-onboard.d.ts.map +1 -0
  27. package/dist/commands/skills-onboard.js +227 -0
  28. package/dist/commands/skills-onboard.js.map +1 -0
  29. package/dist/commands/skills-shadow-backups.d.ts +15 -0
  30. package/dist/commands/skills-shadow-backups.d.ts.map +1 -0
  31. package/dist/commands/skills-shadow-backups.js +132 -0
  32. package/dist/commands/skills-shadow-backups.js.map +1 -0
  33. package/dist/commands/skills-source.d.ts +25 -0
  34. package/dist/commands/skills-source.d.ts.map +1 -1
  35. package/dist/commands/skills-source.js +305 -7
  36. package/dist/commands/skills-source.js.map +1 -1
  37. package/dist/commands/skills.d.ts.map +1 -1
  38. package/dist/commands/skills.js +62 -7
  39. package/dist/commands/skills.js.map +1 -1
  40. package/dist/commands/substrate-audit-log.d.ts +49 -0
  41. package/dist/commands/substrate-audit-log.d.ts.map +1 -0
  42. package/dist/commands/substrate-audit-log.js +148 -0
  43. package/dist/commands/substrate-audit-log.js.map +1 -0
  44. package/dist/commands/substrate.d.ts +60 -0
  45. package/dist/commands/substrate.d.ts.map +1 -0
  46. package/dist/commands/substrate.js +175 -0
  47. package/dist/commands/substrate.js.map +1 -0
  48. package/dist/commands/upgrade.d.ts +10 -0
  49. package/dist/commands/upgrade.d.ts.map +1 -1
  50. package/dist/commands/upgrade.js +30 -0
  51. package/dist/commands/upgrade.js.map +1 -1
  52. package/dist/image-digests.json +7 -7
  53. package/dist/index.js +8687 -4713
  54. package/dist/index.js.map +1 -1
  55. package/dist/lib/config.d.ts +69 -0
  56. package/dist/lib/config.d.ts.map +1 -0
  57. package/dist/lib/config.js +146 -0
  58. package/dist/lib/config.js.map +1 -0
  59. package/dist/lib/instrumentation.d.ts +85 -0
  60. package/dist/lib/instrumentation.d.ts.map +1 -0
  61. package/dist/lib/instrumentation.js +104 -0
  62. package/dist/lib/instrumentation.js.map +1 -0
  63. package/dist/lib/kubectl-wrap.d.ts +59 -0
  64. package/dist/lib/kubectl-wrap.d.ts.map +1 -0
  65. package/dist/lib/kubectl-wrap.js +130 -0
  66. package/dist/lib/kubectl-wrap.js.map +1 -0
  67. package/dist/lib/manifest-refresh.d.ts +95 -0
  68. package/dist/lib/manifest-refresh.d.ts.map +1 -0
  69. package/dist/lib/manifest-refresh.js +222 -0
  70. package/dist/lib/manifest-refresh.js.map +1 -0
  71. package/dist/lib/port-forward.d.ts +101 -0
  72. package/dist/lib/port-forward.d.ts.map +1 -0
  73. package/dist/lib/port-forward.js +240 -0
  74. package/dist/lib/port-forward.js.map +1 -0
  75. package/dist/lib/upgrade-kubernetes.d.ts +77 -0
  76. package/dist/lib/upgrade-kubernetes.d.ts.map +1 -0
  77. package/dist/lib/upgrade-kubernetes.js +277 -0
  78. package/dist/lib/upgrade-kubernetes.js.map +1 -0
  79. package/dist/mcp-server.js +20262 -18211
  80. package/host-cp/k8s/manifests/00-namespace.yaml +7 -0
  81. package/host-cp/k8s/manifests/10-serviceaccount.yaml +8 -0
  82. package/host-cp/k8s/manifests/20-rbac.yaml +34 -0
  83. package/host-cp/k8s/manifests/30-configmap.yaml +30 -0
  84. package/host-cp/k8s/manifests/45-pvc.yaml +27 -0
  85. package/host-cp/k8s/manifests/50-deployment.yaml +148 -0
  86. package/host-cp/k8s/manifests/60-service.yaml +22 -0
  87. package/host-cp/k8s/templates/40-secret-template.yaml +32 -0
  88. package/host-cp/src/plan-chat-service.mjs +31 -7
  89. package/host-cp/src/server.mjs +32 -7
  90. package/package.json +3 -2
@@ -0,0 +1,14 @@
1
+ /**
2
+ * olam skills doctor — diagnostic + auto-repair for the skills surface.
3
+ *
4
+ * olam skills doctor # print report; interactive prompts
5
+ * # per issue when TTY
6
+ * olam skills doctor --auto-fix # apply every repair without prompt
7
+ * olam skills doctor --check-only # exit 1 on any issue; never modify
8
+ * # state (read-only health probe)
9
+ *
10
+ * Mirrors `olam kg doctor`'s shape; per OQ12 [assumed].
11
+ */
12
+ import type { Command } from 'commander';
13
+ export declare function registerSkillsDoctor(program: Command): void;
14
+ //# sourceMappingURL=skills-doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-doctor.d.ts","sourceRoot":"","sources":["../../src/commands/skills-doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgDzC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6E3D"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * olam skills doctor — diagnostic + auto-repair for the skills surface.
3
+ *
4
+ * olam skills doctor # print report; interactive prompts
5
+ * # per issue when TTY
6
+ * olam skills doctor --auto-fix # apply every repair without prompt
7
+ * olam skills doctor --check-only # exit 1 on any issue; never modify
8
+ * # state (read-only health probe)
9
+ *
10
+ * Mirrors `olam kg doctor`'s shape; per OQ12 [assumed].
11
+ */
12
+ import * as readline from 'node:readline';
13
+ import pc from 'picocolors';
14
+ import { runAllDoctorChecks, } from '@olam/core/src/skill-sources/index.js';
15
+ import { printError, printHeader, printSuccess, printWarning } from '../output.js';
16
+ function asMessage(err) {
17
+ return err instanceof Error ? err.message : String(err);
18
+ }
19
+ function defaultDoctorPrompt(question) {
20
+ return new Promise((resolve) => {
21
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
22
+ rl.question(question, (a) => {
23
+ rl.close();
24
+ resolve(a);
25
+ });
26
+ });
27
+ }
28
+ async function confirmRepair(check) {
29
+ const testFn = globalThis.__olamTestDoctorPrompt;
30
+ const prompt = testFn ?? (() => defaultDoctorPrompt(`Apply repair for "${check.name}"? [y/N] `));
31
+ const answer = (await prompt()).trim().toLowerCase();
32
+ return answer === 'y' || answer === 'yes';
33
+ }
34
+ function printCheck(check) {
35
+ if (check.healthy) {
36
+ console.log(` ${pc.green('✓')} ${pc.bold(check.name.padEnd(22))} ${pc.dim(check.description)}`);
37
+ if (check.details && check.details.length > 0) {
38
+ for (const d of check.details)
39
+ console.log(` ${pc.dim(d)}`);
40
+ }
41
+ }
42
+ else {
43
+ console.log(` ${pc.red('✗')} ${pc.bold(check.name.padEnd(22))} ${pc.yellow(check.issue ?? 'unhealthy')}`);
44
+ console.log(` ${pc.dim(check.description)}`);
45
+ if (check.details) {
46
+ for (const d of check.details.slice(0, 10))
47
+ console.log(` ${pc.dim('· ' + d)}`);
48
+ if (check.details.length > 10)
49
+ console.log(` ${pc.dim(`… and ${check.details.length - 10} more`)}`);
50
+ }
51
+ }
52
+ }
53
+ export function registerSkillsDoctor(program) {
54
+ const skills = program.commands.find((c) => c.name() === 'skills') ??
55
+ program.command('skills').description('Manage skill sources and synchronization');
56
+ skills
57
+ .command('doctor')
58
+ .description('Diagnose 4 corruption classes; auto-repair available with --auto-fix')
59
+ .option('--auto-fix', 'Apply each repair without prompting')
60
+ .option('--check-only', 'Report issues + exit non-zero without modifying state')
61
+ .action(async (opts) => {
62
+ if (opts.autoFix && opts.checkOnly) {
63
+ printError('--auto-fix and --check-only are mutually exclusive');
64
+ process.exitCode = 1;
65
+ return;
66
+ }
67
+ printHeader('skills doctor');
68
+ let checks;
69
+ try {
70
+ checks = runAllDoctorChecks();
71
+ }
72
+ catch (err) {
73
+ printError(`doctor checks crashed: ${asMessage(err)}`);
74
+ process.exitCode = 1;
75
+ return;
76
+ }
77
+ for (const c of checks)
78
+ printCheck(c);
79
+ const unhealthy = checks.filter((c) => !c.healthy);
80
+ if (unhealthy.length === 0) {
81
+ console.log();
82
+ printSuccess('all 4 checks PASS');
83
+ return;
84
+ }
85
+ console.log();
86
+ printWarning(`${unhealthy.length} of ${checks.length} check(s) report issues`);
87
+ if (opts.checkOnly) {
88
+ console.log(pc.dim('(--check-only — exiting without repair)'));
89
+ process.exitCode = 1;
90
+ return;
91
+ }
92
+ let repaired = 0;
93
+ let skipped = 0;
94
+ for (const check of unhealthy) {
95
+ if (!check.repair) {
96
+ console.log(pc.dim(` (no auto-repair for ${check.name} — operator-attention required)`));
97
+ skipped += 1;
98
+ continue;
99
+ }
100
+ const shouldRepair = opts.autoFix ? true : await confirmRepair(check);
101
+ if (!shouldRepair) {
102
+ console.log(pc.dim(` skipped: ${check.name}`));
103
+ skipped += 1;
104
+ continue;
105
+ }
106
+ try {
107
+ await check.repair();
108
+ console.log(pc.green(` repaired: ${check.name}`));
109
+ repaired += 1;
110
+ }
111
+ catch (err) {
112
+ printError(` repair failed for ${check.name}: ${asMessage(err)}`);
113
+ skipped += 1;
114
+ }
115
+ }
116
+ console.log();
117
+ if (skipped > 0) {
118
+ printWarning(`repaired ${repaired}; skipped ${skipped}. Re-run doctor to verify.`);
119
+ process.exitCode = skipped > 0 ? 1 : 0;
120
+ }
121
+ else {
122
+ printSuccess(`repaired ${repaired} issue(s). Re-run doctor to verify.`);
123
+ }
124
+ });
125
+ }
126
+ //# sourceMappingURL=skills-doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-doctor.js","sourceRoot":"","sources":["../../src/commands/skills-doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `olam skills install-hook [--scope project|user]` — install the
3
+ * SessionStart hook that runs `olam skills sync --quiet` on every
4
+ * Claude Code session start.
5
+ *
6
+ * `olam skills uninstall-hook [--scope project|user]` — surgical
7
+ * sentinel-matched removal.
8
+ *
9
+ * Mirrors `olam kg install-hook` / `olam kg uninstall-hook` shape:
10
+ * - `--scope project` (default) → <cwd>/.claude/settings.json
11
+ * - `--scope user` → ~/.claude/settings.json
12
+ *
13
+ * Idempotent install via OLAM_SKILLS_HOOK_SENTINEL substring-match.
14
+ * Surgical uninstall: only entries whose command contains the sentinel
15
+ * are dropped; user-authored hooks are preserved.
16
+ */
17
+ import type { Command } from 'commander';
18
+ export declare function registerSkillsHook(program: Command): void;
19
+ //# sourceMappingURL=skills-hook.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-hook.d.ts","sourceRoot":"","sources":["../../src/commands/skills-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuEzD"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * `olam skills install-hook [--scope project|user]` — install the
3
+ * SessionStart hook that runs `olam skills sync --quiet` on every
4
+ * Claude Code session start.
5
+ *
6
+ * `olam skills uninstall-hook [--scope project|user]` — surgical
7
+ * sentinel-matched removal.
8
+ *
9
+ * Mirrors `olam kg install-hook` / `olam kg uninstall-hook` shape:
10
+ * - `--scope project` (default) → <cwd>/.claude/settings.json
11
+ * - `--scope user` → ~/.claude/settings.json
12
+ *
13
+ * Idempotent install via OLAM_SKILLS_HOOK_SENTINEL substring-match.
14
+ * Surgical uninstall: only entries whose command contains the sentinel
15
+ * are dropped; user-authored hooks are preserved.
16
+ */
17
+ import { installSkillsHookToFile, skillsHookSettingsPathFor, uninstallSkillsHookFromFile, } from '@olam/core/src/skill-sources/index.js';
18
+ import * as fs from 'node:fs';
19
+ import { printError, printInfo, printSuccess, printWarning } from '../output.js';
20
+ function backup(filePath) {
21
+ if (!fs.existsSync(filePath))
22
+ return null;
23
+ const ts = new Date().toISOString().replace(/[:.]/g, '-');
24
+ const backupPath = `${filePath}.olam-bak.${ts}`;
25
+ fs.copyFileSync(filePath, backupPath);
26
+ return backupPath;
27
+ }
28
+ export function registerSkillsHook(program) {
29
+ const skills = program.commands.find((c) => c.name() === 'skills') ??
30
+ program.command('skills').description('Manage skill sources and synchronization');
31
+ skills
32
+ .command('install-hook')
33
+ .description('Install the SessionStart hook that runs `olam skills sync --quiet` on session start')
34
+ .option('--scope <scope>', 'project (default; <cwd>/.claude/settings.json) or user (~/.claude/settings.json)', 'project')
35
+ .action((opts) => {
36
+ const scope = opts.scope === 'user' ? 'user' : 'project';
37
+ const filePath = skillsHookSettingsPathFor(scope);
38
+ try {
39
+ const result = installSkillsHookToFile(filePath);
40
+ switch (result.status) {
41
+ case 'installed':
42
+ printSuccess(`olam-skills SessionStart hook installed (${scope} scope)`);
43
+ printInfo('settings', filePath);
44
+ if (result.backupPath)
45
+ printInfo('backup', result.backupPath);
46
+ printInfo('next', 'open a new Claude Code session; `olam skills sync --quiet` will run on start');
47
+ return;
48
+ case 'already-present':
49
+ printInfo('olam-skills hook', `already installed at ${filePath}`);
50
+ return;
51
+ case 'no-op':
52
+ printWarning(`no change made to ${filePath}`);
53
+ return;
54
+ }
55
+ }
56
+ catch (err) {
57
+ printError(`install-hook failed: ${err instanceof Error ? err.message : String(err)}`);
58
+ process.exitCode = 1;
59
+ }
60
+ });
61
+ skills
62
+ .command('uninstall-hook')
63
+ .description('Remove the olam-skills SessionStart hook from settings.json (sentinel-matched; surgical)')
64
+ .option('--scope <scope>', 'project (default) or user', 'project')
65
+ .action((opts) => {
66
+ const scope = opts.scope === 'user' ? 'user' : 'project';
67
+ const filePath = skillsHookSettingsPathFor(scope);
68
+ const backupPath = backup(filePath);
69
+ try {
70
+ const result = uninstallSkillsHookFromFile(filePath);
71
+ switch (result.status) {
72
+ case 'removed':
73
+ printSuccess(`olam-skills SessionStart hook removed from ${filePath}`);
74
+ if (backupPath)
75
+ printInfo('backup', backupPath);
76
+ return;
77
+ case 'not-found':
78
+ printInfo('olam-skills hook', `not found in ${filePath} — already uninstalled`);
79
+ if (backupPath) {
80
+ try {
81
+ fs.unlinkSync(backupPath);
82
+ }
83
+ catch { /* best-effort */ }
84
+ }
85
+ return;
86
+ case 'no-settings':
87
+ printInfo('olam-skills hook', `no settings.json at ${filePath} — nothing to remove`);
88
+ return;
89
+ }
90
+ }
91
+ catch (err) {
92
+ printError(`uninstall-hook failed: ${err instanceof Error ? err.message : String(err)}`);
93
+ if (backupPath)
94
+ printInfo('backup', `settings.json preserved at ${backupPath}`);
95
+ process.exitCode = 1;
96
+ }
97
+ });
98
+ }
99
+ //# sourceMappingURL=skills-hook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-hook.js","sourceRoot":"","sources":["../../src/commands/skills-hook.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `olam skills migrate-back-to-toolbox` — reverse the migration performed
3
+ * by `migrate-from-toolbox`, consuming the pre-migration snapshot written
4
+ * at ~/.olam/state/migration-snapshots/<namespace>-<ISO>.json.
5
+ *
6
+ * Reverse order of migrate-from-toolbox operations:
7
+ * 1. resolve snapshot (latest matching --path / --namespace / --snapshot)
8
+ * 2. uninstall olam-skills SessionStart hook (sentinel-matched)
9
+ * 3. delete olam-managed symlinks under ~/.claude/ (any symlink whose
10
+ * target lives under ~/.olam/state/skill-sources/<id>/)
11
+ * 4. restore the original SessionStart hook block from snapshot
12
+ * 5. restore the toolbox-managed symlinks from snapshot
13
+ * 6. restore ~/.claude/.atlas-user from snapshot (atlas-shape only)
14
+ * 7. unless --keep-source: remove the toolbox olam source registration
15
+ * (skill-sources slice + clone dir)
16
+ */
17
+ import type { Command } from 'commander';
18
+ /** Stable command identifier — referenced by tests to keep them rename-resilient. */
19
+ export declare const MIGRATE_BACK_TO_TOOLBOX_COMMAND = "migrate-back-to-toolbox";
20
+ export declare function registerSkillsMigrateBack(program: Command): void;
21
+ //# sourceMappingURL=skills-migrate-back.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-migrate-back.d.ts","sourceRoot":"","sources":["../../src/commands/skills-migrate-back.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,qFAAqF;AACrF,eAAO,MAAM,+BAA+B,4BAA4B,CAAC;AAiGzE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoHhE"}
@@ -0,0 +1,222 @@
1
+ /**
2
+ * `olam skills migrate-back-to-toolbox` — reverse the migration performed
3
+ * by `migrate-from-toolbox`, consuming the pre-migration snapshot written
4
+ * at ~/.olam/state/migration-snapshots/<namespace>-<ISO>.json.
5
+ *
6
+ * Reverse order of migrate-from-toolbox operations:
7
+ * 1. resolve snapshot (latest matching --path / --namespace / --snapshot)
8
+ * 2. uninstall olam-skills SessionStart hook (sentinel-matched)
9
+ * 3. delete olam-managed symlinks under ~/.claude/ (any symlink whose
10
+ * target lives under ~/.olam/state/skill-sources/<id>/)
11
+ * 4. restore the original SessionStart hook block from snapshot
12
+ * 5. restore the toolbox-managed symlinks from snapshot
13
+ * 6. restore ~/.claude/.atlas-user from snapshot (atlas-shape only)
14
+ * 7. unless --keep-source: remove the toolbox olam source registration
15
+ * (skill-sources slice + clone dir)
16
+ */
17
+ import * as fs from 'node:fs';
18
+ import * as path from 'node:path';
19
+ import { readLatestMigrationSnapshot, readMigrationSnapshotFromPath, uninstallSkillsHookFromFile, claudeSettingsPath, listSkillSources, removeSkillSource, removeSkillSourceClone, skillSourceClonePath, } from '@olam/core/src/skill-sources/index.js';
20
+ import { printError, printInfo, printSuccess, printWarning } from '../output.js';
21
+ /** Stable command identifier — referenced by tests to keep them rename-resilient. */
22
+ export const MIGRATE_BACK_TO_TOOLBOX_COMMAND = 'migrate-back-to-toolbox';
23
+ function asMessage(err) {
24
+ return err instanceof Error ? err.message : String(err);
25
+ }
26
+ function claudeDirInternal() {
27
+ const override = process.env['OLAM_CLAUDE_DIR'];
28
+ if (override && override.length > 0)
29
+ return override;
30
+ return path.join(process.env['HOME'] ?? '', '.claude');
31
+ }
32
+ function restoreSessionStartFromSnapshot(filePath, originalSessionStartHook) {
33
+ if (!originalSessionStartHook || originalSessionStartHook.length === 0) {
34
+ return { restored: false };
35
+ }
36
+ let settings;
37
+ if (fs.existsSync(filePath)) {
38
+ try {
39
+ const raw = fs.readFileSync(filePath, 'utf-8');
40
+ settings = raw.trim() ? JSON.parse(raw) : {};
41
+ }
42
+ catch {
43
+ settings = {};
44
+ }
45
+ }
46
+ else {
47
+ settings = {};
48
+ }
49
+ // Replace SessionStart entirely with snapshot's array (we uninstalled olam
50
+ // entries already; this restores the original state byte-for-byte).
51
+ const hooks = (settings.hooks && typeof settings.hooks === 'object') ? settings.hooks : {};
52
+ const next = {
53
+ ...settings,
54
+ hooks: {
55
+ ...hooks,
56
+ SessionStart: originalSessionStartHook,
57
+ },
58
+ };
59
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
60
+ fs.writeFileSync(filePath, JSON.stringify(next, null, 2) + '\n');
61
+ return { restored: true };
62
+ }
63
+ function removeOlamManagedSymlinks() {
64
+ const claude = claudeDirInternal();
65
+ const sources = listSkillSources();
66
+ const olamClonePaths = sources.map((s) => skillSourceClonePath(s.id));
67
+ let removed = 0;
68
+ for (const bucket of ['skills', 'agents', 'scripts', 'rules', 'commands']) {
69
+ const dir = path.join(claude, bucket);
70
+ if (!fs.existsSync(dir))
71
+ continue;
72
+ for (const name of fs.readdirSync(dir)) {
73
+ const linkPath = path.join(dir, name);
74
+ try {
75
+ const stat = fs.lstatSync(linkPath);
76
+ if (!stat.isSymbolicLink())
77
+ continue;
78
+ const target = fs.readlinkSync(linkPath);
79
+ if (olamClonePaths.some((cp) => target.startsWith(cp))) {
80
+ fs.unlinkSync(linkPath);
81
+ removed += 1;
82
+ }
83
+ }
84
+ catch {
85
+ // best-effort
86
+ }
87
+ }
88
+ }
89
+ return removed;
90
+ }
91
+ function restoreToolboxSymlinks(symlinks) {
92
+ let restored = 0;
93
+ for (const { link, target } of symlinks) {
94
+ try {
95
+ fs.mkdirSync(path.dirname(link), { recursive: true });
96
+ if (fs.existsSync(link) || (() => { try {
97
+ fs.lstatSync(link);
98
+ return true;
99
+ }
100
+ catch {
101
+ return false;
102
+ } })()) {
103
+ fs.unlinkSync(link);
104
+ }
105
+ fs.symlinkSync(target, link);
106
+ restored += 1;
107
+ }
108
+ catch {
109
+ // best-effort
110
+ }
111
+ }
112
+ return restored;
113
+ }
114
+ function restoreAtlasUserMarker(atlasUser) {
115
+ if (!atlasUser)
116
+ return false;
117
+ const file = path.join(claudeDirInternal(), '.atlas-user');
118
+ fs.mkdirSync(path.dirname(file), { recursive: true });
119
+ fs.writeFileSync(file, atlasUser);
120
+ return true;
121
+ }
122
+ export function registerSkillsMigrateBack(program) {
123
+ const skills = program.commands.find((c) => c.name() === 'skills') ??
124
+ program.command('skills').description('Manage skill sources and synchronization');
125
+ skills
126
+ .command(MIGRATE_BACK_TO_TOOLBOX_COMMAND)
127
+ .description('Reverse migrate-from-toolbox using the pre-migration snapshot')
128
+ .option('--path <path>', 'Absolute path of the original toolbox repo (filters to the snapshot taken for this source)')
129
+ .option('--namespace <name>', 'Filter snapshots by namespace (e.g. atlas-toolbox, ai-skills)')
130
+ .option('--snapshot <path>', 'Use a specific snapshot file (default: most recent matching snapshot)')
131
+ .option('--keep-source', 'Preserve the toolbox olam source registration (default: remove)')
132
+ .action((opts) => {
133
+ // 1. Resolve snapshot.
134
+ let snapshotPath;
135
+ let snapshot;
136
+ try {
137
+ if (opts.snapshot) {
138
+ snapshotPath = path.resolve(opts.snapshot);
139
+ if (!fs.existsSync(snapshotPath)) {
140
+ printError(`snapshot not found at ${snapshotPath}`);
141
+ process.exitCode = 1;
142
+ return;
143
+ }
144
+ snapshot = readMigrationSnapshotFromPath(snapshotPath);
145
+ }
146
+ else {
147
+ const filterNamespace = opts.namespace ?? (opts.path ? path.basename(opts.path) : undefined);
148
+ const latest = readLatestMigrationSnapshot({ namespace: filterNamespace });
149
+ if (!latest) {
150
+ const where = filterNamespace ? ` for namespace "${filterNamespace}"` : '';
151
+ printError(`no migration snapshot found${where}. Did you run \`olam skills migrate-from-toolbox\` first?`);
152
+ process.exitCode = 1;
153
+ return;
154
+ }
155
+ snapshotPath = latest.path;
156
+ snapshot = latest.snapshot;
157
+ }
158
+ }
159
+ catch (err) {
160
+ printError(`could not read snapshot: ${asMessage(err)}`);
161
+ process.exitCode = 1;
162
+ return;
163
+ }
164
+ // If --path was supplied as an additional sanity check, warn on mismatch
165
+ // but proceed (the snapshot is authoritative about what to restore).
166
+ if (opts.path && snapshot.atlasToolboxRepoPath && opts.path !== snapshot.atlasToolboxRepoPath) {
167
+ printWarning(`--path ${opts.path} differs from snapshot's recorded path ${snapshot.atlasToolboxRepoPath}; proceeding with snapshot's path`);
168
+ }
169
+ printInfo('snapshot', snapshotPath);
170
+ // 2. Uninstall olam-skills hook.
171
+ try {
172
+ const settingsFile = claudeSettingsPath();
173
+ const r = uninstallSkillsHookFromFile(settingsFile);
174
+ printInfo('olam hook', r.status);
175
+ }
176
+ catch (err) {
177
+ printWarning(`olam hook uninstall failed: ${asMessage(err)}; proceeding`);
178
+ }
179
+ // 3. Remove olam-managed symlinks BEFORE removing the source
180
+ // registration (we need source paths to identify them).
181
+ const olamSymlinksRemoved = removeOlamManagedSymlinks();
182
+ printInfo('olam symlinks removed', String(olamSymlinksRemoved));
183
+ // 4. Restore original SessionStart hook block.
184
+ try {
185
+ const r = restoreSessionStartFromSnapshot(claudeSettingsPath(), snapshot.originalSessionStartHook);
186
+ printInfo('original hook', r.restored ? 'restored' : 'no original hook in snapshot');
187
+ }
188
+ catch (err) {
189
+ printWarning(`original hook restore failed: ${asMessage(err)}; proceeding`);
190
+ }
191
+ // 5. Restore toolbox symlinks.
192
+ const restored = restoreToolboxSymlinks(snapshot.atlasManagedSymlinks ?? []);
193
+ printInfo('toolbox symlinks restored', String(restored));
194
+ // 6. Restore .atlas-user marker (atlas-toolbox-shape only; no-op for non-atlas sources).
195
+ const atlasUserRestored = restoreAtlasUserMarker(snapshot.atlasUser);
196
+ if (atlasUserRestored)
197
+ printInfo('atlas-user', `restored ("${snapshot.atlasUser}")`);
198
+ // 7. Remove olam source registration (unless --keep-source).
199
+ if (!opts.keepSource) {
200
+ try {
201
+ const sources = listSkillSources();
202
+ const target = snapshot.atlasToolboxRepoPath;
203
+ const namespace = snapshot.namespace;
204
+ for (const s of sources) {
205
+ if (s.gitUrl === target || (namespace && s.name === namespace)) {
206
+ removeSkillSourceClone(s.id);
207
+ removeSkillSource(s.id);
208
+ printInfo('olam source removed', `${s.name} (${s.id})`);
209
+ }
210
+ }
211
+ }
212
+ catch (err) {
213
+ printWarning(`source removal failed: ${asMessage(err)}; proceeding`);
214
+ }
215
+ }
216
+ else {
217
+ printInfo('olam source', '--keep-source: preserved');
218
+ }
219
+ printSuccess(`migrated back — toolbox state restored from snapshot taken at ${snapshot.takenAt}`);
220
+ });
221
+ }
222
+ //# sourceMappingURL=skills-migrate-back.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-migrate-back.js","sourceRoot":"","sources":["../../src/commands/skills-migrate-back.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EACL,2BAA2B,EAC3B,6BAA6B,EAC7B,2BAA2B,EAC3B,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjF,qFAAqF;AACrF,MAAM,CAAC,MAAM,+BAA+B,GAAG,yBAAyB,CAAC;AAEzE,SAAS,SAAS,CAAC,GAAY;IAC7B,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC;AAED,SAAS,iBAAiB;IACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAChD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,+BAA+B,CACtC,QAAgB,EAChB,wBAA+C;IAE/C,IAAI,CAAC,wBAAwB,IAAI,wBAAwB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IACD,IAAI,QAA8F,CAAC;IACnG,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAC/C,QAAQ,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,EAAE,CAAC;IAChB,CAAC;IAED,2EAA2E;IAC3E,oEAAoE;IACpE,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,MAAM,IAAI,GAAG;QACX,GAAG,QAAQ;QACX,KAAK,EAAE;YACL,GAAG,KAAK;YACR,YAAY,EAAE,wBAAwB;SACvC;KACF,CAAC;IACF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,SAAS,yBAAyB;IAChC,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IACnC,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtE,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,MAAM,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC;QAC1E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAClC,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;oBAAE,SAAS;gBACrC,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACzC,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;oBACvD,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBACxB,OAAO,IAAI,CAAC,CAAC;gBACf,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAiD;IAC/E,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;gBAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;gBAAC,OAAO,IAAI,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,OAAO,KAAK,CAAC;YAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC1G,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YACD,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YAC7B,QAAQ,IAAI,CAAC,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,sBAAsB,CAAC,SAA6B;IAC3D,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa,CAAC,CAAC;IAC3D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,MAAM,MAAM,GACV,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC;QACnD,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAC;IAEpF,MAAM;SACH,OAAO,CAAC,+BAA+B,CAAC;SACxC,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CACL,eAAe,EACf,4FAA4F,CAC7F;SACA,MAAM,CAAC,oBAAoB,EAAE,+DAA+D,CAAC;SAC7F,MAAM,CAAC,mBAAmB,EAAE,uEAAuE,CAAC;SACpG,MAAM,CAAC,eAAe,EAAE,iEAAiE,CAAC;SAC1F,MAAM,CAAC,CAAC,IAAoF,EAAE,EAAE;QAC/F,uBAAuB;QACvB,IAAI,YAAoB,CAAC;QACzB,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;oBACjC,UAAU,CAAC,yBAAyB,YAAY,EAAE,CAAC,CAAC;oBACpD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBACD,QAAQ,GAAG,6BAA6B,CAAC,YAAY,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACN,MAAM,eAAe,GACnB,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACvE,MAAM,MAAM,GAAG,2BAA2B,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC;gBAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,mBAAmB,eAAe,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC3E,UAAU,CACR,8BAA8B,KAAK,2DAA2D,CAC/F,CAAC;oBACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBACD,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC;gBAC3B,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YAC7B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,4BAA4B,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,yEAAyE;QACzE,qEAAqE;QACrE,IAAI,IAAI,CAAC,IAAI,IAAI,QAAQ,CAAC,oBAAoB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,oBAAoB,EAAE,CAAC;YAC9F,YAAY,CACV,UAAU,IAAI,CAAC,IAAI,0CAA0C,QAAQ,CAAC,oBAAoB,mCAAmC,CAC9H,CAAC;QACJ,CAAC;QAED,SAAS,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAEpC,iCAAiC;QACjC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,kBAAkB,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,2BAA2B,CAAC,YAAY,CAAC,CAAC;YACpD,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CAAC,+BAA+B,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5E,CAAC;QAED,6DAA6D;QAC7D,2DAA2D;QAC3D,MAAM,mBAAmB,GAAG,yBAAyB,EAAE,CAAC;QACxD,SAAS,CAAC,uBAAuB,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAEhE,+CAA+C;QAC/C,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,+BAA+B,CACvC,kBAAkB,EAAE,EACpB,QAAQ,CAAC,wBAAwB,CAClC,CAAC;YACF,SAAS,CAAC,eAAe,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC;QACvF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,YAAY,CAAC,iCAAiC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC9E,CAAC;QAED,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,QAAQ,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;QAC7E,SAAS,CAAC,2BAA2B,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAEzD,yFAAyF;QACzF,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACrE,IAAI,iBAAiB;YAAE,SAAS,CAAC,YAAY,EAAE,cAAc,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAC;QAErF,6DAA6D;QAC7D,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,oBAAoB,CAAC;gBAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;gBACrC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;oBACxB,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,CAAC;wBAC/D,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBAC7B,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;wBACxB,SAAS,CAAC,qBAAqB,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBAC1D,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,YAAY,CAAC,0BAA0B,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACvE,CAAC;QACH,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,aAAa,EAAE,0BAA0B,CAAC,CAAC;QACvD,CAAC;QAED,YAAY,CACV,iEAAiE,QAAQ,CAAC,OAAO,EAAE,CACpF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `olam skills migrate-hooks-back` — reverse Phase B B1 meta-hook
3
+ * injection by restoring `~/.claude/settings.json` from a snapshot
4
+ * written by `writeMetaHooksSnapshot` (engine writes one before every
5
+ * injection that has a non-empty delta).
6
+ *
7
+ * olam skills migrate-hooks-back [--snapshot <path>]
8
+ *
9
+ * Without `--snapshot`: consumes the most-recent
10
+ * `meta-hooks-*.json` in `~/.olam/state/migration-snapshots/`.
11
+ * With `--snapshot`: uses the named file explicitly.
12
+ *
13
+ * Output: prints settings.json path + snapshot path + summary
14
+ * (restored / file-removed when snapshot represents pre-existence
15
+ * absence) + exits 0 on success.
16
+ */
17
+ import type { Command } from 'commander';
18
+ export declare function registerSkillsMigrateHooksBack(program: Command): void;
19
+ //# sourceMappingURL=skills-migrate-hooks-back.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-migrate-hooks-back.d.ts","sourceRoot":"","sources":["../../src/commands/skills-migrate-hooks-back.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoErE"}