@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,29 @@
|
|
|
1
|
+
export interface DeprecateInput {
|
|
2
|
+
slug: string;
|
|
3
|
+
version: string;
|
|
4
|
+
reason: string | null;
|
|
5
|
+
replacedBy: string | null;
|
|
6
|
+
fetcher?: typeof fetch;
|
|
7
|
+
}
|
|
8
|
+
export interface DeprecateResult {
|
|
9
|
+
ok: boolean;
|
|
10
|
+
slug?: string;
|
|
11
|
+
version?: string;
|
|
12
|
+
alreadyDeprecated?: boolean;
|
|
13
|
+
deprecatedAt?: string | null;
|
|
14
|
+
replacedBy?: string | null;
|
|
15
|
+
reason?: string;
|
|
16
|
+
code?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function deprecateSkillVersion(input: DeprecateInput): Promise<DeprecateResult>;
|
|
19
|
+
export interface SyncInput {
|
|
20
|
+
slug: string;
|
|
21
|
+
fetcher?: typeof fetch;
|
|
22
|
+
}
|
|
23
|
+
export interface SyncResult {
|
|
24
|
+
ok: boolean;
|
|
25
|
+
slug?: string;
|
|
26
|
+
reason?: string;
|
|
27
|
+
code?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function syncSkillFromHub(input: SyncInput): Promise<SyncResult>;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// `yome skill deprecate <slug>@<version>` and
|
|
2
|
+
// `yome skill sync <slug>` — owner-only mutations against the hub.
|
|
3
|
+
//
|
|
4
|
+
// Both:
|
|
5
|
+
// - require `yome login` (Authorization: Bearer <yome_token>)
|
|
6
|
+
// - go to /api/hub/skills/<slug>/... endpoints
|
|
7
|
+
// - return a structured result so the cli wrapper can format / --json
|
|
8
|
+
//
|
|
9
|
+
// Deprecate is fully implemented today (PR 1).
|
|
10
|
+
// Sync is a thin client around the 501-stub endpoint until PR 3 ships
|
|
11
|
+
// the GitHub App + clone pipeline.
|
|
12
|
+
import { readAuthState } from './auth.js';
|
|
13
|
+
const DEFAULT_HUB_BASE = 'https://yome.work';
|
|
14
|
+
function hubBase() {
|
|
15
|
+
return (process.env.YOME_HUB_BASE ?? DEFAULT_HUB_BASE).replace(/\/+$/, '');
|
|
16
|
+
}
|
|
17
|
+
export async function deprecateSkillVersion(input) {
|
|
18
|
+
const auth = readAuthState();
|
|
19
|
+
if (!auth)
|
|
20
|
+
return { ok: false, reason: 'not logged in — run `yome login` first', code: 'unauthenticated' };
|
|
21
|
+
const url = `${hubBase()}/api/hub/skills/${encodeURIComponent(input.slug)}/versions/` +
|
|
22
|
+
`${encodeURIComponent(input.version)}/deprecate`;
|
|
23
|
+
const fetcher = input.fetcher ?? fetch;
|
|
24
|
+
let resp;
|
|
25
|
+
try {
|
|
26
|
+
resp = await fetcher(url, {
|
|
27
|
+
method: 'POST',
|
|
28
|
+
headers: {
|
|
29
|
+
'Content-Type': 'application/json',
|
|
30
|
+
Authorization: `Bearer ${auth.yome_token}`,
|
|
31
|
+
'User-Agent': 'yome-cli/0.1',
|
|
32
|
+
},
|
|
33
|
+
body: JSON.stringify({
|
|
34
|
+
reason: input.reason,
|
|
35
|
+
replaced_by: input.replacedBy,
|
|
36
|
+
}),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
return { ok: false, reason: `request failed: ${e.message}` };
|
|
41
|
+
}
|
|
42
|
+
let parsed = null;
|
|
43
|
+
try {
|
|
44
|
+
parsed = await resp.json();
|
|
45
|
+
}
|
|
46
|
+
catch { /* tolerate empty body */ }
|
|
47
|
+
if (!resp.ok) {
|
|
48
|
+
const reason = parsed && typeof parsed === 'object' && 'error' in parsed
|
|
49
|
+
? String(parsed.error)
|
|
50
|
+
: `HTTP ${resp.status}`;
|
|
51
|
+
const code = parsed && typeof parsed === 'object' && 'code' in parsed
|
|
52
|
+
? String(parsed.code) : undefined;
|
|
53
|
+
return { ok: false, reason, code };
|
|
54
|
+
}
|
|
55
|
+
const obj = parsed;
|
|
56
|
+
return {
|
|
57
|
+
ok: true,
|
|
58
|
+
slug: obj.slug,
|
|
59
|
+
version: obj.version,
|
|
60
|
+
alreadyDeprecated: Boolean(obj.already_deprecated),
|
|
61
|
+
deprecatedAt: obj.deprecated_at ?? null,
|
|
62
|
+
replacedBy: obj.replaced_by_version ?? null,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export async function syncSkillFromHub(input) {
|
|
66
|
+
const auth = readAuthState();
|
|
67
|
+
if (!auth)
|
|
68
|
+
return { ok: false, reason: 'not logged in — run `yome login` first', code: 'unauthenticated' };
|
|
69
|
+
const url = `${hubBase()}/api/hub/skills/${encodeURIComponent(input.slug)}/sync`;
|
|
70
|
+
const fetcher = input.fetcher ?? fetch;
|
|
71
|
+
let resp;
|
|
72
|
+
try {
|
|
73
|
+
resp = await fetcher(url, {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers: {
|
|
76
|
+
Authorization: `Bearer ${auth.yome_token}`,
|
|
77
|
+
'User-Agent': 'yome-cli/0.1',
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
return { ok: false, reason: `request failed: ${e.message}` };
|
|
83
|
+
}
|
|
84
|
+
let parsed = null;
|
|
85
|
+
try {
|
|
86
|
+
parsed = await resp.json();
|
|
87
|
+
}
|
|
88
|
+
catch { /* tolerate */ }
|
|
89
|
+
if (!resp.ok) {
|
|
90
|
+
const reason = parsed && typeof parsed === 'object' && 'error' in parsed
|
|
91
|
+
? String(parsed.error)
|
|
92
|
+
: `HTTP ${resp.status}`;
|
|
93
|
+
const code = parsed && typeof parsed === 'object' && 'code' in parsed
|
|
94
|
+
? String(parsed.code) : undefined;
|
|
95
|
+
return { ok: false, reason, code };
|
|
96
|
+
}
|
|
97
|
+
return { ok: true, slug: input.slug };
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=deprecate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deprecate.js","sourceRoot":"","sources":["../../src/yomeSkills/deprecate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface LinkResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
slug?: string;
|
|
4
|
+
installedAt?: string;
|
|
5
|
+
linkedTo?: string;
|
|
6
|
+
reason?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface UnlinkResult {
|
|
9
|
+
ok: boolean;
|
|
10
|
+
slug: string;
|
|
11
|
+
unlinkedAt?: string;
|
|
12
|
+
reason?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function linkSkill(source: string, opts?: {
|
|
15
|
+
force?: boolean;
|
|
16
|
+
}): LinkResult;
|
|
17
|
+
export declare function unlinkSkill(slug: string): UnlinkResult;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// `yome skill link <path>` / `yome skill unlink <slug>` — point a slug
|
|
2
|
+
// in the registry at a working-directory copy on disk.
|
|
3
|
+
//
|
|
4
|
+
// Why symlinks (vs copying): the whole point of dev-link is "edit
|
|
5
|
+
// signature/viewer/cases live and have the agent see changes without
|
|
6
|
+
// reinstalling". A symlink at ~/.yome/skills/<owner>/<name>/ → user's
|
|
7
|
+
// working dir achieves that with zero machinery.
|
|
8
|
+
//
|
|
9
|
+
// On Windows, symlink creation requires admin or developer mode. We fall
|
|
10
|
+
// back to a junction or — worst case — print an actionable error.
|
|
11
|
+
import { existsSync, lstatSync, symlinkSync, unlinkSync, mkdirSync, rmSync } from 'fs';
|
|
12
|
+
import { resolve, dirname } from 'path';
|
|
13
|
+
import { readManifest, validateManifest } from './manifest.js';
|
|
14
|
+
import { installPathForSlug, parseSlug } from './paths.js';
|
|
15
|
+
import { writeInstallMeta, clearInstallMeta } from './installMeta.js';
|
|
16
|
+
import { refreshIndex } from './skillsIndex.js';
|
|
17
|
+
export function linkSkill(source, opts = {}) {
|
|
18
|
+
const abs = resolve(source);
|
|
19
|
+
if (!existsSync(abs))
|
|
20
|
+
return { ok: false, reason: `path does not exist: ${abs}` };
|
|
21
|
+
const manifest = readManifest(abs);
|
|
22
|
+
if (!manifest)
|
|
23
|
+
return { ok: false, reason: `${abs}/yome-skill.json missing or unreadable` };
|
|
24
|
+
const v = validateManifest(manifest);
|
|
25
|
+
if (!v.ok)
|
|
26
|
+
return { ok: false, reason: `manifest invalid: ${v.errors.join('; ')}` };
|
|
27
|
+
const slugP = parseSlug(manifest.slug);
|
|
28
|
+
if (!slugP)
|
|
29
|
+
return { ok: false, reason: `slug "${manifest.slug}" is malformed` };
|
|
30
|
+
const dest = installPathForSlug(manifest.slug);
|
|
31
|
+
if (!dest)
|
|
32
|
+
return { ok: false, reason: `cannot derive install path for ${manifest.slug}` };
|
|
33
|
+
if (existsSync(dest) || isSymlink(dest)) {
|
|
34
|
+
if (!opts.force) {
|
|
35
|
+
return { ok: false, reason: `${manifest.slug} already at ${dest} (use --force to replace)` };
|
|
36
|
+
}
|
|
37
|
+
rmSync(dest, { recursive: true, force: true });
|
|
38
|
+
}
|
|
39
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
40
|
+
try {
|
|
41
|
+
symlinkSync(abs, dest, 'dir');
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
return { ok: false, reason: `symlink failed: ${e.message}` };
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
writeInstallMeta(manifest.slug, {
|
|
48
|
+
source: `dev-link:${abs}`,
|
|
49
|
+
installed_at: new Date().toISOString(),
|
|
50
|
+
manifest_version: manifest.version,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
catch { /* best effort */ }
|
|
54
|
+
try {
|
|
55
|
+
refreshIndex();
|
|
56
|
+
}
|
|
57
|
+
catch { /* best effort */ }
|
|
58
|
+
return { ok: true, slug: manifest.slug, installedAt: dest, linkedTo: abs };
|
|
59
|
+
}
|
|
60
|
+
export function unlinkSkill(slug) {
|
|
61
|
+
const dest = installPathForSlug(slug);
|
|
62
|
+
if (!dest)
|
|
63
|
+
return { ok: false, slug, reason: `slug "${slug}" is malformed` };
|
|
64
|
+
if (!existsSync(dest) && !isSymlink(dest)) {
|
|
65
|
+
return { ok: false, slug, reason: `${slug} is not installed at ${dest}` };
|
|
66
|
+
}
|
|
67
|
+
if (!isSymlink(dest)) {
|
|
68
|
+
return { ok: false, slug, reason: `${slug} is installed but not a dev-link (use 'yome skill uninstall' instead)` };
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
unlinkSync(dest);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
return { ok: false, slug, reason: `unlink failed: ${e.message}` };
|
|
75
|
+
}
|
|
76
|
+
clearInstallMeta(slug);
|
|
77
|
+
try {
|
|
78
|
+
refreshIndex();
|
|
79
|
+
}
|
|
80
|
+
catch { /* best effort */ }
|
|
81
|
+
return { ok: true, slug, unlinkedAt: dest };
|
|
82
|
+
}
|
|
83
|
+
function isSymlink(p) {
|
|
84
|
+
try {
|
|
85
|
+
return lstatSync(p).isSymbolicLink();
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=devLink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devLink.js","sourceRoot":"","sources":["../../src/yomeSkills/devLink.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
interface DoctorIssue {
|
|
2
|
+
level: 'error' | 'warning';
|
|
3
|
+
slug?: string;
|
|
4
|
+
path?: string;
|
|
5
|
+
message: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DoctorReport {
|
|
8
|
+
ok: boolean;
|
|
9
|
+
scanned: number;
|
|
10
|
+
issues: DoctorIssue[];
|
|
11
|
+
}
|
|
12
|
+
export declare function runDoctor(): DoctorReport;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// `yome skill doctor` — sanity-check the local registry.
|
|
2
|
+
//
|
|
3
|
+
// Detects:
|
|
4
|
+
// - Skills present on disk but with broken / missing yome-skill.json
|
|
5
|
+
// - Stale .index.json (entries that no longer have a backing dir)
|
|
6
|
+
// - Capability grants for skills whose declared system_capabilities have
|
|
7
|
+
// since shrunk (orphan grants — safe but noisy)
|
|
8
|
+
// - Dev-link symlinks pointing at deleted source dirs
|
|
9
|
+
// - Missing .install-meta.json (legacy; warn-only — can't update)
|
|
10
|
+
//
|
|
11
|
+
// Exit codes: 0 = no issues, 1 = at least one issue.
|
|
12
|
+
//
|
|
13
|
+
// `doctor` does NOT fix anything by itself — it just reports. The user
|
|
14
|
+
// follows up with `yome skill uninstall <slug>` or `yome skill install
|
|
15
|
+
// <source> --force` as appropriate.
|
|
16
|
+
import { existsSync, readdirSync, statSync, lstatSync, readlinkSync } from 'fs';
|
|
17
|
+
import { join } from 'path';
|
|
18
|
+
import { getYomeSkillsRoot } from './paths.js';
|
|
19
|
+
import { readManifest } from './manifest.js';
|
|
20
|
+
import { readInstallMeta } from './installMeta.js';
|
|
21
|
+
import { readAllowedCapabilities, normaliseDeclared, KNOWN_CAPABILITIES, } from './capabilities.js';
|
|
22
|
+
import { readIndex } from './skillsIndex.js';
|
|
23
|
+
function listInstallDirs() {
|
|
24
|
+
const root = getYomeSkillsRoot();
|
|
25
|
+
if (!existsSync(root))
|
|
26
|
+
return [];
|
|
27
|
+
const out = [];
|
|
28
|
+
for (const owner of readdirSync(root)) {
|
|
29
|
+
if (owner.startsWith('.'))
|
|
30
|
+
continue;
|
|
31
|
+
const ownerPath = join(root, owner);
|
|
32
|
+
if (!statSync(ownerPath).isDirectory())
|
|
33
|
+
continue;
|
|
34
|
+
for (const name of readdirSync(ownerPath)) {
|
|
35
|
+
if (name.startsWith('.'))
|
|
36
|
+
continue;
|
|
37
|
+
const dir = join(ownerPath, name);
|
|
38
|
+
const lst = lstatSync(dir);
|
|
39
|
+
const isLink = lst.isSymbolicLink();
|
|
40
|
+
const linkTarget = isLink ? readlinkSync(dir) : undefined;
|
|
41
|
+
// Only treat as a real install if it's a directory or a symlink to one.
|
|
42
|
+
try {
|
|
43
|
+
const target = isLink ? statSync(dir) : lst;
|
|
44
|
+
if (!target.isDirectory())
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// Broken symlink — surface this as an issue below.
|
|
49
|
+
out.push({ slug: `@${owner}/${name}`, dir, isLink: true, linkTarget });
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
out.push({ slug: `@${owner}/${name}`, dir, isLink, linkTarget });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
export function runDoctor() {
|
|
58
|
+
const issues = [];
|
|
59
|
+
const installs = listInstallDirs();
|
|
60
|
+
const seenSlugs = new Set();
|
|
61
|
+
for (const it of installs) {
|
|
62
|
+
seenSlugs.add(it.slug);
|
|
63
|
+
// Broken symlink (dev-link target deleted)
|
|
64
|
+
if (it.isLink) {
|
|
65
|
+
try {
|
|
66
|
+
statSync(it.dir);
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
issues.push({
|
|
70
|
+
level: 'error',
|
|
71
|
+
slug: it.slug,
|
|
72
|
+
path: it.dir,
|
|
73
|
+
message: `dev-link points at deleted target ${it.linkTarget}`,
|
|
74
|
+
});
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Manifest readable + slug consistent
|
|
79
|
+
const m = readManifest(it.dir);
|
|
80
|
+
if (!m) {
|
|
81
|
+
issues.push({
|
|
82
|
+
level: 'error',
|
|
83
|
+
slug: it.slug,
|
|
84
|
+
path: it.dir,
|
|
85
|
+
message: 'yome-skill.json missing or unparseable',
|
|
86
|
+
});
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
if (m.slug !== it.slug) {
|
|
90
|
+
issues.push({
|
|
91
|
+
level: 'error',
|
|
92
|
+
slug: it.slug,
|
|
93
|
+
path: it.dir,
|
|
94
|
+
message: `slug mismatch — directory says ${it.slug} but manifest says ${m.slug}`,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// install-meta presence (legacy installs may lack it)
|
|
98
|
+
if (!readInstallMeta(it.slug)) {
|
|
99
|
+
issues.push({
|
|
100
|
+
level: 'warning',
|
|
101
|
+
slug: it.slug,
|
|
102
|
+
message: '.install-meta.json missing — `yome skill update` will not know how to refresh this skill',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// Capability grants vs current declared set
|
|
106
|
+
const allowed = readAllowedCapabilities(it.slug);
|
|
107
|
+
if (allowed) {
|
|
108
|
+
const declared = new Set(normaliseDeclared(m.system_capabilities));
|
|
109
|
+
const orphan = allowed.allowed.filter(c => !declared.has(c));
|
|
110
|
+
if (orphan.length > 0) {
|
|
111
|
+
issues.push({
|
|
112
|
+
level: 'warning',
|
|
113
|
+
slug: it.slug,
|
|
114
|
+
message: `granted capabilities not declared in current manifest: ${orphan.join(', ')} — consider \`yome skill perms ${it.slug} --revoke=<cap>\``,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// Also surface any grant for a cap we no longer recognise
|
|
118
|
+
const unknown = allowed.allowed.filter(c => !KNOWN_CAPABILITIES.includes(c));
|
|
119
|
+
if (unknown.length > 0) {
|
|
120
|
+
issues.push({
|
|
121
|
+
level: 'warning',
|
|
122
|
+
slug: it.slug,
|
|
123
|
+
message: `granted unknown capabilities: ${unknown.join(', ')} (CLI version mismatch?)`,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Index stale check
|
|
129
|
+
const idx = readIndex();
|
|
130
|
+
if (idx) {
|
|
131
|
+
for (const entry of idx.skills) {
|
|
132
|
+
if (!seenSlugs.has(entry.slug)) {
|
|
133
|
+
issues.push({
|
|
134
|
+
level: 'warning',
|
|
135
|
+
slug: entry.slug,
|
|
136
|
+
message: '.index.json lists this skill but no install dir was found — run `yome skill list` to refresh',
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
console.log('DOCTOR REPORT:', JSON.stringify({
|
|
142
|
+
ok: issues.filter(i => i.level === 'error').length === 0,
|
|
143
|
+
scanned: installs.length,
|
|
144
|
+
issues,
|
|
145
|
+
}, null, 2));
|
|
146
|
+
return {
|
|
147
|
+
ok: issues.filter(i => i.level === 'error').length === 0,
|
|
148
|
+
scanned: installs.length,
|
|
149
|
+
issues,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/yomeSkills/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface ToggleResult {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
slug: string;
|
|
4
|
+
state?: 'enabled' | 'disabled';
|
|
5
|
+
reason?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function isSkillDisabled(slug: string): boolean;
|
|
8
|
+
export declare function setSkillEnabled(slug: string, enabled: boolean): ToggleResult;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// `yome skill enable / disable <slug>` — toggle whether the agent
|
|
2
|
+
// runtime should load this installed skill.
|
|
3
|
+
//
|
|
4
|
+
// We persist state as a sentinel file `.yome-disabled` inside the skill's
|
|
5
|
+
// install directory. Rationale (vs a central registry.json):
|
|
6
|
+
// - zero schema migration; uninstall just `rm -rf` the dir, taking the
|
|
7
|
+
// sentinel with it.
|
|
8
|
+
// - works for dev-linked skills too (the flag lives on the symlink
|
|
9
|
+
// target's view but writing is naturally scoped per-skill).
|
|
10
|
+
//
|
|
11
|
+
// `isSkillDisabled()` is exported so the loader (Server side) can read
|
|
12
|
+
// the same flag once we wire the generated registry to honour it.
|
|
13
|
+
import { existsSync, writeFileSync, unlinkSync, mkdirSync } from 'fs';
|
|
14
|
+
import { join, dirname } from 'path';
|
|
15
|
+
import { installPathForSlug } from './paths.js';
|
|
16
|
+
import { refreshIndex } from './skillsIndex.js';
|
|
17
|
+
const DISABLED_MARKER = '.yome-disabled';
|
|
18
|
+
function markerPath(slug) {
|
|
19
|
+
const dir = installPathForSlug(slug);
|
|
20
|
+
if (!dir)
|
|
21
|
+
return null;
|
|
22
|
+
return join(dir, DISABLED_MARKER);
|
|
23
|
+
}
|
|
24
|
+
export function isSkillDisabled(slug) {
|
|
25
|
+
const m = markerPath(slug);
|
|
26
|
+
if (!m)
|
|
27
|
+
return false;
|
|
28
|
+
return existsSync(m);
|
|
29
|
+
}
|
|
30
|
+
export function setSkillEnabled(slug, enabled) {
|
|
31
|
+
const m = markerPath(slug);
|
|
32
|
+
if (!m)
|
|
33
|
+
return { ok: false, slug, reason: 'invalid slug shape (expected @owner/name)' };
|
|
34
|
+
const dir = dirname(m);
|
|
35
|
+
if (!existsSync(dir)) {
|
|
36
|
+
return { ok: false, slug, reason: `skill not installed at ${dir}` };
|
|
37
|
+
}
|
|
38
|
+
if (enabled) {
|
|
39
|
+
if (existsSync(m)) {
|
|
40
|
+
try {
|
|
41
|
+
unlinkSync(m);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
return { ok: false, slug, reason: e.message };
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
refreshIndex();
|
|
49
|
+
}
|
|
50
|
+
catch { /* best effort */ }
|
|
51
|
+
return { ok: true, slug, state: 'enabled' };
|
|
52
|
+
}
|
|
53
|
+
// disabling: write a tiny marker (no schema needed inside)
|
|
54
|
+
try {
|
|
55
|
+
mkdirSync(dir, { recursive: true });
|
|
56
|
+
writeFileSync(m, `disabled at ${new Date().toISOString()}\n`, { mode: 0o644 });
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
return { ok: false, slug, reason: e.message };
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
refreshIndex();
|
|
63
|
+
}
|
|
64
|
+
catch { /* best effort */ }
|
|
65
|
+
return { ok: true, slug, state: 'disabled' };
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=enable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enable.js","sourceRoot":"","sources":["../../src/yomeSkills/enable.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,4CAA4C;AAC5C,EAAE;AACF,0EAA0E;AAC1E,6DAA6D;AAC7D,yEAAyE;AACzE,wBAAwB;AACxB,qEAAqE;AACrE,gEAAgE;AAChE,EAAE;AACF,uEAAuE;AACvE,kEAAkE;AAElE,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,eAAe,GAAG,gBAAgB,CAAC;AASzC,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACrB,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,OAAgB;IAC5D,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,2CAA2C,EAAE,CAAC;IACxF,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B,GAAG,EAAE,EAAE,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC;gBAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAAC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBAAC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;YAAC,CAAC;QAChG,CAAC;QACD,IAAI,CAAC;YAAC,YAAY,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IAC9C,CAAC;IACD,2DAA2D;IAC3D,IAAI,CAAC;QACH,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACpC,aAAa,CAAC,CAAC,EAAE,eAAe,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAG,CAAW,CAAC,OAAO,EAAE,CAAC;IAC3D,CAAC;IACD,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,EAAE,UAAU,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function pingHubInstall(slug: string): Promise<void>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// Best-effort ping to the hub so install_count goes up.
|
|
2
|
+
//
|
|
3
|
+
// Intentionally:
|
|
4
|
+
// - never throws (catches everything)
|
|
5
|
+
// - never blocks longer than ~3s
|
|
6
|
+
// - does nothing if YOME_HUB_PING_DISABLED=1 or YOME_HUB_BASE points
|
|
7
|
+
// at a non-http(s) value
|
|
8
|
+
// - silent on success, only logs on failure when YOME_VERBOSE=1
|
|
9
|
+
//
|
|
10
|
+
// The hub endpoint /api/hub/skills/<slug>/install is anonymous (rate-limited
|
|
11
|
+
// per IP) so we don't need to send any credentials.
|
|
12
|
+
//
|
|
13
|
+
// Returns a promise the caller MAY await. The CLI awaits a short bounded
|
|
14
|
+
// time so the request actually leaves the box before the process exits;
|
|
15
|
+
// other callers can ignore the promise.
|
|
16
|
+
const DEFAULT_HUB_BASE = 'https://yome.work';
|
|
17
|
+
export function pingHubInstall(slug) {
|
|
18
|
+
if (process.env.YOME_HUB_PING_DISABLED === '1')
|
|
19
|
+
return Promise.resolve();
|
|
20
|
+
if (!slug)
|
|
21
|
+
return Promise.resolve();
|
|
22
|
+
const base = (process.env.YOME_HUB_BASE || DEFAULT_HUB_BASE).replace(/\/$/, '');
|
|
23
|
+
if (!/^https?:\/\//.test(base))
|
|
24
|
+
return Promise.resolve();
|
|
25
|
+
const url = `${base}/api/hub/skills/${encodeURIComponent(slug)}/install`;
|
|
26
|
+
const verbose = process.env.YOME_VERBOSE === '1';
|
|
27
|
+
const ctrl = new AbortController();
|
|
28
|
+
const timer = setTimeout(() => ctrl.abort(), 3000);
|
|
29
|
+
return fetch(url, {
|
|
30
|
+
method: 'POST',
|
|
31
|
+
headers: { 'Content-Type': 'application/json', 'User-Agent': 'yome-cli/0.1' },
|
|
32
|
+
body: '{}',
|
|
33
|
+
signal: ctrl.signal,
|
|
34
|
+
})
|
|
35
|
+
.then((r) => { if (verbose)
|
|
36
|
+
console.error(`hub ping ${slug}: ${r.status}`); })
|
|
37
|
+
.catch((e) => { if (verbose)
|
|
38
|
+
console.error(`hub ping ${slug} failed: ${e.message}`); })
|
|
39
|
+
.finally(() => clearTimeout(timer));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=hubPing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hubPing.js","sourceRoot":"","sources":["../../src/yomeSkills/hubPing.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,iBAAiB;AACjB,wCAAwC;AACxC,mCAAmC;AACnC,uEAAuE;AACvE,6BAA6B;AAC7B,kEAAkE;AAClE,EAAE;AACF,6EAA6E;AAC7E,oDAAoD;AACpD,EAAE;AACF,yEAAyE;AACzE,wEAAwE;AACxE,wCAAwC;AAExC,MAAM,gBAAgB,GAAG,mBAAmB,CAAC;AAE7C,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,GAAG;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACzE,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAChF,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAEzD,MAAM,GAAG,GAAG,GAAG,IAAI,mBAAmB,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC;IAEjD,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,CAAC;IAEnD,OAAO,KAAK,CAAC,GAAG,EAAE;QAChB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,cAAc,EAAE;QAC7E,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;SACC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,OAAO;QAAE,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SAC7E,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,OAAO;QAAE,OAAO,CAAC,KAAK,CAAC,YAAY,IAAI,YAAa,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;SACjG,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface InstallOptions {
|
|
2
|
+
/** Overwrite an existing install of the same slug. */
|
|
3
|
+
force?: boolean;
|
|
4
|
+
/** Print verbose progress. */
|
|
5
|
+
verbose?: boolean;
|
|
6
|
+
/** Skip the capability prompt — auto-grant everything declared. CI / scripted use. */
|
|
7
|
+
yes?: boolean;
|
|
8
|
+
/** Skip blacklist check (NEVER do this in production). Default false. */
|
|
9
|
+
skipBlacklist?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface InstallResult {
|
|
12
|
+
ok: boolean;
|
|
13
|
+
slug?: string;
|
|
14
|
+
installedAt?: string;
|
|
15
|
+
copiedFiles?: number;
|
|
16
|
+
reason?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function installFromLocal(source: string, opts?: InstallOptions): Promise<InstallResult>;
|