skillli 0.1.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 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/core/constants.ts","../../src/cli/commands/init.ts","../../src/cli/utils/prompts.ts","../../src/cli/commands/search.ts","../../src/core/search.ts","../../src/core/local-store.ts","../../src/cli/utils/display.ts","../../src/cli/commands/install.ts","../../src/core/installer.ts","../../src/core/errors.ts","../../src/core/registry.ts","../../src/core/parser.ts","../../src/core/schema.ts","../../src/core/safeguards.ts","../../src/cli/commands/uninstall.ts","../../src/cli/commands/info.ts","../../src/cli/commands/list.ts","../../src/cli/commands/rate.ts","../../src/core/ratings.ts","../../src/cli/commands/update.ts","../../src/cli/commands/publish.ts","../../src/core/publisher.ts","../../src/cli/commands/trawl.ts","../../src/trawler/strategies.ts","../../src/trawler/ranker.ts","../../src/trawler/index.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { VERSION } from '../core/constants.js';\nimport { registerInitCommand } from './commands/init.js';\nimport { registerSearchCommand } from './commands/search.js';\nimport { registerInstallCommand } from './commands/install.js';\nimport { registerUninstallCommand } from './commands/uninstall.js';\nimport { registerInfoCommand } from './commands/info.js';\nimport { registerListCommand } from './commands/list.js';\nimport { registerRateCommand } from './commands/rate.js';\nimport { registerUpdateCommand } from './commands/update.js';\nimport { registerPublishCommand } from './commands/publish.js';\nimport { registerTrawlCommand } from './commands/trawl.js';\n\nconst program = new Command();\n\nprogram\n .name('skillli')\n .description('Discover, publish, rate, and use agentic AI skills packages')\n .version(VERSION);\n\nregisterInitCommand(program);\nregisterSearchCommand(program);\nregisterInstallCommand(program);\nregisterUninstallCommand(program);\nregisterInfoCommand(program);\nregisterListCommand(program);\nregisterRateCommand(program);\nregisterUpdateCommand(program);\nregisterPublishCommand(program);\nregisterTrawlCommand(program);\n\nprogram.parse();\n","import { homedir } from 'os';\nimport { join } from 'path';\n\nexport const SKILLLI_DIR = join(homedir(), '.skillli');\nexport const LOCAL_INDEX_PATH = join(SKILLLI_DIR, 'index.json');\nexport const CONFIG_PATH = join(SKILLLI_DIR, 'config.json');\nexport const SKILLS_DIR = join(SKILLLI_DIR, 'skills');\nexport const CACHE_DIR = join(SKILLLI_DIR, 'cache');\n\nexport const DEFAULT_REGISTRY_URL =\n 'https://raw.githubusercontent.com/skillli/registry/main/index.json';\nexport const DEFAULT_RATINGS_URL =\n 'https://raw.githubusercontent.com/skillli/registry/main/ratings/';\n\nexport const SKILL_FILENAME = 'SKILL.md';\nexport const MANIFEST_FILENAME = 'skillli.json';\nexport const MAX_SKILL_SIZE_BYTES = 5 * 1024 * 1024; // 5MB\nexport const MAX_SKILL_MD_LINES = 500;\n\nexport const VERSION = '0.1.0';\n","import { Command } from 'commander';\nimport { mkdir, writeFile } from 'fs/promises';\nimport { join } from 'path';\nimport { existsSync } from 'fs';\nimport chalk from 'chalk';\nimport { promptInit } from '../utils/prompts.js';\n\nconst SKILL_TEMPLATE = (answers: {\n name: string;\n version: string;\n description: string;\n author: string;\n license: string;\n tags: string[];\n category: string;\n}) => `---\nname: ${answers.name}\nversion: ${answers.version}\ndescription: ${answers.description}\nauthor: ${answers.author}\nlicense: ${answers.license}\ntags: [${answers.tags.join(', ')}]\ncategory: ${answers.category}\ntrust-level: community\nuser-invocable: true\n---\n\n# ${answers.name}\n\n${answers.description}\n\n## When to Use\n\nDescribe when this skill should be invoked.\n\n## Instructions\n\nDescribe what the AI should do when this skill is activated.\n\n## Examples\n\nProvide example inputs and expected behavior.\n`;\n\nexport function registerInitCommand(program: Command): void {\n program\n .command('init [name]')\n .description('Create a new skill from template')\n .option('-d, --dir <path>', 'Output directory', '.')\n .action(async (name: string | undefined, options: { dir: string }) => {\n try {\n const answers = await promptInit({ name });\n const tags = answers.tags.split(',').map((t) => t.trim()).filter(Boolean);\n const outputDir = join(options.dir, answers.name);\n\n if (existsSync(outputDir)) {\n console.log(chalk.red(`Directory ${outputDir} already exists.`));\n process.exit(1);\n }\n\n await mkdir(outputDir, { recursive: true });\n await mkdir(join(outputDir, 'scripts'), { recursive: true });\n await mkdir(join(outputDir, 'references'), { recursive: true });\n\n const content = SKILL_TEMPLATE({ ...answers, tags });\n await writeFile(join(outputDir, 'SKILL.md'), content);\n\n const manifest = {\n name: answers.name,\n version: answers.version,\n description: answers.description,\n author: answers.author,\n license: answers.license,\n tags,\n category: answers.category,\n };\n await writeFile(join(outputDir, 'skillli.json'), JSON.stringify(manifest, null, 2));\n\n console.log(chalk.green(`\\nSkill \"${answers.name}\" created at ${outputDir}`));\n console.log(chalk.gray(' Edit SKILL.md to add your skill instructions.'));\n console.log(chalk.gray(' Run `skillli publish` when ready to share.\\n'));\n } catch (error) {\n console.error(chalk.red('Error:'), error);\n process.exit(1);\n }\n });\n}\n","import inquirer from 'inquirer';\nimport type { SkillCategory } from '../../core/types.js';\n\nexport interface InitAnswers {\n name: string;\n version: string;\n description: string;\n author: string;\n license: string;\n tags: string;\n category: SkillCategory;\n}\n\nexport async function promptInit(defaults?: Partial<InitAnswers>): Promise<InitAnswers> {\n return inquirer.prompt([\n {\n type: 'input',\n name: 'name',\n message: 'Skill name (lowercase, hyphens):',\n default: defaults?.name,\n validate: (v: string) => /^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(v) || 'Must be lowercase alphanumeric with hyphens',\n },\n {\n type: 'input',\n name: 'version',\n message: 'Version:',\n default: defaults?.version ?? '1.0.0',\n },\n {\n type: 'input',\n name: 'description',\n message: 'Description (10-500 chars):',\n default: defaults?.description,\n validate: (v: string) => (v.length >= 10 && v.length <= 500) || 'Must be 10-500 characters',\n },\n {\n type: 'input',\n name: 'author',\n message: 'Author (GitHub username):',\n default: defaults?.author,\n },\n {\n type: 'input',\n name: 'license',\n message: 'License:',\n default: defaults?.license ?? 'MIT',\n },\n {\n type: 'input',\n name: 'tags',\n message: 'Tags (comma-separated):',\n default: defaults?.tags,\n },\n {\n type: 'list',\n name: 'category',\n message: 'Category:',\n choices: ['development', 'creative', 'enterprise', 'data', 'devops', 'other'],\n default: defaults?.category ?? 'other',\n },\n ]) as Promise<InitAnswers>;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { search } from '../../core/search.js';\nimport { getLocalIndex } from '../../core/local-store.js';\nimport { displaySearchResults } from '../utils/display.js';\nimport type { SkillCategory, TrustLevel } from '../../core/types.js';\n\nexport function registerSearchCommand(program: Command): void {\n program\n .command('search <query>')\n .description('Search for skills in the registry')\n .option('-t, --tag <tags...>', 'Filter by tags')\n .option('-c, --category <category>', 'Filter by category')\n .option('--trust <level>', 'Filter by trust level')\n .option('--min-rating <n>', 'Minimum rating', parseFloat)\n .option('-l, --limit <n>', 'Max results', parseInt)\n .action(\n async (\n query: string,\n options: {\n tag?: string[];\n category?: string;\n trust?: string;\n minRating?: number;\n limit?: number;\n },\n ) => {\n const spinner = ora('Searching skills...').start();\n try {\n const index = await getLocalIndex();\n const results = search(index, {\n query,\n tags: options.tag,\n category: options.category as SkillCategory | undefined,\n trustLevel: options.trust as TrustLevel | undefined,\n minRating: options.minRating,\n limit: options.limit,\n });\n spinner.stop();\n displaySearchResults(results);\n } catch (error) {\n spinner.fail('Search failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n },\n );\n}\n","import type {\n LocalIndex,\n RegistryEntry,\n SearchOptions,\n SearchResult,\n SkillCategory,\n} from './types.js';\n\nfunction tokenize(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[\\s\\-_,./]+/)\n .filter((t) => t.length > 1);\n}\n\nfunction textScore(tokens: string[], text: string): number {\n const lower = text.toLowerCase();\n let score = 0;\n for (const token of tokens) {\n if (lower.includes(token)) score += 1;\n }\n return score;\n}\n\nfunction scoreSkill(\n entry: RegistryEntry,\n queryTokens: string[],\n options: SearchOptions,\n): { score: number; matchedOn: SearchResult['matchedOn'] } {\n let score = 0;\n const matchedOn: SearchResult['matchedOn'] = [];\n\n // Name match (highest weight)\n const nameScore = textScore(queryTokens, entry.name);\n if (nameScore > 0) {\n score += nameScore * 5;\n matchedOn.push('name');\n }\n\n // Exact name match bonus\n if (entry.name === options.query.toLowerCase()) {\n score += 10;\n }\n\n // Description match\n const descScore = textScore(queryTokens, entry.description);\n if (descScore > 0) {\n score += descScore * 2;\n matchedOn.push('description');\n }\n\n // Tag match (very high weight)\n for (const token of queryTokens) {\n if (entry.tags.some((t) => t.toLowerCase() === token)) {\n score += 4;\n if (!matchedOn.includes('tags')) matchedOn.push('tags');\n }\n }\n\n // Filter-matched tags from options\n if (options.tags) {\n for (const tag of options.tags) {\n if (entry.tags.includes(tag)) {\n score += 3;\n if (!matchedOn.includes('tags')) matchedOn.push('tags');\n }\n }\n }\n\n // Category match\n if (options.category && entry.category === options.category) {\n score += 2;\n matchedOn.push('category');\n }\n\n // Only apply boosts if there's at least one text/tag/category match\n if (matchedOn.length > 0) {\n // Trust level boost\n if (entry.trustLevel === 'official') score += 3;\n if (entry.trustLevel === 'verified') score += 1.5;\n\n // Rating boost\n score += entry.rating.average * 0.5;\n\n // Download boost (log scale)\n if (entry.downloads > 0) {\n score += Math.log10(entry.downloads) * 0.5;\n }\n }\n\n return { score, matchedOn };\n}\n\nexport function search(index: LocalIndex, options: SearchOptions): SearchResult[] {\n const queryTokens = tokenize(options.query);\n const results: SearchResult[] = [];\n\n for (const entry of Object.values(index.skills)) {\n // Pre-filter by category\n if (options.category && entry.category !== options.category) continue;\n\n // Pre-filter by trust level\n if (options.trustLevel && entry.trustLevel !== options.trustLevel) continue;\n\n // Pre-filter by minimum rating\n if (options.minRating && entry.rating.average < options.minRating) continue;\n\n const { score, matchedOn } = scoreSkill(entry, queryTokens, options);\n\n if (score > 0) {\n results.push({ skill: entry, relevanceScore: score, matchedOn });\n }\n }\n\n // Sort by relevance (descending)\n results.sort((a, b) => b.relevanceScore - a.relevanceScore);\n\n // Apply offset and limit\n const offset = options.offset ?? 0;\n const limit = options.limit ?? 20;\n return results.slice(offset, offset + limit);\n}\n\nexport function searchByTags(index: LocalIndex, tags: string[]): SearchResult[] {\n return search(index, { query: tags.join(' '), tags });\n}\n\nexport function searchByCategory(index: LocalIndex, category: SkillCategory): SearchResult[] {\n return search(index, { query: '', category });\n}\n","import { mkdir, readFile, writeFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport {\n SKILLLI_DIR,\n LOCAL_INDEX_PATH,\n CONFIG_PATH,\n SKILLS_DIR,\n CACHE_DIR,\n DEFAULT_REGISTRY_URL,\n} from './constants.js';\nimport type { LocalIndex, LocalConfig, InstalledSkill } from './types.js';\n\nexport async function ensureDir(): Promise<void> {\n for (const dir of [SKILLLI_DIR, SKILLS_DIR, CACHE_DIR]) {\n if (!existsSync(dir)) {\n await mkdir(dir, { recursive: true });\n }\n }\n}\n\nfunction defaultConfig(): LocalConfig {\n return {\n installedSkills: {},\n registryUrl: DEFAULT_REGISTRY_URL,\n lastSync: '',\n };\n}\n\nfunction defaultIndex(): LocalIndex {\n return {\n version: '1.0.0',\n lastUpdated: '',\n skills: {},\n };\n}\n\nexport async function getConfig(): Promise<LocalConfig> {\n await ensureDir();\n if (!existsSync(CONFIG_PATH)) {\n const config = defaultConfig();\n await saveConfig(config);\n return config;\n }\n const raw = await readFile(CONFIG_PATH, 'utf-8');\n return JSON.parse(raw) as LocalConfig;\n}\n\nexport async function saveConfig(config: LocalConfig): Promise<void> {\n await ensureDir();\n await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2));\n}\n\nexport async function getLocalIndex(): Promise<LocalIndex> {\n await ensureDir();\n if (!existsSync(LOCAL_INDEX_PATH)) {\n const index = defaultIndex();\n await saveLocalIndex(index);\n return index;\n }\n const raw = await readFile(LOCAL_INDEX_PATH, 'utf-8');\n return JSON.parse(raw) as LocalIndex;\n}\n\nexport async function saveLocalIndex(index: LocalIndex): Promise<void> {\n await ensureDir();\n await writeFile(LOCAL_INDEX_PATH, JSON.stringify(index, null, 2));\n}\n\nexport async function getInstalledSkills(): Promise<InstalledSkill[]> {\n const config = await getConfig();\n return Object.values(config.installedSkills);\n}\n\nexport async function markInstalled(skill: InstalledSkill): Promise<void> {\n const config = await getConfig();\n config.installedSkills[skill.name] = skill;\n await saveConfig(config);\n}\n\nexport async function markUninstalled(name: string): Promise<void> {\n const config = await getConfig();\n delete config.installedSkills[name];\n await saveConfig(config);\n}\n","import chalk from 'chalk';\nimport type { SearchResult, RegistryEntry, SafeguardResult, InstalledSkill, RatingInfo } from '../../core/types.js';\n\nexport function trustBadge(level: string): string {\n switch (level) {\n case 'official':\n return chalk.green.bold('[OFFICIAL]');\n case 'verified':\n return chalk.blue.bold('[VERIFIED]');\n default:\n return chalk.gray('[COMMUNITY]');\n }\n}\n\nexport function stars(rating: RatingInfo): string {\n const filled = Math.round(rating.average);\n const empty = 5 - filled;\n return chalk.yellow('\\u2605'.repeat(filled)) + chalk.gray('\\u2606'.repeat(empty));\n}\n\nexport function displaySearchResults(results: SearchResult[]): void {\n if (results.length === 0) {\n console.log(chalk.yellow('No skills found matching your query.'));\n return;\n }\n\n console.log(chalk.bold(`\\nFound ${results.length} skill(s):\\n`));\n\n for (const { skill, relevanceScore, matchedOn } of results) {\n const badge = trustBadge(skill.trustLevel);\n const rating = stars(skill.rating);\n console.log(\n ` ${chalk.cyan.bold(skill.name)} ${chalk.gray('v' + skill.version)} ${badge}`,\n );\n console.log(` ${skill.description}`);\n console.log(\n ` ${rating} ${chalk.gray(`| ${skill.downloads} downloads | by ${skill.author}`)}`,\n );\n console.log(\n ` ${chalk.gray('Tags:')} ${skill.tags.map((t) => chalk.magenta(t)).join(', ')}`,\n );\n console.log();\n }\n}\n\nexport function displaySkillInfo(skill: RegistryEntry): void {\n console.log(chalk.bold.cyan(`\\n ${skill.name}`) + chalk.gray(` v${skill.version}`));\n console.log(` ${trustBadge(skill.trustLevel)}\\n`);\n console.log(` ${skill.description}\\n`);\n console.log(` ${chalk.bold('Author:')} ${skill.author}`);\n console.log(` ${chalk.bold('Category:')} ${skill.category}`);\n console.log(` ${chalk.bold('Tags:')} ${skill.tags.join(', ')}`);\n console.log(` ${chalk.bold('Rating:')} ${stars(skill.rating)} (${skill.rating.count} ratings)`);\n console.log(` ${chalk.bold('Downloads:')} ${skill.downloads}`);\n if (skill.repository) {\n console.log(` ${chalk.bold('Repository:')} ${skill.repository}`);\n }\n console.log(` ${chalk.bold('Published:')} ${skill.publishedAt}`);\n console.log(` ${chalk.bold('Updated:')} ${skill.updatedAt}`);\n console.log();\n}\n\nexport function displayTrustScore(score: number): void {\n let color: typeof chalk.green;\n if (score >= 70) color = chalk.green;\n else if (score >= 40) color = chalk.yellow;\n else color = chalk.red;\n\n const bar = '\\u2588'.repeat(Math.round(score / 5)) + chalk.gray('\\u2591'.repeat(20 - Math.round(score / 5)));\n console.log(` Trust Score: ${color.bold(score.toString())} / 100 ${bar}`);\n}\n\nexport function displaySafeguardReport(result: SafeguardResult): void {\n console.log(chalk.bold('\\nSafeguard Report:'));\n for (const check of result.checks) {\n const icon = check.passed ? chalk.green('\\u2713') : check.severity === 'error' ? chalk.red('\\u2717') : chalk.yellow('\\u26A0');\n console.log(` ${icon} ${check.name}: ${check.message}`);\n }\n displayTrustScore(result.score);\n console.log();\n}\n\nexport function displayInstalledSkills(skills: InstalledSkill[]): void {\n if (skills.length === 0) {\n console.log(chalk.yellow('No skills installed.'));\n return;\n }\n console.log(chalk.bold(`\\nInstalled skills (${skills.length}):\\n`));\n for (const skill of skills) {\n console.log(\n ` ${chalk.cyan.bold(skill.name)} ${chalk.gray('v' + skill.version)} ${chalk.gray(`(${skill.source})`)}`,\n );\n console.log(` Installed: ${skill.installedAt}`);\n console.log(` Path: ${skill.path}`);\n console.log();\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { installFromRegistry, installFromGithub, installFromLocal, linkToClaudeSkills } from '../../core/installer.js';\nimport { displayTrustScore } from '../utils/display.js';\n\nexport function registerInstallCommand(program: Command): void {\n program\n .command('install <skill>')\n .description('Install a skill from the registry, GitHub URL, or local path')\n .option('--link', 'Symlink to .claude/skills/ for Claude Code', false)\n .option('--local', 'Install from a local directory')\n .action(\n async (\n skill: string,\n options: { link: boolean; local: boolean },\n ) => {\n const spinner = ora(`Installing ${skill}...`).start();\n try {\n let installed;\n if (options.local) {\n installed = await installFromLocal(skill);\n } else if (skill.startsWith('http') || skill.includes('github.com')) {\n installed = await installFromGithub(skill);\n } else {\n installed = await installFromRegistry(skill);\n }\n spinner.succeed(`Installed ${chalk.cyan(installed.name)} v${installed.version}`);\n console.log(` Path: ${installed.path}`);\n\n if (options.link) {\n const linkPath = await linkToClaudeSkills(installed);\n console.log(` Linked to: ${linkPath}`);\n }\n } catch (error) {\n spinner.fail('Installation failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n },\n );\n}\n","import { mkdir, rm, symlink, readFile, writeFile } from 'fs/promises';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport { execSync } from 'child_process';\nimport { SKILLS_DIR, SKILL_FILENAME } from './constants.js';\nimport { InstallError } from './errors.js';\nimport { getSkillEntry } from './registry.js';\nimport { parseSkillFile } from './parser.js';\nimport { runSafeguards } from './safeguards.js';\nimport { markInstalled, markUninstalled } from './local-store.js';\nimport type { InstalledSkill } from './types.js';\n\nexport async function installFromRegistry(\n name: string,\n version?: string,\n): Promise<InstalledSkill> {\n const entry = await getSkillEntry(name);\n if (!entry.repository) {\n throw new InstallError(`Skill \"${name}\" has no repository URL`);\n }\n return installFromGithub(entry.repository, name);\n}\n\nexport async function installFromGithub(\n repoUrl: string,\n nameOverride?: string,\n): Promise<InstalledSkill> {\n const name = nameOverride ?? repoUrl.split('/').pop()?.replace(/\\.git$/, '') ?? 'unknown';\n const installPath = join(SKILLS_DIR, name);\n\n if (existsSync(installPath)) {\n await rm(installPath, { recursive: true });\n }\n await mkdir(installPath, { recursive: true });\n\n try {\n execSync(`git clone --depth 1 \"${repoUrl}\" \"${installPath}\"`, {\n stdio: 'pipe',\n timeout: 30000,\n });\n } catch {\n throw new InstallError(`Failed to clone ${repoUrl}`);\n }\n\n // Validate installed skill\n const skillFile = join(installPath, SKILL_FILENAME);\n if (!existsSync(skillFile)) {\n await rm(installPath, { recursive: true });\n throw new InstallError(`No ${SKILL_FILENAME} found in ${repoUrl}`);\n }\n\n const skill = await parseSkillFile(skillFile);\n const safeguards = await runSafeguards(skill, installPath);\n if (!safeguards.passed) {\n await rm(installPath, { recursive: true });\n const errors = safeguards.checks\n .filter((c) => !c.passed)\n .map((c) => c.message);\n throw new InstallError(`Skill failed safety checks: ${errors.join('; ')}`);\n }\n\n const installed: InstalledSkill = {\n name: skill.metadata.name,\n version: skill.metadata.version,\n installedAt: new Date().toISOString(),\n path: installPath,\n source: 'github',\n };\n await markInstalled(installed);\n return installed;\n}\n\nexport async function installFromLocal(dirPath: string): Promise<InstalledSkill> {\n const skillFile = join(dirPath, SKILL_FILENAME);\n if (!existsSync(skillFile)) {\n throw new InstallError(`No ${SKILL_FILENAME} found in ${dirPath}`);\n }\n\n const skill = await parseSkillFile(skillFile);\n const safeguards = await runSafeguards(skill, dirPath);\n if (!safeguards.passed) {\n const errors = safeguards.checks\n .filter((c) => !c.passed)\n .map((c) => c.message);\n throw new InstallError(`Skill failed safety checks: ${errors.join('; ')}`);\n }\n\n const installPath = join(SKILLS_DIR, skill.metadata.name);\n if (existsSync(installPath)) {\n await rm(installPath, { recursive: true });\n }\n\n // Copy the directory\n execSync(`cp -r \"${dirPath}\" \"${installPath}\"`, { stdio: 'pipe' });\n\n const installed: InstalledSkill = {\n name: skill.metadata.name,\n version: skill.metadata.version,\n installedAt: new Date().toISOString(),\n path: installPath,\n source: 'local',\n };\n await markInstalled(installed);\n return installed;\n}\n\nexport async function uninstall(name: string): Promise<void> {\n const installPath = join(SKILLS_DIR, name);\n if (existsSync(installPath)) {\n await rm(installPath, { recursive: true });\n }\n await markUninstalled(name);\n}\n\nexport async function linkToClaudeSkills(\n skill: InstalledSkill,\n projectDir = process.cwd(),\n): Promise<string> {\n const claudeSkillsDir = join(projectDir, '.claude', 'skills');\n await mkdir(claudeSkillsDir, { recursive: true });\n\n const linkPath = join(claudeSkillsDir, skill.name);\n if (existsSync(linkPath)) {\n await rm(linkPath, { recursive: true });\n }\n await symlink(skill.path, linkPath, 'dir');\n return linkPath;\n}\n","export class SkillliError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SkillliError';\n }\n}\n\nexport class SkillValidationError extends SkillliError {\n public details: string[];\n\n constructor(message: string, details: string[] = []) {\n super(message);\n this.name = 'SkillValidationError';\n this.details = details;\n }\n}\n\nexport class SkillNotFoundError extends SkillliError {\n constructor(skillName: string) {\n super(`Skill not found: ${skillName}`);\n this.name = 'SkillNotFoundError';\n }\n}\n\nexport class RegistryError extends SkillliError {\n constructor(message: string) {\n super(message);\n this.name = 'RegistryError';\n }\n}\n\nexport class SafeguardError extends SkillliError {\n constructor(message: string) {\n super(message);\n this.name = 'SafeguardError';\n }\n}\n\nexport class InstallError extends SkillliError {\n constructor(message: string) {\n super(message);\n this.name = 'InstallError';\n }\n}\n","import { DEFAULT_REGISTRY_URL } from './constants.js';\nimport { RegistryError, SkillNotFoundError } from './errors.js';\nimport { getConfig, saveLocalIndex, getLocalIndex } from './local-store.js';\nimport type { LocalIndex, RegistryEntry } from './types.js';\n\nexport async function fetchIndex(registryUrl?: string): Promise<LocalIndex> {\n const config = await getConfig();\n const url = registryUrl ?? config.registryUrl ?? DEFAULT_REGISTRY_URL;\n\n try {\n const res = await fetch(url);\n if (!res.ok) {\n throw new RegistryError(`Failed to fetch registry: ${res.status} ${res.statusText}`);\n }\n const index = (await res.json()) as LocalIndex;\n index.lastUpdated = new Date().toISOString();\n await saveLocalIndex(index);\n return index;\n } catch (error) {\n if (error instanceof RegistryError) throw error;\n // Fallback to local index if network fails\n const localIndex = await getLocalIndex();\n if (Object.keys(localIndex.skills).length > 0) {\n return localIndex;\n }\n throw new RegistryError(`Cannot reach registry at ${url}: ${error}`);\n }\n}\n\nexport async function getSkillEntry(name: string): Promise<RegistryEntry> {\n const index = await getLocalIndex();\n const entry = index.skills[name];\n if (!entry) {\n throw new SkillNotFoundError(name);\n }\n return entry;\n}\n\nexport async function syncIndex(): Promise<LocalIndex> {\n return fetchIndex();\n}\n","import { readFile } from 'fs/promises';\nimport matter from 'gray-matter';\nimport { SkillMetadataSchema, type RawSkillMetadata } from './schema.js';\nimport { SkillValidationError } from './errors.js';\nimport type { SkillMetadata, ParsedSkill } from './types.js';\n\nfunction normalizeMetadata(raw: RawSkillMetadata): SkillMetadata {\n return {\n name: raw.name,\n version: raw.version,\n description: raw.description,\n author: raw.author,\n license: raw.license,\n tags: raw.tags,\n category: raw.category,\n repository: raw.repository,\n homepage: raw.homepage,\n minSkillliVersion: raw['min-skillli-version'],\n trustLevel: raw['trust-level'],\n checksum: raw.checksum,\n disableModelInvocation: raw['disable-model-invocation'],\n userInvocable: raw['user-invocable'],\n };\n}\n\nexport function validateMetadata(data: unknown): SkillMetadata {\n const result = SkillMetadataSchema.safeParse(data);\n if (!result.success) {\n const details = result.error.issues.map(\n (issue) => `${issue.path.join('.')}: ${issue.message}`,\n );\n throw new SkillValidationError('Invalid skill metadata', details);\n }\n return normalizeMetadata(result.data);\n}\n\nexport function parseSkillContent(content: string, filePath = '<inline>'): ParsedSkill {\n const { data, content: body, matter: rawFrontmatter } = matter(content);\n const metadata = validateMetadata(data);\n return {\n metadata,\n content: body.trim(),\n rawFrontmatter: rawFrontmatter || '',\n filePath,\n };\n}\n\nexport async function parseSkillFile(filePath: string): Promise<ParsedSkill> {\n const content = await readFile(filePath, 'utf-8');\n return parseSkillContent(content, filePath);\n}\n\nexport function extractManifest(skill: ParsedSkill): Record<string, unknown> {\n const { metadata } = skill;\n return {\n name: metadata.name,\n version: metadata.version,\n description: metadata.description,\n author: metadata.author,\n license: metadata.license,\n tags: metadata.tags,\n category: metadata.category,\n repository: metadata.repository,\n trust_level: metadata.trustLevel,\n checksum: metadata.checksum,\n created_at: new Date().toISOString(),\n updated_at: new Date().toISOString(),\n };\n}\n","import { z } from 'zod';\n\nexport const SkillCategorySchema = z.enum([\n 'development',\n 'creative',\n 'enterprise',\n 'data',\n 'devops',\n 'other',\n]);\n\nexport const TrustLevelSchema = z.enum(['community', 'verified', 'official']);\n\nexport const SkillMetadataSchema = z.object({\n name: z\n .string()\n .min(1)\n .max(100)\n .regex(/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/, 'Must be lowercase alphanumeric with hyphens, not starting/ending with hyphen'),\n version: z.string().regex(/^\\d+\\.\\d+\\.\\d+$/, 'Must be valid semver (e.g. 1.0.0)'),\n description: z.string().min(10).max(500),\n author: z.string().min(1),\n license: z.string().min(1),\n tags: z.array(z.string().min(1).max(50)).min(1).max(20),\n category: SkillCategorySchema,\n repository: z.string().url().optional(),\n homepage: z.string().url().optional(),\n 'min-skillli-version': z.string().optional(),\n 'trust-level': TrustLevelSchema.default('community'),\n checksum: z.string().optional(),\n 'disable-model-invocation': z.boolean().default(false),\n 'user-invocable': z.boolean().default(true),\n});\n\nexport type RawSkillMetadata = z.infer<typeof SkillMetadataSchema>;\n","import { readFile, stat } from 'fs/promises';\nimport { join } from 'path';\nimport { existsSync, readdirSync } from 'fs';\nimport { MAX_SKILL_SIZE_BYTES, MAX_SKILL_MD_LINES } from './constants.js';\nimport type { ParsedSkill, SafeguardResult, SafeguardCheck, RegistryEntry } from './types.js';\n\nconst PROHIBITED_PATTERNS = [\n { pattern: /\\beval\\s*\\(/, label: 'eval()' },\n { pattern: /\\bexec\\s*\\(/, label: 'exec()' },\n { pattern: /\\bexecSync\\s*\\(/, label: 'execSync()' },\n { pattern: /rm\\s+-rf\\s+\\//, label: 'rm -rf /' },\n { pattern: /\\bchild_process\\b/, label: 'child_process' },\n { pattern: /\\bProcess\\.kill\\b/i, label: 'Process.kill' },\n { pattern: /password\\s*[:=]\\s*['\"][^'\"]+['\"]/, label: 'hardcoded password' },\n { pattern: /api[_-]?key\\s*[:=]\\s*['\"][^'\"]+['\"]/, label: 'hardcoded API key' },\n { pattern: /[A-Za-z0-9+/]{100,}={0,2}/, label: 'large base64 blob' },\n];\n\nconst ALLOWED_SCRIPT_EXTENSIONS = ['.sh', '.py', '.js', '.ts'];\n\nexport function checkSchema(skill: ParsedSkill): SafeguardCheck {\n // If we got a ParsedSkill, it already passed schema validation\n return {\n name: 'schema-validation',\n passed: true,\n severity: 'info',\n message: 'SKILL.md metadata is valid',\n };\n}\n\nexport function checkLineCount(content: string): SafeguardCheck {\n const lines = content.split('\\n').length;\n const passed = lines <= MAX_SKILL_MD_LINES;\n return {\n name: 'line-count',\n passed,\n severity: passed ? 'info' : 'warning',\n message: passed\n ? `SKILL.md has ${lines} lines (max ${MAX_SKILL_MD_LINES})`\n : `SKILL.md has ${lines} lines, exceeds max of ${MAX_SKILL_MD_LINES}`,\n };\n}\n\nexport function checkProhibitedPatterns(content: string): SafeguardCheck {\n const found: string[] = [];\n for (const { pattern, label } of PROHIBITED_PATTERNS) {\n if (pattern.test(content)) {\n found.push(label);\n }\n }\n const passed = found.length === 0;\n return {\n name: 'prohibited-patterns',\n passed,\n severity: passed ? 'info' : 'error',\n message: passed\n ? 'No prohibited patterns detected'\n : `Prohibited patterns found: ${found.join(', ')}`,\n };\n}\n\nexport function checkScriptSafety(skillDir: string): SafeguardCheck {\n const scriptsDir = join(skillDir, 'scripts');\n if (!existsSync(scriptsDir)) {\n return {\n name: 'script-safety',\n passed: true,\n severity: 'info',\n message: 'No scripts directory found',\n };\n }\n\n const badFiles: string[] = [];\n const files = readdirSync(scriptsDir, { recursive: true }) as string[];\n for (const file of files) {\n const ext = '.' + file.split('.').pop();\n if (!ALLOWED_SCRIPT_EXTENSIONS.includes(ext)) {\n badFiles.push(file);\n }\n }\n\n const passed = badFiles.length === 0;\n return {\n name: 'script-safety',\n passed,\n severity: passed ? 'info' : 'error',\n message: passed\n ? 'All scripts use allowed extensions'\n : `Disallowed script types: ${badFiles.join(', ')}`,\n };\n}\n\nexport async function checkFileSize(skillDir: string): Promise<SafeguardCheck> {\n let totalSize = 0;\n const entries = readdirSync(skillDir, { recursive: true, withFileTypes: true });\n for (const entry of entries) {\n if (entry.isFile()) {\n const fullPath = join(entry.parentPath ?? skillDir, entry.name);\n const s = await stat(fullPath);\n totalSize += s.size;\n }\n }\n const passed = totalSize <= MAX_SKILL_SIZE_BYTES;\n return {\n name: 'file-size',\n passed,\n severity: passed ? 'info' : 'warning',\n message: passed\n ? `Total size: ${(totalSize / 1024).toFixed(1)}KB (max ${MAX_SKILL_SIZE_BYTES / 1024 / 1024}MB)`\n : `Total size ${(totalSize / 1024 / 1024).toFixed(1)}MB exceeds max of ${MAX_SKILL_SIZE_BYTES / 1024 / 1024}MB`,\n };\n}\n\nexport async function runSafeguards(\n skill: ParsedSkill,\n skillDir?: string,\n): Promise<SafeguardResult> {\n const checks: SafeguardCheck[] = [];\n\n checks.push(checkSchema(skill));\n checks.push(checkLineCount(skill.content));\n checks.push(checkProhibitedPatterns(skill.content + skill.rawFrontmatter));\n\n if (skillDir) {\n checks.push(checkScriptSafety(skillDir));\n checks.push(await checkFileSize(skillDir));\n }\n\n const passed = checks.every((c) => c.passed || c.severity !== 'error');\n const score = computeTrustScore(skill);\n\n return { passed, score, checks };\n}\n\nexport function computeTrustScore(\n skill: ParsedSkill,\n registryEntry?: RegistryEntry,\n): number {\n let score = 0;\n\n // Has repository (+10)\n if (skill.metadata.repository) score += 10;\n\n // Has license (+10)\n if (skill.metadata.license) score += 10;\n\n // Verified/official author (+20)\n if (skill.metadata.trustLevel === 'verified') score += 15;\n if (skill.metadata.trustLevel === 'official') score += 20;\n\n // Rating above 3.5 (+15)\n if (registryEntry && registryEntry.rating.average >= 3.5) score += 15;\n\n // Downloads bonus (+10)\n if (registryEntry && registryEntry.downloads > 100) score += 5;\n if (registryEntry && registryEntry.downloads > 1000) score += 5;\n\n // Passes basic checks (+35)\n const patternCheck = checkProhibitedPatterns(skill.content);\n const lineCheck = checkLineCount(skill.content);\n if (patternCheck.passed) score += 20;\n if (lineCheck.passed) score += 15;\n\n return Math.min(score, 100);\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { uninstall } from '../../core/installer.js';\n\nexport function registerUninstallCommand(program: Command): void {\n program\n .command('uninstall <skill>')\n .description('Uninstall a skill')\n .action(async (skill: string) => {\n const spinner = ora(`Uninstalling ${skill}...`).start();\n try {\n await uninstall(skill);\n spinner.succeed(`Uninstalled ${chalk.cyan(skill)}`);\n } catch (error) {\n spinner.fail('Uninstall failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { getSkillEntry } from '../../core/registry.js';\nimport { displaySkillInfo, displayTrustScore } from '../utils/display.js';\n\nexport function registerInfoCommand(program: Command): void {\n program\n .command('info <skill>')\n .description('Display detailed information about a skill')\n .action(async (skill: string) => {\n const spinner = ora('Fetching skill info...').start();\n try {\n const entry = await getSkillEntry(skill);\n spinner.stop();\n displaySkillInfo(entry);\n } catch (error) {\n spinner.fail('Failed to get skill info');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { getInstalledSkills } from '../../core/local-store.js';\nimport { displayInstalledSkills } from '../utils/display.js';\n\nexport function registerListCommand(program: Command): void {\n program\n .command('list')\n .description('List installed skills')\n .option('--json', 'Output as JSON')\n .action(async (options: { json: boolean }) => {\n try {\n const skills = await getInstalledSkills();\n if (options.json) {\n console.log(JSON.stringify(skills, null, 2));\n } else {\n displayInstalledSkills(skills);\n }\n } catch (error) {\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { submitRating, formatRating } from '../../core/ratings.js';\nimport { getConfig } from '../../core/local-store.js';\n\nexport function registerRateCommand(program: Command): void {\n program\n .command('rate <skill> <rating>')\n .description('Rate a skill (1-5 stars)')\n .option('-m, --comment <text>', 'Add a review comment')\n .action(async (skill: string, ratingStr: string, options: { comment?: string }) => {\n try {\n const rating = parseInt(ratingStr, 10);\n if (isNaN(rating) || rating < 1 || rating > 5) {\n console.error(chalk.red('Rating must be 1-5'));\n process.exit(1);\n }\n\n const config = await getConfig();\n const userId = config.userId ?? 'anonymous';\n const updated = await submitRating(skill, rating, userId, options.comment);\n console.log(chalk.green(`\\nRated ${chalk.cyan(skill)}: ${'★'.repeat(rating)}${'☆'.repeat(5 - rating)}`));\n console.log(` Updated: ${formatRating(updated)}`);\n } catch (error) {\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n}\n","import { getLocalIndex, saveLocalIndex } from './local-store.js';\nimport { SkillNotFoundError } from './errors.js';\nimport type { RatingInfo, RatingSubmission } from './types.js';\n\nexport async function getRatings(name: string): Promise<RatingInfo> {\n const index = await getLocalIndex();\n const entry = index.skills[name];\n if (!entry) {\n throw new SkillNotFoundError(name);\n }\n return entry.rating;\n}\n\nexport async function submitRating(\n name: string,\n rating: number,\n userId: string,\n comment?: string,\n): Promise<RatingInfo> {\n const index = await getLocalIndex();\n const entry = index.skills[name];\n if (!entry) {\n throw new SkillNotFoundError(name);\n }\n\n // Update the rating locally (in a real system this would go to the registry)\n const current = entry.rating;\n const newCount = current.count + 1;\n const newAverage = (current.average * current.count + rating) / newCount;\n\n // Update distribution\n const dist = [...current.distribution] as [number, number, number, number, number];\n dist[rating - 1] += 1;\n\n entry.rating = {\n average: Math.round(newAverage * 10) / 10,\n count: newCount,\n distribution: dist,\n };\n\n await saveLocalIndex(index);\n return entry.rating;\n}\n\nexport function formatRating(rating: RatingInfo): string {\n const filled = Math.round(rating.average);\n const empty = 5 - filled;\n const stars = '\\u2605'.repeat(filled) + '\\u2606'.repeat(empty);\n return `${stars} ${rating.average.toFixed(1)} (${rating.count} ratings)`;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { syncIndex } from '../../core/registry.js';\n\nexport function registerUpdateCommand(program: Command): void {\n program\n .command('update')\n .description('Update the local skill index from the registry')\n .action(async () => {\n const spinner = ora('Syncing registry index...').start();\n try {\n const index = await syncIndex();\n const count = Object.keys(index.skills).length;\n spinner.succeed(`Index updated: ${count} skills available`);\n } catch (error) {\n spinner.fail('Failed to update index');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { packageSkill } from '../../core/publisher.js';\nimport { displaySafeguardReport } from '../utils/display.js';\nimport { runSafeguards } from '../../core/safeguards.js';\nimport { parseSkillFile } from '../../core/parser.js';\nimport { join } from 'path';\nimport { SKILL_FILENAME } from '../../core/constants.js';\n\nexport function registerPublishCommand(program: Command): void {\n program\n .command('publish [path]')\n .description('Publish a skill to the registry')\n .option('--dry-run', 'Validate without publishing')\n .action(async (path: string | undefined, options: { dryRun: boolean }) => {\n const skillDir = path ?? process.cwd();\n const spinner = ora('Packaging skill...').start();\n\n try {\n const { skill, manifest, checksum } = await packageSkill(skillDir);\n spinner.succeed(`Packaged ${chalk.cyan(skill.metadata.name)} v${skill.metadata.version}`);\n\n // Show safeguard report\n const safeguards = await runSafeguards(skill, skillDir);\n displaySafeguardReport(safeguards);\n\n console.log(chalk.bold('Manifest:'));\n console.log(JSON.stringify(manifest, null, 2));\n\n if (options.dryRun) {\n console.log(chalk.yellow('\\n --dry-run: Skill was NOT published.'));\n console.log(chalk.gray(' Remove --dry-run to publish for real.\\n'));\n return;\n }\n\n // In v1, publishing instructions (PR-based on GitHub)\n console.log(chalk.green('\\n Skill validated and ready to publish!'));\n console.log(chalk.gray(' To publish, submit a PR to the skillli registry:'));\n console.log(chalk.gray(' https://github.com/skillli/registry\\n'));\n console.log(chalk.gray(` Checksum: sha256:${checksum}`));\n } catch (error) {\n spinner.fail('Publish failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n });\n}\n","import { readFile } from 'fs/promises';\nimport { join } from 'path';\nimport { createHash } from 'crypto';\nimport { existsSync, readdirSync, statSync } from 'fs';\nimport { SKILL_FILENAME, MANIFEST_FILENAME } from './constants.js';\nimport { parseSkillFile, extractManifest } from './parser.js';\nimport { runSafeguards } from './safeguards.js';\nimport { SkillValidationError } from './errors.js';\nimport type { ParsedSkill } from './types.js';\n\nexport async function packageSkill(\n skillDir: string,\n): Promise<{ skill: ParsedSkill; manifest: Record<string, unknown>; checksum: string }> {\n const skillFile = join(skillDir, SKILL_FILENAME);\n if (!existsSync(skillFile)) {\n throw new SkillValidationError(`No ${SKILL_FILENAME} found in ${skillDir}`);\n }\n\n const skill = await parseSkillFile(skillFile);\n const safeguards = await runSafeguards(skill, skillDir);\n\n if (!safeguards.passed) {\n const errors = safeguards.checks\n .filter((c) => !c.passed)\n .map((c) => `[${c.severity}] ${c.message}`);\n throw new SkillValidationError('Skill failed safety checks', errors);\n }\n\n // Compute checksum of all files\n const checksum = await computeDirectoryChecksum(skillDir);\n\n const manifest = extractManifest(skill);\n manifest.checksum = `sha256:${checksum}`;\n manifest.files = listFiles(skillDir);\n manifest.size_bytes = computeDirectorySize(skillDir);\n\n return { skill, manifest, checksum };\n}\n\nasync function computeDirectoryChecksum(dir: string): Promise<string> {\n const hash = createHash('sha256');\n const files = listFiles(dir).sort();\n\n for (const file of files) {\n const content = await readFile(join(dir, file));\n hash.update(file);\n hash.update(content);\n }\n\n return hash.digest('hex');\n}\n\nfunction listFiles(dir: string, prefix = ''): string[] {\n const files: string[] = [];\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name === '.git' || entry.name === 'node_modules') continue;\n const relative = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n files.push(...listFiles(join(dir, entry.name), relative));\n } else {\n files.push(relative);\n }\n }\n\n return files;\n}\n\nfunction computeDirectorySize(dir: string): number {\n let size = 0;\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name === '.git' || entry.name === 'node_modules') continue;\n const fullPath = join(dir, entry.name);\n if (entry.isDirectory()) {\n size += computeDirectorySize(fullPath);\n } else {\n size += statSync(fullPath).size;\n }\n }\n\n return size;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { trawl } from '../../trawler/index.js';\n\nexport function registerTrawlCommand(program: Command): void {\n program\n .command('trawl <query>')\n .description('Agentic search across multiple sources for skills')\n .option(\n '-s, --sources <sources...>',\n 'Sources to search (registry, github, npm)',\n ['registry', 'github'],\n )\n .option('-n, --max-results <n>', 'Maximum results', parseInt)\n .action(\n async (\n query: string,\n options: { sources: string[]; maxResults?: number },\n ) => {\n const spinner = ora('Trawling for skills...').start();\n try {\n const results = await trawl(query, {\n sources: options.sources as ('registry' | 'github' | 'npm')[],\n maxResults: options.maxResults,\n });\n spinner.stop();\n\n if (results.length === 0) {\n console.log(chalk.yellow('No skills found across any source.'));\n return;\n }\n\n console.log(chalk.bold(`\\nTrawled ${results.length} result(s):\\n`));\n for (const result of results) {\n const confidence = Math.round(result.confidence * 100);\n const confColor = confidence >= 70 ? chalk.green : confidence >= 40 ? chalk.yellow : chalk.gray;\n console.log(\n ` ${chalk.cyan.bold(result.skill.name ?? 'unknown')} ${chalk.gray(`[${result.source}]`)} ${confColor(`${confidence}% match`)}`,\n );\n if (result.skill.description) {\n console.log(` ${result.skill.description}`);\n }\n console.log(` ${chalk.gray(result.url)}`);\n console.log();\n }\n } catch (error) {\n spinner.fail('Trawl failed');\n console.error(chalk.red(String(error)));\n process.exit(1);\n }\n },\n );\n}\n","import type { TrawlResult, RegistryEntry } from '../core/types.js';\nimport { getLocalIndex } from '../core/local-store.js';\n\nexport async function searchRegistry(query: string): Promise<TrawlResult[]> {\n const index = await getLocalIndex();\n const tokens = query.toLowerCase().split(/\\s+/);\n const results: TrawlResult[] = [];\n\n for (const entry of Object.values(index.skills)) {\n const text = `${entry.name} ${entry.description} ${entry.tags.join(' ')}`.toLowerCase();\n const matchCount = tokens.filter((t) => text.includes(t)).length;\n if (matchCount === 0) continue;\n\n results.push({\n source: 'registry',\n skill: entry,\n confidence: Math.min(matchCount / tokens.length, 1),\n url: entry.repository || `skillli://registry/${entry.name}`,\n });\n }\n\n return results;\n}\n\nexport async function searchGithub(query: string): Promise<TrawlResult[]> {\n const results: TrawlResult[] = [];\n const searchQuery = encodeURIComponent(`${query} SKILL.md in:path`);\n const url = `https://api.github.com/search/repositories?q=${searchQuery}&per_page=10`;\n\n try {\n const res = await fetch(url, {\n headers: { Accept: 'application/vnd.github.v3+json' },\n });\n if (!res.ok) return results;\n\n const data = (await res.json()) as {\n items: Array<{\n full_name: string;\n description: string;\n html_url: string;\n stargazers_count: number;\n topics: string[];\n }>;\n };\n\n for (const repo of data.items ?? []) {\n const confidence = Math.min(\n 0.3 + (repo.stargazers_count > 10 ? 0.2 : 0) + (repo.stargazers_count > 100 ? 0.2 : 0),\n 0.9,\n );\n\n results.push({\n source: 'github',\n skill: {\n name: repo.full_name.split('/').pop() ?? repo.full_name,\n description: repo.description ?? '',\n author: repo.full_name.split('/')[0],\n repository: repo.html_url,\n tags: repo.topics ?? [],\n } as Partial<RegistryEntry>,\n confidence,\n url: repo.html_url,\n });\n }\n } catch {\n // GitHub API may be unavailable — silently return empty\n }\n\n return results;\n}\n\nexport async function searchNpm(query: string): Promise<TrawlResult[]> {\n const results: TrawlResult[] = [];\n const searchQuery = encodeURIComponent(`${query} skill agent claude`);\n const url = `https://registry.npmjs.org/-/v1/search?text=${searchQuery}&size=10`;\n\n try {\n const res = await fetch(url);\n if (!res.ok) return results;\n\n const data = (await res.json()) as {\n objects: Array<{\n package: {\n name: string;\n description: string;\n version: string;\n links: { repository?: string; npm: string };\n keywords?: string[];\n };\n score: { final: number };\n }>;\n };\n\n for (const obj of data.objects ?? []) {\n const pkg = obj.package;\n results.push({\n source: 'npm',\n skill: {\n name: pkg.name,\n description: pkg.description ?? '',\n version: pkg.version,\n repository: pkg.links.repository ?? '',\n tags: pkg.keywords ?? [],\n } as Partial<RegistryEntry>,\n confidence: Math.min(obj.score.final * 0.7, 0.85),\n url: pkg.links.npm,\n });\n }\n } catch {\n // npm API may be unavailable — silently return empty\n }\n\n return results;\n}\n","import type { TrawlResult } from '../core/types.js';\n\nexport function deduplicateResults(results: TrawlResult[]): TrawlResult[] {\n const seen = new Map<string, TrawlResult>();\n\n for (const result of results) {\n const key = result.skill.name?.toLowerCase() ?? result.url;\n const existing = seen.get(key);\n if (!existing || result.confidence > existing.confidence) {\n seen.set(key, result);\n }\n }\n\n return Array.from(seen.values());\n}\n\nexport function rankResults(results: TrawlResult[], query: string): TrawlResult[] {\n const tokens = query.toLowerCase().split(/\\s+/);\n\n return results\n .map((result) => {\n let bonus = 0;\n\n // Source trust bonus\n if (result.source === 'registry') bonus += 0.2;\n else if (result.source === 'github') bonus += 0.05;\n\n // Name relevance bonus\n const name = (result.skill.name ?? '').toLowerCase();\n for (const token of tokens) {\n if (name.includes(token)) bonus += 0.15;\n }\n\n // Tag match bonus\n const tags = (result.skill.tags ?? []).map((t) => t.toLowerCase());\n for (const token of tokens) {\n if (tags.includes(token)) bonus += 0.1;\n }\n\n return {\n ...result,\n confidence: Math.min(result.confidence + bonus, 1),\n };\n })\n .sort((a, b) => b.confidence - a.confidence);\n}\n","import type { TrawlResult, TrawlOptions } from '../core/types.js';\nimport { searchRegistry, searchGithub, searchNpm } from './strategies.js';\nimport { deduplicateResults, rankResults } from './ranker.js';\n\nexport async function trawl(\n query: string,\n options: TrawlOptions = {},\n): Promise<TrawlResult[]> {\n const sources = options.sources ?? ['registry', 'github'];\n const maxResults = options.maxResults ?? 10;\n\n // Fan out searches in parallel\n const searches: Promise<TrawlResult[]>[] = [];\n\n if (sources.includes('registry')) {\n searches.push(searchRegistry(query));\n }\n if (sources.includes('github')) {\n searches.push(searchGithub(query));\n }\n if (sources.includes('npm')) {\n searches.push(searchNpm(query));\n }\n\n const allResults = (await Promise.all(searches)).flat();\n\n // Deduplicate and rank\n const deduplicated = deduplicateResults(allResults);\n const ranked = rankResults(deduplicated, query);\n\n return ranked.slice(0, maxResults);\n}\n"],"mappings":"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","names":["import_path","inquirer","program","chalk","import_chalk","import_promises","import_fs","import_chalk","chalk","program","ora","chalk","import_chalk","import_ora","import_promises","import_fs","import_path","import_promises","matter","import_promises","import_path","import_fs","program","ora","chalk","import_chalk","import_ora","program","ora","chalk","import_chalk","import_ora","program","ora","chalk","import_chalk","program","chalk","import_chalk","stars","program","chalk","import_chalk","import_ora","program","ora","chalk","import_chalk","import_ora","import_promises","import_path","import_fs","program","ora","chalk","import_chalk","import_ora","program","ora","chalk"]}
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node
@@ -0,0 +1 @@
1
+ #!/usr/bin/env node