skilld 1.7.4 → 2.0.0
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/_chunks/add.mjs +66 -0
- package/dist/_chunks/add.mjs.map +1 -0
- package/dist/_chunks/agent-prompt.mjs +88 -0
- package/dist/_chunks/agent-prompt.mjs.map +1 -0
- package/dist/_chunks/agent.mjs +81 -57
- package/dist/_chunks/agent.mjs.map +1 -1
- package/dist/_chunks/args.mjs +42 -0
- package/dist/_chunks/args.mjs.map +1 -0
- package/dist/_chunks/assemble.mjs +10 -7
- package/dist/_chunks/assemble.mjs.map +1 -1
- package/dist/_chunks/author.mjs +33 -17
- package/dist/_chunks/author.mjs.map +1 -1
- package/dist/_chunks/cache.mjs +143 -183
- package/dist/_chunks/cache.mjs.map +1 -1
- package/dist/_chunks/cache2.mjs +7 -6
- package/dist/_chunks/cache2.mjs.map +1 -1
- package/dist/_chunks/client.mjs +117 -0
- package/dist/_chunks/client.mjs.map +1 -0
- package/dist/_chunks/core.mjs +5 -5
- package/dist/_chunks/detect.mjs +53 -43
- package/dist/_chunks/detect.mjs.map +1 -1
- package/dist/_chunks/eject.mjs +69 -0
- package/dist/_chunks/eject.mjs.map +1 -0
- package/dist/_chunks/embedding-cache2.mjs +1 -1
- package/dist/_chunks/env.mjs +19 -0
- package/dist/_chunks/env.mjs.map +1 -0
- package/dist/_chunks/install-many.mjs +376 -0
- package/dist/_chunks/install-many.mjs.map +1 -0
- package/dist/_chunks/install.mjs +81 -326
- package/dist/_chunks/install.mjs.map +1 -1
- package/dist/_chunks/intro.mjs +63 -0
- package/dist/_chunks/intro.mjs.map +1 -0
- package/dist/_chunks/list.mjs +2 -2
- package/dist/_chunks/list.mjs.map +1 -1
- package/dist/_chunks/lockfile.mjs +3 -2
- package/dist/_chunks/lockfile.mjs.map +1 -1
- package/dist/_chunks/login.mjs +233 -0
- package/dist/_chunks/login.mjs.map +1 -0
- package/dist/_chunks/logout.mjs +27 -0
- package/dist/_chunks/logout.mjs.map +1 -0
- package/dist/_chunks/map.mjs +11 -0
- package/dist/_chunks/map.mjs.map +1 -0
- package/dist/_chunks/markdown.mjs +79 -54
- package/dist/_chunks/markdown.mjs.map +1 -1
- package/dist/_chunks/menu.mjs +33 -0
- package/dist/_chunks/menu.mjs.map +1 -0
- package/dist/_chunks/model-picker.mjs +61 -0
- package/dist/_chunks/model-picker.mjs.map +1 -0
- package/dist/_chunks/monorepo.mjs +4 -2
- package/dist/_chunks/monorepo.mjs.map +1 -1
- package/dist/_chunks/package-json.mjs.map +1 -1
- package/dist/_chunks/paths.mjs +3 -5
- package/dist/_chunks/paths.mjs.map +1 -1
- package/dist/_chunks/{sync-pipeline.mjs → pipeline.mjs} +346 -313
- package/dist/_chunks/pipeline.mjs.map +1 -0
- package/dist/_chunks/pool2.mjs +1 -1
- package/dist/_chunks/portable.mjs +151 -0
- package/dist/_chunks/portable.mjs.map +1 -0
- package/dist/_chunks/prepare-hook.mjs +2 -0
- package/dist/_chunks/prepare-hook2.mjs +61 -0
- package/dist/_chunks/prepare-hook2.mjs.map +1 -0
- package/dist/_chunks/prepare.mjs +47 -3
- package/dist/_chunks/prepare.mjs.map +1 -1
- package/dist/_chunks/prepare2.mjs +7 -6
- package/dist/_chunks/prepare2.mjs.map +1 -1
- package/dist/_chunks/prompts.mjs +484 -74
- package/dist/_chunks/prompts.mjs.map +1 -1
- package/dist/_chunks/pull.mjs +219 -0
- package/dist/_chunks/pull.mjs.map +1 -0
- package/dist/_chunks/regex.mjs +19 -0
- package/dist/_chunks/regex.mjs.map +1 -0
- package/dist/_chunks/retriv.mjs +2 -171
- package/dist/_chunks/retriv2.mjs +159 -0
- package/dist/_chunks/retriv2.mjs.map +1 -0
- package/dist/_chunks/sanitize.mjs +12 -9
- package/dist/_chunks/sanitize.mjs.map +1 -1
- package/dist/_chunks/search-helpers.mjs +8 -6
- package/dist/_chunks/search-helpers.mjs.map +1 -1
- package/dist/_chunks/search-interactive.mjs +23 -20
- package/dist/_chunks/search-interactive.mjs.map +1 -1
- package/dist/_chunks/search.mjs +3 -3
- package/dist/_chunks/search.mjs.map +1 -1
- package/dist/_chunks/semver.mjs +2755 -1
- package/dist/_chunks/semver.mjs.map +1 -1
- package/dist/_chunks/skill-installer2.mjs +10 -11
- package/dist/_chunks/skill-installer2.mjs.map +1 -1
- package/dist/_chunks/skills.mjs +6 -7
- package/dist/_chunks/skills.mjs.map +1 -1
- package/dist/_chunks/store.mjs +107 -0
- package/dist/_chunks/store.mjs.map +1 -0
- package/dist/_chunks/sync.mjs +411 -910
- package/dist/_chunks/sync.mjs.map +1 -1
- package/dist/_chunks/sync2.mjs +2 -5
- package/dist/_chunks/telemetry.mjs +26 -0
- package/dist/_chunks/telemetry.mjs.map +1 -0
- package/dist/_chunks/uninstall.mjs +12 -9
- package/dist/_chunks/uninstall.mjs.map +1 -1
- package/dist/_chunks/update.mjs +171 -0
- package/dist/_chunks/update.mjs.map +1 -0
- package/dist/_chunks/upload.mjs +3 -3
- package/dist/_chunks/validate.mjs +1 -1
- package/dist/_chunks/version.mjs +16 -17
- package/dist/_chunks/version.mjs.map +1 -1
- package/dist/_chunks/whoami.mjs +21 -0
- package/dist/_chunks/whoami.mjs.map +1 -0
- package/dist/_chunks/wizard.mjs +2 -190
- package/dist/_chunks/wizard2.mjs +200 -0
- package/dist/_chunks/wizard2.mjs.map +1 -0
- package/dist/cli.mjs +72 -53
- package/dist/cli.mjs.map +1 -1
- package/dist/prepare.mjs +4 -3
- package/dist/prepare.mjs.map +1 -1
- package/dist/retriv/worker.d.mts +5 -1
- package/dist/retriv/worker.d.mts.map +1 -1
- package/dist/retriv/worker.mjs +1 -1
- package/package.json +19 -28
- package/dist/_chunks/author-group.mjs +0 -17
- package/dist/_chunks/author-group.mjs.map +0 -1
- package/dist/_chunks/cli-helpers.mjs +0 -335
- package/dist/_chunks/cli-helpers.mjs.map +0 -1
- package/dist/_chunks/cli-helpers2.mjs +0 -2
- package/dist/_chunks/index.d.mts +0 -344
- package/dist/_chunks/index.d.mts.map +0 -1
- package/dist/_chunks/index2.d.mts +0 -279
- package/dist/_chunks/index2.d.mts.map +0 -1
- package/dist/_chunks/index3.d.mts +0 -44
- package/dist/_chunks/index3.d.mts.map +0 -1
- package/dist/_chunks/index4.d.mts +0 -553
- package/dist/_chunks/index4.d.mts.map +0 -1
- package/dist/_chunks/package-registry.mjs +0 -465
- package/dist/_chunks/package-registry.mjs.map +0 -1
- package/dist/_chunks/retriv.mjs.map +0 -1
- package/dist/_chunks/setup.mjs +0 -17
- package/dist/_chunks/setup.mjs.map +0 -1
- package/dist/_chunks/sources.mjs +0 -2654
- package/dist/_chunks/sources.mjs.map +0 -1
- package/dist/_chunks/sync-pipeline.mjs.map +0 -1
- package/dist/_chunks/sync-registry.mjs +0 -65
- package/dist/_chunks/sync-registry.mjs.map +0 -1
- package/dist/_chunks/types.d.mts +0 -76
- package/dist/_chunks/types.d.mts.map +0 -1
- package/dist/_chunks/types2.d.mts +0 -88
- package/dist/_chunks/types2.d.mts.map +0 -1
- package/dist/_chunks/wizard.mjs.map +0 -1
- package/dist/agent/index.d.mts +0 -2
- package/dist/agent/index.mjs +0 -4
- package/dist/cache/index.d.mts +0 -2
- package/dist/cache/index.mjs +0 -5
- package/dist/index.d.mts +0 -6
- package/dist/index.mjs +0 -6
- package/dist/retriv/index.d.mts +0 -3
- package/dist/retriv/index.mjs +0 -2
- package/dist/sources/index.d.mts +0 -3
- package/dist/sources/index.mjs +0 -3
- package/dist/types.d.mts +0 -4
- package/dist/types.mjs +0 -1
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { a as targets } from "./detect.mjs";
|
|
2
|
+
import "./agent.mjs";
|
|
3
|
+
import { g as todayIsoDate, h as timedSpinner, n as writeSkillMd } from "./prompts.mjs";
|
|
4
|
+
import { l as SHARED_SKILLS_DIR, n as CACHE_DIR } from "./paths.mjs";
|
|
5
|
+
import { n as COMMA_OR_WHITESPACE_RE } from "./regex.mjs";
|
|
6
|
+
import { n as sanitizeMarkdown } from "./sanitize.mjs";
|
|
7
|
+
import { d as readConfig } from "./cache.mjs";
|
|
8
|
+
import { i as introLine } from "./intro.mjs";
|
|
9
|
+
import { _ as fetchGitSkills } from "./semver.mjs";
|
|
10
|
+
import { t as getProjectState } from "./skills.mjs";
|
|
11
|
+
import { l as resolveBaseDir, s as installSkill } from "./skill-installer2.mjs";
|
|
12
|
+
import { c as selectLlmConfig, o as DEFAULT_SECTIONS } from "./pipeline.mjs";
|
|
13
|
+
import { n as shutdownWorker } from "./pool2.mjs";
|
|
14
|
+
import { n as fetchRegistrySkill, r as gateInstall, t as createRegistryClient } from "./client.mjs";
|
|
15
|
+
import { t as track } from "./telemetry.mjs";
|
|
16
|
+
import { i as createGithubResolver, n as bindClackUi, r as createSyncRun, t as syncCommand } from "./sync.mjs";
|
|
17
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
18
|
+
import { styleText } from "node:util";
|
|
19
|
+
import * as p from "@clack/prompts";
|
|
20
|
+
import { dirname, join, relative } from "pathe";
|
|
21
|
+
const STATIC_REGEX_1 = /-skilld$/;
|
|
22
|
+
async function syncGitSkills(opts) {
|
|
23
|
+
const { source, agent, global: isGlobal, yes } = opts;
|
|
24
|
+
const cwd = process.cwd();
|
|
25
|
+
const agentConfig = targets[agent];
|
|
26
|
+
const baseDir = isGlobal ? join(CACHE_DIR, "skills") : join(cwd, agentConfig.skillsDir);
|
|
27
|
+
const label = source.type === "local" ? source.localPath : `${source.owner}/${source.repo}`;
|
|
28
|
+
const spin = timedSpinner();
|
|
29
|
+
spin.start(`Fetching skills from ${label}`);
|
|
30
|
+
const { skills } = await fetchGitSkills(source, (msg) => spin.message(msg));
|
|
31
|
+
if (skills.length === 0) {
|
|
32
|
+
if (source.type === "github" && source.owner && source.repo) {
|
|
33
|
+
spin.stop(`No pre-authored skills in ${label}, generating from repo docs...`);
|
|
34
|
+
return syncGitHubRepo(opts);
|
|
35
|
+
}
|
|
36
|
+
spin.stop(`No skills found in ${label}`);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
spin.stop(`Found ${skills.length} skill(s) in ${label}`);
|
|
40
|
+
let selected = skills;
|
|
41
|
+
if (opts.skillFilter?.length) {
|
|
42
|
+
const filterSet = new Set(opts.skillFilter.map((s) => s.toLowerCase().replace(STATIC_REGEX_1, "")));
|
|
43
|
+
selected = skills.filter((s) => filterSet.has(s.name.toLowerCase().replace(STATIC_REGEX_1, "")));
|
|
44
|
+
if (selected.length === 0) {
|
|
45
|
+
p.log.warn(`No skills matched: ${opts.skillFilter.join(", ")}`);
|
|
46
|
+
p.log.message(`Available: ${skills.map((s) => s.name).join(", ")}`);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
} else if (source.skillPath) selected = skills;
|
|
50
|
+
else if (skills.length > 1 && !yes) {
|
|
51
|
+
const choices = await p.autocompleteMultiselect({
|
|
52
|
+
message: `Select skills to install from ${label}`,
|
|
53
|
+
options: skills.map((s) => ({
|
|
54
|
+
label: s.name.replace(STATIC_REGEX_1, ""),
|
|
55
|
+
value: s.name,
|
|
56
|
+
hint: s.description || s.path
|
|
57
|
+
})),
|
|
58
|
+
initialValues: []
|
|
59
|
+
});
|
|
60
|
+
if (p.isCancel(choices)) return;
|
|
61
|
+
const selectedNames = new Set(choices);
|
|
62
|
+
selected = skills.filter((s) => selectedNames.has(s.name));
|
|
63
|
+
if (selected.length === 0) return;
|
|
64
|
+
}
|
|
65
|
+
mkdirSync(baseDir, { recursive: true });
|
|
66
|
+
for (const skill of selected) {
|
|
67
|
+
const skillDir = join(baseDir, skill.name);
|
|
68
|
+
mkdirSync(skillDir, { recursive: true });
|
|
69
|
+
writeSkillMd(skillDir, sanitizeMarkdown(skill.content));
|
|
70
|
+
if (skill.files.length > 0) for (const f of skill.files) {
|
|
71
|
+
const filePath = join(skillDir, f.path);
|
|
72
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
73
|
+
writeFileSync(filePath, f.content);
|
|
74
|
+
}
|
|
75
|
+
const sourceType = source.type === "local" ? "local" : source.type;
|
|
76
|
+
installSkill({
|
|
77
|
+
cwd,
|
|
78
|
+
agent,
|
|
79
|
+
global: isGlobal,
|
|
80
|
+
baseDir,
|
|
81
|
+
skillDirName: skill.name,
|
|
82
|
+
lock: {
|
|
83
|
+
source: sourceType,
|
|
84
|
+
repo: source.type === "local" ? source.localPath : `${source.owner}/${source.repo}`,
|
|
85
|
+
path: skill.path || void 0,
|
|
86
|
+
ref: source.ref || "main",
|
|
87
|
+
syncedAt: todayIsoDate(),
|
|
88
|
+
generator: "external"
|
|
89
|
+
},
|
|
90
|
+
skipLinkAgents: true
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
if (source.type !== "local" && source.owner && source.repo) track({
|
|
94
|
+
event: "install",
|
|
95
|
+
surface: "cli:add",
|
|
96
|
+
sourceKind: "gh",
|
|
97
|
+
slug: `${source.owner}/${source.repo}`,
|
|
98
|
+
agent
|
|
99
|
+
});
|
|
100
|
+
for (const skill of selected) {
|
|
101
|
+
const skillRel = relative(cwd, join(baseDir, skill.name));
|
|
102
|
+
const fileLines = ["SKILL.md", ...skill.files.map((f) => f.path)].map((f) => ` ${styleText("gray", "└")} ${f}`).join("\n");
|
|
103
|
+
p.log.success(`Installed ${styleText("cyan", skill.name)} ${styleText("gray", `→ ${skillRel}`)}\n${fileLines}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function syncGitHubRepo(opts) {
|
|
107
|
+
const { source, agent, global: isGlobal, yes } = opts;
|
|
108
|
+
const owner = source.owner;
|
|
109
|
+
const repo = source.repo;
|
|
110
|
+
const cwd = process.cwd();
|
|
111
|
+
const spec = `${owner}/${repo}`;
|
|
112
|
+
const run = createSyncRun({
|
|
113
|
+
cwd,
|
|
114
|
+
resolver: createGithubResolver(owner, repo),
|
|
115
|
+
agent,
|
|
116
|
+
global: isGlobal,
|
|
117
|
+
force: opts.force,
|
|
118
|
+
debug: opts.debug,
|
|
119
|
+
from: opts.from,
|
|
120
|
+
defaultSections: DEFAULT_SECTIONS
|
|
121
|
+
});
|
|
122
|
+
bindClackUi(run.hooks, { cwd });
|
|
123
|
+
const base = await run.runBase(spec);
|
|
124
|
+
if (base.kind !== "ready") return;
|
|
125
|
+
const { state } = base;
|
|
126
|
+
const globalConfig = readConfig();
|
|
127
|
+
let llmConfig = null;
|
|
128
|
+
if (!state.allSectionsCached && !globalConfig.skipLlm && (!yes || opts.model)) llmConfig = await selectLlmConfig(opts.model);
|
|
129
|
+
await run.runEnhance(state, llmConfig);
|
|
130
|
+
await shutdownWorker();
|
|
131
|
+
track({
|
|
132
|
+
event: "install",
|
|
133
|
+
surface: "cli:add",
|
|
134
|
+
sourceKind: "gh",
|
|
135
|
+
slug: spec,
|
|
136
|
+
agent
|
|
137
|
+
});
|
|
138
|
+
p.outro(`Synced ${spec} to ${relative(cwd, state.skillDir)}`);
|
|
139
|
+
}
|
|
140
|
+
async function syncRegistrySkill(opts) {
|
|
141
|
+
const { packageName, agent, cwd = process.cwd() } = opts;
|
|
142
|
+
const skill = opts.prefetched ?? await fetchRegistrySkill(packageName);
|
|
143
|
+
if (!skill) return null;
|
|
144
|
+
const skillDir = join(join(cwd, SHARED_SKILLS_DIR), skill.name);
|
|
145
|
+
mkdirSync(skillDir, { recursive: true });
|
|
146
|
+
writeSkillMd(skillDir, skill.content);
|
|
147
|
+
const baseDir = resolveBaseDir(cwd, agent, false);
|
|
148
|
+
mkdirSync(baseDir, { recursive: true });
|
|
149
|
+
installSkill({
|
|
150
|
+
cwd,
|
|
151
|
+
agent,
|
|
152
|
+
global: false,
|
|
153
|
+
baseDir,
|
|
154
|
+
skillDirName: skill.name,
|
|
155
|
+
lock: {
|
|
156
|
+
packageName: skill.packageName,
|
|
157
|
+
version: skill.updatedAt,
|
|
158
|
+
repo: skill.repo,
|
|
159
|
+
source: "registry",
|
|
160
|
+
syncedAt: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10),
|
|
161
|
+
generator: "curator"
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
track({
|
|
165
|
+
event: "install",
|
|
166
|
+
surface: opts.surface ?? "cli:add",
|
|
167
|
+
sourceKind: "npm",
|
|
168
|
+
slug: packageName,
|
|
169
|
+
agent
|
|
170
|
+
});
|
|
171
|
+
return skill;
|
|
172
|
+
}
|
|
173
|
+
const RECEIPTS_URL = "https://skilld.dev/gh";
|
|
174
|
+
async function getAudit(client, cache, owner, repo, name) {
|
|
175
|
+
const key = `${owner}/${repo}/${name}`;
|
|
176
|
+
const cached = cache.get(key);
|
|
177
|
+
if (cached) return cached;
|
|
178
|
+
const result = await client.audit({
|
|
179
|
+
owner,
|
|
180
|
+
repo,
|
|
181
|
+
name
|
|
182
|
+
});
|
|
183
|
+
cache.set(key, result);
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
function logAuditWarn(slug, result) {
|
|
187
|
+
const parts = [
|
|
188
|
+
result.riskLevel && `risk: ${result.riskLevel}`,
|
|
189
|
+
result.summary,
|
|
190
|
+
result.audits.filter((a) => a.status === "warn").map((a) => a.slug).join(",")
|
|
191
|
+
].filter(Boolean).join(" · ");
|
|
192
|
+
p.log.warn(`${styleText("yellow", "⚠")} ${slug} ${styleText("gray", parts)}`);
|
|
193
|
+
}
|
|
194
|
+
function logAuditFail(slug, result, owner, repo, name) {
|
|
195
|
+
const detail = result.audits.filter((a) => a.status === "fail").map((a) => a.summary || a.slug).join("; ");
|
|
196
|
+
p.log.error(`${styleText("red", "✗")} ${slug} blocked: ${detail || "audit failed"}\n Receipts: ${RECEIPTS_URL}/${owner}/${repo}/${name}`);
|
|
197
|
+
}
|
|
198
|
+
async function installSkills(items, opts) {
|
|
199
|
+
const cwd = process.cwd();
|
|
200
|
+
const summary = {
|
|
201
|
+
installed: 0,
|
|
202
|
+
skipped: 0,
|
|
203
|
+
failed: 0
|
|
204
|
+
};
|
|
205
|
+
const client = createRegistryClient();
|
|
206
|
+
const auditCache = opts.auditCache ?? /* @__PURE__ */ new Map();
|
|
207
|
+
const gitSources = [];
|
|
208
|
+
const npmEntries = [];
|
|
209
|
+
const crateSpecs = [];
|
|
210
|
+
const unsupported = [];
|
|
211
|
+
for (const source of items) switch (source.type) {
|
|
212
|
+
case "git":
|
|
213
|
+
gitSources.push({
|
|
214
|
+
source: source.source,
|
|
215
|
+
skillFilter: source.skillFilter
|
|
216
|
+
});
|
|
217
|
+
break;
|
|
218
|
+
case "npm":
|
|
219
|
+
npmEntries.push({
|
|
220
|
+
name: source.package,
|
|
221
|
+
spec: source.tag ? `${source.package}@${source.tag}` : source.package
|
|
222
|
+
});
|
|
223
|
+
break;
|
|
224
|
+
case "crate":
|
|
225
|
+
crateSpecs.push(source.version ? `crate:${source.package}@${source.version}` : `crate:${source.package}`);
|
|
226
|
+
break;
|
|
227
|
+
case "bare":
|
|
228
|
+
p.log.warn(`Bare names are deprecated. Use ${styleText("cyan", `npm:${source.package}`)} instead.`);
|
|
229
|
+
npmEntries.push({
|
|
230
|
+
name: source.package,
|
|
231
|
+
spec: source.tag ? `${source.package}@${source.tag}` : source.package
|
|
232
|
+
});
|
|
233
|
+
break;
|
|
234
|
+
case "curator":
|
|
235
|
+
unsupported.push(`@${source.handle} (curator)`);
|
|
236
|
+
break;
|
|
237
|
+
case "collection":
|
|
238
|
+
unsupported.push(`@${source.handle}/${source.name} (collection)`);
|
|
239
|
+
break;
|
|
240
|
+
default: throw new Error(`Unhandled SkillSource type: ${JSON.stringify(source)}`);
|
|
241
|
+
}
|
|
242
|
+
if (unsupported.length > 0) {
|
|
243
|
+
p.log.error(`Curator and collection installs are not yet available:\n ${unsupported.join("\n ")}\n\nFollow https://skilld.dev for launch updates.`);
|
|
244
|
+
summary.skipped += unsupported.length;
|
|
245
|
+
process.exitCode = 1;
|
|
246
|
+
if (gitSources.length === 0 && npmEntries.length === 0 && crateSpecs.length === 0) return summary;
|
|
247
|
+
}
|
|
248
|
+
for (const { source, skillFilter: perSourceFilter } of gitSources) {
|
|
249
|
+
const filterRaw = perSourceFilter ?? opts.skillFilter;
|
|
250
|
+
const skillFilter = filterRaw ? filterRaw.split(COMMA_OR_WHITESPACE_RE).map((s) => s.trim()).filter(Boolean) : void 0;
|
|
251
|
+
await syncGitSkills({
|
|
252
|
+
source,
|
|
253
|
+
global: !!opts.global,
|
|
254
|
+
agent: opts.agent,
|
|
255
|
+
yes: !!opts.yes,
|
|
256
|
+
model: opts.model,
|
|
257
|
+
force: opts.force,
|
|
258
|
+
debug: opts.debug,
|
|
259
|
+
skillFilter
|
|
260
|
+
}).then(() => {
|
|
261
|
+
summary.installed += 1;
|
|
262
|
+
}).catch((err) => {
|
|
263
|
+
summary.failed += 1;
|
|
264
|
+
p.log.error(`Failed to install ${source.type === "local" ? source.localPath : `${source.owner}/${source.repo}`}: ${err instanceof Error ? err.message : String(err)}`);
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
if (npmEntries.length > 0) {
|
|
268
|
+
const seen = /* @__PURE__ */ new Set();
|
|
269
|
+
const dedupedEntries = npmEntries.filter((e) => {
|
|
270
|
+
if (seen.has(e.name)) return false;
|
|
271
|
+
seen.add(e.name);
|
|
272
|
+
return true;
|
|
273
|
+
});
|
|
274
|
+
const fallbackPackages = [];
|
|
275
|
+
for (const entry of dedupedEntries) {
|
|
276
|
+
const resolved = await client.resolveSkill(entry.name).catch(() => null);
|
|
277
|
+
if (!resolved) {
|
|
278
|
+
fallbackPackages.push(entry.spec);
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
const [auditOwner, auditRepo] = resolved.repo.split("/");
|
|
282
|
+
const audit = await getAudit(client, auditCache, auditOwner, auditRepo, resolved.name);
|
|
283
|
+
const decision = gateInstall(audit, {
|
|
284
|
+
allowUnsafe: opts.allowUnsafe,
|
|
285
|
+
yes: opts.yes,
|
|
286
|
+
sourceKind: "npm"
|
|
287
|
+
});
|
|
288
|
+
const slug = `${resolved.repo}/${resolved.name}`;
|
|
289
|
+
if (audit.status === "warn") {
|
|
290
|
+
logAuditWarn(slug, audit);
|
|
291
|
+
track({
|
|
292
|
+
event: "audit-warn",
|
|
293
|
+
surface: opts.surface,
|
|
294
|
+
sourceKind: "npm",
|
|
295
|
+
slug,
|
|
296
|
+
agent: opts.agent
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
if (audit.status === "fail") {
|
|
300
|
+
logAuditFail(slug, audit, auditOwner, auditRepo, resolved.name);
|
|
301
|
+
track({
|
|
302
|
+
event: "audit-fail",
|
|
303
|
+
surface: opts.surface,
|
|
304
|
+
sourceKind: "npm",
|
|
305
|
+
slug,
|
|
306
|
+
agent: opts.agent
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
if (decision === "skip") {
|
|
310
|
+
track({
|
|
311
|
+
event: "audit-blocked",
|
|
312
|
+
surface: opts.surface,
|
|
313
|
+
sourceKind: "npm",
|
|
314
|
+
slug,
|
|
315
|
+
agent: opts.agent
|
|
316
|
+
});
|
|
317
|
+
summary.skipped += 1;
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
const result = await syncRegistrySkill({
|
|
321
|
+
packageName: entry.name,
|
|
322
|
+
agent: opts.agent,
|
|
323
|
+
cwd,
|
|
324
|
+
prefetched: resolved,
|
|
325
|
+
surface: opts.surface
|
|
326
|
+
}).catch((err) => {
|
|
327
|
+
summary.failed += 1;
|
|
328
|
+
p.log.error(`Failed to install ${entry.name}: ${err instanceof Error ? err.message : String(err)}`);
|
|
329
|
+
return null;
|
|
330
|
+
});
|
|
331
|
+
if (result) {
|
|
332
|
+
p.log.success(`Installed ${styleText("cyan", result.name)} from registry`);
|
|
333
|
+
summary.installed += 1;
|
|
334
|
+
} else if (result === null) fallbackPackages.push(entry.spec);
|
|
335
|
+
}
|
|
336
|
+
if (fallbackPackages.length > 0) {
|
|
337
|
+
const state = await getProjectState(cwd);
|
|
338
|
+
p.intro(introLine({
|
|
339
|
+
state,
|
|
340
|
+
agentId: opts.agent
|
|
341
|
+
}));
|
|
342
|
+
await syncCommand(state, {
|
|
343
|
+
packages: [...fallbackPackages, ...crateSpecs],
|
|
344
|
+
global: !!opts.global,
|
|
345
|
+
agent: opts.agent,
|
|
346
|
+
model: opts.model,
|
|
347
|
+
yes: !!opts.yes,
|
|
348
|
+
force: opts.force,
|
|
349
|
+
debug: opts.debug
|
|
350
|
+
});
|
|
351
|
+
summary.installed += fallbackPackages.length + crateSpecs.length;
|
|
352
|
+
return summary;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (crateSpecs.length > 0) {
|
|
356
|
+
const state = await getProjectState(cwd);
|
|
357
|
+
p.intro(introLine({
|
|
358
|
+
state,
|
|
359
|
+
agentId: opts.agent
|
|
360
|
+
}));
|
|
361
|
+
await syncCommand(state, {
|
|
362
|
+
packages: crateSpecs,
|
|
363
|
+
global: !!opts.global,
|
|
364
|
+
agent: opts.agent,
|
|
365
|
+
model: opts.model,
|
|
366
|
+
yes: !!opts.yes,
|
|
367
|
+
force: opts.force,
|
|
368
|
+
debug: opts.debug
|
|
369
|
+
});
|
|
370
|
+
summary.installed += crateSpecs.length;
|
|
371
|
+
}
|
|
372
|
+
return summary;
|
|
373
|
+
}
|
|
374
|
+
export { installSkills as t };
|
|
375
|
+
|
|
376
|
+
//# sourceMappingURL=install-many.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-many.mjs","names":["agents","_exhaustive"],"sources":["../../src/commands/sync-git.ts","../../src/commands/sync/registry.ts","../../src/commands/sync/install-many.ts"],"sourcesContent":["/**\n * Git skill sync — install pre-authored skills from git repos, or generate\n * from repo docs when no pre-authored skills exist.\n */\n\nimport type { AgentType, OptimizeModel } from '../agent/index.ts'\nimport type { GitSkillSource } from '../sources/git-skills.ts'\nimport { mkdirSync, writeFileSync } from 'node:fs'\nimport { styleText } from 'node:util'\nimport * as p from '@clack/prompts'\nimport { dirname, join, relative } from 'pathe'\nimport { agents, writeSkillMd } from '../agent/index.ts'\nimport { installSkill } from '../agent/skill-installer.ts'\nimport { CACHE_DIR } from '../cache/index.ts'\nimport { readConfig } from '../core/config.ts'\nimport { timedSpinner, todayIsoDate } from '../core/formatting.ts'\nimport { sanitizeMarkdown } from '../core/sanitize.ts'\nimport { shutdownWorker } from '../retriv/pool.ts'\nimport { fetchGitSkills } from '../sources/git-skills.ts'\nimport { track } from '../telemetry.ts'\nimport { DEFAULT_SECTIONS, selectLlmConfig } from './llm-prompts.ts'\nimport { createGithubResolver } from './sync/resolvers.ts'\nimport { createSyncRun } from './sync/run.ts'\nimport { bindClackUi } from './sync/ui/clack.ts'\n\nconst STATIC_REGEX_1 = /-skilld$/\n\nexport interface GitSyncOptions {\n source: GitSkillSource\n global: boolean\n agent: AgentType\n yes: boolean\n model?: OptimizeModel\n force?: boolean\n debug?: boolean\n from?: string\n skillFilter?: string[]\n}\n\nexport async function syncGitSkills(opts: GitSyncOptions): Promise<void> {\n const { source, agent, global: isGlobal, yes } = opts\n const cwd = process.cwd()\n const agentConfig = agents[agent]\n const baseDir = isGlobal\n ? join(CACHE_DIR, 'skills')\n : join(cwd, agentConfig.skillsDir)\n\n const label = source.type === 'local'\n ? source.localPath!\n : `${source.owner}/${source.repo}`\n\n const spin = timedSpinner()\n spin.start(`Fetching skills from ${label}`)\n\n const { skills } = await fetchGitSkills(source, msg => spin.message(msg))\n\n if (skills.length === 0) {\n if (source.type === 'github' && source.owner && source.repo) {\n spin.stop(`No pre-authored skills in ${label}, generating from repo docs...`)\n return syncGitHubRepo(opts)\n }\n spin.stop(`No skills found in ${label}`)\n return\n }\n\n spin.stop(`Found ${skills.length} skill(s) in ${label}`)\n\n let selected = skills\n\n if (opts.skillFilter?.length) {\n const filterSet = new Set(opts.skillFilter.map(s => s.toLowerCase().replace(STATIC_REGEX_1, '')))\n selected = skills.filter(s => filterSet.has(s.name.toLowerCase().replace(STATIC_REGEX_1, '')))\n if (selected.length === 0) {\n p.log.warn(`No skills matched: ${opts.skillFilter.join(', ')}`)\n p.log.message(`Available: ${skills.map(s => s.name).join(', ')}`)\n return\n }\n }\n else if (source.skillPath) {\n selected = skills\n }\n else if (skills.length > 1 && !yes) {\n const choices = await p.autocompleteMultiselect({\n message: `Select skills to install from ${label}`,\n options: skills.map(s => ({\n label: s.name.replace(STATIC_REGEX_1, ''),\n value: s.name,\n hint: s.description || s.path,\n })),\n initialValues: [],\n })\n\n if (p.isCancel(choices))\n return\n\n const selectedNames = new Set(choices)\n selected = skills.filter(s => selectedNames.has(s.name))\n if (selected.length === 0)\n return\n }\n\n mkdirSync(baseDir, { recursive: true })\n\n for (const skill of selected) {\n const skillDir = join(baseDir, skill.name)\n mkdirSync(skillDir, { recursive: true })\n\n writeSkillMd(skillDir, sanitizeMarkdown(skill.content))\n\n if (skill.files.length > 0) {\n for (const f of skill.files) {\n const filePath = join(skillDir, f.path)\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, f.content)\n }\n }\n\n const sourceType = source.type === 'local' ? 'local' : source.type\n installSkill({\n cwd,\n agent,\n global: isGlobal,\n baseDir,\n skillDirName: skill.name,\n lock: {\n source: sourceType,\n repo: source.type === 'local' ? source.localPath : `${source.owner}/${source.repo}`,\n path: skill.path || undefined,\n ref: source.ref || 'main',\n syncedAt: todayIsoDate(),\n generator: 'external',\n },\n skipLinkAgents: true,\n })\n }\n\n if (source.type !== 'local' && source.owner && source.repo) {\n track({\n event: 'install',\n surface: 'cli:add',\n sourceKind: 'gh',\n slug: `${source.owner}/${source.repo}`,\n agent,\n })\n }\n\n for (const skill of selected) {\n const skillRel = relative(cwd, join(baseDir, skill.name))\n const fileLines = ['SKILL.md', ...skill.files.map(f => f.path)]\n .map(f => ` ${styleText('gray', '└')} ${f}`)\n .join('\\n')\n p.log.success(`Installed ${styleText('cyan', skill.name)} ${styleText('gray', `→ ${skillRel}`)}\\n${fileLines}`)\n }\n}\n\nasync function syncGitHubRepo(opts: GitSyncOptions): Promise<void> {\n const { source, agent, global: isGlobal, yes } = opts\n const owner = source.owner!\n const repo = source.repo!\n const cwd = process.cwd()\n const spec = `${owner}/${repo}`\n\n const run = createSyncRun({\n cwd,\n resolver: createGithubResolver(owner, repo),\n agent,\n global: isGlobal,\n force: opts.force,\n debug: opts.debug,\n from: opts.from,\n defaultSections: DEFAULT_SECTIONS,\n })\n bindClackUi(run.hooks, { cwd })\n\n const base = await run.runBase(spec)\n\n if (base.kind !== 'ready')\n return\n\n const { state } = base\n const globalConfig = readConfig()\n let llmConfig: import('./llm-prompts.ts').LlmConfig | null = null\n if (!state.allSectionsCached && !globalConfig.skipLlm && (!yes || opts.model))\n llmConfig = await selectLlmConfig(opts.model)\n\n await run.runEnhance(state, llmConfig)\n\n await shutdownWorker()\n\n track({\n event: 'install',\n surface: 'cli:add',\n sourceKind: 'gh',\n slug: spec,\n agent,\n })\n\n p.outro(`Synced ${spec} to ${relative(cwd, state.skillDir)}`)\n}\n","/**\n * Registry-based skill installation: fetch SKILL.md → write → lockfile → link.\n * No doc resolution, no LLM, no caching. Fast path.\n */\n\nimport type { AgentType } from '../../agent/index.ts'\nimport type { RegistrySkill } from '../../registry/client.ts'\nimport type { TelemetrySurface } from '../../telemetry.ts'\nimport { mkdirSync } from 'node:fs'\nimport { join } from 'pathe'\nimport { writeSkillMd } from '../../agent/prompts/skill.ts'\nimport { installSkill, resolveBaseDir } from '../../agent/skill-installer.ts'\nimport { SHARED_SKILLS_DIR } from '../../core/paths.ts'\nimport { fetchRegistrySkill } from '../../registry/client.ts'\nimport { track } from '../../telemetry.ts'\n\nexport interface SyncRegistryOptions {\n packageName: string\n agent: AgentType\n global?: boolean\n cwd?: string\n /** Skip resolve when caller has already fetched the skill (e.g. after audit gate). */\n prefetched?: RegistrySkill\n surface?: TelemetrySurface\n}\n\nexport async function syncRegistrySkill(opts: SyncRegistryOptions): Promise<RegistrySkill | null> {\n const { packageName, agent, cwd = process.cwd() } = opts\n\n const skill = opts.prefetched ?? await fetchRegistrySkill(packageName)\n if (!skill)\n return null\n\n const sharedDir = join(cwd, SHARED_SKILLS_DIR)\n const skillDir = join(sharedDir, skill.name)\n mkdirSync(skillDir, { recursive: true })\n writeSkillMd(skillDir, skill.content)\n\n const baseDir = resolveBaseDir(cwd, agent, false)\n mkdirSync(baseDir, { recursive: true })\n installSkill({\n cwd,\n agent,\n global: false,\n baseDir,\n skillDirName: skill.name,\n lock: {\n packageName: skill.packageName,\n version: skill.updatedAt,\n repo: skill.repo,\n source: 'registry',\n syncedAt: new Date().toISOString().slice(0, 10),\n generator: 'curator',\n },\n })\n\n track({\n event: 'install',\n surface: opts.surface ?? 'cli:add',\n sourceKind: 'npm',\n slug: packageName,\n agent,\n })\n\n return skill\n}\n","/**\n * Install many skills from a parsed source list. Routes each `SkillSource`\n * to the right pipeline (git, npm registry → npm doc fallback, crate) and\n * collects per-item outcomes for telemetry and `pull` summaries.\n */\n\nimport type { AgentType, OptimizeModel } from '../../agent/index.ts'\nimport type { SkillSource } from '../../core/prefix.ts'\nimport type { AuditResult, RegistryClient } from '../../registry/client.ts'\nimport type { GitSkillSource } from '../../sources/git-skills.ts'\nimport { styleText } from 'node:util'\nimport * as p from '@clack/prompts'\nimport { introLine } from '../../cli/intro.ts'\nimport { COMMA_OR_WHITESPACE_RE } from '../../core/regex.ts'\nimport { getProjectState } from '../../core/skills.ts'\nimport { createRegistryClient, gateInstall } from '../../registry/client.ts'\nimport { track } from '../../telemetry.ts'\nimport { syncGitSkills } from '../sync-git.ts'\nimport { syncCommand } from '../sync.ts'\nimport { syncRegistrySkill } from './registry.ts'\n\nexport type InstallSurface = 'cli:add' | 'cli:pull' | 'cli:prepare' | 'cli:update' | 'cli:wizard'\n\nexport interface InstallOpts {\n agent: AgentType\n surface: InstallSurface\n global?: boolean\n yes?: boolean\n force?: boolean\n debug?: boolean\n model?: OptimizeModel\n skillFilter?: string\n /** Allow installs that fail the upstream audit gate (Step 3 wiring). */\n allowUnsafe?: boolean\n /** Caller-supplied audit cache; pull populates this with pre-fetched results. */\n auditCache?: Map<string, AuditResult>\n}\n\nexport interface InstallSummary {\n installed: number\n skipped: number\n failed: number\n}\n\nconst RECEIPTS_URL = 'https://skilld.dev/gh'\n\nasync function getAudit(\n client: RegistryClient,\n cache: Map<string, AuditResult>,\n owner: string,\n repo: string,\n name: string,\n): Promise<AuditResult> {\n const key = `${owner}/${repo}/${name}`\n const cached = cache.get(key)\n if (cached)\n return cached\n const result = await client.audit({ owner, repo, name })\n cache.set(key, result)\n return result\n}\n\nfunction logAuditWarn(slug: string, result: AuditResult): void {\n const parts = [\n result.riskLevel && `risk: ${result.riskLevel}`,\n result.summary,\n result.audits.filter(a => a.status === 'warn').map(a => a.slug).join(','),\n ].filter(Boolean).join(' · ')\n p.log.warn(`${styleText('yellow', '⚠')} ${slug} ${styleText('gray', parts)}`)\n}\n\nfunction logAuditFail(slug: string, result: AuditResult, owner: string, repo: string, name: string): void {\n const detail = result.audits.filter(a => a.status === 'fail').map(a => a.summary || a.slug).join('; ')\n p.log.error(`${styleText('red', '✗')} ${slug} blocked: ${detail || 'audit failed'}\\n Receipts: ${RECEIPTS_URL}/${owner}/${repo}/${name}`)\n}\n\nexport async function installSkills(items: SkillSource[], opts: InstallOpts): Promise<InstallSummary> {\n const cwd = process.cwd()\n const summary: InstallSummary = { installed: 0, skipped: 0, failed: 0 }\n const client = createRegistryClient()\n const auditCache = opts.auditCache ?? new Map<string, AuditResult>()\n\n const gitSources: Array<{ source: GitSkillSource, skillFilter?: string }> = []\n const npmEntries: Array<{ name: string, spec: string }> = []\n const crateSpecs: string[] = []\n const unsupported: string[] = []\n\n for (const source of items) {\n switch (source.type) {\n case 'git':\n gitSources.push({ source: source.source, skillFilter: source.skillFilter })\n break\n case 'npm':\n npmEntries.push({ name: source.package, spec: source.tag ? `${source.package}@${source.tag}` : source.package })\n break\n case 'crate':\n crateSpecs.push(source.version ? `crate:${source.package}@${source.version}` : `crate:${source.package}`)\n break\n case 'bare':\n p.log.warn(`Bare names are deprecated. Use ${styleText('cyan', `npm:${source.package}`)} instead.`)\n npmEntries.push({ name: source.package, spec: source.tag ? `${source.package}@${source.tag}` : source.package })\n break\n case 'curator':\n unsupported.push(`@${source.handle} (curator)`)\n break\n case 'collection':\n unsupported.push(`@${source.handle}/${source.name} (collection)`)\n break\n default: {\n const _exhaustive: never = source\n throw new Error(`Unhandled SkillSource type: ${JSON.stringify(_exhaustive)}`)\n }\n }\n }\n\n if (unsupported.length > 0) {\n p.log.error(`Curator and collection installs are not yet available:\\n ${unsupported.join('\\n ')}\\n\\nFollow https://skilld.dev for launch updates.`)\n summary.skipped += unsupported.length\n process.exitCode = 1\n if (gitSources.length === 0 && npmEntries.length === 0 && crateSpecs.length === 0)\n return summary\n }\n\n for (const { source, skillFilter: perSourceFilter } of gitSources) {\n // Per-source filter (from a pull manifest) wins over the global flag.\n const filterRaw = perSourceFilter ?? opts.skillFilter\n const skillFilter = filterRaw\n ? filterRaw.split(COMMA_OR_WHITESPACE_RE).map(s => s.trim()).filter(Boolean)\n : undefined\n await syncGitSkills({\n source,\n global: !!opts.global,\n agent: opts.agent,\n yes: !!opts.yes,\n model: opts.model,\n force: opts.force,\n debug: opts.debug,\n skillFilter,\n })\n .then(() => { summary.installed += 1 })\n .catch((err) => {\n summary.failed += 1\n p.log.error(`Failed to install ${source.type === 'local' ? source.localPath : `${source.owner}/${source.repo}`}: ${err instanceof Error ? err.message : String(err)}`)\n })\n }\n\n if (npmEntries.length > 0) {\n const seen = new Set<string>()\n const dedupedEntries = npmEntries.filter((e) => {\n if (seen.has(e.name))\n return false\n seen.add(e.name)\n return true\n })\n\n const fallbackPackages: string[] = []\n for (const entry of dedupedEntries) {\n const resolved = await client.resolveSkill(entry.name).catch(() => null)\n if (!resolved) {\n fallbackPackages.push(entry.spec)\n continue\n }\n\n const [auditOwner, auditRepo] = resolved.repo.split('/')\n const audit = await getAudit(client, auditCache, auditOwner!, auditRepo!, resolved.name)\n const decision = gateInstall(audit, { allowUnsafe: opts.allowUnsafe, yes: opts.yes, sourceKind: 'npm' })\n\n const slug = `${resolved.repo}/${resolved.name}`\n if (audit.status === 'warn') {\n logAuditWarn(slug, audit)\n track({ event: 'audit-warn', surface: opts.surface, sourceKind: 'npm', slug, agent: opts.agent })\n }\n if (audit.status === 'fail') {\n logAuditFail(slug, audit, auditOwner!, auditRepo!, resolved.name)\n track({ event: 'audit-fail', surface: opts.surface, sourceKind: 'npm', slug, agent: opts.agent })\n }\n if (decision === 'skip') {\n track({ event: 'audit-blocked', surface: opts.surface, sourceKind: 'npm', slug, agent: opts.agent })\n summary.skipped += 1\n continue\n }\n\n const result = await syncRegistrySkill({ packageName: entry.name, agent: opts.agent, cwd, prefetched: resolved, surface: opts.surface })\n .catch((err) => {\n summary.failed += 1\n p.log.error(`Failed to install ${entry.name}: ${err instanceof Error ? err.message : String(err)}`)\n return null\n })\n if (result) {\n p.log.success(`Installed ${styleText('cyan', result.name)} from registry`)\n summary.installed += 1\n }\n else if (result === null) {\n fallbackPackages.push(entry.spec)\n }\n }\n\n if (fallbackPackages.length > 0) {\n const state = await getProjectState(cwd)\n p.intro(introLine({ state, agentId: opts.agent }))\n await syncCommand(state, {\n packages: [...fallbackPackages, ...crateSpecs],\n global: !!opts.global,\n agent: opts.agent,\n model: opts.model,\n yes: !!opts.yes,\n force: opts.force,\n debug: opts.debug,\n })\n summary.installed += fallbackPackages.length + crateSpecs.length\n return summary\n }\n }\n\n if (crateSpecs.length > 0) {\n const state = await getProjectState(cwd)\n p.intro(introLine({ state, agentId: opts.agent }))\n await syncCommand(state, {\n packages: crateSpecs,\n global: !!opts.global,\n agent: opts.agent,\n model: opts.model,\n yes: !!opts.yes,\n force: opts.force,\n debug: opts.debug,\n })\n summary.installed += crateSpecs.length\n }\n\n return summary\n}\n"],"mappings":"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"}
|