@pleri/olam-cli 0.1.145 → 0.1.146
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.
- package/dist/commands/skills-doctor.d.ts +14 -0
- package/dist/commands/skills-doctor.d.ts.map +1 -0
- package/dist/commands/skills-doctor.js +126 -0
- package/dist/commands/skills-doctor.js.map +1 -0
- package/dist/commands/skills-hook.d.ts +19 -0
- package/dist/commands/skills-hook.d.ts.map +1 -0
- package/dist/commands/skills-hook.js +99 -0
- package/dist/commands/skills-hook.js.map +1 -0
- package/dist/commands/skills-migrate-back.d.ts +21 -0
- package/dist/commands/skills-migrate-back.d.ts.map +1 -0
- package/dist/commands/skills-migrate-back.js +222 -0
- package/dist/commands/skills-migrate-back.js.map +1 -0
- package/dist/commands/skills-migrate.d.ts +33 -0
- package/dist/commands/skills-migrate.d.ts.map +1 -0
- package/dist/commands/skills-migrate.js +216 -0
- package/dist/commands/skills-migrate.js.map +1 -0
- package/dist/commands/skills-onboard.d.ts +26 -0
- package/dist/commands/skills-onboard.d.ts.map +1 -0
- package/dist/commands/skills-onboard.js +227 -0
- package/dist/commands/skills-onboard.js.map +1 -0
- package/dist/commands/skills-shadow-backups.d.ts +15 -0
- package/dist/commands/skills-shadow-backups.d.ts.map +1 -0
- package/dist/commands/skills-shadow-backups.js +132 -0
- package/dist/commands/skills-shadow-backups.js.map +1 -0
- package/dist/commands/skills-source.d.ts +25 -0
- package/dist/commands/skills-source.d.ts.map +1 -1
- package/dist/commands/skills-source.js +305 -7
- package/dist/commands/skills-source.js.map +1 -1
- package/dist/commands/skills.d.ts.map +1 -1
- package/dist/commands/skills.js +13 -6
- package/dist/commands/skills.js.map +1 -1
- package/dist/commands/substrate-audit-log.d.ts +49 -0
- package/dist/commands/substrate-audit-log.d.ts.map +1 -0
- package/dist/commands/substrate-audit-log.js +148 -0
- package/dist/commands/substrate-audit-log.js.map +1 -0
- package/dist/commands/substrate.d.ts +60 -0
- package/dist/commands/substrate.d.ts.map +1 -0
- package/dist/commands/substrate.js +175 -0
- package/dist/commands/substrate.js.map +1 -0
- package/dist/commands/upgrade.d.ts +10 -0
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +30 -0
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/image-digests.json +7 -7
- package/dist/index.js +5012 -1992
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +69 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +146 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/instrumentation.d.ts +85 -0
- package/dist/lib/instrumentation.d.ts.map +1 -0
- package/dist/lib/instrumentation.js +104 -0
- package/dist/lib/instrumentation.js.map +1 -0
- package/dist/lib/kubectl-wrap.d.ts +59 -0
- package/dist/lib/kubectl-wrap.d.ts.map +1 -0
- package/dist/lib/kubectl-wrap.js +130 -0
- package/dist/lib/kubectl-wrap.js.map +1 -0
- package/dist/lib/manifest-refresh.d.ts +95 -0
- package/dist/lib/manifest-refresh.d.ts.map +1 -0
- package/dist/lib/manifest-refresh.js +222 -0
- package/dist/lib/manifest-refresh.js.map +1 -0
- package/dist/lib/port-forward.d.ts +101 -0
- package/dist/lib/port-forward.d.ts.map +1 -0
- package/dist/lib/port-forward.js +240 -0
- package/dist/lib/port-forward.js.map +1 -0
- package/dist/lib/upgrade-kubernetes.d.ts +77 -0
- package/dist/lib/upgrade-kubernetes.d.ts.map +1 -0
- package/dist/lib/upgrade-kubernetes.js +277 -0
- package/dist/lib/upgrade-kubernetes.js.map +1 -0
- package/dist/mcp-server.js +19537 -18270
- package/host-cp/k8s/manifests/00-namespace.yaml +7 -0
- package/host-cp/k8s/manifests/10-serviceaccount.yaml +8 -0
- package/host-cp/k8s/manifests/20-rbac.yaml +34 -0
- package/host-cp/k8s/manifests/30-configmap.yaml +30 -0
- package/host-cp/k8s/manifests/45-pvc.yaml +27 -0
- package/host-cp/k8s/manifests/50-deployment.yaml +148 -0
- package/host-cp/k8s/manifests/60-service.yaml +22 -0
- package/host-cp/k8s/templates/40-secret-template.yaml +32 -0
- package/host-cp/src/plan-chat-service.mjs +31 -7
- package/host-cp/src/server.mjs +32 -7
- 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":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `olam skills migrate-from-toolbox` — convert an existing toolbox-shaped
|
|
3
|
+
* skill source (e.g. atlas-toolbox, grain/ai-skills) installation to
|
|
4
|
+
* olam-managed skill distribution.
|
|
5
|
+
*
|
|
6
|
+
* Order of operations (atomic in spirit — snapshot first, mutations after):
|
|
7
|
+
* 1. detectToolboxState({ toolboxPath }) → MigrationSnapshot (or no-op when nothing detected)
|
|
8
|
+
* 2. writeMigrationSnapshot() → ~/.olam/state/migration-snapshots/<namespace>-<ISO>.json
|
|
9
|
+
* 3. addSkillSource() + cloneSkillSource() → register the toolbox as an olam source
|
|
10
|
+
* 4. uninstall legacy toolbox SessionStart hook entries (entries whose command
|
|
11
|
+
* references the toolbox repo path OR `./scripts/sync.sh`)
|
|
12
|
+
* 5. install the olam-skills SessionStart hook (via mergeHomeSettingsJson)
|
|
13
|
+
* 6. run `olam skills sync` to deploy artifacts under olam management
|
|
14
|
+
*
|
|
15
|
+
* Idempotent: re-running on an already-migrated host detects the olam
|
|
16
|
+
* hook sentinel and no-ops with an informative message.
|
|
17
|
+
*/
|
|
18
|
+
import type { Command } from 'commander';
|
|
19
|
+
/** Stable command identifier — referenced by tests to keep them rename-resilient. */
|
|
20
|
+
export declare const MIGRATE_FROM_TOOLBOX_COMMAND = "migrate-from-toolbox";
|
|
21
|
+
interface ToolboxHookSurgeryResult {
|
|
22
|
+
readonly removed: number;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Surgically remove SessionStart hook entries that reference the toolbox
|
|
26
|
+
* repo path OR call `./scripts/sync.sh` (legacy atlas-toolbox sync entry —
|
|
27
|
+
* harmless no-op against non-atlas toolboxes). Leaves olam-skills entries
|
|
28
|
+
* and unrelated user hooks intact.
|
|
29
|
+
*/
|
|
30
|
+
declare function uninstallLegacyToolboxSessionStartHook(filePath: string, toolboxPath: string | undefined): ToolboxHookSurgeryResult;
|
|
31
|
+
export declare function registerSkillsMigrate(program: Command): void;
|
|
32
|
+
export { uninstallLegacyToolboxSessionStartHook };
|
|
33
|
+
//# sourceMappingURL=skills-migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-migrate.d.ts","sourceRoot":"","sources":["../../src/commands/skills-migrate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC,qFAAqF;AACrF,eAAO,MAAM,4BAA4B,yBAAyB,CAAC;AAgBnE,UAAU,wBAAwB;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,iBAAS,sCAAsC,CAC7C,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,wBAAwB,CAuC1B;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8I5D;AAGD,OAAO,EAAE,sCAAsC,EAAE,CAAC"}
|