@poping/yome 0.0.2 → 0.0.4
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/LICENSE +202 -0
- package/NOTICE +11 -0
- package/README.md +306 -27
- package/README.zh-CN.md +333 -0
- package/bin/yome-calwatch +0 -0
- package/dist/agent.d.ts +24 -2
- package/dist/agent.js +34 -2
- package/dist/agent.js.map +1 -1
- package/dist/context.d.ts +2 -0
- package/dist/context.js +121 -13
- package/dist/context.js.map +1 -1
- package/dist/daemon/calendarPermission.d.ts +10 -0
- package/dist/daemon/calendarPermission.js +68 -0
- package/dist/daemon/calendarPermission.js.map +1 -0
- package/dist/daemon/cronCli.d.ts +19 -0
- package/dist/daemon/cronCli.js +403 -0
- package/dist/daemon/cronCli.js.map +1 -0
- package/dist/daemon/envHint.d.ts +5 -0
- package/dist/daemon/envHint.js +139 -0
- package/dist/daemon/envHint.js.map +1 -0
- package/dist/daemon/humanCron.d.ts +1 -0
- package/dist/daemon/humanCron.js +72 -0
- package/dist/daemon/humanCron.js.map +1 -0
- package/dist/daemon/humanOnce.d.ts +1 -0
- package/dist/daemon/humanOnce.js +54 -0
- package/dist/daemon/humanOnce.js.map +1 -0
- package/dist/daemon/index.d.ts +5 -0
- package/dist/daemon/index.js +168 -0
- package/dist/daemon/index.js.map +1 -0
- package/dist/daemon/launchd.d.ts +7 -0
- package/dist/daemon/launchd.js +93 -0
- package/dist/daemon/launchd.js.map +1 -0
- package/dist/daemon/log.d.ts +17 -0
- package/dist/daemon/log.js +57 -0
- package/dist/daemon/log.js.map +1 -0
- package/dist/daemon/paths.d.ts +11 -0
- package/dist/daemon/paths.js +27 -0
- package/dist/daemon/paths.js.map +1 -0
- package/dist/daemon/runTaskEntry.d.ts +1 -0
- package/dist/daemon/runTaskEntry.js +67 -0
- package/dist/daemon/runTaskEntry.js.map +1 -0
- package/dist/daemon/runner.d.ts +21 -0
- package/dist/daemon/runner.js +175 -0
- package/dist/daemon/runner.js.map +1 -0
- package/dist/daemon/scheduler.d.ts +5 -0
- package/dist/daemon/scheduler.js +162 -0
- package/dist/daemon/scheduler.js.map +1 -0
- package/dist/daemon/taskStore.d.ts +62 -0
- package/dist/daemon/taskStore.js +88 -0
- package/dist/daemon/taskStore.js.map +1 -0
- package/dist/daemon/triggers/calendar.d.ts +8 -0
- package/dist/daemon/triggers/calendar.js +248 -0
- package/dist/daemon/triggers/calendar.js.map +1 -0
- package/dist/daemon/triggers/childRunner.d.ts +14 -0
- package/dist/daemon/triggers/childRunner.js +111 -0
- package/dist/daemon/triggers/childRunner.js.map +1 -0
- package/dist/daemon/triggers/cron.d.ts +14 -0
- package/dist/daemon/triggers/cron.js +91 -0
- package/dist/daemon/triggers/cron.js.map +1 -0
- package/dist/daemon/triggers/file.d.ts +7 -0
- package/dist/daemon/triggers/file.js +123 -0
- package/dist/daemon/triggers/file.js.map +1 -0
- package/dist/daemon/triggers/once.d.ts +10 -0
- package/dist/daemon/triggers/once.js +80 -0
- package/dist/daemon/triggers/once.js.map +1 -0
- package/dist/index.js +240 -15
- package/dist/index.js.map +1 -1
- package/dist/llm.js +45 -2
- package/dist/llm.js.map +1 -1
- package/dist/loops/chain.js +8 -0
- package/dist/loops/chain.js.map +1 -1
- package/dist/loops/evaluator.js +8 -0
- package/dist/loops/evaluator.js.map +1 -1
- package/dist/loops/orchestrator.js +8 -0
- package/dist/loops/orchestrator.js.map +1 -1
- package/dist/loops/parallel.js.map +1 -1
- package/dist/loops/route.js +8 -0
- package/dist/loops/route.js.map +1 -1
- package/dist/loops/simple.js +15 -0
- package/dist/loops/simple.js.map +1 -1
- package/dist/permissions/index.d.ts +1 -1
- package/dist/permissions/index.js +1 -1
- package/dist/permissions/index.js.map +1 -1
- package/dist/permissions/loader.d.ts +20 -1
- package/dist/permissions/loader.js +51 -0
- package/dist/permissions/loader.js.map +1 -1
- package/dist/redact.d.ts +56 -0
- package/dist/redact.js +191 -0
- package/dist/redact.js.map +1 -0
- package/dist/skills/runner/applescript.d.ts +49 -0
- package/dist/skills/runner/applescript.js +100 -0
- package/dist/skills/runner/applescript.js.map +1 -0
- package/dist/skills/runner/dispatcher.d.ts +128 -0
- package/dist/skills/runner/dispatcher.js +617 -0
- package/dist/skills/runner/dispatcher.js.map +1 -0
- package/dist/skills/runner/dispatcher.test.d.ts +1 -0
- package/dist/skills/runner/dispatcher.test.js +141 -0
- package/dist/skills/runner/dispatcher.test.js.map +1 -0
- package/dist/skills/runner/kernel.d.ts +8 -0
- package/dist/skills/runner/kernel.js +731 -0
- package/dist/skills/runner/kernel.js.map +1 -0
- package/dist/skills/runner/nodeBackend.d.ts +32 -0
- package/dist/skills/runner/nodeBackend.js +147 -0
- package/dist/skills/runner/nodeBackend.js.map +1 -0
- package/dist/skills/runner/tokenizer.d.ts +36 -0
- package/dist/skills/runner/tokenizer.js +177 -0
- package/dist/skills/runner/tokenizer.js.map +1 -0
- package/dist/state/todos.d.ts +12 -0
- package/dist/state/todos.js +32 -0
- package/dist/state/todos.js.map +1 -0
- package/dist/threadCli.d.ts +11 -0
- package/dist/threadCli.js +177 -0
- package/dist/threadCli.js.map +1 -0
- package/dist/threadShare.d.ts +21 -0
- package/dist/threadShare.js +121 -0
- package/dist/threadShare.js.map +1 -0
- package/dist/threadSubmit.d.ts +32 -0
- package/dist/threadSubmit.js +199 -0
- package/dist/threadSubmit.js.map +1 -0
- package/dist/tools/askUser.d.ts +20 -0
- package/dist/tools/askUser.js +126 -0
- package/dist/tools/askUser.js.map +1 -0
- package/dist/tools/bash.js +63 -14
- package/dist/tools/bash.js.map +1 -1
- package/dist/tools/index.d.ts +24 -2
- package/dist/tools/index.js +54 -5
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/skillCall.d.ts +2 -0
- package/dist/tools/skillCall.js +77 -0
- package/dist/tools/skillCall.js.map +1 -0
- package/dist/tools/todoWrite.d.ts +2 -0
- package/dist/tools/todoWrite.js +141 -0
- package/dist/tools/todoWrite.js.map +1 -0
- package/dist/tools/yome.d.ts +2 -0
- package/dist/tools/yome.js +87 -0
- package/dist/tools/yome.js.map +1 -0
- package/dist/ui/AgentPicker.js +3 -3
- package/dist/ui/AgentPicker.js.map +1 -1
- package/dist/ui/App.js +263 -61
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/AskUserPrompt.d.ts +7 -0
- package/dist/ui/AskUserPrompt.js +78 -0
- package/dist/ui/AskUserPrompt.js.map +1 -0
- package/dist/ui/Banner.d.ts +2 -1
- package/dist/ui/Banner.js +23 -4
- package/dist/ui/Banner.js.map +1 -1
- package/dist/ui/InputBar.js +25 -36
- package/dist/ui/InputBar.js.map +1 -1
- package/dist/ui/Markdown.d.ts +2 -2
- package/dist/ui/Markdown.js +22 -7
- package/dist/ui/Markdown.js.map +1 -1
- package/dist/ui/MarketplacePicker.d.ts +7 -0
- package/dist/ui/MarketplacePicker.js +122 -0
- package/dist/ui/MarketplacePicker.js.map +1 -0
- package/dist/ui/MessageList.d.ts +12 -1
- package/dist/ui/MessageList.js +72 -7
- package/dist/ui/MessageList.js.map +1 -1
- package/dist/ui/ModelPicker.js +4 -4
- package/dist/ui/ModelPicker.js.map +1 -1
- package/dist/ui/MultilineTextInput.d.ts +31 -0
- package/dist/ui/MultilineTextInput.js +393 -0
- package/dist/ui/MultilineTextInput.js.map +1 -0
- package/dist/ui/MultilineTextInput.test.d.ts +1 -0
- package/dist/ui/MultilineTextInput.test.js +30 -0
- package/dist/ui/MultilineTextInput.test.js.map +1 -0
- package/dist/ui/PermissionPrompt.d.ts +16 -4
- package/dist/ui/PermissionPrompt.js +60 -15
- package/dist/ui/PermissionPrompt.js.map +1 -1
- package/dist/ui/SessionPicker.js +2 -2
- package/dist/ui/SessionPicker.js.map +1 -1
- package/dist/ui/ShimmerText.d.ts +8 -0
- package/dist/ui/ShimmerText.js +40 -0
- package/dist/ui/ShimmerText.js.map +1 -0
- package/dist/ui/Spinner.js +3 -9
- package/dist/ui/Spinner.js.map +1 -1
- package/dist/ui/TodoPanel.d.ts +7 -0
- package/dist/ui/TodoPanel.js +36 -0
- package/dist/ui/TodoPanel.js.map +1 -0
- package/dist/ui/TogglePicker.js +4 -4
- package/dist/ui/TogglePicker.js.map +1 -1
- package/dist/ui/ToolResult.js +6 -0
- package/dist/ui/ToolResult.js.map +1 -1
- package/dist/ui/UnifiedSkillsPicker.d.ts +10 -0
- package/dist/ui/UnifiedSkillsPicker.js +63 -0
- package/dist/ui/UnifiedSkillsPicker.js.map +1 -0
- package/dist/ui/animation.d.ts +3 -0
- package/dist/ui/animation.js +48 -0
- package/dist/ui/animation.js.map +1 -0
- package/dist/ui/useThrottledStream.d.ts +7 -0
- package/dist/ui/useThrottledStream.js +63 -0
- package/dist/ui/useThrottledStream.js.map +1 -0
- package/dist/yomeSkills/auth.d.ts +20 -0
- package/dist/yomeSkills/auth.js +70 -0
- package/dist/yomeSkills/auth.js.map +1 -0
- package/dist/yomeSkills/blacklist.d.ts +33 -0
- package/dist/yomeSkills/blacklist.js +101 -0
- package/dist/yomeSkills/blacklist.js.map +1 -0
- package/dist/yomeSkills/capabilities.d.ts +54 -0
- package/dist/yomeSkills/capabilities.js +175 -0
- package/dist/yomeSkills/capabilities.js.map +1 -0
- package/dist/yomeSkills/capabilityGuard.d.ts +31 -0
- package/dist/yomeSkills/capabilityGuard.js +113 -0
- package/dist/yomeSkills/capabilityGuard.js.map +1 -0
- package/dist/yomeSkills/cli.d.ts +25 -0
- package/dist/yomeSkills/cli.js +624 -0
- package/dist/yomeSkills/cli.js.map +1 -0
- package/dist/yomeSkills/deprecate.d.ts +29 -0
- package/dist/yomeSkills/deprecate.js +99 -0
- package/dist/yomeSkills/deprecate.js.map +1 -0
- package/dist/yomeSkills/devLink.d.ts +17 -0
- package/dist/yomeSkills/devLink.js +91 -0
- package/dist/yomeSkills/devLink.js.map +1 -0
- package/dist/yomeSkills/doctor.d.ts +13 -0
- package/dist/yomeSkills/doctor.js +152 -0
- package/dist/yomeSkills/doctor.js.map +1 -0
- package/dist/yomeSkills/enable.d.ts +8 -0
- package/dist/yomeSkills/enable.js +67 -0
- package/dist/yomeSkills/enable.js.map +1 -0
- package/dist/yomeSkills/hubPing.d.ts +1 -0
- package/dist/yomeSkills/hubPing.js +41 -0
- package/dist/yomeSkills/hubPing.js.map +1 -0
- package/dist/yomeSkills/install.d.ts +18 -0
- package/dist/yomeSkills/install.js +143 -0
- package/dist/yomeSkills/install.js.map +1 -0
- package/dist/yomeSkills/installFromHubTarball.d.ts +26 -0
- package/dist/yomeSkills/installFromHubTarball.js +161 -0
- package/dist/yomeSkills/installFromHubTarball.js.map +1 -0
- package/dist/yomeSkills/installGithub.d.ts +33 -0
- package/dist/yomeSkills/installGithub.js +213 -0
- package/dist/yomeSkills/installGithub.js.map +1 -0
- package/dist/yomeSkills/installMeta.d.ts +8 -0
- package/dist/yomeSkills/installMeta.js +76 -0
- package/dist/yomeSkills/installMeta.js.map +1 -0
- package/dist/yomeSkills/integrity.d.ts +26 -0
- package/dist/yomeSkills/integrity.js +107 -0
- package/dist/yomeSkills/integrity.js.map +1 -0
- package/dist/yomeSkills/invoke.d.ts +29 -0
- package/dist/yomeSkills/invoke.js +135 -0
- package/dist/yomeSkills/invoke.js.map +1 -0
- package/dist/yomeSkills/list.d.ts +11 -0
- package/dist/yomeSkills/list.js +55 -0
- package/dist/yomeSkills/list.js.map +1 -0
- package/dist/yomeSkills/login.d.ts +41 -0
- package/dist/yomeSkills/login.js +221 -0
- package/dist/yomeSkills/login.js.map +1 -0
- package/dist/yomeSkills/manifest.d.ts +60 -0
- package/dist/yomeSkills/manifest.js +47 -0
- package/dist/yomeSkills/manifest.js.map +1 -0
- package/dist/yomeSkills/paths.d.ts +13 -0
- package/dist/yomeSkills/paths.js +33 -0
- package/dist/yomeSkills/paths.js.map +1 -0
- package/dist/yomeSkills/publish.d.ts +18 -0
- package/dist/yomeSkills/publish.js +114 -0
- package/dist/yomeSkills/publish.js.map +1 -0
- package/dist/yomeSkills/rollback.d.ts +10 -0
- package/dist/yomeSkills/rollback.js +83 -0
- package/dist/yomeSkills/rollback.js.map +1 -0
- package/dist/yomeSkills/search.d.ts +21 -0
- package/dist/yomeSkills/search.js +31 -0
- package/dist/yomeSkills/search.js.map +1 -0
- package/dist/yomeSkills/skillsIndex.d.ts +36 -0
- package/dist/yomeSkills/skillsIndex.js +111 -0
- package/dist/yomeSkills/skillsIndex.js.map +1 -0
- package/dist/yomeSkills/unified.d.ts +53 -0
- package/dist/yomeSkills/unified.js +187 -0
- package/dist/yomeSkills/unified.js.map +1 -0
- package/dist/yomeSkills/uninstall.d.ts +7 -0
- package/dist/yomeSkills/uninstall.js +22 -0
- package/dist/yomeSkills/uninstall.js.map +1 -0
- package/dist/yomeSkills/update.d.ts +18 -0
- package/dist/yomeSkills/update.js +75 -0
- package/dist/yomeSkills/update.js.map +1 -0
- package/dist/yomeSkills/validate.d.ts +11 -0
- package/dist/yomeSkills/validate.js +99 -0
- package/dist/yomeSkills/validate.js.map +1 -0
- package/package.json +23 -6
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface SearchHit {
|
|
2
|
+
slug: string;
|
|
3
|
+
domain: string;
|
|
4
|
+
name: string | null;
|
|
5
|
+
description: string | null;
|
|
6
|
+
is_official: boolean;
|
|
7
|
+
star_count: number;
|
|
8
|
+
install_count: number;
|
|
9
|
+
github_full_name: string | null;
|
|
10
|
+
latest_version: string | null;
|
|
11
|
+
}
|
|
12
|
+
export interface SearchOptions {
|
|
13
|
+
hubBase?: string;
|
|
14
|
+
limit?: number;
|
|
15
|
+
fetcher?: typeof fetch;
|
|
16
|
+
}
|
|
17
|
+
export declare function searchHub(query: string, opts?: SearchOptions): Promise<{
|
|
18
|
+
ok: boolean;
|
|
19
|
+
hits: SearchHit[];
|
|
20
|
+
reason?: string;
|
|
21
|
+
}>;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// `yome skill search <query>` — call the hub's catalogue and render
|
|
2
|
+
// either a table or JSON.
|
|
3
|
+
const DEFAULT_HUB_BASE = 'https://yome.work';
|
|
4
|
+
export async function searchHub(query, opts = {}) {
|
|
5
|
+
const hubBase = (opts.hubBase ?? process.env.YOME_HUB_BASE ?? DEFAULT_HUB_BASE).replace(/\/$/, '');
|
|
6
|
+
const limit = opts.limit ?? 25;
|
|
7
|
+
const url = `${hubBase}/api/hub/skills?q=${encodeURIComponent(query)}&limit=${limit}`;
|
|
8
|
+
const fetcher = opts.fetcher ?? fetch;
|
|
9
|
+
let resp;
|
|
10
|
+
try {
|
|
11
|
+
resp = await fetcher(url, { headers: { Accept: 'application/json', 'User-Agent': 'yome-cli/0.1' } });
|
|
12
|
+
}
|
|
13
|
+
catch (e) {
|
|
14
|
+
return { ok: false, hits: [], reason: `network error: ${e.message}` };
|
|
15
|
+
}
|
|
16
|
+
if (!resp.ok) {
|
|
17
|
+
return { ok: false, hits: [], reason: `hub returned HTTP ${resp.status}` };
|
|
18
|
+
}
|
|
19
|
+
let body;
|
|
20
|
+
try {
|
|
21
|
+
body = await resp.json();
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return { ok: false, hits: [], reason: 'invalid JSON from hub' };
|
|
25
|
+
}
|
|
26
|
+
const arr = Array.isArray(body) ? body
|
|
27
|
+
: (body && typeof body === 'object' && 'hits' in body && Array.isArray(body.hits))
|
|
28
|
+
? body.hits : [];
|
|
29
|
+
return { ok: true, hits: arr };
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/yomeSkills/search.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,0BAA0B;AAoB1B,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAa,EAAE,OAAsB,EAAE;IACrE,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,GAAG,GAAG,GAAG,OAAO,qBAAqB,kBAAkB,CAAC,KAAK,CAAC,UAAU,KAAK,EAAE,CAAC;IACtF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC;IACtC,IAAI,IAAI,CAAC;IACT,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;IACvG,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,kBAAmB,CAAW,CAAC,OAAO,EAAE,EAAE,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,qBAAqB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IAC7E,CAAC;IACD,IAAI,IAAa,CAAC;IAClB,IAAI,CAAC;QAAC,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAAC,CAAC;IAC5G,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;QACpC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAE,IAA0B,CAAC,IAAI,CAAC,CAAC;YACvG,CAAC,CAAE,IAA8B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAChD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAkB,EAAE,CAAC;AAChD,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export interface SkillIndexEntry {
|
|
2
|
+
slug: string;
|
|
3
|
+
domain: string;
|
|
4
|
+
version: string;
|
|
5
|
+
name?: string;
|
|
6
|
+
description?: string;
|
|
7
|
+
installedAt: string;
|
|
8
|
+
status: 'enabled' | 'disabled';
|
|
9
|
+
is_dev_link: boolean;
|
|
10
|
+
/** What the manifest declares it needs. */
|
|
11
|
+
declared_capabilities: string[];
|
|
12
|
+
/** What the user has granted (subset of declared). */
|
|
13
|
+
allowed_capabilities: string[];
|
|
14
|
+
}
|
|
15
|
+
export interface SkillIndex {
|
|
16
|
+
version: 1;
|
|
17
|
+
built_at: string;
|
|
18
|
+
skills: SkillIndexEntry[];
|
|
19
|
+
}
|
|
20
|
+
export declare function getIndexPath(): string;
|
|
21
|
+
/** Build a fresh index by walking the filesystem. */
|
|
22
|
+
export declare function rebuildIndex(): SkillIndex;
|
|
23
|
+
export declare function writeIndex(idx: SkillIndex): void;
|
|
24
|
+
/** Convenience: rebuild + persist. Call from install / uninstall / enable / disable / link / unlink. */
|
|
25
|
+
export declare function refreshIndex(): SkillIndex;
|
|
26
|
+
/**
|
|
27
|
+
* Read the index from disk. Returns null on any error so the caller can
|
|
28
|
+
* fall back to a full walk via `rebuildIndex()`.
|
|
29
|
+
*/
|
|
30
|
+
export declare function readIndex(): SkillIndex | null;
|
|
31
|
+
/**
|
|
32
|
+
* Get the canonical list of installed skills:
|
|
33
|
+
* - If the index is present and parseable, use it (fast path).
|
|
34
|
+
* - Otherwise, walk the filesystem and silently rebuild the index.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getInstalledFast(): SkillIndexEntry[];
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// skillsIndex.ts — fast lookup table for installed skills.
|
|
2
|
+
//
|
|
3
|
+
// Background: `listInstalled()` walks ~/.yome/skills/<owner>/<name>/
|
|
4
|
+
// and parses every yome-skill.json on every call. With 20+ installed
|
|
5
|
+
// skills + every CLI invocation reloading the agent, that's a measurable
|
|
6
|
+
// startup cost.
|
|
7
|
+
//
|
|
8
|
+
// We maintain a sidecar at ~/.yome/skills/.index.json that mirrors a
|
|
9
|
+
// summary of every install. The CLI updates the index whenever it
|
|
10
|
+
// installs / uninstalls / enables / disables / links / unlinks.
|
|
11
|
+
//
|
|
12
|
+
// The index is treated as a CACHE, not source of truth: any consumer
|
|
13
|
+
// that detects corruption falls back to a full directory walk. Callers
|
|
14
|
+
// who want to be sure the index is current call `rebuildIndex()`.
|
|
15
|
+
//
|
|
16
|
+
// Schema (forward-compatible — missing fields are filled in by reload):
|
|
17
|
+
//
|
|
18
|
+
// {
|
|
19
|
+
// version: 1,
|
|
20
|
+
// built_at: ISO,
|
|
21
|
+
// skills: [
|
|
22
|
+
// { slug, domain, version, name?, description?,
|
|
23
|
+
// installedAt, status: 'enabled'|'disabled',
|
|
24
|
+
// is_dev_link, declared_capabilities, allowed_capabilities }
|
|
25
|
+
// ]
|
|
26
|
+
// }
|
|
27
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync, lstatSync } from 'node:fs';
|
|
28
|
+
import { dirname, join } from 'node:path';
|
|
29
|
+
import { listInstalled } from './list.js';
|
|
30
|
+
import { isSkillDisabled } from './enable.js';
|
|
31
|
+
import { readAllowedCapabilities, normaliseDeclared } from './capabilities.js';
|
|
32
|
+
import { getYomeSkillsRoot } from './paths.js';
|
|
33
|
+
export function getIndexPath() {
|
|
34
|
+
return join(getYomeSkillsRoot(), '.index.json');
|
|
35
|
+
}
|
|
36
|
+
/** Build a fresh index by walking the filesystem. */
|
|
37
|
+
export function rebuildIndex() {
|
|
38
|
+
const installed = listInstalled();
|
|
39
|
+
const skills = installed.map((e) => {
|
|
40
|
+
const declared = normaliseDeclared(e.manifest.system_capabilities);
|
|
41
|
+
const allowed = readAllowedCapabilities(e.slug)?.allowed ?? [];
|
|
42
|
+
let isLink = false;
|
|
43
|
+
try {
|
|
44
|
+
isLink = lstatSync(e.installedAt).isSymbolicLink();
|
|
45
|
+
}
|
|
46
|
+
catch { /* ignore */ }
|
|
47
|
+
return {
|
|
48
|
+
slug: e.slug,
|
|
49
|
+
domain: e.domain,
|
|
50
|
+
version: e.version,
|
|
51
|
+
name: e.name,
|
|
52
|
+
description: e.description,
|
|
53
|
+
installedAt: e.installedAt,
|
|
54
|
+
status: isSkillDisabled(e.slug) ? 'disabled' : 'enabled',
|
|
55
|
+
is_dev_link: isLink,
|
|
56
|
+
declared_capabilities: declared,
|
|
57
|
+
allowed_capabilities: allowed,
|
|
58
|
+
};
|
|
59
|
+
});
|
|
60
|
+
const idx = {
|
|
61
|
+
version: 1,
|
|
62
|
+
built_at: new Date().toISOString(),
|
|
63
|
+
skills,
|
|
64
|
+
};
|
|
65
|
+
return idx;
|
|
66
|
+
}
|
|
67
|
+
export function writeIndex(idx) {
|
|
68
|
+
const f = getIndexPath();
|
|
69
|
+
mkdirSync(dirname(f), { recursive: true });
|
|
70
|
+
writeFileSync(f, JSON.stringify(idx, null, 2) + '\n');
|
|
71
|
+
}
|
|
72
|
+
/** Convenience: rebuild + persist. Call from install / uninstall / enable / disable / link / unlink. */
|
|
73
|
+
export function refreshIndex() {
|
|
74
|
+
const idx = rebuildIndex();
|
|
75
|
+
writeIndex(idx);
|
|
76
|
+
return idx;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Read the index from disk. Returns null on any error so the caller can
|
|
80
|
+
* fall back to a full walk via `rebuildIndex()`.
|
|
81
|
+
*/
|
|
82
|
+
export function readIndex() {
|
|
83
|
+
const f = getIndexPath();
|
|
84
|
+
if (!existsSync(f))
|
|
85
|
+
return null;
|
|
86
|
+
try {
|
|
87
|
+
const obj = JSON.parse(readFileSync(f, 'utf-8'));
|
|
88
|
+
if (!obj || typeof obj !== 'object')
|
|
89
|
+
return null;
|
|
90
|
+
if (obj.version !== 1)
|
|
91
|
+
return null;
|
|
92
|
+
if (!Array.isArray(obj.skills))
|
|
93
|
+
return null;
|
|
94
|
+
return obj;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Get the canonical list of installed skills:
|
|
102
|
+
* - If the index is present and parseable, use it (fast path).
|
|
103
|
+
* - Otherwise, walk the filesystem and silently rebuild the index.
|
|
104
|
+
*/
|
|
105
|
+
export function getInstalledFast() {
|
|
106
|
+
const idx = readIndex();
|
|
107
|
+
if (idx)
|
|
108
|
+
return idx.skills;
|
|
109
|
+
return refreshIndex().skills;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=skillsIndex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillsIndex.js","sourceRoot":"","sources":["../../src/yomeSkills/skillsIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { Skill as PromptSkill } from '../skills/types.js';
|
|
2
|
+
export type UnifiedSkillKind = 'prompt' | 'hub';
|
|
3
|
+
export type PromptOrigin = 'yome-user' | 'yome-project';
|
|
4
|
+
export interface UnifiedSkill {
|
|
5
|
+
/** Stable identifier across reloads. */
|
|
6
|
+
id: string;
|
|
7
|
+
/** What the user sees first in the list. */
|
|
8
|
+
name: string;
|
|
9
|
+
/** Long-form, what the skill does. */
|
|
10
|
+
description: string;
|
|
11
|
+
kind: UnifiedSkillKind;
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
/** Path to the skill's directory or main file (for "open" actions). */
|
|
14
|
+
installedAt: string;
|
|
15
|
+
/** ── prompt-only fields ────────────────────────────────────────── */
|
|
16
|
+
promptOrigin?: PromptOrigin;
|
|
17
|
+
promptSkill?: PromptSkill;
|
|
18
|
+
/** ── hub-only fields ───────────────────────────────────────────── */
|
|
19
|
+
slug?: string;
|
|
20
|
+
domain?: string;
|
|
21
|
+
version?: string;
|
|
22
|
+
source?: string;
|
|
23
|
+
declaredCapabilities?: string[];
|
|
24
|
+
allowedCapabilities?: string[];
|
|
25
|
+
isDevLink?: boolean;
|
|
26
|
+
}
|
|
27
|
+
interface RawPromptSkill {
|
|
28
|
+
name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
skillDir: string;
|
|
31
|
+
origin: PromptOrigin;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Discover prompt-style skills under yome's two roots only:
|
|
35
|
+
* ~/.yome/skills/<name>/SKILL.md (user)
|
|
36
|
+
* <cwd>/.yome/skills/<name>/SKILL.md (project)
|
|
37
|
+
* Project-level wins over user-level on name collision.
|
|
38
|
+
*/
|
|
39
|
+
export declare function discoverAllPromptSkills(): RawPromptSkill[];
|
|
40
|
+
/**
|
|
41
|
+
* Returns every skill the agent could currently use, both prompt and hub.
|
|
42
|
+
*
|
|
43
|
+
* Note: yome-style hub skills live at <owner>/<name>/yome-skill.json. The
|
|
44
|
+
* top-level dir under ~/.yome/skills is therefore an OWNER for hub skills
|
|
45
|
+
* but a SKILL NAME for prompt skills. We disambiguate by checking which
|
|
46
|
+
* file lives in the dir — the prompt loader looks for SKILL.md and the
|
|
47
|
+
* hub loader looks for yome-skill.json — so they never accidentally
|
|
48
|
+
* cross-contaminate.
|
|
49
|
+
*/
|
|
50
|
+
export declare function listAllUnified(includeDisabled?: boolean): UnifiedSkill[];
|
|
51
|
+
/** Pretty label for the origin (used in TUI). */
|
|
52
|
+
export declare function originLabel(s: UnifiedSkill): string;
|
|
53
|
+
export {};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
// cli/src/yomeSkills/unified.ts
|
|
2
|
+
//
|
|
3
|
+
// Unified skill view across the two skill systems Yome supports:
|
|
4
|
+
// 1. Prompt skills (Claude Code-compatible SKILL.md FORMAT)
|
|
5
|
+
// - SKILL.md with optional YAML frontmatter
|
|
6
|
+
// - The body is dropped into the agent prompt when triggered
|
|
7
|
+
// - Discovered under 2 roots (yome's own dirs, NOT ~/.claude):
|
|
8
|
+
// ~/.yome/skills/<name>/SKILL.md (yome global)
|
|
9
|
+
// <cwd>/.yome/skills/<name>/SKILL.md (yome project)
|
|
10
|
+
// - We support the FORMAT (so users can drop a Claude SKILL.md
|
|
11
|
+
// unchanged into our directories) but we don't read Claude's own
|
|
12
|
+
// directories — those belong to Claude Code, not us.
|
|
13
|
+
// 2. Hub skills (yome-skill.json — typed command packages)
|
|
14
|
+
// - Discovered under ~/.yome/skills/<owner>/<name>/yome-skill.json
|
|
15
|
+
// - Carry capability grants, backends, signature contracts
|
|
16
|
+
// - Installed via `yome skill install ...` from local / github
|
|
17
|
+
//
|
|
18
|
+
// Both render in the same /skills TUI; users don't need to remember
|
|
19
|
+
// which kind they're looking at unless they want to. The `kind` field
|
|
20
|
+
// tells the UI which actions apply.
|
|
21
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
22
|
+
import { join } from 'node:path';
|
|
23
|
+
import { loadAllSkills, getUserSkillsDir, getProjectSkillsDir } from '../skills/loader.js';
|
|
24
|
+
import { getInstalledFast } from './skillsIndex.js';
|
|
25
|
+
import { isSkillDisabled as isHubSkillDisabled } from './enable.js';
|
|
26
|
+
import { isSkillDisabled as isPromptSkillDisabled } from '../toggleState.js';
|
|
27
|
+
function parseFrontmatterMinimal(raw) {
|
|
28
|
+
const m = raw.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
29
|
+
if (!m)
|
|
30
|
+
return {};
|
|
31
|
+
const fm = {};
|
|
32
|
+
for (const line of m[1].split('\n')) {
|
|
33
|
+
const kv = line.match(/^(\S[\w-]*)\s*:\s*(.*)$/);
|
|
34
|
+
if (!kv)
|
|
35
|
+
continue;
|
|
36
|
+
const k = kv[1];
|
|
37
|
+
const v = kv[2].trim().replace(/^["']|["']$/g, '');
|
|
38
|
+
if (k === 'description')
|
|
39
|
+
fm.description = v;
|
|
40
|
+
else if (k === 'when_to_use')
|
|
41
|
+
fm.whenToUse = v;
|
|
42
|
+
}
|
|
43
|
+
return fm;
|
|
44
|
+
}
|
|
45
|
+
function discoverPromptSkillsAt(dir, origin) {
|
|
46
|
+
if (!existsSync(dir))
|
|
47
|
+
return [];
|
|
48
|
+
const out = [];
|
|
49
|
+
let entries = [];
|
|
50
|
+
try {
|
|
51
|
+
entries = readdirSync(dir).filter((n) => {
|
|
52
|
+
try {
|
|
53
|
+
return statSync(join(dir, n)).isDirectory();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return out;
|
|
62
|
+
}
|
|
63
|
+
for (const name of entries) {
|
|
64
|
+
const skillDir = join(dir, name);
|
|
65
|
+
const skillFile = join(skillDir, 'SKILL.md');
|
|
66
|
+
if (!existsSync(skillFile))
|
|
67
|
+
continue;
|
|
68
|
+
let raw = '';
|
|
69
|
+
try {
|
|
70
|
+
raw = readFileSync(skillFile, 'utf-8');
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const fm = parseFrontmatterMinimal(raw);
|
|
76
|
+
const description = fm.description
|
|
77
|
+
?? raw
|
|
78
|
+
.replace(/^---[\s\S]*?---/, '')
|
|
79
|
+
.split('\n')
|
|
80
|
+
.find((l) => l.trim().length > 0 && !l.startsWith('#'))
|
|
81
|
+
?.trim()
|
|
82
|
+
?? `Skill: ${name}`;
|
|
83
|
+
out.push({ name, description, skillDir, origin });
|
|
84
|
+
}
|
|
85
|
+
return out;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Discover prompt-style skills under yome's two roots only:
|
|
89
|
+
* ~/.yome/skills/<name>/SKILL.md (user)
|
|
90
|
+
* <cwd>/.yome/skills/<name>/SKILL.md (project)
|
|
91
|
+
* Project-level wins over user-level on name collision.
|
|
92
|
+
*/
|
|
93
|
+
export function discoverAllPromptSkills() {
|
|
94
|
+
const yomeUser = discoverPromptSkillsAt(getUserSkillsDir(), 'yome-user');
|
|
95
|
+
const yomeProject = discoverPromptSkillsAt(getProjectSkillsDir(), 'yome-project');
|
|
96
|
+
const byName = new Map();
|
|
97
|
+
for (const s of [...yomeUser, ...yomeProject]) {
|
|
98
|
+
byName.set(s.name, s);
|
|
99
|
+
}
|
|
100
|
+
return Array.from(byName.values());
|
|
101
|
+
}
|
|
102
|
+
// ──────────────────────────────────────────────────────────────────────
|
|
103
|
+
// Unified loader
|
|
104
|
+
// ──────────────────────────────────────────────────────────────────────
|
|
105
|
+
/**
|
|
106
|
+
* Returns every skill the agent could currently use, both prompt and hub.
|
|
107
|
+
*
|
|
108
|
+
* Note: yome-style hub skills live at <owner>/<name>/yome-skill.json. The
|
|
109
|
+
* top-level dir under ~/.yome/skills is therefore an OWNER for hub skills
|
|
110
|
+
* but a SKILL NAME for prompt skills. We disambiguate by checking which
|
|
111
|
+
* file lives in the dir — the prompt loader looks for SKILL.md and the
|
|
112
|
+
* hub loader looks for yome-skill.json — so they never accidentally
|
|
113
|
+
* cross-contaminate.
|
|
114
|
+
*/
|
|
115
|
+
export function listAllUnified(includeDisabled = true) {
|
|
116
|
+
const out = [];
|
|
117
|
+
// Prompt skills (4 roots, dedup by name).
|
|
118
|
+
const promptSkills = loadAllSkills(true); // includeDisabled — we filter below
|
|
119
|
+
const rawByName = new Map();
|
|
120
|
+
for (const r of discoverAllPromptSkills())
|
|
121
|
+
rawByName.set(r.name, r);
|
|
122
|
+
for (const ps of promptSkills) {
|
|
123
|
+
const raw = rawByName.get(ps.name);
|
|
124
|
+
const origin = raw?.origin ?? (ps.source === 'project' ? 'yome-project' : 'yome-user');
|
|
125
|
+
out.push({
|
|
126
|
+
id: `prompt:${origin}:${ps.name}`,
|
|
127
|
+
name: ps.name,
|
|
128
|
+
description: ps.description,
|
|
129
|
+
kind: 'prompt',
|
|
130
|
+
enabled: !isPromptSkillDisabled(ps.name),
|
|
131
|
+
installedAt: ps.skillDir,
|
|
132
|
+
promptOrigin: origin,
|
|
133
|
+
promptSkill: ps,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
// Also surface claude-only skills that loadAllSkills doesn't see (it
|
|
137
|
+
// only walks the .yome/* dirs). discoverAllPromptSkills covers
|
|
138
|
+
// all 4 roots, so anything from .claude/* not already added above
|
|
139
|
+
// gets injected here.
|
|
140
|
+
for (const raw of rawByName.values()) {
|
|
141
|
+
const alreadyAdded = out.some((u) => u.kind === 'prompt' && u.name === raw.name);
|
|
142
|
+
if (alreadyAdded)
|
|
143
|
+
continue;
|
|
144
|
+
out.push({
|
|
145
|
+
id: `prompt:${raw.origin}:${raw.name}`,
|
|
146
|
+
name: raw.name,
|
|
147
|
+
description: raw.description,
|
|
148
|
+
kind: 'prompt',
|
|
149
|
+
enabled: !isPromptSkillDisabled(raw.name),
|
|
150
|
+
installedAt: raw.skillDir,
|
|
151
|
+
promptOrigin: raw.origin,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
// Hub skills.
|
|
155
|
+
const hubEntries = getInstalledFast();
|
|
156
|
+
for (const h of hubEntries) {
|
|
157
|
+
out.push({
|
|
158
|
+
id: `hub:${h.slug}`,
|
|
159
|
+
name: h.name ?? h.slug,
|
|
160
|
+
description: h.description ?? `${h.domain} ${h.version}`,
|
|
161
|
+
kind: 'hub',
|
|
162
|
+
enabled: !isHubSkillDisabled(h.slug) && h.status === 'enabled',
|
|
163
|
+
installedAt: h.installedAt,
|
|
164
|
+
slug: h.slug,
|
|
165
|
+
domain: h.domain,
|
|
166
|
+
version: h.version,
|
|
167
|
+
declaredCapabilities: h.declared_capabilities,
|
|
168
|
+
allowedCapabilities: h.allowed_capabilities,
|
|
169
|
+
isDevLink: h.is_dev_link,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
if (!includeDisabled) {
|
|
173
|
+
return out.filter((s) => s.enabled);
|
|
174
|
+
}
|
|
175
|
+
return out;
|
|
176
|
+
}
|
|
177
|
+
/** Pretty label for the origin (used in TUI). */
|
|
178
|
+
export function originLabel(s) {
|
|
179
|
+
if (s.kind === 'hub')
|
|
180
|
+
return s.isDevLink ? 'hub (dev-link)' : 'hub';
|
|
181
|
+
switch (s.promptOrigin) {
|
|
182
|
+
case 'yome-user': return 'prompt · ~/.yome';
|
|
183
|
+
case 'yome-project': return 'prompt · .yome';
|
|
184
|
+
default: return 'prompt';
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=unified.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified.js","sourceRoot":"","sources":["../../src/yomeSkills/unified.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// `yome skill uninstall <slug>` — remove a previously installed skill.
|
|
2
|
+
import { existsSync, rmSync } from 'fs';
|
|
3
|
+
import { installPathForSlug, parseSlug } from './paths.js';
|
|
4
|
+
import { refreshIndex } from './skillsIndex.js';
|
|
5
|
+
export function uninstallBySlug(slug) {
|
|
6
|
+
const parts = parseSlug(slug);
|
|
7
|
+
if (!parts)
|
|
8
|
+
return { ok: false, reason: `bad slug "${slug}" (expected @<owner>/<name>)` };
|
|
9
|
+
const dir = installPathForSlug(slug);
|
|
10
|
+
if (!dir)
|
|
11
|
+
return { ok: false, reason: `cannot derive install path for ${slug}` };
|
|
12
|
+
if (!existsSync(dir)) {
|
|
13
|
+
return { ok: false, reason: `${slug} not installed at ${dir}` };
|
|
14
|
+
}
|
|
15
|
+
rmSync(dir, { recursive: true, force: true });
|
|
16
|
+
try {
|
|
17
|
+
refreshIndex();
|
|
18
|
+
}
|
|
19
|
+
catch { /* best effort */ }
|
|
20
|
+
return { ok: true, slug: parts.full, removedFrom: dir };
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=uninstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/yomeSkills/uninstall.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAEvE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAShD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,IAAI,8BAA8B,EAAE,CAAC;IAE1F,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kCAAkC,IAAI,EAAE,EAAE,CAAC;IAEjF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,qBAAqB,GAAG,EAAE,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC;QAAC,YAAY,EAAE,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface UpdateOptions {
|
|
2
|
+
verbose?: boolean;
|
|
3
|
+
}
|
|
4
|
+
export interface UpdateRow {
|
|
5
|
+
slug: string;
|
|
6
|
+
source: string | null;
|
|
7
|
+
before: string;
|
|
8
|
+
after: string | null;
|
|
9
|
+
changed: boolean;
|
|
10
|
+
ok: boolean;
|
|
11
|
+
reason?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface UpdateSummary {
|
|
14
|
+
rows: UpdateRow[];
|
|
15
|
+
/** True if every attempted update succeeded (skipped rows count as ok). */
|
|
16
|
+
allOk: boolean;
|
|
17
|
+
}
|
|
18
|
+
export declare function updateSkills(filterSlug: string | undefined, opts?: UpdateOptions): Promise<UpdateSummary>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// `yome skill update [<slug>]` — re-pull installed skills and replace.
|
|
2
|
+
//
|
|
3
|
+
// We rely on `.install-meta.json` to know how each skill was installed.
|
|
4
|
+
// For each candidate skill:
|
|
5
|
+
// - source starts with "github:" → re-run installFromGithub with --force
|
|
6
|
+
// - source starts with "local:" → re-run installFromLocal with --force
|
|
7
|
+
// - source starts with "dev-link" → no-op (the symlink already lives)
|
|
8
|
+
// - source missing → "no install metadata; please reinstall"
|
|
9
|
+
//
|
|
10
|
+
// We compare manifest_version before/after and only print the row if it
|
|
11
|
+
// actually changed (or always if --verbose).
|
|
12
|
+
import { installFromLocal } from './install.js';
|
|
13
|
+
import { installFromGithub } from './installGithub.js';
|
|
14
|
+
import { listInstalled } from './list.js';
|
|
15
|
+
import { readInstallMeta } from './installMeta.js';
|
|
16
|
+
import { readManifest } from './manifest.js';
|
|
17
|
+
export async function updateSkills(filterSlug, opts = {}) {
|
|
18
|
+
const installed = listInstalled();
|
|
19
|
+
const target = filterSlug
|
|
20
|
+
? installed.filter((i) => i.slug === filterSlug)
|
|
21
|
+
: installed;
|
|
22
|
+
const rows = [];
|
|
23
|
+
let allOk = true;
|
|
24
|
+
for (const sk of target) {
|
|
25
|
+
const meta = readInstallMeta(sk.slug);
|
|
26
|
+
const before = sk.version;
|
|
27
|
+
if (!meta) {
|
|
28
|
+
rows.push({ slug: sk.slug, source: null, before, after: null, changed: false, ok: false,
|
|
29
|
+
reason: 'no .install-meta.json (was installed before metadata existed); reinstall manually to enable updates',
|
|
30
|
+
});
|
|
31
|
+
allOk = false;
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
if (meta.source.startsWith('dev-link:')) {
|
|
35
|
+
rows.push({ slug: sk.slug, source: meta.source, before, after: before, changed: false, ok: true,
|
|
36
|
+
reason: 'dev-link (live)',
|
|
37
|
+
});
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
let result;
|
|
41
|
+
if (meta.source.startsWith('github:')) {
|
|
42
|
+
result = await installFromGithub(meta.source, { force: true, verbose: opts.verbose, yes: true });
|
|
43
|
+
}
|
|
44
|
+
else if (meta.source.startsWith('local:')) {
|
|
45
|
+
const path = meta.source.slice('local:'.length);
|
|
46
|
+
result = await installFromLocal(path, { force: true, verbose: opts.verbose, yes: true });
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
rows.push({ slug: sk.slug, source: meta.source, before, after: null, changed: false, ok: false,
|
|
50
|
+
reason: `unsupported source type: ${meta.source}`,
|
|
51
|
+
});
|
|
52
|
+
allOk = false;
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (!result.ok) {
|
|
56
|
+
rows.push({ slug: sk.slug, source: meta.source, before, after: null, changed: false, ok: false,
|
|
57
|
+
reason: result.reason,
|
|
58
|
+
});
|
|
59
|
+
allOk = false;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const reread = readManifest(result.installedAt);
|
|
63
|
+
const after = reread?.version ?? before;
|
|
64
|
+
rows.push({
|
|
65
|
+
slug: sk.slug,
|
|
66
|
+
source: meta.source,
|
|
67
|
+
before,
|
|
68
|
+
after,
|
|
69
|
+
changed: after !== before,
|
|
70
|
+
ok: true,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
return { rows, allOk };
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/yomeSkills/update.ts"],"names":[],"mappings":"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"}
|