skillspace 0.7.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/LICENSE +22 -0
- package/README.md +57 -0
- package/bin/skillspace.js +2 -0
- package/dist/browserAuth.d.ts +20 -0
- package/dist/browserAuth.js +156 -0
- package/dist/browserAuth.js.map +1 -0
- package/dist/cli/authToken.d.ts +2 -0
- package/dist/cli/authToken.js +13 -0
- package/dist/cli/authToken.js.map +1 -0
- package/dist/cli/buildInfo.d.ts +3 -0
- package/dist/cli/buildInfo.js +103 -0
- package/dist/cli/buildInfo.js.map +1 -0
- package/dist/cli/clawdbotConfig.d.ts +6 -0
- package/dist/cli/clawdbotConfig.js +156 -0
- package/dist/cli/clawdbotConfig.js.map +1 -0
- package/dist/cli/commands/auth.d.ts +9 -0
- package/dist/cli/commands/auth.js +74 -0
- package/dist/cli/commands/auth.js.map +1 -0
- package/dist/cli/commands/delete.d.ts +28 -0
- package/dist/cli/commands/delete.js +94 -0
- package/dist/cli/commands/delete.js.map +1 -0
- package/dist/cli/commands/inspect.d.ts +12 -0
- package/dist/cli/commands/inspect.js +281 -0
- package/dist/cli/commands/inspect.js.map +1 -0
- package/dist/cli/commands/moderation.d.ts +19 -0
- package/dist/cli/commands/moderation.js +161 -0
- package/dist/cli/commands/moderation.js.map +1 -0
- package/dist/cli/commands/publish.d.ts +9 -0
- package/dist/cli/commands/publish.js +85 -0
- package/dist/cli/commands/publish.js.map +1 -0
- package/dist/cli/commands/skills.d.ts +26 -0
- package/dist/cli/commands/skills.js +387 -0
- package/dist/cli/commands/skills.js.map +1 -0
- package/dist/cli/commands/star.d.ts +8 -0
- package/dist/cli/commands/star.js +31 -0
- package/dist/cli/commands/star.js.map +1 -0
- package/dist/cli/commands/sync.d.ts +3 -0
- package/dist/cli/commands/sync.js +157 -0
- package/dist/cli/commands/sync.js.map +1 -0
- package/dist/cli/commands/syncHelpers.d.ts +76 -0
- package/dist/cli/commands/syncHelpers.js +369 -0
- package/dist/cli/commands/syncHelpers.js.map +1 -0
- package/dist/cli/commands/syncTypes.d.ts +24 -0
- package/dist/cli/commands/syncTypes.js +2 -0
- package/dist/cli/commands/syncTypes.js.map +1 -0
- package/dist/cli/commands/transfer.d.ts +50 -0
- package/dist/cli/commands/transfer.js +133 -0
- package/dist/cli/commands/transfer.js.map +1 -0
- package/dist/cli/commands/unstar.d.ts +8 -0
- package/dist/cli/commands/unstar.js +31 -0
- package/dist/cli/commands/unstar.js.map +1 -0
- package/dist/cli/helpStyle.d.ts +13 -0
- package/dist/cli/helpStyle.js +38 -0
- package/dist/cli/helpStyle.js.map +1 -0
- package/dist/cli/registry.d.ts +7 -0
- package/dist/cli/registry.js +31 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/cli/scanSkills.d.ts +7 -0
- package/dist/cli/scanSkills.js +84 -0
- package/dist/cli/scanSkills.js.map +1 -0
- package/dist/cli/slug.d.ts +2 -0
- package/dist/cli/slug.js +16 -0
- package/dist/cli/slug.js.map +1 -0
- package/dist/cli/types.d.ts +15 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/cli/ui.d.ts +7 -0
- package/dist/cli/ui.js +82 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +384 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +66 -0
- package/dist/config.js.map +1 -0
- package/dist/discovery.d.ts +5 -0
- package/dist/discovery.js +25 -0
- package/dist/discovery.js.map +1 -0
- package/dist/homedir.d.ts +7 -0
- package/dist/homedir.js +29 -0
- package/dist/homedir.js.map +1 -0
- package/dist/http.d.ts +43 -0
- package/dist/http.js +501 -0
- package/dist/http.js.map +1 -0
- package/dist/schema/ark.d.ts +4 -0
- package/dist/schema/ark.js +26 -0
- package/dist/schema/ark.js.map +1 -0
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.js +6 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/routes.d.ts +24 -0
- package/dist/schema/routes.js +25 -0
- package/dist/schema/routes.js.map +1 -0
- package/dist/schema/schemas.d.ts +343 -0
- package/dist/schema/schemas.js +308 -0
- package/dist/schema/schemas.js.map +1 -0
- package/dist/schema/textFiles.d.ts +5 -0
- package/dist/schema/textFiles.js +66 -0
- package/dist/schema/textFiles.js.map +1 -0
- package/dist/skills.d.ts +43 -0
- package/dist/skills.js +166 -0
- package/dist/skills.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { mkdir, rm, stat } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import semver from "semver";
|
|
4
|
+
import { apiRequest, downloadZip, registryUrl } from "../../http.js";
|
|
5
|
+
import { ApiRoutes, ApiV1SearchResponseSchema, ApiV1SkillListResponseSchema, ApiV1SkillResolveResponseSchema, ApiV1SkillResponseSchema, } from "../../schema/index.js";
|
|
6
|
+
import { extractZipToDir, hashSkillFiles, listTextFiles, readLockfile, readSkillOrigin, writeLockfile, writeSkillOrigin, } from "../../skills.js";
|
|
7
|
+
import { getOptionalAuthToken } from "../authToken.js";
|
|
8
|
+
import { getRegistry } from "../registry.js";
|
|
9
|
+
import { createSpinner, fail, formatError, isInteractive, promptConfirm } from "../ui.js";
|
|
10
|
+
function normalizeSkillSlugOrFail(raw) {
|
|
11
|
+
const slug = raw.trim();
|
|
12
|
+
if (!slug)
|
|
13
|
+
fail("Slug required");
|
|
14
|
+
// Safety: never allow path traversal or nested paths to become filesystem operations.
|
|
15
|
+
if (slug.includes("/") || slug.includes("\\") || slug.includes("..")) {
|
|
16
|
+
fail(`Invalid slug: ${slug}`);
|
|
17
|
+
}
|
|
18
|
+
return slug;
|
|
19
|
+
}
|
|
20
|
+
function isSafeSkillSlug(slug) {
|
|
21
|
+
return Boolean(slug) && !slug.includes("/") && !slug.includes("\\") && !slug.includes("..");
|
|
22
|
+
}
|
|
23
|
+
export async function cmdSearch(opts, query, limit) {
|
|
24
|
+
if (!query)
|
|
25
|
+
fail("Query required");
|
|
26
|
+
const token = await getOptionalAuthToken();
|
|
27
|
+
const registry = await getRegistry(opts, { cache: true });
|
|
28
|
+
const spinner = createSpinner("Searching");
|
|
29
|
+
try {
|
|
30
|
+
const url = registryUrl(ApiRoutes.search, registry);
|
|
31
|
+
url.searchParams.set("q", query);
|
|
32
|
+
if (typeof limit === "number" && Number.isFinite(limit)) {
|
|
33
|
+
url.searchParams.set("limit", String(limit));
|
|
34
|
+
}
|
|
35
|
+
const result = await apiRequest(registry, { method: "GET", url: url.toString(), token }, ApiV1SearchResponseSchema);
|
|
36
|
+
spinner.stop();
|
|
37
|
+
for (const entry of result.results) {
|
|
38
|
+
const slug = entry.slug ?? "unknown";
|
|
39
|
+
const name = entry.displayName ?? slug;
|
|
40
|
+
const version = entry.version ? ` v${entry.version}` : "";
|
|
41
|
+
console.log(`${slug}${version} ${name} (${entry.score.toFixed(3)})`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
spinner.fail(formatError(error));
|
|
46
|
+
throw error;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
export async function cmdInstall(opts, slug, versionFlag, force = false) {
|
|
50
|
+
const trimmed = normalizeSkillSlugOrFail(slug);
|
|
51
|
+
const token = await getOptionalAuthToken();
|
|
52
|
+
const registry = await getRegistry(opts, { cache: true });
|
|
53
|
+
await mkdir(opts.dir, { recursive: true });
|
|
54
|
+
const target = join(opts.dir, trimmed);
|
|
55
|
+
if (!force) {
|
|
56
|
+
const exists = await fileExists(target);
|
|
57
|
+
if (exists)
|
|
58
|
+
fail(`Already installed: ${target} (use --force)`);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
await rm(target, { recursive: true, force: true });
|
|
62
|
+
}
|
|
63
|
+
const spinner = createSpinner(`Resolving ${trimmed}`);
|
|
64
|
+
try {
|
|
65
|
+
// Fetch skill metadata including moderation status
|
|
66
|
+
const skillMeta = await apiRequest(registry, { method: "GET", path: `${ApiRoutes.skills}/${encodeURIComponent(trimmed)}`, token }, ApiV1SkillResponseSchema);
|
|
67
|
+
// Check moderation status before proceeding
|
|
68
|
+
if (skillMeta.moderation?.isMalwareBlocked) {
|
|
69
|
+
spinner.fail(`Blocked: ${trimmed} is flagged as malicious`);
|
|
70
|
+
fail("This skill has been flagged as malware and cannot be installed.");
|
|
71
|
+
}
|
|
72
|
+
if (skillMeta.moderation?.isSuspicious && !force) {
|
|
73
|
+
spinner.stop();
|
|
74
|
+
console.log(`\n⚠️ Warning: "${trimmed}" is flagged as suspicious by VirusTotal Code Insight.\n` +
|
|
75
|
+
" This skill may contain risky patterns (crypto keys, external APIs, eval, etc.)\n" +
|
|
76
|
+
" Review the skill code before use.\n");
|
|
77
|
+
if (isInteractive()) {
|
|
78
|
+
const confirm = await promptConfirm("Install anyway?");
|
|
79
|
+
if (!confirm)
|
|
80
|
+
fail("Installation cancelled");
|
|
81
|
+
spinner.start(`Resolving ${trimmed}`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
fail("Use --force to install suspicious skills in non-interactive mode");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const resolvedVersion = versionFlag ?? skillMeta.latestVersion?.version ?? null;
|
|
88
|
+
if (!resolvedVersion)
|
|
89
|
+
fail("Could not resolve latest version");
|
|
90
|
+
spinner.text = `Downloading ${trimmed}@${resolvedVersion}`;
|
|
91
|
+
const zip = await downloadZip(registry, { slug: trimmed, version: resolvedVersion, token });
|
|
92
|
+
await extractZipToDir(zip, target);
|
|
93
|
+
await writeSkillOrigin(target, {
|
|
94
|
+
version: 1,
|
|
95
|
+
registry,
|
|
96
|
+
slug: trimmed,
|
|
97
|
+
installedVersion: resolvedVersion,
|
|
98
|
+
installedAt: Date.now(),
|
|
99
|
+
});
|
|
100
|
+
const lock = await readLockfile(opts.workdir);
|
|
101
|
+
lock.skills[trimmed] = {
|
|
102
|
+
version: resolvedVersion,
|
|
103
|
+
installedAt: Date.now(),
|
|
104
|
+
};
|
|
105
|
+
await writeLockfile(opts.workdir, lock);
|
|
106
|
+
spinner.succeed(`OK. Installed ${trimmed} -> ${target}`);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
spinner.fail(formatError(error));
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
export async function cmdUpdate(opts, slugArg, options, inputAllowed) {
|
|
114
|
+
const slug = slugArg ? normalizeSkillSlugOrFail(slugArg) : undefined;
|
|
115
|
+
const all = Boolean(options.all);
|
|
116
|
+
if (!slug && !all)
|
|
117
|
+
fail("Provide <slug> or --all");
|
|
118
|
+
if (slug && all)
|
|
119
|
+
fail("Use either <slug> or --all");
|
|
120
|
+
if (options.version && !slug)
|
|
121
|
+
fail("--version requires a single <slug>");
|
|
122
|
+
if (options.version && !semver.valid(options.version))
|
|
123
|
+
fail("--version must be valid semver");
|
|
124
|
+
const allowPrompt = isInteractive() && inputAllowed;
|
|
125
|
+
const token = await getOptionalAuthToken();
|
|
126
|
+
const registry = await getRegistry(opts, { cache: true });
|
|
127
|
+
const lock = await readLockfile(opts.workdir);
|
|
128
|
+
const slugs = slug ? [slug] : Object.keys(lock.skills).filter(isSafeSkillSlug);
|
|
129
|
+
if (slugs.length === 0) {
|
|
130
|
+
console.log("No installed skills.");
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
for (const entry of slugs) {
|
|
134
|
+
const spinner = createSpinner(`Checking ${entry}`);
|
|
135
|
+
try {
|
|
136
|
+
const target = join(opts.dir, entry);
|
|
137
|
+
const exists = await fileExists(target);
|
|
138
|
+
// Always fetch skill metadata to check moderation status
|
|
139
|
+
const skillMeta = await apiRequest(registry, { method: "GET", path: `${ApiRoutes.skills}/${encodeURIComponent(entry)}`, token }, ApiV1SkillResponseSchema);
|
|
140
|
+
// Check moderation status before proceeding
|
|
141
|
+
if (skillMeta.moderation?.isMalwareBlocked) {
|
|
142
|
+
spinner.fail(`${entry}: blocked as malicious`);
|
|
143
|
+
console.log(" This skill has been flagged as malware and cannot be updated.");
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (skillMeta.moderation?.isSuspicious && !options.force) {
|
|
147
|
+
spinner.stop();
|
|
148
|
+
console.log(`\n⚠️ Warning: "${entry}" is flagged as suspicious by VirusTotal Code Insight.\n` +
|
|
149
|
+
" This skill may contain risky patterns (crypto keys, external APIs, eval, etc.)\n");
|
|
150
|
+
if (allowPrompt) {
|
|
151
|
+
const confirm = await promptConfirm("Update anyway?");
|
|
152
|
+
if (!confirm) {
|
|
153
|
+
console.log(`${entry}: skipped`);
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
spinner.start(`Checking ${entry}`);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
console.log(`${entry}: skipped (use --force to update suspicious skills)`);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
let localFingerprint = null;
|
|
164
|
+
if (exists) {
|
|
165
|
+
const filesOnDisk = await listTextFiles(target);
|
|
166
|
+
if (filesOnDisk.length > 0) {
|
|
167
|
+
const hashed = hashSkillFiles(filesOnDisk);
|
|
168
|
+
localFingerprint = hashed.fingerprint;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
let resolveResult;
|
|
172
|
+
if (localFingerprint) {
|
|
173
|
+
resolveResult = await resolveSkillVersion(registry, entry, localFingerprint, token);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
resolveResult = { match: null, latestVersion: skillMeta.latestVersion ?? null };
|
|
177
|
+
}
|
|
178
|
+
const latest = resolveResult.latestVersion?.version ?? null;
|
|
179
|
+
const matched = resolveResult.match?.version ?? null;
|
|
180
|
+
if (matched && lock.skills[entry]?.version !== matched) {
|
|
181
|
+
lock.skills[entry] = {
|
|
182
|
+
version: matched,
|
|
183
|
+
installedAt: lock.skills[entry]?.installedAt ?? Date.now(),
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
if (!latest) {
|
|
187
|
+
spinner.fail(`${entry}: not found`);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
if (!matched && localFingerprint && !options.force) {
|
|
191
|
+
spinner.stop();
|
|
192
|
+
if (!allowPrompt) {
|
|
193
|
+
console.log(`${entry}: local changes (no match). Use --force to overwrite.`);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const confirm = await promptConfirm(`${entry}: local changes (no match). Overwrite with ${options.version ?? latest}?`);
|
|
197
|
+
if (!confirm) {
|
|
198
|
+
console.log(`${entry}: skipped`);
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
spinner.start(`Updating ${entry} -> ${options.version ?? latest}`);
|
|
202
|
+
}
|
|
203
|
+
const targetVersion = options.version ?? latest;
|
|
204
|
+
if (options.version) {
|
|
205
|
+
if (matched && matched === targetVersion) {
|
|
206
|
+
spinner.succeed(`${entry}: already at ${matched}`);
|
|
207
|
+
continue;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
else if (matched && semver.valid(matched) && semver.gte(matched, targetVersion)) {
|
|
211
|
+
spinner.succeed(`${entry}: up to date (${matched})`);
|
|
212
|
+
continue;
|
|
213
|
+
}
|
|
214
|
+
if (spinner.isSpinning) {
|
|
215
|
+
spinner.text = `Updating ${entry} -> ${targetVersion}`;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
spinner.start(`Updating ${entry} -> ${targetVersion}`);
|
|
219
|
+
}
|
|
220
|
+
await rm(target, { recursive: true, force: true });
|
|
221
|
+
const zip = await downloadZip(registry, { slug: entry, version: targetVersion, token });
|
|
222
|
+
await extractZipToDir(zip, target);
|
|
223
|
+
const existingOrigin = await readSkillOrigin(target);
|
|
224
|
+
await writeSkillOrigin(target, {
|
|
225
|
+
version: 1,
|
|
226
|
+
registry: existingOrigin?.registry ?? registry,
|
|
227
|
+
slug: existingOrigin?.slug ?? entry,
|
|
228
|
+
installedVersion: targetVersion,
|
|
229
|
+
installedAt: existingOrigin?.installedAt ?? Date.now(),
|
|
230
|
+
});
|
|
231
|
+
lock.skills[entry] = { version: targetVersion, installedAt: Date.now() };
|
|
232
|
+
spinner.succeed(`${entry}: updated -> ${targetVersion}`);
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
spinner.fail(formatError(error));
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
await writeLockfile(opts.workdir, lock);
|
|
240
|
+
}
|
|
241
|
+
export async function cmdList(opts) {
|
|
242
|
+
const lock = await readLockfile(opts.workdir);
|
|
243
|
+
const entries = Object.entries(lock.skills);
|
|
244
|
+
if (entries.length === 0) {
|
|
245
|
+
console.log("No installed skills.");
|
|
246
|
+
return;
|
|
247
|
+
}
|
|
248
|
+
for (const [slug, entry] of entries) {
|
|
249
|
+
console.log(`${slug} ${entry.version ?? "latest"}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
export async function cmdUninstall(opts, slug, options = {}, inputAllowed) {
|
|
253
|
+
const trimmed = normalizeSkillSlugOrFail(slug);
|
|
254
|
+
const lock = await readLockfile(opts.workdir);
|
|
255
|
+
if (!lock.skills[trimmed]) {
|
|
256
|
+
fail(`Not installed: ${trimmed}`);
|
|
257
|
+
}
|
|
258
|
+
const allowPrompt = isInteractive() && inputAllowed;
|
|
259
|
+
if (!options.yes) {
|
|
260
|
+
if (!allowPrompt)
|
|
261
|
+
fail("Pass --yes (no input)");
|
|
262
|
+
const confirm = await promptConfirm(`Uninstall ${trimmed}?`);
|
|
263
|
+
if (!confirm) {
|
|
264
|
+
console.log("Cancelled.");
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
const spinner = createSpinner(`Uninstalling ${trimmed}`);
|
|
269
|
+
try {
|
|
270
|
+
const target = join(opts.dir, trimmed);
|
|
271
|
+
await rm(target, { recursive: true, force: true });
|
|
272
|
+
delete lock.skills[trimmed];
|
|
273
|
+
await writeLockfile(opts.workdir, lock);
|
|
274
|
+
spinner.succeed(`Uninstalled ${trimmed}`);
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
spinner.fail(formatError(error));
|
|
278
|
+
throw error;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
export async function cmdExplore(opts, options = {}) {
|
|
282
|
+
const token = await getOptionalAuthToken();
|
|
283
|
+
const registry = await getRegistry(opts, { cache: true });
|
|
284
|
+
const spinner = createSpinner("Fetching latest skills");
|
|
285
|
+
try {
|
|
286
|
+
const url = registryUrl(ApiRoutes.skills, registry);
|
|
287
|
+
const boundedLimit = clampLimit(options.limit ?? 25);
|
|
288
|
+
const { apiSort } = resolveExploreSort(options.sort);
|
|
289
|
+
url.searchParams.set("limit", String(boundedLimit));
|
|
290
|
+
if (apiSort !== "updated")
|
|
291
|
+
url.searchParams.set("sort", apiSort);
|
|
292
|
+
const result = await apiRequest(registry, { method: "GET", url: url.toString(), token }, ApiV1SkillListResponseSchema);
|
|
293
|
+
spinner.stop();
|
|
294
|
+
if (options.json) {
|
|
295
|
+
console.log(JSON.stringify(result, null, 2));
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
if (result.items.length === 0) {
|
|
299
|
+
console.log("No skills found.");
|
|
300
|
+
return;
|
|
301
|
+
}
|
|
302
|
+
for (const item of result.items) {
|
|
303
|
+
console.log(formatExploreLine(item));
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
spinner.fail(formatError(error));
|
|
308
|
+
throw error;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
export function formatExploreLine(item) {
|
|
312
|
+
const version = item.latestVersion?.version ?? "?";
|
|
313
|
+
const age = formatRelativeTime(item.updatedAt);
|
|
314
|
+
const summary = item.summary ? ` ${truncate(item.summary, 50)}` : "";
|
|
315
|
+
return `${item.slug} v${version} ${age}${summary}`;
|
|
316
|
+
}
|
|
317
|
+
export function clampLimit(limit, fallback = 25) {
|
|
318
|
+
if (!Number.isFinite(limit))
|
|
319
|
+
return fallback;
|
|
320
|
+
return Math.min(Math.max(1, limit), 200);
|
|
321
|
+
}
|
|
322
|
+
function formatRelativeTime(timestamp) {
|
|
323
|
+
const now = Date.now();
|
|
324
|
+
const diff = now - timestamp;
|
|
325
|
+
const seconds = Math.floor(diff / 1000);
|
|
326
|
+
const minutes = Math.floor(seconds / 60);
|
|
327
|
+
const hours = Math.floor(minutes / 60);
|
|
328
|
+
const days = Math.floor(hours / 24);
|
|
329
|
+
if (days > 30) {
|
|
330
|
+
const months = Math.floor(days / 30);
|
|
331
|
+
return `${months}mo ago`;
|
|
332
|
+
}
|
|
333
|
+
if (days > 0)
|
|
334
|
+
return `${days}d ago`;
|
|
335
|
+
if (hours > 0)
|
|
336
|
+
return `${hours}h ago`;
|
|
337
|
+
if (minutes > 0)
|
|
338
|
+
return `${minutes}m ago`;
|
|
339
|
+
return "just now";
|
|
340
|
+
}
|
|
341
|
+
function truncate(str, maxLen) {
|
|
342
|
+
if (str.length <= maxLen)
|
|
343
|
+
return str;
|
|
344
|
+
return `${str.slice(0, maxLen - 1)}…`;
|
|
345
|
+
}
|
|
346
|
+
function resolveExploreSort(raw) {
|
|
347
|
+
const normalized = raw?.trim().toLowerCase();
|
|
348
|
+
if (!normalized || normalized === "newest" || normalized === "updated") {
|
|
349
|
+
return { sort: "newest", apiSort: "updated" };
|
|
350
|
+
}
|
|
351
|
+
if (normalized === "downloads" || normalized === "download") {
|
|
352
|
+
return { sort: "downloads", apiSort: "downloads" };
|
|
353
|
+
}
|
|
354
|
+
if (normalized === "rating" || normalized === "stars" || normalized === "star") {
|
|
355
|
+
return { sort: "rating", apiSort: "stars" };
|
|
356
|
+
}
|
|
357
|
+
if (normalized === "installs" ||
|
|
358
|
+
normalized === "install" ||
|
|
359
|
+
normalized === "installscurrent" ||
|
|
360
|
+
normalized === "installs-current" ||
|
|
361
|
+
normalized === "current") {
|
|
362
|
+
return { sort: "installs", apiSort: "installsCurrent" };
|
|
363
|
+
}
|
|
364
|
+
if (normalized === "installsalltime" || normalized === "installs-all-time") {
|
|
365
|
+
return { sort: "installsAllTime", apiSort: "installsAllTime" };
|
|
366
|
+
}
|
|
367
|
+
if (normalized === "trending") {
|
|
368
|
+
return { sort: "trending", apiSort: "trending" };
|
|
369
|
+
}
|
|
370
|
+
fail(`Invalid sort "${raw}". Use newest, downloads, rating, installs, installsAllTime, or trending.`);
|
|
371
|
+
}
|
|
372
|
+
async function resolveSkillVersion(registry, slug, hash, token) {
|
|
373
|
+
const url = registryUrl(ApiRoutes.resolve, registry);
|
|
374
|
+
url.searchParams.set("slug", slug);
|
|
375
|
+
url.searchParams.set("hash", hash);
|
|
376
|
+
return apiRequest(registry, { method: "GET", url: url.toString(), token }, ApiV1SkillResolveResponseSchema);
|
|
377
|
+
}
|
|
378
|
+
async function fileExists(path) {
|
|
379
|
+
try {
|
|
380
|
+
await stat(path);
|
|
381
|
+
return true;
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
//# sourceMappingURL=skills.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../../src/cli/commands/skills.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { apiRequest } from "../../http.js";
|
|
2
|
+
import { ApiRoutes, ApiV1StarResponseSchema } from "../../schema/index.js";
|
|
3
|
+
import { requireAuthToken } from "../authToken.js";
|
|
4
|
+
import { getRegistry } from "../registry.js";
|
|
5
|
+
import { createSpinner, fail, formatError, isInteractive, promptConfirm } from "../ui.js";
|
|
6
|
+
export async function cmdStarSkill(opts, slugArg, options, inputAllowed) {
|
|
7
|
+
const slug = slugArg.trim().toLowerCase();
|
|
8
|
+
if (!slug)
|
|
9
|
+
fail("Slug required");
|
|
10
|
+
const allowPrompt = isInteractive() && inputAllowed !== false;
|
|
11
|
+
if (!options.yes) {
|
|
12
|
+
if (!allowPrompt)
|
|
13
|
+
fail("Pass --yes (no input)");
|
|
14
|
+
const ok = await promptConfirm(`Star ${slug}?`);
|
|
15
|
+
if (!ok)
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
const token = await requireAuthToken();
|
|
19
|
+
const registry = await getRegistry(opts, { cache: true });
|
|
20
|
+
const spinner = createSpinner(`Starring ${slug}`);
|
|
21
|
+
try {
|
|
22
|
+
const result = await apiRequest(registry, { method: "POST", path: `${ApiRoutes.stars}/${encodeURIComponent(slug)}`, token }, ApiV1StarResponseSchema);
|
|
23
|
+
spinner.succeed(result.alreadyStarred ? `OK. ${slug} already starred.` : `OK. Starred ${slug}`);
|
|
24
|
+
return result;
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
spinner.fail(formatError(error));
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=star.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"star.js","sourceRoot":"","sources":["../../../src/cli/commands/star.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE1F,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAgB,EAChB,OAAe,EACf,OAA0B,EAC1B,YAAqB;IAErB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,eAAe,CAAC,CAAC;IACjC,MAAM,WAAW,GAAG,aAAa,EAAE,IAAI,YAAY,KAAK,KAAK,CAAC;IAE9D,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,WAAW;YAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAChD,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;QAChD,IAAI,CAAC,EAAE;YAAE,OAAO;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,gBAAgB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,QAAQ,EACR,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,KAAK,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EACjF,uBAAuB,CACxB,CAAC;QACF,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,CAAC,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;QAChG,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { intro, outro } from "@clack/prompts";
|
|
2
|
+
import { hashSkillFiles, listTextFiles, readSkillOrigin } from "../../skills.js";
|
|
3
|
+
import { requireAuthToken } from "../authToken.js";
|
|
4
|
+
import { resolveClawdbotSkillRoots } from "../clawdbotConfig.js";
|
|
5
|
+
import { getFallbackSkillRoots } from "../scanSkills.js";
|
|
6
|
+
import { createSpinner, fail, formatError, isInteractive } from "../ui.js";
|
|
7
|
+
import { cmdPublish } from "./publish.js";
|
|
8
|
+
import { buildScanRoots, checkRegistrySyncState, dedupeSkillsBySlug, formatActionableLine, formatBulletList, formatCommaList, formatList, formatSyncedDisplay, formatSyncedSummary, getRegistryWithAuth, mapWithConcurrency, mergeScan, normalizeConcurrency, printSection, reportTelemetryIfEnabled, resolvePublishMeta, scanRootsWithLabels, selectToUpload, } from "./syncHelpers.js";
|
|
9
|
+
export async function cmdSync(opts, options, inputAllowed) {
|
|
10
|
+
const allowPrompt = isInteractive() && inputAllowed !== false;
|
|
11
|
+
intro("SkillSpace sync");
|
|
12
|
+
const token = await requireAuthToken();
|
|
13
|
+
const registry = await getRegistryWithAuth(opts, token);
|
|
14
|
+
const selectedRoots = buildScanRoots(opts, options.root);
|
|
15
|
+
const clawdbotRoots = await resolveClawdbotSkillRoots();
|
|
16
|
+
const combinedRoots = Array.from(new Set([...selectedRoots, ...clawdbotRoots.roots].map((root) => root.trim()).filter(Boolean)));
|
|
17
|
+
const concurrency = normalizeConcurrency(options.concurrency);
|
|
18
|
+
const spinner = createSpinner("Scanning for local skills");
|
|
19
|
+
const primaryScan = await scanRootsWithLabels(combinedRoots, clawdbotRoots.labels);
|
|
20
|
+
let scan = primaryScan;
|
|
21
|
+
let telemetryScan = primaryScan;
|
|
22
|
+
if (primaryScan.skills.length === 0) {
|
|
23
|
+
const fallback = getFallbackSkillRoots(opts.workdir);
|
|
24
|
+
const fallbackScan = await scanRootsWithLabels(fallback);
|
|
25
|
+
spinner.stop();
|
|
26
|
+
telemetryScan = mergeScan(primaryScan, fallbackScan);
|
|
27
|
+
scan = fallbackScan;
|
|
28
|
+
if (fallbackScan.skills.length === 0)
|
|
29
|
+
fail("No skills found (checked workdir and known Clawdis/Clawd locations)");
|
|
30
|
+
printSection(`No skills in workdir. Found ${fallbackScan.skills.length} in fallback locations.`, formatList(fallbackScan.rootsWithSkills, 10));
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
spinner.stop();
|
|
34
|
+
const labeledRoots = primaryScan.rootsWithSkills
|
|
35
|
+
.map((root) => {
|
|
36
|
+
const label = primaryScan.rootLabels?.[root];
|
|
37
|
+
return label ? `${label} (${root})` : root;
|
|
38
|
+
})
|
|
39
|
+
.filter(Boolean);
|
|
40
|
+
if (labeledRoots.length > 0) {
|
|
41
|
+
printSection("Roots with skills", formatList(labeledRoots, 10));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const deduped = dedupeSkillsBySlug(scan.skills);
|
|
45
|
+
const skills = deduped.skills;
|
|
46
|
+
if (deduped.duplicates.length > 0) {
|
|
47
|
+
printSection("Skipped duplicate slugs", formatCommaList(deduped.duplicates, 16));
|
|
48
|
+
}
|
|
49
|
+
const parsingSpinner = createSpinner("Parsing local skills");
|
|
50
|
+
const locals = [];
|
|
51
|
+
try {
|
|
52
|
+
let done = 0;
|
|
53
|
+
const parsed = await mapWithConcurrency(skills, Math.min(concurrency, 12), async (skill) => {
|
|
54
|
+
const filesOnDisk = await listTextFiles(skill.folder);
|
|
55
|
+
const hashed = hashSkillFiles(filesOnDisk);
|
|
56
|
+
const origin = await readSkillOrigin(skill.folder);
|
|
57
|
+
done += 1;
|
|
58
|
+
parsingSpinner.text = `Parsing local skills ${done}/${skills.length}`;
|
|
59
|
+
return {
|
|
60
|
+
...skill,
|
|
61
|
+
fingerprint: hashed.fingerprint,
|
|
62
|
+
fileCount: filesOnDisk.length,
|
|
63
|
+
origin,
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
locals.push(...parsed);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
parsingSpinner.fail(formatError(error));
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
finally {
|
|
73
|
+
parsingSpinner.stop();
|
|
74
|
+
}
|
|
75
|
+
const candidatesSpinner = createSpinner("Checking registry sync state");
|
|
76
|
+
const candidates = [];
|
|
77
|
+
const resolveSupport = { value: null };
|
|
78
|
+
try {
|
|
79
|
+
let done = 0;
|
|
80
|
+
const resolved = await mapWithConcurrency(locals, Math.min(concurrency, 16), async (skill) => {
|
|
81
|
+
try {
|
|
82
|
+
return await checkRegistrySyncState(registry, skill, resolveSupport, token);
|
|
83
|
+
}
|
|
84
|
+
finally {
|
|
85
|
+
done += 1;
|
|
86
|
+
candidatesSpinner.text = `Checking registry sync state ${done}/${locals.length}`;
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
candidates.push(...resolved);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
candidatesSpinner.fail(formatError(error));
|
|
93
|
+
throw error;
|
|
94
|
+
}
|
|
95
|
+
finally {
|
|
96
|
+
candidatesSpinner.stop();
|
|
97
|
+
}
|
|
98
|
+
await reportTelemetryIfEnabled({
|
|
99
|
+
token,
|
|
100
|
+
registry,
|
|
101
|
+
scan: telemetryScan,
|
|
102
|
+
candidates,
|
|
103
|
+
});
|
|
104
|
+
const synced = candidates.filter((candidate) => candidate.status === "synced");
|
|
105
|
+
const actionable = candidates.filter((candidate) => candidate.status !== "synced");
|
|
106
|
+
const bump = options.bump ?? "patch";
|
|
107
|
+
if (actionable.length === 0) {
|
|
108
|
+
if (synced.length > 0) {
|
|
109
|
+
printSection("Already synced", formatCommaList(synced.map(formatSyncedSummary), 16));
|
|
110
|
+
}
|
|
111
|
+
outro("Nothing to sync.");
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
printSection("To sync", formatBulletList(actionable.map((candidate) => formatActionableLine(candidate, bump)), 20));
|
|
115
|
+
if (synced.length > 0) {
|
|
116
|
+
printSection("Already synced", formatSyncedDisplay(synced));
|
|
117
|
+
}
|
|
118
|
+
const selected = await selectToUpload(actionable, {
|
|
119
|
+
allowPrompt,
|
|
120
|
+
all: Boolean(options.all),
|
|
121
|
+
bump,
|
|
122
|
+
});
|
|
123
|
+
if (selected.length === 0) {
|
|
124
|
+
outro("Nothing selected.");
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
if (options.dryRun) {
|
|
128
|
+
outro(`Dry run: would upload ${selected.length} skill(s).`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const tags = options.tags ?? "latest";
|
|
132
|
+
for (const skill of selected) {
|
|
133
|
+
const { publishVersion, changelog } = await resolvePublishMeta(skill, {
|
|
134
|
+
bump,
|
|
135
|
+
allowPrompt,
|
|
136
|
+
changelogFlag: options.changelog,
|
|
137
|
+
});
|
|
138
|
+
const forkOf = skill.origin && normalizeRegistry(skill.origin.registry) === normalizeRegistry(registry)
|
|
139
|
+
? skill.origin.slug !== skill.slug
|
|
140
|
+
? `${skill.origin.slug}@${skill.origin.installedVersion}`
|
|
141
|
+
: undefined
|
|
142
|
+
: undefined;
|
|
143
|
+
await cmdPublish(opts, skill.folder, {
|
|
144
|
+
slug: skill.slug,
|
|
145
|
+
name: skill.displayName,
|
|
146
|
+
version: publishVersion,
|
|
147
|
+
changelog,
|
|
148
|
+
tags,
|
|
149
|
+
forkOf,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
outro(`Uploaded ${selected.length} skill(s).`);
|
|
153
|
+
}
|
|
154
|
+
function normalizeRegistry(value) {
|
|
155
|
+
return value.trim().replace(/\/+$/, "").toLowerCase();
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"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"}
|