skilld 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -21
- package/dist/_chunks/agent.mjs +8 -7
- package/dist/_chunks/agent.mjs.map +1 -1
- package/dist/_chunks/assemble.mjs +134 -0
- package/dist/_chunks/assemble.mjs.map +1 -0
- package/dist/_chunks/cache2.mjs +1 -1
- package/dist/_chunks/detect.mjs +737 -0
- package/dist/_chunks/detect.mjs.map +1 -0
- package/dist/_chunks/embedding-cache.mjs +1 -1
- package/dist/_chunks/formatting.mjs +25 -294
- package/dist/_chunks/formatting.mjs.map +1 -1
- package/dist/_chunks/install.mjs +38 -12
- package/dist/_chunks/install.mjs.map +1 -1
- package/dist/_chunks/list.mjs +3 -1
- package/dist/_chunks/list.mjs.map +1 -1
- package/dist/_chunks/pool.mjs +113 -167
- package/dist/_chunks/pool.mjs.map +1 -1
- package/dist/_chunks/prompts.mjs +64 -735
- package/dist/_chunks/prompts.mjs.map +1 -1
- package/dist/_chunks/sanitize.mjs +2 -2
- package/dist/_chunks/sanitize.mjs.map +1 -1
- package/dist/_chunks/search-interactive.mjs +14 -3
- package/dist/_chunks/search-interactive.mjs.map +1 -1
- package/dist/_chunks/search.mjs +3 -1
- package/dist/_chunks/search2.mjs +180 -0
- package/dist/_chunks/search2.mjs.map +1 -0
- package/dist/_chunks/skills.mjs +292 -0
- package/dist/_chunks/skills.mjs.map +1 -0
- package/dist/_chunks/sync.mjs +313 -35
- package/dist/_chunks/sync.mjs.map +1 -1
- package/dist/_chunks/sync2.mjs +4 -2
- package/dist/_chunks/uninstall.mjs +6 -4
- package/dist/_chunks/uninstall.mjs.map +1 -1
- package/dist/_chunks/validate.mjs +2 -1
- package/dist/_chunks/validate.mjs.map +1 -1
- package/dist/agent/index.d.mts +29 -6
- package/dist/agent/index.d.mts.map +1 -1
- package/dist/agent/index.mjs +4 -3
- package/dist/cli.mjs +24 -13
- package/dist/cli.mjs.map +1 -1
- package/dist/retriv/index.d.mts +4 -1
- package/dist/retriv/index.d.mts.map +1 -1
- package/dist/retriv/index.mjs +25 -10
- package/dist/retriv/index.mjs.map +1 -1
- package/dist/retriv/worker.d.mts.map +1 -1
- package/dist/retriv/worker.mjs +2 -16
- package/dist/retriv/worker.mjs.map +1 -1
- package/package.json +2 -2
- package/dist/_chunks/pool2.mjs +0 -115
- package/dist/_chunks/pool2.mjs.map +0 -1
package/dist/cli.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.mjs","names":["agents","skilldVersion","agents"],"sources":["../src/commands/config.ts","../src/commands/remove.ts","../src/commands/status.ts","../src/commands/wizard.ts","../src/cli.ts"],"sourcesContent":["import type { FeaturesConfig } from '../core/config.ts'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { agents, getAvailableModels } from '../agent/index.ts'\nimport { getInstalledGenerators, introLine, 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 config = readConfig()\n\n const features = config.features ?? defaultFeatures\n const enabledCount = Object.values(features).filter(Boolean).length\n\n const action = await p.select({\n message: 'Settings',\n options: [\n { label: 'Change features', value: 'features', hint: `${enabledCount}/4 enabled` },\n { label: 'Change model', value: 'model', hint: config.model || 'auto' },\n { label: 'Change agent', value: 'agent', hint: config.agent || 'auto-detect' },\n ],\n })\n\n if (p.isCancel(action)) {\n p.cancel('Cancelled')\n return\n }\n\n switch (action) {\n case 'features': {\n const featureOptions = [\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 ] as const\n\n const selected = await p.multiselect({\n message: 'Enable features',\n options: featureOptions.map(f => ({\n label: f.label,\n value: f.value,\n hint: f.hint,\n })),\n initialValues: Object.entries(features)\n .filter(([, v]) => v)\n .map(([k]) => k) as Array<keyof FeaturesConfig>,\n required: false,\n })\n\n if (p.isCancel(selected))\n return\n\n const updated: FeaturesConfig = {\n search: selected.includes('search'),\n issues: selected.includes('issues'),\n discussions: selected.includes('discussions'),\n releases: selected.includes('releases'),\n }\n updateConfig({ features: updated })\n p.log.success(`Features updated: ${selected.length} enabled`)\n break\n }\n\n case 'model': {\n const available = await getAvailableModels()\n if (available.length === 0) {\n p.log.warn('No LLM CLIs found')\n return\n }\n\n const model = await p.select({\n message: 'Select default model',\n options: [\n { label: 'Auto (prompt each time)', value: '' },\n ...available.map(m => ({\n label: m.recommended ? `${m.name} (Recommended)` : m.name,\n value: m.id,\n hint: m.hint,\n })),\n ],\n initialValue: config.model || '',\n })\n\n if (p.isCancel(model))\n return\n\n updateConfig({ model: (model || undefined) as typeof config.model })\n p.log.success(model ? `Default model set to ${model}` : 'Model will be prompted each time')\n break\n }\n\n case 'agent': {\n const agentChoice = await p.select({\n message: 'Select default agent',\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\n if (p.isCancel(agentChoice))\n return\n\n updateConfig({ agent: agentChoice || undefined })\n p.log.success(agentChoice ? `Default agent set to ${agentChoice}` : 'Agent will be auto-detected')\n break\n }\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 const generators = getInstalledGenerators()\n const config = readConfig()\n p.intro(introLine({ state, generators, modelId: config.model }))\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)\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) {\n agent = await promptForAgent()\n if (!agent)\n return\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 }\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 = [...pkg.agents].map(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","import type { FeaturesConfig } from '../core/config.ts'\nimport { execSync } from 'node:child_process'\nimport * as p from '@clack/prompts'\nimport { getAvailableModels } from '../agent/index.ts'\nimport { isInteractive } from '../cli-helpers.ts'\nimport { defaultFeatures, updateConfig } from '../core/config.ts'\n\nfunction hasGhCli(): boolean {\n if (process.env.SKILLD_NO_GH)\n return false\n try {\n execSync('gh --version', { stdio: 'ignore' })\n return true\n }\n catch {\n return false\n }\n}\n\nexport async function runWizard(): Promise<void> {\n if (!isInteractive())\n return\n\n p.note(\n 'Skilld gives your AI agent skill knowledge on your NPM\\n'\n + 'dependencies gathered from versioned docs, source code\\n'\n + 'and GitHub issues.',\n 'Welcome to skilld',\n )\n\n const ghInstalled = hasGhCli()\n\n if (ghInstalled) {\n p.log.success(\n 'GitHub CLI detected — will use it to pull issues and discussions.',\n )\n }\n else {\n p.log.warn(\n 'GitHub CLI not found. Install it to enable issues/discussions:\\n'\n + ' \\x1B[36mhttps://cli.github.com\\x1B[0m',\n )\n }\n\n // Feature toggles\n const selected = await p.multiselect({\n message: 'Which features would you like to enable?',\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', disabled: !ghInstalled },\n { label: 'GitHub discussions', value: 'discussions' as const, hint: 'include Q&A and community knowledge', disabled: !ghInstalled },\n ],\n initialValues: [\n ...Object.entries(defaultFeatures)\n .filter(([, v]) => v)\n .map(([k]) => k),\n ...(ghInstalled ? ['issues', 'discussions'] as const : []),\n ] as Array<keyof FeaturesConfig>,\n required: false,\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Setup cancelled')\n process.exit(0)\n }\n\n const features: FeaturesConfig = {\n search: selected.includes('search'),\n issues: selected.includes('issues'),\n discussions: selected.includes('discussions'),\n releases: selected.includes('releases'),\n }\n\n // LLM optimization — optional, model selection is independent of target agent\n const allModels = process.env.SKILLD_NO_AGENTS ? [] : await getAvailableModels()\n let modelId: string | undefined\n\n if (allModels.length > 0) {\n p.note(\n 'Skills work without an LLM, but one can rewrite your\\n'\n + 'SKILL.md files with best practices and better structure.\\n'\n + '\\x1B[90mThis is separate from the agent where skills are installed —\\n'\n + 'the target agent is auto-detected from your project files.\\x1B[0m',\n 'Optional: LLM optimization',\n )\n\n const modelChoice = await p.select({\n message: 'Model for generating SKILL.md',\n options: [\n { label: 'Skip', value: '', hint: 'use raw docs, no LLM needed' },\n ...allModels.map(m => ({\n label: m.recommended ? `${m.name} (Recommended)` : m.name,\n value: m.id,\n hint: `${m.agentName} · ${m.hint}`,\n })),\n ],\n })\n\n if (p.isCancel(modelChoice)) {\n p.cancel('Setup cancelled')\n process.exit(0)\n }\n\n modelId = (modelChoice as string) || undefined\n }\n else {\n p.log.warn(\n 'No supported LLM CLIs detected (claude, gemini, codex).\\n'\n + ' Skills will still work, but won\\'t be LLM-optimized.',\n )\n const proceed = await p.confirm({\n message: 'Continue without LLM optimization?',\n initialValue: true,\n })\n if (p.isCancel(proceed) || !proceed) {\n p.cancel('Setup cancelled')\n process.exit(0)\n }\n }\n\n updateConfig({\n features,\n ...(modelId ? { model: modelId as any } : { skipLlm: true }),\n })\n\n p.outro('Thanks, you\\'re all set! Change config anytime with `skilld config`.')\n}\n","#!/usr/bin/env node\nimport type { PackageUsage } from './agent/detect-imports.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 { detectImportedPackages } from './agent/index.ts'\nimport { formatStatus, getRepoHint, isInteractive, promptForAgent, relativeTime, resolveAgent, sharedArgs } 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 { 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']\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 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 },\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 return\n }\n\n let currentAgent = resolveAgent(args.agent)\n\n if (!currentAgent) {\n currentAgent = await promptForAgent()\n if (!currentAgent)\n return\n }\n\n // Animate brand while bootstrapping + check for updates\n const { 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 - no skills yet\n if (state.skills.length === 0) {\n if (!hasCompletedWizard()) {\n await runWizard()\n }\n\n // Transition to project setup\n const pkgJsonPath = join(cwd, 'package.json')\n const hasPkgJson = existsSync(pkgJsonPath)\n const projectName = hasPkgJson\n ? JSON.parse(readFileSync(pkgJsonPath, 'utf-8')).name\n : 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 package names manually or run inside a project')\n }\n\n p.log.info('Tip: Only generate skills for packages your agent struggles with.\\n The fewer skills, the more context you have for everything else :)')\n\n // Initial setup loop — allow user to go back\n let setupComplete = false\n while (!setupComplete) {\n const source = hasPkgJson\n ? await p.select({\n message: 'How should I find packages?',\n options: [\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 ],\n })\n : 'manual' as const\n\n if (p.isCancel(source)) {\n p.cancel('Setup cancelled')\n return\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 = [...state.deps.keys()].map(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 = [...state.deps.keys()].map(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 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: packages,\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 // syncCommand will ask about LLM after generating base skills\n const { syncCommand } = await import('./commands/sync.ts')\n await syncCommand(state, {\n packages: selected,\n global: false,\n agent: currentAgent,\n yes: false,\n })\n setupComplete = true\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 // Menu loop — Escape in sub-actions returns to menu\n\n while (true) {\n type ActionValue = 'install' | 'update' | 'remove' | 'search' | 'info' | 'config'\n const options: Array<{ label: string, value: ActionValue, hint?: string }> = []\n\n options.push({ label: 'Add new skills', value: 'install' })\n if (state.outdated.length > 0) {\n options.push({ label: 'Update skills', value: 'update', hint: `\\x1B[33m${state.outdated.length} outdated\\x1B[0m` })\n }\n options.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\n const action = await p.select({\n message: 'What would you like to do?',\n options,\n })\n\n if (p.isCancel(action)) {\n p.cancel('Cancelled')\n return\n }\n\n switch (action) {\n case 'install': {\n const installedNames = new Set(state.skills.map(s => s.packageName || s.name))\n const uninstalledDeps = [...state.deps.keys()].filter(d => !installedNames.has(d))\n const allDepsInstalled = uninstalledDeps.length === 0\n const hasPkgJsonMenu = existsSync(join(cwd, 'package.json'))\n\n const source = hasPkgJsonMenu\n ? 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 if (p.isCancel(source))\n continue\n\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) || !input)\n continue\n selected = input.split(/[,\\s]+/).map(s => s.trim()).filter(Boolean)\n if (selected.length === 0)\n continue\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 usages = result.packages\n .filter(pkg => depSet.has(pkg.name) || pkg.source === 'preset')\n .filter(pkg => !installedNames.has(pkg.name))\n\n if (usages.length === 0) {\n spinner.stop('All detected imports already have skills')\n continue\n }\n else {\n spinner.stop(`Found ${usages.length} imported packages`)\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 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 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: packages,\n })\n\n if (p.isCancel(choice) || choice.length === 0)\n continue\n selected = choice\n }\n\n const { syncCommand: sync } = await import('./commands/sync.ts')\n return sync(state, {\n packages: selected,\n global: false,\n agent: currentAgent,\n yes: false,\n })\n }\n case 'update': {\n if (state.outdated.length === 0) {\n p.log.success('All skills up to date')\n return\n }\n const selected = 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 (p.isCancel(selected) || selected.length === 0)\n continue\n const { syncCommand: syncUpdate } = await import('./commands/sync.ts')\n return syncUpdate(state, {\n packages: selected,\n global: false,\n agent: currentAgent,\n yes: false,\n })\n }\n case 'remove':\n await removeCommand(state, {\n global: false,\n agent: currentAgent,\n yes: false,\n })\n continue\n case 'search': {\n const { interactiveSearch } = await import('./commands/search-interactive.ts')\n await interactiveSearch()\n continue\n }\n case 'info':\n await statusCommand({ global: false })\n continue\n case 'config':\n await configCommand()\n continue\n }\n }\n },\n})\n\nrunMain(main)\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.mjs","names":["agents","skilldVersion","agents"],"sources":["../src/commands/config.ts","../src/commands/remove.ts","../src/commands/status.ts","../src/commands/wizard.ts","../src/cli.ts"],"sourcesContent":["import type { FeaturesConfig } from '../core/config.ts'\nimport * as p from '@clack/prompts'\nimport { defineCommand } from 'citty'\nimport { agents, getAvailableModels } from '../agent/index.ts'\nimport { getInstalledGenerators, introLine, 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 config = readConfig()\n\n const features = config.features ?? defaultFeatures\n const enabledCount = Object.values(features).filter(Boolean).length\n\n const action = await p.select({\n message: 'Settings',\n options: [\n { label: 'Change features', value: 'features', hint: `${enabledCount}/4 enabled` },\n { label: 'Change model', value: 'model', hint: config.model || 'auto' },\n { label: 'Change agent', value: 'agent', hint: config.agent || 'auto-detect' },\n ],\n })\n\n if (p.isCancel(action)) {\n p.cancel('Cancelled')\n return\n }\n\n switch (action) {\n case 'features': {\n const featureOptions = [\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 ] as const\n\n const selected = await p.multiselect({\n message: 'Enable features',\n options: featureOptions.map(f => ({\n label: f.label,\n value: f.value,\n hint: f.hint,\n })),\n initialValues: Object.entries(features)\n .filter(([, v]) => v)\n .map(([k]) => k) as Array<keyof FeaturesConfig>,\n required: false,\n })\n\n if (p.isCancel(selected))\n return\n\n const updated: FeaturesConfig = {\n search: selected.includes('search'),\n issues: selected.includes('issues'),\n discussions: selected.includes('discussions'),\n releases: selected.includes('releases'),\n }\n updateConfig({ features: updated })\n p.log.success(`Features updated: ${selected.length} enabled`)\n break\n }\n\n case 'model': {\n const available = await getAvailableModels()\n if (available.length === 0) {\n p.log.warn('No LLM CLIs found')\n return\n }\n\n const model = await p.select({\n message: 'Select default model',\n options: [\n { label: 'Auto (prompt each time)', value: '' },\n ...available.map(m => ({\n label: m.recommended ? `${m.name} (Recommended)` : m.name,\n value: m.id,\n hint: m.hint,\n })),\n ],\n initialValue: config.model || '',\n })\n\n if (p.isCancel(model))\n return\n\n updateConfig({ model: (model || undefined) as typeof config.model })\n p.log.success(model ? `Default model set to ${model}` : 'Model will be prompted each time')\n break\n }\n\n case 'agent': {\n const agentChoice = await p.select({\n message: 'Select default agent',\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\n if (p.isCancel(agentChoice))\n return\n\n updateConfig({ agent: agentChoice || undefined })\n p.log.success(agentChoice ? `Default agent set to ${agentChoice}` : 'Agent will be auto-detected')\n break\n }\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 const generators = getInstalledGenerators()\n const config = readConfig()\n p.intro(introLine({ state, generators, modelId: config.model }))\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 }\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 = [...pkg.agents].map(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","import type { FeaturesConfig } from '../core/config.ts'\nimport { execSync } from 'node:child_process'\nimport * as p from '@clack/prompts'\nimport { getAvailableModels } from '../agent/index.ts'\nimport { isInteractive } from '../cli-helpers.ts'\nimport { defaultFeatures, updateConfig } from '../core/config.ts'\n\nfunction hasGhCli(): boolean {\n if (process.env.SKILLD_NO_GH)\n return false\n try {\n execSync('gh --version', { stdio: 'ignore' })\n return true\n }\n catch {\n return false\n }\n}\n\nexport async function runWizard(): Promise<void> {\n if (!isInteractive())\n return\n\n p.note(\n 'Skilld gives your AI agent skill knowledge on your NPM\\n'\n + 'dependencies gathered from versioned docs, source code\\n'\n + 'and GitHub issues.',\n 'Welcome to skilld',\n )\n\n const ghInstalled = hasGhCli()\n\n if (ghInstalled) {\n p.log.success(\n 'GitHub CLI detected — will use it to pull issues and discussions.',\n )\n }\n else {\n p.log.warn(\n 'GitHub CLI not found. Install it to enable issues/discussions:\\n'\n + ' \\x1B[36mhttps://cli.github.com\\x1B[0m',\n )\n }\n\n // Feature toggles\n const selected = await p.multiselect({\n message: 'Which features would you like to enable?',\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', disabled: !ghInstalled },\n { label: 'GitHub discussions', value: 'discussions' as const, hint: 'include Q&A and community knowledge', disabled: !ghInstalled },\n ],\n initialValues: [\n ...Object.entries(defaultFeatures)\n .filter(([, v]) => v)\n .map(([k]) => k),\n ...(ghInstalled ? ['issues', 'discussions'] as const : []),\n ] as Array<keyof FeaturesConfig>,\n required: false,\n })\n\n if (p.isCancel(selected)) {\n p.cancel('Setup cancelled')\n process.exit(0)\n }\n\n const features: FeaturesConfig = {\n search: selected.includes('search'),\n issues: selected.includes('issues'),\n discussions: selected.includes('discussions'),\n releases: selected.includes('releases'),\n }\n\n // LLM optimization — optional, model selection is independent of target agent\n const allModels = process.env.SKILLD_NO_AGENTS ? [] : await getAvailableModels()\n let modelId: string | undefined\n\n if (allModels.length > 0) {\n p.note(\n 'Skills work without an LLM, but one can rewrite your\\n'\n + 'SKILL.md files with best practices and better structure.\\n'\n + '\\x1B[90mThis is separate from the agent where skills are installed —\\n'\n + 'the target agent is auto-detected from your project files.\\x1B[0m',\n 'Optional: LLM optimization',\n )\n\n const modelChoice = await p.select({\n message: 'Model for generating SKILL.md',\n options: [\n { label: 'Skip', value: '', hint: 'use raw docs, no LLM needed' },\n ...allModels.map(m => ({\n label: m.recommended ? `${m.name} (Recommended)` : m.name,\n value: m.id,\n hint: `${m.agentName} · ${m.hint}`,\n })),\n ],\n })\n\n if (p.isCancel(modelChoice)) {\n p.cancel('Setup cancelled')\n process.exit(0)\n }\n\n modelId = (modelChoice as string) || undefined\n }\n else {\n p.log.warn(\n 'No supported LLM CLIs detected (claude, gemini, codex).\\n'\n + ' Skills will still work, but won\\'t be LLM-optimized.',\n )\n const proceed = await p.confirm({\n message: 'Continue without LLM optimization?',\n initialValue: true,\n })\n if (p.isCancel(proceed) || !proceed) {\n p.cancel('Setup cancelled')\n process.exit(0)\n }\n }\n\n updateConfig({\n features,\n ...(modelId ? { model: modelId as any } : { skipLlm: true }),\n })\n\n p.outro('Thanks, you\\'re all set! Change config anytime with `skilld config`.')\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 { detectImportedPackages } from './agent/index.ts'\nimport { formatStatus, getRepoHint, isInteractive, promptForAgent, relativeTime, resolveAgent, sharedArgs } 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 { 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']\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 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 },\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 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: skip interactive menu, just offer `skilld add <pkg>` usage\n if (currentAgent === 'none') {\n p.log.info('No agent selected. Use `skilld add <pkg>` to export portable prompts.')\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 const { 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 - no skills yet\n if (state.skills.length === 0) {\n if (!hasCompletedWizard()) {\n await runWizard()\n }\n\n // Transition to project setup\n const pkgJsonPath = join(cwd, 'package.json')\n const hasPkgJson = existsSync(pkgJsonPath)\n const projectName = hasPkgJson\n ? JSON.parse(readFileSync(pkgJsonPath, 'utf-8')).name\n : 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 package names manually or run inside a project')\n }\n\n p.log.info('Tip: Only generate skills for packages your agent struggles with.\\n The fewer skills, the more context you have for everything else :)')\n\n // Initial setup loop — allow user to go back\n let setupComplete = false\n while (!setupComplete) {\n const source = hasPkgJson\n ? await p.select({\n message: 'How should I find packages?',\n options: [\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 ],\n })\n : 'manual' as const\n\n if (p.isCancel(source)) {\n p.cancel('Setup cancelled')\n return\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 = [...state.deps.keys()].map(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 = [...state.deps.keys()].map(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 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: packages,\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 // syncCommand will ask about LLM after generating base skills\n const { syncCommand } = await import('./commands/sync.ts')\n await syncCommand(state, {\n packages: selected,\n global: false,\n agent,\n yes: false,\n })\n setupComplete = true\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 // Menu loop — Escape in sub-actions returns to menu\n\n while (true) {\n type ActionValue = 'install' | 'update' | 'remove' | 'search' | 'info' | 'config'\n const options: Array<{ label: string, value: ActionValue, hint?: string }> = []\n\n options.push({ label: 'Add new skills', value: 'install' })\n if (state.outdated.length > 0) {\n options.push({ label: 'Update skills', value: 'update', hint: `\\x1B[33m${state.outdated.length} outdated\\x1B[0m` })\n }\n options.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\n const action = await p.select({\n message: 'What would you like to do?',\n options,\n })\n\n if (p.isCancel(action)) {\n p.cancel('Cancelled')\n return\n }\n\n switch (action) {\n case 'install': {\n const installedNames = new Set(state.skills.map(s => s.packageName || s.name))\n const uninstalledDeps = [...state.deps.keys()].filter(d => !installedNames.has(d))\n const allDepsInstalled = uninstalledDeps.length === 0\n const hasPkgJsonMenu = existsSync(join(cwd, 'package.json'))\n\n const source = hasPkgJsonMenu\n ? 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 if (p.isCancel(source))\n continue\n\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) || !input)\n continue\n selected = input.split(/[,\\s]+/).map(s => s.trim()).filter(Boolean)\n if (selected.length === 0)\n continue\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 usages = result.packages\n .filter(pkg => depSet.has(pkg.name) || pkg.source === 'preset')\n .filter(pkg => !installedNames.has(pkg.name))\n\n if (usages.length === 0) {\n spinner.stop('All detected imports already have skills')\n continue\n }\n else {\n spinner.stop(`Found ${usages.length} imported packages`)\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 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 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: packages,\n })\n\n if (p.isCancel(choice) || choice.length === 0)\n continue\n selected = choice\n }\n\n const { syncCommand: sync } = await import('./commands/sync.ts')\n return sync(state, {\n packages: selected,\n global: false,\n agent,\n yes: false,\n })\n }\n case 'update': {\n if (state.outdated.length === 0) {\n p.log.success('All skills up to date')\n return\n }\n const selected = 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 (p.isCancel(selected) || selected.length === 0)\n continue\n const { syncCommand: syncUpdate } = await import('./commands/sync.ts')\n return syncUpdate(state, {\n packages: selected,\n global: false,\n agent,\n yes: false,\n })\n }\n case 'remove':\n await removeCommand(state, {\n global: false,\n agent,\n yes: false,\n })\n continue\n case 'search': {\n const { interactiveSearch } = await import('./commands/search-interactive.ts')\n await interactiveSearch()\n continue\n }\n case 'info':\n await statusCommand({ global: false })\n continue\n case 'config':\n await configCommand()\n continue\n }\n }\n },\n})\n\nrunMain(main)\n"],"mappings":"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"}
|
package/dist/retriv/index.d.mts
CHANGED
|
@@ -3,6 +3,9 @@ import * as retriv from "retriv";
|
|
|
3
3
|
|
|
4
4
|
//#region src/retriv/index.d.ts
|
|
5
5
|
type RetrivInstance = Awaited<ReturnType<typeof getDb>>;
|
|
6
|
+
declare class SearchDepsUnavailableError extends Error {
|
|
7
|
+
constructor(cause: unknown);
|
|
8
|
+
}
|
|
6
9
|
declare function getDb(config: Pick<IndexConfig, 'dbPath'>): Promise<retriv.SearchProvider & {
|
|
7
10
|
_testSetCategories?: (cats: string[]) => void;
|
|
8
11
|
}>;
|
|
@@ -25,5 +28,5 @@ declare function openPool(dbPaths: string[]): Promise<Map<string, RetrivInstance
|
|
|
25
28
|
declare function searchPooled(query: string, pool: Map<string, RetrivInstance>, options?: SearchOptions): Promise<SearchSnippet[]>;
|
|
26
29
|
declare function closePool(pool: Map<string, RetrivInstance>): Promise<void>;
|
|
27
30
|
//#endregion
|
|
28
|
-
export { type ChunkEntity, type Document, type IndexConfig, type IndexPhase, type IndexProgress, type SearchFilter, type SearchOptions, type SearchResult, type SearchSnippet, closePool, createIndex, createIndexDirect, openPool, search, searchPooled, searchSnippets };
|
|
31
|
+
export { type ChunkEntity, type Document, type IndexConfig, type IndexPhase, type IndexProgress, SearchDepsUnavailableError, type SearchFilter, type SearchOptions, type SearchResult, type SearchSnippet, closePool, createIndex, createIndexDirect, getDb, openPool, search, searchPooled, searchSnippets };
|
|
29
32
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/retriv/index.ts"],"mappings":";;;;KAKK,cAAA,GAAiB,OAAA,CAAQ,UAAA,QAAkB,KAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/retriv/index.ts"],"mappings":";;;;KAKK,cAAA,GAAiB,OAAA,CAAQ,UAAA,QAAkB,KAAA;AAAA,cAEnC,0BAAA,SAAmC,KAAA;cAClC,KAAA;AAAA;AAAA,iBAQQ,KAAA,CAAM,MAAA,EAAQ,IAAA,CAAK,WAAA,cAAsB,OAAA,CAAvB,MAAA,CAAuB,cAAA;;;;;;;iBAuCzC,iBAAA,CACpB,SAAA,EAAW,QAAA,IACX,MAAA,EAAQ,WAAA,GACP,OAAA;;;;AAnDH;iBA6DsB,WAAA,CACpB,SAAA,EAAW,QAAA,IACX,MAAA,EAAQ,WAAA,GACP,OAAA;AAAA,iBAMmB,MAAA,CACpB,KAAA,UACA,MAAA,EAAQ,WAAA,EACR,OAAA,GAAS,aAAA,GACR,OAAA,CAAQ,YAAA;;;;iBAqBW,cAAA,CACpB,KAAA,UACA,MAAA,EAAQ,WAAA,EACR,OAAA,GAAS,aAAA,GACR,OAAA,CAAQ,aAAA;AAAA,iBA2BW,QAAA,CAAS,OAAA,aAAoB,OAAA,CAAQ,GAAA,SAAY,cAAA;AAAA,iBASjD,YAAA,CACpB,KAAA,UACA,IAAA,EAAM,GAAA,SAAY,cAAA,GAClB,OAAA,GAAS,aAAA,GACR,OAAA,CAAQ,aAAA;AAAA,iBAkCW,SAAA,CAAU,IAAA,EAAM,GAAA,SAAY,cAAA,IAAkB,OAAA"}
|
package/dist/retriv/index.mjs
CHANGED
|
@@ -1,18 +1,33 @@
|
|
|
1
1
|
import "../_chunks/yaml.mjs";
|
|
2
2
|
import { a as stripFrontmatter } from "../_chunks/markdown.mjs";
|
|
3
|
+
var SearchDepsUnavailableError = class extends Error {
|
|
4
|
+
constructor(cause) {
|
|
5
|
+
super("Search dependencies unavailable (sqlite-vec or retriv not installed). Search indexing skipped.");
|
|
6
|
+
this.name = "SearchDepsUnavailableError";
|
|
7
|
+
this.cause = cause;
|
|
8
|
+
}
|
|
9
|
+
};
|
|
3
10
|
async function getDb(config) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
let createRetriv, autoChunker, sqliteMod, sqliteVec, transformersJs, cachedEmbeddings;
|
|
12
|
+
try {
|
|
13
|
+
[{createRetriv}, {autoChunker}, sqliteMod, sqliteVec, {transformersJs}, {cachedEmbeddings}] = await Promise.all([
|
|
14
|
+
import("retriv"),
|
|
15
|
+
import("retriv/chunkers/auto"),
|
|
16
|
+
import("retriv/db/sqlite"),
|
|
17
|
+
import("sqlite-vec"),
|
|
18
|
+
import("retriv/embeddings/transformers-js"),
|
|
19
|
+
import("../_chunks/embedding-cache.mjs").then((n) => n.n)
|
|
20
|
+
]);
|
|
21
|
+
} catch (err) {
|
|
22
|
+
if (err?.code === "ERR_MODULE_NOT_FOUND") throw new SearchDepsUnavailableError(err);
|
|
23
|
+
throw err;
|
|
24
|
+
}
|
|
11
25
|
const embeddings = await cachedEmbeddings(transformersJs());
|
|
12
26
|
return createRetriv({
|
|
13
27
|
driver: sqliteMod.default({
|
|
14
28
|
path: config.dbPath,
|
|
15
|
-
embeddings
|
|
29
|
+
embeddings,
|
|
30
|
+
sqliteVec
|
|
16
31
|
}),
|
|
17
32
|
chunking: autoChunker()
|
|
18
33
|
});
|
|
@@ -31,7 +46,7 @@ async function createIndexDirect(documents, config) {
|
|
|
31
46
|
* Falls back to direct indexing if worker fails to spawn.
|
|
32
47
|
*/
|
|
33
48
|
async function createIndex(documents, config) {
|
|
34
|
-
const { createIndexInWorker } = await import("../_chunks/pool.mjs");
|
|
49
|
+
const { createIndexInWorker } = await import("../_chunks/pool.mjs").then((n) => n.t);
|
|
35
50
|
return createIndexInWorker(documents, config);
|
|
36
51
|
}
|
|
37
52
|
async function search(query, config, options = {}) {
|
|
@@ -122,6 +137,6 @@ async function closePool(pool) {
|
|
|
122
137
|
await Promise.all([...pool.values()].map((db) => db.close?.()));
|
|
123
138
|
pool.clear();
|
|
124
139
|
}
|
|
125
|
-
export { closePool, createIndex, createIndexDirect, openPool, search, searchPooled, searchSnippets };
|
|
140
|
+
export { SearchDepsUnavailableError, closePool, createIndex, createIndexDirect, getDb, openPool, search, searchPooled, searchSnippets };
|
|
126
141
|
|
|
127
142
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/retriv/index.ts"],"sourcesContent":["import type { ChunkEntity, Document, IndexConfig, IndexPhase, IndexProgress, SearchFilter, SearchOptions, SearchResult, SearchSnippet } from './types.ts'\nimport { stripFrontmatter } from '../core/markdown.ts'\n\nexport type { ChunkEntity, Document, IndexConfig, IndexPhase, IndexProgress, SearchFilter, SearchOptions, SearchResult, SearchSnippet }\n\ntype RetrivInstance = Awaited<ReturnType<typeof getDb>>\n\n// Dynamic imports: retriv/chunkers/auto eagerly loads typescript which may not be installed (e.g. npx)\
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/retriv/index.ts"],"sourcesContent":["import type { ChunkEntity, Document, IndexConfig, IndexPhase, IndexProgress, SearchFilter, SearchOptions, SearchResult, SearchSnippet } from './types.ts'\nimport { stripFrontmatter } from '../core/markdown.ts'\n\nexport type { ChunkEntity, Document, IndexConfig, IndexPhase, IndexProgress, SearchFilter, SearchOptions, SearchResult, SearchSnippet }\n\ntype RetrivInstance = Awaited<ReturnType<typeof getDb>>\n\nexport class SearchDepsUnavailableError extends Error {\n constructor(cause: unknown) {\n super('Search dependencies unavailable (sqlite-vec or retriv not installed). Search indexing skipped.')\n this.name = 'SearchDepsUnavailableError'\n this.cause = cause\n }\n}\n\n// Dynamic imports: retriv/chunkers/auto eagerly loads typescript which may not be installed (e.g. npx)\nexport async function getDb(config: Pick<IndexConfig, 'dbPath'>) {\n let createRetriv, autoChunker, sqliteMod, sqliteVec, transformersJs, cachedEmbeddings\n try {\n ;([\n { createRetriv },\n { autoChunker },\n sqliteMod,\n sqliteVec,\n { transformersJs },\n { cachedEmbeddings },\n ] = await Promise.all([\n import('retriv'),\n import('retriv/chunkers/auto'),\n import('retriv/db/sqlite'),\n import('sqlite-vec'),\n import('retriv/embeddings/transformers-js'),\n import('./embedding-cache.ts'),\n ]))\n }\n catch (err: any) {\n if (err?.code === 'ERR_MODULE_NOT_FOUND')\n throw new SearchDepsUnavailableError(err)\n throw err\n }\n const embeddings = await cachedEmbeddings(transformersJs())\n return createRetriv({\n driver: sqliteMod.default({\n path: config.dbPath,\n embeddings,\n sqliteVec,\n }),\n chunking: autoChunker(),\n })\n}\n\n/**\n * Index documents in-process (no worker thread).\n * Preferred for tests and environments where worker_threads is unreliable.\n */\nexport async function createIndexDirect(\n documents: Document[],\n config: IndexConfig,\n): Promise<void> {\n const db = await getDb(config)\n await db.index(documents, { onProgress: config.onProgress })\n await db.close?.()\n}\n\n/**\n * Index documents in a background worker thread.\n * Falls back to direct indexing if worker fails to spawn.\n */\nexport async function createIndex(\n documents: Document[],\n config: IndexConfig,\n): Promise<void> {\n // Dynamic import justified: search/searchSnippets shouldn't pull in worker_threads\n const { createIndexInWorker } = await import('./pool.ts')\n return createIndexInWorker(documents, config)\n}\n\nexport async function search(\n query: string,\n config: IndexConfig,\n options: SearchOptions = {},\n): Promise<SearchResult[]> {\n const { limit = 10, filter } = options\n const db = await getDb(config)\n const results = await db.search(query, { limit, filter, returnContent: true, returnMetadata: true, returnMeta: true })\n await db.close?.()\n\n return results.map(r => ({\n id: r.id,\n content: r.content ?? '',\n score: r.score,\n metadata: r.metadata ?? {},\n highlights: r._meta?.highlights ?? [],\n lineRange: r._chunk?.lineRange,\n entities: r._chunk?.entities,\n scope: r._chunk?.scope,\n }))\n}\n\n/**\n * Search and return formatted snippets\n */\nexport async function searchSnippets(\n query: string,\n config: IndexConfig,\n options: SearchOptions = {},\n): Promise<SearchSnippet[]> {\n const results = await search(query, config, options)\n return toSnippets(results)\n}\n\nfunction toSnippets(results: SearchResult[]): SearchSnippet[] {\n return results.map((r) => {\n const content = stripFrontmatter(r.content)\n const source = r.metadata.source || r.id\n const lines = content.split('\\n').length\n\n return {\n package: r.metadata.package || 'unknown',\n source,\n lineStart: r.lineRange?.[0] ?? 1,\n lineEnd: r.lineRange?.[1] ?? lines,\n content,\n score: r.score,\n highlights: r.highlights,\n entities: r.entities,\n scope: r.scope,\n }\n })\n}\n\n// ── Pooled DB access for interactive search ──\n\nexport async function openPool(dbPaths: string[]): Promise<Map<string, RetrivInstance>> {\n const pool = new Map<string, RetrivInstance>()\n await Promise.all(dbPaths.map(async (dbPath) => {\n const db = await getDb({ dbPath })\n pool.set(dbPath, db)\n }))\n return pool\n}\n\nexport async function searchPooled(\n query: string,\n pool: Map<string, RetrivInstance>,\n options: SearchOptions = {},\n): Promise<SearchSnippet[]> {\n const { limit = 10, filter } = options\n const fetchLimit = limit * 2 // Over-fetch to compensate for dedup\n const allResults = await Promise.all(\n [...pool.values()].map(async (db) => {\n const results = await db.search(query, { limit: fetchLimit, filter, returnContent: true, returnMetadata: true, returnMeta: true })\n return results.map(r => ({\n id: r.id,\n content: r.content ?? '',\n score: r.score,\n metadata: r.metadata ?? {},\n highlights: r._meta?.highlights ?? [],\n lineRange: r._chunk?.lineRange as [number, number] | undefined,\n entities: r._chunk?.entities,\n scope: r._chunk?.scope,\n }))\n }),\n )\n // Deduplicate by source+lineRange (overlapping chunks from same doc)\n const seen = new Set<string>()\n const merged = allResults.flat()\n .sort((a, b) => b.score - a.score)\n .filter((r) => {\n const lr = r.lineRange\n const key = `${r.metadata.source || r.id}:${lr?.[0]}-${lr?.[1]}`\n if (seen.has(key))\n return false\n seen.add(key)\n return true\n })\n .slice(0, limit)\n return toSnippets(merged)\n}\n\nexport async function closePool(pool: Map<string, RetrivInstance>): Promise<void> {\n await Promise.all([...pool.values()].map(db => db.close?.()))\n pool.clear()\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.d.mts","names":[],"sources":["../../src/retriv/worker.ts"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"worker.d.mts","names":[],"sources":["../../src/retriv/worker.ts"],"mappings":";;;UAGiB,kBAAA;EACf,IAAA;EACA,EAAA;EACA,SAAA,EAAW,QAAA;EACX,MAAA;AAAA;AAAA,UAGe,qBAAA;EACf,IAAA;AAAA;AAAA,KAGU,aAAA,GAAgB,kBAAA,GAAqB,qBAAA;AAAA,UAEhC,sBAAA;EACf,IAAA;EACA,EAAA;EACA,KAAA;EACA,OAAA;EACA,KAAA;AAAA;AAAA,UAGe,kBAAA;EACf,IAAA;EACA,EAAA;AAAA;AAAA,UAGe,mBAAA;EACf,IAAA;EACA,EAAA;EACA,OAAA;AAAA;AAAA,KAGU,cAAA,GAAiB,sBAAA,GAAyB,kBAAA,GAAqB,mBAAA"}
|
package/dist/retriv/worker.mjs
CHANGED
|
@@ -1,12 +1,4 @@
|
|
|
1
|
-
import "../_chunks/config.mjs";
|
|
2
|
-
import "../_chunks/sanitize.mjs";
|
|
3
|
-
import "../_chunks/cache.mjs";
|
|
4
|
-
import { t as cachedEmbeddings } from "../_chunks/embedding-cache.mjs";
|
|
5
1
|
import { parentPort } from "node:worker_threads";
|
|
6
|
-
import { createRetriv } from "retriv";
|
|
7
|
-
import { autoChunker } from "retriv/chunkers/auto";
|
|
8
|
-
import sqlite from "retriv/db/sqlite";
|
|
9
|
-
import { transformersJs } from "retriv/embeddings/transformers-js";
|
|
10
2
|
if (parentPort) parentPort.on("message", async (msg) => {
|
|
11
3
|
if (msg.type === "shutdown") process.exit(0);
|
|
12
4
|
if (msg.type === "index") {
|
|
@@ -24,14 +16,8 @@ if (parentPort) parentPort.on("message", async (msg) => {
|
|
|
24
16
|
});
|
|
25
17
|
}
|
|
26
18
|
};
|
|
27
|
-
const
|
|
28
|
-
const db = await
|
|
29
|
-
driver: sqlite({
|
|
30
|
-
path: config.dbPath,
|
|
31
|
-
embeddings
|
|
32
|
-
}),
|
|
33
|
-
chunking: autoChunker()
|
|
34
|
-
});
|
|
19
|
+
const { getDb } = await import("./index.mjs");
|
|
20
|
+
const db = await getDb(config);
|
|
35
21
|
await db.index(documents, { onProgress: config.onProgress });
|
|
36
22
|
await db.close?.();
|
|
37
23
|
parentPort.postMessage({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worker.mjs","names":[],"sources":["../../src/retriv/worker.ts"],"sourcesContent":["import type { IndexConfig, Document as RetrivDocument } from './types.ts'\nimport { parentPort } from 'node:worker_threads'\
|
|
1
|
+
{"version":3,"file":"worker.mjs","names":[],"sources":["../../src/retriv/worker.ts"],"sourcesContent":["import type { IndexConfig, Document as RetrivDocument } from './types.ts'\nimport { parentPort } from 'node:worker_threads'\n\nexport interface WorkerIndexMessage {\n type: 'index'\n id: number\n documents: RetrivDocument[]\n dbPath: string\n}\n\nexport interface WorkerShutdownMessage {\n type: 'shutdown'\n}\n\nexport type WorkerMessage = WorkerIndexMessage | WorkerShutdownMessage\n\nexport interface WorkerProgressResponse {\n type: 'progress'\n id: number\n phase: string\n current: number\n total: number\n}\n\nexport interface WorkerDoneResponse {\n type: 'done'\n id: number\n}\n\nexport interface WorkerErrorResponse {\n type: 'error'\n id: number\n message: string\n}\n\nexport type WorkerResponse = WorkerProgressResponse | WorkerDoneResponse | WorkerErrorResponse\n\nif (parentPort) {\n parentPort.on('message', async (msg: WorkerMessage) => {\n if (msg.type === 'shutdown') {\n process.exit(0)\n }\n\n if (msg.type === 'index') {\n const { id, documents, dbPath } = msg\n\n try {\n const config: IndexConfig = {\n dbPath,\n onProgress: ({ phase, current, total }) => {\n parentPort!.postMessage({ type: 'progress', id, phase, current, total } satisfies WorkerProgressResponse)\n },\n }\n\n const { getDb } = await import('./index.ts')\n const db = await getDb(config)\n await db.index(documents, { onProgress: config.onProgress })\n await db.close?.()\n\n parentPort!.postMessage({ type: 'done', id } satisfies WorkerDoneResponse)\n }\n catch (err) {\n parentPort!.postMessage({\n type: 'error',\n id,\n message: err instanceof Error ? err.message : String(err),\n } satisfies WorkerErrorResponse)\n }\n }\n })\n}\n"],"mappings":";AAqCA,IAAI,WACF,YAAW,GAAG,WAAW,OAAO,QAAuB;AACrD,KAAI,IAAI,SAAS,WACf,SAAQ,KAAK,EAAE;AAGjB,KAAI,IAAI,SAAS,SAAS;EACxB,MAAM,EAAE,IAAI,WAAW,WAAW;AAElC,MAAI;GACF,MAAM,SAAsB;IAC1B;IACA,aAAa,EAAE,OAAO,SAAS,YAAY;AACzC,gBAAY,YAAY;MAAE,MAAM;MAAY;MAAI;MAAO;MAAS;MAAO,CAAkC;;IAE5G;GAED,MAAM,EAAE,UAAU,MAAM,OAAO;GAC/B,MAAM,KAAK,MAAM,MAAM,OAAO;AAC9B,SAAM,GAAG,MAAM,WAAW,EAAE,YAAY,OAAO,YAAY,CAAC;AAC5D,SAAM,GAAG,SAAS;AAElB,cAAY,YAAY;IAAE,MAAM;IAAQ;IAAI,CAA8B;WAErE,KAAK;AACV,cAAY,YAAY;IACtB,MAAM;IACN;IACA,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAA;IACtD,CAA+B;;;EAGpC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "skilld",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.1.0",
|
|
5
5
|
"description": "Generate AI agent skills from npm package documentation",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "Harlan Wilton",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"oxc-parser": "^0.116.0",
|
|
61
61
|
"p-limit": "^7.3.0",
|
|
62
62
|
"pathe": "^2.0.3",
|
|
63
|
-
"retriv": "^0.10.
|
|
63
|
+
"retriv": "^0.10.4",
|
|
64
64
|
"semver": "^7.7.4",
|
|
65
65
|
"sqlite-vec": "^0.1.7-alpha.10",
|
|
66
66
|
"std-env": "^3.10.0",
|