@pleri/olam-cli 0.1.144 → 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.
Files changed (117) hide show
  1. package/dist/commands/doctor.d.ts +53 -23
  2. package/dist/commands/doctor.d.ts.map +1 -1
  3. package/dist/commands/doctor.js +117 -46
  4. package/dist/commands/doctor.js.map +1 -1
  5. package/dist/commands/logs.d.ts +17 -3
  6. package/dist/commands/logs.d.ts.map +1 -1
  7. package/dist/commands/logs.js +38 -35
  8. package/dist/commands/logs.js.map +1 -1
  9. package/dist/commands/memory/bridge.d.ts +57 -0
  10. package/dist/commands/memory/bridge.d.ts.map +1 -0
  11. package/dist/commands/memory/bridge.js +156 -0
  12. package/dist/commands/memory/bridge.js.map +1 -0
  13. package/dist/commands/memory/index.d.ts +3 -0
  14. package/dist/commands/memory/index.d.ts.map +1 -1
  15. package/dist/commands/memory/index.js +10 -1
  16. package/dist/commands/memory/index.js.map +1 -1
  17. package/dist/commands/memory/reclassify.d.ts +56 -0
  18. package/dist/commands/memory/reclassify.d.ts.map +1 -0
  19. package/dist/commands/memory/reclassify.js +177 -0
  20. package/dist/commands/memory/reclassify.js.map +1 -0
  21. package/dist/commands/memory/stats.d.ts +69 -0
  22. package/dist/commands/memory/stats.d.ts.map +1 -0
  23. package/dist/commands/memory/stats.js +164 -0
  24. package/dist/commands/memory/stats.js.map +1 -0
  25. package/dist/commands/skills-doctor.d.ts +14 -0
  26. package/dist/commands/skills-doctor.d.ts.map +1 -0
  27. package/dist/commands/skills-doctor.js +126 -0
  28. package/dist/commands/skills-doctor.js.map +1 -0
  29. package/dist/commands/skills-hook.d.ts +19 -0
  30. package/dist/commands/skills-hook.d.ts.map +1 -0
  31. package/dist/commands/skills-hook.js +99 -0
  32. package/dist/commands/skills-hook.js.map +1 -0
  33. package/dist/commands/skills-migrate-back.d.ts +21 -0
  34. package/dist/commands/skills-migrate-back.d.ts.map +1 -0
  35. package/dist/commands/skills-migrate-back.js +222 -0
  36. package/dist/commands/skills-migrate-back.js.map +1 -0
  37. package/dist/commands/skills-migrate.d.ts +33 -0
  38. package/dist/commands/skills-migrate.d.ts.map +1 -0
  39. package/dist/commands/skills-migrate.js +216 -0
  40. package/dist/commands/skills-migrate.js.map +1 -0
  41. package/dist/commands/skills-onboard.d.ts +26 -0
  42. package/dist/commands/skills-onboard.d.ts.map +1 -0
  43. package/dist/commands/skills-onboard.js +227 -0
  44. package/dist/commands/skills-onboard.js.map +1 -0
  45. package/dist/commands/skills-shadow-backups.d.ts +15 -0
  46. package/dist/commands/skills-shadow-backups.d.ts.map +1 -0
  47. package/dist/commands/skills-shadow-backups.js +132 -0
  48. package/dist/commands/skills-shadow-backups.js.map +1 -0
  49. package/dist/commands/skills-source.d.ts +37 -0
  50. package/dist/commands/skills-source.d.ts.map +1 -0
  51. package/dist/commands/skills-source.js +431 -0
  52. package/dist/commands/skills-source.js.map +1 -0
  53. package/dist/commands/skills.d.ts +11 -0
  54. package/dist/commands/skills.d.ts.map +1 -0
  55. package/dist/commands/skills.js +170 -0
  56. package/dist/commands/skills.js.map +1 -0
  57. package/dist/commands/status.d.ts +27 -0
  58. package/dist/commands/status.d.ts.map +1 -1
  59. package/dist/commands/status.js +102 -1
  60. package/dist/commands/status.js.map +1 -1
  61. package/dist/commands/substrate-audit-log.d.ts +49 -0
  62. package/dist/commands/substrate-audit-log.d.ts.map +1 -0
  63. package/dist/commands/substrate-audit-log.js +148 -0
  64. package/dist/commands/substrate-audit-log.js.map +1 -0
  65. package/dist/commands/substrate.d.ts +60 -0
  66. package/dist/commands/substrate.d.ts.map +1 -0
  67. package/dist/commands/substrate.js +175 -0
  68. package/dist/commands/substrate.js.map +1 -0
  69. package/dist/commands/upgrade.d.ts +10 -0
  70. package/dist/commands/upgrade.d.ts.map +1 -1
  71. package/dist/commands/upgrade.js +30 -0
  72. package/dist/commands/upgrade.js.map +1 -1
  73. package/dist/image-digests.json +7 -7
  74. package/dist/index.js +8394 -3876
  75. package/dist/index.js.map +1 -1
  76. package/dist/lib/config.d.ts +69 -0
  77. package/dist/lib/config.d.ts.map +1 -0
  78. package/dist/lib/config.js +146 -0
  79. package/dist/lib/config.js.map +1 -0
  80. package/dist/lib/health-probes.d.ts +72 -0
  81. package/dist/lib/health-probes.d.ts.map +1 -1
  82. package/dist/lib/health-probes.js +218 -0
  83. package/dist/lib/health-probes.js.map +1 -1
  84. package/dist/lib/instrumentation.d.ts +85 -0
  85. package/dist/lib/instrumentation.d.ts.map +1 -0
  86. package/dist/lib/instrumentation.js +104 -0
  87. package/dist/lib/instrumentation.js.map +1 -0
  88. package/dist/lib/kubectl-wrap.d.ts +59 -0
  89. package/dist/lib/kubectl-wrap.d.ts.map +1 -0
  90. package/dist/lib/kubectl-wrap.js +130 -0
  91. package/dist/lib/kubectl-wrap.js.map +1 -0
  92. package/dist/lib/manifest-refresh.d.ts +95 -0
  93. package/dist/lib/manifest-refresh.d.ts.map +1 -0
  94. package/dist/lib/manifest-refresh.js +222 -0
  95. package/dist/lib/manifest-refresh.js.map +1 -0
  96. package/dist/lib/port-forward.d.ts +101 -0
  97. package/dist/lib/port-forward.d.ts.map +1 -0
  98. package/dist/lib/port-forward.js +240 -0
  99. package/dist/lib/port-forward.js.map +1 -0
  100. package/dist/lib/upgrade-kubernetes.d.ts +77 -0
  101. package/dist/lib/upgrade-kubernetes.d.ts.map +1 -0
  102. package/dist/lib/upgrade-kubernetes.js +277 -0
  103. package/dist/lib/upgrade-kubernetes.js.map +1 -0
  104. package/dist/mcp-server.js +3328 -1166
  105. package/host-cp/k8s/manifests/00-namespace.yaml +7 -0
  106. package/host-cp/k8s/manifests/10-serviceaccount.yaml +8 -0
  107. package/host-cp/k8s/manifests/20-rbac.yaml +34 -0
  108. package/host-cp/k8s/manifests/30-configmap.yaml +30 -0
  109. package/host-cp/k8s/manifests/45-pvc.yaml +27 -0
  110. package/host-cp/k8s/manifests/50-deployment.yaml +148 -0
  111. package/host-cp/k8s/manifests/60-service.yaml +22 -0
  112. package/host-cp/k8s/templates/40-secret-template.yaml +32 -0
  113. package/host-cp/src/agent-runtime-trigger.mjs +74 -4
  114. package/host-cp/src/engine-identity.mjs +32 -0
  115. package/host-cp/src/plan-chat-service.mjs +31 -7
  116. package/host-cp/src/server.mjs +219 -9
  117. package/package.json +3 -2
@@ -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"}
@@ -0,0 +1,216 @@
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 * as fs from 'node:fs';
19
+ import * as path from 'node:path';
20
+ import { addSkillSource, cloneSkillSource, detectToolboxState, writeMigrationSnapshot, OLAM_SKILLS_HOOK_SENTINEL, buildSkillsHookEntry, OLAM_SKILLS_HOOK_STAGE, syncSkills, } from '@olam/core/src/skill-sources/index.js';
21
+ import { mergeHomeSettingsJson } from '@olam/core/src/world/merge-settings.js';
22
+ import { claudeSettingsPath } from '@olam/core/src/skill-sources/index.js';
23
+ import { printError, printInfo, printSuccess, printWarning } from '../output.js';
24
+ /** Stable command identifier — referenced by tests to keep them rename-resilient. */
25
+ export const MIGRATE_FROM_TOOLBOX_COMMAND = 'migrate-from-toolbox';
26
+ function asMessage(err) {
27
+ return err instanceof Error ? err.message : String(err);
28
+ }
29
+ function isOlamSkillsHookPresent(filePath) {
30
+ if (!fs.existsSync(filePath))
31
+ return false;
32
+ try {
33
+ const raw = fs.readFileSync(filePath, 'utf-8');
34
+ return raw.includes(OLAM_SKILLS_HOOK_SENTINEL);
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ }
40
+ /**
41
+ * Surgically remove SessionStart hook entries that reference the toolbox
42
+ * repo path OR call `./scripts/sync.sh` (legacy atlas-toolbox sync entry —
43
+ * harmless no-op against non-atlas toolboxes). Leaves olam-skills entries
44
+ * and unrelated user hooks intact.
45
+ */
46
+ function uninstallLegacyToolboxSessionStartHook(filePath, toolboxPath) {
47
+ if (!fs.existsSync(filePath))
48
+ return { removed: 0 };
49
+ const raw = fs.readFileSync(filePath, 'utf-8');
50
+ const settings = raw.trim() ? JSON.parse(raw) : {};
51
+ const ss = settings?.hooks?.SessionStart;
52
+ if (!Array.isArray(ss))
53
+ return { removed: 0 };
54
+ let removed = 0;
55
+ const filteredMatchers = [];
56
+ for (const matcher of ss) {
57
+ const innerHooks = Array.isArray(matcher?.hooks) ? matcher.hooks : [];
58
+ const keptInner = innerHooks.filter((h) => {
59
+ if (typeof h?.command !== 'string')
60
+ return true;
61
+ // Identify legacy-toolbox-shape entries by command content.
62
+ const looksLegacyToolbox = h.command.includes('./scripts/sync.sh') ||
63
+ (toolboxPath !== undefined && h.command.includes(toolboxPath));
64
+ // Never remove olam-skills entries here — install-skills-hook handles those.
65
+ const isOlam = h.command.includes(OLAM_SKILLS_HOOK_SENTINEL);
66
+ if (looksLegacyToolbox && !isOlam) {
67
+ removed += 1;
68
+ return false;
69
+ }
70
+ return true;
71
+ });
72
+ if (keptInner.length === 0 && innerHooks.length > 0)
73
+ continue;
74
+ if (keptInner.length === innerHooks.length)
75
+ filteredMatchers.push(matcher);
76
+ else
77
+ filteredMatchers.push({ ...matcher, hooks: keptInner });
78
+ }
79
+ if (removed === 0)
80
+ return { removed: 0 };
81
+ const next = { ...settings, hooks: { ...settings.hooks, SessionStart: filteredMatchers } };
82
+ if (filteredMatchers.length === 0) {
83
+ const otherStages = Object.keys(next.hooks ?? {}).filter((k) => k !== 'SessionStart');
84
+ if (otherStages.length === 0)
85
+ delete next.hooks;
86
+ else
87
+ delete next.hooks.SessionStart;
88
+ }
89
+ fs.writeFileSync(filePath, JSON.stringify(next, null, 2) + '\n');
90
+ return { removed };
91
+ }
92
+ export function registerSkillsMigrate(program) {
93
+ const skills = program.commands.find((c) => c.name() === 'skills') ??
94
+ program.command('skills').description('Manage skill sources and synchronization');
95
+ skills
96
+ .command(MIGRATE_FROM_TOOLBOX_COMMAND)
97
+ .description('Convert an existing toolbox-shaped skill source (atlas-toolbox, grain/ai-skills, etc.) to olam-managed skill distribution')
98
+ .option('--path <path>', 'Absolute path to the source toolbox repo (e.g. /repos/atlas-toolbox, /repos/grain/ai-skills)')
99
+ .option('--namespace <name>', 'Source-identifying namespace used for the snapshot filename + default source name (default: basename of --path)')
100
+ .option('--source-name <name>', 'Display name for the registered olam source (default: --namespace)')
101
+ .option('--branch <branch>', 'Branch to track on the source', 'master')
102
+ .option('--scope <scope>', 'install-hook scope: project (default) or user', 'project')
103
+ .option('--no-clone', 'Skip clone step (register source state only — useful for tests)')
104
+ .action(async (opts) => {
105
+ // Idempotency: if olam-skills sentinel already present, no-op.
106
+ const settingsFile = claudeSettingsPath();
107
+ if (isOlamSkillsHookPresent(settingsFile)) {
108
+ printInfo(MIGRATE_FROM_TOOLBOX_COMMAND, `already migrated (olam-skills hook sentinel present in ${settingsFile})`);
109
+ return;
110
+ }
111
+ if (!opts.path) {
112
+ printError('--path <path> is required (absolute path to the source toolbox repo, e.g. /repos/atlas-toolbox)');
113
+ process.exitCode = 1;
114
+ return;
115
+ }
116
+ const toolboxPath = opts.path;
117
+ const namespace = opts.namespace ?? path.basename(toolboxPath);
118
+ const sourceName = opts.sourceName ?? namespace;
119
+ // 1. Detect.
120
+ const snapshot = detectToolboxState({ toolboxPath, namespace });
121
+ if (!snapshot) {
122
+ printInfo(MIGRATE_FROM_TOOLBOX_COMMAND, `no toolbox state detected at ${toolboxPath} (no ~/.claude/.atlas-user, no symlinks pointing at this path, no SessionStart hook block — nothing to migrate)`);
123
+ return;
124
+ }
125
+ // 2. Snapshot (ALWAYS — before any mutation).
126
+ let snapshotPath;
127
+ try {
128
+ snapshotPath = writeMigrationSnapshot(snapshot);
129
+ printInfo('snapshot', snapshotPath);
130
+ }
131
+ catch (err) {
132
+ printError(`snapshot write failed: ${asMessage(err)}`);
133
+ process.exitCode = 1;
134
+ return;
135
+ }
136
+ // 3. Register source + clone.
137
+ // `trustMethod: 'internal'` — migrate-from is an operator-explicit
138
+ // command (operator typed it). Bypasses the interactive trust
139
+ // gate but is structurally audit-logged via addSkillSource()
140
+ // itself; the trust-audit log records the bypass.
141
+ try {
142
+ const entry = addSkillSource({
143
+ name: sourceName,
144
+ gitUrl: toolboxPath,
145
+ branch: opts.branch,
146
+ trustMethod: 'internal',
147
+ });
148
+ printInfo('registered source', `${entry.name} (${entry.id})`);
149
+ if (opts.clone !== false) {
150
+ const cloneResult = cloneSkillSource({
151
+ gitUrl: entry.gitUrl,
152
+ branch: entry.branch,
153
+ id: entry.id,
154
+ });
155
+ printInfo('cloned to', cloneResult.clonePath);
156
+ }
157
+ else {
158
+ printInfo('clone skipped', '--no-clone passed');
159
+ }
160
+ }
161
+ catch (err) {
162
+ printError(`source registration failed: ${asMessage(err)}`);
163
+ printInfo('snapshot preserved', snapshotPath);
164
+ process.exitCode = 1;
165
+ return;
166
+ }
167
+ // 4. Uninstall legacy toolbox SessionStart hook.
168
+ try {
169
+ const surgery = uninstallLegacyToolboxSessionStartHook(settingsFile, toolboxPath);
170
+ if (surgery.removed > 0) {
171
+ printInfo('legacy hook', `removed ${surgery.removed} entry(ies) from ${settingsFile}`);
172
+ }
173
+ else {
174
+ printInfo('legacy hook', 'no legacy-toolbox-shape SessionStart hook entries found');
175
+ }
176
+ }
177
+ catch (err) {
178
+ printWarning(`legacy hook removal failed: ${asMessage(err)}; proceeding`);
179
+ }
180
+ // 5. Install olam-skills hook.
181
+ const scope = opts.scope === 'user' ? 'user' : 'project';
182
+ const olamHookPath = scope === 'user' ? settingsFile : path.join(process.cwd(), '.claude', 'settings.json');
183
+ try {
184
+ fs.mkdirSync(path.dirname(olamHookPath), { recursive: true });
185
+ const result = mergeHomeSettingsJson(olamHookPath, {
186
+ ensureHook: {
187
+ stage: OLAM_SKILLS_HOOK_STAGE,
188
+ sentinel: OLAM_SKILLS_HOOK_SENTINEL,
189
+ entry: buildSkillsHookEntry(),
190
+ },
191
+ });
192
+ printInfo('olam hook', `${result.status} at ${olamHookPath}`);
193
+ }
194
+ catch (err) {
195
+ printError(`olam hook install failed: ${asMessage(err)}`);
196
+ printInfo('snapshot preserved', snapshotPath);
197
+ process.exitCode = 1;
198
+ return;
199
+ }
200
+ // 6. Sync.
201
+ try {
202
+ const summary = await syncSkills({ atlasUser: snapshot.atlasUser });
203
+ printSuccess(`migrated — synced ${summary.sourceCount} source(s), deployed ${summary.deploy?.linked ?? 0} symlink(s)`);
204
+ printInfo('snapshot', snapshotPath);
205
+ printInfo('reverse', `run \`olam skills migrate-back-to-toolbox --path ${toolboxPath}\` to restore the original state`);
206
+ }
207
+ catch (err) {
208
+ printError(`sync failed: ${asMessage(err)}`);
209
+ printInfo('snapshot preserved', snapshotPath);
210
+ process.exitCode = 1;
211
+ }
212
+ });
213
+ }
214
+ // Export internal helper for tests + reverse-migration consumers.
215
+ export { uninstallLegacyToolboxSessionStartHook };
216
+ //# sourceMappingURL=skills-migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-migrate.js","sourceRoot":"","sources":["../../src/commands/skills-migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * olam skills onboard — fresh-install umbrella that composes the 3-step
3
+ * recipe into one operator-friendly verb.
4
+ *
5
+ * olam skills onboard --name <n> --git-url <url> [--branch main]
6
+ * [--trust] [--scope project|user]
7
+ *
8
+ * Pipeline:
9
+ * 1. addSkillSource({ trustMethod: 'flag' }) — `--trust` is the only
10
+ * sanctioned trust method here. Onboard is non-interactive by
11
+ * design (it composes 4 steps; an interactive picker mid-pipeline
12
+ * would be confusing). Operators who want the picker should run
13
+ * `olam skills source add` directly.
14
+ * 2. cloneSkillSource(...) — register + clone.
15
+ * 3. installSkillsHookToFile(...) at --scope (default project).
16
+ * 4. syncSkills() — first sync.
17
+ * 5. Print a single success summary covering all 4 steps.
18
+ *
19
+ * Failure rollback: any failure AFTER step 1 (clone, hook install,
20
+ * sync) unwinds the registered source so the operator can re-try
21
+ * cleanly. Each step appends an audit row so the trust-coverage gate
22
+ * stays accurate even when the umbrella partially fails.
23
+ */
24
+ import type { Command } from 'commander';
25
+ export declare function registerSkillsOnboard(program: Command): void;
26
+ //# sourceMappingURL=skills-onboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-onboard.d.ts","sourceRoot":"","sources":["../../src/commands/skills-onboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0M5D"}