@skillkit/core 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +190 -0
- package/dist/index.d.ts +2234 -0
- package/dist/index.js +3676 -0
- package/dist/index.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/skills.ts","../src/config.ts","../src/providers/github.ts","../src/providers/base.ts","../src/providers/gitlab.ts","../src/providers/bitbucket.ts","../src/providers/local.ts","../src/providers/index.ts","../src/translator/types.ts","../src/translator/formats/skill-md.ts","../src/translator/formats/cursor.ts","../src/translator/formats/windsurf.ts","../src/translator/formats/copilot.ts","../src/translator/registry.ts","../src/translator/index.ts","../src/context/types.ts","../src/context/detector.ts","../src/context/manager.ts","../src/context/sync.ts","../src/recommend/types.ts","../src/recommend/engine.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport const AgentType = z.enum([\n 'claude-code',\n 'codex',\n 'cursor',\n 'antigravity',\n 'opencode',\n 'gemini-cli',\n 'amp',\n 'clawdbot',\n 'droid',\n 'github-copilot',\n 'goose',\n 'kilo',\n 'kiro-cli',\n 'roo',\n 'trae',\n 'windsurf',\n 'universal',\n]);\nexport type AgentType = z.infer<typeof AgentType>;\n\nexport const GitProvider = z.enum(['github', 'gitlab', 'bitbucket', 'local']);\nexport type GitProvider = z.infer<typeof GitProvider>;\n\nexport const SkillFrontmatter = z.object({\n name: z.string()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9]+(-[a-z0-9]+)*$/, 'Skill name must be lowercase alphanumeric with hyphens, no leading/trailing/consecutive hyphens'),\n description: z.string().min(1).max(1024),\n license: z.string().optional(),\n compatibility: z.string().max(500).optional(),\n metadata: z.record(z.string()).optional(),\n 'allowed-tools': z.string().optional(),\n version: z.string().optional(),\n author: z.string().optional(),\n tags: z.array(z.string()).optional(),\n agents: z.array(AgentType).optional(),\n});\nexport type SkillFrontmatter = z.infer<typeof SkillFrontmatter>;\n\nexport const SkillMetadata = z.object({\n name: z.string(),\n description: z.string(),\n source: z.string(),\n sourceType: GitProvider,\n subpath: z.string().optional(),\n installedAt: z.string().datetime(),\n updatedAt: z.string().datetime().optional(),\n enabled: z.boolean().default(true),\n version: z.string().optional(),\n checksum: z.string().optional(),\n});\nexport type SkillMetadata = z.infer<typeof SkillMetadata>;\n\nexport const SkillLocation = z.enum(['project', 'global']);\nexport type SkillLocation = z.infer<typeof SkillLocation>;\n\nexport const Skill = z.object({\n name: z.string(),\n description: z.string(),\n path: z.string(),\n location: SkillLocation,\n metadata: SkillMetadata.optional(),\n enabled: z.boolean().default(true),\n});\nexport type Skill = z.infer<typeof Skill>;\n\nexport const SkillkitConfig = z.object({\n version: z.literal(1),\n agent: AgentType.default('universal'),\n skillsDir: z.string().optional(),\n enabledSkills: z.array(z.string()).optional(),\n disabledSkills: z.array(z.string()).optional(),\n autoSync: z.boolean().default(true),\n});\nexport type SkillkitConfig = z.infer<typeof SkillkitConfig>;\n\nexport interface InstallOptions {\n global?: boolean;\n skills?: string[];\n provider?: GitProvider;\n yes?: boolean;\n force?: boolean;\n}\n\nexport interface SyncOptions {\n output?: string;\n agent?: AgentType;\n yes?: boolean;\n enabledOnly?: boolean;\n}\n\nexport interface UpdateOptions {\n skills?: string[];\n all?: boolean;\n force?: boolean;\n}\n\nexport interface RegistrySkill {\n name: string;\n description: string;\n source: string;\n provider: GitProvider;\n downloads?: number;\n stars?: number;\n tags?: string[];\n}\n\nexport interface DiscoveredSkill {\n name: string;\n dirName: string;\n path: string;\n}\n\nexport interface CloneResult {\n success: boolean;\n path?: string;\n tempRoot?: string;\n error?: string;\n skills?: string[];\n discoveredSkills?: DiscoveredSkill[];\n}\n\nexport interface CommandResult {\n success: boolean;\n message: string;\n data?: unknown;\n}\n\n// Agent adapter interface (used by agents package)\nexport interface AgentAdapterInfo {\n type: AgentType;\n name: string;\n skillsDir: string;\n configFile: string;\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { parse as parseYaml } from 'yaml';\nimport { SkillFrontmatter, SkillMetadata, type Skill, type SkillLocation } from './types.js';\n\nexport const SKILL_DISCOVERY_PATHS = [\n 'skills',\n 'skills/.curated',\n 'skills/.experimental',\n 'skills/.system',\n '.agents/skills',\n '.agent/skills',\n '.claude/skills',\n '.codex/skills',\n '.cursor/skills',\n '.factory/skills',\n '.gemini/skills',\n '.github/skills',\n '.goose/skills',\n '.kilocode/skills',\n '.kiro/skills',\n '.opencode/skills',\n '.roo/skills',\n '.trae/skills',\n '.windsurf/skills',\n '.clawdbot/skills',\n '.antigravity/skills',\n '.copilot/skills',\n];\n\nfunction discoverSkillsInDir(dir: string): Skill[] {\n const skills: Skill[] = [];\n\n if (!existsSync(dir)) {\n return skills;\n }\n\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n const skillPath = join(dir, entry.name);\n const skillMdPath = join(skillPath, 'SKILL.md');\n\n if (existsSync(skillMdPath)) {\n const skill = parseSkill(skillPath);\n if (skill) {\n skills.push(skill);\n }\n }\n }\n\n return skills;\n}\n\n/**\n * Recursively search for skills in all subdirectories\n */\nfunction discoverSkillsRecursive(\n dir: string,\n seen: Set<string>,\n maxDepth: number = 5,\n currentDepth: number = 0\n): Skill[] {\n const skills: Skill[] = [];\n\n if (currentDepth >= maxDepth || !existsSync(dir)) {\n return skills;\n }\n\n try {\n const entries = readdirSync(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name === '.git') {\n continue;\n }\n\n if (!entry.isDirectory()) continue;\n\n const entryPath = join(dir, entry.name);\n const skillMdPath = join(entryPath, 'SKILL.md');\n\n if (existsSync(skillMdPath)) {\n const skill = parseSkill(entryPath);\n if (skill && !seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n } else {\n const subSkills = discoverSkillsRecursive(entryPath, seen, maxDepth, currentDepth + 1);\n skills.push(...subSkills);\n }\n }\n } catch {}\n\n return skills;\n}\n\nexport function discoverSkills(rootDir: string): Skill[] {\n const skills: Skill[] = [];\n const seen = new Set<string>();\n\n const rootSkillMd = join(rootDir, 'SKILL.md');\n if (existsSync(rootSkillMd)) {\n const skill = parseSkill(rootDir);\n if (skill && !seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n }\n\n // Search all standard paths\n for (const searchPath of SKILL_DISCOVERY_PATHS) {\n const fullPath = join(rootDir, searchPath);\n if (existsSync(fullPath)) {\n for (const skill of discoverSkillsInDir(fullPath)) {\n if (!seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n }\n }\n }\n\n // Try direct discovery in root (for flat structures)\n for (const skill of discoverSkillsInDir(rootDir)) {\n if (!seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push(skill);\n }\n }\n\n // Fallback: recursive search if nothing found\n if (skills.length === 0) {\n skills.push(...discoverSkillsRecursive(rootDir, seen));\n }\n\n return skills;\n}\n\nexport function parseSkill(skillPath: string, location: SkillLocation = 'project'): Skill | null {\n const skillMdPath = join(skillPath, 'SKILL.md');\n\n if (!existsSync(skillMdPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n\n if (!frontmatter) {\n const name = basename(skillPath);\n return {\n name,\n description: 'No description available',\n path: skillPath,\n location,\n enabled: true,\n };\n }\n\n const parsed = SkillFrontmatter.safeParse(frontmatter);\n\n if (!parsed.success) {\n return {\n name: (frontmatter.name as string) || basename(skillPath),\n description: (frontmatter.description as string) || 'No description available',\n path: skillPath,\n location,\n enabled: true,\n };\n }\n\n const metadata = loadMetadata(skillPath);\n\n return {\n name: parsed.data.name,\n description: parsed.data.description,\n path: skillPath,\n location,\n metadata: metadata ?? undefined,\n enabled: metadata?.enabled ?? true,\n };\n } catch {\n return null;\n }\n}\n\nexport function extractFrontmatter(content: string): Record<string, unknown> | null {\n const match = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n\n if (!match) {\n return null;\n }\n\n try {\n return parseYaml(match[1]) as Record<string, unknown>;\n } catch {\n return null;\n }\n}\n\nexport function extractField(content: string, field: string): string | null {\n const frontmatter = extractFrontmatter(content);\n if (!frontmatter || !(field in frontmatter)) {\n return null;\n }\n\n const value = frontmatter[field];\n return typeof value === 'string' ? value : null;\n}\n\nexport function loadMetadata(skillPath: string): SkillMetadata | null {\n const metadataPath = join(skillPath, '.skillkit.json');\n\n if (!existsSync(metadataPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(metadataPath, 'utf-8');\n const data = JSON.parse(content);\n const parsed = SkillMetadata.safeParse(data);\n\n return parsed.success ? parsed.data : null;\n } catch {\n return null;\n }\n}\n\nexport function readSkillContent(skillPath: string): string | null {\n const skillMdPath = join(skillPath, 'SKILL.md');\n\n if (!existsSync(skillMdPath)) {\n return null;\n }\n\n try {\n return readFileSync(skillMdPath, 'utf-8');\n } catch {\n return null;\n }\n}\n\nexport function findSkill(name: string, searchDirs: string[]): Skill | null {\n for (const dir of searchDirs) {\n if (!existsSync(dir)) continue;\n\n const skillPath = join(dir, name);\n if (existsSync(skillPath)) {\n const location: SkillLocation = dir.includes(process.cwd()) ? 'project' : 'global';\n return parseSkill(skillPath, location);\n }\n }\n\n return null;\n}\n\nexport function findAllSkills(searchDirs: string[]): Skill[] {\n const skills: Skill[] = [];\n const seen = new Set<string>();\n\n for (const dir of searchDirs) {\n if (!existsSync(dir)) continue;\n\n const location: SkillLocation = dir.includes(process.cwd()) ? 'project' : 'global';\n const discovered = discoverSkills(dir);\n\n for (const skill of discovered) {\n if (!seen.has(skill.name)) {\n seen.add(skill.name);\n skills.push({ ...skill, location });\n }\n }\n }\n\n return skills;\n}\n\nexport function validateSkill(skillPath: string): { valid: boolean; errors: string[]; warnings?: string[] } {\n const errors: string[] = [];\n const warnings: string[] = [];\n const dirName = basename(skillPath);\n\n const skillMdPath = join(skillPath, 'SKILL.md');\n if (!existsSync(skillMdPath)) {\n errors.push('Missing SKILL.md file');\n return { valid: false, errors };\n }\n\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n\n if (!frontmatter) {\n errors.push('Missing YAML frontmatter in SKILL.md');\n return { valid: false, errors };\n }\n\n const parsed = SkillFrontmatter.safeParse(frontmatter);\n if (!parsed.success) {\n for (const issue of parsed.error.issues) {\n errors.push(`${issue.path.join('.') || 'frontmatter'}: ${issue.message}`);\n }\n }\n\n if (parsed.success) {\n const data = parsed.data;\n\n if (data.name !== dirName) {\n warnings.push(`name \"${data.name}\" does not match directory name \"${dirName}\"`);\n }\n\n if (data.description && data.description.length < 50) {\n warnings.push('description is short; consider describing what the skill does AND when to use it');\n }\n }\n\n const bodyContent = content.replace(/^---[\\s\\S]*?---\\s*/, '');\n const lineCount = bodyContent.split('\\n').length;\n if (lineCount > 500) {\n warnings.push(`SKILL.md has ${lineCount} lines; consider moving detailed content to references/`);\n }\n\n return { valid: errors.length === 0, errors, warnings };\n}\n\nexport function isPathInside(child: string, parent: string): boolean {\n const relative = child.replace(parent, '');\n return !relative.startsWith('..') && !relative.includes('/..');\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { SkillkitConfig, type AgentType, type SkillMetadata, type AgentAdapterInfo } from './types.js';\n\nconst CONFIG_FILE = 'skillkit.yaml';\nconst METADATA_FILE = '.skillkit.json';\n\nexport function getProjectConfigPath(): string {\n return join(process.cwd(), CONFIG_FILE);\n}\n\nexport function getGlobalConfigPath(): string {\n return join(homedir(), '.config', 'skillkit', CONFIG_FILE);\n}\n\nexport function loadConfig(): SkillkitConfig {\n const projectPath = getProjectConfigPath();\n const globalPath = getGlobalConfigPath();\n\n if (existsSync(projectPath)) {\n try {\n const content = readFileSync(projectPath, 'utf-8');\n const data = parseYaml(content);\n const parsed = SkillkitConfig.safeParse(data);\n if (parsed.success) {\n return parsed.data;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n if (existsSync(globalPath)) {\n try {\n const content = readFileSync(globalPath, 'utf-8');\n const data = parseYaml(content);\n const parsed = SkillkitConfig.safeParse(data);\n if (parsed.success) {\n return parsed.data;\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n return {\n version: 1,\n agent: 'universal',\n autoSync: true,\n };\n}\n\nexport function saveConfig(config: SkillkitConfig, global = false): void {\n const configPath = global ? getGlobalConfigPath() : getProjectConfigPath();\n const dir = dirname(configPath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const content = stringifyYaml(config);\n writeFileSync(configPath, content, 'utf-8');\n}\n\nexport function getSearchDirs(adapter: AgentAdapterInfo): string[] {\n const dirs: string[] = [];\n\n dirs.push(join(process.cwd(), adapter.skillsDir));\n dirs.push(join(process.cwd(), '.agent', 'skills'));\n dirs.push(join(homedir(), adapter.skillsDir));\n dirs.push(join(homedir(), '.agent', 'skills'));\n\n return dirs;\n}\n\nexport function getInstallDir(adapter: AgentAdapterInfo, global = false): string {\n if (global) {\n return join(homedir(), adapter.skillsDir);\n }\n\n return join(process.cwd(), adapter.skillsDir);\n}\n\nexport function getAgentConfigPath(adapter: AgentAdapterInfo): string {\n return join(process.cwd(), adapter.configFile);\n}\n\nexport function saveSkillMetadata(skillPath: string, metadata: SkillMetadata): void {\n const metadataPath = join(skillPath, METADATA_FILE);\n writeFileSync(metadataPath, JSON.stringify(metadata, null, 2), 'utf-8');\n}\n\nexport function loadSkillMetadata(skillPath: string): SkillMetadata | null {\n const metadataPath = join(skillPath, METADATA_FILE);\n\n if (!existsSync(metadataPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(metadataPath, 'utf-8');\n return JSON.parse(content) as SkillMetadata;\n } catch {\n return null;\n }\n}\n\nexport function setSkillEnabled(skillPath: string, enabled: boolean): boolean {\n const metadata = loadSkillMetadata(skillPath);\n\n if (!metadata) {\n return false;\n }\n\n metadata.enabled = enabled;\n metadata.updatedAt = new Date().toISOString();\n saveSkillMetadata(skillPath, metadata);\n\n return true;\n}\n\nexport async function initProject(\n type: AgentType,\n adapter: AgentAdapterInfo\n): Promise<void> {\n const skillsDir = join(process.cwd(), adapter.skillsDir);\n if (!existsSync(skillsDir)) {\n mkdirSync(skillsDir, { recursive: true });\n }\n\n const config: SkillkitConfig = {\n version: 1,\n agent: type,\n autoSync: true,\n };\n saveConfig(config);\n\n const agentConfigPath = join(process.cwd(), adapter.configFile);\n if (!existsSync(agentConfigPath)) {\n writeFileSync(agentConfigPath, `# ${adapter.name} Configuration\\n\\n`, 'utf-8');\n }\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { parseShorthand, isGitUrl } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class GitHubProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'github';\n readonly name = 'GitHub';\n readonly baseUrl = 'https://github.com';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (source.startsWith('https://github.com/')) {\n const path = source.replace('https://github.com/', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('git@github.com:')) {\n const path = source.replace('git@github.com:', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (!isGitUrl(source) && !source.includes(':')) {\n return parseShorthand(source);\n }\n\n return null;\n }\n\n matches(source: string): boolean {\n return (\n source.startsWith('https://github.com/') ||\n source.startsWith('git@github.com:') ||\n (!isGitUrl(source) && !source.includes(':') && source.includes('/'))\n );\n }\n\n getCloneUrl(owner: string, repo: string): string {\n return `https://github.com/${owner}/${repo}.git`;\n }\n\n getSshUrl(owner: string, repo: string): string {\n return `git@github.com:${owner}/${repo}.git`;\n }\n\n async clone(source: string, _targetDir: string, options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed) {\n return { success: false, error: `Invalid GitHub source: ${source}` };\n }\n\n const { owner, repo, subpath } = parsed;\n const cloneUrl = options.ssh ? this.getSshUrl(owner, repo) : this.getCloneUrl(owner, repo);\n\n const tempDir = join(tmpdir(), `skillkit-${randomUUID()}`);\n\n try {\n const args = ['clone'];\n if (options.depth) {\n args.push('--depth', String(options.depth));\n }\n if (options.branch) {\n args.push('--branch', options.branch);\n }\n args.push(cloneUrl, tempDir);\n\n execSync(`git ${args.join(' ')}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n });\n\n const searchDir = subpath ? join(tempDir, subpath) : tempDir;\n const skills = discoverSkills(searchDir);\n\n return {\n success: true,\n path: searchDir,\n tempRoot: tempDir,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to clone: ${message}` };\n }\n }\n}\n","import type { GitProvider, CloneResult } from '../types.js';\n\nexport interface GitProviderAdapter {\n readonly type: GitProvider;\n readonly name: string;\n readonly baseUrl: string;\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null;\n matches(source: string): boolean;\n getCloneUrl(owner: string, repo: string): string;\n getSshUrl(owner: string, repo: string): string;\n clone(source: string, targetDir: string, options?: CloneOptions): Promise<CloneResult>;\n}\n\nexport interface CloneOptions {\n depth?: number;\n branch?: string;\n ssh?: boolean;\n}\n\nexport function parseShorthand(source: string): { owner: string; repo: string; subpath?: string } | null {\n const cleaned = source.replace(/^\\/+|\\/+$/g, '');\n const parts = cleaned.split('/');\n\n if (parts.length < 2) {\n return null;\n }\n\n const owner = parts[0];\n const repo = parts[1];\n const subpath = parts.length > 2 ? parts.slice(2).join('/') : undefined;\n\n return { owner, repo, subpath };\n}\n\nexport function isLocalPath(source: string): boolean {\n return (\n source.startsWith('/') ||\n source.startsWith('./') ||\n source.startsWith('../') ||\n source.startsWith('~/') ||\n source.startsWith('.')\n );\n}\n\nexport function isGitUrl(source: string): boolean {\n return (\n source.startsWith('git@') ||\n source.startsWith('https://') ||\n source.startsWith('http://') ||\n source.startsWith('ssh://')\n );\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { parseShorthand } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class GitLabProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'gitlab';\n readonly name = 'GitLab';\n readonly baseUrl = 'https://gitlab.com';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (source.startsWith('https://gitlab.com/')) {\n const path = source.replace('https://gitlab.com/', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('git@gitlab.com:')) {\n const path = source.replace('git@gitlab.com:', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('gitlab:')) {\n return parseShorthand(source.replace('gitlab:', ''));\n }\n\n if (source.startsWith('gitlab.com/')) {\n return parseShorthand(source.replace('gitlab.com/', ''));\n }\n\n return null;\n }\n\n matches(source: string): boolean {\n return (\n source.startsWith('https://gitlab.com/') ||\n source.startsWith('git@gitlab.com:') ||\n source.startsWith('gitlab:') ||\n source.startsWith('gitlab.com/')\n );\n }\n\n getCloneUrl(owner: string, repo: string): string {\n return `https://gitlab.com/${owner}/${repo}.git`;\n }\n\n getSshUrl(owner: string, repo: string): string {\n return `git@gitlab.com:${owner}/${repo}.git`;\n }\n\n async clone(source: string, _targetDir: string, options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed) {\n return { success: false, error: `Invalid GitLab source: ${source}` };\n }\n\n const { owner, repo, subpath } = parsed;\n const cloneUrl = options.ssh ? this.getSshUrl(owner, repo) : this.getCloneUrl(owner, repo);\n\n const tempDir = join(tmpdir(), `skillkit-${randomUUID()}`);\n\n try {\n const args = ['clone'];\n if (options.depth) {\n args.push('--depth', String(options.depth));\n }\n if (options.branch) {\n args.push('--branch', options.branch);\n }\n args.push(cloneUrl, tempDir);\n\n execSync(`git ${args.join(' ')}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n });\n\n const searchDir = subpath ? join(tempDir, subpath) : tempDir;\n const skills = discoverSkills(searchDir);\n\n return {\n success: true,\n path: searchDir,\n tempRoot: tempDir,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to clone: ${message}` };\n }\n }\n}\n","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { parseShorthand } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class BitbucketProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'bitbucket';\n readonly name = 'Bitbucket';\n readonly baseUrl = 'https://bitbucket.org';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (source.startsWith('https://bitbucket.org/')) {\n const path = source.replace('https://bitbucket.org/', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('git@bitbucket.org:')) {\n const path = source.replace('git@bitbucket.org:', '').replace(/\\.git$/, '');\n return parseShorthand(path);\n }\n\n if (source.startsWith('bitbucket:')) {\n return parseShorthand(source.replace('bitbucket:', ''));\n }\n\n if (source.startsWith('bitbucket.org/')) {\n return parseShorthand(source.replace('bitbucket.org/', ''));\n }\n\n return null;\n }\n\n matches(source: string): boolean {\n return (\n source.startsWith('https://bitbucket.org/') ||\n source.startsWith('git@bitbucket.org:') ||\n source.startsWith('bitbucket:') ||\n source.startsWith('bitbucket.org/')\n );\n }\n\n getCloneUrl(owner: string, repo: string): string {\n return `https://bitbucket.org/${owner}/${repo}.git`;\n }\n\n getSshUrl(owner: string, repo: string): string {\n return `git@bitbucket.org:${owner}/${repo}.git`;\n }\n\n async clone(source: string, _targetDir: string, options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed) {\n return { success: false, error: `Invalid Bitbucket source: ${source}` };\n }\n\n const { owner, repo, subpath } = parsed;\n const cloneUrl = options.ssh ? this.getSshUrl(owner, repo) : this.getCloneUrl(owner, repo);\n\n const tempDir = join(tmpdir(), `skillkit-${randomUUID()}`);\n\n try {\n const args = ['clone'];\n if (options.depth) {\n args.push('--depth', String(options.depth));\n }\n if (options.branch) {\n args.push('--branch', options.branch);\n }\n args.push(cloneUrl, tempDir);\n\n execSync(`git ${args.join(' ')}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n });\n\n const searchDir = subpath ? join(tempDir, subpath) : tempDir;\n const skills = discoverSkills(searchDir);\n\n return {\n success: true,\n path: searchDir,\n tempRoot: tempDir,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n if (existsSync(tempDir)) {\n rmSync(tempDir, { recursive: true, force: true });\n }\n\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to clone: ${message}` };\n }\n }\n}\n","import { existsSync, statSync, realpathSync } from 'node:fs';\nimport { join, resolve, basename } from 'node:path';\nimport { homedir } from 'node:os';\nimport type { GitProviderAdapter, CloneOptions } from './base.js';\nimport { isLocalPath } from './base.js';\nimport type { GitProvider, CloneResult } from '../types.js';\nimport { discoverSkills } from '../skills.js';\n\nexport class LocalProvider implements GitProviderAdapter {\n readonly type: GitProvider = 'local';\n readonly name = 'Local Filesystem';\n readonly baseUrl = '';\n\n parseSource(source: string): { owner: string; repo: string; subpath?: string } | null {\n if (!isLocalPath(source)) {\n return null;\n }\n\n let expandedPath = source;\n if (source.startsWith('~/')) {\n expandedPath = join(homedir(), source.slice(2));\n }\n\n const absolutePath = resolve(expandedPath);\n const dirName = basename(absolutePath);\n\n return {\n owner: 'local',\n repo: dirName,\n subpath: absolutePath,\n };\n }\n\n matches(source: string): boolean {\n return isLocalPath(source);\n }\n\n getCloneUrl(_owner: string, _repo: string): string {\n return '';\n }\n\n getSshUrl(_owner: string, _repo: string): string {\n return '';\n }\n\n async clone(source: string, _targetDir: string, _options: CloneOptions = {}): Promise<CloneResult> {\n const parsed = this.parseSource(source);\n if (!parsed || !parsed.subpath) {\n return { success: false, error: `Invalid local path: ${source}` };\n }\n\n const sourcePath = parsed.subpath;\n\n if (!existsSync(sourcePath)) {\n return { success: false, error: `Path does not exist: ${sourcePath}` };\n }\n\n const stats = statSync(sourcePath);\n if (!stats.isDirectory()) {\n return { success: false, error: `Path is not a directory: ${sourcePath}` };\n }\n\n try {\n let actualPath = sourcePath;\n try {\n actualPath = realpathSync(sourcePath);\n } catch {\n // Ignore realpath errors\n }\n\n const skills = discoverSkills(actualPath);\n\n return {\n success: true,\n path: actualPath,\n skills: skills.map(s => s.name),\n discoveredSkills: skills.map(s => ({\n name: s.name,\n dirName: basename(s.path),\n path: s.path,\n })),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { success: false, error: `Failed to process local path: ${message}` };\n }\n }\n}\n","import type { GitProviderAdapter } from './base.js';\nimport type { GitProvider } from '../types.js';\nimport { GitHubProvider } from './github.js';\nimport { GitLabProvider } from './gitlab.js';\nimport { BitbucketProvider } from './bitbucket.js';\nimport { LocalProvider } from './local.js';\n\nexport * from './base.js';\nexport * from './github.js';\nexport * from './gitlab.js';\nexport * from './bitbucket.js';\nexport * from './local.js';\n\nconst providers: GitProviderAdapter[] = [\n new LocalProvider(),\n new GitLabProvider(),\n new BitbucketProvider(),\n new GitHubProvider(),\n];\n\nexport function getProvider(type: GitProvider): GitProviderAdapter | undefined {\n return providers.find(p => p.type === type);\n}\n\nexport function getAllProviders(): GitProviderAdapter[] {\n return providers;\n}\n\nexport function detectProvider(source: string): GitProviderAdapter | undefined {\n return providers.find(p => p.matches(source));\n}\n\nexport function parseSource(source: string): {\n provider: GitProviderAdapter;\n owner: string;\n repo: string;\n subpath?: string;\n} | null {\n for (const provider of providers) {\n if (provider.matches(source)) {\n const parsed = provider.parseSource(source);\n if (parsed) {\n return { provider, ...parsed };\n }\n }\n }\n return null;\n}\n","import { z } from 'zod';\nimport type { AgentType } from '../types.js';\n\n/**\n * Format categories for skill translation\n */\nexport type FormatCategory =\n | 'skill-md' // Category A: Standard SKILL.md (13 agents)\n | 'cursor-mdc' // Category B: Cursor MDC format\n | 'markdown-rules' // Category C: Windsurf, GitHub Copilot\n | 'external'; // Category D: External systems (Devin, etc.)\n\n/**\n * Mapping of agents to their format categories\n */\nexport const AGENT_FORMAT_MAP: Record<AgentType, FormatCategory> = {\n 'claude-code': 'skill-md',\n 'codex': 'skill-md',\n 'gemini-cli': 'skill-md',\n 'opencode': 'skill-md',\n 'antigravity': 'skill-md',\n 'amp': 'skill-md',\n 'clawdbot': 'skill-md',\n 'droid': 'skill-md',\n 'goose': 'skill-md',\n 'kilo': 'skill-md',\n 'kiro-cli': 'skill-md',\n 'roo': 'skill-md',\n 'trae': 'skill-md',\n 'universal': 'skill-md',\n 'cursor': 'cursor-mdc',\n 'windsurf': 'markdown-rules',\n 'github-copilot': 'markdown-rules',\n};\n\n/**\n * Extended skill frontmatter for translation\n */\nexport const TranslatableSkillFrontmatter = z.object({\n name: z.string(),\n description: z.string(),\n version: z.string().optional(),\n author: z.string().optional(),\n license: z.string().optional(),\n tags: z.array(z.string()).optional(),\n compatibility: z.string().optional(),\n 'allowed-tools': z.string().optional(),\n metadata: z.record(z.string()).optional(),\n // Cursor-specific fields\n globs: z.array(z.string()).optional(),\n alwaysApply: z.boolean().optional(),\n // Agent optimization hints\n agents: z.object({\n optimized: z.array(z.string()).optional(),\n compatible: z.array(z.string()).optional(),\n }).optional(),\n});\nexport type TranslatableSkillFrontmatter = z.infer<typeof TranslatableSkillFrontmatter>;\n\n/**\n * Canonical skill representation for translation\n */\nexport interface CanonicalSkill {\n /** Skill name (kebab-case) */\n name: string;\n /** Human-readable description */\n description: string;\n /** Version string */\n version?: string;\n /** Author name or handle */\n author?: string;\n /** License identifier */\n license?: string;\n /** Categorization tags */\n tags?: string[];\n /** Compatibility description */\n compatibility?: string;\n /** Allowed tools list */\n allowedTools?: string;\n /** Additional metadata */\n metadata?: Record<string, string>;\n /** Main content (markdown) */\n content: string;\n /** Original format this was parsed from */\n sourceFormat: FormatCategory;\n /** Source agent type */\n sourceAgent?: AgentType;\n /** Cursor-specific: glob patterns */\n globs?: string[];\n /** Cursor-specific: always apply flag */\n alwaysApply?: boolean;\n /** Agent optimization hints */\n agentHints?: {\n optimized?: string[];\n compatible?: string[];\n };\n}\n\n/**\n * Result of a translation operation\n */\nexport interface TranslationResult {\n /** Whether translation succeeded */\n success: boolean;\n /** Translated content */\n content: string;\n /** Output filename */\n filename: string;\n /** Warnings during translation */\n warnings: string[];\n /** Features that couldn't be translated */\n incompatible: string[];\n /** Target format */\n targetFormat: FormatCategory;\n /** Target agent */\n targetAgent: AgentType;\n}\n\n/**\n * Options for translation\n */\nexport interface TranslationOptions {\n /** Preserve original comments */\n preserveComments?: boolean;\n /** Add translation metadata */\n addMetadata?: boolean;\n /** Custom output filename */\n outputFilename?: string;\n /** For Cursor: glob patterns to include */\n globs?: string[];\n /** For Cursor: always apply setting */\n alwaysApply?: boolean;\n}\n\n/**\n * Interface for format-specific translators\n */\nexport interface FormatTranslator {\n /** Format this translator handles */\n readonly format: FormatCategory;\n /** Agents this translator is optimized for */\n readonly agents: AgentType[];\n\n /**\n * Parse content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null;\n\n /**\n * Check if content matches this format\n */\n detect(content: string, filename?: string): boolean;\n\n /**\n * Generate content for target agent\n */\n generate(skill: CanonicalSkill, targetAgent: AgentType, options?: TranslationOptions): TranslationResult;\n\n /**\n * Get the expected filename for this format\n */\n getFilename(skillName: string, targetAgent: AgentType): string;\n}\n\n/**\n * Translation path between formats\n */\nexport interface TranslationPath {\n from: FormatCategory;\n to: FormatCategory;\n steps: FormatCategory[];\n}\n","import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Agents that use the standard SKILL.md format\n */\nconst SKILL_MD_AGENTS: AgentType[] = [\n 'claude-code',\n 'codex',\n 'gemini-cli',\n 'opencode',\n 'antigravity',\n 'amp',\n 'clawdbot',\n 'droid',\n 'goose',\n 'kilo',\n 'kiro-cli',\n 'roo',\n 'trae',\n 'universal',\n];\n\n/**\n * Extract YAML frontmatter from markdown content\n */\nfunction extractFrontmatter(content: string): { frontmatter: Record<string, unknown> | null; body: string } {\n const match = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n?([\\s\\S]*)/);\n\n if (!match) {\n return { frontmatter: null, body: content };\n }\n\n try {\n const frontmatter = parseYaml(match[1]) as Record<string, unknown>;\n return { frontmatter, body: match[2] || '' };\n } catch {\n return { frontmatter: null, body: content };\n }\n}\n\n/**\n * SKILL.md Format Translator\n *\n * This is the canonical format used by most AI coding agents.\n * Format:\n * ```\n * ---\n * name: skill-name\n * description: What it does\n * version: 1.0.0\n * tags: [tag1, tag2]\n * ---\n * # Instructions\n * Markdown content here...\n * ```\n */\nexport class SkillMdTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'skill-md';\n readonly agents: AgentType[] = SKILL_MD_AGENTS;\n\n /**\n * Parse SKILL.md content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { frontmatter, body } = extractFrontmatter(content);\n\n if (!frontmatter) {\n // Try to infer from content if no frontmatter\n const nameMatch = content.match(/^#\\s+(.+)$/m);\n const name = nameMatch\n ? nameMatch[1].toLowerCase().replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '')\n : filename?.replace(/\\.md$/i, '').replace(/^SKILL$/i, 'unnamed-skill') || 'unnamed-skill';\n\n return {\n name,\n description: 'Skill without frontmatter',\n content: body.trim(),\n sourceFormat: 'skill-md',\n };\n }\n\n const name = (frontmatter.name as string) || 'unnamed-skill';\n const description = (frontmatter.description as string) || 'No description';\n\n return {\n name,\n description,\n version: frontmatter.version as string | undefined,\n author: frontmatter.author as string | undefined,\n license: frontmatter.license as string | undefined,\n tags: frontmatter.tags as string[] | undefined,\n compatibility: frontmatter.compatibility as string | undefined,\n allowedTools: frontmatter['allowed-tools'] as string | undefined,\n metadata: frontmatter.metadata as Record<string, string> | undefined,\n content: body.trim(),\n sourceFormat: 'skill-md',\n sourceAgent: frontmatter.sourceAgent as AgentType | undefined,\n globs: frontmatter.globs as string[] | undefined,\n alwaysApply: frontmatter.alwaysApply as boolean | undefined,\n agentHints: frontmatter.agents as { optimized?: string[]; compatible?: string[] } | undefined,\n };\n }\n\n /**\n * Check if content is SKILL.md format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename && /SKILL\\.md$/i.test(filename)) {\n return true;\n }\n\n // Check for YAML frontmatter with expected fields\n const { frontmatter } = extractFrontmatter(content);\n if (frontmatter && ('name' in frontmatter || 'description' in frontmatter)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Generate SKILL.md content for target agent\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n\n // Build frontmatter object\n const frontmatter: Record<string, unknown> = {\n name: skill.name,\n description: skill.description,\n };\n\n // Add optional fields\n if (skill.version) frontmatter.version = skill.version;\n if (skill.author) frontmatter.author = skill.author;\n if (skill.license) frontmatter.license = skill.license;\n if (skill.tags?.length) frontmatter.tags = skill.tags;\n if (skill.compatibility) frontmatter.compatibility = skill.compatibility;\n if (skill.allowedTools) frontmatter['allowed-tools'] = skill.allowedTools;\n if (skill.metadata && Object.keys(skill.metadata).length > 0) {\n frontmatter.metadata = skill.metadata;\n }\n\n // Handle Cursor-specific fields (store for reverse translation)\n if (skill.globs?.length) {\n frontmatter.globs = skill.globs;\n warnings.push('Cursor globs preserved but may not be used by target agent');\n }\n if (skill.alwaysApply !== undefined) {\n frontmatter.alwaysApply = skill.alwaysApply;\n warnings.push('Cursor alwaysApply preserved but may not be used by target agent');\n }\n\n // Add translation metadata if requested\n if (options.addMetadata) {\n frontmatter.translatedFrom = skill.sourceFormat;\n frontmatter.translatedAt = new Date().toISOString();\n frontmatter.targetAgent = targetAgent;\n }\n\n // Generate YAML frontmatter\n const yamlContent = stringifyYaml(frontmatter, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n defaultStringType: 'QUOTE_DOUBLE',\n }).trim();\n\n // Combine frontmatter and content\n const content = `---\\n${yamlContent}\\n---\\n\\n${skill.content}`;\n\n return {\n success: true,\n content,\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'skill-md',\n targetAgent,\n };\n }\n\n /**\n * Get the expected filename for SKILL.md format\n */\n getFilename(_skillName: string, _targetAgent: AgentType): string {\n return 'SKILL.md';\n }\n}\n\n/**\n * Singleton instance\n */\nexport const skillMdTranslator = new SkillMdTranslator();\n","import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Extract YAML frontmatter from MDC content\n */\nfunction extractFrontmatter(content: string): { frontmatter: Record<string, unknown> | null; body: string } {\n const match = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---\\s*\\n?([\\s\\S]*)/);\n\n if (!match) {\n return { frontmatter: null, body: content };\n }\n\n try {\n const frontmatter = parseYaml(match[1]) as Record<string, unknown>;\n return { frontmatter, body: match[2] || '' };\n } catch {\n return { frontmatter: null, body: content };\n }\n}\n\n/**\n * Infer glob patterns from skill content and tags\n */\nfunction inferGlobs(skill: CanonicalSkill): string[] {\n const globs: string[] = [];\n const content = skill.content.toLowerCase();\n const tags = skill.tags || [];\n\n // Infer from tags\n const tagExtensions: Record<string, string[]> = {\n 'react': ['**/*.tsx', '**/*.jsx'],\n 'typescript': ['**/*.ts', '**/*.tsx'],\n 'javascript': ['**/*.js', '**/*.jsx'],\n 'python': ['**/*.py'],\n 'rust': ['**/*.rs'],\n 'go': ['**/*.go'],\n 'css': ['**/*.css', '**/*.scss', '**/*.sass'],\n 'html': ['**/*.html', '**/*.htm'],\n 'vue': ['**/*.vue'],\n 'svelte': ['**/*.svelte'],\n 'angular': ['**/*.ts', '**/*.html'],\n 'nextjs': ['**/*.tsx', '**/*.ts', '**/*.jsx', '**/*.js'],\n 'testing': ['**/*.test.*', '**/*.spec.*'],\n 'api': ['**/api/**/*', '**/routes/**/*'],\n };\n\n for (const tag of tags) {\n const normalized = tag.toLowerCase();\n if (tagExtensions[normalized]) {\n globs.push(...tagExtensions[normalized]);\n }\n }\n\n // Infer from content mentions\n if (content.includes('component') || content.includes('jsx') || content.includes('tsx')) {\n if (!globs.includes('**/*.tsx')) globs.push('**/*.tsx');\n if (!globs.includes('**/*.jsx')) globs.push('**/*.jsx');\n }\n\n if (content.includes('.py') || content.includes('python')) {\n if (!globs.includes('**/*.py')) globs.push('**/*.py');\n }\n\n // Remove duplicates\n return [...new Set(globs)];\n}\n\n/**\n * Cursor MDC Format Translator\n *\n * Cursor uses two formats:\n * 1. .cursorrules - Global rules file in project root\n * 2. .cursor/rules/*.mdc - Individual rule files with frontmatter\n *\n * MDC Format:\n * ```\n * ---\n * description: What this rule does\n * globs: [\"**\\/*.tsx\", \"**\\/*.jsx\"]\n * alwaysApply: false\n * ---\n * Instructions here...\n * ```\n */\nexport class CursorTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'cursor-mdc';\n readonly agents: AgentType[] = ['cursor'];\n\n /**\n * Parse Cursor MDC content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { frontmatter, body } = extractFrontmatter(content);\n\n // Extract name from filename\n let name = 'unnamed-skill';\n if (filename) {\n name = filename\n .replace(/\\.(mdc|md|cursorrules)$/i, '')\n .replace(/^\\./, '')\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n }\n\n if (!frontmatter) {\n // Plain .cursorrules file without frontmatter\n return {\n name,\n description: 'Cursor rules',\n content: body.trim(),\n sourceFormat: 'cursor-mdc',\n sourceAgent: 'cursor',\n };\n }\n\n const description = (frontmatter.description as string) || 'Cursor rule';\n\n return {\n name: (frontmatter.name as string) || name,\n description,\n content: body.trim(),\n sourceFormat: 'cursor-mdc',\n sourceAgent: 'cursor',\n globs: frontmatter.globs as string[] | undefined,\n alwaysApply: frontmatter.alwaysApply as boolean | undefined,\n tags: frontmatter.tags as string[] | undefined,\n version: frontmatter.version as string | undefined,\n author: frontmatter.author as string | undefined,\n };\n }\n\n /**\n * Check if content is Cursor MDC format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename) {\n if (/\\.mdc$/i.test(filename)) return true;\n if (/\\.cursorrules$/i.test(filename)) return true;\n if (/cursorrules/i.test(filename)) return true;\n }\n\n // Check for MDC-specific frontmatter fields\n const { frontmatter } = extractFrontmatter(content);\n if (frontmatter) {\n if ('globs' in frontmatter || 'alwaysApply' in frontmatter) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Generate Cursor MDC content\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n\n // Build frontmatter\n const frontmatter: Record<string, unknown> = {\n description: skill.description,\n };\n\n // Handle globs\n let globs = options.globs || skill.globs;\n if (!globs?.length) {\n // Try to infer globs from skill metadata\n globs = inferGlobs(skill);\n if (globs.length > 0) {\n warnings.push(`Inferred glob patterns: ${globs.join(', ')}`);\n }\n }\n if (globs?.length) {\n frontmatter.globs = globs;\n }\n\n // Handle alwaysApply\n const alwaysApply = options.alwaysApply ?? skill.alwaysApply;\n if (alwaysApply !== undefined) {\n frontmatter.alwaysApply = alwaysApply;\n }\n\n // Note features that don't translate well\n if (skill.allowedTools) {\n incompatible.push('allowed-tools: Cursor does not support tool restrictions');\n }\n if (skill.compatibility) {\n // Add as comment in content\n warnings.push('compatibility info added as comment');\n }\n\n // Add translation metadata if requested\n if (options.addMetadata) {\n frontmatter.translatedFrom = skill.sourceFormat;\n frontmatter.originalName = skill.name;\n }\n\n // Generate YAML frontmatter\n const yamlContent = stringifyYaml(frontmatter, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n }).trim();\n\n // Build content with optional compatibility note\n let body = skill.content;\n if (skill.compatibility && options.preserveComments !== false) {\n body = `<!-- Compatibility: ${skill.compatibility} -->\\n\\n${body}`;\n }\n\n const content = `---\\n${yamlContent}\\n---\\n\\n${body}`;\n\n return {\n success: true,\n content,\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'cursor-mdc',\n targetAgent,\n };\n }\n\n /**\n * Generate .cursorrules content (alternative format)\n */\n generateCursorrules(skill: CanonicalSkill): string {\n // .cursorrules is just plain markdown without frontmatter\n let content = '';\n\n // Add header comment\n content += `# ${skill.name}\\n`;\n content += `# ${skill.description}\\n\\n`;\n\n // Add main content\n content += skill.content;\n\n return content;\n }\n\n /**\n * Get the expected filename for Cursor format\n */\n getFilename(skillName: string, _targetAgent: AgentType): string {\n // Convert to valid MDC filename\n const safeName = skillName\n .toLowerCase()\n .replace(/[^a-z0-9-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n\n return `${safeName}.mdc`;\n }\n}\n\n/**\n * Singleton instance\n */\nexport const cursorTranslator = new CursorTranslator();\n","import type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Parse metadata from markdown comments\n */\nfunction parseMetadataComments(content: string): { metadata: Record<string, string>; body: string } {\n const metadata: Record<string, string> = {};\n const lines = content.split('\\n');\n const bodyLines: string[] = [];\n let inMetadata = true;\n\n for (const line of lines) {\n if (inMetadata) {\n const match = line.match(/^<!--\\s*(\\w+):\\s*(.+?)\\s*-->$/);\n if (match) {\n metadata[match[1].toLowerCase()] = match[2];\n continue;\n }\n // Stop parsing metadata on first non-comment, non-empty line\n if (line.trim() && !line.startsWith('<!--')) {\n inMetadata = false;\n }\n }\n bodyLines.push(line);\n }\n\n return {\n metadata,\n body: bodyLines.join('\\n').trim(),\n };\n}\n\n/**\n * Windsurf Rules Format Translator\n *\n * Windsurf uses plain markdown files (.windsurfrules) without YAML frontmatter.\n * Metadata can be embedded in HTML comments at the top.\n *\n * Format:\n * ```\n * <!-- name: skill-name -->\n * <!-- description: What it does -->\n *\n * # Guidelines\n *\n * Instructions here...\n * ```\n */\nexport class WindsurfTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'markdown-rules';\n readonly agents: AgentType[] = ['windsurf'];\n\n /**\n * Parse Windsurf rules content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { metadata, body } = parseMetadataComments(content);\n\n // Try to extract name from first heading if not in metadata\n let name = metadata.name;\n if (!name) {\n const headingMatch = body.match(/^#\\s+(.+)$/m);\n if (headingMatch) {\n name = headingMatch[1]\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else if (filename) {\n name = filename\n .replace(/\\.(windsurfrules|md)$/i, '')\n .replace(/^\\./, '')\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else {\n name = 'unnamed-skill';\n }\n }\n\n // Try to extract description from metadata or first paragraph\n let description = metadata.description;\n if (!description) {\n // Get first non-heading paragraph\n const paragraphMatch = body.match(/^(?!#)[^\\n]+/m);\n if (paragraphMatch) {\n description = paragraphMatch[0].substring(0, 200);\n if (description.length === 200) description += '...';\n } else {\n description = 'Windsurf rules';\n }\n }\n\n return {\n name,\n description,\n content: body,\n sourceFormat: 'markdown-rules',\n sourceAgent: 'windsurf',\n version: metadata.version,\n author: metadata.author,\n tags: metadata.tags?.split(',').map((t) => t.trim()),\n };\n }\n\n /**\n * Check if content is Windsurf format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename) {\n if (/\\.windsurfrules$/i.test(filename)) return true;\n if (/windsurfrules/i.test(filename)) return true;\n }\n\n // Check for metadata comments\n if (content.startsWith('<!--') && content.includes('-->')) {\n const { metadata } = parseMetadataComments(content);\n if (Object.keys(metadata).length > 0) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Generate Windsurf rules content\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n const lines: string[] = [];\n\n // Add metadata as HTML comments\n if (options.addMetadata !== false) {\n lines.push(`<!-- name: ${skill.name} -->`);\n lines.push(`<!-- description: ${skill.description} -->`);\n if (skill.version) lines.push(`<!-- version: ${skill.version} -->`);\n if (skill.author) lines.push(`<!-- author: ${skill.author} -->`);\n if (skill.tags?.length) lines.push(`<!-- tags: ${skill.tags.join(', ')} -->`);\n if (options.addMetadata) {\n lines.push(`<!-- translatedFrom: ${skill.sourceFormat} -->`);\n lines.push(`<!-- translatedAt: ${new Date().toISOString()} -->`);\n }\n lines.push('');\n }\n\n // Note incompatible features\n if (skill.globs?.length) {\n incompatible.push('globs: Windsurf does not support file pattern matching');\n }\n if (skill.alwaysApply !== undefined) {\n incompatible.push('alwaysApply: Windsurf does not support conditional application');\n }\n if (skill.allowedTools) {\n incompatible.push('allowed-tools: Windsurf does not support tool restrictions');\n }\n\n // Add main content\n lines.push(skill.content);\n\n return {\n success: true,\n content: lines.join('\\n'),\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'markdown-rules',\n targetAgent,\n };\n }\n\n /**\n * Get the expected filename for Windsurf format\n */\n getFilename(_skillName: string, _targetAgent: AgentType): string {\n return '.windsurfrules';\n }\n}\n\n/**\n * Singleton instance\n */\nexport const windsurfTranslator = new WindsurfTranslator();\n","import type { AgentType } from '../../types.js';\nimport type {\n FormatTranslator,\n CanonicalSkill,\n TranslationResult,\n TranslationOptions,\n FormatCategory,\n} from '../types.js';\n\n/**\n * Parse metadata from markdown comments (same as Windsurf)\n */\nfunction parseMetadataComments(content: string): { metadata: Record<string, string>; body: string } {\n const metadata: Record<string, string> = {};\n const lines = content.split('\\n');\n const bodyLines: string[] = [];\n let inMetadata = true;\n\n for (const line of lines) {\n if (inMetadata) {\n const match = line.match(/^<!--\\s*(\\w+):\\s*(.+?)\\s*-->$/);\n if (match) {\n metadata[match[1].toLowerCase()] = match[2];\n continue;\n }\n if (line.trim() && !line.startsWith('<!--')) {\n inMetadata = false;\n }\n }\n bodyLines.push(line);\n }\n\n return {\n metadata,\n body: bodyLines.join('\\n').trim(),\n };\n}\n\n/**\n * GitHub Copilot Instructions Format Translator\n *\n * GitHub Copilot uses a markdown file at `.github/copilot-instructions.md`\n * for custom instructions. It's plain markdown with optional metadata comments.\n *\n * Format:\n * ```\n * <!-- This file provides custom instructions for GitHub Copilot -->\n *\n * # Coding Guidelines\n *\n * ## React Components\n * - Use functional components with hooks\n * - Prefer TypeScript\n * ```\n */\nexport class CopilotTranslator implements FormatTranslator {\n readonly format: FormatCategory = 'markdown-rules';\n readonly agents: AgentType[] = ['github-copilot'];\n\n /**\n * Parse Copilot instructions into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const { metadata, body } = parseMetadataComments(content);\n\n // Try to extract name from metadata or first heading\n let name = metadata.name;\n if (!name) {\n const headingMatch = body.match(/^#\\s+(.+)$/m);\n if (headingMatch) {\n name = headingMatch[1]\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else if (filename) {\n name = filename\n .replace(/\\.(md)$/i, '')\n .replace(/copilot-instructions/i, 'copilot-rules')\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '');\n } else {\n name = 'copilot-instructions';\n }\n }\n\n // Extract description\n let description = metadata.description;\n if (!description) {\n const paragraphMatch = body.match(/^(?!#)[^\\n]+/m);\n if (paragraphMatch) {\n description = paragraphMatch[0].substring(0, 200);\n if (description.length === 200) description += '...';\n } else {\n description = 'GitHub Copilot instructions';\n }\n }\n\n return {\n name,\n description,\n content: body,\n sourceFormat: 'markdown-rules',\n sourceAgent: 'github-copilot',\n version: metadata.version,\n author: metadata.author,\n tags: metadata.tags?.split(',').map((t) => t.trim()),\n };\n }\n\n /**\n * Check if content is GitHub Copilot format\n */\n detect(content: string, filename?: string): boolean {\n // Check filename\n if (filename) {\n if (/copilot-instructions\\.md$/i.test(filename)) return true;\n if (/copilot.*instructions/i.test(filename)) return true;\n }\n\n // Check for Copilot-specific comments\n if (content.toLowerCase().includes('github copilot')) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Generate GitHub Copilot instructions content\n */\n generate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const warnings: string[] = [];\n const incompatible: string[] = [];\n const lines: string[] = [];\n\n // Add header comment\n lines.push('<!-- This file provides custom instructions for GitHub Copilot -->');\n lines.push('<!-- Generated by SkillKit - https://github.com/rohitg00/skillkit -->');\n lines.push('');\n\n // Add metadata as comments if requested\n if (options.addMetadata) {\n lines.push(`<!-- name: ${skill.name} -->`);\n lines.push(`<!-- description: ${skill.description} -->`);\n if (skill.version) lines.push(`<!-- version: ${skill.version} -->`);\n if (skill.author) lines.push(`<!-- author: ${skill.author} -->`);\n lines.push(`<!-- translatedFrom: ${skill.sourceFormat} -->`);\n lines.push(`<!-- translatedAt: ${new Date().toISOString()} -->`);\n lines.push('');\n }\n\n // Note incompatible features\n if (skill.globs?.length) {\n incompatible.push('globs: GitHub Copilot does not support file pattern matching');\n }\n if (skill.alwaysApply !== undefined) {\n incompatible.push('alwaysApply: GitHub Copilot does not support conditional application');\n }\n if (skill.allowedTools) {\n incompatible.push('allowed-tools: GitHub Copilot does not support tool restrictions');\n }\n if (skill.metadata && Object.keys(skill.metadata).length > 0) {\n warnings.push('Custom metadata fields not supported by GitHub Copilot');\n }\n\n // Add title if content doesn't start with one\n if (!skill.content.trim().startsWith('#')) {\n lines.push(`# ${skill.name.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ')}`);\n lines.push('');\n if (skill.description) {\n lines.push(skill.description);\n lines.push('');\n }\n }\n\n // Add main content\n lines.push(skill.content);\n\n return {\n success: true,\n content: lines.join('\\n'),\n filename: this.getFilename(skill.name, targetAgent),\n warnings,\n incompatible,\n targetFormat: 'markdown-rules',\n targetAgent,\n };\n }\n\n /**\n * Get the expected filename for GitHub Copilot format\n */\n getFilename(_skillName: string, _targetAgent: AgentType): string {\n return 'copilot-instructions.md';\n }\n\n /**\n * Get the expected path for the instructions file\n */\n getPath(_skillName: string): string {\n return '.github/copilot-instructions.md';\n }\n}\n\n/**\n * Singleton instance\n */\nexport const copilotTranslator = new CopilotTranslator();\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { dirname, basename } from 'node:path';\nimport type { AgentType } from '../types.js';\nimport {\n type FormatTranslator,\n type CanonicalSkill,\n type TranslationResult,\n type TranslationOptions,\n type FormatCategory,\n AGENT_FORMAT_MAP,\n} from './types.js';\nimport { skillMdTranslator } from './formats/skill-md.js';\nimport { cursorTranslator } from './formats/cursor.js';\nimport { windsurfTranslator } from './formats/windsurf.js';\nimport { copilotTranslator } from './formats/copilot.js';\n\n/**\n * Translator Registry\n *\n * Central registry for all format translators. Handles:\n * - Format detection\n * - Translation between any supported formats\n * - Finding the optimal translation path\n */\nexport class TranslatorRegistry {\n private translators: Map<FormatCategory, FormatTranslator> = new Map();\n private agentTranslators: Map<AgentType, FormatTranslator> = new Map();\n\n constructor() {\n // Register built-in translators\n this.register(skillMdTranslator);\n this.register(cursorTranslator);\n this.register(windsurfTranslator);\n this.register(copilotTranslator);\n }\n\n /**\n * Register a format translator\n */\n register(translator: FormatTranslator): void {\n this.translators.set(translator.format, translator);\n\n // Map agents to their translators\n for (const agent of translator.agents) {\n this.agentTranslators.set(agent, translator);\n }\n }\n\n /**\n * Get translator for a specific format\n */\n getTranslator(format: FormatCategory): FormatTranslator | undefined {\n return this.translators.get(format);\n }\n\n /**\n * Get translator for a specific agent\n */\n getTranslatorForAgent(agent: AgentType): FormatTranslator {\n // Check if we have a specific translator for this agent\n const specific = this.agentTranslators.get(agent);\n if (specific) {\n return specific;\n }\n\n // Fall back to SKILL.md translator (works for most agents)\n return skillMdTranslator;\n }\n\n /**\n * Get the format category for an agent\n */\n getFormatForAgent(agent: AgentType): FormatCategory {\n return AGENT_FORMAT_MAP[agent] || 'skill-md';\n }\n\n /**\n * Detect the format of content\n */\n detectFormat(content: string, filename?: string): FormatCategory | null {\n // Try each translator's detect method\n for (const [format, translator] of this.translators) {\n if (translator.detect(content, filename)) {\n return format;\n }\n }\n\n // Default to skill-md if content has YAML frontmatter\n if (content.startsWith('---')) {\n return 'skill-md';\n }\n\n return null;\n }\n\n /**\n * Detect the source agent from content\n */\n detectSourceAgent(content: string, filename?: string): AgentType | null {\n const format = this.detectFormat(content, filename);\n if (!format) return null;\n\n // Check filename for agent hints\n if (filename) {\n const lower = filename.toLowerCase();\n if (lower.includes('cursor') || lower.endsWith('.mdc')) return 'cursor';\n if (lower.includes('windsurf')) return 'windsurf';\n if (lower.includes('copilot')) return 'github-copilot';\n }\n\n // Return first agent that uses this format\n for (const [agent, agentFormat] of Object.entries(AGENT_FORMAT_MAP)) {\n if (agentFormat === format) {\n return agent as AgentType;\n }\n }\n\n return null;\n }\n\n /**\n * Parse content into canonical format\n */\n parse(content: string, filename?: string): CanonicalSkill | null {\n const format = this.detectFormat(content, filename);\n if (!format) {\n // Try skill-md as fallback\n return skillMdTranslator.parse(content, filename);\n }\n\n const translator = this.translators.get(format);\n if (!translator) {\n return null;\n }\n\n return translator.parse(content, filename);\n }\n\n /**\n * Translate skill to target agent format\n */\n translate(\n skill: CanonicalSkill,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const translator = this.getTranslatorForAgent(targetAgent);\n return translator.generate(skill, targetAgent, options);\n }\n\n /**\n * Translate content directly from one agent to another\n */\n translateContent(\n content: string,\n targetAgent: AgentType,\n options: TranslationOptions & { sourceFilename?: string } = {}\n ): TranslationResult {\n // Parse source content\n const skill = this.parse(content, options.sourceFilename);\n if (!skill) {\n return {\n success: false,\n content: '',\n filename: '',\n warnings: [],\n incompatible: ['Failed to parse source content'],\n targetFormat: this.getFormatForAgent(targetAgent),\n targetAgent,\n };\n }\n\n // Translate to target format\n return this.translate(skill, targetAgent, options);\n }\n\n /**\n * Translate a skill file to target agent format\n */\n translateFile(\n sourcePath: string,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n if (!existsSync(sourcePath)) {\n return {\n success: false,\n content: '',\n filename: '',\n warnings: [],\n incompatible: [`Source file not found: ${sourcePath}`],\n targetFormat: this.getFormatForAgent(targetAgent),\n targetAgent,\n };\n }\n\n const content = readFileSync(sourcePath, 'utf-8');\n const filename = basename(sourcePath);\n\n return this.translateContent(content, targetAgent, {\n ...options,\n sourceFilename: filename,\n });\n }\n\n /**\n * Translate and write to target path\n */\n translateAndWrite(\n sourcePath: string,\n targetPath: string,\n targetAgent: AgentType,\n options: TranslationOptions = {}\n ): TranslationResult {\n const result = this.translateFile(sourcePath, targetAgent, options);\n\n if (result.success) {\n // Ensure target directory exists\n const targetDir = dirname(targetPath);\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n // Write translated content\n writeFileSync(targetPath, result.content, 'utf-8');\n }\n\n return result;\n }\n\n /**\n * Get all supported agents\n */\n getSupportedAgents(): AgentType[] {\n return Object.keys(AGENT_FORMAT_MAP) as AgentType[];\n }\n\n /**\n * Get all registered formats\n */\n getRegisteredFormats(): FormatCategory[] {\n return Array.from(this.translators.keys());\n }\n\n /**\n * Check if translation is supported between two agents\n */\n canTranslate(from: AgentType, to: AgentType): boolean {\n // All agents can translate to/from each other via the canonical format\n return this.getSupportedAgents().includes(from) && this.getSupportedAgents().includes(to);\n }\n\n /**\n * Get translation compatibility info\n */\n getCompatibilityInfo(from: AgentType, to: AgentType): {\n supported: boolean;\n warnings: string[];\n lossyFields: string[];\n } {\n const fromFormat = this.getFormatForAgent(from);\n const toFormat = this.getFormatForAgent(to);\n const warnings: string[] = [];\n const lossyFields: string[] = [];\n\n // Cursor-specific features\n if (fromFormat === 'cursor-mdc' && toFormat !== 'cursor-mdc') {\n lossyFields.push('globs', 'alwaysApply');\n warnings.push('Cursor-specific features (globs, alwaysApply) will be preserved but not used');\n }\n\n // SKILL.md features going to markdown-rules\n if (fromFormat === 'skill-md' && toFormat === 'markdown-rules') {\n lossyFields.push('allowed-tools', 'metadata');\n warnings.push('Advanced SKILL.md features will be stored as comments');\n }\n\n return {\n supported: this.canTranslate(from, to),\n warnings,\n lossyFields,\n };\n }\n}\n\n/**\n * Default registry instance\n */\nexport const translatorRegistry = new TranslatorRegistry();\n","// Types\nexport {\n type FormatCategory,\n type CanonicalSkill,\n type TranslationResult,\n type TranslationOptions,\n type FormatTranslator,\n type TranslationPath,\n type TranslatableSkillFrontmatter,\n AGENT_FORMAT_MAP,\n} from './types.js';\n\n// Format translators\nexport {\n SkillMdTranslator,\n skillMdTranslator,\n CursorTranslator,\n cursorTranslator,\n WindsurfTranslator,\n windsurfTranslator,\n CopilotTranslator,\n copilotTranslator,\n} from './formats/index.js';\n\n// Registry\nexport { TranslatorRegistry, translatorRegistry } from './registry.js';\n\n// Convenience functions\nimport { translatorRegistry } from './registry.js';\nimport type { AgentType } from '../types.js';\nimport type { CanonicalSkill, TranslationResult, TranslationOptions } from './types.js';\n\n/**\n * Translate skill content from one agent format to another\n *\n * @example\n * ```ts\n * import { translateSkill } from '@skillkit/core';\n *\n * const result = translateSkill(skillMdContent, 'cursor');\n * console.log(result.content); // Cursor MDC format\n * ```\n */\nexport function translateSkill(\n content: string,\n targetAgent: AgentType,\n options?: TranslationOptions & { sourceFilename?: string }\n): TranslationResult {\n return translatorRegistry.translateContent(content, targetAgent, options);\n}\n\n/**\n * Translate a skill file to target agent format\n *\n * @example\n * ```ts\n * import { translateSkillFile } from '@skillkit/core';\n *\n * const result = translateSkillFile('./skills/my-skill/SKILL.md', 'cursor');\n * console.log(result.filename); // 'my-skill.mdc'\n * ```\n */\nexport function translateSkillFile(\n sourcePath: string,\n targetAgent: AgentType,\n options?: TranslationOptions\n): TranslationResult {\n return translatorRegistry.translateFile(sourcePath, targetAgent, options);\n}\n\n/**\n * Parse skill content into canonical format\n *\n * @example\n * ```ts\n * import { parseSkillContent } from '@skillkit/core';\n *\n * const skill = parseSkillContent(cursorMdcContent, 'my-rule.mdc');\n * console.log(skill.name); // 'my-rule'\n * ```\n */\nexport function parseSkillContent(content: string, filename?: string): CanonicalSkill | null {\n return translatorRegistry.parse(content, filename);\n}\n\n/**\n * Detect the format of skill content\n *\n * @example\n * ```ts\n * import { detectSkillFormat } from '@skillkit/core';\n *\n * const format = detectSkillFormat(content, 'SKILL.md');\n * console.log(format); // 'skill-md'\n * ```\n */\nexport function detectSkillFormat(content: string, filename?: string): string | null {\n return translatorRegistry.detectFormat(content, filename);\n}\n\n/**\n * Get all supported agent types for translation\n */\nexport function getSupportedTranslationAgents(): AgentType[] {\n return translatorRegistry.getSupportedAgents();\n}\n\n/**\n * Check if translation is possible between two agents\n */\nexport function canTranslate(from: AgentType, to: AgentType): boolean {\n return translatorRegistry.canTranslate(from, to);\n}\n","import { z } from 'zod';\nimport type { AgentType } from '../types.js';\n\n/**\n * Detected dependency with version\n */\nexport const DependencyInfo = z.object({\n name: z.string(),\n version: z.string().optional(),\n dev: z.boolean().default(false),\n});\nexport type DependencyInfo = z.infer<typeof DependencyInfo>;\n\n/**\n * Detection result with confidence\n */\nexport const Detection = z.object({\n name: z.string(),\n version: z.string().optional(),\n confidence: z.number().min(0).max(100).default(100),\n source: z.string().optional(), // Where it was detected from\n});\nexport type Detection = z.infer<typeof Detection>;\n\n/**\n * Project stack detection results\n */\nexport const ProjectStack = z.object({\n languages: z.array(Detection).default([]),\n frameworks: z.array(Detection).default([]),\n libraries: z.array(Detection).default([]),\n styling: z.array(Detection).default([]),\n testing: z.array(Detection).default([]),\n databases: z.array(Detection).default([]),\n tools: z.array(Detection).default([]),\n runtime: z.array(Detection).default([]),\n});\nexport type ProjectStack = z.infer<typeof ProjectStack>;\n\n/**\n * Project patterns and conventions\n */\nexport const ProjectPatterns = z.object({\n components: z.string().optional(), // 'functional', 'class', 'mixed'\n stateManagement: z.string().optional(), // 'redux', 'zustand', 'context', etc.\n apiStyle: z.string().optional(), // 'rest', 'graphql', 'trpc', 'server-actions'\n styling: z.string().optional(), // 'css-modules', 'tailwind', 'styled-components'\n testing: z.string().optional(), // 'jest', 'vitest', 'playwright'\n linting: z.string().optional(), // 'eslint', 'biome'\n formatting: z.string().optional(), // 'prettier', 'biome'\n});\nexport type ProjectPatterns = z.infer<typeof ProjectPatterns>;\n\n/**\n * Skill preferences for the project\n */\nexport const SkillPreferences = z.object({\n installed: z.array(z.string()).default([]),\n recommended: z.array(z.string()).default([]),\n excluded: z.array(z.string()).default([]),\n autoSync: z.boolean().default(true),\n securityLevel: z.enum(['low', 'medium', 'high']).default('medium'),\n testingRequired: z.boolean().default(false),\n});\nexport type SkillPreferences = z.infer<typeof SkillPreferences>;\n\n/**\n * Agent configuration for the project\n */\nexport const AgentConfig = z.object({\n primary: z.string().optional(), // Primary agent\n detected: z.array(z.string()).default([]), // Auto-detected agents\n synced: z.array(z.string()).default([]), // Agents to sync skills to\n disabled: z.array(z.string()).default([]), // Agents to skip\n});\nexport type AgentConfig = z.infer<typeof AgentConfig>;\n\n/**\n * Full project context\n */\nexport const ProjectContext = z.object({\n version: z.literal(1),\n project: z.object({\n name: z.string(),\n description: z.string().optional(),\n type: z.string().optional(), // 'web-app', 'cli', 'library', 'api', etc.\n path: z.string().optional(),\n }),\n stack: ProjectStack,\n patterns: ProjectPatterns.optional(),\n skills: SkillPreferences.optional(),\n agents: AgentConfig.optional(),\n createdAt: z.string().datetime().optional(),\n updatedAt: z.string().datetime().optional(),\n});\nexport type ProjectContext = z.infer<typeof ProjectContext>;\n\n/**\n * Context file location\n */\nexport const CONTEXT_FILE = '.skillkit/context.yaml';\nexport const CONTEXT_DIR = '.skillkit';\n\n/**\n * Detection source types\n */\nexport type DetectionSource =\n | 'package.json'\n | 'tsconfig.json'\n | 'pyproject.toml'\n | 'Cargo.toml'\n | 'go.mod'\n | 'pubspec.yaml'\n | 'folder-structure'\n | 'config-file'\n | 'manual';\n\n/**\n * Project type hints based on detection\n */\nexport const PROJECT_TYPE_HINTS: Record<string, string[]> = {\n 'web-app': ['react', 'vue', 'angular', 'svelte', 'nextjs', 'nuxt', 'remix'],\n 'api': ['express', 'fastify', 'koa', 'hono', 'fastapi', 'flask', 'django'],\n 'cli': ['commander', 'yargs', 'clipanion', 'clap', 'cobra'],\n 'library': ['rollup', 'esbuild', 'tsup', 'unbuild'],\n 'mobile': ['react-native', 'expo', 'flutter', 'ionic'],\n 'desktop': ['electron', 'tauri'],\n};\n\n/**\n * Framework detection patterns\n */\nexport interface FrameworkPattern {\n name: string;\n indicators: {\n dependencies?: string[];\n devDependencies?: string[];\n files?: string[];\n configFiles?: string[];\n };\n category: keyof ProjectStack;\n relatedTags?: string[];\n}\n\n/**\n * Context sync options\n */\nexport interface ContextSyncOptions {\n agents?: AgentType[];\n force?: boolean;\n dryRun?: boolean;\n skillsOnly?: boolean;\n}\n\n/**\n * Context export options\n */\nexport interface ContextExportOptions {\n output?: string;\n format?: 'yaml' | 'json';\n includeSkills?: boolean;\n includeAgents?: boolean;\n}\n\n/**\n * Context import options\n */\nexport interface ContextImportOptions {\n merge?: boolean;\n overwrite?: boolean;\n skipDetection?: boolean;\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport type { ProjectStack, Detection, ProjectPatterns } from './types.js';\n\n/**\n * Framework detection patterns\n */\nconst FRAMEWORK_PATTERNS = {\n // Frontend frameworks\n react: {\n dependencies: ['react', 'react-dom'],\n files: [],\n category: 'frameworks' as const,\n tags: ['react', 'frontend', 'ui'],\n },\n nextjs: {\n dependencies: ['next'],\n files: ['next.config.js', 'next.config.mjs', 'next.config.ts'],\n category: 'frameworks' as const,\n tags: ['nextjs', 'react', 'ssr', 'frontend'],\n },\n vue: {\n dependencies: ['vue'],\n files: [],\n category: 'frameworks' as const,\n tags: ['vue', 'frontend', 'ui'],\n },\n nuxt: {\n dependencies: ['nuxt'],\n files: ['nuxt.config.js', 'nuxt.config.ts'],\n category: 'frameworks' as const,\n tags: ['nuxt', 'vue', 'ssr', 'frontend'],\n },\n angular: {\n dependencies: ['@angular/core'],\n files: ['angular.json'],\n category: 'frameworks' as const,\n tags: ['angular', 'frontend', 'ui'],\n },\n svelte: {\n dependencies: ['svelte'],\n files: ['svelte.config.js'],\n category: 'frameworks' as const,\n tags: ['svelte', 'frontend', 'ui'],\n },\n remix: {\n dependencies: ['@remix-run/react'],\n files: ['remix.config.js'],\n category: 'frameworks' as const,\n tags: ['remix', 'react', 'ssr', 'frontend'],\n },\n astro: {\n dependencies: ['astro'],\n files: ['astro.config.mjs', 'astro.config.ts'],\n category: 'frameworks' as const,\n tags: ['astro', 'static', 'frontend'],\n },\n solid: {\n dependencies: ['solid-js'],\n files: [],\n category: 'frameworks' as const,\n tags: ['solid', 'frontend', 'ui'],\n },\n\n // Backend frameworks\n express: {\n dependencies: ['express'],\n files: [],\n category: 'frameworks' as const,\n tags: ['express', 'nodejs', 'api', 'backend'],\n },\n fastify: {\n dependencies: ['fastify'],\n files: [],\n category: 'frameworks' as const,\n tags: ['fastify', 'nodejs', 'api', 'backend'],\n },\n hono: {\n dependencies: ['hono'],\n files: [],\n category: 'frameworks' as const,\n tags: ['hono', 'edge', 'api', 'backend'],\n },\n koa: {\n dependencies: ['koa'],\n files: [],\n category: 'frameworks' as const,\n tags: ['koa', 'nodejs', 'api', 'backend'],\n },\n nestjs: {\n dependencies: ['@nestjs/core'],\n files: ['nest-cli.json'],\n category: 'frameworks' as const,\n tags: ['nestjs', 'nodejs', 'api', 'backend'],\n },\n\n // Mobile\n 'react-native': {\n dependencies: ['react-native'],\n files: ['metro.config.js', 'app.json'],\n category: 'frameworks' as const,\n tags: ['react-native', 'mobile', 'ios', 'android'],\n },\n expo: {\n dependencies: ['expo'],\n files: ['app.json', 'expo.json'],\n category: 'frameworks' as const,\n tags: ['expo', 'react-native', 'mobile'],\n },\n\n // Desktop\n electron: {\n dependencies: ['electron'],\n files: ['electron.js', 'electron-builder.json'],\n category: 'frameworks' as const,\n tags: ['electron', 'desktop'],\n },\n tauri: {\n dependencies: ['@tauri-apps/api'],\n files: ['tauri.conf.json', 'src-tauri'],\n category: 'frameworks' as const,\n tags: ['tauri', 'desktop', 'rust'],\n },\n};\n\n/**\n * Library detection patterns\n */\nconst LIBRARY_PATTERNS = {\n // State management\n redux: {\n dependencies: ['redux', '@reduxjs/toolkit'],\n category: 'libraries' as const,\n tags: ['redux', 'state-management'],\n },\n zustand: {\n dependencies: ['zustand'],\n category: 'libraries' as const,\n tags: ['zustand', 'state-management'],\n },\n jotai: {\n dependencies: ['jotai'],\n category: 'libraries' as const,\n tags: ['jotai', 'state-management'],\n },\n recoil: {\n dependencies: ['recoil'],\n category: 'libraries' as const,\n tags: ['recoil', 'state-management'],\n },\n mobx: {\n dependencies: ['mobx'],\n category: 'libraries' as const,\n tags: ['mobx', 'state-management'],\n },\n\n // Data fetching\n tanstack: {\n dependencies: ['@tanstack/react-query', '@tanstack/query-core'],\n category: 'libraries' as const,\n tags: ['tanstack', 'data-fetching', 'caching'],\n },\n swr: {\n dependencies: ['swr'],\n category: 'libraries' as const,\n tags: ['swr', 'data-fetching'],\n },\n trpc: {\n dependencies: ['@trpc/client', '@trpc/server'],\n category: 'libraries' as const,\n tags: ['trpc', 'api', 'typescript'],\n },\n graphql: {\n dependencies: ['graphql', '@apollo/client', 'urql'],\n category: 'libraries' as const,\n tags: ['graphql', 'api'],\n },\n\n // UI Components\n 'shadcn-ui': {\n dependencies: ['@radix-ui/react-slot'],\n files: ['components.json'],\n category: 'libraries' as const,\n tags: ['shadcn', 'ui', 'components'],\n },\n 'material-ui': {\n dependencies: ['@mui/material'],\n category: 'libraries' as const,\n tags: ['mui', 'material', 'ui', 'components'],\n },\n 'chakra-ui': {\n dependencies: ['@chakra-ui/react'],\n category: 'libraries' as const,\n tags: ['chakra', 'ui', 'components'],\n },\n 'ant-design': {\n dependencies: ['antd'],\n category: 'libraries' as const,\n tags: ['antd', 'ui', 'components'],\n },\n\n // Form handling\n 'react-hook-form': {\n dependencies: ['react-hook-form'],\n category: 'libraries' as const,\n tags: ['forms', 'validation'],\n },\n formik: {\n dependencies: ['formik'],\n category: 'libraries' as const,\n tags: ['forms', 'validation'],\n },\n zod: {\n dependencies: ['zod'],\n category: 'libraries' as const,\n tags: ['validation', 'schema', 'typescript'],\n },\n\n // Animation\n 'framer-motion': {\n dependencies: ['framer-motion'],\n category: 'libraries' as const,\n tags: ['animation', 'motion'],\n },\n};\n\n/**\n * Styling detection patterns\n */\nconst STYLING_PATTERNS = {\n tailwindcss: {\n dependencies: ['tailwindcss'],\n files: ['tailwind.config.js', 'tailwind.config.ts', 'tailwind.config.cjs'],\n category: 'styling' as const,\n tags: ['tailwind', 'css', 'utility-first'],\n },\n 'styled-components': {\n dependencies: ['styled-components'],\n category: 'styling' as const,\n tags: ['styled-components', 'css-in-js'],\n },\n emotion: {\n dependencies: ['@emotion/react', '@emotion/styled'],\n category: 'styling' as const,\n tags: ['emotion', 'css-in-js'],\n },\n sass: {\n dependencies: ['sass', 'node-sass'],\n category: 'styling' as const,\n tags: ['sass', 'scss', 'css'],\n },\n less: {\n dependencies: ['less'],\n category: 'styling' as const,\n tags: ['less', 'css'],\n },\n 'css-modules': {\n files: ['*.module.css', '*.module.scss'],\n category: 'styling' as const,\n tags: ['css-modules', 'css'],\n },\n};\n\n/**\n * Testing detection patterns\n */\nconst TESTING_PATTERNS = {\n jest: {\n dependencies: ['jest'],\n files: ['jest.config.js', 'jest.config.ts'],\n category: 'testing' as const,\n tags: ['jest', 'testing', 'unit-testing'],\n },\n vitest: {\n dependencies: ['vitest'],\n files: ['vitest.config.ts', 'vitest.config.js'],\n category: 'testing' as const,\n tags: ['vitest', 'testing', 'unit-testing'],\n },\n playwright: {\n dependencies: ['@playwright/test'],\n files: ['playwright.config.ts', 'playwright.config.js'],\n category: 'testing' as const,\n tags: ['playwright', 'e2e', 'testing'],\n },\n cypress: {\n dependencies: ['cypress'],\n files: ['cypress.config.ts', 'cypress.config.js', 'cypress.json'],\n category: 'testing' as const,\n tags: ['cypress', 'e2e', 'testing'],\n },\n mocha: {\n dependencies: ['mocha'],\n category: 'testing' as const,\n tags: ['mocha', 'testing'],\n },\n 'testing-library': {\n dependencies: ['@testing-library/react', '@testing-library/vue'],\n category: 'testing' as const,\n tags: ['testing-library', 'testing'],\n },\n};\n\n/**\n * Database detection patterns\n */\nconst DATABASE_PATTERNS = {\n prisma: {\n dependencies: ['@prisma/client', 'prisma'],\n files: ['prisma/schema.prisma'],\n category: 'databases' as const,\n tags: ['prisma', 'orm', 'database'],\n },\n drizzle: {\n dependencies: ['drizzle-orm'],\n files: ['drizzle.config.ts'],\n category: 'databases' as const,\n tags: ['drizzle', 'orm', 'database'],\n },\n typeorm: {\n dependencies: ['typeorm'],\n category: 'databases' as const,\n tags: ['typeorm', 'orm', 'database'],\n },\n mongoose: {\n dependencies: ['mongoose'],\n category: 'databases' as const,\n tags: ['mongoose', 'mongodb', 'database'],\n },\n supabase: {\n dependencies: ['@supabase/supabase-js'],\n category: 'databases' as const,\n tags: ['supabase', 'postgres', 'database', 'auth'],\n },\n firebase: {\n dependencies: ['firebase', 'firebase-admin'],\n category: 'databases' as const,\n tags: ['firebase', 'database', 'auth'],\n },\n};\n\n/**\n * Tool detection patterns\n */\nconst TOOL_PATTERNS = {\n eslint: {\n dependencies: ['eslint'],\n files: ['.eslintrc', '.eslintrc.js', '.eslintrc.json', 'eslint.config.js'],\n category: 'tools' as const,\n tags: ['eslint', 'linting'],\n },\n prettier: {\n dependencies: ['prettier'],\n files: ['.prettierrc', '.prettierrc.js', 'prettier.config.js'],\n category: 'tools' as const,\n tags: ['prettier', 'formatting'],\n },\n biome: {\n dependencies: ['@biomejs/biome'],\n files: ['biome.json'],\n category: 'tools' as const,\n tags: ['biome', 'linting', 'formatting'],\n },\n husky: {\n dependencies: ['husky'],\n files: ['.husky'],\n category: 'tools' as const,\n tags: ['husky', 'git-hooks'],\n },\n 'lint-staged': {\n dependencies: ['lint-staged'],\n category: 'tools' as const,\n tags: ['lint-staged', 'git-hooks'],\n },\n turbo: {\n dependencies: ['turbo'],\n files: ['turbo.json'],\n category: 'tools' as const,\n tags: ['turbo', 'monorepo', 'build'],\n },\n nx: {\n dependencies: ['nx'],\n files: ['nx.json'],\n category: 'tools' as const,\n tags: ['nx', 'monorepo', 'build'],\n },\n docker: {\n files: ['Dockerfile', 'docker-compose.yml', 'docker-compose.yaml'],\n category: 'tools' as const,\n tags: ['docker', 'containers'],\n },\n};\n\n/**\n * Project Detector\n *\n * Analyzes a project directory to detect the technology stack,\n * frameworks, libraries, and patterns used.\n */\nexport class ProjectDetector {\n private projectPath: string;\n private packageJson: Record<string, unknown> | null = null;\n private files: Set<string> = new Set();\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n }\n\n /**\n * Analyze the project and return detected stack\n */\n analyze(): ProjectStack {\n // Load package.json if exists\n this.loadPackageJson();\n\n // Scan root files\n this.scanFiles();\n\n // Detect everything\n const stack: ProjectStack = {\n languages: this.detectLanguages(),\n frameworks: this.detectFromPatterns(FRAMEWORK_PATTERNS),\n libraries: this.detectFromPatterns(LIBRARY_PATTERNS),\n styling: this.detectFromPatterns(STYLING_PATTERNS),\n testing: this.detectFromPatterns(TESTING_PATTERNS),\n databases: this.detectFromPatterns(DATABASE_PATTERNS),\n tools: this.detectFromPatterns(TOOL_PATTERNS),\n runtime: this.detectRuntime(),\n };\n\n return stack;\n }\n\n /**\n * Detect project patterns and conventions\n */\n detectPatterns(): ProjectPatterns {\n const patterns: ProjectPatterns = {};\n\n // Detect component style\n if (this.hasFile('*.tsx') || this.hasFile('*.jsx')) {\n // Check for class components vs functional\n patterns.components = 'functional'; // Modern default\n }\n\n // Detect state management\n const deps = this.getDependencies();\n if (deps.has('zustand')) patterns.stateManagement = 'zustand';\n else if (deps.has('@reduxjs/toolkit') || deps.has('redux')) patterns.stateManagement = 'redux';\n else if (deps.has('jotai')) patterns.stateManagement = 'jotai';\n else if (deps.has('recoil')) patterns.stateManagement = 'recoil';\n else if (deps.has('mobx')) patterns.stateManagement = 'mobx';\n\n // Detect API style\n if (deps.has('@trpc/client')) patterns.apiStyle = 'trpc';\n else if (deps.has('graphql') || deps.has('@apollo/client')) patterns.apiStyle = 'graphql';\n else if (deps.has('next') && this.hasFile('app/**/actions.ts')) patterns.apiStyle = 'server-actions';\n else patterns.apiStyle = 'rest';\n\n // Detect styling\n if (deps.has('tailwindcss')) patterns.styling = 'tailwind';\n else if (deps.has('styled-components')) patterns.styling = 'styled-components';\n else if (deps.has('@emotion/react')) patterns.styling = 'emotion';\n else if (this.hasFile('*.module.css')) patterns.styling = 'css-modules';\n\n // Detect testing\n if (deps.has('vitest')) patterns.testing = 'vitest';\n else if (deps.has('jest')) patterns.testing = 'jest';\n else if (deps.has('@playwright/test')) patterns.testing = 'playwright';\n else if (deps.has('cypress')) patterns.testing = 'cypress';\n\n // Detect linting\n if (deps.has('@biomejs/biome')) patterns.linting = 'biome';\n else if (deps.has('eslint')) patterns.linting = 'eslint';\n\n // Detect formatting\n if (deps.has('@biomejs/biome')) patterns.formatting = 'biome';\n else if (deps.has('prettier')) patterns.formatting = 'prettier';\n\n return patterns;\n }\n\n /**\n * Detect project type\n */\n detectProjectType(): string {\n const deps = this.getDependencies();\n\n // Check for specific project types\n if (deps.has('react-native') || deps.has('expo')) return 'mobile';\n if (deps.has('electron') || deps.has('@tauri-apps/api')) return 'desktop';\n if (deps.has('next') || deps.has('nuxt') || deps.has('remix')) return 'web-app';\n if (deps.has('express') || deps.has('fastify') || deps.has('hono')) return 'api';\n if (deps.has('commander') || deps.has('clipanion') || deps.has('yargs')) return 'cli';\n\n // Check for library indicators\n if (this.hasFile('rollup.config.js') || this.hasFile('tsup.config.ts')) return 'library';\n\n // Default\n if (deps.has('react') || deps.has('vue') || deps.has('svelte')) return 'web-app';\n\n return 'unknown';\n }\n\n /**\n * Get project name\n */\n getProjectName(): string {\n if (this.packageJson && typeof this.packageJson.name === 'string') {\n return this.packageJson.name;\n }\n return basename(this.projectPath);\n }\n\n /**\n * Get project description\n */\n getProjectDescription(): string | undefined {\n if (this.packageJson && typeof this.packageJson.description === 'string') {\n return this.packageJson.description;\n }\n return undefined;\n }\n\n // Private helpers\n\n private loadPackageJson(): void {\n const packageJsonPath = join(this.projectPath, 'package.json');\n if (existsSync(packageJsonPath)) {\n try {\n const content = readFileSync(packageJsonPath, 'utf-8');\n this.packageJson = JSON.parse(content);\n } catch {\n this.packageJson = null;\n }\n }\n }\n\n private scanFiles(): void {\n try {\n const entries = readdirSync(this.projectPath, { withFileTypes: true });\n for (const entry of entries) {\n this.files.add(entry.name);\n if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {\n // Scan one level deep for common config locations\n try {\n const subEntries = readdirSync(join(this.projectPath, entry.name));\n for (const subEntry of subEntries) {\n this.files.add(`${entry.name}/${subEntry}`);\n }\n } catch {\n // Ignore permission errors\n }\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n private getDependencies(): Set<string> {\n const deps = new Set<string>();\n if (!this.packageJson) return deps;\n\n const dependencies = this.packageJson.dependencies as Record<string, string> | undefined;\n const devDependencies = this.packageJson.devDependencies as Record<string, string> | undefined;\n\n if (dependencies) {\n for (const dep of Object.keys(dependencies)) {\n deps.add(dep);\n }\n }\n if (devDependencies) {\n for (const dep of Object.keys(devDependencies)) {\n deps.add(dep);\n }\n }\n\n return deps;\n }\n\n private getVersion(depName: string): string | undefined {\n if (!this.packageJson) return undefined;\n\n const dependencies = this.packageJson.dependencies as Record<string, string> | undefined;\n const devDependencies = this.packageJson.devDependencies as Record<string, string> | undefined;\n\n const version = dependencies?.[depName] || devDependencies?.[depName];\n if (version) {\n // Clean version string (remove ^, ~, etc.)\n return version.replace(/^[\\^~>=<]+/, '');\n }\n return undefined;\n }\n\n private hasFile(pattern: string): boolean {\n if (pattern.includes('*')) {\n // Simple glob matching\n const regex = new RegExp(pattern.replace(/\\*/g, '.*'));\n for (const file of this.files) {\n if (regex.test(file)) return true;\n }\n return false;\n }\n return this.files.has(pattern);\n }\n\n private detectLanguages(): Detection[] {\n const languages: Detection[] = [];\n\n // TypeScript\n if (this.hasFile('tsconfig.json') || this.files.has('*.ts')) {\n const tsVersion = this.getVersion('typescript');\n languages.push({\n name: 'typescript',\n version: tsVersion,\n confidence: 100,\n source: 'tsconfig.json',\n });\n }\n\n // JavaScript (if no TypeScript, or alongside)\n if (this.hasFile('jsconfig.json') || (this.packageJson && !this.hasFile('tsconfig.json'))) {\n languages.push({\n name: 'javascript',\n confidence: 90,\n source: 'package.json',\n });\n }\n\n // Python\n if (this.hasFile('pyproject.toml') || this.hasFile('requirements.txt')) {\n languages.push({\n name: 'python',\n confidence: 100,\n source: 'pyproject.toml',\n });\n }\n\n // Rust\n if (this.hasFile('Cargo.toml')) {\n languages.push({\n name: 'rust',\n confidence: 100,\n source: 'Cargo.toml',\n });\n }\n\n // Go\n if (this.hasFile('go.mod')) {\n languages.push({\n name: 'go',\n confidence: 100,\n source: 'go.mod',\n });\n }\n\n return languages;\n }\n\n private detectRuntime(): Detection[] {\n const runtime: Detection[] = [];\n\n // Node.js\n if (this.packageJson) {\n const engines = this.packageJson.engines as Record<string, string> | undefined;\n const nodeVersion = engines?.node;\n runtime.push({\n name: 'nodejs',\n version: nodeVersion?.replace(/[>=<^~]+/g, ''),\n confidence: 100,\n source: 'package.json',\n });\n }\n\n // Bun\n if (this.hasFile('bun.lockb') || this.hasFile('bunfig.toml')) {\n runtime.push({\n name: 'bun',\n confidence: 100,\n source: 'bun.lockb',\n });\n }\n\n // Deno\n if (this.hasFile('deno.json') || this.hasFile('deno.jsonc')) {\n runtime.push({\n name: 'deno',\n confidence: 100,\n source: 'deno.json',\n });\n }\n\n return runtime;\n }\n\n private detectFromPatterns(\n patterns: Record<string, { dependencies?: string[]; files?: string[]; category: keyof ProjectStack; tags?: string[] }>\n ): Detection[] {\n const detected: Detection[] = [];\n const deps = this.getDependencies();\n\n for (const [name, pattern] of Object.entries(patterns)) {\n let found = false;\n let source: string | undefined;\n\n // Check dependencies\n if (pattern.dependencies) {\n for (const dep of pattern.dependencies) {\n if (deps.has(dep)) {\n found = true;\n source = 'package.json';\n break;\n }\n }\n }\n\n // Check files\n if (!found && pattern.files) {\n for (const file of pattern.files) {\n if (this.hasFile(file)) {\n found = true;\n source = file;\n break;\n }\n }\n }\n\n if (found) {\n const version = pattern.dependencies ? this.getVersion(pattern.dependencies[0]) : undefined;\n detected.push({\n name,\n version,\n confidence: 100,\n source,\n });\n }\n }\n\n return detected;\n }\n}\n\n/**\n * Analyze a project and return the detected stack\n */\nexport function analyzeProject(projectPath: string): ProjectStack {\n const detector = new ProjectDetector(projectPath);\n return detector.analyze();\n}\n\n/**\n * Get all relevant tags from a project stack\n */\nexport function getStackTags(stack: ProjectStack): string[] {\n const tags = new Set<string>();\n\n const addTags = (detections: Detection[], patterns: Record<string, { tags?: string[] }>) => {\n for (const detection of detections) {\n const pattern = patterns[detection.name];\n if (pattern?.tags) {\n for (const tag of pattern.tags) {\n tags.add(tag);\n }\n } else {\n tags.add(detection.name);\n }\n }\n };\n\n // Add language tags\n for (const lang of stack.languages) {\n tags.add(lang.name);\n }\n\n // Add framework tags\n addTags(stack.frameworks, FRAMEWORK_PATTERNS);\n addTags(stack.libraries, LIBRARY_PATTERNS);\n addTags(stack.styling, STYLING_PATTERNS);\n addTags(stack.testing, TESTING_PATTERNS);\n addTags(stack.databases, DATABASE_PATTERNS);\n\n return Array.from(tags);\n}\n","import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport {\n type ProjectContext,\n type ProjectStack,\n type SkillPreferences,\n type AgentConfig,\n type ContextExportOptions,\n type ContextImportOptions,\n type Detection,\n ProjectContext as ProjectContextSchema,\n CONTEXT_FILE,\n CONTEXT_DIR,\n} from './types.js';\nimport { ProjectDetector, getStackTags } from './detector.js';\nimport type { AgentType } from '../types.js';\n\n/**\n * Context Manager\n *\n * Handles loading, saving, and managing project contexts.\n * The context is stored in .skillkit/context.yaml\n */\nexport class ContextManager {\n private projectPath: string;\n private context: ProjectContext | null = null;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n }\n\n /**\n * Get the context file path\n */\n getContextPath(): string {\n return join(this.projectPath, CONTEXT_FILE);\n }\n\n /**\n * Check if context exists\n */\n exists(): boolean {\n return existsSync(this.getContextPath());\n }\n\n /**\n * Load context from file\n */\n load(): ProjectContext | null {\n const contextPath = this.getContextPath();\n\n if (!existsSync(contextPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(contextPath, 'utf-8');\n const data = parseYaml(content);\n const parsed = ProjectContextSchema.safeParse(data);\n\n if (parsed.success) {\n this.context = parsed.data;\n return this.context;\n }\n\n // Return raw data if schema validation fails but file exists\n console.warn('Context file exists but failed schema validation');\n return null;\n } catch (error) {\n console.warn('Failed to load context:', error);\n return null;\n }\n }\n\n /**\n * Save context to file\n */\n save(context: ProjectContext): void {\n const contextPath = this.getContextPath();\n const contextDir = join(this.projectPath, CONTEXT_DIR);\n\n // Ensure directory exists\n if (!existsSync(contextDir)) {\n mkdirSync(contextDir, { recursive: true });\n }\n\n // Update timestamp\n context.updatedAt = new Date().toISOString();\n\n // Stringify with nice formatting\n const content = stringifyYaml(context, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n });\n\n writeFileSync(contextPath, content, 'utf-8');\n this.context = context;\n }\n\n /**\n * Initialize a new context from project detection\n */\n init(options: { force?: boolean; skipDetection?: boolean } = {}): ProjectContext {\n // Check if context already exists\n if (this.exists() && !options.force) {\n const existing = this.load();\n if (existing) {\n return existing;\n }\n }\n\n // Detect project\n const detector = new ProjectDetector(this.projectPath);\n const stack = options.skipDetection ? this.getEmptyStack() : detector.analyze();\n const patterns = options.skipDetection ? {} : detector.detectPatterns();\n const projectType = options.skipDetection ? 'unknown' : detector.detectProjectType();\n const projectName = detector.getProjectName();\n const projectDescription = detector.getProjectDescription();\n\n // Create new context\n const context: ProjectContext = {\n version: 1,\n project: {\n name: projectName,\n description: projectDescription,\n type: projectType,\n path: this.projectPath,\n },\n stack,\n patterns,\n skills: {\n installed: [],\n recommended: [],\n excluded: [],\n autoSync: true,\n securityLevel: 'medium',\n testingRequired: false,\n },\n agents: {\n primary: undefined,\n detected: [],\n synced: [],\n disabled: [],\n },\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n // Save and return\n this.save(context);\n return context;\n }\n\n /**\n * Update context with new detection\n */\n refresh(): ProjectContext {\n const existing = this.load();\n const detector = new ProjectDetector(this.projectPath);\n const stack = detector.analyze();\n const patterns = detector.detectPatterns();\n const projectType = detector.detectProjectType();\n\n if (existing) {\n // Merge with existing\n const merged: ProjectContext = {\n ...existing,\n stack,\n patterns,\n project: {\n ...existing.project,\n type: projectType,\n },\n updatedAt: new Date().toISOString(),\n };\n\n this.save(merged);\n return merged;\n }\n\n // No existing context, initialize new\n return this.init();\n }\n\n /**\n * Get current context (load if not loaded)\n */\n get(): ProjectContext | null {\n if (this.context) {\n return this.context;\n }\n return this.load();\n }\n\n /**\n * Update skills in context\n */\n updateSkills(skills: Partial<SkillPreferences>): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found. Run `skillkit context init` first.');\n }\n\n context.skills = {\n ...context.skills,\n ...skills,\n } as SkillPreferences;\n\n this.save(context);\n }\n\n /**\n * Update agents in context\n */\n updateAgents(agents: Partial<AgentConfig>): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found. Run `skillkit context init` first.');\n }\n\n context.agents = {\n ...context.agents,\n ...agents,\n } as AgentConfig;\n\n this.save(context);\n }\n\n /**\n * Set primary agent\n */\n setPrimaryAgent(agent: AgentType): void {\n this.updateAgents({ primary: agent });\n }\n\n /**\n * Add agent to synced list\n */\n addSyncedAgent(agent: AgentType): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found');\n }\n\n const synced = new Set(context.agents?.synced || []);\n synced.add(agent);\n\n this.updateAgents({ synced: Array.from(synced) });\n }\n\n /**\n * Remove agent from synced list\n */\n removeSyncedAgent(agent: AgentType): void {\n const context = this.get();\n if (!context) {\n throw new Error('No context found');\n }\n\n const synced = new Set(context.agents?.synced || []);\n synced.delete(agent);\n\n this.updateAgents({ synced: Array.from(synced) });\n }\n\n /**\n * Add installed skill\n */\n addInstalledSkill(skillName: string): void {\n const context = this.get();\n if (!context) return;\n\n const installed = new Set(context.skills?.installed || []);\n installed.add(skillName);\n\n this.updateSkills({ installed: Array.from(installed) });\n }\n\n /**\n * Remove installed skill\n */\n removeInstalledSkill(skillName: string): void {\n const context = this.get();\n if (!context) return;\n\n const installed = new Set(context.skills?.installed || []);\n installed.delete(skillName);\n\n this.updateSkills({ installed: Array.from(installed) });\n }\n\n /**\n * Export context to file\n */\n export(options: ContextExportOptions = {}): string {\n const context = this.get();\n if (!context) {\n throw new Error('No context found');\n }\n\n // Clone and optionally filter\n const exported = { ...context };\n\n if (!options.includeSkills) {\n delete (exported as Record<string, unknown>).skills;\n }\n if (!options.includeAgents) {\n delete (exported as Record<string, unknown>).agents;\n }\n\n // Format\n if (options.format === 'json') {\n return JSON.stringify(exported, null, 2);\n }\n\n return stringifyYaml(exported, {\n lineWidth: 0,\n defaultKeyType: 'PLAIN',\n });\n }\n\n /**\n * Import context from content\n */\n import(content: string, options: ContextImportOptions = {}): ProjectContext {\n // Parse content\n let data: unknown;\n try {\n // Try JSON first\n data = JSON.parse(content);\n } catch {\n // Try YAML\n data = parseYaml(content);\n }\n\n const parsed = ProjectContextSchema.safeParse(data);\n if (!parsed.success) {\n throw new Error(`Invalid context format: ${parsed.error.message}`);\n }\n\n const imported = parsed.data;\n\n if (options.merge && this.exists()) {\n const existing = this.load()!;\n const merged = this.mergeContexts(existing, imported);\n this.save(merged);\n return merged;\n }\n\n if (!options.overwrite && this.exists()) {\n throw new Error('Context already exists. Use --merge or --overwrite.');\n }\n\n this.save(imported);\n return imported;\n }\n\n /**\n * Merge two contexts\n */\n private mergeContexts(existing: ProjectContext, imported: ProjectContext): ProjectContext {\n return {\n version: 1,\n project: {\n ...existing.project,\n ...imported.project,\n },\n stack: this.mergeStacks(existing.stack, imported.stack),\n patterns: {\n ...existing.patterns,\n ...imported.patterns,\n },\n skills: {\n installed: [...new Set([...(existing.skills?.installed || []), ...(imported.skills?.installed || [])])],\n recommended: [...new Set([...(existing.skills?.recommended || []), ...(imported.skills?.recommended || [])])],\n excluded: [...new Set([...(existing.skills?.excluded || []), ...(imported.skills?.excluded || [])])],\n autoSync: imported.skills?.autoSync ?? existing.skills?.autoSync ?? true,\n securityLevel: imported.skills?.securityLevel ?? existing.skills?.securityLevel ?? 'medium',\n testingRequired: imported.skills?.testingRequired ?? existing.skills?.testingRequired ?? false,\n },\n agents: {\n primary: imported.agents?.primary ?? existing.agents?.primary,\n detected: [...new Set([...(existing.agents?.detected || []), ...(imported.agents?.detected || [])])],\n synced: [...new Set([...(existing.agents?.synced || []), ...(imported.agents?.synced || [])])],\n disabled: [...new Set([...(existing.agents?.disabled || []), ...(imported.agents?.disabled || [])])],\n },\n createdAt: existing.createdAt,\n updatedAt: new Date().toISOString(),\n };\n }\n\n /**\n * Merge two stacks\n */\n private mergeStacks(existing: ProjectStack, imported: ProjectStack): ProjectStack {\n const mergeArrays = (a: Detection[], b: Detection[]): Detection[] => {\n const names = new Set(a.map((item) => item.name));\n const result: Detection[] = [...a];\n for (const item of b) {\n if (!names.has(item.name)) {\n result.push(item);\n }\n }\n return result;\n };\n\n return {\n languages: mergeArrays(existing.languages, imported.languages),\n frameworks: mergeArrays(existing.frameworks, imported.frameworks),\n libraries: mergeArrays(existing.libraries, imported.libraries),\n styling: mergeArrays(existing.styling, imported.styling),\n testing: mergeArrays(existing.testing, imported.testing),\n databases: mergeArrays(existing.databases, imported.databases),\n tools: mergeArrays(existing.tools, imported.tools),\n runtime: mergeArrays(existing.runtime, imported.runtime),\n };\n }\n\n /**\n * Get empty stack\n */\n private getEmptyStack(): ProjectStack {\n return {\n languages: [],\n frameworks: [],\n libraries: [],\n styling: [],\n testing: [],\n databases: [],\n tools: [],\n runtime: [],\n };\n }\n\n /**\n * Get recommended skill tags based on stack\n */\n getRecommendedTags(): string[] {\n const context = this.get();\n if (!context) return [];\n\n return getStackTags(context.stack);\n }\n}\n\n/**\n * Create a context manager for the current directory\n */\nexport function createContextManager(projectPath?: string): ContextManager {\n return new ContextManager(projectPath);\n}\n\n/**\n * Load context from the current directory\n */\nexport function loadContext(projectPath?: string): ProjectContext | null {\n const manager = new ContextManager(projectPath);\n return manager.load();\n}\n\n/**\n * Initialize context in the current directory\n */\nexport function initContext(projectPath?: string, options?: { force?: boolean }): ProjectContext {\n const manager = new ContextManager(projectPath);\n return manager.init(options);\n}\n","import { existsSync, writeFileSync, mkdirSync, copyFileSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { AgentType } from '../types.js';\nimport type { ContextSyncOptions } from './types.js';\nimport { ContextManager } from './manager.js';\nimport { translateSkillFile } from '../translator/index.js';\nimport { findAllSkills } from '../skills.js';\n\n/**\n * Result of a sync operation\n */\nexport interface SyncResult {\n success: boolean;\n agent: AgentType;\n skillsSynced: number;\n skillsSkipped: number;\n errors: string[];\n warnings: string[];\n files: string[];\n}\n\n/**\n * Overall sync report\n */\nexport interface SyncReport {\n totalAgents: number;\n successfulAgents: number;\n totalSkills: number;\n results: SyncResult[];\n}\n\n/**\n * Agent directory configuration\n */\nconst AGENT_DIRS: Record<AgentType, { skillsDir: string; configFile: string }> = {\n 'claude-code': { skillsDir: '.claude/skills', configFile: 'AGENTS.md' },\n 'cursor': { skillsDir: '.cursor/skills', configFile: '.cursorrules' },\n 'codex': { skillsDir: '.codex/skills', configFile: 'AGENTS.md' },\n 'gemini-cli': { skillsDir: '.gemini/skills', configFile: 'GEMINI.md' },\n 'opencode': { skillsDir: '.opencode/skills', configFile: 'AGENTS.md' },\n 'antigravity': { skillsDir: '.antigravity/skills', configFile: 'AGENTS.md' },\n 'amp': { skillsDir: '.agents/skills', configFile: 'AGENTS.md' },\n 'clawdbot': { skillsDir: 'skills', configFile: 'AGENTS.md' },\n 'droid': { skillsDir: '.factory/skills', configFile: 'AGENTS.md' },\n 'github-copilot': { skillsDir: '.github/skills', configFile: 'AGENTS.md' },\n 'goose': { skillsDir: '.goose/skills', configFile: 'AGENTS.md' },\n 'kilo': { skillsDir: '.kilocode/skills', configFile: 'AGENTS.md' },\n 'kiro-cli': { skillsDir: '.kiro/skills', configFile: 'AGENTS.md' },\n 'roo': { skillsDir: '.roo/skills', configFile: 'AGENTS.md' },\n 'trae': { skillsDir: '.trae/skills', configFile: 'AGENTS.md' },\n 'windsurf': { skillsDir: '.windsurf/skills', configFile: 'AGENTS.md' },\n 'universal': { skillsDir: '.agent/skills', configFile: 'AGENTS.md' },\n};\n\n/**\n * Context Sync\n *\n * Handles syncing skills across multiple AI agents.\n * Skills are translated to the appropriate format for each agent.\n */\nexport class ContextSync {\n private projectPath: string;\n private contextManager: ContextManager;\n\n constructor(projectPath: string = process.cwd()) {\n this.projectPath = projectPath;\n this.contextManager = new ContextManager(projectPath);\n }\n\n /**\n * Detect which agents are installed/configured on the system\n */\n detectAgents(): AgentType[] {\n const detected: AgentType[] = [];\n\n for (const [agent, config] of Object.entries(AGENT_DIRS)) {\n const skillsPath = join(this.projectPath, config.skillsDir);\n const configPath = join(this.projectPath, config.configFile);\n\n // Check if either skills directory or config file exists\n if (existsSync(skillsPath) || existsSync(configPath)) {\n detected.push(agent as AgentType);\n }\n }\n\n // Also check for global indicators\n const homeDir = process.env.HOME || process.env.USERPROFILE || '';\n if (homeDir) {\n // Check for Claude Code\n if (existsSync(join(homeDir, '.claude'))) {\n if (!detected.includes('claude-code')) detected.push('claude-code');\n }\n // Check for Cursor\n if (existsSync(join(homeDir, '.cursor'))) {\n if (!detected.includes('cursor')) detected.push('cursor');\n }\n }\n\n return detected;\n }\n\n /**\n * Get agents to sync to based on context\n */\n getTargetAgents(options: ContextSyncOptions = {}): AgentType[] {\n // If specific agents provided, use those\n if (options.agents?.length) {\n return options.agents;\n }\n\n // Load context\n const context = this.contextManager.get();\n if (context?.agents?.synced?.length) {\n return context.agents.synced as AgentType[];\n }\n\n // Auto-detect\n return this.detectAgents();\n }\n\n /**\n * Sync all skills to all target agents\n */\n async syncAll(options: ContextSyncOptions = {}): Promise<SyncReport> {\n const targetAgents = this.getTargetAgents(options);\n const results: SyncResult[] = [];\n\n // Get all installed skills from primary agent or first available\n const skills = this.getSourceSkills();\n\n for (const agent of targetAgents) {\n const result = await this.syncToAgent(agent, skills, options);\n results.push(result);\n }\n\n // Update context with synced agents\n if (!options.dryRun) {\n this.contextManager.updateAgents({\n detected: this.detectAgents(),\n synced: targetAgents,\n });\n }\n\n return {\n totalAgents: targetAgents.length,\n successfulAgents: results.filter((r) => r.success).length,\n totalSkills: skills.length,\n results,\n };\n }\n\n /**\n * Sync skills to a specific agent\n */\n async syncToAgent(\n agent: AgentType,\n skills?: Array<{ name: string; path: string }>,\n options: ContextSyncOptions = {}\n ): Promise<SyncResult> {\n const result: SyncResult = {\n success: true,\n agent,\n skillsSynced: 0,\n skillsSkipped: 0,\n errors: [],\n warnings: [],\n files: [],\n };\n\n // Get skills if not provided\n const sourceSkills = skills || this.getSourceSkills();\n\n // Get target directory\n const agentConfig = AGENT_DIRS[agent];\n if (!agentConfig) {\n result.success = false;\n result.errors.push(`Unknown agent: ${agent}`);\n return result;\n }\n\n const targetDir = join(this.projectPath, agentConfig.skillsDir);\n\n // Create target directory if not dry run\n if (!options.dryRun && !existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true });\n }\n\n // Sync each skill\n for (const skill of sourceSkills) {\n try {\n const skillResult = await this.syncSkill(skill, agent, targetDir, options);\n if (skillResult.synced) {\n result.skillsSynced++;\n result.files.push(skillResult.file!);\n } else {\n result.skillsSkipped++;\n if (skillResult.warning) {\n result.warnings.push(skillResult.warning);\n }\n }\n } catch (error) {\n result.errors.push(`Failed to sync ${skill.name}: ${error}`);\n result.skillsSkipped++;\n }\n }\n\n if (result.errors.length > 0) {\n result.success = false;\n }\n\n return result;\n }\n\n /**\n * Sync a single skill to an agent\n */\n private async syncSkill(\n skill: { name: string; path: string },\n agent: AgentType,\n targetDir: string,\n options: ContextSyncOptions\n ): Promise<{ synced: boolean; file?: string; warning?: string }> {\n const skillMdPath = join(skill.path, 'SKILL.md');\n\n if (!existsSync(skillMdPath)) {\n return { synced: false, warning: `No SKILL.md found for ${skill.name}` };\n }\n\n // Translate skill to target format\n const translation = translateSkillFile(skillMdPath, agent, {\n addMetadata: true,\n });\n\n if (!translation.success) {\n return { synced: false, warning: `Translation failed for ${skill.name}` };\n }\n\n // Determine output path\n const targetSkillDir = join(targetDir, skill.name);\n const outputPath = join(targetSkillDir, translation.filename);\n\n // Check if file exists and skip if not forcing\n if (existsSync(outputPath) && !options.force) {\n return { synced: false, warning: `${skill.name} already exists (use --force to overwrite)` };\n }\n\n // Write file (unless dry run)\n if (!options.dryRun) {\n if (!existsSync(targetSkillDir)) {\n mkdirSync(targetSkillDir, { recursive: true });\n }\n writeFileSync(outputPath, translation.content, 'utf-8');\n\n // Copy additional skill assets if they exist\n await this.copySkillAssets(skill.path, targetSkillDir);\n }\n\n return { synced: true, file: outputPath };\n }\n\n /**\n * Copy additional skill assets (references, scripts, etc.)\n */\n private async copySkillAssets(sourcePath: string, targetPath: string): Promise<void> {\n const assetDirs = ['references', 'scripts', 'assets', 'templates'];\n\n for (const assetDir of assetDirs) {\n const sourceAssetDir = join(sourcePath, assetDir);\n if (existsSync(sourceAssetDir)) {\n const targetAssetDir = join(targetPath, assetDir);\n if (!existsSync(targetAssetDir)) {\n mkdirSync(targetAssetDir, { recursive: true });\n }\n\n // Copy files\n try {\n const files = readdirSync(sourceAssetDir);\n for (const file of files) {\n const sourcefile = join(sourceAssetDir, file);\n const targetFile = join(targetAssetDir, file);\n copyFileSync(sourcefile, targetFile);\n }\n } catch {\n // Ignore copy errors\n }\n }\n }\n }\n\n /**\n * Get source skills to sync\n */\n private getSourceSkills(): Array<{ name: string; path: string }> {\n const context = this.contextManager.get();\n const primaryAgent = context?.agents?.primary as AgentType | undefined;\n\n // Search directories based on primary agent or common locations\n const searchDirs: string[] = [];\n\n if (primaryAgent && AGENT_DIRS[primaryAgent]) {\n searchDirs.push(join(this.projectPath, AGENT_DIRS[primaryAgent].skillsDir));\n }\n\n // Add common skill locations\n const commonDirs = [\n '.claude/skills',\n '.cursor/skills',\n '.agent/skills',\n 'skills',\n ];\n\n for (const dir of commonDirs) {\n const fullPath = join(this.projectPath, dir);\n if (!searchDirs.includes(fullPath) && existsSync(fullPath)) {\n searchDirs.push(fullPath);\n }\n }\n\n // Find all skills\n const skills = findAllSkills(searchDirs);\n return skills.map((s) => ({ name: s.name, path: s.path }));\n }\n\n /**\n * Check sync status - which agents have which skills\n */\n checkStatus(): Record<AgentType, { hasSkills: boolean; skillCount: number; skills: string[] }> {\n const status: Record<string, { hasSkills: boolean; skillCount: number; skills: string[] }> = {};\n\n for (const [agent, config] of Object.entries(AGENT_DIRS)) {\n const skillsPath = join(this.projectPath, config.skillsDir);\n const skills: string[] = [];\n\n if (existsSync(skillsPath)) {\n try {\n const entries = readdirSync(skillsPath, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n skills.push(entry.name);\n }\n }\n } catch {\n // Ignore errors\n }\n }\n\n status[agent] = {\n hasSkills: skills.length > 0,\n skillCount: skills.length,\n skills,\n };\n }\n\n return status as Record<AgentType, { hasSkills: boolean; skillCount: number; skills: string[] }>;\n }\n}\n\n/**\n * Create a context sync instance\n */\nexport function createContextSync(projectPath?: string): ContextSync {\n return new ContextSync(projectPath);\n}\n\n/**\n * Sync skills to all detected agents\n */\nexport async function syncToAllAgents(\n projectPath?: string,\n options?: ContextSyncOptions\n): Promise<SyncReport> {\n const sync = new ContextSync(projectPath);\n return sync.syncAll(options);\n}\n\n/**\n * Sync skills to a specific agent\n */\nexport async function syncToAgent(\n agent: AgentType,\n projectPath?: string,\n options?: ContextSyncOptions\n): Promise<SyncResult> {\n const sync = new ContextSync(projectPath);\n return sync.syncToAgent(agent, undefined, options);\n}\n","import { z } from 'zod';\nimport type { ProjectStack } from '../context/types.js';\n\n/**\n * Skill summary for recommendation matching\n */\nexport const SkillSummary = z.object({\n name: z.string(),\n description: z.string().optional(),\n source: z.string().optional(), // Repository source\n tags: z.array(z.string()).default([]),\n compatibility: z\n .object({\n frameworks: z.array(z.string()).default([]),\n languages: z.array(z.string()).default([]),\n libraries: z.array(z.string()).default([]),\n minVersion: z.record(z.string()).optional(), // { \"react\": \"18.0.0\" }\n })\n .optional(),\n popularity: z.number().default(0), // Downloads/stars\n quality: z.number().min(0).max(100).default(50), // Quality score\n lastUpdated: z.string().datetime().optional(),\n verified: z.boolean().default(false),\n});\nexport type SkillSummary = z.infer<typeof SkillSummary>;\n\n/**\n * Scored skill with match explanation\n */\nexport interface ScoredSkill {\n skill: SkillSummary;\n score: number; // 0-100\n reasons: MatchReason[];\n warnings: string[];\n}\n\n/**\n * Match reason with category and weight\n */\nexport interface MatchReason {\n category: MatchCategory;\n description: string;\n weight: number; // Points contributed\n matched: string[]; // What matched\n}\n\n/**\n * Categories of matching\n */\nexport type MatchCategory =\n | 'framework'\n | 'language'\n | 'library'\n | 'tag'\n | 'pattern'\n | 'popularity'\n | 'quality'\n | 'freshness';\n\n/**\n * Weight configuration for scoring\n */\nexport interface ScoringWeights {\n framework: number; // Default: 40\n language: number; // Default: 20\n library: number; // Default: 15\n tag: number; // Default: 10\n popularity: number; // Default: 5\n quality: number; // Default: 5\n freshness: number; // Default: 5\n}\n\nexport const DEFAULT_SCORING_WEIGHTS: ScoringWeights = {\n framework: 40,\n language: 20,\n library: 15,\n tag: 10,\n popularity: 5,\n quality: 5,\n freshness: 5,\n};\n\n/**\n * Project profile for matching (derived from ProjectContext)\n */\nexport interface ProjectProfile {\n name: string;\n type?: string;\n stack: ProjectStack;\n patterns?: {\n components?: string;\n stateManagement?: string;\n apiStyle?: string;\n styling?: string;\n testing?: string;\n };\n installedSkills: string[];\n excludedSkills: string[];\n}\n\n/**\n * Skill index for efficient lookup\n */\nexport interface SkillIndex {\n version: number;\n lastUpdated: string;\n skills: SkillSummary[];\n sources: IndexSource[];\n}\n\n/**\n * Source repository in the index\n */\nexport interface IndexSource {\n name: string;\n url: string;\n lastFetched: string;\n skillCount: number;\n}\n\n/**\n * Recommendation options\n */\nexport interface RecommendOptions {\n limit?: number; // Max recommendations (default: 10)\n minScore?: number; // Minimum score threshold (default: 30)\n categories?: string[]; // Filter by categories\n excludeInstalled?: boolean; // Skip already installed (default: true)\n weights?: Partial<ScoringWeights>;\n includeReasons?: boolean; // Include detailed reasons (default: true)\n}\n\n/**\n * Recommendation result\n */\nexport interface RecommendationResult {\n recommendations: ScoredSkill[];\n profile: ProjectProfile;\n totalSkillsScanned: number;\n timestamp: string;\n}\n\n/**\n * Search options for task-based search\n */\nexport interface SearchOptions {\n query: string;\n limit?: number;\n semantic?: boolean; // Use semantic matching (default: true)\n filters?: {\n tags?: string[];\n minScore?: number;\n verified?: boolean;\n };\n}\n\n/**\n * Search result\n */\nexport interface SearchResult {\n skill: SkillSummary;\n relevance: number; // 0-100\n matchedTerms: string[];\n snippet?: string; // Relevant excerpt\n}\n\n/**\n * Freshness check result\n */\nexport interface FreshnessResult {\n skill: string;\n status: 'current' | 'outdated' | 'unknown';\n details?: {\n skillVersion?: string;\n projectVersion?: string;\n message: string;\n };\n}\n\n/**\n * Tag to technology mapping for smart inference\n */\nexport const TAG_TO_TECH: Record<string, string[]> = {\n // Frontend frameworks\n react: ['react', 'react-dom', '@types/react'],\n vue: ['vue', '@vue/core'],\n angular: ['@angular/core'],\n svelte: ['svelte'],\n solid: ['solid-js'],\n qwik: ['@builder.io/qwik'],\n\n // Meta-frameworks\n nextjs: ['next'],\n nuxt: ['nuxt'],\n remix: ['@remix-run/react'],\n astro: ['astro'],\n gatsby: ['gatsby'],\n sveltekit: ['@sveltejs/kit'],\n\n // Backend\n express: ['express'],\n fastify: ['fastify'],\n koa: ['koa'],\n hono: ['hono'],\n nestjs: ['@nestjs/core'],\n fastapi: ['fastapi'],\n django: ['django'],\n flask: ['flask'],\n\n // Languages\n typescript: ['typescript', '@types/node'],\n javascript: [], // Inferred from lack of typescript\n python: [],\n rust: [],\n go: [],\n\n // Styling\n tailwind: ['tailwindcss'],\n 'styled-components': ['styled-components'],\n emotion: ['@emotion/react'],\n 'css-modules': [],\n sass: ['sass', 'node-sass'],\n\n // State management\n redux: ['@reduxjs/toolkit', 'redux'],\n zustand: ['zustand'],\n mobx: ['mobx'],\n jotai: ['jotai'],\n recoil: ['recoil'],\n\n // Testing\n jest: ['jest'],\n vitest: ['vitest'],\n playwright: ['@playwright/test'],\n cypress: ['cypress'],\n testing: ['@testing-library/react'],\n\n // Databases\n postgres: ['pg', '@prisma/client'],\n mongodb: ['mongoose', 'mongodb'],\n supabase: ['@supabase/supabase-js'],\n firebase: ['firebase'],\n prisma: ['@prisma/client'],\n drizzle: ['drizzle-orm'],\n\n // Tools\n eslint: ['eslint'],\n prettier: ['prettier'],\n biome: ['@biomejs/biome'],\n turborepo: ['turbo'],\n monorepo: ['lerna', 'nx'],\n\n // API\n graphql: ['graphql', '@apollo/client'],\n trpc: ['@trpc/server'],\n rest: [],\n\n // Auth\n auth: ['next-auth', '@auth/core', 'passport'],\n 'better-auth': ['better-auth'],\n\n // Deployment\n vercel: ['vercel'],\n docker: [],\n kubernetes: [],\n\n // Other\n ai: ['openai', '@anthropic-ai/sdk', 'ai'],\n shadcn: [],\n security: [],\n performance: [],\n accessibility: [],\n};\n\n/**\n * Reverse mapping: tech to tags\n */\nexport function getTechTags(techName: string): string[] {\n const tags: string[] = [];\n for (const [tag, techs] of Object.entries(TAG_TO_TECH)) {\n if (techs.includes(techName)) {\n tags.push(tag);\n }\n }\n return tags;\n}\n","import type { ProjectStack } from '../context/types.js';\nimport type {\n SkillSummary,\n ScoredSkill,\n MatchReason,\n ScoringWeights,\n ProjectProfile,\n SkillIndex,\n RecommendOptions,\n RecommendationResult,\n SearchOptions,\n SearchResult,\n FreshnessResult,\n} from './types.js';\nimport { DEFAULT_SCORING_WEIGHTS, TAG_TO_TECH, getTechTags } from './types.js';\n\n/**\n * Recommendation engine for matching skills to project profiles\n */\nexport class RecommendationEngine {\n private weights: ScoringWeights;\n private index: SkillIndex | null = null;\n\n constructor(weights?: Partial<ScoringWeights>) {\n this.weights = { ...DEFAULT_SCORING_WEIGHTS, ...weights };\n }\n\n /**\n * Load skill index from cache or generate from local skills\n */\n loadIndex(index: SkillIndex): void {\n this.index = index;\n }\n\n /**\n * Get loaded index\n */\n getIndex(): SkillIndex | null {\n return this.index;\n }\n\n /**\n * Score a single skill against a project profile\n */\n scoreSkill(profile: ProjectProfile, skill: SkillSummary): ScoredSkill {\n const reasons: MatchReason[] = [];\n const warnings: string[] = [];\n let totalScore = 0;\n\n // Framework matching (40 points max)\n const frameworkMatch = this.matchFrameworks(profile.stack, skill);\n reasons.push(frameworkMatch);\n totalScore += frameworkMatch.weight;\n\n // Language matching (20 points max)\n const languageMatch = this.matchLanguages(profile.stack, skill);\n reasons.push(languageMatch);\n totalScore += languageMatch.weight;\n\n // Library matching (15 points max)\n const libraryMatch = this.matchLibraries(profile.stack, skill);\n reasons.push(libraryMatch);\n totalScore += libraryMatch.weight;\n\n // Tag relevance (10 points max)\n const tagMatch = this.matchTags(profile, skill);\n reasons.push(tagMatch);\n totalScore += tagMatch.weight;\n\n // Popularity bonus (5 points max)\n const popularityScore = this.scorePopularity(skill);\n reasons.push(popularityScore);\n totalScore += popularityScore.weight;\n\n // Quality bonus (5 points max)\n const qualityScore = this.scoreQuality(skill);\n reasons.push(qualityScore);\n totalScore += qualityScore.weight;\n\n // Freshness bonus (5 points max)\n const freshnessScore = this.scoreFreshness(skill);\n reasons.push(freshnessScore);\n totalScore += freshnessScore.weight;\n\n // Add warnings for potential issues\n if (skill.compatibility?.minVersion) {\n for (const [tech, minVer] of Object.entries(skill.compatibility.minVersion)) {\n const detected = this.findDetectedVersion(profile.stack, tech);\n if (detected && this.isVersionLower(detected, minVer)) {\n warnings.push(`Requires ${tech} ${minVer}+, you have ${detected}`);\n }\n }\n }\n\n // Check if skill is already installed\n if (profile.installedSkills.includes(skill.name)) {\n warnings.push('Already installed');\n }\n\n return {\n skill,\n score: Math.min(100, Math.round(totalScore)),\n reasons,\n warnings,\n };\n }\n\n /**\n * Match frameworks in project stack against skill\n */\n private matchFrameworks(stack: ProjectStack, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillFrameworks = skill.compatibility?.frameworks || [];\n const skillTags = skill.tags || [];\n\n for (const detection of stack.frameworks) {\n const techName = detection.name.toLowerCase();\n\n // Direct framework match\n if (skillFrameworks.some((f) => f.toLowerCase() === techName)) {\n matched.push(detection.name);\n continue;\n }\n\n // Tag-based match\n const relatedTags = getTechTags(techName);\n for (const tag of skillTags) {\n if (relatedTags.includes(tag.toLowerCase()) || tag.toLowerCase() === techName) {\n matched.push(detection.name);\n break;\n }\n }\n\n // Check if skill tags match framework-related tags\n for (const [tagName, techs] of Object.entries(TAG_TO_TECH)) {\n if (techs.includes(techName) && skillTags.includes(tagName)) {\n if (!matched.includes(detection.name)) {\n matched.push(detection.name);\n }\n }\n }\n }\n\n const ratio = matched.length / Math.max(stack.frameworks.length, 1);\n const weight = Math.round(this.weights.framework * ratio);\n\n return {\n category: 'framework',\n description:\n matched.length > 0\n ? `Matches frameworks: ${matched.join(', ')}`\n : 'No framework match',\n weight,\n matched,\n };\n }\n\n /**\n * Match languages in project stack against skill\n */\n private matchLanguages(stack: ProjectStack, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillLanguages = skill.compatibility?.languages || [];\n const skillTags = skill.tags || [];\n\n for (const detection of stack.languages) {\n const langName = detection.name.toLowerCase();\n\n // Direct language match\n if (skillLanguages.some((l) => l.toLowerCase() === langName)) {\n matched.push(detection.name);\n continue;\n }\n\n // Tag-based match\n if (skillTags.some((t) => t.toLowerCase() === langName)) {\n matched.push(detection.name);\n }\n }\n\n const ratio = matched.length / Math.max(stack.languages.length, 1);\n const weight = Math.round(this.weights.language * ratio);\n\n return {\n category: 'language',\n description:\n matched.length > 0 ? `Matches languages: ${matched.join(', ')}` : 'No language match',\n weight,\n matched,\n };\n }\n\n /**\n * Match libraries in project stack against skill\n */\n private matchLibraries(stack: ProjectStack, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillLibraries = skill.compatibility?.libraries || [];\n const skillTags = skill.tags || [];\n\n const allLibraries = [...stack.libraries, ...stack.styling, ...stack.testing, ...stack.databases];\n\n for (const detection of allLibraries) {\n const libName = detection.name.toLowerCase();\n\n // Direct library match\n if (skillLibraries.some((l) => l.toLowerCase() === libName)) {\n matched.push(detection.name);\n continue;\n }\n\n // Tag-based match\n const relatedTags = getTechTags(libName);\n for (const tag of skillTags) {\n if (relatedTags.includes(tag.toLowerCase()) || tag.toLowerCase() === libName) {\n matched.push(detection.name);\n break;\n }\n }\n }\n\n const ratio = matched.length / Math.max(allLibraries.length, 1);\n const weight = Math.round(this.weights.library * ratio);\n\n return {\n category: 'library',\n description:\n matched.length > 0 ? `Matches libraries: ${matched.join(', ')}` : 'No library match',\n weight,\n matched,\n };\n }\n\n /**\n * Match tags based on project patterns and type\n */\n private matchTags(profile: ProjectProfile, skill: SkillSummary): MatchReason {\n const matched: string[] = [];\n const skillTags = skill.tags || [];\n\n // Extract relevant tags from project\n const projectTags = this.extractProjectTags(profile);\n\n for (const tag of skillTags) {\n if (projectTags.includes(tag.toLowerCase())) {\n matched.push(tag);\n }\n }\n\n const ratio = matched.length / Math.max(skillTags.length, 1);\n const weight = Math.round(this.weights.tag * ratio);\n\n return {\n category: 'tag',\n description: matched.length > 0 ? `Matches tags: ${matched.join(', ')}` : 'No tag match',\n weight,\n matched,\n };\n }\n\n /**\n * Extract relevant tags from project profile\n */\n private extractProjectTags(profile: ProjectProfile): string[] {\n const tags: string[] = [];\n\n // Add project type as tag\n if (profile.type) {\n tags.push(profile.type.toLowerCase());\n }\n\n // Add patterns as tags\n if (profile.patterns) {\n if (profile.patterns.components) tags.push(profile.patterns.components);\n if (profile.patterns.stateManagement) tags.push(profile.patterns.stateManagement);\n if (profile.patterns.apiStyle) tags.push(profile.patterns.apiStyle);\n if (profile.patterns.styling) tags.push(profile.patterns.styling);\n if (profile.patterns.testing) tags.push(profile.patterns.testing);\n }\n\n // Derive tags from stack\n const allDetections = [\n ...profile.stack.frameworks,\n ...profile.stack.languages,\n ...profile.stack.libraries,\n ...profile.stack.styling,\n ...profile.stack.testing,\n ...profile.stack.databases,\n ...profile.stack.tools,\n ];\n\n for (const detection of allDetections) {\n tags.push(detection.name.toLowerCase());\n // Add related tags\n const related = getTechTags(detection.name.toLowerCase());\n tags.push(...related);\n }\n\n return [...new Set(tags)];\n }\n\n /**\n * Score based on popularity (downloads/stars)\n */\n private scorePopularity(skill: SkillSummary): MatchReason {\n // Normalize popularity to 0-5 range\n // Assume 1000+ is high popularity\n const popularity = skill.popularity ?? 0;\n const normalized = Math.min(popularity / 1000, 1);\n const weight = Math.round(this.weights.popularity * normalized);\n\n return {\n category: 'popularity',\n description:\n popularity > 0 ? `${popularity} downloads/stars` : 'No popularity data',\n weight,\n matched: popularity > 0 ? [popularity.toString()] : [],\n };\n }\n\n /**\n * Score based on quality metrics\n */\n private scoreQuality(skill: SkillSummary): MatchReason {\n const quality = skill.quality ?? 50; // Default to 50 if not specified\n const normalized = quality / 100;\n const weight = Math.round(this.weights.quality * normalized);\n\n return {\n category: 'quality',\n description: `Quality score: ${skill.quality}/100`,\n weight,\n matched: skill.verified ? ['verified'] : [],\n };\n }\n\n /**\n * Score based on freshness (last update)\n */\n private scoreFreshness(skill: SkillSummary): MatchReason {\n if (!skill.lastUpdated) {\n return {\n category: 'freshness',\n description: 'No update date available',\n weight: 0,\n matched: [],\n };\n }\n\n const lastUpdate = new Date(skill.lastUpdated);\n const now = new Date();\n const daysSinceUpdate = (now.getTime() - lastUpdate.getTime()) / (1000 * 60 * 60 * 24);\n\n // Full points if updated within 30 days, decreasing linearly to 0 at 365 days\n let normalized = Math.max(0, 1 - daysSinceUpdate / 365);\n if (daysSinceUpdate <= 30) normalized = 1;\n\n const weight = Math.round(this.weights.freshness * normalized);\n\n return {\n category: 'freshness',\n description:\n daysSinceUpdate <= 30\n ? 'Recently updated'\n : `Updated ${Math.round(daysSinceUpdate)} days ago`,\n weight,\n matched: [skill.lastUpdated],\n };\n }\n\n /**\n * Find detected version for a technology\n */\n private findDetectedVersion(stack: ProjectStack, tech: string): string | null {\n const techLower = tech.toLowerCase();\n const allDetections = [\n ...stack.frameworks,\n ...stack.languages,\n ...stack.libraries,\n ...stack.styling,\n ...stack.testing,\n ...stack.databases,\n ...stack.tools,\n ...stack.runtime,\n ];\n\n const found = allDetections.find((d) => d.name.toLowerCase() === techLower);\n return found?.version || null;\n }\n\n /**\n * Compare semantic versions (basic implementation)\n */\n private isVersionLower(current: string, required: string): boolean {\n const parseVersion = (v: string): number[] =>\n v\n .replace(/[^0-9.]/g, '')\n .split('.')\n .map(Number);\n\n const currentParts = parseVersion(current);\n const requiredParts = parseVersion(required);\n\n for (let i = 0; i < Math.max(currentParts.length, requiredParts.length); i++) {\n const c = currentParts[i] || 0;\n const r = requiredParts[i] || 0;\n if (c < r) return true;\n if (c > r) return false;\n }\n\n return false;\n }\n\n /**\n * Get top recommendations for a project profile\n */\n recommend(profile: ProjectProfile, options: RecommendOptions = {}): RecommendationResult {\n const {\n limit = 10,\n minScore = 30,\n categories,\n excludeInstalled = true,\n includeReasons = true,\n } = options;\n\n if (!this.index) {\n return {\n recommendations: [],\n profile,\n totalSkillsScanned: 0,\n timestamp: new Date().toISOString(),\n };\n }\n\n let skills = this.index.skills;\n\n // Filter by categories if specified\n if (categories && categories.length > 0) {\n skills = skills.filter((s) => s.tags?.some((t) => categories.includes(t)));\n }\n\n // Score all skills\n const scored = skills.map((skill) => this.scoreSkill(profile, skill));\n\n // Filter by minimum score\n let filtered = scored.filter((s) => s.score >= minScore);\n\n // Exclude installed skills\n if (excludeInstalled) {\n filtered = filtered.filter((s) => !profile.installedSkills.includes(s.skill.name));\n }\n\n // Exclude explicitly excluded skills\n filtered = filtered.filter((s) => !profile.excludedSkills.includes(s.skill.name));\n\n // Sort by score descending\n filtered.sort((a, b) => b.score - a.score);\n\n // Limit results\n const recommendations = filtered.slice(0, limit);\n\n // Optionally strip reasons for minimal output\n if (!includeReasons) {\n recommendations.forEach((r) => {\n r.reasons = [];\n });\n }\n\n return {\n recommendations,\n profile,\n totalSkillsScanned: skills.length,\n timestamp: new Date().toISOString(),\n };\n }\n\n /**\n * Search skills by query (task-based search)\n */\n search(options: SearchOptions): SearchResult[] {\n const { query, limit = 10, semantic = true, filters } = options;\n\n if (!this.index) {\n return [];\n }\n\n // Handle empty or whitespace-only queries\n const trimmedQuery = query.trim();\n if (!trimmedQuery) {\n return [];\n }\n\n const queryTerms = trimmedQuery.toLowerCase().split(/\\s+/).filter(t => t.length > 0);\n if (queryTerms.length === 0) {\n return [];\n }\n\n const results: SearchResult[] = [];\n\n for (const skill of this.index.skills) {\n // Apply filters\n if (filters?.tags && filters.tags.length > 0) {\n if (!skill.tags?.some((t) => filters.tags!.includes(t))) continue;\n }\n if (filters?.verified && !skill.verified) continue;\n\n // Calculate relevance\n const { relevance, matchedTerms, snippet } = this.calculateRelevance(\n skill,\n queryTerms,\n semantic\n );\n\n if (relevance > 0 && (!filters?.minScore || relevance >= filters.minScore)) {\n results.push({ skill, relevance, matchedTerms, snippet });\n }\n }\n\n // Sort by relevance\n results.sort((a, b) => b.relevance - a.relevance);\n\n return results.slice(0, limit);\n }\n\n /**\n * Calculate search relevance for a skill\n */\n private calculateRelevance(\n skill: SkillSummary,\n queryTerms: string[],\n semantic: boolean\n ): { relevance: number; matchedTerms: string[]; snippet?: string } {\n const matchedTerms: string[] = [];\n let relevance = 0;\n\n // Search in name (high weight)\n const nameLower = skill.name.toLowerCase();\n for (const term of queryTerms) {\n if (nameLower.includes(term)) {\n relevance += 40;\n matchedTerms.push(term);\n }\n }\n\n // Search in description (medium weight)\n const descLower = (skill.description || '').toLowerCase();\n for (const term of queryTerms) {\n if (descLower.includes(term) && !matchedTerms.includes(term)) {\n relevance += 20;\n matchedTerms.push(term);\n }\n }\n\n // Search in tags (medium weight)\n const tagsLower = (skill.tags || []).map((t) => t.toLowerCase());\n for (const term of queryTerms) {\n if (tagsLower.some((t) => t.includes(term)) && !matchedTerms.includes(term)) {\n relevance += 25;\n matchedTerms.push(term);\n }\n }\n\n // Semantic matching: expand terms using TAG_TO_TECH\n if (semantic) {\n for (const term of queryTerms) {\n const relatedTags = getTechTags(term);\n for (const relatedTag of relatedTags) {\n if (\n tagsLower.includes(relatedTag) ||\n nameLower.includes(relatedTag) ||\n descLower.includes(relatedTag)\n ) {\n if (!matchedTerms.includes(term)) {\n relevance += 15;\n matchedTerms.push(term);\n }\n }\n }\n\n // Also check if term is a tag that maps to skill tags\n const tagTechs = TAG_TO_TECH[term] || [];\n for (const tech of tagTechs) {\n if (skill.compatibility?.libraries?.includes(tech)) {\n if (!matchedTerms.includes(term)) {\n relevance += 15;\n matchedTerms.push(term);\n }\n }\n }\n }\n }\n\n // Generate snippet if description matches\n let snippet: string | undefined;\n if (skill.description && matchedTerms.length > 0) {\n snippet = skill.description.slice(0, 150);\n if (skill.description.length > 150) snippet += '...';\n }\n\n // Normalize to 0-100\n relevance = Math.min(100, relevance);\n\n return { relevance, matchedTerms, snippet };\n }\n\n /**\n * Check freshness of installed skills against project dependencies\n *\n * A skill is considered:\n * - 'current': skill's minVersion is <= project version (compatible and up to date)\n * - 'outdated': skill targets a significantly older major version\n * - 'unknown': no version requirements specified\n */\n checkFreshness(\n profile: ProjectProfile,\n installedSkills: SkillSummary[]\n ): FreshnessResult[] {\n const results: FreshnessResult[] = [];\n\n for (const skill of installedSkills) {\n if (!skill.compatibility?.minVersion) {\n results.push({\n skill: skill.name,\n status: 'unknown',\n details: { message: 'No version requirements specified' },\n });\n continue;\n }\n\n let status: 'current' | 'outdated' = 'current';\n const messages: string[] = [];\n\n for (const [tech, minVer] of Object.entries(skill.compatibility.minVersion)) {\n const detected = this.findDetectedVersion(profile.stack, tech);\n if (detected) {\n const majorSkill = parseInt(minVer.split('.')[0]) || 0;\n const majorProject = parseInt(detected.split('.')[0]) || 0;\n\n // Skill is outdated if it targets a version that is 2+ major versions behind\n // e.g., skill targets React 16 but project uses React 19\n if (majorProject - majorSkill >= 2) {\n status = 'outdated';\n messages.push(`Skill targets ${tech} ${minVer}, you have ${detected}`);\n }\n }\n }\n\n results.push({\n skill: skill.name,\n status,\n details:\n messages.length > 0 ? { message: messages.join('; ') } : { message: 'Up to date' },\n });\n }\n\n return results;\n }\n}\n\n/**\n * Create a recommendation engine with default settings\n */\nexport function createRecommendationEngine(\n weights?: Partial<ScoringWeights>\n): RecommendationEngine {\n return new RecommendationEngine(weights);\n}\n"],"mappings":"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","names":["existsSync","readFileSync","join","parseYaml","join","existsSync","readFileSync","parseYaml","existsSync","join","basename","join","basename","existsSync","execSync","existsSync","rmSync","join","basename","tmpdir","randomUUID","join","tmpdir","randomUUID","execSync","basename","existsSync","rmSync","execSync","existsSync","rmSync","join","basename","tmpdir","randomUUID","join","tmpdir","randomUUID","execSync","basename","existsSync","rmSync","existsSync","join","basename","homedir","join","homedir","basename","existsSync","z","parseYaml","stringifyYaml","extractFrontmatter","name","parseYaml","stringifyYaml","extractFrontmatter","parseMetadataComments","existsSync","readFileSync","writeFileSync","mkdirSync","dirname","basename","existsSync","readFileSync","basename","dirname","mkdirSync","writeFileSync","z","existsSync","readFileSync","readdirSync","join","basename","existsSync","readFileSync","writeFileSync","mkdirSync","join","parseYaml","stringifyYaml","join","existsSync","readFileSync","parseYaml","mkdirSync","stringifyYaml","writeFileSync","existsSync","writeFileSync","mkdirSync","readdirSync","join","join","existsSync","mkdirSync","writeFileSync","readdirSync","z"]}
|