skilld 0.1.2 → 0.2.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 +24 -23
- package/dist/_chunks/config.mjs +8 -2
- package/dist/_chunks/config.mjs.map +1 -1
- package/dist/_chunks/llm.mjs +710 -204
- package/dist/_chunks/llm.mjs.map +1 -1
- package/dist/_chunks/pool.mjs +115 -0
- package/dist/_chunks/pool.mjs.map +1 -0
- package/dist/_chunks/releases.mjs +689 -179
- package/dist/_chunks/releases.mjs.map +1 -1
- package/dist/_chunks/storage.mjs +311 -19
- package/dist/_chunks/storage.mjs.map +1 -1
- package/dist/_chunks/sync-parallel.mjs +134 -378
- package/dist/_chunks/sync-parallel.mjs.map +1 -1
- package/dist/_chunks/types.d.mts +9 -6
- package/dist/_chunks/types.d.mts.map +1 -1
- package/dist/_chunks/utils.d.mts +137 -68
- package/dist/_chunks/utils.d.mts.map +1 -1
- package/dist/_chunks/version.d.mts +43 -6
- package/dist/_chunks/version.d.mts.map +1 -1
- package/dist/agent/index.d.mts +58 -15
- package/dist/agent/index.d.mts.map +1 -1
- package/dist/agent/index.mjs +4 -2
- package/dist/cache/index.d.mts +2 -2
- package/dist/cache/index.mjs +2 -2
- package/dist/cli.mjs +2170 -1436
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +4 -3
- package/dist/index.mjs +2 -2
- package/dist/retriv/index.d.mts +16 -2
- package/dist/retriv/index.d.mts.map +1 -1
- package/dist/retriv/index.mjs +44 -15
- package/dist/retriv/index.mjs.map +1 -1
- package/dist/retriv/worker.d.mts +33 -0
- package/dist/retriv/worker.d.mts.map +1 -0
- package/dist/retriv/worker.mjs +47 -0
- package/dist/retriv/worker.mjs.map +1 -0
- package/dist/sources/index.d.mts +2 -2
- package/dist/sources/index.mjs +2 -2
- package/dist/types.d.mts +5 -3
- package/package.json +11 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-parallel.mjs","names":[],"sources":["../../src/commands/sync-parallel.ts"],"sourcesContent":["import type { AgentType, OptimizeModel, SkillSection } from '../agent'\nimport type { ResolveStep } from '../sources'\nimport { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport * as p from '@clack/prompts'\nimport logUpdate from 'log-update'\nimport pLimit from 'p-limit'\nimport {\n agents,\n\n generateSkillMd,\n optimizeDocs,\n\n sanitizeName,\n\n} from '../agent'\nimport {\n CACHE_DIR,\n clearCache,\n ensureCacheDir,\n getCacheDir,\n getPackageDbPath,\n getPkgKeyFiles,\n getShippedSkills,\n getVersionKey,\n hasShippedDocs,\n isCached,\n linkGithub,\n linkPkg,\n linkReferences,\n linkReleases,\n linkShippedSkill,\n listReferenceFiles,\n readCachedDocs,\n resolvePkgDir,\n writeToCache,\n} from '../cache'\nimport { defaultFeatures, readConfig, registerProject } from '../core/config'\nimport { writeLock } from '../core/lockfile'\nimport { createIndex } from '../retriv'\nimport {\n downloadLlmsDocs,\n fetchGitDocs,\n fetchLlmsTxt,\n fetchNpmPackage,\n fetchPkgDist,\n fetchReadmeContent,\n fetchReleaseNotes,\n normalizeLlmsLinks,\n parseGitHubUrl,\n parseMarkdownLinks,\n readLocalDependencies,\n resolveEntryFiles,\n resolveLocalPackageDocs,\n resolvePackageDocs,\n resolvePackageDocsWithAttempts,\n} from '../sources'\n\nimport { ensureGitignore, selectModel, selectSkillSections } from './sync'\n\ntype PackageStatus = 'pending' | 'resolving' | 'downloading' | 'embedding' | 'exploring' | 'thinking' | 'generating' | 'done' | 'error'\n\nconst RESOLVE_STEP_LABELS: Record<ResolveStep, string> = {\n 'npm': 'npm registry',\n 'github-docs': 'GitHub docs',\n 'github-meta': 'GitHub meta',\n 'github-search': 'GitHub search',\n 'readme': 'README',\n 'llms.txt': 'llms.txt',\n 'local': 'node_modules',\n}\n\ninterface PackageState {\n name: string\n status: PackageStatus\n message: string\n version?: string\n streamPreview?: string\n}\n\nconst STATUS_ICONS: Record<PackageStatus, string> = {\n pending: '○',\n resolving: '◐',\n downloading: '◒',\n embedding: '◓',\n exploring: '◔',\n thinking: '◔',\n generating: '◑',\n done: '✓',\n error: '✗',\n}\n\nconst STATUS_COLORS: Record<PackageStatus, string> = {\n pending: '\\x1B[90m',\n resolving: '\\x1B[36m',\n downloading: '\\x1B[36m',\n embedding: '\\x1B[36m',\n exploring: '\\x1B[34m', // Blue for exploring\n thinking: '\\x1B[35m', // Magenta for thinking\n generating: '\\x1B[33m',\n done: '\\x1B[32m',\n error: '\\x1B[31m',\n}\n\nexport interface ParallelSyncConfig {\n packages: string[]\n global: boolean\n agent: AgentType\n model?: OptimizeModel\n yes?: boolean\n force?: boolean\n concurrency?: number\n}\n\nexport async function syncPackagesParallel(config: ParallelSyncConfig): Promise<void> {\n const { packages, concurrency = 5 } = config\n const agent = agents[config.agent]\n const states = new Map<string, PackageState>()\n const cwd = process.cwd()\n\n // Initialize all packages as pending\n for (const pkg of packages) {\n states.set(pkg, { name: pkg, status: 'pending', message: 'Waiting...' })\n }\n\n // Render function\n function render() {\n const maxNameLen = Math.max(...packages.map(p => p.length), 20)\n const lines = [...states.values()].map((s) => {\n const icon = STATUS_ICONS[s.status]\n const color = STATUS_COLORS[s.status]\n const reset = '\\x1B[0m'\n const dim = '\\x1B[90m'\n const name = s.name.padEnd(maxNameLen)\n const version = s.version ? `${dim}${s.version}${reset} ` : ''\n const preview = s.streamPreview ? ` ${dim}${s.streamPreview}${reset}` : ''\n return ` ${color}${icon}${reset} ${name} ${version}${s.message}${preview}`\n })\n\n const doneCount = [...states.values()].filter(s => s.status === 'done').length\n const errorCount = [...states.values()].filter(s => s.status === 'error').length\n const header = `\\x1B[1mSyncing ${packages.length} packages\\x1B[0m (${doneCount} done${errorCount > 0 ? `, ${errorCount} failed` : ''})\\n`\n\n logUpdate(header + lines.join('\\n'))\n }\n\n function update(pkg: string, status: PackageStatus, message: string, version?: string) {\n const state = states.get(pkg)!\n state.status = status\n state.message = message\n state.streamPreview = undefined // Clear preview on status change\n if (version)\n state.version = version\n render()\n }\n\n ensureCacheDir()\n render()\n\n const limit = pLimit(concurrency)\n\n // Phase 1: Generate base skills (no LLM)\n const baseResults = await Promise.allSettled(\n packages.map(pkg =>\n limit(() => syncBaseSkill(pkg, config, cwd, update)),\n ),\n )\n\n logUpdate.done()\n\n // Collect successful packages for LLM phase (exclude shipped — they need no LLM)\n const successfulPkgs: string[] = []\n const errors: Array<{ pkg: string, reason: string }> = []\n for (let i = 0; i < baseResults.length; i++) {\n const r = baseResults[i]!\n if (r.status === 'fulfilled' && r.value !== 'shipped') {\n successfulPkgs.push(packages[i]!)\n }\n else if (r.status === 'rejected') {\n const err = r.reason\n const reason = err instanceof Error ? `${err.message}\\n${err.stack}` : String(err)\n errors.push({ pkg: packages[i]!, reason })\n }\n }\n\n p.log.success(`Created ${successfulPkgs.length} base skills`)\n\n if (errors.length > 0) {\n for (const { pkg, reason } of errors) {\n p.log.error(` ${pkg}: ${reason}`)\n }\n }\n\n // Phase 2: Ask about LLM enhancement (skip if -y without model, or skipLlm config)\n const globalConfig = readConfig()\n if (successfulPkgs.length > 0 && !globalConfig.skipLlm && !(config.yes && !config.model)) {\n const { sections, customPrompt, cancelled } = config.model\n ? { sections: ['best-practices', 'api'] as SkillSection[], customPrompt: undefined, cancelled: false }\n : await selectSkillSections()\n\n if (!cancelled && sections.length > 0) {\n const model = config.model ?? await selectModel(false)\n\n if (model) {\n // Reset states for LLM phase\n for (const pkg of successfulPkgs) {\n states.set(pkg, { name: pkg, status: 'pending', message: 'Waiting...' })\n }\n render()\n\n const llmResults = await Promise.allSettled(\n successfulPkgs.map(pkg =>\n limit(() => enhanceWithLLM(pkg, { ...config, model }, cwd, update, sections, customPrompt)),\n ),\n )\n\n logUpdate.done()\n\n const llmSucceeded = llmResults.filter(r => r.status === 'fulfilled').length\n p.log.success(`Enhanced ${llmSucceeded}/${successfulPkgs.length} skills with LLM`)\n }\n }\n }\n\n await ensureGitignore(agent.skillsDir, cwd, config.global)\n\n p.outro(`Synced ${successfulPkgs.length}/${packages.length} packages`)\n}\n\ntype UpdateFn = (pkg: string, status: PackageStatus, message: string, version?: string) => void\n\n/** Phase 1: Generate base skill (no LLM). Returns 'shipped' if shipped skill was linked. */\nasync function syncBaseSkill(\n packageName: string,\n config: ParallelSyncConfig,\n cwd: string,\n update: UpdateFn,\n): Promise<'shipped' | 'synced'> {\n const localDeps = await readLocalDependencies(cwd).catch(() => [])\n const localVersion = localDeps.find(d => d.name === packageName)?.version\n\n const { package: resolvedPkg, attempts } = await resolvePackageDocsWithAttempts(packageName, {\n version: localVersion,\n cwd,\n onProgress: step => update(packageName, 'resolving', RESOLVE_STEP_LABELS[step]),\n })\n let resolved = resolvedPkg\n\n if (!resolved) {\n const pkgPath = join(cwd, 'package.json')\n if (existsSync(pkgPath)) {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n const deps = { ...pkg.dependencies, ...pkg.devDependencies }\n const depVersion = deps[packageName]\n\n if (depVersion?.startsWith('link:')) {\n update(packageName, 'resolving', 'Local package...')\n const { resolve } = await import('node:path')\n const localPath = resolve(cwd, depVersion.slice(5))\n resolved = await resolveLocalPackageDocs(localPath)\n }\n }\n }\n\n if (!resolved) {\n const npmAttempt = attempts.find(a => a.source === 'npm')\n let reason: string\n if (npmAttempt?.status === 'not-found') {\n reason = npmAttempt.message || 'Not on npm'\n }\n else {\n const failed = attempts.filter(a => a.status !== 'success')\n const messages = failed.map(a => a.message || a.source).join('; ')\n reason = messages || 'No docs found'\n }\n update(packageName, 'error', reason)\n throw new Error(`Could not find docs for: ${packageName}`)\n }\n\n const version = localVersion || resolved.version || 'latest'\n const versionKey = getVersionKey(version)\n\n // Download npm dist if not in node_modules\n if (!existsSync(join(cwd, 'node_modules', packageName))) {\n update(packageName, 'downloading', 'Downloading dist...', versionKey)\n await fetchPkgDist(packageName, version)\n }\n\n // Shipped skills: symlink directly, skip all doc fetching/caching/LLM\n const shippedSkills = getShippedSkills(packageName, cwd, version)\n if (shippedSkills.length > 0) {\n const agent = agents[config.agent]\n const baseDir = config.global\n ? join(CACHE_DIR, 'skills')\n : join(cwd, agent.skillsDir)\n mkdirSync(baseDir, { recursive: true })\n\n for (const shipped of shippedSkills) {\n linkShippedSkill(baseDir, shipped.skillName, shipped.skillDir)\n writeLock(baseDir, shipped.skillName, {\n packageName,\n version,\n source: 'shipped',\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n }\n if (!config.global)\n registerProject(cwd)\n update(packageName, 'done', 'Shipped', versionKey)\n return 'shipped'\n }\n\n // Force: nuke cached references + search index so all existsSync guards re-fetch\n if (config.force) {\n clearCache(packageName, version)\n const forcedDbPath = getPackageDbPath(packageName, version)\n if (existsSync(forcedDbPath))\n rmSync(forcedDbPath, { recursive: true, force: true })\n }\n\n const useCache = isCached(packageName, version)\n if (useCache) {\n update(packageName, 'downloading', 'Using cache', versionKey)\n }\n else {\n update(packageName, 'downloading', config.force ? 'Re-fetching docs...' : 'Fetching docs...', versionKey)\n }\n\n const agent = agents[config.agent]\n const baseDir = config.global\n ? join(CACHE_DIR, 'skills')\n : join(cwd, agent.skillsDir)\n\n const skillDir = join(baseDir, sanitizeName(packageName))\n mkdirSync(skillDir, { recursive: true })\n\n let docSource: string = resolved.readmeUrl || 'readme'\n let docsType: 'llms.txt' | 'readme' | 'docs' = 'readme'\n const docsToIndex: Array<{ id: string, content: string, metadata: Record<string, any> }> = []\n\n if (!useCache) {\n const cachedDocs: Array<{ path: string, content: string }> = []\n\n // Try versioned git docs first\n if (resolved.gitDocsUrl && resolved.repoUrl) {\n const gh = parseGitHubUrl(resolved.repoUrl)\n if (gh) {\n update(packageName, 'downloading', 'Git docs...', versionKey)\n const gitDocs = await fetchGitDocs(gh.owner, gh.repo, version, packageName)\n if (gitDocs && gitDocs.files.length > 0) {\n update(packageName, 'downloading', `0/${gitDocs.files.length} docs @ ${gitDocs.ref}`, versionKey)\n\n const BATCH_SIZE = 20\n const results: Array<{ file: string, content: string } | null> = []\n let downloaded = 0\n\n for (let i = 0; i < gitDocs.files.length; i += BATCH_SIZE) {\n const batch = gitDocs.files.slice(i, i + BATCH_SIZE)\n const batchResults = await Promise.all(\n batch.map(async (file) => {\n const url = `${gitDocs.baseUrl}/${file}`\n const res = await fetch(url, { headers: { 'User-Agent': 'skilld/1.0' } }).catch(() => null)\n if (!res?.ok)\n return null\n const content = await res.text()\n downloaded++\n update(packageName, 'downloading', `${downloaded}/${gitDocs.files.length} docs @ ${gitDocs.ref}`, versionKey)\n return { file, content }\n }),\n )\n results.push(...batchResults)\n }\n\n for (const r of results) {\n if (r) {\n const cachePath = gitDocs.docsPrefix ? r.file.replace(gitDocs.docsPrefix, '') : r.file\n cachedDocs.push({ path: cachePath, content: r.content })\n docsToIndex.push({\n id: cachePath,\n content: r.content,\n metadata: { package: packageName, source: cachePath, type: 'doc' },\n })\n }\n }\n\n const downloadedCount = results.filter(Boolean).length\n if (downloadedCount > 0) {\n docSource = `${resolved.repoUrl}/tree/${gitDocs.ref}/docs`\n docsType = 'docs'\n }\n }\n }\n }\n\n if (resolved.llmsUrl && cachedDocs.length === 0) {\n update(packageName, 'downloading', 'Fetching llms.txt...', versionKey)\n const llmsContent = await fetchLlmsTxt(resolved.llmsUrl)\n if (llmsContent) {\n docSource = resolved.llmsUrl!\n docsType = 'llms.txt'\n cachedDocs.push({ path: 'llms.txt', content: normalizeLlmsLinks(llmsContent.raw) })\n\n if (llmsContent.links.length > 0) {\n update(packageName, 'downloading', `0/${llmsContent.links.length} linked docs...`, versionKey)\n const baseUrl = resolved.docsUrl || new URL(resolved.llmsUrl).origin\n const docs = await downloadLlmsDocs(llmsContent, baseUrl)\n\n for (const doc of docs) {\n const localPath = doc.url.startsWith('/') ? doc.url.slice(1) : doc.url\n const cachePath = join('docs', ...localPath.split('/'))\n cachedDocs.push({ path: cachePath, content: doc.content })\n\n docsToIndex.push({\n id: doc.url,\n content: doc.content,\n metadata: { package: packageName, source: cachePath, type: 'doc' },\n })\n }\n }\n }\n }\n\n // Fallback to README\n if (resolved.readmeUrl && cachedDocs.length === 0) {\n update(packageName, 'downloading', 'Fetching README...', versionKey)\n const content = await fetchReadmeContent(resolved.readmeUrl)\n if (content) {\n cachedDocs.push({ path: 'docs/README.md', content })\n docsToIndex.push({\n id: 'README.md',\n content,\n metadata: { package: packageName, source: 'docs/README.md', type: 'doc' },\n })\n }\n }\n\n // Write to global cache\n if (cachedDocs.length > 0) {\n writeToCache(packageName, version, cachedDocs)\n }\n }\n else {\n // Detect docs type from cache\n const cacheDir = getCacheDir(packageName, version)\n if (existsSync(join(cacheDir, 'docs', 'index.md')) || existsSync(join(cacheDir, 'docs', 'guide'))) {\n docsType = 'docs'\n }\n else if (existsSync(join(cacheDir, 'llms.txt'))) {\n docsType = 'llms.txt'\n }\n\n // Load cached docs for indexing if db doesn't exist yet\n const dbPath = getPackageDbPath(packageName, version)\n if (!existsSync(dbPath)) {\n const cached = readCachedDocs(packageName, version)\n for (const doc of cached) {\n docsToIndex.push({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, type: 'doc' },\n })\n }\n }\n }\n\n const features = readConfig().features ?? defaultFeatures\n\n // Fetch release notes\n const releasesPath = join(getCacheDir(packageName, version), 'releases')\n if (features.releases && resolved.repoUrl && !existsSync(releasesPath)) {\n const gh = parseGitHubUrl(resolved.repoUrl)\n if (gh) {\n update(packageName, 'downloading', 'Fetching releases...', versionKey)\n const releaseDocs = await fetchReleaseNotes(gh.owner, gh.repo, version, resolved.gitRef, packageName)\n if (releaseDocs.length > 0) {\n writeToCache(packageName, version, releaseDocs)\n for (const doc of releaseDocs) {\n docsToIndex.push({\n id: doc.path,\n content: doc.content,\n metadata: { package: packageName, source: doc.path, type: 'release' },\n })\n }\n }\n }\n }\n\n // Create symlinks\n update(packageName, 'downloading', 'Linking references...', versionKey)\n try {\n linkPkg(skillDir, packageName, cwd, version)\n if (!hasShippedDocs(packageName, cwd, version) && docsType !== 'readme') {\n linkReferences(skillDir, packageName, version)\n }\n linkGithub(skillDir, packageName, version)\n linkReleases(skillDir, packageName, version)\n }\n catch {}\n\n // Collect entry files for indexing\n update(packageName, 'embedding', 'Scanning exports...', versionKey)\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const entryFiles = features.search && pkgDir ? await resolveEntryFiles(pkgDir) : []\n if (entryFiles.length > 0) {\n for (const e of entryFiles) {\n docsToIndex.push({\n id: e.path,\n content: e.content,\n metadata: { package: packageName, source: `pkg/${e.path}`, type: e.type },\n })\n }\n }\n\n // Single batch index — one model init, one write\n const dbPath = getPackageDbPath(packageName, version)\n if (docsToIndex.length > 0) {\n update(packageName, 'embedding', `Indexing ${docsToIndex.length} documents...`, versionKey)\n await createIndex(docsToIndex, {\n dbPath,\n onProgress: (current, total, doc) => {\n const type = doc?.type === 'source' || doc?.type === 'types' ? 'code' : 'doc'\n const file = doc?.id ? doc.id.split('/').pop() : ''\n const pct = Math.round((current / total) * 100)\n update(packageName, 'embedding', `Indexing ${type} ${file}... ${current}/${total} ${pct}%`, versionKey)\n },\n })\n }\n\n const hasReleases = existsSync(releasesPath)\n const hasChangelog = pkgDir ? (['CHANGELOG.md', 'changelog.md'].find(f => existsSync(join(pkgDir, f))) || false) : false\n\n const relatedSkills = await findRelatedSkills(packageName, baseDir)\n const shippedDocs = hasShippedDocs(packageName, cwd, version)\n const pkgFiles = getPkgKeyFiles(packageName, cwd, version)\n\n // Write base SKILL.md\n const skillMd = generateSkillMd({\n name: packageName,\n version,\n releasedAt: resolved.releasedAt,\n description: resolved.description,\n dependencies: resolved.dependencies,\n distTags: resolved.distTags,\n relatedSkills,\n hasGithub: false,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n\n writeLock(baseDir, sanitizeName(packageName), {\n packageName,\n version,\n source: docSource,\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n\n if (!config.global) {\n registerProject(cwd)\n }\n\n update(packageName, 'done', 'Skill ready', versionKey)\n return 'synced'\n}\n\n/** Phase 2: Enhance skill with LLM */\nasync function enhanceWithLLM(\n packageName: string,\n config: ParallelSyncConfig & { model: OptimizeModel },\n cwd: string,\n update: UpdateFn,\n sections?: SkillSection[],\n customPrompt?: string,\n): Promise<void> {\n const localDeps = await readLocalDependencies(cwd).catch(() => [])\n const localVersion = localDeps.find(d => d.name === packageName)?.version\n const resolved = await resolvePackageDocs(packageName, { version: localVersion })\n if (!resolved)\n throw new Error('Package not found')\n\n const version = localVersion || resolved.version || 'latest'\n const versionKey = getVersionKey(version)\n\n const agent = agents[config.agent]\n const baseDir = config.global\n ? join(CACHE_DIR, 'skills')\n : join(cwd, agent.skillsDir)\n\n const skillDir = join(baseDir, sanitizeName(packageName))\n const cacheDir = getCacheDir(packageName, version)\n\n // Load docs content\n let docsContent: string | null = null\n let llmsRaw: string | null = null\n let docsType: 'llms.txt' | 'readme' | 'docs' = 'readme'\n\n // Detect docs type\n if (existsSync(join(cacheDir, 'docs', 'index.md')) || existsSync(join(cacheDir, 'docs', 'guide'))) {\n docsType = 'docs'\n }\n else if (existsSync(join(cacheDir, 'llms.txt'))) {\n docsType = 'llms.txt'\n }\n\n // Priority 1: Git docs\n const guideDir = join(cacheDir, 'docs', 'guide')\n const docsDir = join(cacheDir, 'docs')\n if (existsSync(guideDir) || existsSync(join(docsDir, 'index.md'))) {\n const sections: string[] = []\n const indexPath = join(docsDir, 'index.md')\n if (existsSync(indexPath)) {\n sections.push(readFileSync(indexPath, 'utf-8'))\n }\n if (existsSync(guideDir)) {\n const priorityFiles = ['index.md', 'features.md', 'migration.md', 'why.md']\n const guideFiles = readdirSync(guideDir, { withFileTypes: true })\n .filter(f => f.isFile() && f.name.endsWith('.md'))\n .map(f => f.name)\n .sort((a, b) => {\n const aIdx = priorityFiles.indexOf(a)\n const bIdx = priorityFiles.indexOf(b)\n if (aIdx >= 0 && bIdx >= 0)\n return aIdx - bIdx\n if (aIdx >= 0)\n return -1\n if (bIdx >= 0)\n return 1\n return a.localeCompare(b)\n })\n for (const file of guideFiles.slice(0, 10)) {\n const content = readFileSync(join(guideDir, file), 'utf-8')\n sections.push(`# guide/${file}\\n\\n${content}`)\n }\n }\n if (sections.length > 0)\n docsContent = sections.join('\\n\\n---\\n\\n')\n }\n\n // Priority 2: llms.txt\n if (!docsContent) {\n if (existsSync(join(cacheDir, 'llms.txt'))) {\n llmsRaw = readFileSync(join(cacheDir, 'llms.txt'), 'utf-8')\n }\n if (llmsRaw) {\n const bestPracticesPaths = parseMarkdownLinks(llmsRaw)\n .map(l => l.url)\n .filter(lp => lp.includes('/style-guide/') || lp.includes('/best-practices/') || lp.includes('/typescript/'))\n const sections: string[] = []\n for (const mdPath of bestPracticesPaths) {\n const localPath = mdPath.startsWith('/') ? mdPath.slice(1) : mdPath\n const filePath = join(cacheDir, 'docs', localPath)\n if (existsSync(filePath)) {\n const content = readFileSync(filePath, 'utf-8')\n sections.push(`# ${mdPath}\\n\\n${content}`)\n }\n }\n docsContent = sections.length > 0 ? sections.join('\\n\\n---\\n\\n') : llmsRaw\n }\n }\n\n // Priority 3: README\n if (!docsContent) {\n const readmePath = join(cacheDir, 'docs', 'README.md')\n if (existsSync(readmePath)) {\n docsContent = readFileSync(readmePath, 'utf-8')\n }\n }\n\n const githubPath = join(cacheDir, 'github')\n const hasGithub = existsSync(githubPath)\n const hasReleases = existsSync(join(cacheDir, 'releases'))\n const hasChangelog = ['CHANGELOG.md', 'changelog.md'].find(f => existsSync(join(cwd, 'node_modules', packageName, f))) || false\n\n const docFiles = listReferenceFiles(skillDir)\n update(packageName, 'generating', config.model, versionKey)\n const { optimized, wasOptimized, error } = await optimizeDocs({\n packageName,\n skillDir,\n model: config.model,\n version,\n hasGithub,\n hasReleases,\n hasChangelog,\n docFiles,\n noCache: config.force,\n sections,\n customPrompt,\n onProgress: (progress) => {\n const isReasoning = progress.type === 'reasoning'\n const status = isReasoning ? 'exploring' : 'generating'\n const label = progress.chunk.startsWith('[') ? progress.chunk : config.model\n update(packageName, status, label, versionKey)\n },\n })\n\n if (error) {\n update(packageName, 'error', error, versionKey)\n throw new Error(error)\n }\n\n if (wasOptimized) {\n const relatedSkills = await findRelatedSkills(packageName, baseDir)\n const shippedDocs = hasShippedDocs(packageName, cwd, version)\n const pkgFiles = getPkgKeyFiles(packageName, cwd, version)\n const body = cleanSkillMd(optimized)\n const skillMd = generateSkillMd({\n name: packageName,\n version,\n releasedAt: resolved.releasedAt,\n dependencies: resolved.dependencies,\n distTags: resolved.distTags,\n body,\n relatedSkills,\n hasGithub,\n hasReleases,\n hasChangelog,\n docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n }\n\n update(packageName, 'done', 'Enhanced', versionKey)\n}\n\nasync function findRelatedSkills(packageName: string, skillsDir: string): Promise<string[]> {\n const related: string[] = []\n\n const npmInfo = await fetchNpmPackage(packageName)\n if (!npmInfo?.dependencies)\n return related\n\n const deps = Object.keys(npmInfo.dependencies)\n\n if (!existsSync(skillsDir))\n return related\n\n const installedSkills = readdirSync(skillsDir)\n\n for (const skill of installedSkills) {\n if (deps.some(d => sanitizeName(d) === skill)) {\n related.push(skill)\n }\n }\n\n return related.slice(0, 5)\n}\n\nfunction cleanSkillMd(content: string): string {\n let cleaned = content\n .replace(/^```markdown\\n?/m, '')\n .replace(/\\n?```$/m, '')\n .trim()\n\n // Strip any accidental frontmatter or leading horizontal rules\n // Match 3+ dashes (handles ---, ------, etc)\n const fmMatch = cleaned.match(/^-{3,}\\n/)\n if (fmMatch) {\n const afterOpen = fmMatch[0].length\n const closeMatch = cleaned.slice(afterOpen).match(/\\n-{3,}/)\n if (closeMatch) {\n // Has closing dashes (frontmatter), strip entire block\n cleaned = cleaned.slice(afterOpen + closeMatch.index! + closeMatch[0].length).trim()\n }\n else {\n // Just leading dashes, strip them\n cleaned = cleaned.slice(afterOpen).trim()\n }\n }\n\n return cleaned\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sync-parallel.mjs","names":[],"sources":["../../src/commands/sync-parallel.ts"],"sourcesContent":["import type { AgentType, CustomPrompt, OptimizeModel, SkillSection } from '../agent'\nimport type { ResolvedPackage } from '../sources'\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport * as p from '@clack/prompts'\nimport logUpdate from 'log-update'\nimport pLimit from 'p-limit'\nimport { join } from 'pathe'\nimport {\n agents,\n computeSkillDirName,\n\n generateSkillMd,\n getModelLabel,\n optimizeDocs,\n\n} from '../agent'\nimport {\n ensureCacheDir,\n getPkgKeyFiles,\n getVersionKey,\n hasShippedDocs,\n isCached,\n linkPkgNamed,\n listReferenceFiles,\n resolvePkgDir,\n} from '../cache'\nimport { defaultFeatures, readConfig, registerProject } from '../core/config'\nimport { formatDuration } from '../core/formatting'\nimport { parsePackages, readLock, writeLock } from '../core/lockfile'\nimport {\n fetchPkgDist,\n readLocalDependencies,\n resolvePackageDocsWithAttempts,\n searchNpmPackages,\n} from '../sources'\n\nimport { ensureGitignore, selectLlmConfig } from './sync'\nimport {\n detectChangelog,\n fetchAndCacheResources,\n findRelatedSkills,\n forceClearCache,\n handleShippedSkills,\n indexResources,\n linkAllReferences,\n RESOLVE_STEP_LABELS,\n resolveBaseDir,\n resolveLocalDep,\n} from './sync-shared'\n\ntype PackageStatus = 'pending' | 'resolving' | 'downloading' | 'embedding' | 'exploring' | 'thinking' | 'generating' | 'done' | 'error'\n\ninterface PackageState {\n name: string\n status: PackageStatus\n message: string\n version?: string\n streamPreview?: string\n startedAt?: number\n completedAt?: number\n}\n\nconst STATUS_ICONS: Record<PackageStatus, string> = {\n pending: '○',\n resolving: '◐',\n downloading: '◒',\n embedding: '◓',\n exploring: '◔',\n thinking: '◔',\n generating: '◑',\n done: '✓',\n error: '✗',\n}\n\nconst STATUS_COLORS: Record<PackageStatus, string> = {\n pending: '\\x1B[90m',\n resolving: '\\x1B[36m',\n downloading: '\\x1B[36m',\n embedding: '\\x1B[36m',\n exploring: '\\x1B[34m', // Blue for exploring\n thinking: '\\x1B[35m', // Magenta for thinking\n generating: '\\x1B[33m',\n done: '\\x1B[32m',\n error: '\\x1B[31m',\n}\n\nexport interface ParallelSyncConfig {\n packages: string[]\n global: boolean\n agent: AgentType\n model?: OptimizeModel\n yes?: boolean\n force?: boolean\n debug?: boolean\n concurrency?: number\n}\n\n/** Data passed from phase 1 (base skill) to phase 2 (LLM enhancement) */\ninterface BaseSkillData {\n resolved: ResolvedPackage\n version: string\n skillDirName: string\n docsType: 'llms.txt' | 'readme' | 'docs'\n hasIssues: boolean\n hasDiscussions: boolean\n hasReleases: boolean\n hasChangelog: string | false\n shippedDocs: boolean\n pkgFiles: string[]\n relatedSkills: string[]\n packages?: Array<{ name: string }>\n}\n\nexport async function syncPackagesParallel(config: ParallelSyncConfig): Promise<void> {\n const { packages, concurrency = 5 } = config\n const agent = agents[config.agent]\n const states = new Map<string, PackageState>()\n const cwd = process.cwd()\n\n // Initialize all packages as pending\n for (const pkg of packages) {\n states.set(pkg, { name: pkg, status: 'pending', message: 'Waiting...' })\n }\n\n // Render function\n function render() {\n const maxNameLen = Math.max(...packages.map(p => p.length), 20)\n const lines = [...states.values()].map((s) => {\n const icon = STATUS_ICONS[s.status]\n const color = STATUS_COLORS[s.status]\n const reset = '\\x1B[0m'\n const dim = '\\x1B[90m'\n const name = s.name.padEnd(maxNameLen)\n const version = s.version ? `${dim}${s.version}${reset} ` : ''\n const elapsed = (s.status === 'done' || s.status === 'error') && s.startedAt && s.completedAt\n ? ` ${dim}(${formatDuration(s.completedAt - s.startedAt)})${reset}`\n : ''\n const preview = s.streamPreview ? ` ${dim}${s.streamPreview}${reset}` : ''\n return ` ${color}${icon}${reset} ${name} ${version}${s.message}${elapsed}${preview}`\n })\n\n const doneCount = [...states.values()].filter(s => s.status === 'done').length\n const errorCount = [...states.values()].filter(s => s.status === 'error').length\n const header = `\\x1B[1mSyncing ${packages.length} packages\\x1B[0m (${doneCount} done${errorCount > 0 ? `, ${errorCount} failed` : ''})\\n`\n\n logUpdate(header + lines.join('\\n'))\n }\n\n function update(pkg: string, status: PackageStatus, message: string, version?: string) {\n const state = states.get(pkg)!\n if (!state.startedAt && status !== 'pending')\n state.startedAt = performance.now()\n if ((status === 'done' || status === 'error') && !state.completedAt)\n state.completedAt = performance.now()\n state.status = status\n state.message = message\n state.streamPreview = undefined // Clear preview on status change\n if (version)\n state.version = version\n render()\n }\n\n ensureCacheDir()\n render()\n\n const limit = pLimit(concurrency)\n\n // Phase 1: Generate base skills (no LLM)\n const skillData = new Map<string, BaseSkillData>()\n const baseResults = await Promise.allSettled(\n packages.map(pkg =>\n limit(() => syncBaseSkill(pkg, config, cwd, update)),\n ),\n )\n\n logUpdate.done()\n\n // Collect successful packages for LLM phase (exclude shipped — they need no LLM)\n const successfulPkgs: string[] = []\n const shippedPkgs: string[] = []\n const errors: Array<{ pkg: string, reason: string }> = []\n for (let i = 0; i < baseResults.length; i++) {\n const r = baseResults[i]!\n if (r.status === 'fulfilled' && r.value !== 'shipped') {\n successfulPkgs.push(packages[i]!)\n skillData.set(packages[i]!, r.value)\n }\n else if (r.status === 'fulfilled' && r.value === 'shipped') {\n shippedPkgs.push(packages[i]!)\n }\n else if (r.status === 'rejected') {\n const err = r.reason\n const reason = err instanceof Error ? `${err.message}\\n${err.stack}` : String(err)\n errors.push({ pkg: packages[i]!, reason })\n }\n }\n\n const skillMsg = `Created ${successfulPkgs.length} base skills${shippedPkgs.length > 1 ? ` (Skipping ${shippedPkgs.length})` : ''}`\n p.log.success(skillMsg)\n\n if (errors.length > 0) {\n for (const { pkg, reason } of errors) {\n p.log.error(` ${pkg}: ${reason}`)\n }\n }\n\n // Phase 2: Ask about LLM enhancement (skip if -y without model, or skipLlm config)\n const globalConfig = readConfig()\n if (successfulPkgs.length > 0 && !globalConfig.skipLlm && !(config.yes && !config.model)) {\n const llmConfig = await selectLlmConfig(config.model)\n\n if (llmConfig) {\n p.log.step(getModelLabel(llmConfig.model))\n // Reset states for LLM phase\n for (const pkg of successfulPkgs) {\n states.set(pkg, { name: pkg, status: 'pending', message: 'Waiting...' })\n }\n render()\n\n const llmResults = await Promise.allSettled(\n successfulPkgs.map(pkg =>\n limit(() => enhanceWithLLM(pkg, skillData.get(pkg)!, { ...config, model: llmConfig.model }, cwd, update, llmConfig.sections, llmConfig.customPrompt)),\n ),\n )\n\n logUpdate.done()\n\n const llmSucceeded = llmResults.filter(r => r.status === 'fulfilled').length\n p.log.success(`Enhanced ${llmSucceeded}/${successfulPkgs.length} skills with LLM`)\n }\n }\n\n await ensureGitignore(agent.skillsDir, cwd, config.global)\n\n const { shutdownWorker } = await import('../retriv/pool')\n await shutdownWorker()\n\n p.outro(`Synced ${successfulPkgs.length}/${packages.length} packages`)\n}\n\ntype UpdateFn = (pkg: string, status: PackageStatus, message: string, version?: string) => void\n\n/** Phase 1: Generate base skill (no LLM). Returns 'shipped' if shipped skill was linked, or BaseSkillData. */\nasync function syncBaseSkill(\n packageName: string,\n config: ParallelSyncConfig,\n cwd: string,\n update: UpdateFn,\n): Promise<'shipped' | BaseSkillData> {\n const localDeps = await readLocalDependencies(cwd).catch(() => [])\n const localVersion = localDeps.find(d => d.name === packageName)?.version\n\n const { package: resolvedPkg, attempts } = await resolvePackageDocsWithAttempts(packageName, {\n version: localVersion,\n cwd,\n onProgress: step => update(packageName, 'resolving', RESOLVE_STEP_LABELS[step]),\n })\n let resolved = resolvedPkg\n\n if (!resolved) {\n update(packageName, 'resolving', 'Local package...')\n resolved = await resolveLocalDep(packageName, cwd)\n }\n\n if (!resolved) {\n const npmAttempt = attempts.find(a => a.source === 'npm')\n let reason: string\n if (npmAttempt?.status === 'not-found') {\n const suggestions = await searchNpmPackages(packageName, 3)\n const hint = suggestions.length > 0\n ? ` (try: ${suggestions.map(s => s.name).join(', ')})`\n : ''\n reason = (npmAttempt.message || 'Not on npm') + hint\n }\n else {\n const failed = attempts.filter(a => a.status !== 'success')\n const messages = failed.map(a => a.message || a.source).join('; ')\n reason = messages || 'No docs found'\n }\n update(packageName, 'error', reason)\n throw new Error(`Could not find docs for: ${packageName}`)\n }\n\n const version = localVersion || resolved.version || 'latest'\n const versionKey = getVersionKey(version)\n\n // Download npm dist if not in node_modules\n if (!existsSync(join(cwd, 'node_modules', packageName))) {\n update(packageName, 'downloading', 'Downloading dist...', versionKey)\n await fetchPkgDist(packageName, version)\n }\n\n // Shipped skills: symlink directly, skip all doc fetching/caching/LLM\n const shippedResult = handleShippedSkills(packageName, version, cwd, config.agent, config.global)\n if (shippedResult) {\n update(packageName, 'done', 'Published SKILL.md', versionKey)\n return 'shipped'\n }\n\n // Force: nuke cached references + search index so all existsSync guards re-fetch\n if (config.force) {\n forceClearCache(packageName, version)\n }\n\n const useCache = isCached(packageName, version)\n if (useCache) {\n update(packageName, 'downloading', 'Using cache', versionKey)\n }\n else {\n update(packageName, 'downloading', config.force ? 'Re-fetching docs...' : 'Fetching docs...', versionKey)\n }\n\n const baseDir = resolveBaseDir(cwd, config.agent, config.global)\n const skillDirName = computeSkillDirName(packageName, resolved.repoUrl)\n const skillDir = join(baseDir, skillDirName)\n mkdirSync(skillDir, { recursive: true })\n\n const features = readConfig().features ?? defaultFeatures\n\n // Fetch & cache all resources (docs cascade + issues + discussions + releases)\n const resources = await fetchAndCacheResources({\n packageName,\n resolved,\n version,\n useCache,\n features,\n onProgress: msg => update(packageName, 'downloading', msg, versionKey),\n })\n\n // Create symlinks\n update(packageName, 'downloading', 'Linking references...', versionKey)\n linkAllReferences(skillDir, packageName, cwd, version, resources.docsType)\n\n // Index all resources (single batch)\n update(packageName, 'embedding', 'Indexing docs', versionKey)\n await indexResources({\n packageName,\n version,\n cwd,\n docsToIndex: resources.docsToIndex,\n features,\n onProgress: msg => update(packageName, 'embedding', msg, versionKey),\n })\n\n const pkgDir = resolvePkgDir(packageName, cwd, version)\n const hasChangelog = detectChangelog(pkgDir)\n const relatedSkills = await findRelatedSkills(packageName, baseDir)\n const shippedDocs = hasShippedDocs(packageName, cwd, version)\n const pkgFiles = getPkgKeyFiles(packageName, cwd, version)\n\n // Write base SKILL.md\n const repoSlug = resolved.repoUrl?.match(/github\\.com\\/([^/]+\\/[^/]+?)(?:\\.git)?(?:[/#]|$)/)?.[1]\n\n // Create named symlink for this package\n linkPkgNamed(skillDir, packageName, cwd, version)\n\n writeLock(baseDir, skillDirName, {\n packageName,\n version,\n repo: repoSlug,\n source: resources.docSource,\n syncedAt: new Date().toISOString().split('T')[0],\n generator: 'skilld',\n })\n\n // Read back merged packages from lockfile\n const updatedLock = readLock(baseDir)?.skills[skillDirName]\n const allPackages = parsePackages(updatedLock?.packages).map(p => ({ name: p.name }))\n\n const skillMd = generateSkillMd({\n name: packageName,\n version,\n releasedAt: resolved.releasedAt,\n description: resolved.description,\n dependencies: resolved.dependencies,\n distTags: resolved.distTags,\n relatedSkills,\n hasIssues: resources.hasIssues,\n hasDiscussions: resources.hasDiscussions,\n hasReleases: resources.hasReleases,\n hasChangelog,\n docsType: resources.docsType,\n hasShippedDocs: shippedDocs,\n pkgFiles,\n dirName: skillDirName,\n packages: allPackages.length > 1 ? allPackages : undefined,\n repoUrl: resolved.repoUrl,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n\n if (!config.global) {\n registerProject(cwd)\n }\n\n update(packageName, 'done', 'Base skill created', versionKey)\n\n return {\n resolved,\n version,\n skillDirName,\n docsType: resources.docsType,\n hasIssues: resources.hasIssues,\n hasDiscussions: resources.hasDiscussions,\n hasReleases: resources.hasReleases,\n hasChangelog,\n shippedDocs,\n pkgFiles,\n relatedSkills,\n packages: allPackages.length > 1 ? allPackages : undefined,\n }\n}\n\n/** Phase 2: Enhance skill with LLM */\nasync function enhanceWithLLM(\n packageName: string,\n data: BaseSkillData,\n config: ParallelSyncConfig & { model: OptimizeModel },\n cwd: string,\n update: UpdateFn,\n sections?: SkillSection[],\n customPrompt?: CustomPrompt,\n): Promise<void> {\n const versionKey = getVersionKey(data.version)\n const baseDir = resolveBaseDir(cwd, config.agent, config.global)\n const skillDir = join(baseDir, data.skillDirName)\n\n const hasGithub = data.hasIssues || data.hasDiscussions\n const docFiles = listReferenceFiles(skillDir)\n\n update(packageName, 'generating', config.model, versionKey)\n const { optimized, wasOptimized, error } = await optimizeDocs({\n packageName,\n skillDir,\n model: config.model,\n version: data.version,\n hasGithub,\n hasReleases: data.hasReleases,\n hasChangelog: data.hasChangelog,\n docFiles,\n docsType: data.docsType,\n hasShippedDocs: data.shippedDocs,\n noCache: config.force,\n debug: config.debug,\n sections,\n customPrompt,\n onProgress: (progress) => {\n const isReasoning = progress.type === 'reasoning'\n const status = isReasoning ? 'exploring' : 'generating'\n const sectionPrefix = progress.section ? `[${progress.section}] ` : ''\n const label = progress.chunk.startsWith('[') ? `${sectionPrefix}${progress.chunk}` : `${sectionPrefix}${config.model}`\n update(packageName, status, label, versionKey)\n },\n })\n\n if (error) {\n update(packageName, 'error', error, versionKey)\n throw new Error(error)\n }\n\n if (wasOptimized) {\n const skillMd = generateSkillMd({\n name: packageName,\n version: data.version,\n releasedAt: data.resolved.releasedAt,\n dependencies: data.resolved.dependencies,\n distTags: data.resolved.distTags,\n body: optimized,\n relatedSkills: data.relatedSkills,\n hasIssues: data.hasIssues,\n hasDiscussions: data.hasDiscussions,\n hasReleases: data.hasReleases,\n hasChangelog: data.hasChangelog,\n docsType: data.docsType,\n hasShippedDocs: data.shippedDocs,\n pkgFiles: data.pkgFiles,\n dirName: data.skillDirName,\n packages: data.packages,\n repoUrl: data.resolved.repoUrl,\n })\n writeFileSync(join(skillDir, 'SKILL.md'), skillMd)\n }\n\n update(packageName, 'done', 'Skill optimized', versionKey)\n}\n"],"mappings":"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"}
|
package/dist/_chunks/types.d.mts
CHANGED
|
@@ -14,15 +14,18 @@ interface ChunkingOptions {
|
|
|
14
14
|
chunkSize?: number;
|
|
15
15
|
chunkOverlap?: number;
|
|
16
16
|
}
|
|
17
|
+
type IndexPhase = 'chunking' | 'embedding' | 'storing';
|
|
18
|
+
interface IndexProgress {
|
|
19
|
+
phase: IndexPhase;
|
|
20
|
+
current: number;
|
|
21
|
+
total: number;
|
|
22
|
+
}
|
|
17
23
|
interface IndexConfig {
|
|
18
24
|
dbPath: string;
|
|
19
25
|
model?: string;
|
|
20
26
|
chunking?: ChunkingOptions;
|
|
21
|
-
/** Progress callback
|
|
22
|
-
onProgress?: (
|
|
23
|
-
id: string;
|
|
24
|
-
type?: string;
|
|
25
|
-
}) => void;
|
|
27
|
+
/** Progress callback forwarded from retriv */
|
|
28
|
+
onProgress?: (progress: IndexProgress) => void;
|
|
26
29
|
}
|
|
27
30
|
interface SearchResult {
|
|
28
31
|
id: string;
|
|
@@ -83,5 +86,5 @@ interface SearchSnippet {
|
|
|
83
86
|
scope?: ChunkEntity[];
|
|
84
87
|
}
|
|
85
88
|
//#endregion
|
|
86
|
-
export {
|
|
89
|
+
export { IndexProgress as a, SearchResult as c, IndexPhase as i, SearchSnippet as l, Document as n, SearchFilter as o, IndexConfig as r, SearchOptions as s, ChunkEntity as t };
|
|
87
90
|
//# sourceMappingURL=types.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/retriv/types.ts"],"mappings":";UAAiB,WAAA;EACf,IAAA;EACA,IAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,UAGe,QAAA;EACf,EAAA;EACA,OAAA;EACA,QAAA,GAAW,MAAA;AAAA;AAAA,UAGI,eAAA;EACf,SAAA;EACA,YAAA;AAAA;AAAA,UAGe,WAAA;EACf,MAAA;EACA,KAAA;EACA,QAAA,GAAW,eAAA
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/retriv/types.ts"],"mappings":";UAAiB,WAAA;EACf,IAAA;EACA,IAAA;EACA,SAAA;EACA,SAAA;AAAA;AAAA,UAGe,QAAA;EACf,EAAA;EACA,OAAA;EACA,QAAA,GAAW,MAAA;AAAA;AAAA,UAGI,eAAA;EACf,SAAA;EACA,YAAA;AAAA;AAAA,KAGU,UAAA;AAAA,UAEK,aAAA;EACf,KAAA,EAAO,UAAA;EACP,OAAA;EACA,KAAA;AAAA;AAAA,UAGe,WAAA;EACf,MAAA;EACA,KAAA;EACA,QAAA,GAAW,eAAA;EAdC;EAgBZ,UAAA,IAAc,QAAA,EAAU,aAAA;AAAA;AAAA,UAGT,YAAA;EACf,EAAA;EACA,OAAA;EACA,KAAA;EACA,QAAA,EAAU,MAAA;EACV,UAAA;EAlBiB;EAoBjB,SAAA;EACA,QAAA,GAAW,WAAA;EACX,KAAA,GAAQ,WAAA;AAAA;AAAA,KAGE,cAAA;EACJ,GAAA;AAAA;EACA,GAAA;AAAA;EACA,GAAA;AAAA;EACA,IAAA;AAAA;EACA,GAAA;AAAA;EACA,IAAA;AAAA;EACA,GAAA;AAAA;EACA,OAAA;AAAA;EACA,OAAA;AAAA;AAAA,KAEI,WAAA,+BAA0C,cAAA;AAAA,KAC1C,YAAA,GAAe,MAAA,SAAe,WAAA;AAAA,UAEzB,aAAA;EAjBI;EAmBnB,KAAA;EA1BA;EA4BA,MAAA,GAAS,YAAA;AAAA;AAAA,UAGM,aAAA;EA5Bf;EA8BA,OAAA;EA3BA;EA6BA,MAAA;EA5BA;EA8BA,SAAA;;EAEA,OAAA;EA7BU;EA+BV,OAAA;;EAEA,KAAA;EAhCM;EAkCN,UAAA;EAhCM;EAkCN,QAAA,GAAW,WAAA;EAhCL;EAkCN,KAAA,GAAQ,WAAA;AAAA"}
|
package/dist/_chunks/utils.d.mts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
|
+
import * as ofetch$1 from "ofetch";
|
|
2
|
+
|
|
1
3
|
//#region src/sources/discussions.d.ts
|
|
2
4
|
/**
|
|
3
5
|
* GitHub discussions fetching via gh CLI GraphQL
|
|
6
|
+
* Prioritizes Q&A and Help categories, includes accepted answers
|
|
4
7
|
*/
|
|
8
|
+
interface DiscussionComment {
|
|
9
|
+
body: string;
|
|
10
|
+
author: string;
|
|
11
|
+
}
|
|
5
12
|
interface GitHubDiscussion {
|
|
6
13
|
number: number;
|
|
7
14
|
title: string;
|
|
@@ -11,15 +18,23 @@ interface GitHubDiscussion {
|
|
|
11
18
|
url: string;
|
|
12
19
|
upvoteCount: number;
|
|
13
20
|
comments: number;
|
|
21
|
+
answer?: string;
|
|
22
|
+
topComments: DiscussionComment[];
|
|
14
23
|
}
|
|
15
24
|
/**
|
|
16
|
-
* Fetch
|
|
25
|
+
* Fetch discussions from a GitHub repo using gh CLI GraphQL.
|
|
26
|
+
* Prioritizes Q&A and Help categories. Includes accepted answer body for answered discussions.
|
|
17
27
|
*/
|
|
18
28
|
declare function fetchGitHubDiscussions(owner: string, repo: string, limit?: number): Promise<GitHubDiscussion[]>;
|
|
19
29
|
/**
|
|
20
|
-
* Format
|
|
30
|
+
* Format a single discussion as markdown with YAML frontmatter
|
|
21
31
|
*/
|
|
22
|
-
declare function
|
|
32
|
+
declare function formatDiscussionAsMarkdown(d: GitHubDiscussion): string;
|
|
33
|
+
/**
|
|
34
|
+
* Generate a summary index of all discussions for quick LLM scanning.
|
|
35
|
+
* Groups by category so the LLM can quickly find Q&A vs general discussions.
|
|
36
|
+
*/
|
|
37
|
+
declare function generateDiscussionIndex(discussions: GitHubDiscussion[]): string;
|
|
23
38
|
//#endregion
|
|
24
39
|
//#region src/sources/entries.d.ts
|
|
25
40
|
interface EntryFile {
|
|
@@ -32,67 +47,6 @@ interface EntryFile {
|
|
|
32
47
|
*/
|
|
33
48
|
declare function resolveEntryFiles(packageDir: string): Promise<EntryFile[]>;
|
|
34
49
|
//#endregion
|
|
35
|
-
//#region src/sources/github.d.ts
|
|
36
|
-
/**
|
|
37
|
-
* GitHub/ungh README resolution + versioned docs
|
|
38
|
-
*/
|
|
39
|
-
interface GitDocsResult {
|
|
40
|
-
/** URL pattern for fetching docs (use with ref) */
|
|
41
|
-
baseUrl: string;
|
|
42
|
-
/** Git ref (tag) used */
|
|
43
|
-
ref: string;
|
|
44
|
-
/** List of doc file paths relative to repo root */
|
|
45
|
-
files: string[];
|
|
46
|
-
/** Prefix to strip when normalizing paths to docs/ (e.g. 'apps/evalite-docs/src/content/') for nested monorepo docs */
|
|
47
|
-
docsPrefix?: string;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Fetch versioned docs from GitHub repo's docs/ folder.
|
|
51
|
-
* Pass packageName to check doc overrides (e.g. vue -> vuejs/docs).
|
|
52
|
-
*/
|
|
53
|
-
declare function fetchGitDocs(owner: string, repo: string, version: string, packageName?: string): Promise<GitDocsResult | null>;
|
|
54
|
-
/**
|
|
55
|
-
* Fetch GitHub repo metadata to get website URL.
|
|
56
|
-
* Pass packageName to check doc overrides first (avoids API call).
|
|
57
|
-
*/
|
|
58
|
-
declare function fetchGitHubRepoMeta(owner: string, repo: string, packageName?: string): Promise<{
|
|
59
|
-
homepage?: string;
|
|
60
|
-
} | null>;
|
|
61
|
-
/**
|
|
62
|
-
* Resolve README URL for a GitHub repo, returns ungh:// pseudo-URL or raw URL
|
|
63
|
-
*/
|
|
64
|
-
declare function fetchReadme(owner: string, repo: string, subdir?: string): Promise<string | null>;
|
|
65
|
-
/**
|
|
66
|
-
* Fetch README content from ungh:// pseudo-URL, file:// URL, or regular URL
|
|
67
|
-
*/
|
|
68
|
-
declare function fetchReadmeContent(url: string): Promise<string | null>;
|
|
69
|
-
//#endregion
|
|
70
|
-
//#region src/sources/issues.d.ts
|
|
71
|
-
/**
|
|
72
|
-
* GitHub issues fetching via gh CLI
|
|
73
|
-
*/
|
|
74
|
-
interface GitHubIssue {
|
|
75
|
-
number: number;
|
|
76
|
-
title: string;
|
|
77
|
-
state: string;
|
|
78
|
-
labels: string[];
|
|
79
|
-
body: string;
|
|
80
|
-
createdAt: string;
|
|
81
|
-
url: string;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Check if gh CLI is installed and authenticated (cached)
|
|
85
|
-
*/
|
|
86
|
-
declare function isGhAvailable(): boolean;
|
|
87
|
-
/**
|
|
88
|
-
* Fetch last N issues from a GitHub repo using gh CLI
|
|
89
|
-
*/
|
|
90
|
-
declare function fetchGitHubIssues(owner: string, repo: string, limit?: number): Promise<GitHubIssue[]>;
|
|
91
|
-
/**
|
|
92
|
-
* Format issues as markdown for agent consumption
|
|
93
|
-
*/
|
|
94
|
-
declare function formatIssuesAsMarkdown(issues: GitHubIssue[]): string;
|
|
95
|
-
//#endregion
|
|
96
50
|
//#region src/sources/types.d.ts
|
|
97
51
|
/**
|
|
98
52
|
* Doc resolver types
|
|
@@ -163,6 +117,100 @@ interface ResolveResult {
|
|
|
163
117
|
attempts: ResolveAttempt[];
|
|
164
118
|
}
|
|
165
119
|
//#endregion
|
|
120
|
+
//#region src/sources/github.d.ts
|
|
121
|
+
/** Minimum git-doc file count to prefer over llms.txt */
|
|
122
|
+
declare const MIN_GIT_DOCS = 5;
|
|
123
|
+
/** True when git-docs exist but are too few to be useful (< MIN_GIT_DOCS) */
|
|
124
|
+
declare const isShallowGitDocs: (n: number) => boolean;
|
|
125
|
+
interface GitDocsResult {
|
|
126
|
+
/** URL pattern for fetching docs (use with ref) */
|
|
127
|
+
baseUrl: string;
|
|
128
|
+
/** Git ref (tag) used */
|
|
129
|
+
ref: string;
|
|
130
|
+
/** List of doc file paths relative to repo root */
|
|
131
|
+
files: string[];
|
|
132
|
+
/** Prefix to strip when normalizing paths to docs/ (e.g. 'apps/evalite-docs/src/content/') for nested monorepo docs */
|
|
133
|
+
docsPrefix?: string;
|
|
134
|
+
/** Full repo file tree — only set when discoverDocFiles() heuristic was used (not standard docs/ prefix) */
|
|
135
|
+
allFiles?: string[];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Fetch versioned docs from GitHub repo's docs/ folder.
|
|
139
|
+
* Pass packageName to check doc overrides (e.g. vue -> vuejs/docs).
|
|
140
|
+
*/
|
|
141
|
+
declare function fetchGitDocs(owner: string, repo: string, version: string, packageName?: string, repoUrl?: string): Promise<GitDocsResult | null>;
|
|
142
|
+
/**
|
|
143
|
+
* Validate that discovered git docs are relevant by cross-referencing llms.txt links
|
|
144
|
+
* against the repo file tree. Uses extensionless suffix matching to handle monorepo nesting.
|
|
145
|
+
*
|
|
146
|
+
* Returns { isValid, matchRatio } where isValid = matchRatio >= 0.3
|
|
147
|
+
*/
|
|
148
|
+
declare function validateGitDocsWithLlms(llmsLinks: LlmsLink[], repoFiles: string[]): {
|
|
149
|
+
isValid: boolean;
|
|
150
|
+
matchRatio: number;
|
|
151
|
+
};
|
|
152
|
+
/**
|
|
153
|
+
* Fetch GitHub repo metadata to get website URL.
|
|
154
|
+
* Pass packageName to check doc overrides first (avoids API call).
|
|
155
|
+
*/
|
|
156
|
+
declare function fetchGitHubRepoMeta(owner: string, repo: string, packageName?: string): Promise<{
|
|
157
|
+
homepage?: string;
|
|
158
|
+
} | null>;
|
|
159
|
+
/**
|
|
160
|
+
* Resolve README URL for a GitHub repo, returns ungh:// pseudo-URL or raw URL
|
|
161
|
+
*/
|
|
162
|
+
declare function fetchReadme(owner: string, repo: string, subdir?: string): Promise<string | null>;
|
|
163
|
+
/**
|
|
164
|
+
* Fetch README content from ungh:// pseudo-URL, file:// URL, or regular URL
|
|
165
|
+
*/
|
|
166
|
+
declare function fetchReadmeContent(url: string): Promise<string | null>;
|
|
167
|
+
//#endregion
|
|
168
|
+
//#region src/sources/issues.d.ts
|
|
169
|
+
/**
|
|
170
|
+
* GitHub issues fetching via gh CLI Search API
|
|
171
|
+
* Sorted by reactions (upvotes), 75% open / 25% closed (within last year)
|
|
172
|
+
* Categorized by labels, noise filtered out
|
|
173
|
+
*/
|
|
174
|
+
type IssueType = 'bug' | 'question' | 'docs' | 'feature' | 'other';
|
|
175
|
+
interface IssueComment {
|
|
176
|
+
body: string;
|
|
177
|
+
author: string;
|
|
178
|
+
reactions: number;
|
|
179
|
+
}
|
|
180
|
+
interface GitHubIssue {
|
|
181
|
+
number: number;
|
|
182
|
+
title: string;
|
|
183
|
+
state: string;
|
|
184
|
+
labels: string[];
|
|
185
|
+
body: string;
|
|
186
|
+
createdAt: string;
|
|
187
|
+
url: string;
|
|
188
|
+
reactions: number;
|
|
189
|
+
comments: number;
|
|
190
|
+
type: IssueType;
|
|
191
|
+
topComments: IssueComment[];
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Check if gh CLI is installed and authenticated (cached)
|
|
195
|
+
*/
|
|
196
|
+
declare function isGhAvailable(): boolean;
|
|
197
|
+
/**
|
|
198
|
+
* Fetch issues from a GitHub repo sorted by reactions (upvotes).
|
|
199
|
+
* Returns 75% open issues + 25% recently closed issues (within last year).
|
|
200
|
+
* Filters noise (duplicates, stale, tracking) and deprioritizes feature requests.
|
|
201
|
+
* Enriches top issues with their most-reacted comments via GraphQL.
|
|
202
|
+
*/
|
|
203
|
+
declare function fetchGitHubIssues(owner: string, repo: string, limit?: number): Promise<GitHubIssue[]>;
|
|
204
|
+
/**
|
|
205
|
+
* Format a single issue as markdown with YAML frontmatter
|
|
206
|
+
*/
|
|
207
|
+
declare function formatIssueAsMarkdown(issue: GitHubIssue): string;
|
|
208
|
+
/**
|
|
209
|
+
* Generate a summary index of all issues for quick LLM scanning.
|
|
210
|
+
* Groups by type so the LLM can quickly find bugs vs questions.
|
|
211
|
+
*/
|
|
212
|
+
declare function generateIssueIndex(issues: GitHubIssue[]): string;
|
|
213
|
+
//#endregion
|
|
166
214
|
//#region src/sources/llms.d.ts
|
|
167
215
|
/**
|
|
168
216
|
* Check for llms.txt at a docs URL, returns the llms.txt URL if found
|
|
@@ -176,9 +224,6 @@ declare function fetchLlmsTxt(url: string): Promise<LlmsContent | null>;
|
|
|
176
224
|
* Parse markdown links from llms.txt to get .md file paths
|
|
177
225
|
*/
|
|
178
226
|
declare function parseMarkdownLinks(content: string): LlmsLink[];
|
|
179
|
-
/**
|
|
180
|
-
* Download all .md files referenced in llms.txt
|
|
181
|
-
*/
|
|
182
227
|
declare function downloadLlmsDocs(llmsContent: LlmsContent, baseUrl: string, onProgress?: (url: string, index: number, total: number) => void): Promise<FetchedDoc[]>;
|
|
183
228
|
/**
|
|
184
229
|
* Normalize llms.txt links to relative paths for local access
|
|
@@ -192,6 +237,15 @@ declare function normalizeLlmsLinks(content: string, baseUrl?: string): string;
|
|
|
192
237
|
declare function extractSections(content: string, patterns: string[]): string | null;
|
|
193
238
|
//#endregion
|
|
194
239
|
//#region src/sources/npm.d.ts
|
|
240
|
+
/**
|
|
241
|
+
* Search npm registry for packages matching a query.
|
|
242
|
+
* Used as a fallback when direct package lookup fails.
|
|
243
|
+
*/
|
|
244
|
+
declare function searchNpmPackages(query: string, size?: number): Promise<Array<{
|
|
245
|
+
name: string;
|
|
246
|
+
description?: string;
|
|
247
|
+
version: string;
|
|
248
|
+
}>>;
|
|
195
249
|
/**
|
|
196
250
|
* Fetch package info from npm registry
|
|
197
251
|
*/
|
|
@@ -229,6 +283,11 @@ declare function resolvePackageDocsWithAttempts(packageName: string, options?: R
|
|
|
229
283
|
* Parse version specifier, handling protocols like link:, workspace:, npm:, file:
|
|
230
284
|
*/
|
|
231
285
|
declare function parseVersionSpecifier(name: string, version: string, cwd: string): LocalDependency | null;
|
|
286
|
+
/**
|
|
287
|
+
* Resolve the actual installed version of a package by finding its package.json
|
|
288
|
+
* via mlly's resolvePathSync. Works regardless of package manager or version protocol.
|
|
289
|
+
*/
|
|
290
|
+
declare function resolveInstalledVersion(name: string, cwd: string): string | null;
|
|
232
291
|
/**
|
|
233
292
|
* Read package.json dependencies with versions
|
|
234
293
|
*/
|
|
@@ -311,6 +370,11 @@ interface CachedDoc {
|
|
|
311
370
|
* For monorepos, filters to package-specific tags (pkg@version).
|
|
312
371
|
* Falls back to generic tags (v1.2.3) only if no package-specific found.
|
|
313
372
|
*/
|
|
373
|
+
/**
|
|
374
|
+
* Generate a summary index of all releases for quick LLM scanning.
|
|
375
|
+
* Shows version timeline so LLM can quickly identify breaking changes.
|
|
376
|
+
*/
|
|
377
|
+
declare function generateReleaseIndex(releases: GitHubRelease[], packageName?: string): string;
|
|
314
378
|
/**
|
|
315
379
|
* Fetch release notes for a package. Returns CachedDoc[] with releases/{tag}.md files.
|
|
316
380
|
*
|
|
@@ -324,6 +388,7 @@ declare function fetchReleaseNotes(owner: string, repo: string, installedVersion
|
|
|
324
388
|
/**
|
|
325
389
|
* Shared utilities for doc resolution
|
|
326
390
|
*/
|
|
391
|
+
declare const $fetch: ofetch$1.$Fetch;
|
|
327
392
|
/**
|
|
328
393
|
* Fetch text content from URL
|
|
329
394
|
*/
|
|
@@ -347,6 +412,10 @@ declare function parseGitHubUrl(url: string): {
|
|
|
347
412
|
* Normalize git repo URL to https
|
|
348
413
|
*/
|
|
349
414
|
declare function normalizeRepoUrl(url: string): string;
|
|
415
|
+
/**
|
|
416
|
+
* Extract branch hint from URL fragment (e.g. "git+https://...#main" → "main")
|
|
417
|
+
*/
|
|
418
|
+
declare function extractBranchHint(url: string): string | undefined;
|
|
350
419
|
//#endregion
|
|
351
|
-
export {
|
|
420
|
+
export { NpmPackageInfo as $, downloadLlmsDocs as A, isGhAvailable as B, readLocalDependencies as C, resolvePackageDocs as D, resolveLocalPackageDocs as E, parseMarkdownLinks as F, fetchReadme as G, MIN_GIT_DOCS as H, GitHubIssue as I, validateGitDocsWithLlms as J, fetchReadmeContent as K, fetchGitHubIssues as L, fetchLlmsTxt as M, fetchLlmsUrl as N, resolvePackageDocsWithAttempts as O, normalizeLlmsLinks as P, LocalDependency as Q, formatIssueAsMarkdown as R, parseVersionSpecifier as S, resolveInstalledVersion as T, fetchGitDocs as U, GitDocsResult as V, fetchGitHubRepoMeta as W, LlmsContent as X, FetchedDoc as Y, LlmsLink as Z, fetchLatestVersion as _, normalizeRepoUrl as a, GitHubDiscussion as at, fetchPkgDist as b, GitHubRelease as c, generateDiscussionIndex as ct, DOC_OVERRIDES as d, ResolveAttempt as et, DocOverride as f, ResolveStep as g, ResolveOptions as h, isGitHubRepoUrl as i, resolveEntryFiles as it, extractSections as j, searchNpmPackages as k, fetchReleaseNotes as l, LocalPackageInfo as m, extractBranchHint as n, ResolvedPackage as nt, parseGitHubUrl as o, fetchGitHubDiscussions as ot, getDocOverride as p, isShallowGitDocs as q, fetchText as r, EntryFile as rt, verifyUrl as s, formatDiscussionAsMarkdown as st, $fetch as t, ResolveResult as tt, generateReleaseIndex as u, fetchNpmPackage as v, readLocalPackageInfo as w, getInstalledSkillVersion as x, fetchNpmRegistryMeta as y, generateIssueIndex as z };
|
|
352
421
|
//# sourceMappingURL=utils.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.mts","names":[],"sources":["../../src/sources/discussions.ts","../../src/sources/entries.ts","../../src/sources/
|
|
1
|
+
{"version":3,"file":"utils.d.mts","names":[],"sources":["../../src/sources/discussions.ts","../../src/sources/entries.ts","../../src/sources/types.ts","../../src/sources/github.ts","../../src/sources/issues.ts","../../src/sources/llms.ts","../../src/sources/npm.ts","../../src/sources/overrides.ts","../../src/sources/releases.ts","../../src/sources/utils.ts"],"mappings":"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"}
|
|
@@ -56,12 +56,19 @@ declare function writeToCache(name: string, version: string, docs: CachedDoc[]):
|
|
|
56
56
|
*/
|
|
57
57
|
declare function linkReferences(skillDir: string, name: string, version: string): void;
|
|
58
58
|
/**
|
|
59
|
-
* Create symlink from .skilld dir to cached
|
|
59
|
+
* Create symlink from .skilld dir to cached issues
|
|
60
60
|
*
|
|
61
61
|
* Structure:
|
|
62
|
-
* .claude/skills/<skill>/.skilld/
|
|
62
|
+
* .claude/skills/<skill>/.skilld/issues -> ~/.skilld/references/<pkg>@<version>/issues
|
|
63
63
|
*/
|
|
64
|
-
declare function
|
|
64
|
+
declare function linkIssues(skillDir: string, name: string, version: string): void;
|
|
65
|
+
/**
|
|
66
|
+
* Create symlink from .skilld dir to cached discussions
|
|
67
|
+
*
|
|
68
|
+
* Structure:
|
|
69
|
+
* .claude/skills/<skill>/.skilld/discussions -> ~/.skilld/references/<pkg>@<version>/discussions
|
|
70
|
+
*/
|
|
71
|
+
declare function linkDiscussions(skillDir: string, name: string, version: string): void;
|
|
65
72
|
/**
|
|
66
73
|
* Resolve the package directory: node_modules first, then cached dist fallback.
|
|
67
74
|
* Returns the path if found, null otherwise.
|
|
@@ -76,6 +83,14 @@ declare function resolvePkgDir(name: string, cwd: string, version?: string): str
|
|
|
76
83
|
* This gives access to package.json, README.md, dist/, and any shipped docs/
|
|
77
84
|
*/
|
|
78
85
|
declare function linkPkg(skillDir: string, name: string, cwd: string, version?: string): void;
|
|
86
|
+
/**
|
|
87
|
+
* Create named symlink from .skilld dir to package directory.
|
|
88
|
+
* Short name = last segment of package name (e.g., @vue/reactivity → pkg-reactivity)
|
|
89
|
+
*
|
|
90
|
+
* Structure:
|
|
91
|
+
* .claude/skills/<skill>/.skilld/pkg-<short> -> node_modules/<pkg>
|
|
92
|
+
*/
|
|
93
|
+
declare function linkPkgNamed(skillDir: string, name: string, cwd: string, version?: string): void;
|
|
79
94
|
/**
|
|
80
95
|
* Get key files from a package directory for display
|
|
81
96
|
* Returns entry points + docs files
|
|
@@ -89,9 +104,30 @@ interface ShippedSkill {
|
|
|
89
104
|
skillDir: string;
|
|
90
105
|
}
|
|
91
106
|
/**
|
|
92
|
-
* Check if package ships a skills/ directory with _SKILL.md subdirs
|
|
107
|
+
* Check if package ships a skills/ directory with SKILL.md or _SKILL.md subdirs
|
|
93
108
|
*/
|
|
94
109
|
declare function getShippedSkills(name: string, cwd: string, version?: string): ShippedSkill[];
|
|
110
|
+
/**
|
|
111
|
+
* Create symlink from .skilld dir to cached sections (LLM-generated)
|
|
112
|
+
*
|
|
113
|
+
* Structure:
|
|
114
|
+
* .claude/skills/<skill>/.skilld/sections -> ~/.skilld/references/<pkg>@<version>/sections
|
|
115
|
+
*/
|
|
116
|
+
declare function linkSections(skillDir: string, name: string, version: string): void;
|
|
117
|
+
/**
|
|
118
|
+
* Write LLM-generated section outputs to global cache for cross-project reuse
|
|
119
|
+
*
|
|
120
|
+
* Structure:
|
|
121
|
+
* ~/.skilld/references/<pkg>@<version>/sections/_BEST_PRACTICES.md
|
|
122
|
+
*/
|
|
123
|
+
declare function writeSections(name: string, version: string, sections: Array<{
|
|
124
|
+
file: string;
|
|
125
|
+
content: string;
|
|
126
|
+
}>): void;
|
|
127
|
+
/**
|
|
128
|
+
* Read a cached section from the global references dir
|
|
129
|
+
*/
|
|
130
|
+
declare function readCachedSection(name: string, version: string, file: string): string | null;
|
|
95
131
|
/**
|
|
96
132
|
* Create symlink from .skilld dir to cached releases
|
|
97
133
|
*
|
|
@@ -139,9 +175,10 @@ declare function getVersionKey(version: string): string;
|
|
|
139
175
|
*/
|
|
140
176
|
declare function getCacheKey(name: string, version: string): string;
|
|
141
177
|
/**
|
|
142
|
-
* Get path to cached package references
|
|
178
|
+
* Get path to cached package references.
|
|
179
|
+
* Validates name/version to prevent path traversal.
|
|
143
180
|
*/
|
|
144
181
|
declare function getCacheDir(name: string, version: string): string;
|
|
145
182
|
//#endregion
|
|
146
|
-
export {
|
|
183
|
+
export { CACHE_DIR as A, readCachedSection as C, CacheConfig as D, writeToCache as E, SEARCH_DB as M, getPackageDbPath as N, CachedDoc as O, readCachedDocs as S, writeSections as T, linkReleases as _, clearAllCache as a, listCached as b, getPkgKeyFiles as c, isCached as d, linkDiscussions as f, linkReferences as g, linkPkgNamed as h, ShippedSkill as i, REFERENCES_DIR as j, CachedPackage as k, getShippedSkills as l, linkPkg as m, getCacheKey as n, clearCache as o, linkIssues as p, getVersionKey as r, ensureCacheDir as s, getCacheDir as t, hasShippedDocs as u, linkSections as v, resolvePkgDir as w, listReferenceFiles as x, linkShippedSkill as y };
|
|
147
184
|
//# sourceMappingURL=version.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.mts","names":[],"sources":["../../src/cache/config.ts","../../src/cache/types.ts","../../src/cache/storage.ts","../../src/cache/version.ts"],"mappings":";;AASA;;;cAAa,SAAA;;cAGA,cAAA;;cAGA,SAAA;;iBAGG,gBAAA,CAAiB,IAAA,UAAc,OAAA;;;;AAT/C;;UCLiB,WAAA;EDKkC;ECHjD,IAAA;EDMW;ECJX,OAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,OAAA;EACA,GAAA;AAAA;AAAA,UAGe,SAAA;EACf,IAAA;EACA,OAAA;AAAA;;;;;ADPF;
|
|
1
|
+
{"version":3,"file":"version.d.mts","names":[],"sources":["../../src/cache/config.ts","../../src/cache/types.ts","../../src/cache/storage.ts","../../src/cache/version.ts"],"mappings":";;AASA;;;cAAa,SAAA;;cAGA,cAAA;;cAGA,SAAA;;iBAGG,gBAAA,CAAiB,IAAA,UAAc,OAAA;;;;AAT/C;;UCLiB,WAAA;EDKkC;ECHjD,IAAA;EDMW;ECJX,OAAA;AAAA;AAAA,UAGe,aAAA;EACf,IAAA;EACA,OAAA;EACA,GAAA;AAAA;AAAA,UAGe,SAAA;EACf,IAAA;EACA,OAAA;AAAA;;;;;ADPF;iBEiBgB,QAAA,CAAS,IAAA,UAAc,OAAA;;;;iBAOvB,cAAA,CAAA;;;;iBAOA,YAAA,CACd,IAAA,UACA,OAAA,UACA,IAAA,EAAM,SAAA;AF5BR;;;;;;;;ACdA;;ADcA,iBEyFgB,cAAA,CAAe,QAAA,UAAkB,IAAA,UAAc,OAAA;;;ADhG/D;;;;iBCqHgB,UAAA,CAAW,QAAA,UAAkB,IAAA,UAAc,OAAA;;;;;AD/G3D;;iBCkIgB,eAAA,CAAgB,QAAA,UAAkB,IAAA,UAAc,OAAA;;;;;iBAiBhD,aAAA,CAAc,IAAA,UAAc,GAAA,UAAa,OAAA;AAvIzD;;;;;AAOA;;;AAPA,iBA8JgB,OAAA,CAAQ,QAAA,UAAkB,IAAA,UAAc,GAAA,UAAa,OAAA;;AAhJrE;;;;;;iBAsKgB,YAAA,CAAa,QAAA,UAAkB,IAAA,UAAc,GAAA,UAAa,OAAA;;;;AAtG1E;iBAyHgB,cAAA,CAAe,IAAA,UAAc,GAAA,UAAa,OAAA;;;;UA8BzC,YAAA;EACf,SAAA;EACA,QAAA;AAAA;AApIF;;;AAAA,iBA0IgB,gBAAA,CAAiB,IAAA,UAAc,GAAA,UAAa,OAAA,YAAmB,YAAA;;;;;;AAvH/E;iBA2IgB,YAAA,CAAa,QAAA,UAAkB,IAAA,UAAc,OAAA;;;;;;;iBAmB7C,aAAA,CAAc,IAAA,UAAc,OAAA,UAAiB,QAAA,EAAU,KAAA;EAAQ,IAAA;EAAc,OAAA;AAAA;;;;iBAY7E,iBAAA,CAAkB,IAAA,UAAc,OAAA,UAAiB,IAAA;;;AAlIjE;;;;iBA+IgB,YAAA,CAAa,QAAA,UAAkB,IAAA,UAAc,OAAA;;;;iBAmB7C,gBAAA,CAAiB,OAAA,UAAiB,SAAA,UAAmB,SAAA;AAAA,iBAWrD,cAAA,CAAe,IAAA,UAAc,GAAA,UAAa,OAAA;AAvJ1D;;;AAAA,iBAwKgB,UAAA,CAAA,GAAc,aAAA;;;;iBAed,cAAA,CAAe,IAAA,UAAc,OAAA,WAAkB,SAAA;;;AApK/D;iBAmMgB,UAAA,CAAW,IAAA,UAAc,OAAA;;;;iBAYzB,aAAA,CAAA;;;;AAjLhB;iBA6LgB,kBAAA,CAAmB,QAAA,UAAkB,QAAA;;;;AFtbrD;;;;;iBGOgB,aAAA,CAAc,OAAA;;;;iBAOd,WAAA,CAAY,IAAA,UAAc,OAAA;AHR1C;;;;AAAA,iBGgBgB,WAAA,CAAY,IAAA,UAAc,OAAA"}
|