skilld 1.6.2 → 1.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.
Files changed (73) hide show
  1. package/README.md +29 -20
  2. package/dist/_chunks/agent.mjs +2 -1
  3. package/dist/_chunks/agent.mjs.map +1 -1
  4. package/dist/_chunks/assemble.mjs +1 -1
  5. package/dist/_chunks/author-group.mjs +17 -0
  6. package/dist/_chunks/author-group.mjs.map +1 -0
  7. package/dist/_chunks/author.mjs +8 -6
  8. package/dist/_chunks/author.mjs.map +1 -1
  9. package/dist/_chunks/cache.mjs +1 -1
  10. package/dist/_chunks/cache2.mjs +1 -1
  11. package/dist/_chunks/cli-helpers.mjs +3 -119
  12. package/dist/_chunks/cli-helpers.mjs.map +1 -1
  13. package/dist/_chunks/config.mjs +119 -27
  14. package/dist/_chunks/config.mjs.map +1 -1
  15. package/dist/_chunks/core.mjs +1 -1
  16. package/dist/_chunks/embedding-cache2.mjs +1 -1
  17. package/dist/_chunks/index.d.mts.map +1 -1
  18. package/dist/_chunks/index3.d.mts +79 -78
  19. package/dist/_chunks/index3.d.mts.map +1 -1
  20. package/dist/_chunks/install.mjs +85 -535
  21. package/dist/_chunks/install.mjs.map +1 -1
  22. package/dist/_chunks/install2.mjs +554 -0
  23. package/dist/_chunks/install2.mjs.map +1 -0
  24. package/dist/_chunks/lockfile.mjs +1 -0
  25. package/dist/_chunks/lockfile.mjs.map +1 -1
  26. package/dist/_chunks/package-registry.mjs +465 -0
  27. package/dist/_chunks/package-registry.mjs.map +1 -0
  28. package/dist/_chunks/prefix.mjs +108 -0
  29. package/dist/_chunks/prefix.mjs.map +1 -0
  30. package/dist/_chunks/prepare.mjs +6 -2
  31. package/dist/_chunks/prepare.mjs.map +1 -1
  32. package/dist/_chunks/prepare2.mjs +1 -1
  33. package/dist/_chunks/prompts.mjs +5 -99
  34. package/dist/_chunks/prompts.mjs.map +1 -1
  35. package/dist/_chunks/search-helpers.mjs +99 -0
  36. package/dist/_chunks/search-helpers.mjs.map +1 -0
  37. package/dist/_chunks/search-interactive.mjs +1 -1
  38. package/dist/_chunks/search-interactive.mjs.map +1 -1
  39. package/dist/_chunks/search.mjs +219 -1
  40. package/dist/_chunks/search.mjs.map +1 -0
  41. package/dist/_chunks/shared.mjs +1 -463
  42. package/dist/_chunks/shared.mjs.map +1 -1
  43. package/dist/_chunks/skills.mjs +1 -1
  44. package/dist/_chunks/sources.mjs +1177 -988
  45. package/dist/_chunks/sources.mjs.map +1 -1
  46. package/dist/_chunks/sync-registry.mjs +59 -0
  47. package/dist/_chunks/sync-registry.mjs.map +1 -0
  48. package/dist/_chunks/sync-shared2.mjs +10 -7
  49. package/dist/_chunks/sync-shared2.mjs.map +1 -1
  50. package/dist/_chunks/sync.mjs +208 -99
  51. package/dist/_chunks/sync.mjs.map +1 -1
  52. package/dist/_chunks/sync2.mjs +1 -1
  53. package/dist/_chunks/uninstall.mjs +3 -2
  54. package/dist/_chunks/uninstall.mjs.map +1 -1
  55. package/dist/_chunks/upload.mjs +152 -0
  56. package/dist/_chunks/upload.mjs.map +1 -0
  57. package/dist/_chunks/validate.mjs +1 -1
  58. package/dist/_chunks/version.mjs +30 -0
  59. package/dist/_chunks/version.mjs.map +1 -0
  60. package/dist/_chunks/wizard.mjs +2 -1
  61. package/dist/_chunks/wizard.mjs.map +1 -1
  62. package/dist/agent/index.mjs +2 -1
  63. package/dist/cache/index.mjs +1 -1
  64. package/dist/cli.mjs +48 -20
  65. package/dist/cli.mjs.map +1 -1
  66. package/dist/index.d.mts +1 -1
  67. package/dist/index.mjs +2 -2
  68. package/dist/sources/index.d.mts +2 -2
  69. package/dist/sources/index.mjs +3 -3
  70. package/dist/types.d.mts +1 -1
  71. package/package.json +11 -12
  72. package/dist/_chunks/search2.mjs +0 -310
  73. package/dist/_chunks/search2.mjs.map +0 -1
package/dist/cli.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.mjs","names":["agents","skilldVersion","agents","agents"],"sources":["../src/commands/config.ts","../src/commands/remove.ts","../src/commands/status.ts","../src/cli.ts"],"sourcesContent":["import type { OptimizeModel } from '../agent/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { getOAuthProviderList, loginOAuthProvider, logoutOAuthProvider } from '../agent/clis/pi-ai.ts'\nimport { agents, detectTargetAgent, getAvailableModels, getModelName } from '../agent/index.ts'\nimport { guard, introLine, menuLoop, NO_MODELS_MESSAGE, OAUTH_NOTE, pickModel, requireInteractive } from '../cli-helpers.ts'\nimport { defaultFeatures, readConfig, updateConfig } from '../core/config.ts'\nimport { getProjectState } from '../core/skills.ts'\n\nexport async function configCommand(): Promise<void> {\n const initConfig = readConfig()\n const agentId = initConfig.agent || detectTargetAgent() || undefined\n const cyan = (s: string) => `\\x1B[36m${s}\\x1B[90m`\n const modelLabel = initConfig.skipLlm\n ? 'skip'\n : initConfig.model\n ? cyan(getModelName(initConfig.model))\n : 'auto'\n const agentLabel = agentId && agents[agentId as keyof typeof agents]\n ? cyan(agents[agentId as keyof typeof agents].displayName)\n : 'auto-detect'\n p.note(`\\x1B[90mFetch docs → Enhance with ${modelLabel} → Install to ${agentLabel}\\x1B[0m`, 'How skilld works')\n\n await menuLoop({\n message: 'Settings',\n options: () => {\n const config = readConfig()\n const features = config.features ?? defaultFeatures\n const enabledCount = Object.values(features).filter(Boolean).length\n const modelHint = config.skipLlm\n ? 'disabled'\n : config.model\n ? getModelName(config.model)\n : 'auto'\n const oauthProviders = getOAuthProviderList()\n const options = [\n { label: 'Data sources', value: 'features', hint: `${enabledCount}/4 enabled · issues, releases, search, discussions` },\n ]\n if (oauthProviders.length > 0) {\n const connectedOAuth = oauthProviders.filter(pr => pr.loggedIn).length\n const oauthHint = connectedOAuth > 0 ? `${connectedOAuth} connected` : 'none'\n options.push({ label: 'OAuth providers', value: 'oauth', hint: `${oauthHint} · ⚠ may violate provider ToS` })\n }\n options.push(\n { label: 'Enhancement model', value: 'model', hint: `${modelHint} · rewrites SKILL.md with best practices` },\n { label: 'Target agent', value: 'agent', hint: `${config.agent || 'auto-detect'} · where skills are installed` },\n )\n return options\n },\n onSelect: async (action) => {\n switch (action) {\n case 'features': {\n const config = readConfig()\n const features = config.features ?? defaultFeatures\n const selected = guard(await p.multiselect({\n message: 'Data sources',\n options: [\n { label: 'Semantic + token search', value: 'search' as const, hint: 'local query engine to cut token costs and speed up grep' },\n { label: 'Release notes', value: 'releases' as const, hint: 'track changelogs for installed packages' },\n { label: 'GitHub issues', value: 'issues' as const, hint: 'surface common problems and solutions' },\n { label: 'GitHub discussions', value: 'discussions' as const, hint: 'include Q&A and community knowledge' },\n ],\n initialValues: Object.entries(features)\n .filter(([, v]) => v)\n .map(([k]) => k) as Array<keyof FeaturesConfig>,\n required: false,\n }))\n updateConfig({\n features: {\n search: selected.includes('search'),\n issues: selected.includes('issues'),\n discussions: selected.includes('discussions'),\n releases: selected.includes('releases'),\n },\n })\n p.log.success(`Data sources updated: ${selected.length} enabled`)\n break\n }\n\n case 'oauth': {\n await configureOAuth()\n break\n }\n\n case 'model': {\n await configureModel()\n break\n }\n\n case 'agent': {\n const config = readConfig()\n const agentChoice = guard(await p.select({\n message: 'Target agent — where should skills be installed?',\n options: [\n { label: 'Auto-detect', value: '' },\n ...Object.entries(agents).map(([id, a]) => ({\n label: a.displayName,\n value: id,\n hint: a.skillsDir,\n })),\n ],\n initialValue: config.agent || '',\n }))\n updateConfig({ agent: agentChoice || undefined })\n p.log.success(agentChoice ? `Target agent set to ${agentChoice}` : 'Target agent will be auto-detected')\n break\n }\n }\n },\n })\n}\n\nasync function configureOAuth(): Promise<void> {\n p.note(OAUTH_NOTE, 'How OAuth works')\n\n await menuLoop({\n message: 'OAuth providers',\n options: () => {\n const providers = getOAuthProviderList()\n return providers.map(pr => ({\n label: pr.name,\n value: pr.id,\n hint: pr.loggedIn ? '\\x1B[32mconnected\\x1B[0m' : 'not connected',\n }))\n },\n onSelect: async (providerId) => {\n const providers = getOAuthProviderList()\n const pr = providers.find(p2 => p2.id === providerId)\n if (!pr)\n return\n\n if (pr.loggedIn) {\n const action = guard(await p.select({\n message: pr.name,\n options: [\n { label: 'Disconnect', value: 'disconnect' },\n { label: 'Back', value: 'back' },\n ],\n }))\n if (action === 'disconnect') {\n logoutOAuthProvider(providerId as string)\n p.log.success(`Disconnected from ${pr.name}`)\n }\n return\n }\n\n const spinner = p.spinner()\n spinner.start('Connecting...')\n\n const success = await loginOAuthProvider(providerId as string, {\n onAuth: (url, instructions) => {\n spinner.stop('Open this URL in your browser:')\n p.log.info(` \\x1B[36m${url}\\x1B[0m`)\n if (instructions)\n p.log.info(` \\x1B[90m${instructions}\\x1B[0m`)\n spinner.start('Waiting for authentication...')\n },\n onPrompt: async (message, placeholder) => {\n const value = await p.text({ message, placeholder })\n if (p.isCancel(value))\n return ''\n return value as string\n },\n onProgress: msg => p.log.step(msg),\n }).catch((err: Error) => {\n spinner.stop(`Login failed: ${err.message}`)\n return false\n })\n\n spinner.stop()\n if (success)\n p.log.success(`Connected to ${pr.name}`)\n },\n })\n}\n\n// ── Model selection ──────────────────────────────────────────────────\n\nasync function configureModel(): Promise<void> {\n // Loop so user can connect OAuth and come back to pick a model\n while (true) {\n const available = await getAvailableModels()\n\n if (available.length === 0)\n p.log.warn(NO_MODELS_MESSAGE)\n\n const oauthProviders = getOAuthProviderList()\n const afterOptions = oauthProviders.length > 0\n ? [\n { label: '⚠ Connect OAuth provider...', value: '_connect', hint: 'may violate provider ToS' },\n { label: 'Skip enhancement', value: '_skip', hint: 'base skill with docs, issues, and types' },\n ]\n : [\n { label: 'Skip enhancement', value: '_skip', hint: 'base skill with docs, issues, and types' },\n ]\n\n const choice = await pickModel(available, {\n before: available.length > 0\n ? [{ label: 'Auto', value: '_auto', hint: 'picks best available model from connected providers' }]\n : [],\n after: afterOptions,\n })\n\n if (!choice)\n return\n\n if (choice === '_connect') {\n await configureOAuth()\n continue\n }\n\n if (choice === '_skip') {\n updateConfig({ model: undefined, skipLlm: true })\n p.log.success('Enhancement disabled - skills will use raw docs only')\n }\n else if (choice === '_auto') {\n updateConfig({ model: undefined, skipLlm: false })\n p.log.success('Enhancement model will be auto-selected')\n }\n else {\n updateConfig({ model: choice as OptimizeModel, skipLlm: false })\n p.log.success(`Enhancement model set to ${getModelName(choice as OptimizeModel)}`)\n }\n return\n }\n}\n\nexport const configCommandDef = defineCommand({\n meta: { name: 'config', description: 'Edit settings' },\n args: {},\n async run() {\n requireInteractive('config')\n const cwd = process.cwd()\n const state = await getProjectState(cwd)\n p.intro(introLine({ state }))\n return configCommand()\n },\n})\n","import type { AgentType } from '../agent/index.ts'\nimport type { ProjectState, SkillEntry } from '../core/skills.ts'\nimport { existsSync, rmSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { unlinkSkillFromAgents } from '../agent/index.ts'\nimport { getInstalledGenerators, introLine, isInteractive, promptForAgent, resolveAgent, sharedArgs } from '../cli-helpers.ts'\nimport { readConfig } from '../core/config.ts'\nimport { removeLockEntry } from '../core/lockfile.ts'\nimport { getSharedSkillsDir } from '../core/shared.ts'\nimport { getProjectState, getSkillsDir, iterateSkills } from '../core/skills.ts'\n\nexport interface RemoveOptions {\n packages?: string[]\n global: boolean\n agent: AgentType\n yes: boolean\n}\n\nexport async function removeCommand(state: ProjectState, opts: RemoveOptions): Promise<void> {\n // Get skills from the appropriate scope\n const scope = opts.global ? 'global' : 'local'\n const allSkills = [...iterateSkills({ scope })]\n\n // Non-interactive without packages → error\n if (!isInteractive() && !opts.packages) {\n console.error('Error: `skilld remove` requires package names in non-interactive mode.\\n Usage: skilld remove <package...>')\n process.exit(1)\n }\n\n // Get skills to choose from\n const skills = opts.packages\n ? allSkills.filter(s => opts.packages!.includes(s.name))\n : await pickSkillsToRemove(allSkills, scope)\n\n if (!skills || skills.length === 0) {\n p.log.info('No skills selected')\n return\n }\n\n // Confirm deletion (skip in non-interactive)\n if (!opts.yes && isInteractive()) {\n const confirmed = await p.confirm({\n message: `Remove ${skills.length} skill(s)? ${skills.map(s => s.name).join(', ')}`,\n })\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel('Cancelled')\n return\n }\n }\n\n // Delete each skill\n const cwd = process.cwd()\n const shared = getSharedSkillsDir(cwd)\n for (const skill of skills) {\n const skillsDir = getSkillsDir(skill.agent, skill.scope)\n\n if (existsSync(skill.dir)) {\n rmSync(skill.dir, { recursive: true, force: true })\n removeLockEntry(skillsDir, skill.name)\n // Clean up per-agent symlinks when removing from shared dir\n if (shared && skill.scope === 'local')\n unlinkSkillFromAgents(skill.name, cwd, opts.agent)\n p.log.success(`Removed ${skill.name}`)\n }\n else {\n p.log.warn(`${skill.name} not found`)\n }\n }\n\n p.outro(`Removed ${skills.length} skill(s)`)\n}\n\nasync function pickSkillsToRemove(skills: SkillEntry[], scope: 'local' | 'global'): Promise<SkillEntry[] | null> {\n if (skills.length === 0) {\n p.log.warn(`No ${scope} skills installed`)\n return null\n }\n\n const options = skills.map(skill => ({\n label: skill.name,\n value: skill.name,\n hint: skill.info?.version ? `@${skill.info.version}` : undefined,\n }))\n\n const selected = await p.multiselect({\n message: 'Select skills to remove',\n options,\n required: false,\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled')\n return null\n }\n\n const selectedSet = new Set(selected as string[])\n return skills.filter(s => selectedSet.has(s.name))\n}\n\nexport const removeCommandDef = defineCommand({\n meta: { name: 'remove', description: 'Remove installed skills' },\n args: {\n package: {\n type: 'positional',\n description: 'Package(s) to remove (space-separated)',\n required: false,\n },\n ...sharedArgs,\n },\n async run({ args }) {\n const cwd = process.cwd()\n let agent = resolveAgent(args.agent)\n if (!agent || agent === 'none') {\n if (agent === 'none')\n return\n const picked = await promptForAgent()\n if (!picked || picked === 'none')\n return\n agent = picked\n }\n\n const state = await getProjectState(cwd)\n const generators = getInstalledGenerators()\n const config = readConfig()\n const scope = args.global ? 'global' : 'project'\n const intro = { state, generators, modelId: config.model, agentId: agent || config.agent || undefined }\n p.intro(`${introLine(intro)} · remove (${scope})`)\n\n // Collect packages from positional args\n const packages = args.package\n ? [...new Set([args.package, ...((args as any)._ || [])].map((s: string) => s.trim()).filter(Boolean))]\n : undefined\n\n return removeCommand(state, {\n packages,\n global: args.global,\n agent,\n yes: args.yes,\n })\n },\n})\n","import type { AgentType } from '../agent/index.ts'\nimport type { SkillInfo } from '../core/lockfile.ts'\nimport { existsSync, readdirSync, statSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { join } from 'pathe'\nimport { agents, getAgentVersion } from '../agent/index.ts'\nimport { CACHE_DIR, getPackageDbPath } from '../cache/index.ts'\nimport { getCacheDir } from '../cache/version.ts'\nimport { sharedArgs } from '../cli-helpers.ts'\nimport { defaultFeatures, hasConfig, readConfig } from '../core/config.ts'\nimport { formatSource, timeAgo } from '../core/formatting.ts'\nimport { parsePackages } from '../core/lockfile.ts'\nimport { getSharedSkillsDir, mapInsert } from '../core/shared.ts'\n\nimport { iterateSkills } from '../core/skills.ts'\nimport { version as skilldVersion } from '../version.ts'\n\nexport interface StatusOptions {\n global?: boolean\n}\n\ninterface TrackedPackage {\n name: string\n info: SkillInfo\n agents: Set<AgentType>\n scope: 'local' | 'global'\n}\n\nfunction countDocs(packageName: string, version?: string): number {\n if (!version)\n return 0\n const cacheDir = getCacheDir(packageName, version)\n if (!existsSync(cacheDir))\n return 0\n let count = 0\n const walk = (dir: string, depth = 0) => {\n if (depth > 3)\n return\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.name === 'search.db')\n continue\n if (entry.isDirectory())\n walk(join(dir, entry.name), depth + 1)\n else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx'))\n count++\n }\n }\n catch {}\n }\n walk(cacheDir)\n return count\n}\n\nasync function countEmbeddings(packageName: string, version?: string): Promise<number | null> {\n if (!version)\n return null\n const dbPath = getPackageDbPath(packageName, version)\n if (!existsSync(dbPath))\n return null\n try {\n const { DatabaseSync } = await import('node:sqlite')\n const db = new DatabaseSync(dbPath, { open: true, readOnly: true })\n try {\n const row = db.prepare('SELECT count(*) as cnt FROM vector_metadata').get() as { cnt: number } | undefined\n return row?.cnt ?? null\n }\n finally {\n db.close()\n }\n }\n catch {\n return null\n }\n}\n\nfunction countRefDocs(skillDir: string): number {\n const refsDir = join(skillDir, '.skilld')\n if (!existsSync(refsDir))\n return 0\n let count = 0\n const walk = (dir: string, depth = 0) => {\n if (depth > 3)\n return\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory() || entry.isSymbolicLink()) {\n try {\n const stat = statSync(join(dir, entry.name))\n if (stat.isDirectory())\n walk(join(dir, entry.name), depth + 1)\n }\n catch { continue }\n }\n else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx')) {\n count++\n }\n }\n }\n catch {}\n }\n walk(refsDir)\n return count\n}\n\n// dim helper\nconst dim = (s: string) => `\\x1B[90m${s}\\x1B[0m`\nconst bold = (s: string) => `\\x1B[1m${s}\\x1B[0m`\nconst green = (s: string) => `\\x1B[32m${s}\\x1B[0m`\n\nfunction getLastSynced(): string | null {\n let latest: Date | null = null\n for (const skill of iterateSkills()) {\n if (skill.info?.syncedAt) {\n const d = new Date(skill.info.syncedAt)\n if (!latest || d > latest)\n latest = d\n }\n }\n if (!latest)\n return null\n return timeAgo(latest.toISOString())\n}\n\nfunction buildConfigLines(): string[] {\n const config = readConfig()\n const lines: string[] = []\n\n lines.push(`Version v${skilldVersion}`)\n const lastSynced = getLastSynced()\n if (lastSynced)\n lines.push(`Synced ${dim(lastSynced)}`)\n const shared = getSharedSkillsDir()\n if (shared)\n lines.push(`Shared ${dim(shared)}`)\n lines.push(`Config ${dim(join(CACHE_DIR, 'config.yaml'))}${hasConfig() ? '' : dim(' (not created)')}`)\n lines.push(`Cache ${dim(CACHE_DIR)}`)\n\n const withCli = Object.entries(agents).filter(([_, a]) => a.cli) as [AgentType, typeof agents[AgentType]][]\n const installed: string[] = []\n for (const [id, agent] of withCli) {\n const ver = getAgentVersion(id)\n if (ver)\n installed.push(`${agent.displayName} v${ver}`)\n }\n if (installed.length > 0)\n lines.push(`Agents ${installed.join(', ')}`)\n\n if (config.model)\n lines.push(`Model ${config.model}`)\n\n const features = { ...defaultFeatures, ...config.features }\n const parts = Object.entries(features).map(([k, v]) => `${k}: ${v ? green('on') : dim('off')}`)\n lines.push(`Features ${parts.join(', ')}`)\n\n if (config.projects?.length)\n lines.push(`Projects ${config.projects.length} registered`)\n\n return lines\n}\n\nexport async function statusCommand(opts: StatusOptions = {}): Promise<void> {\n const allSkills = [...iterateSkills({ scope: opts.global ? 'global' : 'all' })]\n\n // Config section\n p.log.step(bold('Skilld Config'))\n p.log.message(buildConfigLines().join('\\n'))\n\n if (allSkills.length === 0) {\n p.log.step(bold('Skills'))\n p.log.message(`${dim('(none)')}\\n\\nRun ${bold('skilld add <package>')} to install skills`)\n return\n }\n\n // Deduplicate by package identity, grouped by scope\n const localPkgs = new Map<string, TrackedPackage>()\n const globalPkgs = new Map<string, TrackedPackage>()\n\n for (const skill of allSkills) {\n const key = skill.info?.packageName || skill.name\n const map = skill.scope === 'local' ? localPkgs : globalPkgs\n\n const entry = mapInsert(map, key, () => ({\n name: skill.name,\n info: skill.info || {},\n agents: new Set<AgentType>(),\n scope: skill.scope,\n }))\n entry.agents.add(skill.agent)\n }\n\n const buildPackageLines = async (pkgs: Map<string, TrackedPackage>): Promise<string[]> => {\n const lines: string[] = []\n for (const [, pkg] of pkgs) {\n const { info } = pkg\n const isShipped = info.source === 'shipped'\n const icon = isShipped ? '▶' : '◆'\n\n const pkgsList = parsePackages(info.packages)\n const nameDisplay = pkgsList.length > 1\n ? `${pkg.name} ${dim(`(${pkgsList.map(p => p.name).join(', ')})`)}`\n : pkg.name\n const parts = [`${icon} ${bold(nameDisplay)}`]\n if (info.version)\n parts.push(dim(info.version))\n const source = formatSource(info.source)\n if (source && source !== 'shipped')\n parts.push(dim(source))\n\n lines.push(parts.join(' '))\n\n const meta: string[] = []\n const pkgName = info.packageName || pkg.name\n const docs = countDocs(pkgName, info.version) || countRefDocs(join(\n pkg.scope === 'global'\n ? agents[pkg.agents.values().next().value!].globalSkillsDir!\n : join(process.cwd(), agents[pkg.agents.values().next().value!].skillsDir),\n pkg.name,\n ))\n if (docs > 0)\n meta.push(`${docs} docs`)\n\n const embeddings = await countEmbeddings(pkgName, info.version)\n if (embeddings !== null)\n meta.push(`${embeddings} chunks`)\n\n const ago = timeAgo(info.syncedAt)\n if (ago)\n meta.push(`synced ${ago}`)\n\n if (pkg.agents.size > 0) {\n const agentNames = Array.from(pkg.agents, a => agents[a].displayName)\n meta.push(agentNames.join(', '))\n }\n\n if (meta.length > 0)\n lines.push(` ${dim(meta.join(' · '))}`)\n }\n return lines\n }\n\n if (!opts.global && localPkgs.size > 0) {\n p.log.step(`${bold('Local')} (project)`)\n p.log.message((await buildPackageLines(localPkgs)).join('\\n'))\n }\n\n if (globalPkgs.size > 0) {\n p.log.step(bold('Global'))\n p.log.message((await buildPackageLines(globalPkgs)).join('\\n'))\n }\n\n if (!opts.global && localPkgs.size === 0) {\n p.log.step(`${bold('Local')} (project)`)\n p.log.message(dim('(none)'))\n }\n\n const total = localPkgs.size + globalPkgs.size\n p.log.info(`${total} package${total !== 1 ? 's' : ''}`)\n}\n\nexport const infoCommandDef = defineCommand({\n meta: { name: 'info', description: 'Show skill info and config' },\n args: {\n global: sharedArgs.global,\n },\n run({ args }) {\n return statusCommand({ global: args.global })\n },\n})\n","#!/usr/bin/env node\nimport type { PackageUsage } from './agent/detect-imports.ts'\nimport type { AgentType } from './agent/index.ts'\nimport { existsSync, readFileSync, realpathSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand, runMain } from 'citty'\nimport pLimit from 'p-limit'\nimport { join, resolve } from 'pathe'\nimport { agents, detectImportedPackages, detectInstalledAgents } from './agent/index.ts'\nimport { formatStatus, getRepoHint, guard, hasPrepareHook, isInteractive, isRunningInsideAgent, menuLoop, promptForAgent, relativeTime, resolveAgent, sharedArgs, suggestPrepareHook } from './cli-helpers.ts'\nimport { configCommand, configCommandDef } from './commands/config.ts'\nimport { removeCommand, removeCommandDef } from './commands/remove.ts'\nimport { infoCommandDef, statusCommand } from './commands/status.ts'\nimport { runWizard } from './commands/wizard.ts'\nimport { timedSpinner } from './core/formatting.ts'\nimport { getProjectState, hasCompletedWizard, isOutdated, readConfig, semverGt } from './core/index.ts'\nimport { readPackageJsonSafe } from './core/package-json.ts'\nimport { iterateSkills } from './core/skills.ts'\nimport { fetchLatestVersion, fetchNpmRegistryMeta } from './sources/index.ts'\n\nimport { version } from './version.ts'\n\n// Suppress node:sqlite ExperimentalWarning (loaded lazily by retriv)\nconst _emit = process.emit\nprocess.emit = (event: string, ...args: any[]) =>\n event === 'warning' && args[0]?.name === 'ExperimentalWarning' && args[0]?.message?.includes('SQLite')\n ? false\n : _emit.apply(process, [event, ...args])\n\n// ── Brand animation ──\n\nconst NOISE_CHARS = '⣿⡿⣷⣾⣽⣻⢿⡷⣯⣟⡾⣵⣳⢾⡽⣞⡷⣝⢯'\n\n// Seed hue from cwd so each project gets a consistent color\nfunction djb2(s: string): number {\n let h = 5381\n for (let i = 0; i < s.length; i++)\n h = ((h << 5) + h + s.charCodeAt(i)) >>> 0\n return h\n}\n\nfunction hueToChannel(p: number, q: number, t: number): number {\n const t1 = t < 0 ? t + 1 : t > 1 ? t - 1 : t\n if (t1 < 1 / 6)\n return p + (q - p) * 6 * t1\n if (t1 < 1 / 2)\n return q\n if (t1 < 2 / 3)\n return p + (q - p) * (2 / 3 - t1) * 6\n return p\n}\n\nfunction hsl(h: number, s: number, l: number): [number, number, number] {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n return [\n Math.round(hueToChannel(p, q, h + 1 / 3) * 255),\n Math.round(hueToChannel(p, q, h) * 255),\n Math.round(hueToChannel(p, q, h - 1 / 3) * 255),\n ]\n}\n\nconst BRAND_HUE = (djb2(process.cwd()) % 360) / 360\n\n// density 0 = random sparse braille, density 1 = ⣿ (all dots filled)\nfunction noiseChar(brightness: number, density = 0): string {\n if (brightness < 0.08)\n return ' '\n const b = Math.min(brightness, 1)\n const ch = Math.random() < density ? '⣿' : NOISE_CHARS[Math.floor(Math.random() * NOISE_CHARS.length)]\n const [r, g, bl] = hsl(BRAND_HUE, 0.4 + b * 0.15, 0.35 + b * 0.25)\n return `\\x1B[38;2;${r};${g};${bl}m${ch}`\n}\n\nfunction noiseLine(len: number, brightnessFn: (x: number) => number, density = 0): string {\n let s = ''\n for (let i = 0; i < len; i++)\n s += noiseChar(brightnessFn(i), density)\n return `${s}\\x1B[0m`\n}\n\nfunction brandFrame(t: number, floor = 0, density = 0): string {\n const cx = 5\n const cy = 1\n const brightness = (x: number, y: number) => {\n const d = Math.sqrt((x - cx) ** 2 + ((y - cy) * 3) ** 2)\n let val = 0\n for (let ring = 0; ring < 3; ring++) {\n const rt = t - ring * 0.5\n if (rt <= 0)\n continue\n const front = rt * 4\n const proximity = Math.abs(d - front)\n val += Math.exp(-proximity * proximity * 0.8) * Math.exp(-rt * 0.4)\n }\n const base = Math.max(0, (t - 1.5) * 0.3) * (Math.random() * 0.3 + 0.1)\n return Math.min(1, Math.max(floor, val + base))\n }\n return [\n noiseLine(10, x => brightness(x, 0), density),\n `${noiseLine(2, x => brightness(x, 1), density)} %NAME% ${noiseLine(2, x => brightness(x + 8, 1), density)} %VER%`,\n noiseLine(10, x => brightness(x, 2), density),\n ].join('\\n')\n}\n\nasync function brandLoader<T>(work: () => Promise<T>, minMs = 1500): Promise<T> {\n if (process.env.SKILLD_EFFECT === 'none')\n return work()\n\n const logUpdate = (await import('log-update')).default\n const name = '\\x1B[1m\\x1B[38;2;255;255;255mskilld\\x1B[0m'\n const ver = `\\x1B[2mv${version}\\x1B[0m`\n const status = '\\x1B[2mSetting up your environment\\x1B[0m'\n const start = Date.now()\n\n const sub = (raw: string) => raw.replace('%NAME%', name).replace('%VER%', ver)\n\n let done = false\n const result = Promise.all([\n work(),\n new Promise<void>(r => setTimeout(r, minMs)),\n ]).then(([v]) => {\n done = true\n return v\n })\n\n // Main animation — ripple with status text\n // eslint-disable-next-line no-unmodified-loop-condition -- modified async in .then()\n while (!done) {\n const t = (Date.now() - start) / 1000\n logUpdate(`\\n ${sub(brandFrame(t))}\\n\\n ${status}`)\n await new Promise(r => setTimeout(r, 60))\n }\n\n // Fill outro — ramp floor + density so all dots fill in\n const outroMs = 500\n const outroStart = Date.now()\n const tFinal = (outroStart - start) / 1000\n while (Date.now() - outroStart < outroMs) {\n const p = (Date.now() - outroStart) / outroMs\n const eased = p * p\n logUpdate(`\\n ${sub(brandFrame(tFinal + p * 0.5, eased * 0.9, eased))}\\n`)\n await new Promise(r => setTimeout(r, 40))\n }\n\n // Final frame — all pixels ⣿, full brightness\n logUpdate(`\\n ${sub(brandFrame(tFinal + 1, 0.9, 1))}\\n`)\n logUpdate.done()\n return result\n}\n\n// ── Subcommands (lazy-loaded) ──\n\nconst SUBCOMMAND_NAMES = ['add', 'eject', 'update', 'info', 'list', 'config', 'remove', 'install', 'uninstall', 'search', 'cache', 'validate', 'assemble', 'setup', 'prepare', 'author', 'publish']\n\n// ── Main command ──\n\nconst main = defineCommand({\n meta: {\n name: 'skilld',\n version,\n description: 'Sync package documentation for agentic use',\n },\n args: {\n agent: sharedArgs.agent,\n },\n subCommands: {\n add: () => import('./commands/sync.ts').then(m => m.addCommandDef),\n eject: () => import('./commands/sync.ts').then(m => m.ejectCommandDef),\n update: () => import('./commands/sync.ts').then(m => m.updateCommandDef),\n info: () => infoCommandDef,\n list: () => import('./commands/list.ts').then(m => m.listCommandDef),\n config: () => configCommandDef,\n remove: () => removeCommandDef,\n install: () => import('./commands/install.ts').then(m => m.installCommandDef),\n prepare: () => import('./commands/prepare.ts').then(m => m.prepareCommandDef),\n uninstall: () => import('./commands/uninstall.ts').then(m => m.uninstallCommandDef),\n search: () => import('./commands/search.ts').then(m => m.searchCommandDef),\n cache: () => import('./commands/cache.ts').then(m => m.cacheCommandDef),\n validate: () => import('./commands/validate.ts').then(m => m.validateCommandDef),\n assemble: () => import('./commands/assemble.ts').then(m => m.assembleCommandDef),\n setup: () => import('./commands/setup.ts').then(m => m.setupCommandDef),\n author: () => import('./commands/author.ts').then(m => m.authorCommandDef),\n publish: () => import('./commands/author.ts').then(m => m.authorCommandDef),\n },\n async run({ args }) {\n // Guard: citty always calls parent run() after subcommand dispatch.\n // If a subcommand was invoked, bail out here.\n const firstArg = process.argv[2]\n if (firstArg && !firstArg.startsWith('-') && SUBCOMMAND_NAMES.includes(firstArg))\n return\n\n const cwd = process.cwd()\n\n // Bare `skilld` — interactive menu (requires TTY)\n if (!isInteractive()) {\n const state = await getProjectState(cwd)\n const status = formatStatus(state.synced.length, state.outdated.length)\n console.log(`skilld v${version} · ${status}`)\n if (isRunningInsideAgent())\n console.log('Interactive wizard requires a standalone terminal (detected agent session).\\nUse `skilld add <pkg>` to add skills non-interactively, or run `npx skilld` in a separate terminal.')\n return\n }\n\n let currentAgent: AgentType | 'none' | null = resolveAgent(args.agent)\n\n if (!currentAgent) {\n currentAgent = await promptForAgent()\n if (!currentAgent)\n return\n }\n\n // No-agent mode: run wizard, then guide them\n if (currentAgent === 'none') {\n if (!hasCompletedWizard()) {\n if (!await runWizard())\n return\n }\n p.log.info(\n 'No agent selected - skills export as portable PROMPT_*.md files.\\n'\n + ' Run \\x1B[36mskilld add <pkg>\\x1B[0m to generate prompts for any package.\\n'\n + ' Run \\x1B[36mskilld config\\x1B[0m to set a target agent later.',\n )\n return\n }\n\n // After this point, agent is guaranteed to be a real AgentType\n const agent: AgentType = currentAgent\n\n // Animate brand while bootstrapping + check for updates\n let { state, selfUpdate } = await brandLoader(async () => {\n const config = readConfig()\n const state = await getProjectState(cwd)\n\n // Run self-update check + unmatched skills NPM check in parallel\n let selfUpdate = null as { latest: string, releasedAt?: string } | null\n const tasks: Promise<void>[] = []\n\n // Check if skilld itself has a newer version (skip for npx/dlx/bunx)\n const isEphemeral = process.env.npm_command === 'exec'\n if (!isEphemeral) {\n tasks.push(\n fetchNpmRegistryMeta('skilld', version).then((meta) => {\n const latestTag = meta.distTags?.latest\n if (latestTag && semverGt(latestTag.version, version))\n selfUpdate = { latest: latestTag.version, releasedAt: latestTag.releasedAt }\n }).catch(() => {}),\n )\n }\n\n // For skills not in local deps, check NPM for version updates\n if (state.unmatched.length > 0) {\n const limit = pLimit(5)\n tasks.push(\n Promise.all(state.unmatched.map(skill => limit(async () => {\n const pkgName = skill.info?.packageName || skill.name\n const latest = await fetchLatestVersion(pkgName)\n if (latest && isOutdated(skill, latest)) {\n state.outdated.push({ ...skill, packageName: pkgName, latestVersion: latest })\n }\n else if (latest) {\n state.synced.push({ ...skill, packageName: pkgName, latestVersion: latest })\n }\n }))).then(() => {}),\n )\n }\n\n await Promise.all(tasks)\n return { config, state, selfUpdate }\n })\n\n // Show self-update notification\n if (selfUpdate) {\n const released = selfUpdate.releasedAt ? `\\x1B[90m · ${relativeTime(new Date(selfUpdate.releasedAt))}\\x1B[0m` : ''\n const binPath = realpathSync(process.argv[1]!)\n const isLocal = binPath.startsWith(resolve(cwd, 'node_modules'))\n const flag = isLocal ? '' : ' -g'\n const cmd = `npx nypm add${flag} skilld@${selfUpdate.latest}`\n p.note(\n `\\x1B[90m${version}\\x1B[0m → \\x1B[1m\\x1B[32m${selfUpdate.latest}\\x1B[0m${released}\\n\\x1B[36m${cmd}\\x1B[0m`,\n '\\x1B[33mUpdate available\\x1B[0m',\n )\n }\n\n // First time setup or returning with no skills (e.g. cancelled last time)\n if (state.skills.length === 0) {\n if (!hasCompletedWizard()) {\n if (!await runWizard({ agent, showOutro: false }))\n return\n }\n else {\n p.log.step('No skills installed yet - pick some packages to get started.')\n }\n\n // Transition to project setup\n const pkgJsonPath = join(cwd, 'package.json')\n const projectPkg = readPackageJsonSafe(pkgJsonPath)\n const hasPkgJson = !!projectPkg\n const projectName = projectPkg?.parsed.name as string | undefined\n const projectLabel = projectName\n ? `Generating skills for \\x1B[36m${projectName}\\x1B[0m`\n : 'Generating skills for current directory'\n p.log.step(projectLabel)\n\n if (!hasPkgJson) {\n p.log.warn('No package.json found - enter npm package names manually.\\n For best results, run skilld inside a JS/TS project directory.')\n }\n\n if (state.shipped.length > 0) {\n const totalShipped = state.shipped.reduce((sum, s) => sum + s.skills.length, 0)\n const names = state.shipped.map(s => s.packageName).join(', ')\n p.log.info(`\\x1B[36m${totalShipped} ready-to-use skill${totalShipped > 1 ? 's' : ''}\\x1B[0m shipped by your dependencies: ${names}`)\n }\n\n p.log.info('Tip: Add skills for packages with complex APIs or frequent breaking changes - not every dependency needs one.')\n\n // Initial setup loop — allow user to go back\n let setupComplete = false\n while (!setupComplete) {\n const shippedOption = state.shipped.length > 0\n ? [{ label: 'Install shipped skills', value: 'shipped' as const, hint: `\\x1B[36m${state.shipped.reduce((sum, s) => sum + s.skills.length, 0)} ready to use\\x1B[0m` }]\n : []\n\n const source = hasPkgJson\n ? await p.select({\n message: 'How should I find packages?',\n options: [\n ...shippedOption,\n { label: 'Scan source files', value: 'imports', hint: 'find actually used imports' },\n { label: 'Use package.json', value: 'deps', hint: `all ${state.deps.size} dependencies` },\n { label: 'Enter manually', value: 'manual' },\n { label: 'Skip for now', value: 'skip', hint: 'add skills later with `skilld add <pkg>`' },\n ],\n })\n : 'manual' as const\n\n if (p.isCancel(source)) {\n p.cancel('Setup cancelled')\n return\n }\n\n if (source === 'skip') {\n p.log.info('Run \\x1B[36mskilld add <pkg>\\x1B[0m or \\x1B[36mskilld\\x1B[0m anytime to add skills.')\n return\n }\n\n if (source === 'shipped') {\n const { handleShippedSkills: installShipped } = await import('./commands/sync-shared.ts')\n for (const pkg of state.shipped) {\n const version = state.deps.get(pkg.packageName)?.replace(/^[\\^~>=<]+/, '') || '0.0.0'\n installShipped(pkg.packageName, version, cwd, agent, false)\n for (const sk of pkg.skills)\n p.log.success(`Installed shipped skill: ${sk.skillName}`)\n }\n state = await getProjectState(cwd)\n continue\n }\n\n // Get packages based on source\n let selected: string[]\n\n if (source === 'manual') {\n const input = await p.text({\n message: 'Enter package names (space or comma-separated)',\n placeholder: 'vue nuxt pinia',\n })\n if (p.isCancel(input)) {\n if (!hasPkgJson) {\n p.cancel('Setup cancelled')\n return\n }\n continue\n }\n if (!input) {\n p.log.warn('No packages entered')\n continue\n }\n selected = input.split(/[,\\s]+/).map(s => s.trim()).filter(Boolean)\n if (selected.length === 0) {\n p.log.warn('No valid packages entered')\n continue\n }\n }\n else {\n let usages: PackageUsage[]\n if (source === 'imports') {\n const spinner = timedSpinner()\n spinner.start('Scanning imports...')\n const result = await detectImportedPackages(cwd)\n\n if (result.packages.length === 0) {\n spinner.stop('No imports found, falling back to package.json')\n usages = Array.from(state.deps.keys(), name => ({ name, count: 0 }))\n }\n else {\n const depSet = new Set(state.deps.keys())\n usages = result.packages.filter(pkg => depSet.has(pkg.name) || pkg.source === 'preset')\n\n if (usages.length === 0) {\n spinner.stop(`Found ${result.packages.length} imported packages but none match dependencies`)\n usages = result.packages\n }\n else {\n spinner.stop(`Found ${usages.length} imported packages`)\n }\n }\n }\n else {\n usages = Array.from(state.deps.keys(), name => ({ name, count: 0 }))\n }\n\n // Let user select which packages\n const packages = usages.map(u => u.name)\n if (packages.length === 0) {\n p.log.warn('No packages found')\n continue\n }\n const sourceMap = new Map(usages.map(u => [u.name, u.source]))\n const maxLen = Math.max(...packages.map(n => n.length))\n // Pre-select frameworks and presets (most likely to benefit from skills)\n const preselect = packages.filter((name) => {\n if (sourceMap.get(name) === 'preset')\n return true\n // Common frameworks with complex/changing APIs\n const frameworks = new Set(['vue', 'nuxt', 'react', 'next', 'svelte', '@sveltejs/kit', 'astro', 'solid-js', 'angular', 'typescript', 'vite', 'vitest'])\n return frameworks.has(name)\n })\n\n const choice = await p.multiselect({\n message: `Select packages (${packages.length} found)`,\n options: packages.map((name) => {\n const ver = state.deps.get(name)?.replace(/^[\\^~>=<]/, '') || ''\n const repo = getRepoHint(name, cwd)\n const hint = sourceMap.get(name) === 'preset' ? 'nuxt module' : undefined\n const pad = ' '.repeat(maxLen - name.length + 2)\n const meta = [ver, hint, repo].filter(Boolean).join(' ')\n return { label: meta ? `${name}${pad}\\x1B[90m${meta}\\x1B[39m` : name, value: name }\n }),\n initialValues: preselect,\n })\n\n if (p.isCancel(choice)) {\n continue\n }\n if (choice.length === 0) {\n p.log.warn('No packages selected')\n continue\n }\n selected = choice\n }\n\n // Pass wizard-configured model so sync doesn't re-prompt.\n // Wizard already handled model selection - yes:true auto-resolves.\n const wizardConfig = readConfig()\n const { syncCommand } = await import('./commands/sync.ts')\n await syncCommand(state, {\n packages: selected,\n global: false,\n agent,\n model: wizardConfig.model as import('./agent/index.ts').OptimizeModel | undefined,\n yes: !wizardConfig.skipLlm,\n })\n setupComplete = true\n }\n\n // Show SKILL.md preview and verification for newly generated skills\n const postState = await getProjectState(cwd)\n const previewSkill = postState.skills[0]\n if (previewSkill) {\n const previewPath = join(cwd, agents[agent].skillsDir, previewSkill.name, 'SKILL.md')\n if (existsSync(previewPath)) {\n const previewContent = readFileSync(previewPath, 'utf-8')\n // eslint-disable-next-line no-control-regex, regexp/no-obscure-range\n const previewLines = previewContent.split('\\n').slice(0, 20).join('\\n').replace(/\\x1B\\[[0-?]*[ -/]*[@-~]/g, '').replace(/\\x1B\\].*?(?:\\x07|\\x1B\\\\)/g, '')\n const fileSize = (Buffer.byteLength(previewContent) / 1024).toFixed(1)\n p.note(\n `\\x1B[90m${previewLines}\\n...\\x1B[0m`,\n `${agents[agent].skillsDir}/${previewSkill.name}/SKILL.md (${fileSize} KB)`,\n )\n }\n }\n\n // First-run guidance with agent-specific verification tips\n const agentName = agents[agent].displayName\n const agentInstalled = detectInstalledAgents().includes(agent)\n const verifyTips: Record<string, string> = {\n 'claude-code': 'Start a new Claude Code session - skills load automatically.\\nOr type /skill-name to invoke a specific skill.',\n 'cursor': 'Restart Cursor to pick up new skills.\\nSkills appear in Settings > Cursor Rules.',\n 'github-copilot': 'Restart your editor to pick up new skills.\\nCopilot discovers skills from .github/skills/ at startup.',\n 'gemini-cli': 'Start a new Gemini CLI session.\\nVerify with /skills list.',\n 'codex': 'Start a new Codex session.\\nSkills in .agents/skills/ are discovered at startup.',\n 'windsurf': 'Restart Windsurf to pick up new skills.\\nSkills auto-invoke when their description matches your prompt.',\n 'cline': 'Restart your editor. Cline reads skill descriptions at startup.\\nFull content loads on-demand when the agent invokes use_skill.',\n 'goose': 'Start a new Goose session.\\nSkills are discovered automatically at startup.',\n 'amp': 'Start a new Amp session.\\nReads skill descriptions at startup, full content on invocation.',\n 'opencode': 'Start a new OpenCode session.\\nSkills are discovered automatically at startup.',\n 'roo': 'Restart your editor. Roo reads skill descriptions at startup.',\n }\n const verifyLine = agentInstalled\n ? (verifyTips[agent] ?? '')\n : `Skills are ready in ${agents[agent].skillsDir}/.\\n\\x1B[90m${agentName} was not detected on this machine.\\nInstall it to use these skills, or run \\`skilld config\\` to change agents.\\x1B[0m`\n\n // Build a \"try it\" suggestion that tests skill-specific knowledge\n const firstPkg = previewSkill?.info?.packageName || previewSkill?.name\n const trySuggestion = firstPkg\n ? `\\n\\n\\x1B[36mTry it:\\x1B[0m ask your agent \"What are the gotchas or breaking changes in ${firstPkg}?\"`\n : ''\n\n p.note(\n `${verifyLine}${trySuggestion}\\n\\n`\n + `Run \\x1B[36mskilld info\\x1B[0m to see installed skills.\\n`\n + `Run \\x1B[36mskilld\\x1B[0m again to add more, update, or search.`,\n `${agentName} - next steps`,\n )\n\n // Team advice: suggest prepare hook + lockfile\n try {\n await suggestPrepareHook(cwd)\n }\n catch (err) {\n p.log.warn(`Failed to suggest prepare hook: ${err instanceof Error ? err.message : String(err)}`)\n }\n return\n }\n\n // Has skills - show status + interactive menu\n const status = formatStatus(state.synced.length, state.outdated.length)\n p.log.info(status)\n\n let needsPrepareHook = !hasPrepareHook(cwd)\n if (needsPrepareHook) {\n p.log.warn(`\\x1B[33mNo prepare hook.\\x1B[0m Skills won't auto-restore on \\x1B[36mnpm install\\x1B[0m.`)\n }\n\n if (state.shipped.length > 0) {\n const totalSkills = state.shipped.reduce((sum, s) => sum + s.skills.length, 0)\n const names = state.shipped.map(s => s.packageName).join(', ')\n p.log.info(`\\x1B[36m${totalSkills} ready-to-use skill${totalSkills > 1 ? 's' : ''}\\x1B[0m shipped by your dependencies: ${names}`)\n }\n\n const refreshState = async () => {\n state = await getProjectState(cwd)\n }\n\n // Main menu — Escape in sub-actions returns to menu via guard()\n await menuLoop({\n message: 'What would you like to do?',\n options: () => {\n const opts: Array<{ label: string, value: string, hint?: string }> = []\n if (state.shipped.length > 0) {\n const total = state.shipped.reduce((sum, s) => sum + s.skills.length, 0)\n opts.push({ label: 'Install shipped skills', value: 'shipped', hint: `\\x1B[36m${total} available\\x1B[0m` })\n }\n opts.push({ label: 'Add new skills', value: 'install' })\n if (state.outdated.length > 0) {\n opts.push({ label: 'Update skills', value: 'update', hint: `\\x1B[33m${state.outdated.length} outdated\\x1B[0m` })\n }\n if (needsPrepareHook) {\n opts.push({ label: 'Setup prepare hook', value: 'prepare-hook', hint: '\\x1B[33mrecommended\\x1B[0m' })\n }\n opts.push(\n { label: 'Remove skills', value: 'remove' },\n { label: 'Search docs', value: 'search' },\n { label: 'Info', value: 'info' },\n { label: 'Configure', value: 'config' },\n )\n return opts\n },\n onSelect: async (action) => {\n switch (action) {\n case 'shipped': {\n const allShipped = state.shipped.flatMap(s => s.skills.map(sk => ({ packageName: s.packageName, ...sk })))\n const selected = guard(await p.multiselect({\n message: 'Select shipped skills to install',\n options: allShipped.map(s => ({\n label: s.skillName,\n value: s,\n hint: s.packageName,\n })),\n initialValues: allShipped,\n }))\n if (selected.length === 0)\n return\n const { handleShippedSkills: installShipped } = await import('./commands/sync-shared.ts')\n const seen = new Set<string>()\n for (const s of selected) {\n if (seen.has(s.packageName))\n continue\n seen.add(s.packageName)\n const version = state.deps.get(s.packageName)?.replace(/^[\\^~>=<]+/, '') || '0.0.0'\n installShipped(s.packageName, version, cwd, agent, false)\n }\n p.log.success(`Installed ${selected.length} shipped skill${selected.length > 1 ? 's' : ''}`)\n await refreshState()\n return true\n }\n case 'install': {\n const installedNames = new Set([\n ...state.synced.map(s => s.packageName),\n ...state.outdated.map(s => s.packageName),\n ].filter(Boolean) as string[])\n const uninstalledDeps = [...state.deps.keys()].filter(d => !installedNames.has(d))\n const allDepsInstalled = uninstalledDeps.length === 0\n const hasPkgJsonMenu = !!readPackageJsonSafe(join(cwd, 'package.json'))\n\n const source = hasPkgJsonMenu\n ? guard(await p.select({\n message: 'How should I find packages?',\n options: [\n { label: 'Scan source files', value: 'imports' as const, hint: allDepsInstalled ? 'all installed' : 'find actually used imports', disabled: allDepsInstalled },\n { label: 'Use package.json', value: 'deps' as const, hint: allDepsInstalled ? 'all installed' : `${uninstalledDeps.length} uninstalled`, disabled: allDepsInstalled },\n { label: 'Enter manually', value: 'manual' as const },\n ],\n }))\n : 'manual' as const\n\n let selected: string[]\n\n if (source === 'manual') {\n const input = guard(await p.text({\n message: 'Enter package names (space or comma-separated)',\n placeholder: 'vue nuxt pinia',\n }))\n if (!input)\n return\n selected = input.split(/[,\\s]+/).map(s => s.trim()).filter(Boolean)\n if (selected.length === 0)\n return\n }\n else {\n let usages: PackageUsage[]\n if (source === 'imports') {\n const spinner = timedSpinner()\n spinner.start('Scanning imports...')\n const result = await detectImportedPackages(cwd)\n\n if (result.packages.length === 0) {\n spinner.stop('No imports found, falling back to package.json')\n usages = uninstalledDeps.map(name => ({ name, count: 0 }))\n }\n else {\n const depSet = new Set(state.deps.keys())\n const matched = result.packages\n .filter(pkg => depSet.has(pkg.name) || pkg.source === 'preset')\n const alreadyInstalled = matched.filter(pkg => installedNames.has(pkg.name))\n usages = matched.filter(pkg => !installedNames.has(pkg.name))\n\n if (usages.length === 0) {\n spinner.stop('All detected imports already have skills')\n return\n }\n else {\n spinner.stop(`Found ${matched.length} imported packages`)\n if (alreadyInstalled.length > 0) {\n p.log.info(`${alreadyInstalled.length} already have skills installed`)\n }\n }\n }\n }\n else {\n usages = uninstalledDeps.map(name => ({ name, count: 0 }))\n }\n\n const packages = usages.map(u => u.name)\n if (packages.length === 0) {\n p.log.warn('No packages found')\n return\n }\n const usageMap = new Map(usages.map(u => [u.name, u]))\n const sourceMap = new Map(usages.map(u => [u.name, u.source]))\n const frameworks = new Set(['vue', 'nuxt', 'react', 'next', 'svelte', '@sveltejs/kit', 'astro', 'solid-js', 'angular', 'typescript', 'vite', 'vitest'])\n const maxLen = Math.max(...packages.map(n => n.length))\n const choice = guard(await p.multiselect({\n message: `Select packages your agent struggles with or that are new to you (${packages.length} found)`,\n options: packages.map((name) => {\n const ver = state.deps.get(name)?.replace(/^[\\^~>=<]/, '') || ''\n const repo = getRepoHint(name, cwd)\n const src = sourceMap.get(name)\n const hint = src === 'preset'\n ? 'nuxt module'\n : frameworks.has(name)\n ? 'framework'\n : (usageMap.get(name)?.count ?? 0) >= 5\n ? `${usageMap.get(name)!.count} imports`\n : undefined\n const pad = ' '.repeat(maxLen - name.length + 2)\n const meta = [ver, hint, repo].filter(Boolean).join(' ')\n return { label: meta ? `${name}${pad}\\x1B[90m${meta}\\x1B[39m` : name, value: name }\n }),\n initialValues: [],\n }))\n\n if (choice.length === 0)\n return\n selected = choice\n }\n\n const { syncCommand: sync } = await import('./commands/sync.ts')\n await sync(state, {\n packages: selected,\n global: false,\n agent,\n yes: false,\n })\n await refreshState()\n return true\n }\n case 'update': {\n if (state.outdated.length === 0) {\n p.log.success('All skills up to date')\n return true\n }\n const selected = guard(await p.multiselect({\n message: 'Select packages to update',\n options: state.outdated.map(s => ({\n label: s.name,\n value: s.packageName || s.name,\n hint: `${s.info?.version ?? 'unknown'} → ${s.latestVersion}`,\n })),\n initialValues: state.outdated.map(s => s.packageName || s.name),\n }))\n if (selected.length === 0)\n return\n const { syncCommand: syncUpdate } = await import('./commands/sync.ts')\n await syncUpdate(state, {\n packages: selected,\n global: false,\n agent,\n yes: false,\n mode: 'update',\n })\n await refreshState()\n return true\n }\n case 'remove': {\n // Check if global skills exist to offer scope choice\n const globalSkills = [...iterateSkills({ scope: 'global' })]\n let removeGlobal = false\n if (globalSkills.length > 0) {\n const scope = guard(await p.select({\n message: 'Which skills?',\n options: [\n { label: 'Project skills', value: 'local' as const },\n { label: 'Global skills', value: 'global' as const, hint: `${globalSkills.length} installed` },\n ],\n }))\n removeGlobal = scope === 'global'\n }\n await removeCommand(state, {\n global: removeGlobal,\n agent,\n yes: false,\n })\n await refreshState()\n break\n }\n case 'search': {\n const { interactiveSearch } = await import('./commands/search-interactive.ts')\n await interactiveSearch()\n break\n }\n case 'info':\n await statusCommand({ global: false })\n break\n case 'config':\n await configCommand()\n await refreshState()\n break\n case 'prepare-hook': {\n const added = await suggestPrepareHook(cwd)\n if (added)\n needsPrepareHook = false\n break\n }\n }\n },\n })\n },\n})\n\nrunMain(main)\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli.mjs","names":["agents","skilldVersion","agents","agents"],"sources":["../src/commands/config.ts","../src/commands/remove.ts","../src/commands/status.ts","../src/ui.ts","../src/cli.ts"],"sourcesContent":["import type { OptimizeModel } from '../agent/index.ts'\nimport type { FeaturesConfig } from '../core/config.ts'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { getOAuthProviderList, loginOAuthProvider, logoutOAuthProvider } from '../agent/clis/pi-ai.ts'\nimport { agents, detectTargetAgent, getAvailableModels, getModelName } from '../agent/index.ts'\nimport { guard, introLine, menuLoop, NO_MODELS_MESSAGE, OAUTH_NOTE, pickModel, requireInteractive } from '../cli-helpers.ts'\nimport { defaultFeatures, readConfig, updateConfig } from '../core/config.ts'\nimport { getProjectState } from '../core/skills.ts'\n\nexport async function configCommand(): Promise<void> {\n const initConfig = readConfig()\n const agentId = initConfig.agent || detectTargetAgent() || undefined\n const cyan = (s: string) => `\\x1B[36m${s}\\x1B[90m`\n const modelLabel = initConfig.skipLlm\n ? 'skip'\n : initConfig.model\n ? cyan(getModelName(initConfig.model))\n : 'auto'\n const agentLabel = agentId && agents[agentId as keyof typeof agents]\n ? cyan(agents[agentId as keyof typeof agents].displayName)\n : 'auto-detect'\n p.note(`\\x1B[90mFetch docs → Enhance with ${modelLabel} → Install to ${agentLabel}\\x1B[0m`, 'How skilld works')\n\n await menuLoop({\n message: 'Settings',\n options: () => {\n const config = readConfig()\n const features = config.features ?? defaultFeatures\n const enabledCount = Object.values(features).filter(Boolean).length\n const modelHint = config.skipLlm\n ? 'disabled'\n : config.model\n ? getModelName(config.model)\n : 'auto'\n const oauthProviders = getOAuthProviderList()\n const options = [\n { label: 'Data sources', value: 'features', hint: `${enabledCount}/4 enabled · issues, releases, search, discussions` },\n ]\n if (oauthProviders.length > 0) {\n const connectedOAuth = oauthProviders.filter(pr => pr.loggedIn).length\n const oauthHint = connectedOAuth > 0 ? `${connectedOAuth} connected` : 'none'\n options.push({ label: 'OAuth providers', value: 'oauth', hint: `${oauthHint} · ⚠ may violate provider ToS` })\n }\n options.push(\n { label: 'Enhancement model', value: 'model', hint: `${modelHint} · rewrites SKILL.md with best practices` },\n { label: 'Target agent', value: 'agent', hint: `${config.agent || 'auto-detect'} · where skills are installed` },\n )\n return options\n },\n onSelect: async (action) => {\n switch (action) {\n case 'features': {\n const config = readConfig()\n const features = config.features ?? defaultFeatures\n const selected = guard(await p.multiselect({\n message: 'Data sources',\n options: [\n { label: 'Semantic + token search', value: 'search' as const, hint: 'local query engine to cut token costs and speed up grep' },\n { label: 'Release notes', value: 'releases' as const, hint: 'track changelogs for installed packages' },\n { label: 'GitHub issues', value: 'issues' as const, hint: 'surface common problems and solutions' },\n { label: 'GitHub discussions', value: 'discussions' as const, hint: 'include Q&A and community knowledge' },\n ],\n initialValues: Object.entries(features)\n .filter(([, v]) => v)\n .map(([k]) => k) as Array<keyof FeaturesConfig>,\n required: false,\n }))\n updateConfig({\n features: {\n search: selected.includes('search'),\n issues: selected.includes('issues'),\n discussions: selected.includes('discussions'),\n releases: selected.includes('releases'),\n },\n })\n p.log.success(`Data sources updated: ${selected.length} enabled`)\n break\n }\n\n case 'oauth': {\n await configureOAuth()\n break\n }\n\n case 'model': {\n await configureModel()\n break\n }\n\n case 'agent': {\n const config = readConfig()\n const agentChoice = guard(await p.select({\n message: 'Target agent — where should skills be installed?',\n options: [\n { label: 'Auto-detect', value: '' },\n ...Object.entries(agents).map(([id, a]) => ({\n label: a.displayName,\n value: id,\n hint: a.skillsDir,\n })),\n ],\n initialValue: config.agent || '',\n }))\n updateConfig({ agent: agentChoice || undefined })\n p.log.success(agentChoice ? `Target agent set to ${agentChoice}` : 'Target agent will be auto-detected')\n break\n }\n }\n },\n })\n}\n\nasync function configureOAuth(): Promise<void> {\n p.note(OAUTH_NOTE, 'How OAuth works')\n\n await menuLoop({\n message: 'OAuth providers',\n options: () => {\n const providers = getOAuthProviderList()\n return providers.map(pr => ({\n label: pr.name,\n value: pr.id,\n hint: pr.loggedIn ? '\\x1B[32mconnected\\x1B[0m' : 'not connected',\n }))\n },\n onSelect: async (providerId) => {\n const providers = getOAuthProviderList()\n const pr = providers.find(p2 => p2.id === providerId)\n if (!pr)\n return\n\n if (pr.loggedIn) {\n const action = guard(await p.select({\n message: pr.name,\n options: [\n { label: 'Disconnect', value: 'disconnect' },\n { label: 'Back', value: 'back' },\n ],\n }))\n if (action === 'disconnect') {\n logoutOAuthProvider(providerId as string)\n p.log.success(`Disconnected from ${pr.name}`)\n }\n return\n }\n\n const spinner = p.spinner()\n spinner.start('Connecting...')\n\n const success = await loginOAuthProvider(providerId as string, {\n onAuth: (url, instructions) => {\n spinner.stop('Open this URL in your browser:')\n p.log.info(` \\x1B[36m${url}\\x1B[0m`)\n if (instructions)\n p.log.info(` \\x1B[90m${instructions}\\x1B[0m`)\n spinner.start('Waiting for authentication...')\n },\n onPrompt: async (message, placeholder) => {\n const value = await p.text({ message, placeholder })\n if (p.isCancel(value))\n return ''\n return value as string\n },\n onProgress: msg => p.log.step(msg),\n }).catch((err: Error) => {\n spinner.stop(`Login failed: ${err.message}`)\n return false\n })\n\n spinner.stop()\n if (success)\n p.log.success(`Connected to ${pr.name}`)\n },\n })\n}\n\n// ── Model selection ──────────────────────────────────────────────────\n\nasync function configureModel(): Promise<void> {\n // Loop so user can connect OAuth and come back to pick a model\n while (true) {\n const available = await getAvailableModels()\n\n if (available.length === 0)\n p.log.warn(NO_MODELS_MESSAGE)\n\n const oauthProviders = getOAuthProviderList()\n const afterOptions = oauthProviders.length > 0\n ? [\n { label: '⚠ Connect OAuth provider...', value: '_connect', hint: 'may violate provider ToS' },\n { label: 'Skip enhancement', value: '_skip', hint: 'base skill with docs, issues, and types' },\n ]\n : [\n { label: 'Skip enhancement', value: '_skip', hint: 'base skill with docs, issues, and types' },\n ]\n\n const choice = await pickModel(available, {\n before: available.length > 0\n ? [{ label: 'Auto', value: '_auto', hint: 'picks best available model from connected providers' }]\n : [],\n after: afterOptions,\n })\n\n if (!choice)\n return\n\n if (choice === '_connect') {\n await configureOAuth()\n continue\n }\n\n if (choice === '_skip') {\n updateConfig({ model: undefined, skipLlm: true })\n p.log.success('Enhancement disabled - skills will use raw docs only')\n }\n else if (choice === '_auto') {\n updateConfig({ model: undefined, skipLlm: false })\n p.log.success('Enhancement model will be auto-selected')\n }\n else {\n updateConfig({ model: choice as OptimizeModel, skipLlm: false })\n p.log.success(`Enhancement model set to ${getModelName(choice as OptimizeModel)}`)\n }\n return\n }\n}\n\nexport const configCommandDef = defineCommand({\n meta: { name: 'config', description: 'Edit settings' },\n args: {},\n async run() {\n requireInteractive('config')\n const cwd = process.cwd()\n const state = await getProjectState(cwd)\n p.intro(introLine({ state }))\n return configCommand()\n },\n})\n","import type { AgentType } from '../agent/index.ts'\nimport type { ProjectState, SkillEntry } from '../core/skills.ts'\nimport { existsSync, rmSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { unlinkSkillFromAgents } from '../agent/index.ts'\nimport { getInstalledGenerators, introLine, isInteractive, promptForAgent, resolveAgent, sharedArgs } from '../cli-helpers.ts'\nimport { readConfig } from '../core/config.ts'\nimport { removeLockEntry } from '../core/lockfile.ts'\nimport { resolveSkillName } from '../core/prefix.ts'\nimport { getSharedSkillsDir } from '../core/shared.ts'\nimport { getProjectState, getSkillsDir, iterateSkills } from '../core/skills.ts'\n\nexport interface RemoveOptions {\n packages?: string[]\n global: boolean\n agent: AgentType\n yes: boolean\n}\n\nexport async function removeCommand(state: ProjectState, opts: RemoveOptions): Promise<void> {\n // Get skills from the appropriate scope\n const scope = opts.global ? 'global' : 'local'\n const allSkills = [...iterateSkills({ scope })]\n\n // Non-interactive without packages → error\n if (!isInteractive() && !opts.packages) {\n console.error('Error: `skilld remove` requires package names in non-interactive mode.\\n Usage: skilld remove <package...>')\n process.exit(1)\n }\n\n // Get skills to choose from\n const skills = opts.packages\n ? allSkills.filter(s => opts.packages!.includes(s.name))\n : await pickSkillsToRemove(allSkills, scope)\n\n if (!skills || skills.length === 0) {\n p.log.info('No skills selected')\n return\n }\n\n // Confirm deletion (skip in non-interactive)\n if (!opts.yes && isInteractive()) {\n const confirmed = await p.confirm({\n message: `Remove ${skills.length} skill(s)? ${skills.map(s => s.name).join(', ')}`,\n })\n\n if (p.isCancel(confirmed) || !confirmed) {\n p.cancel('Cancelled')\n return\n }\n }\n\n // Delete each skill\n const cwd = process.cwd()\n const shared = getSharedSkillsDir(cwd)\n for (const skill of skills) {\n const skillsDir = getSkillsDir(skill.agent, skill.scope)\n\n if (existsSync(skill.dir)) {\n rmSync(skill.dir, { recursive: true, force: true })\n removeLockEntry(skillsDir, skill.name)\n // Clean up per-agent symlinks when removing from shared dir\n if (shared && skill.scope === 'local')\n unlinkSkillFromAgents(skill.name, cwd, opts.agent)\n p.log.success(`Removed ${skill.name}`)\n }\n else {\n p.log.warn(`${skill.name} not found`)\n }\n }\n\n p.outro(`Removed ${skills.length} skill(s)`)\n}\n\nasync function pickSkillsToRemove(skills: SkillEntry[], scope: 'local' | 'global'): Promise<SkillEntry[] | null> {\n if (skills.length === 0) {\n p.log.warn(`No ${scope} skills installed`)\n return null\n }\n\n const options = skills.map(skill => ({\n label: skill.name,\n value: skill.name,\n hint: skill.info?.version ? `@${skill.info.version}` : undefined,\n }))\n\n const selected = await p.multiselect({\n message: 'Select skills to remove',\n options,\n required: false,\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Cancelled')\n return null\n }\n\n const selectedSet = new Set(selected as string[])\n return skills.filter(s => selectedSet.has(s.name))\n}\n\nexport const removeCommandDef = defineCommand({\n meta: { name: 'remove', description: 'Remove installed skills' },\n args: {\n package: {\n type: 'positional',\n description: 'Package(s) to remove (space-separated)',\n required: false,\n },\n ...sharedArgs,\n },\n async run({ args }) {\n const cwd = process.cwd()\n let agent = resolveAgent(args.agent)\n if (!agent || agent === 'none') {\n if (agent === 'none')\n return\n const picked = await promptForAgent()\n if (!picked || picked === 'none')\n return\n agent = picked\n }\n\n const state = await getProjectState(cwd)\n const generators = getInstalledGenerators()\n const config = readConfig()\n const scope = args.global ? 'global' : 'project'\n const intro = { state, generators, modelId: config.model, agentId: agent || config.agent || undefined }\n p.intro(`${introLine(intro)} · remove (${scope})`)\n\n // Collect packages from positional args (strip npm:/gh: prefixes)\n const packages = args.package\n ? [...new Set(\n [args.package, ...((args as any)._ || [])]\n .map((s: string) => s.trim())\n .filter(Boolean)\n .map((s) => {\n const name = resolveSkillName(s)\n if (!name) {\n p.log.warn(`Cannot remove \\x1B[36m${s}\\x1B[0m: curator/collection inputs are not addressable here.`)\n return null\n }\n return name\n })\n .filter((s): s is string => s !== null),\n )]\n : undefined\n\n return removeCommand(state, {\n packages,\n global: args.global,\n agent,\n yes: args.yes,\n })\n },\n})\n","import type { AgentType } from '../agent/index.ts'\nimport type { SkillInfo } from '../core/lockfile.ts'\nimport { existsSync, readdirSync, statSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { join } from 'pathe'\nimport { agents, getAgentVersion } from '../agent/index.ts'\nimport { CACHE_DIR, getPackageDbPath } from '../cache/index.ts'\nimport { getCacheDir } from '../cache/version.ts'\nimport { sharedArgs } from '../cli-helpers.ts'\nimport { defaultFeatures, hasConfig, readConfig } from '../core/config.ts'\nimport { formatSource, timeAgo } from '../core/formatting.ts'\nimport { parsePackages } from '../core/lockfile.ts'\nimport { toStoragePackageName } from '../core/prefix.ts'\nimport { getSharedSkillsDir, mapInsert } from '../core/shared.ts'\n\nimport { iterateSkills } from '../core/skills.ts'\nimport { version as skilldVersion } from '../version.ts'\n\nexport interface StatusOptions {\n global?: boolean\n}\n\ninterface TrackedPackage {\n name: string\n info: SkillInfo\n agents: Set<AgentType>\n scope: 'local' | 'global'\n}\n\nfunction countDocs(packageName: string, version?: string): number {\n if (!version)\n return 0\n const cacheDir = getCacheDir(packageName, version)\n if (!existsSync(cacheDir))\n return 0\n let count = 0\n const walk = (dir: string, depth = 0) => {\n if (depth > 3)\n return\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.name === 'search.db')\n continue\n if (entry.isDirectory())\n walk(join(dir, entry.name), depth + 1)\n else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx'))\n count++\n }\n }\n catch {}\n }\n walk(cacheDir)\n return count\n}\n\nasync function countEmbeddings(packageName: string, version?: string): Promise<number | null> {\n if (!version)\n return null\n const dbPath = getPackageDbPath(packageName, version)\n if (!existsSync(dbPath))\n return null\n try {\n const { DatabaseSync } = await import('node:sqlite')\n const db = new DatabaseSync(dbPath, { open: true, readOnly: true })\n try {\n const row = db.prepare('SELECT count(*) as cnt FROM vector_metadata').get() as { cnt: number } | undefined\n return row?.cnt ?? null\n }\n finally {\n db.close()\n }\n }\n catch {\n return null\n }\n}\n\nfunction countRefDocs(skillDir: string): number {\n const refsDir = join(skillDir, '.skilld')\n if (!existsSync(refsDir))\n return 0\n let count = 0\n const walk = (dir: string, depth = 0) => {\n if (depth > 3)\n return\n try {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n if (entry.isDirectory() || entry.isSymbolicLink()) {\n try {\n const stat = statSync(join(dir, entry.name))\n if (stat.isDirectory())\n walk(join(dir, entry.name), depth + 1)\n }\n catch { continue }\n }\n else if (entry.name.endsWith('.md') || entry.name.endsWith('.mdx')) {\n count++\n }\n }\n }\n catch {}\n }\n walk(refsDir)\n return count\n}\n\n// dim helper\nconst dim = (s: string) => `\\x1B[90m${s}\\x1B[0m`\nconst bold = (s: string) => `\\x1B[1m${s}\\x1B[0m`\nconst green = (s: string) => `\\x1B[32m${s}\\x1B[0m`\n\nfunction getLastSynced(): string | null {\n let latest: Date | null = null\n for (const skill of iterateSkills()) {\n if (skill.info?.syncedAt) {\n const d = new Date(skill.info.syncedAt)\n if (!latest || d > latest)\n latest = d\n }\n }\n if (!latest)\n return null\n return timeAgo(latest.toISOString())\n}\n\nfunction buildConfigLines(): string[] {\n const config = readConfig()\n const lines: string[] = []\n\n lines.push(`Version v${skilldVersion}`)\n const lastSynced = getLastSynced()\n if (lastSynced)\n lines.push(`Synced ${dim(lastSynced)}`)\n const shared = getSharedSkillsDir()\n if (shared)\n lines.push(`Shared ${dim(shared)}`)\n lines.push(`Config ${dim(join(CACHE_DIR, 'config.yaml'))}${hasConfig() ? '' : dim(' (not created)')}`)\n lines.push(`Cache ${dim(CACHE_DIR)}`)\n\n const withCli = Object.entries(agents).filter(([_, a]) => a.cli) as [AgentType, typeof agents[AgentType]][]\n const installed: string[] = []\n for (const [id, agent] of withCli) {\n const ver = getAgentVersion(id)\n if (ver)\n installed.push(`${agent.displayName} v${ver}`)\n }\n if (installed.length > 0)\n lines.push(`Agents ${installed.join(', ')}`)\n\n if (config.model)\n lines.push(`Model ${config.model}`)\n\n const features = { ...defaultFeatures, ...config.features }\n const parts = Object.entries(features).map(([k, v]) => `${k}: ${v ? green('on') : dim('off')}`)\n lines.push(`Features ${parts.join(', ')}`)\n\n if (config.projects?.length)\n lines.push(`Projects ${config.projects.length} registered`)\n\n return lines\n}\n\nexport async function statusCommand(opts: StatusOptions = {}): Promise<void> {\n const allSkills = [...iterateSkills({ scope: opts.global ? 'global' : 'all' })]\n\n // Config section\n p.log.step(bold('Skilld Config'))\n p.log.message(buildConfigLines().join('\\n'))\n\n if (allSkills.length === 0) {\n p.log.step(bold('Skills'))\n p.log.message(`${dim('(none)')}\\n\\nRun ${bold('skilld add <package>')} to install skills`)\n return\n }\n\n // Deduplicate by package identity, grouped by scope\n const localPkgs = new Map<string, TrackedPackage>()\n const globalPkgs = new Map<string, TrackedPackage>()\n\n for (const skill of allSkills) {\n const key = skill.info?.packageName || skill.name\n const map = skill.scope === 'local' ? localPkgs : globalPkgs\n\n const entry = mapInsert(map, key, () => ({\n name: skill.name,\n info: skill.info || {},\n agents: new Set<AgentType>(),\n scope: skill.scope,\n }))\n entry.agents.add(skill.agent)\n }\n\n const buildPackageLines = async (pkgs: Map<string, TrackedPackage>): Promise<string[]> => {\n const lines: string[] = []\n for (const [, pkg] of pkgs) {\n const { info } = pkg\n const isShipped = info.source === 'shipped'\n const icon = isShipped ? '▶' : '◆'\n\n const pkgsList = parsePackages(info.packages)\n const nameDisplay = pkgsList.length > 1\n ? `${pkg.name} ${dim(`(${pkgsList.map(p => p.name).join(', ')})`)}`\n : pkg.name\n const parts = [`${icon} ${bold(nameDisplay)}`]\n if (info.version)\n parts.push(dim(info.version))\n const source = formatSource(info.source)\n if (source && source !== 'shipped')\n parts.push(dim(source))\n\n lines.push(parts.join(' '))\n\n const meta: string[] = []\n const pkgName = toStoragePackageName(info.packageName || pkg.name)\n const docs = countDocs(pkgName, info.version) || countRefDocs(join(\n pkg.scope === 'global'\n ? agents[pkg.agents.values().next().value!].globalSkillsDir!\n : join(process.cwd(), agents[pkg.agents.values().next().value!].skillsDir),\n pkg.name,\n ))\n if (docs > 0)\n meta.push(`${docs} docs`)\n\n const embeddings = await countEmbeddings(pkgName, info.version)\n if (embeddings !== null)\n meta.push(`${embeddings} chunks`)\n\n const ago = timeAgo(info.syncedAt)\n if (ago)\n meta.push(`synced ${ago}`)\n\n if (pkg.agents.size > 0) {\n const agentNames = Array.from(pkg.agents, a => agents[a].displayName)\n meta.push(agentNames.join(', '))\n }\n\n if (meta.length > 0)\n lines.push(` ${dim(meta.join(' · '))}`)\n }\n return lines\n }\n\n if (!opts.global && localPkgs.size > 0) {\n p.log.step(`${bold('Local')} (project)`)\n p.log.message((await buildPackageLines(localPkgs)).join('\\n'))\n }\n\n if (globalPkgs.size > 0) {\n p.log.step(bold('Global'))\n p.log.message((await buildPackageLines(globalPkgs)).join('\\n'))\n }\n\n if (!opts.global && localPkgs.size === 0) {\n p.log.step(`${bold('Local')} (project)`)\n p.log.message(dim('(none)'))\n }\n\n const total = localPkgs.size + globalPkgs.size\n p.log.info(`${total} package${total !== 1 ? 's' : ''}`)\n}\n\nexport const infoCommandDef = defineCommand({\n meta: { name: 'info', description: 'Show skill info and config' },\n args: {\n global: sharedArgs.global,\n },\n run({ args }) {\n return statusCommand({ global: args.global })\n },\n})\n","// ─────────────────────────────────────────────────────────────────────────────\n// skilld brand animation\n//\n// Animated braille noise field used as the CLI loader and intended as a\n// reference for porting the effect to the skilld.dev website (canvas/WebGL).\n//\n// ── Visual structure ─────────────────────────────────────────────────────────\n//\n// The animation is a 10×3 grid of Unicode Braille characters (U+2800 block).\n// Row 1 (middle) is split: 2 chars noise | ⏶ skilld | 2 chars noise | version.\n// The rose chevron mark (⏶ in #fb7185) sits inline next to the wordmark.\n//\n// ⣿⡿⣷⣾⣽⣻⢿⡷⣯⣟\n// ⣷⣾ ⏶ skilld ⢿⡷ v1.5.5\n// ⡿⣷⣾⣽⣻⢿⡷⣯⣟⡾\n//\n// ── Color system ─────────────────────────────────────────────────────────────\n//\n// Each project gets a deterministic hue seeded from `cwd` via djb2 hash.\n// This means the noise field is a different color per project while staying\n// consistent across runs. Saturation and lightness scale with brightness\n// so dim pixels are muted and bright pixels are vivid.\n//\n// Brand mark color: #fb7185 (rose-400, rgb 251 113 133)\n//\n// To port to web: seed the hue from the page URL or user session instead\n// of cwd. Use HSL directly in CSS/canvas rather than the manual conversion.\n//\n// ── Noise characters ─────────────────────────────────────────────────────────\n//\n// NOISE_CHARS is a curated set of Braille characters with varying dot\n// densities. At low brightness, a random sparse character is picked.\n// At high density (approaching 1), all pixels converge to ⣿ (all 8 dots).\n// Below a brightness threshold of 0.08, the cell is empty (space).\n//\n// For web: map this to opacity/scale of a dot grid, particle field, or\n// canvas noise. The density parameter controls the fill ratio.\n//\n// ── Brightness / ripple model ────────────────────────────────────────────────\n//\n// `brightness(x, y)` computes per-cell brightness as the sum of 3 expanding\n// rings radiating outward from the grid center (cx=5, cy=1).\n//\n// Each ring:\n// 1. Starts at a staggered time offset (ring * 0.5s apart)\n// 2. Expands outward: `front = elapsed * 4` (speed in cells/sec)\n// 3. Brightness falls off as a Gaussian of distance from the ring front,\n// multiplied by an exponential time decay so older rings fade.\n//\n// After ~1.5s a low ambient \"base\" fades in with random jitter, filling\n// the grid with a subtle shimmer once the initial ripples pass.\n//\n// For web: use requestAnimationFrame with the same math. The `t` parameter\n// is seconds since animation start. Ring count, speed, and decay constants\n// are tunable. Y coordinates are scaled by 3× because terminal cells are\n// taller than wide; on a square pixel grid remove the `* 3` factor.\n//\n// ── Animation phases ─────────────────────────────────────────────────────────\n//\n// 1. **Ripple** (main loop): rings expand from center, status text below.\n// Runs at ~16fps (60ms interval) until the async work completes\n// (minimum 1.5s so the animation is always visible).\n//\n// 2. **Fill outro** (500ms): `floor` and `density` ramp from 0→1 with a\n// quadratic ease-in. Floor raises the minimum brightness so all cells\n// light up; density drives characters toward ⣿ (fully filled).\n// Creates a satisfying \"solidify\" effect as the loader finishes.\n//\n// 3. **Final frame**: frozen at full density (floor=0.9, density=1).\n// `logUpdate.done()` prints this frame permanently and clears the\n// updatable region.\n//\n// For web: map floor → minimum opacity, density → blur reduction or\n// particle consolidation. The eased ramp `p * p` gives a natural feel.\n//\n// ── Key constants ────────────────────────────────────────────────────────────\n//\n// NOISE_CHARS Braille glyphs sorted roughly by visual weight\n// BRAND_MARK Rose chevron ⏶ in #fb7185, the skilld logo mark\n// BRAND_HUE Per-project hue in [0,1], seeded from cwd\n// cx=5, cy=1 Ripple origin (grid center)\n// ring count=3 Number of concentric expanding rings\n// ring gap=0.5 Seconds between ring starts\n// ring speed=4 Cells per second expansion rate\n// base onset Ambient shimmer starts after 1.5s\n// outroMs=500 Duration of the fill-in outro\n// minMs=1500 Minimum animation duration before work result shows\n// ─────────────────────────────────────────────────────────────────────────────\n\nimport logUpdate from 'log-update'\nimport { version } from './version.ts'\n\n// Braille glyphs with varying dot densities, from dense to sparse\nconst NOISE_CHARS = '⣿⡿⣷⣾⣽⣻⢿⡷⣯⣟⡾⣵⣳⢾⡽⣞⡷⣝⢯'\n\n// djb2 string hash, used to seed a stable per-project hue from cwd\nfunction djb2(s: string): number {\n let h = 5381\n for (let i = 0; i < s.length; i++)\n h = ((h << 5) + h + s.charCodeAt(i)) >>> 0\n return h\n}\n\n// Manual HSL→RGB, one channel at a time (no dependencies)\nfunction hueToChannel(p: number, q: number, t: number): number {\n const t1 = t < 0 ? t + 1 : t > 1 ? t - 1 : t\n if (t1 < 1 / 6)\n return p + (q - p) * 6 * t1\n if (t1 < 1 / 2)\n return q\n if (t1 < 2 / 3)\n return p + (q - p) * (2 / 3 - t1) * 6\n return p\n}\n\n// Returns [r, g, b] each 0–255. h in [0,1], s/l in [0,1].\nfunction hsl(h: number, s: number, l: number): [number, number, number] {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s\n const p = 2 * l - q\n return [\n Math.round(hueToChannel(p, q, h + 1 / 3) * 255),\n Math.round(hueToChannel(p, q, h) * 255),\n Math.round(hueToChannel(p, q, h - 1 / 3) * 255),\n ]\n}\n\n// Per-project hue: hash cwd → map to [0,1] hue range\nconst BRAND_HUE = (djb2(process.cwd()) % 360) / 360\n\n// Render a single braille noise cell with ANSI truecolor.\n// brightness [0,1] controls lightness; density [0,1] biases toward ⣿.\n// Below 0.08 brightness the cell is blank (space).\nfunction noiseChar(brightness: number, density = 0): string {\n if (brightness < 0.08)\n return ' '\n const b = Math.min(brightness, 1)\n const ch = Math.random() < density ? '⣿' : NOISE_CHARS[Math.floor(Math.random() * NOISE_CHARS.length)]\n // Saturation and lightness both scale with brightness so dim = muted, bright = vivid\n const [r, g, bl] = hsl(BRAND_HUE, 0.4 + b * 0.15, 0.35 + b * 0.25)\n return `\\x1B[38;2;${r};${g};${bl}m${ch}`\n}\n\n// Render a horizontal row of noise cells, each with brightness from `brightnessFn(x)`\nfunction noiseLine(len: number, brightnessFn: (x: number) => number, density = 0): string {\n let s = ''\n for (let i = 0; i < len; i++)\n s += noiseChar(brightnessFn(i), density)\n return `${s}\\x1B[0m`\n}\n\n// Rose chevron mark from the skilld.dev logo: ⏶ in #fb7185\nconst BRAND_MARK = '\\x1B[38;2;251;113;133m⏶\\x1B[0m'\n\n// Compose a single animation frame.\n// t = seconds elapsed, floor = minimum brightness, density = fill bias.\n// Returns a 3-line string with %NAME% and %VER% placeholders.\nexport function brandFrame(t: number, floor = 0, density = 0): string {\n const cx = 5 // ripple origin x (grid center)\n const cy = 1 // ripple origin y (middle row)\n\n // Per-cell brightness: sum of 3 expanding ring wavefronts + ambient base\n const brightness = (x: number, y: number) => {\n // Distance from ripple center; y scaled 3× because terminal cells are ~3:1 aspect\n const d = Math.sqrt((x - cx) ** 2 + ((y - cy) * 3) ** 2)\n let val = 0\n for (let ring = 0; ring < 3; ring++) {\n const rt = t - ring * 0.5 // staggered start: each ring 0.5s after the last\n if (rt <= 0)\n continue\n const front = rt * 4 // ring expands at 4 cells/sec\n const proximity = Math.abs(d - front)\n // Gaussian falloff from ring front × exponential time decay\n val += Math.exp(-proximity * proximity * 0.8) * Math.exp(-rt * 0.4)\n }\n // After 1.5s, fade in low ambient shimmer with random jitter\n const base = Math.max(0, (t - 1.5) * 0.3) * (Math.random() * 0.3 + 0.1)\n return Math.min(1, Math.max(floor, val + base))\n }\n\n return [\n noiseLine(10, x => brightness(x, 0), density),\n `${noiseLine(2, x => brightness(x, 1), density)} ${BRAND_MARK} %NAME% ${noiseLine(2, x => brightness(x + 8, 1), density)} %VER%`,\n noiseLine(10, x => brightness(x, 2), density),\n ].join('\\n')\n}\n\n// Run an async task with the brand animation as a loader.\n// The animation plays for at least `minMs` so it's always visible.\n// Set SKILLD_EFFECT=none to skip the animation entirely.\nexport async function brandLoader<T>(work: () => Promise<T>, minMs = 1500): Promise<T> {\n if (process.env.SKILLD_EFFECT === 'none')\n return work()\n\n const name = '\\x1B[1m\\x1B[38;2;255;255;255mskilld\\x1B[0m'\n const verStr = `\\x1B[2mv${version}\\x1B[0m`\n const status = '\\x1B[2mSetting up your environment\\x1B[0m'\n const start = Date.now()\n\n const sub = (raw: string) => raw.replace('%NAME%', name).replace('%VER%', verStr)\n\n let done = false\n const result = Promise.all([\n work(),\n new Promise<void>(r => setTimeout(r, minMs)),\n ]).then(([v]) => {\n done = true\n return v\n })\n\n // Phase 1: Ripple — rings expand from center at ~16fps\n // eslint-disable-next-line no-unmodified-loop-condition -- modified async in .then()\n while (!done) {\n const t = (Date.now() - start) / 1000\n logUpdate(`\\n ${sub(brandFrame(t))}\\n\\n ${status}`)\n await new Promise(r => setTimeout(r, 60))\n }\n\n // Phase 2: Fill outro — floor and density ramp up with quadratic ease\n const outroMs = 500\n const outroStart = Date.now()\n const tFinal = (outroStart - start) / 1000\n while (Date.now() - outroStart < outroMs) {\n const p = (Date.now() - outroStart) / outroMs\n const eased = p * p // quadratic ease-in: slow start, fast finish\n logUpdate(`\\n ${sub(brandFrame(tFinal + p * 0.5, eased * 0.9, eased))}\\n`)\n await new Promise(r => setTimeout(r, 40))\n }\n\n // Phase 3: Final frozen frame at full density\n logUpdate(`\\n ${sub(brandFrame(tFinal + 1, 0.9, 1))}\\n`)\n logUpdate.done()\n return result\n}\n","#!/usr/bin/env node\nimport type { PackageUsage } from './agent/detect-imports.ts'\nimport type { AgentType } from './agent/index.ts'\nimport { existsSync, readFileSync, realpathSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport { defineCommand, runMain } from 'citty'\nimport pLimit from 'p-limit'\nimport { join, resolve } from 'pathe'\nimport { agents, detectImportedPackages, detectInstalledAgents } from './agent/index.ts'\nimport { formatStatus, getRepoHint, guard, hasPrepareHook, isInteractive, isRunningInsideAgent, menuLoop, promptForAgent, relativeTime, resolveAgent, sharedArgs, suggestPrepareHook } from './cli-helpers.ts'\nimport { configCommand, configCommandDef } from './commands/config.ts'\nimport { removeCommand, removeCommandDef } from './commands/remove.ts'\nimport { infoCommandDef, statusCommand } from './commands/status.ts'\nimport { runWizard } from './commands/wizard.ts'\nimport { timedSpinner } from './core/formatting.ts'\nimport { getProjectState, hasCompletedWizard, isOutdated, readConfig, semverGt } from './core/index.ts'\nimport { readPackageJsonSafe } from './core/package-json.ts'\nimport { iterateSkills } from './core/skills.ts'\nimport { fetchLatestVersion, fetchNpmRegistryMeta } from './sources/index.ts'\nimport { brandLoader } from './ui.ts'\n\nimport { version } from './version.ts'\n\n// Suppress node:sqlite ExperimentalWarning (loaded lazily by retriv)\nconst _emit = process.emit\nprocess.emit = (event: string, ...args: any[]) =>\n event === 'warning' && args[0]?.name === 'ExperimentalWarning' && args[0]?.message?.includes('SQLite')\n ? false\n : _emit.apply(process, [event, ...args])\n\n// ── Deprecation forwarder ──\n\nfunction deprecatedForwarder(\n oldName: string,\n newName: string,\n loader: () => Promise<any>,\n): () => Promise<any> {\n return () => loader().then((cmd: any) => {\n const original = cmd.run\n return defineCommand({\n ...cmd,\n meta: { ...cmd.meta, name: oldName },\n async run(ctx: any) {\n console.warn(`\\x1B[33m⚠ \\`skilld ${oldName}\\` is deprecated. Use \\`skilld ${newName}\\` instead.\\x1B[0m`)\n return original(ctx)\n },\n })\n })\n}\n\n// ── Subcommands (lazy-loaded) ──\n\nconst SUBCOMMAND_NAMES = ['add', 'eject', 'update', 'info', 'list', 'config', 'remove', 'install', 'uninstall', 'search', 'cache', 'validate', 'assemble', 'setup', 'prepare', 'author', 'publish', 'upload']\n\n// ── Main command ──\n\nconst main = defineCommand({\n meta: {\n name: 'skilld',\n version,\n description: 'Curated agent skills for your projects',\n },\n args: {\n agent: sharedArgs.agent,\n },\n subCommands: {\n add: () => import('./commands/sync.ts').then(m => m.addCommandDef),\n update: () => import('./commands/sync.ts').then(m => m.updateCommandDef),\n info: () => infoCommandDef,\n list: () => import('./commands/list.ts').then(m => m.listCommandDef),\n config: () => configCommandDef,\n remove: () => removeCommandDef,\n install: () => import('./commands/install.ts').then(m => m.installCommandDef),\n prepare: () => import('./commands/prepare.ts').then(m => m.prepareCommandDef),\n uninstall: () => import('./commands/uninstall.ts').then(m => m.uninstallCommandDef),\n search: () => import('./commands/search.ts').then(m => m.searchCommandDef),\n cache: () => import('./commands/cache.ts').then(m => m.cacheCommandDef),\n setup: () => import('./commands/setup.ts').then(m => m.setupCommandDef),\n // Author group (nested subcommands)\n author: () => import('./commands/author-group.ts').then(m => m.authorGroupDef),\n // Deprecated forwarders (old top-level commands → skilld author <subcommand>)\n eject: deprecatedForwarder('eject', 'author eject', () => import('./commands/sync.ts').then(m => m.ejectCommandDef)),\n validate: deprecatedForwarder('validate', 'author validate', () => import('./commands/validate.ts').then(m => m.validateCommandDef)),\n assemble: deprecatedForwarder('assemble', 'author assemble', () => import('./commands/assemble.ts').then(m => m.assembleCommandDef)),\n publish: deprecatedForwarder('publish', 'author publish', () => import('./commands/upload.ts').then(m => m.uploadCommandDef)),\n upload: deprecatedForwarder('upload', 'author publish', () => import('./commands/upload.ts').then(m => m.uploadCommandDef)),\n },\n async run({ args }) {\n // Guard: citty always calls parent run() after subcommand dispatch.\n // If a subcommand was invoked, bail out here.\n const firstArg = process.argv[2]\n if (firstArg && !firstArg.startsWith('-') && SUBCOMMAND_NAMES.includes(firstArg))\n return\n\n const cwd = process.cwd()\n\n // Bare `skilld` — interactive menu (requires TTY)\n if (!isInteractive()) {\n const state = await getProjectState(cwd)\n const status = formatStatus(state.synced.length, state.outdated.length)\n console.log(`skilld v${version} · ${status}`)\n if (isRunningInsideAgent())\n console.log('Interactive wizard requires a standalone terminal (detected agent session).\\nUse `skilld add <pkg>` to add skills non-interactively, or run `npx skilld` in a separate terminal.')\n return\n }\n\n let currentAgent: AgentType | 'none' | null = resolveAgent(args.agent)\n\n if (!currentAgent) {\n currentAgent = await promptForAgent()\n if (!currentAgent)\n return\n }\n\n // No-agent mode: run wizard, then guide them\n if (currentAgent === 'none') {\n if (!hasCompletedWizard()) {\n if (!await runWizard())\n return\n }\n p.log.info(\n 'No agent selected - skills export as portable PROMPT_*.md files.\\n'\n + ' Run \\x1B[36mskilld add <pkg>\\x1B[0m to generate prompts for any package.\\n'\n + ' Run \\x1B[36mskilld config\\x1B[0m to set a target agent later.',\n )\n return\n }\n\n // After this point, agent is guaranteed to be a real AgentType\n const agent: AgentType = currentAgent\n\n // Animate brand while bootstrapping + check for updates\n let { state, selfUpdate } = await brandLoader(async () => {\n const config = readConfig()\n const state = await getProjectState(cwd)\n\n // Run self-update check + unmatched skills NPM check in parallel\n let selfUpdate = null as { latest: string, releasedAt?: string } | null\n const tasks: Promise<void>[] = []\n\n // Check if skilld itself has a newer version (skip for npx/dlx/bunx)\n const isEphemeral = process.env.npm_command === 'exec'\n if (!isEphemeral) {\n tasks.push(\n fetchNpmRegistryMeta('skilld', version).then((meta) => {\n const latestTag = meta.distTags?.latest\n if (latestTag && semverGt(latestTag.version, version))\n selfUpdate = { latest: latestTag.version, releasedAt: latestTag.releasedAt }\n }).catch(() => {}),\n )\n }\n\n // For skills not in local deps, check NPM for version updates\n if (state.unmatched.length > 0) {\n const limit = pLimit(5)\n tasks.push(\n Promise.all(state.unmatched.map(skill => limit(async () => {\n const pkgName = skill.info?.packageName || skill.name\n const latest = await fetchLatestVersion(pkgName)\n if (latest && isOutdated(skill, latest)) {\n state.outdated.push({ ...skill, packageName: pkgName, latestVersion: latest })\n }\n else if (latest) {\n state.synced.push({ ...skill, packageName: pkgName, latestVersion: latest })\n }\n }))).then(() => {}),\n )\n }\n\n await Promise.all(tasks)\n return { config, state, selfUpdate }\n })\n\n // Show self-update notification\n if (selfUpdate) {\n const released = selfUpdate.releasedAt ? `\\x1B[90m · ${relativeTime(new Date(selfUpdate.releasedAt))}\\x1B[0m` : ''\n const binPath = realpathSync(process.argv[1]!)\n const isLocal = binPath.startsWith(resolve(cwd, 'node_modules'))\n const flag = isLocal ? '' : ' -g'\n const cmd = `npx nypm add${flag} skilld@${selfUpdate.latest}`\n p.note(\n `\\x1B[90m${version}\\x1B[0m → \\x1B[1m\\x1B[32m${selfUpdate.latest}\\x1B[0m${released}\\n\\x1B[36m${cmd}\\x1B[0m`,\n '\\x1B[33mUpdate available\\x1B[0m',\n )\n }\n\n // First time setup or returning with no skills (e.g. cancelled last time)\n if (state.skills.length === 0) {\n if (!hasCompletedWizard()) {\n if (!await runWizard({ agent, showOutro: false }))\n return\n }\n else {\n p.log.step('No skills installed yet - pick some packages to get started.')\n }\n\n // Transition to project setup\n const pkgJsonPath = join(cwd, 'package.json')\n const projectPkg = readPackageJsonSafe(pkgJsonPath)\n const hasPkgJson = !!projectPkg\n const projectName = projectPkg?.parsed.name as string | undefined\n const projectLabel = projectName\n ? `Generating skills for \\x1B[36m${projectName}\\x1B[0m`\n : 'Generating skills for current directory'\n p.log.step(projectLabel)\n\n if (!hasPkgJson) {\n p.log.warn('No package.json found - enter npm package names manually.\\n For best results, run skilld inside a JS/TS project directory.')\n }\n\n if (state.shipped.length > 0) {\n const totalShipped = state.shipped.reduce((sum, s) => sum + s.skills.length, 0)\n const names = state.shipped.map(s => s.packageName).join(', ')\n p.log.info(`\\x1B[36m${totalShipped} ready-to-use skill${totalShipped > 1 ? 's' : ''}\\x1B[0m shipped by your dependencies: ${names}`)\n }\n\n p.log.info('Tip: Add skills for packages with complex APIs or frequent breaking changes - not every dependency needs one.')\n\n // Initial setup loop — allow user to go back\n let setupComplete = false\n while (!setupComplete) {\n const shippedOption = state.shipped.length > 0\n ? [{ label: 'Install shipped skills', value: 'shipped' as const, hint: `\\x1B[36m${state.shipped.reduce((sum, s) => sum + s.skills.length, 0)} ready to use\\x1B[0m` }]\n : []\n\n const source = hasPkgJson\n ? await p.select({\n message: 'How should I find packages?',\n options: [\n ...shippedOption,\n { label: 'Scan source files', value: 'imports', hint: 'find actually used imports' },\n { label: 'Use package.json', value: 'deps', hint: `all ${state.deps.size} dependencies` },\n { label: 'Enter manually', value: 'manual' },\n { label: 'Skip for now', value: 'skip', hint: 'add skills later with `skilld add <pkg>`' },\n ],\n })\n : 'manual' as const\n\n if (p.isCancel(source)) {\n p.cancel('Setup cancelled')\n return\n }\n\n if (source === 'skip') {\n p.log.info('Run \\x1B[36mskilld add <pkg>\\x1B[0m or \\x1B[36mskilld\\x1B[0m anytime to add skills.')\n return\n }\n\n if (source === 'shipped') {\n const { handleShippedSkills: installShipped } = await import('./commands/sync-shared.ts')\n for (const pkg of state.shipped) {\n const version = state.deps.get(pkg.packageName)?.replace(/^[\\^~>=<]+/, '') || '0.0.0'\n installShipped(pkg.packageName, version, cwd, agent, false)\n for (const sk of pkg.skills)\n p.log.success(`Installed shipped skill: ${sk.skillName}`)\n }\n state = await getProjectState(cwd)\n continue\n }\n\n // Get packages based on source\n let selected: string[]\n\n if (source === 'manual') {\n const input = await p.text({\n message: 'Enter package names (space or comma-separated)',\n placeholder: 'vue nuxt pinia',\n })\n if (p.isCancel(input)) {\n if (!hasPkgJson) {\n p.cancel('Setup cancelled')\n return\n }\n continue\n }\n if (!input) {\n p.log.warn('No packages entered')\n continue\n }\n selected = input.split(/[,\\s]+/).map(s => s.trim()).filter(Boolean)\n if (selected.length === 0) {\n p.log.warn('No valid packages entered')\n continue\n }\n }\n else {\n let usages: PackageUsage[]\n if (source === 'imports') {\n const spinner = timedSpinner()\n spinner.start('Scanning imports...')\n const result = await detectImportedPackages(cwd)\n\n if (result.packages.length === 0) {\n spinner.stop('No imports found, falling back to package.json')\n usages = Array.from(state.deps.keys(), name => ({ name, count: 0 }))\n }\n else {\n const depSet = new Set(state.deps.keys())\n usages = result.packages.filter(pkg => depSet.has(pkg.name) || pkg.source === 'preset')\n\n if (usages.length === 0) {\n spinner.stop(`Found ${result.packages.length} imported packages but none match dependencies`)\n usages = result.packages\n }\n else {\n spinner.stop(`Found ${usages.length} imported packages`)\n }\n }\n }\n else {\n usages = Array.from(state.deps.keys(), name => ({ name, count: 0 }))\n }\n\n // Let user select which packages\n const packages = usages.map(u => u.name)\n if (packages.length === 0) {\n p.log.warn('No packages found')\n continue\n }\n const sourceMap = new Map(usages.map(u => [u.name, u.source]))\n const maxLen = Math.max(...packages.map(n => n.length))\n // Pre-select frameworks and presets (most likely to benefit from skills)\n const preselect = packages.filter((name) => {\n if (sourceMap.get(name) === 'preset')\n return true\n // Common frameworks with complex/changing APIs\n const frameworks = new Set(['vue', 'nuxt', 'react', 'next', 'svelte', '@sveltejs/kit', 'astro', 'solid-js', 'angular', 'typescript', 'vite', 'vitest'])\n return frameworks.has(name)\n })\n\n const choice = await p.multiselect({\n message: `Select packages (${packages.length} found)`,\n options: packages.map((name) => {\n const ver = state.deps.get(name)?.replace(/^[\\^~>=<]/, '') || ''\n const repo = getRepoHint(name, cwd)\n const hint = sourceMap.get(name) === 'preset' ? 'nuxt module' : undefined\n const pad = ' '.repeat(maxLen - name.length + 2)\n const meta = [ver, hint, repo].filter(Boolean).join(' ')\n return { label: meta ? `${name}${pad}\\x1B[90m${meta}\\x1B[39m` : name, value: name }\n }),\n initialValues: preselect,\n })\n\n if (p.isCancel(choice)) {\n continue\n }\n if (choice.length === 0) {\n p.log.warn('No packages selected')\n continue\n }\n selected = choice\n }\n\n // Pass wizard-configured model so sync doesn't re-prompt.\n // Wizard already handled model selection - yes:true auto-resolves.\n const wizardConfig = readConfig()\n const { syncCommand } = await import('./commands/sync.ts')\n await syncCommand(state, {\n packages: selected,\n global: false,\n agent,\n model: wizardConfig.model as import('./agent/index.ts').OptimizeModel | undefined,\n yes: !wizardConfig.skipLlm,\n })\n setupComplete = true\n }\n\n // Show SKILL.md preview and verification for newly generated skills\n const postState = await getProjectState(cwd)\n const previewSkill = postState.skills[0]\n if (previewSkill) {\n const previewPath = join(cwd, agents[agent].skillsDir, previewSkill.name, 'SKILL.md')\n if (existsSync(previewPath)) {\n const previewContent = readFileSync(previewPath, 'utf-8')\n // eslint-disable-next-line no-control-regex, regexp/no-obscure-range\n const previewLines = previewContent.split('\\n').slice(0, 20).join('\\n').replace(/\\x1B\\[[0-?]*[ -/]*[@-~]/g, '').replace(/\\x1B\\].*?(?:\\x07|\\x1B\\\\)/g, '')\n const fileSize = (Buffer.byteLength(previewContent) / 1024).toFixed(1)\n p.note(\n `\\x1B[90m${previewLines}\\n...\\x1B[0m`,\n `${agents[agent].skillsDir}/${previewSkill.name}/SKILL.md (${fileSize} KB)`,\n )\n }\n }\n\n // First-run guidance with agent-specific verification tips\n const agentName = agents[agent].displayName\n const agentInstalled = detectInstalledAgents().includes(agent)\n const verifyTips: Record<string, string> = {\n 'claude-code': 'Start a new Claude Code session - skills load automatically.\\nOr type /skill-name to invoke a specific skill.',\n 'cursor': 'Restart Cursor to pick up new skills.\\nSkills appear in Settings > Cursor Rules.',\n 'github-copilot': 'Restart your editor to pick up new skills.\\nCopilot discovers skills from .github/skills/ at startup.',\n 'gemini-cli': 'Start a new Gemini CLI session.\\nVerify with /skills list.',\n 'codex': 'Start a new Codex session.\\nSkills in .agents/skills/ are discovered at startup.',\n 'windsurf': 'Restart Windsurf to pick up new skills.\\nSkills auto-invoke when their description matches your prompt.',\n 'cline': 'Restart your editor. Cline reads skill descriptions at startup.\\nFull content loads on-demand when the agent invokes use_skill.',\n 'goose': 'Start a new Goose session.\\nSkills are discovered automatically at startup.',\n 'amp': 'Start a new Amp session.\\nReads skill descriptions at startup, full content on invocation.',\n 'opencode': 'Start a new OpenCode session.\\nSkills are discovered automatically at startup.',\n 'roo': 'Restart your editor. Roo reads skill descriptions at startup.',\n }\n const verifyLine = agentInstalled\n ? (verifyTips[agent] ?? '')\n : `Skills are ready in ${agents[agent].skillsDir}/.\\n\\x1B[90m${agentName} was not detected on this machine.\\nInstall it to use these skills, or run \\`skilld config\\` to change agents.\\x1B[0m`\n\n // Build a \"try it\" suggestion that tests skill-specific knowledge\n const firstPkg = previewSkill?.info?.packageName || previewSkill?.name\n const trySuggestion = firstPkg\n ? `\\n\\n\\x1B[36mTry it:\\x1B[0m ask your agent \"What are the gotchas or breaking changes in ${firstPkg}?\"`\n : ''\n\n p.note(\n `${verifyLine}${trySuggestion}\\n\\n`\n + `Run \\x1B[36mskilld info\\x1B[0m to see installed skills.\\n`\n + `Run \\x1B[36mskilld\\x1B[0m again to add more, update, or search.`,\n `${agentName} - next steps`,\n )\n\n // Team advice: suggest prepare hook + lockfile\n try {\n await suggestPrepareHook(cwd)\n }\n catch (err) {\n p.log.warn(`Failed to suggest prepare hook: ${err instanceof Error ? err.message : String(err)}`)\n }\n return\n }\n\n // Has skills - show status + interactive menu\n const status = formatStatus(state.synced.length, state.outdated.length)\n p.log.info(status)\n\n let needsPrepareHook = !hasPrepareHook(cwd)\n if (needsPrepareHook) {\n p.log.warn(`\\x1B[33mNo prepare hook.\\x1B[0m Skills won't auto-restore on \\x1B[36mnpm install\\x1B[0m.`)\n }\n\n if (state.shipped.length > 0) {\n const totalSkills = state.shipped.reduce((sum, s) => sum + s.skills.length, 0)\n const names = state.shipped.map(s => s.packageName).join(', ')\n p.log.info(`\\x1B[36m${totalSkills} ready-to-use skill${totalSkills > 1 ? 's' : ''}\\x1B[0m shipped by your dependencies: ${names}`)\n }\n\n const refreshState = async () => {\n state = await getProjectState(cwd)\n }\n\n // Main menu — Escape in sub-actions returns to menu via guard()\n await menuLoop({\n message: 'What would you like to do?',\n options: () => {\n const opts: Array<{ label: string, value: string, hint?: string }> = []\n if (state.shipped.length > 0) {\n const total = state.shipped.reduce((sum, s) => sum + s.skills.length, 0)\n opts.push({ label: 'Install shipped skills', value: 'shipped', hint: `\\x1B[36m${total} available\\x1B[0m` })\n }\n opts.push({ label: 'Add new skills', value: 'install' })\n if (state.outdated.length > 0) {\n opts.push({ label: 'Update skills', value: 'update', hint: `\\x1B[33m${state.outdated.length} outdated\\x1B[0m` })\n }\n if (needsPrepareHook) {\n opts.push({ label: 'Setup prepare hook', value: 'prepare-hook', hint: '\\x1B[33mrecommended\\x1B[0m' })\n }\n opts.push(\n { label: 'Remove skills', value: 'remove' },\n { label: 'Search docs', value: 'search' },\n { label: 'Info', value: 'info' },\n { label: 'Configure', value: 'config' },\n )\n return opts\n },\n onSelect: async (action) => {\n switch (action) {\n case 'shipped': {\n const allShipped = state.shipped.flatMap(s => s.skills.map(sk => ({ packageName: s.packageName, ...sk })))\n const selected = guard(await p.multiselect({\n message: 'Select shipped skills to install',\n options: allShipped.map(s => ({\n label: s.skillName,\n value: s,\n hint: s.packageName,\n })),\n initialValues: allShipped,\n }))\n if (selected.length === 0)\n return\n const { handleShippedSkills: installShipped } = await import('./commands/sync-shared.ts')\n const seen = new Set<string>()\n for (const s of selected) {\n if (seen.has(s.packageName))\n continue\n seen.add(s.packageName)\n const version = state.deps.get(s.packageName)?.replace(/^[\\^~>=<]+/, '') || '0.0.0'\n installShipped(s.packageName, version, cwd, agent, false)\n }\n p.log.success(`Installed ${selected.length} shipped skill${selected.length > 1 ? 's' : ''}`)\n await refreshState()\n return true\n }\n case 'install': {\n const installedNames = new Set([\n ...state.synced.map(s => s.packageName),\n ...state.outdated.map(s => s.packageName),\n ].filter(Boolean) as string[])\n const uninstalledDeps = [...state.deps.keys()].filter(d => !installedNames.has(d))\n const allDepsInstalled = uninstalledDeps.length === 0\n const hasPkgJsonMenu = !!readPackageJsonSafe(join(cwd, 'package.json'))\n\n const source = hasPkgJsonMenu\n ? guard(await p.select({\n message: 'How should I find packages?',\n options: [\n { label: 'Scan source files', value: 'imports' as const, hint: allDepsInstalled ? 'all installed' : 'find actually used imports', disabled: allDepsInstalled },\n { label: 'Use package.json', value: 'deps' as const, hint: allDepsInstalled ? 'all installed' : `${uninstalledDeps.length} uninstalled`, disabled: allDepsInstalled },\n { label: 'Enter manually', value: 'manual' as const },\n ],\n }))\n : 'manual' as const\n\n let selected: string[]\n\n if (source === 'manual') {\n const input = guard(await p.text({\n message: 'Enter package names (space or comma-separated)',\n placeholder: 'vue nuxt pinia',\n }))\n if (!input)\n return\n selected = input.split(/[,\\s]+/).map(s => s.trim()).filter(Boolean)\n if (selected.length === 0)\n return\n }\n else {\n let usages: PackageUsage[]\n if (source === 'imports') {\n const spinner = timedSpinner()\n spinner.start('Scanning imports...')\n const result = await detectImportedPackages(cwd)\n\n if (result.packages.length === 0) {\n spinner.stop('No imports found, falling back to package.json')\n usages = uninstalledDeps.map(name => ({ name, count: 0 }))\n }\n else {\n const depSet = new Set(state.deps.keys())\n const matched = result.packages\n .filter(pkg => depSet.has(pkg.name) || pkg.source === 'preset')\n const alreadyInstalled = matched.filter(pkg => installedNames.has(pkg.name))\n usages = matched.filter(pkg => !installedNames.has(pkg.name))\n\n if (usages.length === 0) {\n spinner.stop('All detected imports already have skills')\n return\n }\n else {\n spinner.stop(`Found ${matched.length} imported packages`)\n if (alreadyInstalled.length > 0) {\n p.log.info(`${alreadyInstalled.length} already have skills installed`)\n }\n }\n }\n }\n else {\n usages = uninstalledDeps.map(name => ({ name, count: 0 }))\n }\n\n const packages = usages.map(u => u.name)\n if (packages.length === 0) {\n p.log.warn('No packages found')\n return\n }\n const usageMap = new Map(usages.map(u => [u.name, u]))\n const sourceMap = new Map(usages.map(u => [u.name, u.source]))\n const frameworks = new Set(['vue', 'nuxt', 'react', 'next', 'svelte', '@sveltejs/kit', 'astro', 'solid-js', 'angular', 'typescript', 'vite', 'vitest'])\n const maxLen = Math.max(...packages.map(n => n.length))\n const choice = guard(await p.multiselect({\n message: `Select packages your agent struggles with or that are new to you (${packages.length} found)`,\n options: packages.map((name) => {\n const ver = state.deps.get(name)?.replace(/^[\\^~>=<]/, '') || ''\n const repo = getRepoHint(name, cwd)\n const src = sourceMap.get(name)\n const hint = src === 'preset'\n ? 'nuxt module'\n : frameworks.has(name)\n ? 'framework'\n : (usageMap.get(name)?.count ?? 0) >= 5\n ? `${usageMap.get(name)!.count} imports`\n : undefined\n const pad = ' '.repeat(maxLen - name.length + 2)\n const meta = [ver, hint, repo].filter(Boolean).join(' ')\n return { label: meta ? `${name}${pad}\\x1B[90m${meta}\\x1B[39m` : name, value: name }\n }),\n initialValues: [],\n }))\n\n if (choice.length === 0)\n return\n selected = choice\n }\n\n const { syncCommand: sync } = await import('./commands/sync.ts')\n await sync(state, {\n packages: selected,\n global: false,\n agent,\n yes: false,\n })\n await refreshState()\n return true\n }\n case 'update': {\n if (state.outdated.length === 0) {\n p.log.success('All skills up to date')\n return true\n }\n const selected = guard(await p.multiselect({\n message: 'Select packages to update',\n options: state.outdated.map(s => ({\n label: s.name,\n value: s.packageName || s.name,\n hint: `${s.info?.version ?? 'unknown'} → ${s.latestVersion}`,\n })),\n initialValues: state.outdated.map(s => s.packageName || s.name),\n }))\n if (selected.length === 0)\n return\n const { syncCommand: syncUpdate } = await import('./commands/sync.ts')\n await syncUpdate(state, {\n packages: selected,\n global: false,\n agent,\n yes: false,\n mode: 'update',\n })\n await refreshState()\n return true\n }\n case 'remove': {\n // Check if global skills exist to offer scope choice\n const globalSkills = [...iterateSkills({ scope: 'global' })]\n let removeGlobal = false\n if (globalSkills.length > 0) {\n const scope = guard(await p.select({\n message: 'Which skills?',\n options: [\n { label: 'Project skills', value: 'local' as const },\n { label: 'Global skills', value: 'global' as const, hint: `${globalSkills.length} installed` },\n ],\n }))\n removeGlobal = scope === 'global'\n }\n await removeCommand(state, {\n global: removeGlobal,\n agent,\n yes: false,\n })\n await refreshState()\n break\n }\n case 'search': {\n const { interactiveSearch } = await import('./commands/search-interactive.ts')\n await interactiveSearch()\n break\n }\n case 'info':\n await statusCommand({ global: false })\n break\n case 'config':\n await configCommand()\n await refreshState()\n break\n case 'prepare-hook': {\n const added = await suggestPrepareHook(cwd)\n if (added)\n needsPrepareHook = false\n break\n }\n }\n },\n })\n },\n})\n\nrunMain(main)\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { D as CachedPackage, E as CachedDoc, O as CACHE_DIR, T as CacheConfig, a as clearCache, g as readCachedDocs, i as clearAllCache, k as REFERENCES_DIR, l as isCached, m as listCached, n as getCacheKey, o as ensureCacheDir, r as getVersionKey, t as getCacheDir, y as writeToCache } from "./_chunks/index.mjs";
2
2
  import { c as SearchResult, l as SearchSnippet, n as Document, o as SearchFilter, r as IndexConfig, s as SearchOptions } from "./_chunks/types.mjs";
3
3
  import { d as searchSnippets, l as search, r as createIndex } from "./_chunks/index2.mjs";
4
- import { G as downloadLlmsDocs, H as resolvePackageDocs, N as fetchNpmPackage, R as readLocalDependencies, X as parseMarkdownLinks, Y as normalizeLlmsLinks, ft as FetchedDoc, gt as NpmPackageInfo, ht as LocalDependency, mt as LlmsLink, pt as LlmsContent, q as fetchLlmsTxt, st as fetchReadmeContent, yt as ResolvedPackage } from "./_chunks/index3.mjs";
4
+ import { At as LocalDependency, Dt as FetchedDoc, G as downloadLlmsDocs, H as resolvePackageDocs, N as fetchNpmPackage, Ot as LlmsContent, Pt as ResolvedPackage, R as readLocalDependencies, X as parseMarkdownLinks, Y as normalizeLlmsLinks, jt as NpmPackageInfo, kt as LlmsLink, q as fetchLlmsTxt, st as fetchReadmeContent } from "./_chunks/index3.mjs";
5
5
  export { CACHE_DIR, type CacheConfig, type CachedDoc, type CachedPackage, type Document, type FetchedDoc, type IndexConfig, type LlmsContent, type LlmsLink, type LocalDependency, type NpmPackageInfo, REFERENCES_DIR, type ResolvedPackage, type SearchFilter, type SearchOptions, type SearchResult, type SearchSnippet, clearAllCache, clearCache, createIndex, downloadLlmsDocs, ensureCacheDir, fetchLlmsTxt, fetchNpmPackage, fetchReadmeContent, getCacheDir, getCacheKey, getVersionKey, isCached, listCached, normalizeLlmsLinks, parseMarkdownLinks, readCachedDocs, readLocalDependencies, resolvePackageDocs, search, searchSnippets, writeToCache };
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
- import { c as getVersionKey, n as REFERENCES_DIR, o as getCacheDir, s as getCacheKey, t as CACHE_DIR } from "./_chunks/config.mjs";
1
+ import { a as REFERENCES_DIR, i as CACHE_DIR, n as getCacheKey, r as getVersionKey, t as getCacheDir } from "./_chunks/version.mjs";
2
2
  import { d as listCached, g as writeToCache, n as clearCache, o as isCached, p as readCachedDocs, r as ensureCacheDir, t as clearAllCache } from "./_chunks/cache.mjs";
3
3
  import { d as searchSnippets, l as search, r as createIndex } from "./_chunks/retriv.mjs";
4
- import { C as downloadLlmsDocs, D as normalizeLlmsLinks, O as parseMarkdownLinks, T as fetchLlmsTxt, d as resolvePackageDocs, n as fetchNpmPackage, s as readLocalDependencies, v as fetchReadmeContent } from "./_chunks/sources.mjs";
4
+ import { I as fetchLlmsTxt, P as downloadLlmsDocs, R as normalizeLlmsLinks, d as resolvePackageDocs, k as fetchReadmeContent, n as fetchNpmPackage, s as readLocalDependencies, z as parseMarkdownLinks } from "./_chunks/sources.mjs";
5
5
  export { CACHE_DIR, REFERENCES_DIR, clearAllCache, clearCache, createIndex, downloadLlmsDocs, ensureCacheDir, fetchLlmsTxt, fetchNpmPackage, fetchReadmeContent, getCacheDir, getCacheKey, getVersionKey, isCached, listCached, normalizeLlmsLinks, parseMarkdownLinks, readCachedDocs, readLocalDependencies, resolvePackageDocs, search, searchSnippets, writeToCache };
@@ -1,2 +1,2 @@
1
- import { $ as formatIssueAsMarkdown, A as ResolveOptions, At as formatDiscussionAsMarkdown, B as resolveInstalledVersion, C as getDocOverride, Ct as parseGitSkillInput, D as getRepoEntry, Dt as generateDocsIndex, E as getRelatedPackages, Et as resolveEntryFiles, F as fetchPkgDist, G as downloadLlmsDocs, H as resolvePackageDocs, I as getInstalledSkillVersion, J as fetchLlmsUrl, K as extractSections, L as parseVersionSpecifier, M as fetchLatestVersion, Mt as fetchCrawledDocs, N as fetchNpmPackage, Nt as toCrawlPattern, O as getRepoKeyForPackage, Ot as GitHubDiscussion, P as fetchNpmRegistryMeta, Pt as fetchBlogReleases, Q as fetchGitHubIssues, R as readLocalDependencies, S as getCrawlUrl, St as fetchGitSkills, T as getPrereleaseChangelogRef, Tt as EntryFile, U as resolvePackageDocsWithAttempts, V as resolveLocalPackageDocs, W as searchNpmPackages, X as parseMarkdownLinks, Y as normalizeLlmsLinks, Z as GitHubIssue, _ as parseSemver, _t as ResolveAttempt, a as isGitHubRepoUrl, at as fetchGitHubRepoMeta, b as DocOverride, bt as GitSkillSource, c as parsePackageSpec, ct as filterFrameworkDocs, d as ReleaseIndexOptions, dt as validateGitDocsWithLlms, et as generateIssueIndex, f as SemVer, ft as FetchedDoc, g as isPrerelease, gt as NpmPackageInfo, h as generateReleaseIndex, ht as LocalDependency, i as fetchText, it as fetchGitDocs, j as ResolveStep, jt as generateDiscussionIndex, k as LocalPackageInfo, kt as fetchGitHubDiscussions, l as verifyUrl, lt as isShallowGitDocs, m as fetchReleaseNotes, mt as LlmsLink, n as extractBranchHint, nt as GitDocsResult, o as normalizeRepoUrl, ot as fetchReadme, p as compareSemver, pt as LlmsContent, q as fetchLlmsTxt, r as fetchGitHubRaw, rt as MIN_GIT_DOCS, s as parseGitHubUrl, st as fetchReadmeContent, t as $fetch, tt as isGhAvailable, u as GitHubRelease, ut as resolveGitHubRepo, v as BlogPreset, vt as ResolveResult, w as getFilePatterns, wt as parseSkillFrontmatterName, x as getBlogPreset, xt as RemoteSkill, y as BlogRelease, yt as ResolvedPackage, z as readLocalPackageInfo } from "../_chunks/index3.mjs";
2
- export { $fetch, BlogPreset, BlogRelease, DocOverride, EntryFile, FetchedDoc, GitDocsResult, GitHubDiscussion, GitHubIssue, GitHubRelease, GitSkillSource, LlmsContent, LlmsLink, LocalDependency, LocalPackageInfo, MIN_GIT_DOCS, NpmPackageInfo, ReleaseIndexOptions, RemoteSkill, ResolveAttempt, ResolveOptions, ResolveResult, ResolveStep, ResolvedPackage, SemVer, compareSemver, downloadLlmsDocs, extractBranchHint, extractSections, fetchBlogReleases, fetchCrawledDocs, fetchGitDocs, fetchGitHubDiscussions, fetchGitHubIssues, fetchGitHubRaw, fetchGitHubRepoMeta, fetchGitSkills, fetchLatestVersion, fetchLlmsTxt, fetchLlmsUrl, fetchNpmPackage, fetchNpmRegistryMeta, fetchPkgDist, fetchReadme, fetchReadmeContent, fetchReleaseNotes, fetchText, filterFrameworkDocs, formatDiscussionAsMarkdown, formatIssueAsMarkdown, generateDiscussionIndex, generateDocsIndex, generateIssueIndex, generateReleaseIndex, getBlogPreset, getCrawlUrl, getDocOverride, getFilePatterns, getInstalledSkillVersion, getPrereleaseChangelogRef, getRelatedPackages, getRepoEntry, getRepoKeyForPackage, isGhAvailable, isGitHubRepoUrl, isPrerelease, isShallowGitDocs, normalizeLlmsLinks, normalizeRepoUrl, parseGitHubUrl, parseGitSkillInput, parseMarkdownLinks, parsePackageSpec, parseSemver, parseSkillFrontmatterName, parseVersionSpecifier, readLocalDependencies, readLocalPackageInfo, resolveEntryFiles, resolveGitHubRepo, resolveInstalledVersion, resolveLocalPackageDocs, resolvePackageDocs, resolvePackageDocsWithAttempts, searchNpmPackages, toCrawlPattern, validateGitDocsWithLlms, verifyUrl };
1
+ import { $ as formatIssueAsMarkdown, A as ResolveOptions, At as LocalDependency, B as resolveInstalledVersion, C as getDocOverride, Ct as generateDiscussionIndex, D as getRepoEntry, Dt as FetchedDoc, E as getRelatedPackages, Et as resolveCrateDocsWithAttempts, F as fetchPkgDist, Ft as fetchBlogReleases, G as downloadLlmsDocs, H as resolvePackageDocs, I as getInstalledSkillVersion, J as fetchLlmsUrl, K as extractSections, L as parseVersionSpecifier, M as fetchLatestVersion, Mt as ResolveAttempt, N as fetchNpmPackage, Nt as ResolveResult, O as getRepoKeyForPackage, Ot as LlmsContent, P as fetchNpmRegistryMeta, Pt as ResolvedPackage, Q as fetchGitHubIssues, R as readLocalDependencies, S as getCrawlUrl, St as formatDiscussionAsMarkdown, T as getPrereleaseChangelogRef, Tt as toCrawlPattern, U as resolvePackageDocsWithAttempts, V as resolveLocalPackageDocs, W as searchNpmPackages, X as parseMarkdownLinks, Y as normalizeLlmsLinks, Z as GitHubIssue, _ as parseSemver, _t as EntryFile, a as isGitHubRepoUrl, at as fetchGitHubRepoMeta, b as DocOverride, bt as GitHubDiscussion, c as parsePackageSpec, ct as filterFrameworkDocs, d as ReleaseIndexOptions, dt as validateGitDocsWithLlms, et as generateIssueIndex, f as SemVer, ft as GitSkillSource, g as isPrerelease, gt as parseSkillFrontmatterName, h as generateReleaseIndex, ht as parseGitSkillInput, i as fetchText, it as fetchGitDocs, j as ResolveStep, jt as NpmPackageInfo, k as LocalPackageInfo, kt as LlmsLink, l as verifyUrl, lt as isShallowGitDocs, m as fetchReleaseNotes, mt as fetchGitSkills, n as extractBranchHint, nt as GitDocsResult, o as normalizeRepoUrl, ot as fetchReadme, p as compareSemver, pt as RemoteSkill, q as fetchLlmsTxt, r as fetchGitHubRaw, rt as MIN_GIT_DOCS, s as parseGitHubUrl, st as fetchReadmeContent, t as $fetch, tt as isGhAvailable, u as GitHubRelease, ut as resolveGitHubRepo, v as BlogPreset, vt as resolveEntryFiles, w as getFilePatterns, wt as fetchCrawledDocs, x as getBlogPreset, xt as fetchGitHubDiscussions, y as BlogRelease, yt as generateDocsIndex, z as readLocalPackageInfo } from "../_chunks/index3.mjs";
2
+ export { $fetch, BlogPreset, BlogRelease, DocOverride, EntryFile, FetchedDoc, GitDocsResult, GitHubDiscussion, GitHubIssue, GitHubRelease, GitSkillSource, LlmsContent, LlmsLink, LocalDependency, LocalPackageInfo, MIN_GIT_DOCS, NpmPackageInfo, ReleaseIndexOptions, RemoteSkill, ResolveAttempt, ResolveOptions, ResolveResult, ResolveStep, ResolvedPackage, SemVer, compareSemver, downloadLlmsDocs, extractBranchHint, extractSections, fetchBlogReleases, fetchCrawledDocs, fetchGitDocs, fetchGitHubDiscussions, fetchGitHubIssues, fetchGitHubRaw, fetchGitHubRepoMeta, fetchGitSkills, fetchLatestVersion, fetchLlmsTxt, fetchLlmsUrl, fetchNpmPackage, fetchNpmRegistryMeta, fetchPkgDist, fetchReadme, fetchReadmeContent, fetchReleaseNotes, fetchText, filterFrameworkDocs, formatDiscussionAsMarkdown, formatIssueAsMarkdown, generateDiscussionIndex, generateDocsIndex, generateIssueIndex, generateReleaseIndex, getBlogPreset, getCrawlUrl, getDocOverride, getFilePatterns, getInstalledSkillVersion, getPrereleaseChangelogRef, getRelatedPackages, getRepoEntry, getRepoKeyForPackage, isGhAvailable, isGitHubRepoUrl, isPrerelease, isShallowGitDocs, normalizeLlmsLinks, normalizeRepoUrl, parseGitHubUrl, parseGitSkillInput, parseMarkdownLinks, parsePackageSpec, parseSemver, parseSkillFrontmatterName, parseVersionSpecifier, readLocalDependencies, readLocalPackageInfo, resolveCrateDocsWithAttempts, resolveEntryFiles, resolveGitHubRepo, resolveInstalledVersion, resolveLocalPackageDocs, resolvePackageDocs, resolvePackageDocsWithAttempts, searchNpmPackages, toCrawlPattern, validateGitDocsWithLlms, verifyUrl };
@@ -1,3 +1,3 @@
1
- import { c as getBlogPreset, d as getFilePatterns, g as getRepoKeyForPackage, h as getRepoEntry, l as getCrawlUrl, m as getRelatedPackages, p as getPrereleaseChangelogRef, u as getDocOverride } from "../_chunks/shared.mjs";
2
- import { $ as isGitHubRepoUrl, A as parseGitSkillInput, B as isGhAvailable, C as downloadLlmsDocs, D as normalizeLlmsLinks, E as fetchLlmsUrl, F as formatDiscussionAsMarkdown, G as fetchReleaseNotes, H as toCrawlPattern, I as generateDiscussionIndex, J as parseSemver, K as generateReleaseIndex, L as fetchGitHubIssues, M as resolveEntryFiles, N as generateDocsIndex, O as parseMarkdownLinks, P as fetchGitHubDiscussions, Q as fetchText, R as formatIssueAsMarkdown, S as validateGitDocsWithLlms, T as fetchLlmsTxt, U as fetchBlogReleases, V as fetchCrawledDocs, W as compareSemver, X as extractBranchHint, Y as $fetch, Z as fetchGitHubRaw, _ as fetchReadme, a as getInstalledSkillVersion, b as isShallowGitDocs, c as readLocalPackageInfo, d as resolvePackageDocs, et as normalizeRepoUrl, f as resolvePackageDocsWithAttempts, g as fetchGitHubRepoMeta, h as fetchGitDocs, i as fetchPkgDist, j as parseSkillFrontmatterName, k as fetchGitSkills, l as resolveInstalledVersion, m as MIN_GIT_DOCS, n as fetchNpmPackage, nt as parsePackageSpec, o as parseVersionSpecifier, p as searchNpmPackages, q as isPrerelease, r as fetchNpmRegistryMeta, rt as verifyUrl, s as readLocalDependencies, t as fetchLatestVersion, tt as parseGitHubUrl, u as resolveLocalPackageDocs, v as fetchReadmeContent, w as extractSections, x as resolveGitHubRepo, y as filterFrameworkDocs, z as generateIssueIndex } from "../_chunks/sources.mjs";
3
- export { $fetch, MIN_GIT_DOCS, compareSemver, downloadLlmsDocs, extractBranchHint, extractSections, fetchBlogReleases, fetchCrawledDocs, fetchGitDocs, fetchGitHubDiscussions, fetchGitHubIssues, fetchGitHubRaw, fetchGitHubRepoMeta, fetchGitSkills, fetchLatestVersion, fetchLlmsTxt, fetchLlmsUrl, fetchNpmPackage, fetchNpmRegistryMeta, fetchPkgDist, fetchReadme, fetchReadmeContent, fetchReleaseNotes, fetchText, filterFrameworkDocs, formatDiscussionAsMarkdown, formatIssueAsMarkdown, generateDiscussionIndex, generateDocsIndex, generateIssueIndex, generateReleaseIndex, getBlogPreset, getCrawlUrl, getDocOverride, getFilePatterns, getInstalledSkillVersion, getPrereleaseChangelogRef, getRelatedPackages, getRepoEntry, getRepoKeyForPackage, isGhAvailable, isGitHubRepoUrl, isPrerelease, isShallowGitDocs, normalizeLlmsLinks, normalizeRepoUrl, parseGitHubUrl, parseGitSkillInput, parseMarkdownLinks, parsePackageSpec, parseSemver, parseSkillFrontmatterName, parseVersionSpecifier, readLocalDependencies, readLocalPackageInfo, resolveEntryFiles, resolveGitHubRepo, resolveInstalledVersion, resolveLocalPackageDocs, resolvePackageDocs, resolvePackageDocsWithAttempts, searchNpmPackages, toCrawlPattern, validateGitDocsWithLlms, verifyUrl };
1
+ import { c as getRepoEntry, i as getFilePatterns, l as getRepoKeyForPackage, n as getCrawlUrl, o as getPrereleaseChangelogRef, r as getDocOverride, s as getRelatedPackages, t as getBlogPreset } from "../_chunks/package-registry.mjs";
2
+ import { $ as fetchText, A as filterFrameworkDocs, B as fetchGitHubIssues, C as toCrawlPattern, D as fetchGitHubRepoMeta, E as fetchGitDocs, F as extractSections, G as compareSemver, H as generateIssueIndex, I as fetchLlmsTxt, J as isPrerelease, K as fetchReleaseNotes, L as fetchLlmsUrl, M as resolveGitHubRepo, N as validateGitDocsWithLlms, O as fetchReadme, P as downloadLlmsDocs, Q as fetchGitHubRaw, R as normalizeLlmsLinks, S as fetchCrawledDocs, T as MIN_GIT_DOCS, U as isGhAvailable, V as formatIssueAsMarkdown, W as fetchBlogReleases, X as $fetch, Y as parseSemver, Z as extractBranchHint, _ as resolveEntryFiles, a as getInstalledSkillVersion, b as formatDiscussionAsMarkdown, c as readLocalPackageInfo, d as resolvePackageDocs, et as isGitHubRepoUrl, f as resolvePackageDocsWithAttempts, g as parseSkillFrontmatterName, h as parseGitSkillInput, i as fetchPkgDist, it as verifyUrl, j as isShallowGitDocs, k as fetchReadmeContent, l as resolveInstalledVersion, m as fetchGitSkills, n as fetchNpmPackage, nt as parseGitHubUrl, o as parseVersionSpecifier, p as searchNpmPackages, q as generateReleaseIndex, r as fetchNpmRegistryMeta, rt as parsePackageSpec, s as readLocalDependencies, t as fetchLatestVersion, tt as normalizeRepoUrl, u as resolveLocalPackageDocs, v as generateDocsIndex, w as resolveCrateDocsWithAttempts, x as generateDiscussionIndex, y as fetchGitHubDiscussions, z as parseMarkdownLinks } from "../_chunks/sources.mjs";
3
+ export { $fetch, MIN_GIT_DOCS, compareSemver, downloadLlmsDocs, extractBranchHint, extractSections, fetchBlogReleases, fetchCrawledDocs, fetchGitDocs, fetchGitHubDiscussions, fetchGitHubIssues, fetchGitHubRaw, fetchGitHubRepoMeta, fetchGitSkills, fetchLatestVersion, fetchLlmsTxt, fetchLlmsUrl, fetchNpmPackage, fetchNpmRegistryMeta, fetchPkgDist, fetchReadme, fetchReadmeContent, fetchReleaseNotes, fetchText, filterFrameworkDocs, formatDiscussionAsMarkdown, formatIssueAsMarkdown, generateDiscussionIndex, generateDocsIndex, generateIssueIndex, generateReleaseIndex, getBlogPreset, getCrawlUrl, getDocOverride, getFilePatterns, getInstalledSkillVersion, getPrereleaseChangelogRef, getRelatedPackages, getRepoEntry, getRepoKeyForPackage, isGhAvailable, isGitHubRepoUrl, isPrerelease, isShallowGitDocs, normalizeLlmsLinks, normalizeRepoUrl, parseGitHubUrl, parseGitSkillInput, parseMarkdownLinks, parsePackageSpec, parseSemver, parseSkillFrontmatterName, parseVersionSpecifier, readLocalDependencies, readLocalPackageInfo, resolveCrateDocsWithAttempts, resolveEntryFiles, resolveGitHubRepo, resolveInstalledVersion, resolveLocalPackageDocs, resolvePackageDocs, resolvePackageDocsWithAttempts, searchNpmPackages, toCrawlPattern, validateGitDocsWithLlms, verifyUrl };
package/dist/types.d.mts CHANGED
@@ -1,4 +1,4 @@
1
1
  import { D as CachedPackage, T as CacheConfig } from "./_chunks/index.mjs";
2
2
  import { c as SearchResult, l as SearchSnippet, n as Document, o as SearchFilter, r as IndexConfig, s as SearchOptions } from "./_chunks/types.mjs";
3
- import { ft as FetchedDoc, mt as LlmsLink, pt as LlmsContent } from "./_chunks/index3.mjs";
3
+ import { Dt as FetchedDoc, Ot as LlmsContent, kt as LlmsLink } from "./_chunks/index3.mjs";
4
4
  export { type CacheConfig, type CachedPackage, type Document, type FetchedDoc, type IndexConfig, type LlmsContent, type LlmsLink, type SearchFilter, type SearchOptions, type SearchResult, type SearchSnippet };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "skilld",
3
3
  "type": "module",
4
- "version": "1.6.2",
4
+ "version": "1.7.0",
5
5
  "description": "Generate AI agent skills from npm package documentation",
6
6
  "author": {
7
7
  "name": "Harlan Wilton",
@@ -50,9 +50,9 @@
50
50
  },
51
51
  "dependencies": {
52
52
  "@clack/prompts": "^1.2.0",
53
- "@huggingface/transformers": "^4.0.1",
54
- "@mariozechner/pi-ai": "^0.65.2",
55
- "@mdream/crawl": "^1.0.3",
53
+ "@huggingface/transformers": "^4.1.0",
54
+ "@mariozechner/pi-ai": "^0.68.1",
55
+ "@mdream/crawl": "^1.1.0",
56
56
  "citty": "^0.2.2",
57
57
  "consola": "^3.4.2",
58
58
  "giget": "^3.2.0",
@@ -61,32 +61,31 @@
61
61
  "mdast-util-from-markdown": "^2.0.3",
62
62
  "mdast-util-frontmatter": "^2.0.1",
63
63
  "mdast-util-to-string": "^4.0.0",
64
- "mdream": "^1.0.3",
64
+ "mdream": "^1.1.0",
65
65
  "micromark-extension-frontmatter": "^2.0.0",
66
66
  "mlly": "^1.8.2",
67
67
  "ofetch": "^1.5.1",
68
- "oxc-parser": "^0.124.0",
68
+ "oxc-parser": "^0.127.0",
69
69
  "p-limit": "^7.3.0",
70
70
  "pathe": "^2.0.3",
71
71
  "retriv": "^0.13.2",
72
72
  "semver": "^7.7.4",
73
73
  "sqlite-vec": "^0.1.9",
74
- "std-env": "^4.0.0",
74
+ "std-env": "^4.1.0",
75
75
  "tinyglobby": "^0.2.16",
76
76
  "typescript": "6.0.2",
77
77
  "unagent": "^0.0.8",
78
78
  "unist-util-visit": "^5.1.0"
79
79
  },
80
80
  "devDependencies": {
81
- "@antfu/eslint-config": "^8.1.0",
82
- "@types/node": "^25.5.2",
81
+ "@antfu/eslint-config": "^8.2.0",
82
+ "@types/node": "^25.6.0",
83
83
  "@types/semver": "^7.7.1",
84
- "@vitest/coverage-v8": "^4.1.3",
84
+ "@vitest/coverage-v8": "^4.1.5",
85
85
  "bumpp": "^11.0.1",
86
- "evalite": "^0.19.0",
87
86
  "obuild": "^0.4.33",
88
87
  "tsx": "^4.21.0",
89
- "vitest": "^4.1.3"
88
+ "vitest": "^4.1.5"
90
89
  },
91
90
  "scripts": {
92
91
  "build": "obuild",