@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.
- 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-hooks-back.d.ts +19 -0
- package/dist/commands/skills-migrate-hooks-back.d.ts.map +1 -0
- package/dist/commands/skills-migrate-hooks-back.js +83 -0
- package/dist/commands/skills-migrate-hooks-back.js.map +1 -0
- package/dist/commands/skills-migrate-hooks.d.ts +40 -0
- package/dist/commands/skills-migrate-hooks.d.ts.map +1 -0
- package/dist/commands/skills-migrate-hooks.js +178 -0
- package/dist/commands/skills-migrate-hooks.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 +62 -7
- 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 +8687 -4713
- 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 +20262 -18211
- 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,227 @@
|
|
|
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 pc from 'picocolors';
|
|
25
|
+
import { addSkillSource, cloneSkillSource, installSkillsHookToFile, removeSkillSource, removeSkillSourceClone, skillsHookSettingsPathFor, syncSkills, updateSkillSource, appendTrustAudit, redactUrl, } from '@olam/core/src/skill-sources/index.js';
|
|
26
|
+
import { printError, printInfo, printSuccess, printHeader } from '../output.js';
|
|
27
|
+
function asMessage(err) {
|
|
28
|
+
return err instanceof Error ? err.message : String(err);
|
|
29
|
+
}
|
|
30
|
+
export function registerSkillsOnboard(program) {
|
|
31
|
+
const skills = program.commands.find((c) => c.name() === 'skills') ??
|
|
32
|
+
program.command('skills').description('Manage skill sources and synchronization');
|
|
33
|
+
skills
|
|
34
|
+
.command('onboard')
|
|
35
|
+
.description('Fresh-install umbrella: register + clone + install SessionStart hook + first sync, in one verb')
|
|
36
|
+
.requiredOption('--name <name>', 'Display name (lowercase, digits, dash)')
|
|
37
|
+
.requiredOption('--git-url <url>', 'git URL (https://, git@, ssh://, file://, or absolute path)')
|
|
38
|
+
.option('--branch <branch>', 'Branch to track', 'main')
|
|
39
|
+
.option('--trust', 'Acknowledge that registering grants symlink-into-~/.claude permission (required: onboard is non-interactive)')
|
|
40
|
+
.option('--scope <scope>', 'Hook install scope: project (<cwd>/.claude/settings.json) or user (~/.claude/settings.json)', 'project')
|
|
41
|
+
.action(async (opts) => {
|
|
42
|
+
const scope = opts.scope === 'user' ? 'user' : 'project';
|
|
43
|
+
// Onboard composes 4 steps end-to-end. Surfacing a TTY trust prompt
|
|
44
|
+
// mid-pipeline would split operator attention; require --trust as
|
|
45
|
+
// the only sanctioned path here. Operators who want the picker can
|
|
46
|
+
// run `olam skills source add` (then run install-hook + sync
|
|
47
|
+
// themselves) — same surface, different ergonomic.
|
|
48
|
+
if (opts.trust !== true) {
|
|
49
|
+
try {
|
|
50
|
+
appendTrustAudit({
|
|
51
|
+
gitUrl: redactUrl(opts.gitUrl),
|
|
52
|
+
action: 'auto-rejected',
|
|
53
|
+
trustMethod: 'auto-reject-tty',
|
|
54
|
+
note: 'onboard: --trust required (composed pipeline; no mid-flow picker)',
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// best-effort audit
|
|
59
|
+
}
|
|
60
|
+
printError('`olam skills onboard` requires --trust. Registering a skill source grants ' +
|
|
61
|
+
'symlink-into-~/.claude permission; onboard is non-interactive so the operator ' +
|
|
62
|
+
'must acknowledge up front. (For the interactive picker use `olam skills source add`.)');
|
|
63
|
+
process.exitCode = 1;
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// ---------------------------------------------------------------
|
|
67
|
+
// Step 1: register the source (writes 'added' audit entry internally).
|
|
68
|
+
// ---------------------------------------------------------------
|
|
69
|
+
let entry;
|
|
70
|
+
try {
|
|
71
|
+
entry = addSkillSource({
|
|
72
|
+
name: opts.name,
|
|
73
|
+
gitUrl: opts.gitUrl,
|
|
74
|
+
branch: opts.branch ?? 'main',
|
|
75
|
+
trustMethod: 'flag',
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
try {
|
|
80
|
+
appendTrustAudit({
|
|
81
|
+
gitUrl: redactUrl(opts.gitUrl),
|
|
82
|
+
action: 'failed',
|
|
83
|
+
trustMethod: 'flag',
|
|
84
|
+
note: `onboard step=add: ${asMessage(err)}`,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// best-effort
|
|
89
|
+
}
|
|
90
|
+
printError(asMessage(err));
|
|
91
|
+
process.exitCode = 1;
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
// ---------------------------------------------------------------
|
|
95
|
+
// Step 2: clone the source. Rolls back step 1 on failure.
|
|
96
|
+
// ---------------------------------------------------------------
|
|
97
|
+
let headSha;
|
|
98
|
+
try {
|
|
99
|
+
const result = cloneSkillSource({
|
|
100
|
+
gitUrl: entry.gitUrl,
|
|
101
|
+
branch: entry.branch,
|
|
102
|
+
id: entry.id,
|
|
103
|
+
});
|
|
104
|
+
headSha = result.headSha;
|
|
105
|
+
updateSkillSource(entry.id, { lastPulledSha: result.headSha });
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
try {
|
|
109
|
+
removeSkillSource(entry.id);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// best-effort
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
appendTrustAudit({
|
|
116
|
+
gitUrl: redactUrl(entry.gitUrl),
|
|
117
|
+
action: 'failed',
|
|
118
|
+
trustMethod: 'flag',
|
|
119
|
+
sourceId: entry.id,
|
|
120
|
+
note: `onboard step=clone: ${asMessage(err)}`,
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// best-effort
|
|
125
|
+
}
|
|
126
|
+
printError(asMessage(err));
|
|
127
|
+
process.exitCode = 1;
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
// ---------------------------------------------------------------
|
|
131
|
+
// Step 3: install SessionStart hook. Rolls back clone + register
|
|
132
|
+
// on failure so the operator's state stays clean.
|
|
133
|
+
// ---------------------------------------------------------------
|
|
134
|
+
const hookFilePath = skillsHookSettingsPathFor(scope);
|
|
135
|
+
let hookStatus;
|
|
136
|
+
let hookBackupPath;
|
|
137
|
+
try {
|
|
138
|
+
const result = installSkillsHookToFile(hookFilePath);
|
|
139
|
+
hookStatus = result.status;
|
|
140
|
+
hookBackupPath = result.backupPath;
|
|
141
|
+
}
|
|
142
|
+
catch (err) {
|
|
143
|
+
try {
|
|
144
|
+
removeSkillSourceClone(entry.id);
|
|
145
|
+
removeSkillSource(entry.id);
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// best-effort
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
appendTrustAudit({
|
|
152
|
+
gitUrl: redactUrl(entry.gitUrl),
|
|
153
|
+
action: 'failed',
|
|
154
|
+
trustMethod: 'flag',
|
|
155
|
+
sourceId: entry.id,
|
|
156
|
+
note: `onboard step=install-hook: ${asMessage(err)}`,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// best-effort
|
|
161
|
+
}
|
|
162
|
+
printError(`install-hook failed: ${asMessage(err)}`);
|
|
163
|
+
process.exitCode = 1;
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// ---------------------------------------------------------------
|
|
167
|
+
// Step 4: first sync. Rolls back clone + register on failure so
|
|
168
|
+
// the operator can re-try cleanly. Leaves the hook in place — the
|
|
169
|
+
// hook is independently useful even if THIS source failed to
|
|
170
|
+
// deploy artifacts; uninstall-hook is its own surgical action.
|
|
171
|
+
// ---------------------------------------------------------------
|
|
172
|
+
let syncedArtifacts = 0;
|
|
173
|
+
try {
|
|
174
|
+
const summary = await syncSkills({});
|
|
175
|
+
syncedArtifacts = summary.artifactCount;
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
try {
|
|
179
|
+
removeSkillSourceClone(entry.id);
|
|
180
|
+
removeSkillSource(entry.id);
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
// best-effort
|
|
184
|
+
}
|
|
185
|
+
try {
|
|
186
|
+
appendTrustAudit({
|
|
187
|
+
gitUrl: redactUrl(entry.gitUrl),
|
|
188
|
+
action: 'failed',
|
|
189
|
+
trustMethod: 'flag',
|
|
190
|
+
sourceId: entry.id,
|
|
191
|
+
note: `onboard step=sync: ${asMessage(err)}`,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// best-effort
|
|
196
|
+
}
|
|
197
|
+
printError(`sync failed: ${asMessage(err)}`);
|
|
198
|
+
process.exitCode = 1;
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// ---------------------------------------------------------------
|
|
202
|
+
// Single success summary covering all 4 steps.
|
|
203
|
+
// ---------------------------------------------------------------
|
|
204
|
+
printHeader('skills onboard — complete');
|
|
205
|
+
printSuccess(`registered "${entry.name}" (${entry.id}) @ ${headSha.slice(0, 8)}`);
|
|
206
|
+
printInfo('git url', entry.gitUrl);
|
|
207
|
+
printInfo('branch', entry.branch);
|
|
208
|
+
printInfo('clone', `(see ~/.olam/state/skill-sources/${entry.id})`);
|
|
209
|
+
switch (hookStatus) {
|
|
210
|
+
case 'installed':
|
|
211
|
+
printInfo('hook', `installed (${scope} scope) at ${hookFilePath}`);
|
|
212
|
+
if (hookBackupPath)
|
|
213
|
+
printInfo('backup', hookBackupPath);
|
|
214
|
+
break;
|
|
215
|
+
case 'already-present':
|
|
216
|
+
printInfo('hook', `already installed at ${hookFilePath}`);
|
|
217
|
+
break;
|
|
218
|
+
case 'no-op':
|
|
219
|
+
printInfo('hook', `no change at ${hookFilePath}`);
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
printInfo('sync', `${syncedArtifacts} artifact(s) deployed`);
|
|
223
|
+
console.log();
|
|
224
|
+
console.log(pc.dim(' Open a new Claude Code session to pick up the deployed skills.'));
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=skills-onboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-onboard.js","sourceRoot":"","sources":["../../src/commands/skills-onboard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAGH,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,yBAAyB,EACzB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GAEV,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhF,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;AAUD,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,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,SAAS,CAAC;SAClB,WAAW,CACV,gGAAgG,CACjG;SACA,cAAc,CAAC,eAAe,EAAE,wCAAwC,CAAC;SACzE,cAAc,CAAC,iBAAiB,EAAE,6DAA6D,CAAC;SAChG,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,CAAC;SACtD,MAAM,CACL,SAAS,EACT,8GAA8G,CAC/G;SACA,MAAM,CACL,iBAAiB,EACjB,6FAA6F,EAC7F,SAAS,CACV;SACA,MAAM,CAAC,KAAK,EAAE,IAAiB,EAAE,EAAE;QAClC,MAAM,KAAK,GAAoB,IAAI,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;QAE1E,oEAAoE;QACpE,kEAAkE;QAClE,mEAAmE;QACnE,6DAA6D;QAC7D,mDAAmD;QACnD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,gBAAgB,CAAC;oBACf,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;oBAC9B,MAAM,EAAE,eAAe;oBACvB,WAAW,EAAE,iBAAiB;oBAC9B,IAAI,EAAE,mEAAmE;iBAC1E,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;YACtB,CAAC;YACD,UAAU,CACR,4EAA4E;gBAC1E,gFAAgF;gBAChF,uFAAuF,CAC1F,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,kEAAkE;QAClE,uEAAuE;QACvE,kEAAkE;QAClE,IAAI,KAAoD,CAAC;QACzD,IAAI,CAAC;YACH,KAAK,GAAG,cAAc,CAAC;gBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,MAAM;gBAC7B,WAAW,EAAE,MAAM;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,gBAAgB,CAAC;oBACf,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;oBAC9B,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,MAAM;oBACnB,IAAI,EAAE,qBAAqB,SAAS,CAAC,GAAG,CAAC,EAAE;iBAC5C,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YACD,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,kEAAkE;QAClE,0DAA0D;QAC1D,kEAAkE;QAClE,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,gBAAgB,CAAC;gBAC9B,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,EAAE,EAAE,KAAK,CAAC,EAAE;aACb,CAAC,CAAC;YACH,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YACzB,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YACD,IAAI,CAAC;gBACH,gBAAgB,CAAC;oBACf,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC/B,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,MAAM;oBACnB,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,IAAI,EAAE,uBAAuB,SAAS,CAAC,GAAG,CAAC,EAAE;iBAC9C,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YACD,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3B,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,kEAAkE;QAClE,iEAAiE;QACjE,kDAAkD;QAClD,kEAAkE;QAClE,MAAM,YAAY,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,UAAqD,CAAC;QAC1D,IAAI,cAA6B,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,uBAAuB,CAAC,YAAY,CAAC,CAAC;YACrD,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;YAC3B,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YACD,IAAI,CAAC;gBACH,gBAAgB,CAAC;oBACf,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC/B,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,MAAM;oBACnB,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,IAAI,EAAE,8BAA8B,SAAS,CAAC,GAAG,CAAC,EAAE;iBACrD,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YACD,UAAU,CAAC,wBAAwB,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,kEAAkE;QAClE,gEAAgE;QAChE,kEAAkE;QAClE,6DAA6D;QAC7D,+DAA+D;QAC/D,kEAAkE;QAClE,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC;YACrC,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjC,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YACD,IAAI,CAAC;gBACH,gBAAgB,CAAC;oBACf,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC/B,MAAM,EAAE,QAAQ;oBAChB,WAAW,EAAE,MAAM;oBACnB,QAAQ,EAAE,KAAK,CAAC,EAAE;oBAClB,IAAI,EAAE,sBAAsB,SAAS,CAAC,GAAG,CAAC,EAAE;iBAC7C,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,cAAc;YAChB,CAAC;YACD,UAAU,CAAC,gBAAgB,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,kEAAkE;QAClE,+CAA+C;QAC/C,kEAAkE;QAClE,WAAW,CAAC,2BAA2B,CAAC,CAAC;QACzC,YAAY,CAAC,eAAe,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAClF,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACnC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAClC,SAAS,CAAC,OAAO,EAAE,oCAAoC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;QACpE,QAAQ,UAAU,EAAE,CAAC;YACnB,KAAK,WAAW;gBACd,SAAS,CAAC,MAAM,EAAE,cAAc,KAAK,cAAc,YAAY,EAAE,CAAC,CAAC;gBACnE,IAAI,cAAc;oBAAE,SAAS,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;gBACxD,MAAM;YACR,KAAK,iBAAiB;gBACpB,SAAS,CAAC,MAAM,EAAE,wBAAwB,YAAY,EAAE,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,OAAO;gBACV,SAAS,CAAC,MAAM,EAAE,gBAAgB,YAAY,EAAE,CAAC,CAAC;gBAClD,MAAM;QACV,CAAC;QACD,SAAS,CAAC,MAAM,EAAE,GAAG,eAAe,uBAAuB,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam skills shadow-backups — manage A4's quarantine files.
|
|
3
|
+
*
|
|
4
|
+
* olam skills shadow-backups list all backups + ages
|
|
5
|
+
* olam skills shadow-backups prune [--older-than=<dur>] delete old ones
|
|
6
|
+
* [--all --force] OR delete every one
|
|
7
|
+
* [--dry-run]
|
|
8
|
+
* olam skills shadow-backups restore <path> [--force] move back to original
|
|
9
|
+
*
|
|
10
|
+
* T2 mitigation: prevents unbounded backup growth without ever touching a
|
|
11
|
+
* non-shadow-backup file (strict `.shadow-backup-<digits>` suffix match).
|
|
12
|
+
*/
|
|
13
|
+
import type { Command } from 'commander';
|
|
14
|
+
export declare function registerSkillsShadowBackups(program: Command): void;
|
|
15
|
+
//# sourceMappingURL=skills-shadow-backups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-shadow-backups.d.ts","sourceRoot":"","sources":["../../src/commands/skills-shadow-backups.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0CzC,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsFlE"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* olam skills shadow-backups — manage A4's quarantine files.
|
|
3
|
+
*
|
|
4
|
+
* olam skills shadow-backups list all backups + ages
|
|
5
|
+
* olam skills shadow-backups prune [--older-than=<dur>] delete old ones
|
|
6
|
+
* [--all --force] OR delete every one
|
|
7
|
+
* [--dry-run]
|
|
8
|
+
* olam skills shadow-backups restore <path> [--force] move back to original
|
|
9
|
+
*
|
|
10
|
+
* T2 mitigation: prevents unbounded backup growth without ever touching a
|
|
11
|
+
* non-shadow-backup file (strict `.shadow-backup-<digits>` suffix match).
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'node:fs';
|
|
14
|
+
import pc from 'picocolors';
|
|
15
|
+
import { listShadowBackups, pruneShadowBackups, restoreShadowBackup, parseDurationToMs, } from '@olam/core/src/skill-sources/index.js';
|
|
16
|
+
import { printError, printHeader, printSuccess } from '../output.js';
|
|
17
|
+
function asMessage(err) {
|
|
18
|
+
return err instanceof Error ? err.message : String(err);
|
|
19
|
+
}
|
|
20
|
+
function formatAge(ms) {
|
|
21
|
+
if (ms < 0)
|
|
22
|
+
return '<future>';
|
|
23
|
+
const d = Math.floor(ms / 86_400_000);
|
|
24
|
+
if (d >= 1)
|
|
25
|
+
return `${d}d`;
|
|
26
|
+
const h = Math.floor(ms / 3_600_000);
|
|
27
|
+
if (h >= 1)
|
|
28
|
+
return `${h}h`;
|
|
29
|
+
const m = Math.floor(ms / 60_000);
|
|
30
|
+
if (m >= 1)
|
|
31
|
+
return `${m}m`;
|
|
32
|
+
const s = Math.floor(ms / 1_000);
|
|
33
|
+
return `${s}s`;
|
|
34
|
+
}
|
|
35
|
+
function formatSize(bytes) {
|
|
36
|
+
if (bytes < 1024)
|
|
37
|
+
return `${bytes}B`;
|
|
38
|
+
if (bytes < 1024 * 1024)
|
|
39
|
+
return `${(bytes / 1024).toFixed(1)}KB`;
|
|
40
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
|
|
41
|
+
}
|
|
42
|
+
function printBackupRows(backups) {
|
|
43
|
+
for (const b of backups) {
|
|
44
|
+
const when = new Date(b.epochSeconds * 1000).toISOString().slice(0, 10);
|
|
45
|
+
console.log(` ${pc.dim(formatAge(b.ageMs).padStart(6))} ${formatSize(b.sizeBytes).padStart(7)} ${pc.dim(when)} ${b.bucket}/${pc.bold(b.basename)}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export function registerSkillsShadowBackups(program) {
|
|
49
|
+
const skills = program.commands.find((c) => c.name() === 'skills') ??
|
|
50
|
+
program.command('skills').description('Manage skill sources and synchronization');
|
|
51
|
+
const sb = skills
|
|
52
|
+
.command('shadow-backups')
|
|
53
|
+
.description('Manage `.shadow-backup-<epoch>` quarantine files left by `olam skills sync`');
|
|
54
|
+
sb.command('list')
|
|
55
|
+
.description('List all shadow-backup files under ~/.claude/')
|
|
56
|
+
.action(() => {
|
|
57
|
+
const all = listShadowBackups();
|
|
58
|
+
if (all.length === 0) {
|
|
59
|
+
console.log(pc.dim('No shadow-backup files under ~/.claude/.'));
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
printHeader(`${all.length} shadow backup(s)`);
|
|
63
|
+
console.log(pc.dim(' age size created bucket/basename'));
|
|
64
|
+
printBackupRows(all);
|
|
65
|
+
});
|
|
66
|
+
sb.command('prune')
|
|
67
|
+
.description('Delete shadow-backup files older than a duration (e.g. 30d) OR all of them with --all --force')
|
|
68
|
+
.option('--older-than <duration>', 'Delete backups older than this duration (e.g. 30d, 7d, 24h, 2w)', '30d')
|
|
69
|
+
.option('--all', 'Delete every shadow-backup file (requires --force)')
|
|
70
|
+
.option('--force', 'Confirm deletion when --all is used')
|
|
71
|
+
.option('--dry-run', 'Show what would be deleted without deleting')
|
|
72
|
+
.action((opts) => {
|
|
73
|
+
try {
|
|
74
|
+
let pruneOpts;
|
|
75
|
+
if (opts.all === true) {
|
|
76
|
+
if (opts.force !== true) {
|
|
77
|
+
printError('--all requires --force (refuses accidental wipes)');
|
|
78
|
+
process.exitCode = 1;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
pruneOpts = { all: true, dryRun: opts.dryRun };
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
const olderThanMs = parseDurationToMs(opts.olderThan);
|
|
85
|
+
if (olderThanMs === undefined) {
|
|
86
|
+
printError(`unrecognized --older-than value "${opts.olderThan}" (expected like "30d", "7d", "24h", "2w")`);
|
|
87
|
+
process.exitCode = 1;
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
pruneOpts = { olderThanMs, dryRun: opts.dryRun };
|
|
91
|
+
}
|
|
92
|
+
const result = pruneShadowBackups(pruneOpts);
|
|
93
|
+
const action = opts.dryRun ? 'would delete' : 'deleted';
|
|
94
|
+
if (result.deleted.length === 0) {
|
|
95
|
+
console.log(pc.dim(`No shadow-backups match — ${result.skipped.length} kept`));
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
printHeader(`${action} ${result.deleted.length} shadow backup(s) (${result.skipped.length} kept)`);
|
|
99
|
+
printBackupRows(result.deleted);
|
|
100
|
+
if (opts.dryRun) {
|
|
101
|
+
console.log(pc.dim('\n(dry-run — re-run without --dry-run to delete)'));
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
printSuccess(`pruned ${result.deleted.length} backup(s)`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
printError(asMessage(err));
|
|
109
|
+
process.exitCode = 1;
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
sb.command('restore')
|
|
113
|
+
.description('Move a shadow-backup file back to its original path')
|
|
114
|
+
.argument('<path>', 'Absolute path to the .shadow-backup-<epoch> file')
|
|
115
|
+
.option('--force', 'Overwrite the original path if it already exists')
|
|
116
|
+
.action((p, opts) => {
|
|
117
|
+
try {
|
|
118
|
+
if (!fs.existsSync(p)) {
|
|
119
|
+
printError(`backup file not found: ${p}`);
|
|
120
|
+
process.exitCode = 1;
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const result = restoreShadowBackup({ backupPath: p, force: opts.force });
|
|
124
|
+
printSuccess(`restored → ${result.restoredTo}`);
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
printError(asMessage(err));
|
|
128
|
+
process.exitCode = 1;
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=skills-shadow-backups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills-shadow-backups.js","sourceRoot":"","sources":["../../src/commands/skills-shadow-backups.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,30 @@
|
|
|
8
8
|
* olam skills source show <id>
|
|
9
9
|
*/
|
|
10
10
|
import type { Command } from 'commander';
|
|
11
|
+
/**
|
|
12
|
+
* Post-add interactive picker — surfaces two follow-ups after a
|
|
13
|
+
* successful `source add` so operators don't have to remember the
|
|
14
|
+
* separate `sync` + `install-hook` invocations:
|
|
15
|
+
*
|
|
16
|
+
* 1. Sync now? [Y/n]
|
|
17
|
+
* 2. Install SessionStart hook so future sessions auto-sync? [Y/n]
|
|
18
|
+
* (only offered if hook not already installed at the chosen scope)
|
|
19
|
+
*
|
|
20
|
+
* Default Yes on both — onboard-friendly without forcing the umbrella
|
|
21
|
+
* verb (`olam skills onboard`) on operators who want the picker shape.
|
|
22
|
+
*
|
|
23
|
+
* Non-interactive (no-TTY) callers skip both prompts silently and keep
|
|
24
|
+
* the pre-Phase-D behavior. CLI flags `--sync-now` / `--no-sync-now`
|
|
25
|
+
* / `--install-hook` / `--no-install-hook` give scripts explicit
|
|
26
|
+
* control.
|
|
27
|
+
*/
|
|
28
|
+
export interface PostAddPromptInput {
|
|
29
|
+
hookAlreadyInstalled: boolean;
|
|
30
|
+
}
|
|
31
|
+
export interface PostAddPromptResult {
|
|
32
|
+
syncNow: boolean;
|
|
33
|
+
installHook: boolean;
|
|
34
|
+
}
|
|
35
|
+
export type PostAddPromptFn = (input: PostAddPromptInput) => Promise<PostAddPromptResult>;
|
|
11
36
|
export declare function registerSkillsSource(program: Command): void;
|
|
12
37
|
//# sourceMappingURL=skills-source.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-source.d.ts","sourceRoot":"","sources":["../../src/commands/skills-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"skills-source.d.ts","sourceRoot":"","sources":["../../src/commands/skills-source.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+EzC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,kBAAkB;IACjC,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AACD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAyB1F,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgX3D"}
|