transskill 0.2.8 → 0.3.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.
@@ -0,0 +1,470 @@
1
+ /**
2
+ * Publish command — audit, fork, and PR a skill to the registry.
3
+ *
4
+ * Flow:
5
+ * 1. Validate skill directory (SKILL.md + frontmatter)
6
+ * 2. Parse + audit (mandatory, score >= 90 unless --force)
7
+ * 3. GitHub API: fork → branch → upload SKILL.md → update registry.json → PR
8
+ */
9
+ import { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { intro, outro, spinner, log } from '@clack/prompts';
12
+ import chalk from 'chalk';
13
+ import matter from 'gray-matter';
14
+ import { AuditEngine } from '../audit/index.js';
15
+ import { getParser } from '../parser/parser-registry.js';
16
+ // ──────────────────────────────────────────────
17
+ // Constants
18
+ // ──────────────────────────────────────────────
19
+ const REGISTRY_OWNER = 'ljk-777';
20
+ const REGISTRY_REPO = 'transskill-registry';
21
+ const REGISTRY_FULL = `${REGISTRY_OWNER}/${REGISTRY_REPO}`;
22
+ const GITHUB_API = 'https://api.github.com';
23
+ // ──────────────────────────────────────────────
24
+ // GitHub API helpers
25
+ // ──────────────────────────────────────────────
26
+ function getToken() {
27
+ const token = process.env.GITHUB_TOKEN;
28
+ if (!token) {
29
+ console.error('');
30
+ log.error('GITHUB_TOKEN environment variable not set.');
31
+ log.info('Create a token at https://github.com/settings/tokens');
32
+ log.info('Then set: export GITHUB_TOKEN=ghp_xxx');
33
+ console.error('');
34
+ process.exit(1);
35
+ }
36
+ return token;
37
+ }
38
+ function ghHeaders(token) {
39
+ return {
40
+ Authorization: `Bearer ${token}`,
41
+ Accept: 'application/vnd.github+json',
42
+ 'User-Agent': 'transskill-cli',
43
+ 'X-GitHub-Api-Version': '2022-11-28',
44
+ };
45
+ }
46
+ async function ghFetch(url, token, options = {}) {
47
+ const res = await fetch(url, {
48
+ ...options,
49
+ headers: {
50
+ ...ghHeaders(token),
51
+ ...options.headers,
52
+ },
53
+ });
54
+ return res;
55
+ }
56
+ /**
57
+ * Get the authenticated user's GitHub login.
58
+ */
59
+ async function getGitHubUser(token) {
60
+ const res = await ghFetch(`${GITHUB_API}/user`, token);
61
+ if (!res.ok) {
62
+ throw new Error(`Failed to authenticate: ${res.status} ${res.statusText}`);
63
+ }
64
+ const data = await res.json();
65
+ return data.login;
66
+ }
67
+ /**
68
+ * Get the default branch of the registry repo.
69
+ */
70
+ async function getDefaultBranch(token) {
71
+ const res = await ghFetch(`${GITHUB_API}/repos/${REGISTRY_FULL}`, token);
72
+ if (!res.ok)
73
+ throw new Error(`Failed to get repo info: ${res.status}`);
74
+ const data = await res.json();
75
+ const branch = data.default_branch;
76
+ // Get the SHA of the latest commit on the default branch
77
+ const refRes = await ghFetch(`${GITHUB_API}/repos/${REGISTRY_FULL}/git/ref/heads/${branch}`, token);
78
+ if (!refRes.ok)
79
+ throw new Error(`Failed to get branch ref: ${refRes.status}`);
80
+ const refData = await refRes.json();
81
+ return { name: branch, sha: refData.object.sha };
82
+ }
83
+ /**
84
+ * Create a fork of the registry repo (no-op if already exists).
85
+ */
86
+ async function ensureFork(token, user) {
87
+ // Check if fork exists
88
+ const checkRes = await ghFetch(`${GITHUB_API}/repos/${user}/${REGISTRY_REPO}`, token);
89
+ if (checkRes.ok) {
90
+ // Fork exists
91
+ return;
92
+ }
93
+ log.info('Creating fork of transskill-registry…');
94
+ const res = await ghFetch(`${GITHUB_API}/repos/${REGISTRY_FULL}/forks`, token, {
95
+ method: 'POST',
96
+ body: JSON.stringify({}),
97
+ });
98
+ if (res.status === 202) {
99
+ log.info('Fork creation in progress (this may take a few seconds)…');
100
+ // Wait for fork to be ready
101
+ let ready = false;
102
+ let attempts = 0;
103
+ while (!ready && attempts < 30) {
104
+ await new Promise((r) => setTimeout(r, 2000));
105
+ const check = await ghFetch(`${GITHUB_API}/repos/${user}/${REGISTRY_REPO}`, token);
106
+ if (check.ok)
107
+ ready = true;
108
+ attempts++;
109
+ }
110
+ if (!ready)
111
+ throw new Error('Timed out waiting for fork to be created');
112
+ }
113
+ else if (!res.ok) {
114
+ const body = await res.json().catch(() => ({}));
115
+ throw new Error(`Failed to fork repo: ${res.status} ${body.message || res.statusText}`);
116
+ }
117
+ }
118
+ /**
119
+ * Create or update a file in the fork via GitHub API.
120
+ */
121
+ async function upsertFile(token, user, branch, path, content, message) {
122
+ // Try to get existing file SHA
123
+ let existingSha;
124
+ const getRes = await ghFetch(`${GITHUB_API}/repos/${user}/${REGISTRY_REPO}/contents/${path}?ref=${branch}`, token);
125
+ if (getRes.ok) {
126
+ const data = await getRes.json();
127
+ existingSha = data.sha;
128
+ }
129
+ // Base64 encode content
130
+ const base64 = Buffer.from(content, 'utf-8').toString('base64');
131
+ const body = {
132
+ message,
133
+ content: base64,
134
+ branch,
135
+ };
136
+ if (existingSha) {
137
+ body.sha = existingSha;
138
+ }
139
+ const res = await ghFetch(`${GITHUB_API}/repos/${user}/${REGISTRY_REPO}/contents/${path}`, token, {
140
+ method: 'PUT',
141
+ body: JSON.stringify(body),
142
+ });
143
+ if (!res.ok) {
144
+ const errBody = await res.json().catch(() => ({}));
145
+ throw new Error(`Failed to write ${path}: ${res.status} ${errBody.message || res.statusText}`);
146
+ }
147
+ }
148
+ /**
149
+ * Create a pull request.
150
+ */
151
+ async function createPR(token, user, branch, title, body) {
152
+ const res = await ghFetch(`${GITHUB_API}/repos/${REGISTRY_FULL}/pulls`, token, {
153
+ method: 'POST',
154
+ body: JSON.stringify({
155
+ title,
156
+ body,
157
+ head: `${user}:${branch}`,
158
+ base: 'main',
159
+ }),
160
+ });
161
+ if (!res.ok) {
162
+ const errBody = await res.json().catch(() => ({}));
163
+ throw new Error(`Failed to create PR: ${res.status} ${errBody.message || res.statusText}`);
164
+ }
165
+ const data = await res.json();
166
+ return data.html_url;
167
+ }
168
+ /**
169
+ * Publish a skill directory to the registry.
170
+ */
171
+ export async function publishSkill(skillPath, options) {
172
+ const spin = spinner();
173
+ intro(chalk.green('📤 TransSkill Publish'));
174
+ // Step 1: Resolve and validate skill directory
175
+ const skillDirPath = skillPath.startsWith('/')
176
+ ? skillPath
177
+ : join(process.cwd(), skillPath);
178
+ if (!existsSync(skillDirPath)) {
179
+ log.error(`Path does not exist: ${skillDirPath}`);
180
+ outro('Publish cancelled');
181
+ process.exit(1);
182
+ }
183
+ const stat = statSync(skillDirPath);
184
+ if (!stat.isDirectory()) {
185
+ log.error(`Expected a directory, got a file: ${skillDirPath}`);
186
+ log.info('Usage: transskill publish ./my-skill/');
187
+ outro('Publish cancelled');
188
+ process.exit(1);
189
+ }
190
+ // Check for SKILL.md
191
+ const skillMdPath = join(skillDirPath, 'SKILL.md');
192
+ if (!existsSync(skillMdPath)) {
193
+ log.error(`Directory does not contain SKILL.md: ${skillDirPath}`);
194
+ log.info('A valid skill directory must have a SKILL.md file with frontmatter.');
195
+ outro('Publish cancelled');
196
+ process.exit(1);
197
+ }
198
+ // Step 2: Parse and validate frontmatter
199
+ spin.start('Validating SKILL.md…');
200
+ let skill;
201
+ let rawContent;
202
+ let skillDir;
203
+ let frontmatter;
204
+ try {
205
+ rawContent = readFileSync(skillMdPath, 'utf-8');
206
+ const parsed = matter(rawContent);
207
+ frontmatter = parsed.data;
208
+ const parser = getParser('skill.md');
209
+ skill = parser.parse(rawContent, skillMdPath);
210
+ // Also scan directory structure
211
+ skillDir = parser.parseDirectory(skillDirPath);
212
+ // Validate required frontmatter
213
+ if (!frontmatter.description || typeof frontmatter.description !== 'string') {
214
+ throw new Error('"description" field is required in frontmatter');
215
+ }
216
+ if (!Array.isArray(frontmatter.tags)) {
217
+ throw new Error('"tags" field is required and must be an array');
218
+ }
219
+ if (frontmatter.tags.length === 0) {
220
+ throw new Error('"tags" array must have at least one tag');
221
+ }
222
+ spin.stop('Validated ✓');
223
+ console.log(` Name: ${chalk.bold(skill.name)}`);
224
+ console.log(` Description: ${skill.description}`);
225
+ if (frontmatter.version) {
226
+ console.log(` Version: ${frontmatter.version}`);
227
+ }
228
+ console.log(` Tags: ${frontmatter.tags.map((t) => chalk.cyan(t)).join(', ')}`);
229
+ console.log('');
230
+ }
231
+ catch (err) {
232
+ spin.stop('Validation failed');
233
+ const message = err instanceof Error ? err.message : String(err);
234
+ log.error(`Invalid skill: ${message}`);
235
+ outro('Publish cancelled');
236
+ process.exit(1);
237
+ }
238
+ // Step 3: Security audit (mandatory)
239
+ spin.start('Running security audit…');
240
+ const engine = new AuditEngine({ lang: 'en' });
241
+ const report = engine.auditSkill(skill, skillMdPath);
242
+ const score = calculateScore(report);
243
+ spin.stop(`Audit complete — score: ${formatScore(score)}`);
244
+ if (report.findings.length > 0) {
245
+ console.log(engine.reportToString(report));
246
+ }
247
+ else {
248
+ console.log(` ${chalk.green('✓ No security issues found')}`);
249
+ }
250
+ console.log('');
251
+ if (score < 90 && !options.force) {
252
+ log.error(`Audit score ${score}/100 is below the minimum of 90.`);
253
+ log.info('Fix the issues or use --force to publish anyway.');
254
+ outro('Publish cancelled');
255
+ process.exit(1);
256
+ }
257
+ // Dry run — stop here
258
+ if (options.dryRun) {
259
+ outro(chalk.yellow('Dry run — no changes made. Use without --dry-run to publish.'));
260
+ return;
261
+ }
262
+ // Step 4: GitHub API — authenticate and publish
263
+ spin.start('Connecting to GitHub…');
264
+ let token;
265
+ let user;
266
+ let baseBranch;
267
+ let baseSha;
268
+ try {
269
+ token = getToken();
270
+ user = await getGitHubUser(token);
271
+ const base = await getDefaultBranch(token);
272
+ baseBranch = base.name;
273
+ baseSha = base.sha;
274
+ spin.stop(`Authenticated as ${chalk.bold(user)}`);
275
+ console.log(` Registry: ${chalk.cyan(REGISTRY_FULL)}`);
276
+ console.log('');
277
+ }
278
+ catch (err) {
279
+ spin.stop('GitHub connection failed');
280
+ const message = err instanceof Error ? err.message : String(err);
281
+ log.error(message);
282
+ outro('Publish cancelled');
283
+ process.exit(1);
284
+ }
285
+ // Step 5: Fork
286
+ spin.start('Setting up fork…');
287
+ try {
288
+ await ensureFork(token, user);
289
+ spin.stop('Fork ready ✓');
290
+ }
291
+ catch (err) {
292
+ spin.stop('Fork failed');
293
+ const message = err instanceof Error ? err.message : String(err);
294
+ log.error(message);
295
+ outro('Publish cancelled');
296
+ process.exit(1);
297
+ }
298
+ // Step 6: Create branch
299
+ const branchName = `skill/${skill.name.replace(/[^a-zA-Z0-9_-]/g, '-').toLowerCase()}`;
300
+ spin.start(`Creating branch ${chalk.cyan(branchName)}…`);
301
+ try {
302
+ const branchRes = await ghFetch(`${GITHUB_API}/repos/${user}/${REGISTRY_REPO}/git/refs`, token, {
303
+ method: 'POST',
304
+ body: JSON.stringify({
305
+ ref: `refs/heads/${branchName}`,
306
+ sha: baseSha,
307
+ }),
308
+ });
309
+ if (branchRes.status === 422) {
310
+ log.info(`Branch ${branchName} already exists — updating it`);
311
+ }
312
+ else if (!branchRes.ok) {
313
+ throw new Error(`Failed to create branch: ${branchRes.status}`);
314
+ }
315
+ spin.stop('Branch ready ✓');
316
+ }
317
+ catch (err) {
318
+ spin.stop('Branch creation failed');
319
+ const message = err instanceof Error ? err.message : String(err);
320
+ log.error(message);
321
+ outro('Publish cancelled');
322
+ process.exit(1);
323
+ }
324
+ // Step 7: Upload files
325
+ const skillDirName = skill.name.replace(/[^a-zA-Z0-9_-]/g, '-').toLowerCase();
326
+ const skillRepoPath = `skills/${skillDirName}/SKILL.md`;
327
+ spin.start('Uploading SKILL.md…');
328
+ try {
329
+ await upsertFile(token, user, branchName, skillRepoPath, rawContent, `Add ${skill.name} v${frontmatter.version || '1.0.0'} skill`);
330
+ spin.stop('SKILL.md uploaded ✓');
331
+ }
332
+ catch (err) {
333
+ spin.stop('Upload failed');
334
+ const message = err instanceof Error ? err.message : String(err);
335
+ log.error(message);
336
+ outro('Publish cancelled');
337
+ process.exit(1);
338
+ }
339
+ // Upload extra files if any (scripts, assets, references, etc.)
340
+ const extraDirNames = ['scripts', 'assets', 'references'];
341
+ for (const dirName of extraDirNames) {
342
+ const dirPath = join(skillDirPath, dirName);
343
+ if (existsSync(dirPath) && statSync(dirPath).isDirectory()) {
344
+ spin.start(`Uploading ${dirName}/…`);
345
+ try {
346
+ const entries = readdirSync(dirPath);
347
+ for (const entry of entries) {
348
+ const entryPath = join(dirPath, entry);
349
+ if (statSync(entryPath).isFile()) {
350
+ const content = readFileSync(entryPath, 'utf-8');
351
+ const repoEntryPath = `skills/${skillDirName}/${dirName}/${entry}`;
352
+ await upsertFile(token, user, branchName, repoEntryPath, content, `Add ${dirName}/${entry}`);
353
+ }
354
+ }
355
+ spin.stop(`${dirName}/ uploaded ✓`);
356
+ }
357
+ catch (err) {
358
+ spin.stop(`${dirName}/ upload issue`);
359
+ const message = err instanceof Error ? err.message : String(err);
360
+ log.warn(`Failed to upload ${dirName}/: ${message}`);
361
+ }
362
+ }
363
+ }
364
+ // Step 8: Update registry.json
365
+ spin.start('Updating registry index…');
366
+ try {
367
+ // Fetch current registry.json from the branch (or upstream)
368
+ const currentRegRes = await ghFetch(`${GITHUB_API}/repos/${user}/${REGISTRY_REPO}/contents/registry.json?ref=${branchName}`, token);
369
+ let registry;
370
+ if (currentRegRes.ok) {
371
+ const currentData = await currentRegRes.json();
372
+ const decoded = Buffer.from(currentData.content, 'base64').toString('utf-8');
373
+ registry = JSON.parse(decoded);
374
+ }
375
+ else {
376
+ // Fallback: fetch from upstream
377
+ const upRes = await ghFetch(`https://raw.githubusercontent.com/${REGISTRY_FULL}/main/registry.json`, token, { headers: { 'User-Agent': 'transskill-cli' } });
378
+ if (!upRes.ok)
379
+ throw new Error('Failed to fetch registry.json');
380
+ registry = await upRes.json();
381
+ }
382
+ // Update or add the skill entry
383
+ const existingIdx = registry.skills.findIndex((s) => s.name === skill.name);
384
+ const skillEntry = {
385
+ name: skill.name,
386
+ version: frontmatter.version || '1.0.0',
387
+ description: skill.description,
388
+ tags: frontmatter.tags || [],
389
+ author: user,
390
+ stars: existingIdx >= 0 ? registry.skills[existingIdx].stars : 0,
391
+ auditScore: score,
392
+ created: existingIdx >= 0
393
+ ? registry.skills[existingIdx].created
394
+ : new Date().toISOString(),
395
+ };
396
+ if (existingIdx >= 0) {
397
+ registry.skills[existingIdx] = { ...registry.skills[existingIdx], ...skillEntry };
398
+ }
399
+ else {
400
+ registry.skills.push(skillEntry);
401
+ }
402
+ registry.updated = new Date().toISOString();
403
+ const registryJson = JSON.stringify(registry, null, 2);
404
+ await upsertFile(token, user, branchName, 'registry.json', registryJson, `Update registry index: add ${skill.name}`);
405
+ spin.stop('Registry index updated ✓');
406
+ }
407
+ catch (err) {
408
+ spin.stop('Registry update failed');
409
+ const message = err instanceof Error ? err.message : String(err);
410
+ log.error(message);
411
+ outro('Publish cancelled');
412
+ process.exit(1);
413
+ }
414
+ // Step 9: Create PR
415
+ spin.start('Creating pull request…');
416
+ try {
417
+ const prBody = [
418
+ `## 📦 ${skill.name}`,
419
+ '',
420
+ `${skill.description}`,
421
+ '',
422
+ '---',
423
+ '',
424
+ '### Audit Report',
425
+ '',
426
+ `- **Audit Score:** ${score}/100`,
427
+ `- **Author:** ${user}`,
428
+ ...(Array.isArray(frontmatter.tags)
429
+ ? [`- **Tags:** ${frontmatter.tags.join(', ')}`]
430
+ : []),
431
+ '',
432
+ '---',
433
+ '',
434
+ '> Published by [TransSkill CLI](https://github.com/ljk-777/transskill)',
435
+ ].join('\n');
436
+ const prUrl = await createPR(token, user, branchName, `Add skill: ${skill.name} v${frontmatter.version || '1.0.0'}`, prBody);
437
+ spin.stop('Pull request created ✓');
438
+ console.log('');
439
+ console.log(` ${chalk.green('→')} ${prUrl}`);
440
+ console.log('');
441
+ outro(`${chalk.bold(skill.name)} published! 🎉`);
442
+ }
443
+ catch (err) {
444
+ spin.stop('PR creation failed');
445
+ const message = err instanceof Error ? err.message : String(err);
446
+ log.error(message);
447
+ outro('Publish failed — files were pushed to the branch but PR could not be created.');
448
+ process.exit(1);
449
+ }
450
+ }
451
+ /**
452
+ * Calculate audit score from report severity counts.
453
+ */
454
+ function calculateScore(report) {
455
+ const c = report.severityCounts;
456
+ let score = 100;
457
+ score -= c.critical * 30; // -30 each
458
+ score -= c.high * 15; // -15 each
459
+ score -= c.medium * 5; // -5 each
460
+ score -= c.low * 2; // -2 each
461
+ return Math.max(0, score);
462
+ }
463
+ function formatScore(score) {
464
+ if (score >= 90)
465
+ return chalk.green(`${score}/100`);
466
+ if (score >= 70)
467
+ return chalk.yellow(`${score}/100`);
468
+ return chalk.red(`${score}/100`);
469
+ }
470
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/marketplace/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { RegistryIndex, SkillManifest, SkillDetail } from './types.js';
2
+ /**
3
+ * Get the registry index, from cache if fresh, otherwise from remote.
4
+ */
5
+ export declare function getRegistry(forceRefresh?: boolean): Promise<RegistryIndex>;
6
+ /**
7
+ * Simple fuzzy search across skill name, description, and tags.
8
+ */
9
+ export declare function searchSkills(registry: RegistryIndex, query: string): SkillManifest[];
10
+ /**
11
+ * Find a single skill by name.
12
+ */
13
+ export declare function findSkill(registry: RegistryIndex, name: string): SkillManifest | undefined;
14
+ /**
15
+ * Get full skill detail including README content and download URL.
16
+ */
17
+ export declare function getSkillDetail(manifest: SkillManifest): Promise<SkillDetail>;
18
+ //# sourceMappingURL=registry-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-client.d.ts","sourceRoot":"","sources":["../../src/marketplace/registry-client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA4C5E;;GAEG;AACH,wBAAsB,WAAW,CAAC,YAAY,UAAQ,GAAG,OAAO,CAAC,aAAa,CAAC,CAS9E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAQpF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAE1F;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,WAAW,CAAC,CAWlF"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Registry client — fetches, caches, and searches skill registry.
3
+ */
4
+ import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'node:fs';
5
+ import { join } from 'node:path';
6
+ import { homedir } from 'node:os';
7
+ const REGISTRY_URL = 'https://raw.githubusercontent.com/ljk-777/transskill-registry/main/registry.json';
8
+ const RAW_SKILL_PREFIX = 'https://raw.githubusercontent.com/ljk-777/transskill-registry/main/skills';
9
+ const CACHE_DIR = join(homedir(), '.transskill', 'cache');
10
+ const CACHE_FILE = join(CACHE_DIR, 'registry.json');
11
+ const CACHE_TTL_MS = 24 * 60 * 60 * 1000; // 24 hours
12
+ function ensureCacheDir() {
13
+ if (!existsSync(CACHE_DIR)) {
14
+ mkdirSync(CACHE_DIR, { recursive: true });
15
+ }
16
+ }
17
+ function isCacheFresh() {
18
+ if (!existsSync(CACHE_FILE))
19
+ return false;
20
+ const mtime = readFileSync(CACHE_FILE, 'utf-8').split('\n')[0];
21
+ const cachedAt = new Date(mtime).getTime();
22
+ return Date.now() - cachedAt < CACHE_TTL_MS;
23
+ }
24
+ function readCache() {
25
+ if (!isCacheFresh())
26
+ return null;
27
+ try {
28
+ const raw = readFileSync(CACHE_FILE, 'utf-8');
29
+ // First line is timestamp, rest is JSON
30
+ const json = raw.slice(raw.indexOf('\n') + 1);
31
+ return JSON.parse(json);
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ }
37
+ function writeCache(index) {
38
+ ensureCacheDir();
39
+ writeFileSync(CACHE_FILE, `${new Date().toISOString()}\n${JSON.stringify(index)}`, 'utf-8');
40
+ }
41
+ async function fetchRemote() {
42
+ const res = await fetch(REGISTRY_URL);
43
+ if (!res.ok)
44
+ throw new Error(`Failed to fetch registry: ${res.status} ${res.statusText}`);
45
+ return (await res.json());
46
+ }
47
+ /**
48
+ * Get the registry index, from cache if fresh, otherwise from remote.
49
+ */
50
+ export async function getRegistry(forceRefresh = false) {
51
+ if (!forceRefresh) {
52
+ const cached = readCache();
53
+ if (cached)
54
+ return cached;
55
+ }
56
+ const remote = await fetchRemote();
57
+ writeCache(remote);
58
+ return remote;
59
+ }
60
+ /**
61
+ * Simple fuzzy search across skill name, description, and tags.
62
+ */
63
+ export function searchSkills(registry, query) {
64
+ const q = query.toLowerCase();
65
+ return registry.skills.filter((s) => {
66
+ if (s.name.toLowerCase().includes(q))
67
+ return true;
68
+ if (s.description.toLowerCase().includes(q))
69
+ return true;
70
+ if (s.tags.some((t) => t.toLowerCase().includes(q)))
71
+ return true;
72
+ return false;
73
+ });
74
+ }
75
+ /**
76
+ * Find a single skill by name.
77
+ */
78
+ export function findSkill(registry, name) {
79
+ return registry.skills.find((s) => s.name === name);
80
+ }
81
+ /**
82
+ * Get full skill detail including README content and download URL.
83
+ */
84
+ export async function getSkillDetail(manifest) {
85
+ const downloadUrl = `${RAW_SKILL_PREFIX}/${manifest.name}/SKILL.md`;
86
+ const res = await fetch(downloadUrl);
87
+ if (!res.ok)
88
+ throw new Error(`Failed to fetch skill: ${res.status} ${res.statusText}`);
89
+ const readme = await res.text();
90
+ return {
91
+ ...manifest,
92
+ readme,
93
+ downloadUrl,
94
+ };
95
+ }
96
+ //# sourceMappingURL=registry-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-client.js","sourceRoot":"","sources":["../../src/marketplace/registry-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Interactive search TUI — search and browse skills from the registry.
3
+ */
4
+ /**
5
+ * Launch interactive search TUI.
6
+ */
7
+ export declare function interactiveSearch(options: {
8
+ query?: string;
9
+ tag?: string;
10
+ refresh?: boolean;
11
+ }): Promise<void>;
12
+ /**
13
+ * Non-interactive search — output JSON.
14
+ */
15
+ export declare function jsonSearch(options: {
16
+ query?: string;
17
+ tag?: string;
18
+ refresh?: boolean;
19
+ }): Promise<void>;
20
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/marketplace/search.ts"],"names":[],"mappings":"AAAA;;GAEG;AA4CH;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDhB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhB"}