@skillkit/core 1.4.0 → 1.5.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/dist/index.d.ts +591 -2
- package/dist/index.js +1338 -84
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +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/context/loader.ts","../src/recommend/types.ts","../src/recommend/engine.ts","../src/recommend/fetcher.ts","../src/session/types.ts","../src/session/manager.ts","../src/workflow/types.ts","../src/workflow/parser.ts","../src/workflow/orchestrator.ts","../src/executor/engine.ts","../src/executor/agents.ts","../src/testing/runner.ts","../src/marketplace/types.ts","../src/marketplace/aggregator.ts","../src/cicd/templates.ts","../src/memory/types.ts","../src/memory/observation-store.ts","../src/memory/learning-store.ts","../src/memory/memory-index.ts","../src/memory/initializer.ts","../src/memory/observer.ts","../src/memory/engine-integration.ts","../src/memory/compressor.ts","../src/memory/injector.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","/**\n * Context Loader\n *\n * Smart context loading with token budgets and category-based loading.\n */\n\nimport { existsSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Context category with size limits\n */\nexport interface ContextCategory {\n /** Category name */\n name: string;\n /** Maximum tokens for this category */\n maxTokens: number;\n /** Whether to always load this category */\n alwaysLoad: boolean;\n /** File path (relative to project) */\n file?: string;\n /** Inline content */\n content?: string;\n}\n\n/**\n * Context loading options\n */\nexport interface ContextLoadOptions {\n /** Total token budget */\n totalBudget?: number;\n /** Categories to load (load all if not specified) */\n categories?: string[];\n /** Whether to warn when approaching budget limits */\n warnOnBudgetLimit?: boolean;\n}\n\n/**\n * Loaded context result\n */\nexport interface LoadedContext {\n /** All loaded content combined */\n content: string;\n /** Total tokens used */\n totalTokens: number;\n /** Budget remaining */\n budgetRemaining: number;\n /** Categories loaded */\n categoriesLoaded: string[];\n /** Categories skipped (due to budget or not found) */\n categoriesSkipped: string[];\n /** Warnings generated */\n warnings: string[];\n /** Whether budget is near limit (>50% used) */\n nearBudgetLimit: boolean;\n /** Whether context is degraded (>70% used) */\n contextDegraded: boolean;\n}\n\n/**\n * Default context categories\n */\nexport const DEFAULT_CONTEXT_CATEGORIES: ContextCategory[] = [\n {\n name: 'project',\n maxTokens: 2000,\n alwaysLoad: true,\n file: '.skillkit/context.yaml',\n },\n {\n name: 'requirements',\n maxTokens: 5000,\n alwaysLoad: false,\n file: 'REQUIREMENTS.md',\n },\n {\n name: 'decisions',\n maxTokens: 1000,\n alwaysLoad: false,\n file: '.skillkit/decisions.yaml',\n },\n {\n name: 'readme',\n maxTokens: 3000,\n alwaysLoad: false,\n file: 'README.md',\n },\n];\n\n/**\n * Rough estimate of tokens from text\n * (approximation: ~4 characters per token for English text)\n */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Context Loader class\n */\nexport class ContextLoader {\n private projectPath: string;\n private categories: ContextCategory[];\n private defaultBudget: number;\n\n constructor(projectPath: string, options?: { categories?: ContextCategory[]; defaultBudget?: number }) {\n this.projectPath = projectPath;\n this.categories = options?.categories || DEFAULT_CONTEXT_CATEGORIES;\n this.defaultBudget = options?.defaultBudget || 32000; // Default ~32k tokens\n }\n\n /**\n * Load context based on options\n */\n load(options: ContextLoadOptions = {}): LoadedContext {\n const totalBudget = options.totalBudget || this.defaultBudget;\n const requestedCategories = options.categories;\n\n const result: LoadedContext = {\n content: '',\n totalTokens: 0,\n budgetRemaining: totalBudget,\n categoriesLoaded: [],\n categoriesSkipped: [],\n warnings: [],\n nearBudgetLimit: false,\n contextDegraded: false,\n };\n\n const contentParts: string[] = [];\n\n // First pass: load alwaysLoad categories\n for (const category of this.categories) {\n if (!category.alwaysLoad) continue;\n if (requestedCategories && !requestedCategories.includes(category.name)) continue;\n\n this.loadCategory(category, result, contentParts, totalBudget);\n }\n\n // Second pass: load requested categories\n for (const category of this.categories) {\n if (category.alwaysLoad) continue; // Already loaded\n if (requestedCategories && !requestedCategories.includes(category.name)) continue;\n\n this.loadCategory(category, result, contentParts, totalBudget);\n }\n\n // Combine content\n result.content = contentParts.join('\\n\\n---\\n\\n');\n\n // Check budget status\n const usagePercent = (result.totalTokens / totalBudget) * 100;\n result.nearBudgetLimit = usagePercent >= 50;\n result.contextDegraded = usagePercent >= 70;\n\n // Add warnings for budget limits\n if (result.contextDegraded && options.warnOnBudgetLimit !== false) {\n result.warnings.push(\n `Context usage at ${Math.round(usagePercent)}% - quality may degrade. Consider spawning a fresh agent.`\n );\n } else if (result.nearBudgetLimit && options.warnOnBudgetLimit !== false) {\n result.warnings.push(`Context usage at ${Math.round(usagePercent)}% - approaching limit.`);\n }\n\n return result;\n }\n\n /**\n * Load a single category\n */\n private loadCategory(\n category: ContextCategory,\n result: LoadedContext,\n contentParts: string[],\n totalBudget: number\n ): void {\n let content: string | null = null;\n\n // Load from file\n if (category.file) {\n const filePath = join(this.projectPath, category.file);\n if (existsSync(filePath)) {\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n result.categoriesSkipped.push(category.name);\n return;\n }\n }\n }\n\n // Use inline content if no file\n if (!content && category.content) {\n content = category.content;\n }\n\n if (!content) {\n result.categoriesSkipped.push(category.name);\n return;\n }\n\n // Estimate tokens\n const tokens = estimateTokens(content);\n\n // Check category limit\n if (tokens > category.maxTokens) {\n // Truncate to category limit\n const truncateChars = category.maxTokens * 4;\n content = content.slice(0, truncateChars) + '\\n\\n[... content truncated ...]';\n result.warnings.push(\n `Category \"${category.name}\" truncated to ${category.maxTokens} tokens`\n );\n }\n\n // Check total budget\n const truncatedTokens = estimateTokens(content);\n if (result.totalTokens + truncatedTokens > totalBudget) {\n // Skip if would exceed budget\n result.categoriesSkipped.push(category.name);\n result.warnings.push(\n `Category \"${category.name}\" skipped - would exceed budget`\n );\n return;\n }\n\n // Add to result\n contentParts.push(`# ${category.name.toUpperCase()}\\n\\n${content}`);\n result.totalTokens += truncatedTokens;\n result.budgetRemaining = totalBudget - result.totalTokens;\n result.categoriesLoaded.push(category.name);\n }\n\n /**\n * Get category by name\n */\n getCategory(name: string): ContextCategory | undefined {\n return this.categories.find((c) => c.name === name);\n }\n\n /**\n * Add a custom category\n */\n addCategory(category: ContextCategory): void {\n const existing = this.categories.findIndex((c) => c.name === category.name);\n if (existing >= 0) {\n this.categories[existing] = category;\n } else {\n this.categories.push(category);\n }\n }\n\n /**\n * Remove a category\n */\n removeCategory(name: string): void {\n this.categories = this.categories.filter((c) => c.name !== name);\n }\n\n /**\n * Get estimated context size for categories\n */\n estimateSize(categoryNames?: string[]): { category: string; tokens: number; available: boolean }[] {\n const estimates: { category: string; tokens: number; available: boolean }[] = [];\n\n for (const category of this.categories) {\n if (categoryNames && !categoryNames.includes(category.name)) continue;\n\n let tokens = 0;\n let available = false;\n\n if (category.file) {\n const filePath = join(this.projectPath, category.file);\n if (existsSync(filePath)) {\n try {\n const stat = statSync(filePath);\n tokens = Math.ceil(stat.size / 4); // Rough estimate\n available = true;\n } catch {\n // File not accessible\n }\n }\n } else if (category.content) {\n tokens = estimateTokens(category.content);\n available = true;\n }\n\n estimates.push({\n category: category.name,\n tokens: Math.min(tokens, category.maxTokens),\n available,\n });\n }\n\n return estimates;\n }\n\n /**\n * Check if context would exceed budget threshold\n */\n wouldExceedThreshold(additionalTokens: number, threshold: number = 0.7): boolean {\n const currentTokens = this.load().totalTokens;\n const newTotal = currentTokens + additionalTokens;\n return newTotal / this.defaultBudget > threshold;\n }\n\n /**\n * Suggest spawning fresh agent if context is degraded\n */\n shouldSpawnFreshAgent(): { should: boolean; reason?: string } {\n const context = this.load();\n\n if (context.contextDegraded) {\n return {\n should: true,\n reason: `Context at ${Math.round((context.totalTokens / this.defaultBudget) * 100)}% capacity`,\n };\n }\n\n return { should: false };\n }\n}\n\n/**\n * Create a context loader\n */\nexport function createContextLoader(\n projectPath: string,\n options?: { categories?: ContextCategory[]; defaultBudget?: number }\n): ContextLoader {\n return new ContextLoader(projectPath, 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","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir, homedir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { SkillIndex, SkillSummary, IndexSource } from './types.js';\nimport { discoverSkills, extractFrontmatter } from '../skills.js';\n\n/**\n * Known skill repositories to index\n */\nexport const KNOWN_SKILL_REPOS = [\n { owner: 'anthropics', repo: 'courses', description: 'Anthropic official courses and skills' },\n { owner: 'vercel-labs', repo: 'ai-sdk-preview-internal-knowledge-base', description: 'Vercel AI SDK skills' },\n { owner: 'composioHQ', repo: 'awesome-claude-code-skills', description: 'Curated Claude Code skills' },\n] as const;\n\n/**\n * Index file path\n */\nexport const INDEX_PATH = join(homedir(), '.skillkit', 'index.json');\nexport const INDEX_CACHE_HOURS = 24;\n\n/**\n * Fetch skills from a GitHub repository\n */\nexport async function fetchSkillsFromRepo(\n owner: string,\n repo: string\n): Promise<{ skills: SkillSummary[]; error?: string }> {\n const cloneUrl = `https://github.com/${owner}/${repo}.git`;\n const tempDir = join(tmpdir(), `skillkit-fetch-${randomUUID()}`);\n\n try {\n // Shallow clone for speed\n execSync(`git clone --depth 1 ${cloneUrl} ${tempDir}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n timeout: 60000, // 60 second timeout\n });\n\n // Discover skills in the cloned repo\n const discoveredSkills = discoverSkills(tempDir);\n const skills: SkillSummary[] = [];\n\n for (const skill of discoveredSkills) {\n const skillMdPath = join(skill.path, 'SKILL.md');\n if (!existsSync(skillMdPath)) continue;\n\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n\n const summary: SkillSummary = {\n name: skill.name,\n description: skill.description || frontmatter?.description as string || 'No description',\n source: `${owner}/${repo}`,\n tags: (frontmatter?.tags as string[]) || [],\n compatibility: {\n frameworks: (frontmatter?.compatibility as Record<string, unknown>)?.frameworks as string[] || [],\n languages: (frontmatter?.compatibility as Record<string, unknown>)?.languages as string[] || [],\n libraries: (frontmatter?.compatibility as Record<string, unknown>)?.libraries as string[] || [],\n },\n popularity: 0,\n quality: 50,\n lastUpdated: new Date().toISOString(),\n verified: owner === 'anthropics' || owner === 'vercel-labs',\n };\n\n skills.push(summary);\n } catch {\n // Skip skills that fail to parse\n }\n }\n\n return { skills };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { skills: [], error: `Failed to fetch ${owner}/${repo}: ${message}` };\n } finally {\n // Clean up temp directory\n if (existsSync(tempDir)) {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n}\n\n/**\n * Fetch skills from all known repositories and build index\n */\nexport async function buildSkillIndex(\n repos: typeof KNOWN_SKILL_REPOS = KNOWN_SKILL_REPOS,\n onProgress?: (message: string) => void\n): Promise<{ index: SkillIndex; errors: string[] }> {\n const allSkills: SkillSummary[] = [];\n const sources: IndexSource[] = [];\n const errors: string[] = [];\n\n for (const { owner, repo } of repos) {\n onProgress?.(`Fetching ${owner}/${repo}...`);\n\n const result = await fetchSkillsFromRepo(owner, repo);\n\n if (result.error) {\n errors.push(result.error);\n }\n\n if (result.skills.length > 0) {\n allSkills.push(...result.skills);\n sources.push({\n name: `${owner}/${repo}`,\n url: `https://github.com/${owner}/${repo}`,\n lastFetched: new Date().toISOString(),\n skillCount: result.skills.length,\n });\n onProgress?.(` Found ${result.skills.length} skills`);\n } else if (!result.error) {\n onProgress?.(` No skills found`);\n }\n }\n\n // Add fallback sample skills if no repos could be fetched\n if (allSkills.length === 0) {\n onProgress?.('No skills fetched, using sample index...');\n allSkills.push(...getSampleSkills());\n sources.push({\n name: 'skillkit-samples',\n url: 'https://github.com/skillkit/samples',\n lastFetched: new Date().toISOString(),\n skillCount: allSkills.length,\n });\n }\n\n const index: SkillIndex = {\n version: 1,\n lastUpdated: new Date().toISOString(),\n skills: allSkills,\n sources,\n };\n\n return { index, errors };\n}\n\n/**\n * Save skill index to cache\n */\nexport function saveIndex(index: SkillIndex): void {\n const indexDir = join(homedir(), '.skillkit');\n if (!existsSync(indexDir)) {\n mkdirSync(indexDir, { recursive: true });\n }\n writeFileSync(INDEX_PATH, JSON.stringify(index, null, 2));\n}\n\n/**\n * Load skill index from cache\n */\nexport function loadIndex(): SkillIndex | null {\n if (!existsSync(INDEX_PATH)) {\n return null;\n }\n\n try {\n const content = readFileSync(INDEX_PATH, 'utf-8');\n return JSON.parse(content) as SkillIndex;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if index is stale\n */\nexport function isIndexStale(index: SkillIndex): boolean {\n const lastUpdated = new Date(index.lastUpdated);\n const hoursSinceUpdate = (Date.now() - lastUpdated.getTime()) / (1000 * 60 * 60);\n return hoursSinceUpdate > INDEX_CACHE_HOURS;\n}\n\n/**\n * Get index status\n */\nexport function getIndexStatus(): 'missing' | 'stale' | 'fresh' {\n const index = loadIndex();\n if (!index) return 'missing';\n return isIndexStale(index) ? 'stale' : 'fresh';\n}\n\n/**\n * Sample skills fallback (when repos can't be fetched)\n */\nfunction getSampleSkills(): SkillSummary[] {\n return [\n {\n name: 'react-best-practices',\n description: 'Modern React patterns including Server Components, hooks best practices, and performance optimization',\n source: 'skillkit/samples',\n tags: ['react', 'frontend', 'typescript', 'nextjs', 'performance'],\n compatibility: {\n frameworks: ['react', 'nextjs'],\n languages: ['typescript', 'javascript'],\n libraries: [],\n },\n popularity: 1500,\n quality: 95,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'tailwind-patterns',\n description: 'Tailwind CSS utility patterns, responsive design, and component styling best practices',\n source: 'skillkit/samples',\n tags: ['tailwind', 'css', 'styling', 'frontend', 'responsive'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript'],\n libraries: ['tailwindcss'],\n },\n popularity: 1200,\n quality: 92,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'typescript-strict-patterns',\n description: 'TypeScript strict mode patterns, type safety, and advanced type utilities',\n source: 'skillkit/samples',\n tags: ['typescript', 'types', 'safety', 'patterns'],\n compatibility: {\n frameworks: [],\n languages: ['typescript'],\n libraries: [],\n },\n popularity: 900,\n quality: 90,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'security-best-practices',\n description: 'Security patterns for web applications including XSS prevention, CSRF, and secure headers',\n source: 'skillkit/samples',\n tags: ['security', 'xss', 'csrf', 'headers', 'owasp'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript', 'python'],\n libraries: [],\n },\n popularity: 600,\n quality: 95,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'testing-patterns',\n description: 'Testing patterns with Vitest/Jest including mocking, assertions, and test organization',\n source: 'skillkit/samples',\n tags: ['vitest', 'jest', 'testing', 'typescript', 'mocking', 'tdd'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript'],\n libraries: ['vitest', 'jest'],\n },\n popularity: 700,\n quality: 86,\n lastUpdated: new Date().toISOString(),\n verified: false,\n },\n ];\n}\n","/**\n * Session State Types\n *\n * Types for managing skill execution sessions with pause/resume support.\n */\n\n/**\n * Status of a task in execution\n */\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'paused';\n\n/**\n * A single task within a skill execution\n */\nexport interface SessionTask {\n /** Task identifier */\n id: string;\n /** Task name/description */\n name: string;\n /** Task type (auto, checkpoint:human-verify, checkpoint:decision, checkpoint:human-action) */\n type: 'auto' | 'checkpoint:human-verify' | 'checkpoint:decision' | 'checkpoint:human-action';\n /** Current status */\n status: TaskStatus;\n /** Start time */\n startedAt?: string;\n /** Completion time */\n completedAt?: string;\n /** Error message if failed */\n error?: string;\n /** Output/result of the task */\n output?: string;\n /** Files modified by this task */\n filesModified?: string[];\n /** Git commit SHA if committed */\n commitSha?: string;\n}\n\n/**\n * Current skill execution state\n */\nexport interface CurrentExecution {\n /** Skill being executed */\n skillName: string;\n /** Skill source (repo) */\n skillSource: string;\n /** Current step/task index */\n currentStep: number;\n /** Total steps */\n totalSteps: number;\n /** Execution status */\n status: 'running' | 'paused' | 'completed' | 'failed';\n /** When execution started */\n startedAt: string;\n /** When execution was paused (if paused) */\n pausedAt?: string;\n /** Tasks in this execution */\n tasks: SessionTask[];\n}\n\n/**\n * Historical execution record\n */\nexport interface ExecutionHistory {\n /** Skill name */\n skillName: string;\n /** Skill source */\n skillSource: string;\n /** When execution completed */\n completedAt: string;\n /** Duration in milliseconds */\n durationMs: number;\n /** Final status */\n status: 'completed' | 'failed' | 'cancelled';\n /** Git commits created */\n commits: string[];\n /** Files modified */\n filesModified: string[];\n /** Error if failed */\n error?: string;\n}\n\n/**\n * User decisions made during skill execution\n */\nexport interface SessionDecision {\n /** Decision key/identifier */\n key: string;\n /** Decision value */\n value: string;\n /** When decision was made */\n madeAt: string;\n /** Skill that prompted the decision */\n skillName?: string;\n}\n\n/**\n * Full session state\n */\nexport interface SessionState {\n /** Schema version */\n version: 1;\n /** Last activity timestamp */\n lastActivity: string;\n /** Project path this session is for */\n projectPath: string;\n /** Current execution (if any) */\n currentExecution?: CurrentExecution;\n /** Execution history */\n history: ExecutionHistory[];\n /** User decisions */\n decisions: SessionDecision[];\n}\n\n/**\n * Session state file path within .skillkit directory\n */\nexport const SESSION_FILE = 'session.yaml';\n","/**\n * Session Manager\n *\n * Manages session state for skill execution with pause/resume support.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse, stringify } from 'yaml';\nimport type {\n SessionState,\n CurrentExecution,\n ExecutionHistory,\n SessionTask,\n TaskStatus,\n} from './types.js';\nimport { SESSION_FILE } from './types.js';\n\n/**\n * Session Manager for tracking skill execution state\n */\nexport class SessionManager {\n private projectPath: string;\n private sessionPath: string;\n private state: SessionState | null = null;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.sessionPath = join(projectPath, '.skillkit', SESSION_FILE);\n }\n\n /**\n * Get session file path\n */\n getSessionPath(): string {\n return this.sessionPath;\n }\n\n /**\n * Load session state from disk\n */\n load(): SessionState | null {\n if (!existsSync(this.sessionPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(this.sessionPath, 'utf-8');\n this.state = parse(content) as SessionState;\n return this.state;\n } catch (error) {\n console.error('Failed to load session:', error);\n return null;\n }\n }\n\n /**\n * Save session state to disk\n */\n save(): void {\n if (!this.state) {\n return;\n }\n\n const dir = join(this.projectPath, '.skillkit');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n this.state.lastActivity = new Date().toISOString();\n writeFileSync(this.sessionPath, stringify(this.state));\n }\n\n /**\n * Initialize a new session\n */\n init(): SessionState {\n this.state = {\n version: 1,\n lastActivity: new Date().toISOString(),\n projectPath: this.projectPath,\n history: [],\n decisions: [],\n };\n this.save();\n return this.state;\n }\n\n /**\n * Get current session state (load if needed)\n */\n get(): SessionState | null {\n if (!this.state) {\n this.state = this.load();\n }\n return this.state;\n }\n\n /**\n * Get or create session\n */\n getOrCreate(): SessionState {\n const state = this.get();\n if (state) {\n return state;\n }\n return this.init();\n }\n\n /**\n * Start a new skill execution\n */\n startExecution(skillName: string, skillSource: string, tasks: Omit<SessionTask, 'status'>[]): CurrentExecution {\n const state = this.getOrCreate();\n\n const execution: CurrentExecution = {\n skillName,\n skillSource,\n currentStep: 0,\n totalSteps: tasks.length,\n status: 'running',\n startedAt: new Date().toISOString(),\n tasks: tasks.map((t) => ({\n ...t,\n status: 'pending' as TaskStatus,\n })),\n };\n\n state.currentExecution = execution;\n this.save();\n return execution;\n }\n\n /**\n * Update task status\n */\n updateTask(\n taskId: string,\n updates: Partial<Pick<SessionTask, 'status' | 'output' | 'error' | 'filesModified' | 'commitSha'>>\n ): void {\n const state = this.get();\n if (!state?.currentExecution) {\n return;\n }\n\n const task = state.currentExecution.tasks.find((t) => t.id === taskId);\n if (!task) {\n return;\n }\n\n Object.assign(task, updates);\n\n if (updates.status === 'in_progress' && !task.startedAt) {\n task.startedAt = new Date().toISOString();\n }\n\n if (updates.status === 'completed' || updates.status === 'failed') {\n task.completedAt = new Date().toISOString();\n }\n\n // Update current step\n const completedCount = state.currentExecution.tasks.filter(\n (t) => t.status === 'completed' || t.status === 'failed'\n ).length;\n state.currentExecution.currentStep = completedCount;\n\n this.save();\n }\n\n /**\n * Advance to next task\n */\n advanceToNextTask(): SessionTask | null {\n const state = this.get();\n if (!state?.currentExecution) {\n return null;\n }\n\n const nextTask = state.currentExecution.tasks.find((t) => t.status === 'pending');\n if (nextTask) {\n nextTask.status = 'in_progress';\n nextTask.startedAt = new Date().toISOString();\n this.save();\n }\n\n return nextTask || null;\n }\n\n /**\n * Pause current execution\n */\n pause(): boolean {\n const state = this.get();\n if (!state?.currentExecution || state.currentExecution.status !== 'running') {\n return false;\n }\n\n state.currentExecution.status = 'paused';\n state.currentExecution.pausedAt = new Date().toISOString();\n\n // Mark any in-progress tasks as paused\n for (const task of state.currentExecution.tasks) {\n if (task.status === 'in_progress') {\n task.status = 'paused';\n }\n }\n\n this.save();\n return true;\n }\n\n /**\n * Resume paused execution\n */\n resume(): boolean {\n const state = this.get();\n if (!state?.currentExecution || state.currentExecution.status !== 'paused') {\n return false;\n }\n\n state.currentExecution.status = 'running';\n delete state.currentExecution.pausedAt;\n\n // Resume paused tasks\n for (const task of state.currentExecution.tasks) {\n if (task.status === 'paused') {\n task.status = 'in_progress';\n }\n }\n\n this.save();\n return true;\n }\n\n /**\n * Complete current execution\n */\n completeExecution(status: 'completed' | 'failed' | 'cancelled', error?: string): void {\n const state = this.get();\n if (!state?.currentExecution) {\n return;\n }\n\n const execution = state.currentExecution;\n const startTime = new Date(execution.startedAt).getTime();\n const endTime = Date.now();\n\n const historyEntry: ExecutionHistory = {\n skillName: execution.skillName,\n skillSource: execution.skillSource,\n completedAt: new Date().toISOString(),\n durationMs: endTime - startTime,\n status,\n commits: execution.tasks\n .map((t) => t.commitSha)\n .filter((sha): sha is string => !!sha),\n filesModified: Array.from(\n new Set(execution.tasks.flatMap((t) => t.filesModified || []))\n ),\n error,\n };\n\n state.history.unshift(historyEntry);\n delete state.currentExecution;\n\n // Keep only last 50 history entries\n if (state.history.length > 50) {\n state.history = state.history.slice(0, 50);\n }\n\n this.save();\n }\n\n /**\n * Record a user decision\n */\n recordDecision(key: string, value: string, skillName?: string): void {\n const state = this.getOrCreate();\n\n // Update existing decision or add new one\n const existing = state.decisions.find((d) => d.key === key);\n if (existing) {\n existing.value = value;\n existing.madeAt = new Date().toISOString();\n existing.skillName = skillName;\n } else {\n state.decisions.push({\n key,\n value,\n madeAt: new Date().toISOString(),\n skillName,\n });\n }\n\n this.save();\n }\n\n /**\n * Get a decision value\n */\n getDecision(key: string): string | undefined {\n const state = this.get();\n return state?.decisions.find((d) => d.key === key)?.value;\n }\n\n /**\n * Get execution history\n */\n getHistory(limit?: number): ExecutionHistory[] {\n const state = this.get();\n if (!state) {\n return [];\n }\n return limit ? state.history.slice(0, limit) : state.history;\n }\n\n /**\n * Check if there's an active execution\n */\n hasActiveExecution(): boolean {\n const state = this.get();\n return !!state?.currentExecution;\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n const state = this.get();\n return state?.currentExecution?.status === 'paused';\n }\n\n /**\n * Clear session (delete file)\n */\n clear(): void {\n if (existsSync(this.sessionPath)) {\n unlinkSync(this.sessionPath);\n }\n this.state = null;\n }\n}\n\n/**\n * Create a new session manager\n */\nexport function createSessionManager(projectPath: string): SessionManager {\n return new SessionManager(projectPath);\n}\n","/**\n * Workflow Types\n *\n * Types for skill composition and workflow orchestration.\n */\n\n/**\n * A skill reference within a workflow\n */\nexport interface WorkflowSkill {\n /** Skill name or source (e.g., \"typescript-strict-mode\" or \"owner/repo/skill\") */\n skill: string;\n /** Optional configuration overrides */\n config?: Record<string, unknown>;\n /** Optional condition to run this skill */\n condition?: string;\n}\n\n/**\n * A wave of skills to execute (parallel or sequential)\n */\nexport interface WorkflowWave {\n /** Wave name/description */\n name?: string;\n /** Whether skills in this wave run in parallel */\n parallel: boolean;\n /** Skills to execute in this wave */\n skills: (string | WorkflowSkill)[];\n /** Continue to next wave even if this wave has failures */\n continueOnError?: boolean;\n}\n\n/**\n * Workflow definition\n */\nexport interface Workflow {\n /** Workflow name (used as identifier) */\n name: string;\n /** Human-readable description */\n description?: string;\n /** Workflow version */\n version?: string;\n /** Author information */\n author?: string;\n /** Tags for discovery */\n tags?: string[];\n /** Waves of skills to execute */\n waves: WorkflowWave[];\n /** Environment variables to set */\n env?: Record<string, string>;\n /** Pre-execution hooks */\n preHooks?: string[];\n /** Post-execution hooks */\n postHooks?: string[];\n}\n\n/**\n * Workflow execution status\n */\nexport type WorkflowExecutionStatus = 'pending' | 'running' | 'paused' | 'completed' | 'failed' | 'cancelled';\n\n/**\n * Status of a wave execution\n */\nexport interface WaveExecutionStatus {\n /** Wave index */\n waveIndex: number;\n /** Wave name */\n waveName?: string;\n /** Status */\n status: WorkflowExecutionStatus;\n /** Skills statuses */\n skills: {\n skill: string;\n status: WorkflowExecutionStatus;\n startedAt?: string;\n completedAt?: string;\n error?: string;\n }[];\n /** When wave started */\n startedAt?: string;\n /** When wave completed */\n completedAt?: string;\n}\n\n/**\n * Workflow execution state\n */\nexport interface WorkflowExecution {\n /** Workflow being executed */\n workflow: Workflow;\n /** Execution ID */\n executionId: string;\n /** Overall status */\n status: WorkflowExecutionStatus;\n /** Current wave index */\n currentWave: number;\n /** Wave statuses */\n waves: WaveExecutionStatus[];\n /** When execution started */\n startedAt: string;\n /** When execution completed */\n completedAt?: string;\n /** Error if failed */\n error?: string;\n}\n\n/**\n * Workflow file location\n */\nexport const WORKFLOWS_DIR = 'workflows';\nexport const WORKFLOW_EXTENSION = '.yaml';\n","/**\n * Workflow Parser\n *\n * Parses workflow YAML files into Workflow objects.\n */\n\nimport { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse, stringify } from 'yaml';\nimport type { Workflow, WorkflowWave, WorkflowSkill } from './types.js';\nimport { WORKFLOWS_DIR, WORKFLOW_EXTENSION } from './types.js';\n\n/**\n * Parse a workflow from YAML content\n */\nexport function parseWorkflow(content: string): Workflow {\n const data = parse(content) as Record<string, unknown>;\n\n if (!data.name || typeof data.name !== 'string') {\n throw new Error('Workflow must have a name');\n }\n\n if (!data.waves || !Array.isArray(data.waves)) {\n throw new Error('Workflow must have waves array');\n }\n\n const waves: WorkflowWave[] = data.waves.map((wave: unknown, index: number) => {\n if (typeof wave !== 'object' || wave === null) {\n throw new Error(`Wave ${index} must be an object`);\n }\n\n const waveObj = wave as Record<string, unknown>;\n const skills = waveObj.skills;\n\n if (!skills || !Array.isArray(skills)) {\n throw new Error(`Wave ${index} must have skills array`);\n }\n\n return {\n name: waveObj.name as string | undefined,\n parallel: waveObj.parallel === true,\n skills: skills.map((s: unknown) => {\n if (typeof s === 'string') {\n return s;\n }\n if (typeof s === 'object' && s !== null) {\n const skillObj = s as Record<string, unknown>;\n return {\n skill: skillObj.skill as string,\n config: skillObj.config as Record<string, unknown> | undefined,\n condition: skillObj.condition as string | undefined,\n } as WorkflowSkill;\n }\n throw new Error(`Invalid skill in wave ${index}`);\n }),\n continueOnError: waveObj.continueOnError === true,\n };\n });\n\n return {\n name: data.name as string,\n description: data.description as string | undefined,\n version: data.version as string | undefined,\n author: data.author as string | undefined,\n tags: data.tags as string[] | undefined,\n waves,\n env: data.env as Record<string, string> | undefined,\n preHooks: data.preHooks as string[] | undefined,\n postHooks: data.postHooks as string[] | undefined,\n };\n}\n\n/**\n * Load a workflow from a file\n */\nexport function loadWorkflow(filePath: string): Workflow {\n if (!existsSync(filePath)) {\n throw new Error(`Workflow file not found: ${filePath}`);\n }\n\n const content = readFileSync(filePath, 'utf-8');\n return parseWorkflow(content);\n}\n\n/**\n * Load a workflow by name from the project's workflows directory\n */\nexport function loadWorkflowByName(projectPath: string, name: string): Workflow | null {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n return null;\n }\n\n // Try exact name match first\n const exactPath = join(workflowsDir, `${name}${WORKFLOW_EXTENSION}`);\n if (existsSync(exactPath)) {\n return loadWorkflow(exactPath);\n }\n\n // Try finding by workflow name property\n const files = readdirSync(workflowsDir).filter((f) => f.endsWith(WORKFLOW_EXTENSION));\n\n for (const file of files) {\n try {\n const workflow = loadWorkflow(join(workflowsDir, file));\n if (workflow.name === name) {\n return workflow;\n }\n } catch {\n // Skip invalid workflow files\n }\n }\n\n return null;\n}\n\n/**\n * List all workflows in a project\n */\nexport function listWorkflows(projectPath: string): Workflow[] {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n return [];\n }\n\n const files = readdirSync(workflowsDir).filter((f) => f.endsWith(WORKFLOW_EXTENSION));\n const workflows: Workflow[] = [];\n\n for (const file of files) {\n try {\n const workflow = loadWorkflow(join(workflowsDir, file));\n workflows.push(workflow);\n } catch {\n // Skip invalid workflow files\n }\n }\n\n return workflows;\n}\n\n/**\n * Save a workflow to a file\n */\nexport function saveWorkflow(projectPath: string, workflow: Workflow): string {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n mkdirSync(workflowsDir, { recursive: true });\n }\n\n const fileName = `${workflow.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}${WORKFLOW_EXTENSION}`;\n const filePath = join(workflowsDir, fileName);\n\n writeFileSync(filePath, stringify(workflow));\n\n return filePath;\n}\n\n/**\n * Serialize a workflow to YAML\n */\nexport function serializeWorkflow(workflow: Workflow): string {\n return stringify(workflow);\n}\n\n/**\n * Validate a workflow\n */\nexport function validateWorkflow(workflow: Workflow): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!workflow.name) {\n errors.push('Workflow must have a name');\n }\n\n if (!workflow.waves || workflow.waves.length === 0) {\n errors.push('Workflow must have at least one wave');\n }\n\n for (let i = 0; i < workflow.waves.length; i++) {\n const wave = workflow.waves[i];\n\n if (!wave.skills || wave.skills.length === 0) {\n errors.push(`Wave ${i + 1} must have at least one skill`);\n }\n\n for (let j = 0; j < wave.skills.length; j++) {\n const skill = wave.skills[j];\n const skillName = typeof skill === 'string' ? skill : skill.skill;\n\n if (!skillName) {\n errors.push(`Wave ${i + 1}, skill ${j + 1} must have a name`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Create a new workflow from a template\n */\nexport function createWorkflowTemplate(name: string, description?: string): Workflow {\n return {\n name,\n description: description || `Workflow: ${name}`,\n version: '1.0.0',\n waves: [\n {\n name: 'Setup',\n parallel: true,\n skills: [],\n },\n {\n name: 'Main',\n parallel: false,\n skills: [],\n },\n ],\n };\n}\n","/**\n * Workflow Orchestrator\n *\n * Executes workflows with wave-based orchestration.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type {\n Workflow,\n WorkflowWave,\n WorkflowSkill,\n WorkflowExecution,\n WorkflowExecutionStatus,\n} from './types.js';\n\n/**\n * Skill executor function type\n */\nexport type SkillExecutor = (\n skillName: string,\n config?: Record<string, unknown>\n) => Promise<{ success: boolean; error?: string }>;\n\n/**\n * Progress callback for workflow execution\n */\nexport type WorkflowProgressCallback = (event: {\n type: 'wave_start' | 'wave_complete' | 'skill_start' | 'skill_complete' | 'workflow_complete';\n waveIndex?: number;\n waveName?: string;\n skillName?: string;\n status?: WorkflowExecutionStatus;\n error?: string;\n}) => void;\n\n/**\n * Workflow Orchestrator\n *\n * Manages the execution of workflows with parallel/sequential waves.\n */\nexport class WorkflowOrchestrator {\n private execution: WorkflowExecution | null = null;\n private executor: SkillExecutor;\n private onProgress?: WorkflowProgressCallback;\n\n constructor(executor: SkillExecutor, onProgress?: WorkflowProgressCallback) {\n this.executor = executor;\n this.onProgress = onProgress;\n }\n\n /**\n * Get current execution state\n */\n getExecution(): WorkflowExecution | null {\n return this.execution;\n }\n\n /**\n * Execute a workflow\n */\n async execute(workflow: Workflow): Promise<WorkflowExecution> {\n // Initialize execution state\n this.execution = {\n workflow,\n executionId: randomUUID(),\n status: 'running',\n currentWave: 0,\n waves: workflow.waves.map((wave, index) => ({\n waveIndex: index,\n waveName: wave.name,\n status: 'pending',\n skills: wave.skills.map((s) => ({\n skill: typeof s === 'string' ? s : s.skill,\n status: 'pending' as WorkflowExecutionStatus,\n })),\n })),\n startedAt: new Date().toISOString(),\n };\n\n try {\n // Execute each wave\n for (let i = 0; i < workflow.waves.length; i++) {\n if (this.execution.status === 'cancelled' || this.execution.status === 'paused') {\n break;\n }\n\n this.execution.currentWave = i;\n await this.executeWave(workflow.waves[i], i);\n\n // Check if wave failed and should stop\n const waveStatus = this.execution.waves[i];\n if (waveStatus.status === 'failed' && !workflow.waves[i].continueOnError) {\n this.execution.status = 'failed';\n this.execution.error = `Wave ${i + 1} failed`;\n break;\n }\n }\n\n // Mark as completed if not already failed/cancelled/paused\n if (this.execution.status === 'running') {\n this.execution.status = 'completed';\n }\n\n this.execution.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'workflow_complete',\n status: this.execution.status,\n error: this.execution.error,\n });\n\n return this.execution;\n } catch (error) {\n this.execution.status = 'failed';\n this.execution.error = error instanceof Error ? error.message : String(error);\n this.execution.completedAt = new Date().toISOString();\n return this.execution;\n }\n }\n\n /**\n * Execute a single wave\n */\n private async executeWave(wave: WorkflowWave, waveIndex: number): Promise<void> {\n const waveStatus = this.execution!.waves[waveIndex];\n waveStatus.status = 'running';\n waveStatus.startedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'wave_start',\n waveIndex,\n waveName: wave.name,\n });\n\n const skills = wave.skills.map((s) => ({\n name: typeof s === 'string' ? s : s.skill,\n config: typeof s === 'string' ? undefined : (s as WorkflowSkill).config,\n }));\n\n if (wave.parallel) {\n // Execute skills in parallel\n await Promise.all(\n skills.map((skill, skillIndex) =>\n this.executeSkill(skill.name, skill.config, waveIndex, skillIndex)\n )\n );\n } else {\n // Execute skills sequentially\n for (let i = 0; i < skills.length; i++) {\n if (this.execution!.status === 'cancelled' || this.execution!.status === 'paused') {\n break;\n }\n\n await this.executeSkill(skills[i].name, skills[i].config, waveIndex, i);\n\n // Stop on first failure in sequential mode\n const skillStatus = waveStatus.skills[i];\n if (skillStatus.status === 'failed' && !wave.continueOnError) {\n break;\n }\n }\n }\n\n // Determine wave status based on skill statuses\n const hasFailures = waveStatus.skills.some((s) => s.status === 'failed');\n const allCompleted = waveStatus.skills.every(\n (s) => s.status === 'completed' || s.status === 'failed'\n );\n\n if (allCompleted) {\n waveStatus.status = hasFailures ? 'failed' : 'completed';\n }\n\n waveStatus.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'wave_complete',\n waveIndex,\n waveName: wave.name,\n status: waveStatus.status,\n });\n }\n\n /**\n * Execute a single skill\n */\n private async executeSkill(\n skillName: string,\n config: Record<string, unknown> | undefined,\n waveIndex: number,\n skillIndex: number\n ): Promise<void> {\n const skillStatus = this.execution!.waves[waveIndex].skills[skillIndex];\n skillStatus.status = 'running';\n skillStatus.startedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'skill_start',\n waveIndex,\n skillName,\n });\n\n try {\n const result = await this.executor(skillName, config);\n\n if (result.success) {\n skillStatus.status = 'completed';\n } else {\n skillStatus.status = 'failed';\n skillStatus.error = result.error;\n }\n } catch (error) {\n skillStatus.status = 'failed';\n skillStatus.error = error instanceof Error ? error.message : String(error);\n }\n\n skillStatus.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'skill_complete',\n waveIndex,\n skillName,\n status: skillStatus.status,\n error: skillStatus.error,\n });\n }\n\n /**\n * Pause execution\n */\n pause(): boolean {\n if (!this.execution || this.execution.status !== 'running') {\n return false;\n }\n\n this.execution.status = 'paused';\n return true;\n }\n\n /**\n * Check if execution should continue\n */\n private shouldContinue(): boolean {\n if (!this.execution) return false;\n return this.execution.status === 'running';\n }\n\n /**\n * Resume execution\n */\n async resume(): Promise<WorkflowExecution | null> {\n if (!this.execution || this.execution.status !== 'paused') {\n return null;\n }\n\n this.execution.status = 'running';\n\n // Continue from current wave\n const workflow = this.execution.workflow;\n for (let i = this.execution.currentWave; i < workflow.waves.length; i++) {\n if (!this.shouldContinue()) {\n break;\n }\n\n this.execution.currentWave = i;\n\n // Skip already completed waves\n if (this.execution.waves[i].status === 'completed') {\n continue;\n }\n\n await this.executeWave(workflow.waves[i], i);\n\n const waveStatus = this.execution.waves[i];\n if (waveStatus.status === 'failed' && !workflow.waves[i].continueOnError) {\n this.execution.status = 'failed';\n this.execution.error = `Wave ${i + 1} failed`;\n break;\n }\n }\n\n if (this.execution.status === 'running') {\n this.execution.status = 'completed';\n }\n\n this.execution.completedAt = new Date().toISOString();\n return this.execution;\n }\n\n /**\n * Cancel execution\n */\n cancel(): boolean {\n if (!this.execution || this.execution.status === 'completed' || this.execution.status === 'failed') {\n return false;\n }\n\n this.execution.status = 'cancelled';\n this.execution.completedAt = new Date().toISOString();\n return true;\n }\n}\n\n/**\n * Create a new workflow orchestrator\n */\nexport function createWorkflowOrchestrator(\n executor: SkillExecutor,\n onProgress?: WorkflowProgressCallback\n): WorkflowOrchestrator {\n return new WorkflowOrchestrator(executor, onProgress);\n}\n","/**\n * Skill Execution Engine\n *\n * Executes skills with task-based orchestration, verification, and state management.\n */\n\nimport { execSync } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport type {\n ExecutableSkill,\n ExecutableTask,\n ExecutionOptions,\n TaskExecutionResult,\n SkillExecutionResult,\n CheckpointHandler,\n CheckpointResponse,\n ExecutionTaskStatus,\n} from './types.js';\nimport { SessionManager } from '../session/manager.js';\nimport type { SessionTask } from '../session/types.js';\n\n/**\n * Progress event for execution\n */\nexport interface ExecutionProgressEvent {\n type: 'task_start' | 'task_complete' | 'checkpoint' | 'verification' | 'complete';\n taskId?: string;\n taskName?: string;\n taskIndex?: number;\n totalTasks?: number;\n status?: ExecutionTaskStatus | 'paused' | 'cancelled';\n message?: string;\n error?: string;\n}\n\n/**\n * Progress callback type\n */\nexport type ExecutionProgressCallback = (event: ExecutionProgressEvent) => void;\n\n/**\n * Skill Execution Engine\n */\nexport class SkillExecutionEngine {\n private projectPath: string;\n private sessionManager: SessionManager;\n private checkpointHandler?: CheckpointHandler;\n private onProgress?: ExecutionProgressCallback;\n\n constructor(\n projectPath: string,\n options?: {\n checkpointHandler?: CheckpointHandler;\n onProgress?: ExecutionProgressCallback;\n }\n ) {\n this.projectPath = projectPath;\n this.sessionManager = new SessionManager(projectPath);\n this.checkpointHandler = options?.checkpointHandler;\n this.onProgress = options?.onProgress;\n }\n\n /**\n * Execute a skill\n */\n async execute(\n skill: ExecutableSkill,\n options: ExecutionOptions = {}\n ): Promise<SkillExecutionResult> {\n const startTime = new Date();\n const tasks = skill.tasks || [];\n\n // Handle dry run\n if (options.dryRun) {\n return this.createDryRunResult(skill);\n }\n\n // Check if there's an existing paused execution for this skill\n const existingState = this.sessionManager.get();\n if (existingState?.currentExecution?.skillName === skill.name) {\n if (existingState.currentExecution.status === 'paused') {\n // Resume from paused state\n return this.resumeExecution(skill, options);\n }\n }\n\n // Start new execution\n const sessionTasks: Omit<SessionTask, 'status'>[] = tasks.map((task, index) => ({\n id: task.id || `task-${index}`,\n name: task.name,\n type: task.type === 'auto' ? 'auto' : task.type,\n }));\n\n this.sessionManager.startExecution(skill.name, skill.source, sessionTasks);\n\n const taskResults: TaskExecutionResult[] = [];\n let overallStatus: 'completed' | 'failed' | 'cancelled' | 'paused' = 'completed';\n let overallError: string | undefined;\n\n // Execute tasks\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n\n this.onProgress?.({\n type: 'task_start',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n // Handle checkpoints\n if (task.type !== 'auto') {\n const checkpointResult = await this.handleCheckpoint(task, {\n skillName: skill.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n if (!checkpointResult.continue) {\n overallStatus = 'paused';\n this.sessionManager.pause();\n break;\n }\n\n // For decision checkpoints, record the decision\n if (task.type === 'checkpoint:decision' && checkpointResult.selectedOption) {\n this.sessionManager.recordDecision(\n `${skill.name}:${task.id}`,\n checkpointResult.selectedOption,\n skill.name\n );\n }\n }\n\n // Execute the task\n const taskResult = await this.executeTask(task, skill, options);\n taskResults.push(taskResult);\n\n this.sessionManager.updateTask(task.id || `task-${i}`, {\n status: taskResult.status === 'completed' ? 'completed' : 'failed',\n output: taskResult.output,\n error: taskResult.error,\n filesModified: taskResult.filesModified,\n commitSha: taskResult.commitSha,\n });\n\n this.onProgress?.({\n type: 'task_complete',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n status: taskResult.status,\n error: taskResult.error,\n });\n\n // Handle task failure\n if (taskResult.status === 'failed') {\n if (!options.continueOnError) {\n overallStatus = 'failed';\n overallError = taskResult.error;\n break;\n }\n }\n\n // Run verification if enabled\n if (options.verify && task.verify) {\n const verificationPassed = await this.runVerification(task, taskResult);\n if (!verificationPassed && !options.continueOnError) {\n overallStatus = 'failed';\n overallError = 'Verification failed';\n break;\n }\n }\n }\n\n const endTime = new Date();\n\n // Complete the execution\n if (overallStatus !== 'paused') {\n this.sessionManager.completeExecution(overallStatus, overallError);\n }\n\n const result: SkillExecutionResult = {\n skillName: skill.name,\n skillSource: skill.source,\n status: overallStatus,\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n tasks: taskResults,\n filesModified: Array.from(new Set(taskResults.flatMap((t) => t.filesModified || []))),\n commits: taskResults.map((t) => t.commitSha).filter((sha): sha is string => !!sha),\n error: overallError,\n };\n\n const statusMessages: Record<'completed' | 'failed' | 'cancelled' | 'paused', string> = {\n completed: 'Skill execution completed',\n paused: 'Skill execution paused',\n failed: overallError || 'Skill execution failed',\n cancelled: 'Skill execution cancelled',\n };\n\n this.onProgress?.({\n type: 'complete',\n status: overallStatus,\n message: statusMessages[overallStatus],\n });\n\n return result;\n }\n\n /**\n * Resume a paused execution\n */\n private async resumeExecution(\n skill: ExecutableSkill,\n options: ExecutionOptions\n ): Promise<SkillExecutionResult> {\n const state = this.sessionManager.get();\n if (!state?.currentExecution) {\n throw new Error('No execution to resume');\n }\n\n this.sessionManager.resume();\n const execution = state.currentExecution;\n const tasks = skill.tasks || [];\n\n const taskResults: TaskExecutionResult[] = [];\n let overallStatus: 'completed' | 'failed' | 'cancelled' | 'paused' = 'completed';\n let overallError: string | undefined;\n\n // Find where to resume from\n const startIndex = execution.currentStep;\n\n for (let i = startIndex; i < tasks.length; i++) {\n const task = tasks[i];\n\n this.onProgress?.({\n type: 'task_start',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n // Handle checkpoints (same as in execute)\n if (task.type !== 'auto') {\n const checkpointResult = await this.handleCheckpoint(task, {\n skillName: skill.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n if (!checkpointResult.continue) {\n overallStatus = 'paused';\n this.sessionManager.pause();\n break;\n }\n\n // For decision checkpoints, record the decision\n if (task.type === 'checkpoint:decision' && checkpointResult.selectedOption) {\n this.sessionManager.recordDecision(\n `${skill.name}:${task.id}`,\n checkpointResult.selectedOption,\n skill.name\n );\n }\n }\n\n const taskResult = await this.executeTask(task, skill, options);\n taskResults.push(taskResult);\n\n this.sessionManager.updateTask(task.id || `task-${i}`, {\n status: taskResult.status === 'completed' ? 'completed' : 'failed',\n output: taskResult.output,\n error: taskResult.error,\n filesModified: taskResult.filesModified,\n commitSha: taskResult.commitSha,\n });\n\n // Emit task_complete progress event (matching execute behavior)\n this.onProgress?.({\n type: 'task_complete',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n status: taskResult.status,\n error: taskResult.error,\n });\n\n // Handle task failure\n if (taskResult.status === 'failed') {\n if (!options.continueOnError) {\n overallStatus = 'failed';\n overallError = taskResult.error;\n break;\n }\n }\n\n // Run verification if enabled (matching execute behavior)\n if (options.verify && task.verify) {\n const verificationPassed = await this.runVerification(task, taskResult);\n if (!verificationPassed && !options.continueOnError) {\n overallStatus = 'failed';\n overallError = 'Verification failed';\n break;\n }\n }\n }\n\n // Only complete execution if not paused\n if (overallStatus !== 'paused') {\n this.sessionManager.completeExecution(overallStatus, overallError);\n }\n\n return {\n skillName: skill.name,\n skillSource: skill.source,\n status: overallStatus,\n startedAt: execution.startedAt,\n completedAt: new Date().toISOString(),\n durationMs: Date.now() - new Date(execution.startedAt).getTime(),\n tasks: taskResults,\n filesModified: Array.from(new Set(taskResults.flatMap((t) => t.filesModified || []))),\n commits: taskResults.map((t) => t.commitSha).filter((sha): sha is string => !!sha),\n error: overallError,\n };\n }\n\n /**\n * Execute a single task\n */\n private async executeTask(\n task: ExecutableTask,\n _skill: ExecutableSkill,\n _options: ExecutionOptions\n ): Promise<TaskExecutionResult> {\n const startTime = new Date();\n const taskId = task.id || randomUUID();\n\n try {\n // For now, we simulate task execution\n // In a real implementation, this would integrate with the AI agent\n // to execute the task action based on the skill content\n\n // Simulate some work\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n const endTime = new Date();\n\n return {\n taskId,\n taskName: task.name,\n status: 'completed',\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n output: `Task \"${task.name}\" completed successfully`,\n filesModified: task.files,\n };\n } catch (error) {\n const endTime = new Date();\n\n return {\n taskId,\n taskName: task.name,\n status: 'failed',\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Handle a checkpoint\n */\n private async handleCheckpoint(\n task: ExecutableTask,\n context: { skillName: string; taskIndex: number; totalTasks: number }\n ): Promise<CheckpointResponse> {\n this.onProgress?.({\n type: 'checkpoint',\n taskId: task.id,\n taskName: task.name,\n taskIndex: context.taskIndex,\n totalTasks: context.totalTasks,\n message: `Checkpoint: ${task.type}`,\n });\n\n if (this.checkpointHandler) {\n return this.checkpointHandler(task, context);\n }\n\n // Default: auto-continue for non-decision checkpoints\n if (task.type === 'checkpoint:decision') {\n // Use first option if no handler\n return {\n continue: true,\n selectedOption: task.options?.[0],\n };\n }\n\n return { continue: true };\n }\n\n /**\n * Check if a regex pattern is potentially dangerous (ReDoS-vulnerable)\n * Rejects patterns with nested quantifiers and other known problematic constructs\n */\n private isUnsafeRegexPattern(pattern: string): boolean {\n // Detect nested quantifiers like (a+)+, (a*)+, (a+)*, (a*)*\n // These are the primary cause of catastrophic backtracking\n const nestedQuantifierPattern = /\\([^)]*[+*][^)]*\\)[+*?]/;\n if (nestedQuantifierPattern.test(pattern)) {\n return true;\n }\n\n // Detect overlapping alternations with quantifiers like (a|a)+\n const overlappingAlternation = /\\([^|)]*\\|[^|)]*\\)[+*]/;\n if (overlappingAlternation.test(pattern)) {\n return true;\n }\n\n // Detect excessive quantifiers (more than 3 quantifiers in a row-ish)\n const quantifierCount = (pattern.match(/[+*?]|\\{\\d+/g) || []).length;\n if (quantifierCount > 10) {\n return true;\n }\n\n // Detect very long character classes which can be slow\n const longCharClass = /\\[[^\\]]{50,}\\]/;\n if (longCharClass.test(pattern)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Safely test a regex pattern with ReDoS prevention\n *\n * This method validates patterns before execution to prevent catastrophic backtracking.\n * Note: This cannot guarantee protection against all ReDoS patterns, but catches common ones.\n */\n private safeRegexTest(pattern: string, input: string, _timeoutMs = 1000): boolean {\n // Strict length limits to prevent excessive processing\n if (pattern.length > 200 || input.length > 50000) {\n console.warn(`Regex test skipped: pattern or input too long`);\n return false;\n }\n\n // Reject patterns known to cause ReDoS\n if (this.isUnsafeRegexPattern(pattern)) {\n console.warn(`Regex pattern rejected as potentially unsafe: ${pattern.slice(0, 50)}...`);\n return false;\n }\n\n try {\n const regex = new RegExp(pattern);\n return regex.test(input);\n } catch {\n // Invalid regex pattern\n return false;\n }\n }\n\n /**\n * Run verification for a task\n *\n * SECURITY NOTE: Verification commands are executed from skill configuration.\n * Only run skills from trusted sources. Commands run with the same privileges\n * as the skillkit process.\n */\n private async runVerification(\n task: ExecutableTask,\n result: TaskExecutionResult\n ): Promise<boolean> {\n if (!task.verify) {\n return true;\n }\n\n const verificationResults = {\n automated: [] as { rule: string; passed: boolean; output?: string }[],\n human: [] as { description: string; passed: boolean }[],\n };\n\n // Run automated verification\n if (task.verify.automated) {\n for (const rule of task.verify.automated) {\n if (rule.command) {\n try {\n // SECURITY: Commands are from skill config - only run trusted skills\n const output = execSync(rule.command, {\n cwd: this.projectPath,\n encoding: 'utf-8',\n timeout: 30000,\n });\n\n let passed = true;\n if (rule.expect) {\n if (rule.expect === 'success') {\n passed = true;\n } else if (rule.expect.startsWith('contains:')) {\n const expected = rule.expect.slice(9);\n passed = output.includes(expected);\n } else if (rule.expect.startsWith('matches:')) {\n const pattern = rule.expect.slice(8);\n // Use safe regex test to prevent ReDoS\n passed = this.safeRegexTest(pattern, output);\n }\n }\n\n verificationResults.automated.push({\n rule: rule.command,\n passed,\n output,\n });\n\n this.onProgress?.({\n type: 'verification',\n taskId: task.id,\n taskName: task.name,\n message: `Verification ${passed ? 'passed' : 'failed'}: ${rule.command}`,\n });\n\n if (!passed) {\n return false;\n }\n } catch (error) {\n verificationResults.automated.push({\n rule: rule.command,\n passed: false,\n output: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n }\n }\n }\n\n // Human verification would be handled by checkpoint handler\n result.verificationResults = verificationResults;\n return true;\n }\n\n /**\n * Create a dry run result\n */\n private createDryRunResult(skill: ExecutableSkill): SkillExecutionResult {\n const tasks = skill.tasks || [];\n\n return {\n skillName: skill.name,\n skillSource: skill.source,\n status: 'completed',\n startedAt: new Date().toISOString(),\n completedAt: new Date().toISOString(),\n durationMs: 0,\n tasks: tasks.map((task) => ({\n taskId: task.id || randomUUID(),\n taskName: task.name,\n status: 'skipped' as ExecutionTaskStatus,\n startedAt: new Date().toISOString(),\n completedAt: new Date().toISOString(),\n durationMs: 0,\n output: '[Dry run - not executed]',\n })),\n filesModified: [],\n commits: [],\n };\n }\n\n /**\n * Pause current execution\n */\n pause(): boolean {\n return this.sessionManager.pause();\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n return this.sessionManager.isPaused();\n }\n\n /**\n * Get session manager\n */\n getSessionManager(): SessionManager {\n return this.sessionManager;\n }\n}\n\n/**\n * Create a new skill execution engine\n */\nexport function createExecutionEngine(\n projectPath: string,\n options?: {\n checkpointHandler?: CheckpointHandler;\n onProgress?: ExecutionProgressCallback;\n }\n): SkillExecutionEngine {\n return new SkillExecutionEngine(projectPath, options);\n}\n","/**\n * Agent Execution Module\n *\n * Handles real execution of skills through various AI agent CLIs.\n */\n\nimport { spawn, type SpawnOptions } from 'node:child_process';\nimport type { AgentType } from '../types.js';\n\n/**\n * Agent CLI configuration\n */\nexport interface AgentCLIConfig {\n /** Agent type */\n type: AgentType;\n /** CLI command name */\n command: string;\n /** Whether the agent supports CLI execution */\n supportsCLI: boolean;\n /** Arguments to pass the prompt/skill content */\n promptArgs?: string[];\n /** Arguments for non-interactive mode */\n nonInteractiveArgs?: string[];\n /** Environment variables needed */\n envVars?: Record<string, string>;\n /** How to check if agent is installed */\n checkCommand?: string;\n}\n\n/**\n * Execution result from an agent\n */\nexport interface AgentExecutionResult {\n success: boolean;\n output: string;\n error?: string;\n exitCode: number;\n duration: number;\n}\n\n/**\n * Agent CLI configurations\n */\nexport const AGENT_CLI_CONFIGS: AgentCLIConfig[] = [\n {\n type: 'claude-code',\n command: 'claude',\n supportsCLI: true,\n promptArgs: ['--print', '-p'],\n nonInteractiveArgs: ['--no-input'],\n checkCommand: 'claude --version',\n },\n {\n type: 'codex',\n command: 'codex',\n supportsCLI: true,\n promptArgs: ['-p'],\n checkCommand: 'codex --version',\n },\n {\n type: 'gemini-cli',\n command: 'gemini',\n supportsCLI: true,\n promptArgs: [],\n checkCommand: 'gemini --version',\n },\n {\n type: 'opencode',\n command: 'opencode',\n supportsCLI: true,\n promptArgs: ['--prompt'],\n checkCommand: 'opencode --version',\n },\n {\n type: 'goose',\n command: 'goose',\n supportsCLI: true,\n promptArgs: ['run'],\n checkCommand: 'goose --version',\n },\n // IDE-based agents (no CLI execution)\n {\n type: 'cursor',\n command: 'cursor',\n supportsCLI: false,\n },\n {\n type: 'windsurf',\n command: 'windsurf',\n supportsCLI: false,\n },\n {\n type: 'github-copilot',\n command: 'gh copilot',\n supportsCLI: false,\n },\n];\n\n/**\n * Get CLI config for an agent\n */\nexport function getAgentCLIConfig(agentType: AgentType): AgentCLIConfig | undefined {\n return AGENT_CLI_CONFIGS.find((c) => c.type === agentType);\n}\n\n/**\n * Check if an agent CLI is available\n */\nexport async function isAgentCLIAvailable(agentType: AgentType): Promise<boolean> {\n const config = getAgentCLIConfig(agentType);\n if (!config || !config.supportsCLI) return false;\n\n try {\n // Check if command exists\n const checkCmd = config.checkCommand || `which ${config.command}`;\n const result = await executeCommand(checkCmd.split(' ')[0], checkCmd.split(' ').slice(1), {\n timeout: 5000,\n });\n return result.exitCode === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Get all available CLI agents\n */\nexport async function getAvailableCLIAgents(): Promise<AgentType[]> {\n const available: AgentType[] = [];\n\n for (const config of AGENT_CLI_CONFIGS) {\n if (config.supportsCLI && (await isAgentCLIAvailable(config.type))) {\n available.push(config.type);\n }\n }\n\n return available;\n}\n\n/**\n * Execute a skill using an agent CLI\n */\nexport async function executeWithAgent(\n agentType: AgentType,\n prompt: string,\n options: {\n cwd?: string;\n timeout?: number;\n env?: Record<string, string>;\n } = {}\n): Promise<AgentExecutionResult> {\n const config = getAgentCLIConfig(agentType);\n\n if (!config) {\n return {\n success: false,\n output: '',\n error: `Unknown agent type: ${agentType}`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n if (!config.supportsCLI) {\n return {\n success: false,\n output: '',\n error: `Agent ${agentType} does not support CLI execution. Please use IDE integration.`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n const isAvailable = await isAgentCLIAvailable(agentType);\n if (!isAvailable) {\n return {\n success: false,\n output: '',\n error: `Agent CLI '${config.command}' is not installed or not in PATH`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n // Build command arguments\n const args: string[] = [...(config.promptArgs || [])];\n\n // For Claude Code, use --print mode with the prompt\n if (agentType === 'claude-code') {\n args.push(prompt);\n } else {\n // For other agents, pass prompt as argument\n args.push(prompt);\n }\n\n // Add non-interactive flags if available\n if (config.nonInteractiveArgs) {\n args.push(...config.nonInteractiveArgs);\n }\n\n return executeCommand(config.command, args, {\n cwd: options.cwd || process.cwd(),\n timeout: options.timeout || 300000, // 5 minutes default\n env: {\n ...process.env,\n ...config.envVars,\n ...options.env,\n },\n });\n}\n\n/**\n * Execute a command and capture output\n */\nasync function executeCommand(\n command: string,\n args: string[],\n options: {\n cwd?: string;\n timeout?: number;\n env?: NodeJS.ProcessEnv;\n } = {}\n): Promise<AgentExecutionResult> {\n return new Promise((resolve) => {\n const startTime = Date.now();\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const spawnOptions: SpawnOptions = {\n cwd: options.cwd,\n env: options.env as NodeJS.ProcessEnv,\n // shell: false (default) - prevents shell injection when passing untrusted input\n };\n\n const child = spawn(command, args, spawnOptions);\n\n // Set up timeout\n const timeoutId = options.timeout\n ? setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeout)\n : null;\n\n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('error', (error) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve({\n success: false,\n output: stdout,\n error: error.message,\n exitCode: 1,\n duration: Date.now() - startTime,\n });\n });\n\n child.on('close', (code) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve({\n success: code === 0 && !timedOut,\n output: stdout,\n error: timedOut ? 'Execution timed out' : stderr || undefined,\n exitCode: code ?? 1,\n duration: Date.now() - startTime,\n });\n });\n });\n}\n\n/**\n * Format skill content as a prompt for an agent\n */\nexport function formatSkillAsPrompt(\n skillName: string,\n skillContent: string,\n taskDescription?: string\n): string {\n let prompt = `Execute the following skill: ${skillName}\\n\\n`;\n\n if (taskDescription) {\n prompt += `Task: ${taskDescription}\\n\\n`;\n }\n\n prompt += `Skill Content:\\n${skillContent}`;\n\n return prompt;\n}\n\n/**\n * Agent execution strategy\n */\nexport type ExecutionStrategy = 'cli' | 'ide' | 'api' | 'manual';\n\n/**\n * Get recommended execution strategy for an agent\n */\nexport function getExecutionStrategy(agentType: AgentType): ExecutionStrategy {\n const config = getAgentCLIConfig(agentType);\n\n if (config?.supportsCLI) {\n return 'cli';\n }\n\n // IDE-based agents\n if (['cursor', 'windsurf', 'github-copilot', 'kilo'].includes(agentType)) {\n return 'ide';\n }\n\n return 'manual';\n}\n\n/**\n * Get instructions for manual/IDE execution\n */\nexport function getManualExecutionInstructions(\n agentType: AgentType,\n skillPath: string\n): string {\n const strategy = getExecutionStrategy(agentType);\n\n if (strategy === 'ide') {\n return `\nTo execute this skill with ${agentType}:\n1. Open your project in ${agentType}\n2. The skill has been synced to the agent's skills directory\n3. Open the AI assistant/chat\n4. Reference the skill or ask the assistant to follow the instructions\n\nSkill location: ${skillPath}\n`;\n }\n\n return `\nTo execute this skill manually:\n1. Open the skill file: ${skillPath}\n2. Copy the skill content\n3. Paste it into your AI coding assistant\n4. Follow the instructions in the skill\n`;\n}\n","/**\n * Skill Test Runner\n *\n * Executes test suites and assertions for skill verification.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { exec } from 'node:child_process';\nimport { createServer } from 'node:net';\nimport { promisify } from 'node:util';\nimport { parse as parseYaml } from 'yaml';\nimport type {\n TestAssertion,\n AssertionResult,\n SkillTestCase,\n TestCaseResult,\n SkillTestSuite,\n TestSuiteResult,\n TestRunnerOptions,\n} from './types.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Default timeout for assertions (30 seconds)\n */\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * Run a single assertion\n */\nasync function runAssertion(\n assertion: TestAssertion,\n cwd: string,\n timeout: number\n): Promise<AssertionResult> {\n const startTime = Date.now();\n\n try {\n switch (assertion.type) {\n case 'file_exists':\n return assertFileExists(assertion, cwd, startTime);\n\n case 'file_not_exists':\n return assertFileNotExists(assertion, cwd, startTime);\n\n case 'file_contains':\n return assertFileContains(assertion, cwd, startTime);\n\n case 'file_not_contains':\n return assertFileNotContains(assertion, cwd, startTime);\n\n case 'file_matches':\n return assertFileMatches(assertion, cwd, startTime);\n\n case 'command_succeeds':\n return assertCommandSucceeds(assertion, cwd, timeout, startTime);\n\n case 'command_fails':\n return assertCommandFails(assertion, cwd, timeout, startTime);\n\n case 'command_output_contains':\n return assertCommandOutputContains(assertion, cwd, timeout, startTime);\n\n case 'json_valid':\n return assertJsonValid(assertion, cwd, startTime);\n\n case 'json_has_key':\n return assertJsonHasKey(assertion, cwd, startTime);\n\n case 'yaml_valid':\n return assertYamlValid(assertion, cwd, startTime);\n\n case 'type_check':\n return assertTypeCheck(cwd, timeout, startTime);\n\n case 'lint_passes':\n return assertLintPasses(cwd, timeout, startTime);\n\n case 'test_passes':\n return assertTestPasses(cwd, timeout, startTime);\n\n case 'env_var_set':\n return assertEnvVarSet(assertion, startTime);\n\n case 'port_available':\n return assertPortAvailable(assertion, startTime);\n\n case 'url_responds':\n return assertUrlResponds(assertion, timeout, startTime);\n\n case 'custom':\n return assertCustom(assertion, cwd, timeout, startTime);\n\n default:\n return {\n assertion,\n passed: false,\n error: `Unknown assertion type: ${assertion.type}`,\n duration: Date.now() - startTime,\n };\n }\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\n// Assertion implementations\n\nfunction assertFileExists(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n const exists = existsSync(filePath);\n\n return {\n assertion,\n passed: exists,\n actual: exists ? 'exists' : 'not found',\n expected: 'exists',\n error: exists ? undefined : `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileNotExists(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n const exists = existsSync(filePath);\n\n return {\n assertion,\n passed: !exists,\n actual: exists ? 'exists' : 'not found',\n expected: 'not found',\n error: !exists ? undefined : `File should not exist: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileContains(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const expected = String(assertion.expected || '');\n const contains = content.includes(expected);\n\n return {\n assertion,\n passed: contains,\n actual: contains ? 'contains' : 'not found in file',\n expected: `contains \"${expected}\"`,\n error: contains ? undefined : `File does not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileNotContains(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: true, // File doesn't exist, so it doesn't contain the text\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const expected = String(assertion.expected || '');\n const contains = content.includes(expected);\n\n return {\n assertion,\n passed: !contains,\n actual: contains ? 'found in file' : 'not found',\n expected: `does not contain \"${expected}\"`,\n error: !contains ? undefined : `File should not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileMatches(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const pattern = new RegExp(String(assertion.expected || ''));\n const matches = pattern.test(content);\n\n return {\n assertion,\n passed: matches,\n actual: matches ? 'matches' : 'no match',\n expected: `matches /${assertion.expected}/`,\n error: matches ? undefined : `File does not match pattern: ${assertion.expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertCommandSucceeds(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: true,\n actual: 'exit code 0',\n expected: 'exit code 0',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'non-zero exit code',\n expected: 'exit code 0',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCommandFails(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: false,\n actual: 'exit code 0',\n expected: 'non-zero exit code',\n error: 'Command should have failed but succeeded',\n duration: Date.now() - startTime,\n };\n } catch {\n return {\n assertion,\n passed: true,\n actual: 'non-zero exit code',\n expected: 'non-zero exit code',\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCommandOutputContains(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n const { stdout, stderr } = await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n const output = stdout + stderr;\n const expected = String(assertion.expected || '');\n const contains = output.includes(expected);\n\n return {\n assertion,\n passed: contains,\n actual: contains ? 'found in output' : 'not found',\n expected: `contains \"${expected}\"`,\n error: contains ? undefined : `Command output does not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertJsonValid(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n JSON.parse(content);\n\n return {\n assertion,\n passed: true,\n actual: 'valid JSON',\n expected: 'valid JSON',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'invalid JSON',\n expected: 'valid JSON',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertJsonHasKey(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const json = JSON.parse(content);\n const key = String(assertion.expected || '');\n const keys = key.split('.');\n\n let value = json;\n for (const k of keys) {\n if (value === undefined || value === null || !(k in value)) {\n return {\n assertion,\n passed: false,\n actual: 'key not found',\n expected: `has key \"${key}\"`,\n error: `JSON does not have key: ${key}`,\n duration: Date.now() - startTime,\n };\n }\n value = value[k];\n }\n\n return {\n assertion,\n passed: true,\n actual: 'key found',\n expected: `has key \"${key}\"`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertYamlValid(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n parseYaml(content);\n\n return {\n assertion,\n passed: true,\n actual: 'valid YAML',\n expected: 'valid YAML',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'invalid YAML',\n expected: 'valid YAML',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertTypeCheck(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'type_check' };\n\n // Try various type check commands\n const commands = [\n 'npx tsc --noEmit',\n 'pnpm tsc --noEmit',\n 'yarn tsc --noEmit',\n 'npm run type-check',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'types valid',\n expected: 'types valid',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'type errors',\n expected: 'types valid',\n error: 'Type check failed or TypeScript not configured',\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertLintPasses(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'lint_passes' };\n\n // Try various lint commands\n const commands = [\n 'npx eslint . --max-warnings=0',\n 'pnpm eslint . --max-warnings=0',\n 'npm run lint',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'lint passes',\n expected: 'lint passes',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'lint errors',\n expected: 'lint passes',\n error: 'Lint check failed or ESLint not configured',\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertTestPasses(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'test_passes' };\n\n // Try various test commands\n const commands = [\n 'npm test',\n 'pnpm test',\n 'yarn test',\n 'npx vitest run',\n 'npx jest',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'tests pass',\n expected: 'tests pass',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'tests fail',\n expected: 'tests pass',\n error: 'Tests failed or test framework not configured',\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertEnvVarSet(\n assertion: TestAssertion,\n startTime: number\n): AssertionResult {\n const varName = assertion.target || '';\n const isSet = process.env[varName] !== undefined;\n\n return {\n assertion,\n passed: isSet,\n actual: isSet ? 'set' : 'not set',\n expected: 'set',\n error: isSet ? undefined : `Environment variable not set: ${varName}`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function checkPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close();\n resolve(true);\n });\n server.listen(port, '127.0.0.1');\n });\n}\n\nasync function assertPortAvailable(\n assertion: TestAssertion,\n startTime: number\n): Promise<AssertionResult> {\n const port = parseInt(assertion.target || '0', 10);\n\n if (port <= 0 || port > 65535) {\n return {\n assertion,\n passed: false,\n actual: `invalid port ${port}`,\n expected: 'valid port number (1-65535)',\n error: 'Invalid port number',\n duration: Date.now() - startTime,\n };\n }\n\n const isAvailable = await checkPortAvailable(port);\n\n return {\n assertion,\n passed: isAvailable,\n actual: isAvailable ? 'available' : 'in use',\n expected: 'available',\n error: isAvailable ? undefined : `Port ${port} is already in use`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertUrlResponds(\n assertion: TestAssertion,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const url = assertion.target || '';\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), assertion.timeout || timeout);\n\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n const responds = response.ok;\n\n return {\n assertion,\n passed: responds,\n actual: `status ${response.status}`,\n expected: 'status 2xx',\n error: responds ? undefined : `URL returned status ${response.status}`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCustom(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n if (!assertion.command) {\n return {\n assertion,\n passed: false,\n error: 'Custom assertion requires a command',\n duration: Date.now() - startTime,\n };\n }\n\n try {\n await execAsync(assertion.command, {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: true,\n actual: 'command succeeded',\n expected: 'command succeeds',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'command failed',\n expected: 'command succeeds',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Run a single test case\n */\nasync function runTestCase(\n testCase: SkillTestCase,\n cwd: string,\n options: TestRunnerOptions\n): Promise<TestCaseResult> {\n const startTime = Date.now();\n const timeout = testCase.assertions[0]?.timeout || options.timeout || DEFAULT_TIMEOUT;\n\n // Check if test should be skipped\n if (testCase.skip) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n\n // Check tag filters - if tags are specified, only run tests with matching tags\n if (options.tags && options.tags.length > 0) {\n // Tests without tags should be skipped when tag filter is active\n if (!testCase.tags || testCase.tags.length === 0) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n const hasRequiredTag = options.tags.some((t) => testCase.tags?.includes(t));\n if (!hasRequiredTag) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n }\n\n if (options.skipTags && testCase.tags) {\n const hasSkipTag = options.skipTags.some((t) => testCase.tags?.includes(t));\n if (hasSkipTag) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n }\n\n // Run setup commands\n let setupError: string | undefined;\n if (testCase.setup) {\n for (const cmd of testCase.setup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n setupError = error instanceof Error ? error.message : String(error);\n break;\n }\n }\n }\n\n if (setupError) {\n return {\n testCase,\n passed: false,\n assertions: [],\n setupError,\n duration: Date.now() - startTime,\n skipped: false,\n };\n }\n\n // Run assertions\n const assertionResults: AssertionResult[] = [];\n let allPassed = true;\n\n for (const assertion of testCase.assertions) {\n options.onProgress?.({\n type: 'assertion_start',\n testName: testCase.name,\n assertionType: assertion.type,\n });\n\n const result = await runAssertion(assertion, cwd, timeout);\n assertionResults.push(result);\n\n options.onProgress?.({\n type: 'assertion_end',\n testName: testCase.name,\n assertionType: assertion.type,\n passed: result.passed,\n error: result.error,\n });\n\n if (!result.passed) {\n allPassed = false;\n if (options.bail) {\n break;\n }\n }\n }\n\n // Run cleanup commands\n let cleanupError: string | undefined;\n if (testCase.cleanup) {\n for (const cmd of testCase.cleanup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n cleanupError = error instanceof Error ? error.message : String(error);\n }\n }\n }\n\n return {\n testCase,\n passed: allPassed,\n assertions: assertionResults,\n cleanupError,\n duration: Date.now() - startTime,\n skipped: false,\n };\n}\n\n/**\n * Run a test suite\n */\nexport async function runTestSuite(\n suite: SkillTestSuite,\n options: TestRunnerOptions = {}\n): Promise<TestSuiteResult> {\n const startTime = Date.now();\n const cwd = options.cwd || process.cwd();\n const timeout = suite.defaultTimeout || options.timeout || DEFAULT_TIMEOUT;\n\n options.onProgress?.({\n type: 'suite_start',\n skillName: suite.skillName,\n });\n\n // Run global setup\n let globalSetupError: string | undefined;\n if (suite.globalSetup) {\n for (const cmd of suite.globalSetup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n globalSetupError = error instanceof Error ? error.message : String(error);\n break;\n }\n }\n }\n\n if (globalSetupError) {\n return {\n skillName: suite.skillName,\n passed: false,\n tests: [],\n passedCount: 0,\n failedCount: 0,\n skippedCount: 0,\n duration: Date.now() - startTime,\n globalSetupError,\n };\n }\n\n // Check for 'only' tests\n const hasOnly = suite.tests.some((t) => t.only);\n const testsToRun = hasOnly ? suite.tests.filter((t) => t.only) : suite.tests;\n\n // Run tests\n const testResults: TestCaseResult[] = [];\n let passedCount = 0;\n let failedCount = 0;\n let skippedCount = 0;\n\n for (const testCase of testsToRun) {\n options.onProgress?.({\n type: 'test_start',\n skillName: suite.skillName,\n testName: testCase.name,\n });\n\n const result = await runTestCase(testCase, cwd, { ...options, timeout });\n testResults.push(result);\n\n if (result.skipped) {\n skippedCount++;\n } else if (result.passed) {\n passedCount++;\n } else {\n failedCount++;\n }\n\n options.onProgress?.({\n type: 'test_end',\n skillName: suite.skillName,\n testName: testCase.name,\n passed: result.passed,\n error: result.assertions.find((a) => !a.passed)?.error,\n });\n\n if (!result.passed && options.bail) {\n break;\n }\n }\n\n // Run global cleanup\n let globalCleanupError: string | undefined;\n if (suite.globalCleanup) {\n for (const cmd of suite.globalCleanup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n globalCleanupError = error instanceof Error ? error.message : String(error);\n }\n }\n }\n\n const result: TestSuiteResult = {\n skillName: suite.skillName,\n passed: failedCount === 0,\n tests: testResults,\n passedCount,\n failedCount,\n skippedCount,\n duration: Date.now() - startTime,\n globalCleanupError,\n };\n\n options.onProgress?.({\n type: 'suite_end',\n skillName: suite.skillName,\n passed: result.passed,\n });\n\n return result;\n}\n\n/**\n * Create a test suite from skill frontmatter\n */\nexport function createTestSuiteFromFrontmatter(\n skillName: string,\n frontmatter: Record<string, unknown>\n): SkillTestSuite | null {\n const tests = frontmatter.tests;\n\n if (!tests || !Array.isArray(tests)) {\n return null;\n }\n\n const testCases: SkillTestCase[] = tests.map((t: Record<string, unknown>) => ({\n name: String(t.name || 'Unnamed test'),\n description: t.description as string | undefined,\n assertions: parseAssertions(t.assertions || t.assert),\n setup: t.setup as string[] | undefined,\n cleanup: t.cleanup as string[] | undefined,\n skip: t.skip === true,\n only: t.only === true,\n tags: t.tags as string[] | undefined,\n }));\n\n return {\n skillName,\n tests: testCases,\n globalSetup: frontmatter.globalSetup as string[] | undefined,\n globalCleanup: frontmatter.globalCleanup as string[] | undefined,\n defaultTimeout: frontmatter.testTimeout as number | undefined,\n };\n}\n\n/**\n * Parse assertions from various formats\n */\nfunction parseAssertions(assertions: unknown): TestAssertion[] {\n if (!assertions) return [];\n\n if (typeof assertions === 'string') {\n // Simple string assertion like \"file_exists: config.json\"\n return [parseAssertionString(assertions)];\n }\n\n if (Array.isArray(assertions)) {\n return assertions.map((a) => {\n if (typeof a === 'string') {\n return parseAssertionString(a);\n }\n return a as TestAssertion;\n });\n }\n\n return [assertions as TestAssertion];\n}\n\n/**\n * Parse a string assertion\n */\nfunction parseAssertionString(str: string): TestAssertion {\n // Format: \"type: target\" or \"type: target = expected\"\n const match = str.match(/^(\\w+):\\s*(.+?)(?:\\s*=\\s*(.+))?$/);\n\n if (match) {\n return {\n type: match[1] as TestAssertion['type'],\n target: match[2].trim(),\n expected: match[3]?.trim(),\n };\n }\n\n // Fallback: treat as command\n return {\n type: 'command_succeeds',\n target: str,\n };\n}\n","/**\n * Skill Marketplace Types\n *\n * Types for the aggregated skill marketplace.\n */\n\n/**\n * Skill source repository\n */\nexport interface SkillSource {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Whether this is an official source */\n official?: boolean;\n /** Branch to fetch from */\n branch?: string;\n /** Path to skills index file */\n indexPath?: string;\n}\n\n/**\n * Skill entry in the marketplace\n */\nexport interface MarketplaceSkill {\n /** Unique identifier (owner/repo/path) */\n id: string;\n /** Skill name */\n name: string;\n /** Description */\n description: string;\n /** Source repository */\n source: SkillSource;\n /** Path within the repository */\n path: string;\n /** Version if available */\n version?: string;\n /** Author */\n author?: string;\n /** Tags for categorization */\n tags: string[];\n /** Supported agents */\n agents?: string[];\n /** GitHub stars (if available) */\n stars?: number;\n /** Last updated date */\n updatedAt?: string;\n /** Download/install count */\n downloads?: number;\n /** Raw content URL */\n rawUrl?: string;\n}\n\n/**\n * Marketplace index (cached locally)\n */\nexport interface MarketplaceIndex {\n /** Index version */\n version: number;\n /** When the index was last updated */\n updatedAt: string;\n /** Sources included in this index */\n sources: SkillSource[];\n /** All skills in the index */\n skills: MarketplaceSkill[];\n /** Total skill count */\n totalCount: number;\n}\n\n/**\n * Search options for the marketplace\n */\nexport interface MarketplaceSearchOptions {\n /** Search query */\n query?: string;\n /** Filter by tags */\n tags?: string[];\n /** Filter by source */\n source?: string;\n /** Filter by agent compatibility */\n agent?: string;\n /** Sort by field */\n sortBy?: 'name' | 'stars' | 'downloads' | 'updatedAt';\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n /** Limit results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n}\n\n/**\n * Search result\n */\nexport interface MarketplaceSearchResult {\n /** Matching skills */\n skills: MarketplaceSkill[];\n /** Total matches (before limit) */\n total: number;\n /** Query that was searched */\n query?: string;\n}\n\n/**\n * Marketplace configuration\n */\nexport interface MarketplaceConfig {\n /** Custom sources to include */\n sources?: SkillSource[];\n /** Cache directory */\n cacheDir?: string;\n /** Cache TTL in milliseconds */\n cacheTTL?: number;\n /** GitHub token for API access */\n githubToken?: string;\n}\n\n/**\n * Default skill sources\n */\nexport const DEFAULT_SKILL_SOURCES: SkillSource[] = [\n {\n owner: 'composioHQ',\n repo: 'awesome-claude-code-skills',\n name: 'Composio Curated',\n description: 'Curated collection of Claude Code skills',\n official: false,\n branch: 'main',\n },\n {\n owner: 'anthropics',\n repo: 'courses',\n name: 'Anthropic Official',\n description: 'Official Anthropic courses and skills',\n official: true,\n branch: 'master',\n },\n];\n\n/**\n * Cache file name\n */\nexport const MARKETPLACE_CACHE_FILE = 'marketplace-index.json';\n\n/**\n * Default cache TTL (1 hour)\n */\nexport const DEFAULT_CACHE_TTL = 60 * 60 * 1000;\n","/**\n * Marketplace Aggregator\n *\n * Fetches and indexes skills from multiple GitHub repositories.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type {\n SkillSource,\n MarketplaceSkill,\n MarketplaceIndex,\n MarketplaceSearchOptions,\n MarketplaceSearchResult,\n MarketplaceConfig,\n} from './types.js';\nimport {\n DEFAULT_SKILL_SOURCES,\n MARKETPLACE_CACHE_FILE,\n DEFAULT_CACHE_TTL,\n} from './types.js';\n\n/**\n * Marketplace Aggregator\n */\nexport class MarketplaceAggregator {\n private config: MarketplaceConfig;\n private cacheDir: string;\n private cachePath: string;\n private index: MarketplaceIndex | null = null;\n\n constructor(config: MarketplaceConfig = {}) {\n this.config = config;\n this.cacheDir = config.cacheDir || join(homedir(), '.skillkit', 'marketplace');\n this.cachePath = join(this.cacheDir, MARKETPLACE_CACHE_FILE);\n\n // Ensure cache directory exists\n if (!existsSync(this.cacheDir)) {\n mkdirSync(this.cacheDir, { recursive: true });\n }\n }\n\n /**\n * Get all sources (default + custom)\n */\n getSources(): SkillSource[] {\n return [...DEFAULT_SKILL_SOURCES, ...(this.config.sources || [])];\n }\n\n /**\n * Load cached index\n */\n loadCache(): MarketplaceIndex | null {\n if (!existsSync(this.cachePath)) {\n return null;\n }\n\n try {\n const content = readFileSync(this.cachePath, 'utf-8');\n const index = JSON.parse(content) as MarketplaceIndex;\n\n // Check if cache is expired\n const cacheAge = Date.now() - new Date(index.updatedAt).getTime();\n const ttl = this.config.cacheTTL || DEFAULT_CACHE_TTL;\n\n if (cacheAge > ttl) {\n return null; // Cache expired\n }\n\n this.index = index;\n return index;\n } catch {\n return null;\n }\n }\n\n /**\n * Save index to cache\n */\n saveCache(index: MarketplaceIndex): void {\n writeFileSync(this.cachePath, JSON.stringify(index, null, 2));\n this.index = index;\n }\n\n /**\n * Fetch skills from a single source\n */\n async fetchSource(source: SkillSource): Promise<MarketplaceSkill[]> {\n const skills: MarketplaceSkill[] = [];\n const branch = source.branch || 'main';\n\n try {\n // Try to fetch skills index file\n const indexPaths = [\n source.indexPath,\n 'skills.json',\n 'index.json',\n '.skillkit/skills.json',\n ].filter(Boolean) as string[];\n\n for (const indexPath of indexPaths) {\n try {\n const url = `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${indexPath}`;\n const response = await fetch(url);\n\n if (response.ok) {\n const data = (await response.json()) as unknown;\n\n if (Array.isArray(data)) {\n for (const item of data) {\n skills.push(this.parseSkillEntry(item as Record<string, unknown>, source));\n }\n return skills;\n }\n\n const dataObj = data as Record<string, unknown>;\n if (dataObj.skills && Array.isArray(dataObj.skills)) {\n for (const item of dataObj.skills) {\n skills.push(this.parseSkillEntry(item as Record<string, unknown>, source));\n }\n return skills;\n }\n }\n } catch {\n // Try next path\n }\n }\n\n // Fallback: Try to parse README for skill links\n const readmeUrl = `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/README.md`;\n const readmeResponse = await fetch(readmeUrl);\n\n if (readmeResponse.ok) {\n const readme = await readmeResponse.text();\n const parsedSkills = this.parseReadmeForSkills(readme, source);\n skills.push(...parsedSkills);\n }\n\n // If still no skills, add the repo itself as a skill source\n if (skills.length === 0) {\n skills.push({\n id: `${source.owner}/${source.repo}`,\n name: source.repo,\n description: source.description || `Skills from ${source.name}`,\n source,\n path: '/',\n tags: ['repository'],\n rawUrl: `https://github.com/${source.owner}/${source.repo}`,\n });\n }\n } catch (error) {\n console.error(`Failed to fetch skills from ${source.owner}/${source.repo}:`, error);\n }\n\n return skills;\n }\n\n /**\n * Check if a path is an absolute URL\n */\n private isAbsoluteUrl(path: string): boolean {\n return /^https?:\\/\\//i.test(path);\n }\n\n /**\n * Convert a GitHub URL to raw content URL\n */\n private toRawUrl(url: string): string {\n return url\n .replace('://github.com/', '://raw.githubusercontent.com/')\n .replace('/blob/', '/');\n }\n\n /**\n * Parse a skill entry from JSON\n */\n private parseSkillEntry(\n item: Record<string, unknown>,\n source: SkillSource\n ): MarketplaceSkill {\n const name = String(item.name || item.title || 'Unknown');\n const path = String(item.path || item.file || item.url || '/');\n\n // Handle absolute URLs - use them directly instead of building from source\n const rawUrl = this.isAbsoluteUrl(path)\n ? this.toRawUrl(path)\n : this.buildRawUrl(source, path);\n\n return {\n id: `${source.owner}/${source.repo}/${path}`,\n name,\n description: String(item.description || item.desc || ''),\n source,\n path,\n version: item.version as string | undefined,\n author: item.author as string | undefined,\n tags: Array.isArray(item.tags) ? item.tags : [],\n agents: Array.isArray(item.agents) ? item.agents : undefined,\n stars: typeof item.stars === 'number' ? item.stars : undefined,\n updatedAt: item.updatedAt as string | undefined,\n downloads: typeof item.downloads === 'number' ? item.downloads : undefined,\n rawUrl,\n };\n }\n\n /**\n * Parse README for skill links\n */\n private parseReadmeForSkills(\n readme: string,\n source: SkillSource\n ): MarketplaceSkill[] {\n const skills: MarketplaceSkill[] = [];\n const branch = source.branch || 'main';\n\n // Look for markdown links to skill files\n const linkPattern = /\\[([^\\]]+)\\]\\(([^)]+\\.md)\\)/g;\n let match;\n\n while ((match = linkPattern.exec(readme)) !== null) {\n const name = match[1];\n const path = match[2];\n\n // Skip external links and non-skill files\n if (path.startsWith('http') && !path.includes(source.repo)) {\n continue;\n }\n\n // Extract description from surrounding text\n const contextStart = Math.max(0, match.index - 200);\n const contextEnd = Math.min(readme.length, match.index + 200);\n const context = readme.slice(contextStart, contextEnd);\n\n // Try to find description in list item or paragraph\n const descMatch = context.match(/[-*]\\s*\\[.*?\\]\\(.*?\\)\\s*[-:]\\s*(.+?)(?:\\n|$)/);\n const description = descMatch ? descMatch[1].trim() : '';\n\n // Handle absolute URLs in README links\n const isAbsolute = this.isAbsoluteUrl(path);\n const normalizedPath = isAbsolute ? path : (path.startsWith('/') ? path : `/${path}`);\n const rawUrl = isAbsolute\n ? this.toRawUrl(path)\n : `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${path}`;\n\n skills.push({\n id: `${source.owner}/${source.repo}/${path}`,\n name,\n description,\n source,\n path: normalizedPath,\n tags: this.inferTags(name, description),\n rawUrl,\n });\n }\n\n return skills;\n }\n\n /**\n * Build raw URL for a skill\n */\n private buildRawUrl(source: SkillSource, path: string): string {\n const branch = source.branch || 'main';\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${cleanPath}`;\n }\n\n /**\n * Infer tags from name and description\n */\n private inferTags(name: string, description: string): string[] {\n const tags: string[] = [];\n const text = `${name} ${description}`.toLowerCase();\n\n const tagKeywords: Record<string, string[]> = {\n typescript: ['typescript', 'ts', 'tsc'],\n javascript: ['javascript', 'js', 'node'],\n react: ['react', 'jsx', 'tsx'],\n nextjs: ['next', 'nextjs', 'next.js'],\n testing: ['test', 'jest', 'vitest', 'mocha'],\n linting: ['lint', 'eslint', 'prettier'],\n auth: ['auth', 'authentication', 'login', 'oauth'],\n database: ['database', 'db', 'postgres', 'mysql', 'mongo'],\n api: ['api', 'rest', 'graphql'],\n devops: ['ci', 'cd', 'docker', 'kubernetes'],\n git: ['git', 'github', 'commit'],\n };\n\n for (const [tag, keywords] of Object.entries(tagKeywords)) {\n if (keywords.some((k) => text.includes(k))) {\n tags.push(tag);\n }\n }\n\n return tags;\n }\n\n /**\n * Refresh the marketplace index\n */\n async refresh(): Promise<MarketplaceIndex> {\n const sources = this.getSources();\n const allSkills: MarketplaceSkill[] = [];\n\n // Fetch from all sources in parallel\n const results = await Promise.all(\n sources.map((source) => this.fetchSource(source))\n );\n\n for (const skills of results) {\n allSkills.push(...skills);\n }\n\n // Create index\n const index: MarketplaceIndex = {\n version: 1,\n updatedAt: new Date().toISOString(),\n sources,\n skills: allSkills,\n totalCount: allSkills.length,\n };\n\n // Save to cache\n this.saveCache(index);\n\n return index;\n }\n\n /**\n * Get the marketplace index (from cache or refresh)\n */\n async getIndex(forceRefresh = false): Promise<MarketplaceIndex> {\n // Check in-memory cache first\n if (!forceRefresh && this.index) {\n return this.index;\n }\n\n // Check file cache\n if (!forceRefresh) {\n const cached = this.loadCache();\n if (cached) {\n return cached;\n }\n }\n\n return this.refresh();\n }\n\n /**\n * Search the marketplace\n */\n async search(options: MarketplaceSearchOptions = {}): Promise<MarketplaceSearchResult> {\n const index = await this.getIndex();\n let skills = [...index.skills];\n\n // Filter by query\n if (options.query) {\n const query = options.query.toLowerCase();\n skills = skills.filter(\n (s) =>\n s.name.toLowerCase().includes(query) ||\n s.description.toLowerCase().includes(query) ||\n s.tags.some((t) => t.toLowerCase().includes(query))\n );\n }\n\n // Filter by tags\n if (options.tags && options.tags.length > 0) {\n skills = skills.filter((s) =>\n options.tags!.some((t) => s.tags.includes(t))\n );\n }\n\n // Filter by source\n if (options.source) {\n skills = skills.filter(\n (s) =>\n s.source.name === options.source ||\n `${s.source.owner}/${s.source.repo}` === options.source\n );\n }\n\n // Filter by agent\n if (options.agent) {\n skills = skills.filter(\n (s) => !s.agents || s.agents.includes(options.agent!)\n );\n }\n\n // Sort\n const sortBy = options.sortBy || 'name';\n const sortOrder = options.sortOrder || 'asc';\n\n skills.sort((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case 'name':\n comparison = a.name.localeCompare(b.name);\n break;\n case 'stars':\n comparison = (a.stars || 0) - (b.stars || 0);\n break;\n case 'downloads':\n comparison = (a.downloads || 0) - (b.downloads || 0);\n break;\n case 'updatedAt':\n comparison =\n new Date(a.updatedAt || 0).getTime() -\n new Date(b.updatedAt || 0).getTime();\n break;\n }\n\n return sortOrder === 'desc' ? -comparison : comparison;\n });\n\n const total = skills.length;\n\n // Apply pagination\n if (options.offset) {\n skills = skills.slice(options.offset);\n }\n\n if (options.limit) {\n skills = skills.slice(0, options.limit);\n }\n\n return {\n skills,\n total,\n query: options.query,\n };\n }\n\n /**\n * Get a skill by ID\n */\n async getSkill(id: string): Promise<MarketplaceSkill | null> {\n const index = await this.getIndex();\n return index.skills.find((s) => s.id === id) || null;\n }\n\n /**\n * Get skill content\n */\n async getSkillContent(skill: MarketplaceSkill): Promise<string | null> {\n if (!skill.rawUrl) {\n return null;\n }\n\n try {\n const response = await fetch(skill.rawUrl);\n if (response.ok) {\n return response.text();\n }\n } catch {\n // Fetch failed\n }\n\n return null;\n }\n\n /**\n * Get popular tags\n */\n async getPopularTags(limit = 20): Promise<{ tag: string; count: number }[]> {\n const index = await this.getIndex();\n const tagCounts = new Map<string, number>();\n\n for (const skill of index.skills) {\n for (const tag of skill.tags) {\n tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);\n }\n }\n\n const tags = Array.from(tagCounts.entries())\n .map(([tag, count]) => ({ tag, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, limit);\n\n return tags;\n }\n\n /**\n * Add a custom source\n */\n addSource(source: SkillSource): void {\n if (!this.config.sources) {\n this.config.sources = [];\n }\n this.config.sources.push(source);\n this.clearCache();\n }\n\n /**\n * Remove a custom source\n */\n removeSource(owner: string, repo: string): void {\n if (this.config.sources) {\n this.config.sources = this.config.sources.filter(\n (s) => s.owner !== owner || s.repo !== repo\n );\n }\n this.clearCache();\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n if (existsSync(this.cachePath)) {\n unlinkSync(this.cachePath);\n }\n this.index = null;\n }\n}\n\n/**\n * Create a marketplace aggregator\n */\nexport function createMarketplaceAggregator(\n config?: MarketplaceConfig\n): MarketplaceAggregator {\n return new MarketplaceAggregator(config);\n}\n","/**\n * CI/CD Templates\n *\n * Provides templates for GitHub Actions, pre-commit hooks, and other CI/CD integrations.\n */\n\n/**\n * GitHub Action workflow for skill validation\n */\nexport const GITHUB_ACTION_TEMPLATE = `# Skill Validation Workflow\n# This workflow validates skills in your repository\n\nname: Validate Skills\n\non:\n push:\n paths:\n - '.claude/skills/**'\n - '.cursor/skills/**'\n - 'skills/**'\n pull_request:\n paths:\n - '.claude/skills/**'\n - '.cursor/skills/**'\n - 'skills/**'\n\njobs:\n validate:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install SkillKit\n run: npm install -g skillkit\n\n - name: Validate Skills\n run: skillkit validate\n\n - name: Run Skill Tests\n run: skillkit test --json > test-results.json\n continue-on-error: true\n\n - name: Upload Test Results\n uses: actions/upload-artifact@v4\n with:\n name: skill-test-results\n path: test-results.json\n retention-days: 30\n\n - name: Check Test Results\n run: |\n if [ -f test-results.json ]; then\n passed=$(cat test-results.json | jq -r '.passed')\n if [ \"$passed\" = \"false\" ]; then\n echo \"Some skill tests failed\"\n exit 1\n fi\n fi\n`;\n\n/**\n * Pre-commit hook script for skill validation\n */\nexport const PRE_COMMIT_HOOK_TEMPLATE = `#!/bin/bash\n# SkillKit Pre-commit Hook\n# Validates skills before commit\n\n# Colors for output\nRED='\\\\033[0;31m'\nGREEN='\\\\033[0;32m'\nYELLOW='\\\\033[0;33m'\nNC='\\\\033[0m' # No Color\n\necho -e \"\\${YELLOW}Running SkillKit validation...\\${NC}\"\n\n# Check if skillkit is installed\nif ! command -v skillkit &> /dev/null; then\n echo -e \"\\${RED}SkillKit not found. Install with: npm install -g skillkit\\${NC}\"\n exit 1\nfi\n\n# Get list of staged skill files\nSKILL_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\\\\.(md|mdc)$' | grep -E '(skills|.claude|.cursor)')\n\nif [ -z \"$SKILL_FILES\" ]; then\n echo -e \"\\${GREEN}No skill files staged, skipping validation.\\${NC}\"\n exit 0\nfi\n\necho \"Validating skill files:\"\necho \"$SKILL_FILES\"\n\n# Run validation\nif ! skillkit validate; then\n echo -e \"\\${RED}Skill validation failed. Please fix the errors and try again.\\${NC}\"\n exit 1\nfi\n\n# Run tests if any\nif skillkit test --json 2>/dev/null | jq -e '.passed == false' > /dev/null 2>&1; then\n echo -e \"\\${RED}Skill tests failed. Please fix the failing tests.\\${NC}\"\n exit 1\nfi\n\necho -e \"\\${GREEN}All skills validated successfully!\\${NC}\"\nexit 0\n`;\n\n/**\n * Pre-commit config for .pre-commit-config.yaml\n */\nexport const PRE_COMMIT_CONFIG_TEMPLATE = `# SkillKit Pre-commit Configuration\n# Add this to your .pre-commit-config.yaml\n\nrepos:\n - repo: local\n hooks:\n - id: skillkit-validate\n name: SkillKit Validate\n entry: skillkit validate\n language: system\n files: \\\\.(md|mdc)$\n pass_filenames: false\n\n - id: skillkit-test\n name: SkillKit Test\n entry: skillkit test\n language: system\n files: \\\\.(md|mdc)$\n pass_filenames: false\n`;\n\n/**\n * GitLab CI template\n */\nexport const GITLAB_CI_TEMPLATE = `# SkillKit GitLab CI Configuration\n# Add this to your .gitlab-ci.yml\n\nskill-validation:\n image: node:20\n stage: test\n before_script:\n - npm install -g skillkit\n script:\n - skillkit validate\n - skillkit test --json > test-results.json\n artifacts:\n # Note: test-results.json is JSON format, not JUnit XML\n paths:\n - test-results.json\n expire_in: 30 days\n rules:\n - changes:\n - \".claude/skills/**\"\n - \".cursor/skills/**\"\n - \"skills/**\"\n`;\n\n/**\n * CircleCI config template\n */\nexport const CIRCLECI_CONFIG_TEMPLATE = `# SkillKit CircleCI Configuration\n# Add this to your .circleci/config.yml\n\nversion: 2.1\n\njobs:\n validate-skills:\n docker:\n - image: cimg/node:20.0\n steps:\n - checkout\n - run:\n name: Install SkillKit\n command: npm install -g skillkit\n - run:\n name: Validate Skills\n command: skillkit validate\n - run:\n name: Run Skill Tests\n command: skillkit test --json > test-results.json\n - store_artifacts:\n path: test-results.json\n destination: skill-tests\n\nworkflows:\n skill-validation:\n jobs:\n - validate-skills:\n filters:\n branches:\n only: /.*/\n`;\n\n/**\n * Get a CI/CD template by name\n */\nexport function getCICDTemplate(name: string): string | null {\n switch (name.toLowerCase()) {\n case 'github':\n case 'github-action':\n case 'github-actions':\n return GITHUB_ACTION_TEMPLATE;\n case 'pre-commit':\n case 'pre-commit-hook':\n return PRE_COMMIT_HOOK_TEMPLATE;\n case 'pre-commit-config':\n return PRE_COMMIT_CONFIG_TEMPLATE;\n case 'gitlab':\n case 'gitlab-ci':\n return GITLAB_CI_TEMPLATE;\n case 'circleci':\n case 'circle-ci':\n return CIRCLECI_CONFIG_TEMPLATE;\n default:\n return null;\n }\n}\n\n/**\n * List available CI/CD templates\n */\nexport function listCICDTemplates(): { name: string; description: string }[] {\n return [\n { name: 'github-action', description: 'GitHub Actions workflow for skill validation' },\n { name: 'pre-commit-hook', description: 'Git pre-commit hook script' },\n { name: 'pre-commit-config', description: 'pre-commit framework configuration' },\n { name: 'gitlab-ci', description: 'GitLab CI configuration' },\n { name: 'circleci', description: 'CircleCI configuration' },\n ];\n}\n","import type { AgentType } from '../types.js';\n\nexport type ObservationType =\n | 'tool_use'\n | 'decision'\n | 'error'\n | 'solution'\n | 'pattern'\n | 'file_change'\n | 'checkpoint';\n\nexport interface ObservationContent {\n action: string;\n context: string;\n result?: string;\n files?: string[];\n tags?: string[];\n error?: string;\n solution?: string;\n}\n\nexport interface Observation {\n id: string;\n timestamp: string;\n sessionId: string;\n agent: AgentType;\n type: ObservationType;\n content: ObservationContent;\n relevance: number;\n}\n\nexport interface Learning {\n id: string;\n createdAt: string;\n updatedAt: string;\n source: 'session' | 'manual' | 'imported';\n sourceObservations?: string[];\n\n title: string;\n content: string;\n\n scope: 'project' | 'global';\n project?: string;\n\n tags: string[];\n frameworks?: string[];\n patterns?: string[];\n\n useCount: number;\n lastUsed?: string;\n effectiveness?: number;\n}\n\nexport interface MemoryIndex {\n version: 1;\n lastUpdated: string;\n entries: Record<string, string[]>;\n tags: Record<string, string[]>;\n}\n\nexport interface MemorySummary {\n id: string;\n title: string;\n tags: string[];\n relevance: number;\n}\n\nexport interface MemoryPreview extends MemorySummary {\n excerpt: string;\n lastUsed?: string;\n}\n\nexport interface MemoryFull extends MemoryPreview {\n content: string;\n sourceObservations?: Observation[];\n}\n\nexport interface ObservationStoreData {\n version: 1;\n sessionId: string;\n observations: Observation[];\n}\n\nexport interface LearningStoreData {\n version: 1;\n learnings: Learning[];\n}\n\nexport interface MemoryConfig {\n autoCompress: boolean;\n compressionThreshold: number;\n compressionModel?: string;\n maxObservations: number;\n maxLearnings: number;\n}\n\nexport const DEFAULT_MEMORY_CONFIG: MemoryConfig = {\n autoCompress: true,\n compressionThreshold: 50,\n maxObservations: 1000,\n maxLearnings: 500,\n};\n\nexport interface MemorySearchOptions {\n query?: string;\n tags?: string[];\n scope?: 'project' | 'global' | 'all';\n limit?: number;\n minRelevance?: number;\n}\n\nexport interface MemorySearchResult {\n learning: Learning;\n score: number;\n matchedKeywords: string[];\n matchedTags: string[];\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { randomUUID } from 'node:crypto';\nimport type {\n Observation,\n ObservationContent,\n ObservationStoreData,\n ObservationType,\n} from './types.js';\nimport type { AgentType } from '../types.js';\n\nexport class ObservationStore {\n private readonly filePath: string;\n private data: ObservationStoreData | null = null;\n private sessionId: string;\n\n constructor(projectPath: string, sessionId?: string) {\n this.filePath = join(projectPath, '.skillkit', 'memory', 'observations.yaml');\n this.sessionId = sessionId || randomUUID();\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): ObservationStoreData {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as ObservationStoreData;\n if (this.data.sessionId !== this.sessionId) {\n this.data.sessionId = this.sessionId;\n this.data.observations = [];\n }\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): ObservationStoreData {\n return {\n version: 1,\n sessionId: this.sessionId,\n observations: [],\n };\n }\n\n private save(): void {\n this.ensureDir();\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n add(\n type: ObservationType,\n content: ObservationContent,\n agent: AgentType,\n relevance = 50\n ): Observation {\n const data = this.load();\n\n const observation: Observation = {\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\n agent,\n type,\n content,\n relevance,\n };\n\n data.observations.push(observation);\n this.save();\n\n return observation;\n }\n\n getAll(): Observation[] {\n return this.load().observations;\n }\n\n getByType(type: ObservationType): Observation[] {\n return this.load().observations.filter((o) => o.type === type);\n }\n\n getByRelevance(minRelevance: number): Observation[] {\n return this.load().observations.filter((o) => o.relevance >= minRelevance);\n }\n\n getRecent(count: number): Observation[] {\n const observations = this.load().observations;\n return observations.slice(-count);\n }\n\n getUncompressed(compressedIds: string[]): Observation[] {\n const compressedSet = new Set(compressedIds);\n return this.load().observations.filter((o) => !compressedSet.has(o.id));\n }\n\n count(): number {\n return this.load().observations.length;\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n getById(id: string): Observation | undefined {\n return this.load().observations.find((o) => o.id === id);\n }\n\n getByIds(ids: string[]): Observation[] {\n const idSet = new Set(ids);\n return this.load().observations.filter((o) => idSet.has(o.id));\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n if (this.data) {\n this.data.sessionId = sessionId;\n }\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n delete(id: string): boolean {\n const data = this.load();\n const index = data.observations.findIndex((o) => o.id === id);\n\n if (index === -1) return false;\n\n data.observations.splice(index, 1);\n this.save();\n return true;\n }\n\n deleteMany(ids: string[]): number {\n const idSet = new Set(ids);\n const data = this.load();\n const initialLength = data.observations.length;\n\n data.observations = data.observations.filter((o) => !idSet.has(o.id));\n\n if (data.observations.length !== initialLength) {\n this.save();\n }\n\n return initialLength - data.observations.length;\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { randomUUID } from 'node:crypto';\nimport type { Learning, LearningStoreData } from './types.js';\n\nexport class LearningStore {\n private readonly filePath: string;\n private readonly scope: 'project' | 'global';\n private readonly projectName?: string;\n private data: LearningStoreData | null = null;\n\n constructor(\n scope: 'project' | 'global',\n projectPath?: string,\n projectName?: string\n ) {\n this.scope = scope;\n this.projectName = projectName;\n\n if (scope === 'project' && projectPath) {\n this.filePath = join(projectPath, '.skillkit', 'memory', 'learnings.yaml');\n } else {\n this.filePath = join(homedir(), '.skillkit', 'memory', 'global.yaml');\n }\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): LearningStoreData {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as LearningStoreData;\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): LearningStoreData {\n return {\n version: 1,\n learnings: [],\n };\n }\n\n private save(): void {\n this.ensureDir();\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n add(learning: Omit<Learning, 'id' | 'createdAt' | 'updatedAt' | 'useCount' | 'scope' | 'project'>): Learning {\n const data = this.load();\n const now = new Date().toISOString();\n\n const newLearning: Learning = {\n ...learning,\n id: randomUUID(),\n createdAt: now,\n updatedAt: now,\n useCount: 0,\n scope: this.scope,\n project: this.projectName,\n };\n\n data.learnings.push(newLearning);\n this.save();\n\n return newLearning;\n }\n\n update(id: string, updates: Partial<Omit<Learning, 'id' | 'createdAt'>>): Learning | null {\n const data = this.load();\n const index = data.learnings.findIndex((l) => l.id === id);\n\n if (index === -1) return null;\n\n data.learnings[index] = {\n ...data.learnings[index],\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n\n this.save();\n return data.learnings[index];\n }\n\n delete(id: string): boolean {\n const data = this.load();\n const index = data.learnings.findIndex((l) => l.id === id);\n\n if (index === -1) return false;\n\n data.learnings.splice(index, 1);\n this.save();\n return true;\n }\n\n getAll(): Learning[] {\n return this.load().learnings;\n }\n\n getById(id: string): Learning | undefined {\n return this.load().learnings.find((l) => l.id === id);\n }\n\n getByTags(tags: string[]): Learning[] {\n const tagSet = new Set(tags.map((t) => t.toLowerCase()));\n return this.load().learnings.filter((l) =>\n l.tags.some((t) => tagSet.has(t.toLowerCase()))\n );\n }\n\n getByFrameworks(frameworks: string[]): Learning[] {\n const fwSet = new Set(frameworks.map((f) => f.toLowerCase()));\n return this.load().learnings.filter((l) =>\n l.frameworks?.some((f) => fwSet.has(f.toLowerCase()))\n );\n }\n\n getRecent(count: number): Learning[] {\n const learnings = this.load().learnings;\n return [...learnings]\n .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())\n .slice(0, count);\n }\n\n getMostUsed(count: number): Learning[] {\n const learnings = this.load().learnings;\n return [...learnings].sort((a, b) => b.useCount - a.useCount).slice(0, count);\n }\n\n getMostEffective(count: number): Learning[] {\n const learnings = this.load().learnings.filter((l) => l.effectiveness !== undefined);\n return [...learnings]\n .sort((a, b) => (b.effectiveness || 0) - (a.effectiveness || 0))\n .slice(0, count);\n }\n\n incrementUseCount(id: string): void {\n const data = this.load();\n const learning = data.learnings.find((l) => l.id === id);\n\n if (learning) {\n learning.useCount += 1;\n learning.lastUsed = new Date().toISOString();\n this.save();\n }\n }\n\n setEffectiveness(id: string, effectiveness: number): void {\n const data = this.load();\n const learning = data.learnings.find((l) => l.id === id);\n\n if (learning) {\n learning.effectiveness = Math.max(0, Math.min(100, effectiveness));\n learning.updatedAt = new Date().toISOString();\n this.save();\n }\n }\n\n search(query: string): Learning[] {\n const queryLower = query.toLowerCase();\n const queryWords = queryLower.split(/\\s+/).filter((w) => w.length > 2);\n\n return this.load().learnings.filter((l) => {\n const titleMatch = l.title.toLowerCase().includes(queryLower);\n const contentMatch = l.content.toLowerCase().includes(queryLower);\n const tagMatch = l.tags.some((t) => t.toLowerCase().includes(queryLower));\n const wordMatch = queryWords.some(\n (word) =>\n l.title.toLowerCase().includes(word) ||\n l.content.toLowerCase().includes(word)\n );\n\n return titleMatch || contentMatch || tagMatch || wordMatch;\n });\n }\n\n count(): number {\n return this.load().learnings.length;\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n getScope(): 'project' | 'global' {\n return this.scope;\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { Learning, MemoryIndex } from './types.js';\n\nexport class MemoryIndexStore {\n private readonly filePath: string;\n private data: MemoryIndex | null = null;\n\n constructor(basePath: string, _isGlobal = false) {\n // Both global and project use .skillkit subdirectory\n // Global: ~/.skillkit/memory/index.yaml (basePath = homedir())\n // Project: <projectPath>/.skillkit/memory/index.yaml (basePath = projectPath)\n // Note: _isGlobal kept for API compatibility but basePath determines the actual path\n this.filePath = join(basePath, '.skillkit', 'memory', 'index.yaml');\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): MemoryIndex {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as MemoryIndex;\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): MemoryIndex {\n return {\n version: 1,\n lastUpdated: new Date().toISOString(),\n entries: {},\n tags: {},\n };\n }\n\n private save(): void {\n this.ensureDir();\n if (this.data) {\n this.data.lastUpdated = new Date().toISOString();\n }\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n private extractKeywords(text: string): string[] {\n // Extract meaningful keywords from text\n const stopWords = new Set([\n 'a', 'an', 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',\n 'of', 'with', 'by', 'from', 'is', 'are', 'was', 'were', 'be', 'been',\n 'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would',\n 'could', 'should', 'may', 'might', 'must', 'can', 'this', 'that',\n 'these', 'those', 'it', 'its', 'i', 'you', 'we', 'they', 'he', 'she',\n ]);\n\n const words = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, ' ')\n .split(/\\s+/)\n .filter((word) => word.length > 2 && !stopWords.has(word));\n\n return [...new Set(words)];\n }\n\n indexLearning(learning: Learning): void {\n const data = this.load();\n\n // Extract keywords from title and content\n const titleKeywords = this.extractKeywords(learning.title);\n const contentKeywords = this.extractKeywords(learning.content);\n const allKeywords = [...new Set([...titleKeywords, ...contentKeywords])];\n\n // Index by keywords\n for (const keyword of allKeywords) {\n if (!data.entries[keyword]) {\n data.entries[keyword] = [];\n }\n if (!data.entries[keyword].includes(learning.id)) {\n data.entries[keyword].push(learning.id);\n }\n }\n\n // Index by tags\n for (const tag of learning.tags) {\n const normalizedTag = tag.toLowerCase();\n if (!data.tags[normalizedTag]) {\n data.tags[normalizedTag] = [];\n }\n if (!data.tags[normalizedTag].includes(learning.id)) {\n data.tags[normalizedTag].push(learning.id);\n }\n }\n\n // Index by frameworks if present\n if (learning.frameworks) {\n for (const framework of learning.frameworks) {\n const normalizedFw = framework.toLowerCase();\n if (!data.tags[normalizedFw]) {\n data.tags[normalizedFw] = [];\n }\n if (!data.tags[normalizedFw].includes(learning.id)) {\n data.tags[normalizedFw].push(learning.id);\n }\n }\n }\n\n this.save();\n }\n\n removeLearning(learningId: string): void {\n const data = this.load();\n\n // Remove from keyword entries\n for (const keyword of Object.keys(data.entries)) {\n data.entries[keyword] = data.entries[keyword].filter((id) => id !== learningId);\n if (data.entries[keyword].length === 0) {\n delete data.entries[keyword];\n }\n }\n\n // Remove from tags\n for (const tag of Object.keys(data.tags)) {\n data.tags[tag] = data.tags[tag].filter((id) => id !== learningId);\n if (data.tags[tag].length === 0) {\n delete data.tags[tag];\n }\n }\n\n this.save();\n }\n\n searchByKeywords(query: string): string[] {\n const data = this.load();\n const keywords = this.extractKeywords(query);\n\n if (keywords.length === 0) return [];\n\n // Find IDs that match any keyword\n const matchCounts = new Map<string, number>();\n\n for (const keyword of keywords) {\n // Exact match\n if (data.entries[keyword]) {\n for (const id of data.entries[keyword]) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 2);\n }\n }\n\n // Partial match (keyword is substring of indexed word, but not exact match)\n for (const [indexed, ids] of Object.entries(data.entries)) {\n // Skip exact matches - they're already counted above with higher weight\n if (indexed === keyword) continue;\n if (indexed.includes(keyword) || keyword.includes(indexed)) {\n for (const id of ids) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 1);\n }\n }\n }\n }\n\n // Sort by match count (most matches first)\n return [...matchCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([id]) => id);\n }\n\n searchByTags(tags: string[]): string[] {\n const data = this.load();\n const normalizedTags = tags.map((t) => t.toLowerCase());\n\n const matchCounts = new Map<string, number>();\n\n for (const tag of normalizedTags) {\n if (data.tags[tag]) {\n for (const id of data.tags[tag]) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 1);\n }\n }\n }\n\n // Sort by match count\n return [...matchCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([id]) => id);\n }\n\n search(query: string, tags?: string[]): string[] {\n const keywordResults = this.searchByKeywords(query);\n const tagResults = tags ? this.searchByTags(tags) : [];\n\n if (!tags || tags.length === 0) {\n return keywordResults;\n }\n\n if (!query || query.trim().length === 0) {\n return tagResults;\n }\n\n // Combine results, prioritizing items that match both\n const keywordSet = new Set(keywordResults);\n const tagSet = new Set(tagResults);\n\n const both: string[] = [];\n const keywordOnly: string[] = [];\n const tagOnly: string[] = [];\n\n for (const id of keywordResults) {\n if (tagSet.has(id)) {\n both.push(id);\n } else {\n keywordOnly.push(id);\n }\n }\n\n for (const id of tagResults) {\n if (!keywordSet.has(id)) {\n tagOnly.push(id);\n }\n }\n\n return [...both, ...keywordOnly, ...tagOnly];\n }\n\n getAllTags(): string[] {\n const data = this.load();\n return Object.keys(data.tags).sort();\n }\n\n getTagCounts(): Record<string, number> {\n const data = this.load();\n const counts: Record<string, number> = {};\n for (const [tag, ids] of Object.entries(data.tags)) {\n counts[tag] = ids.length;\n }\n return counts;\n }\n\n rebuildIndex(learnings: Learning[]): void {\n // Clear existing index\n this.data = this.createEmpty();\n\n // Re-index all learnings\n for (const learning of learnings) {\n this.indexLearning(learning);\n }\n\n this.save();\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n getStats(): { keywords: number; tags: number; lastUpdated: string } {\n const data = this.load();\n return {\n keywords: Object.keys(data.entries).length,\n tags: Object.keys(data.tags).length,\n lastUpdated: data.lastUpdated,\n };\n }\n}\n","import { existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface MemoryPaths {\n projectMemoryDir: string;\n globalMemoryDir: string;\n observationsFile: string;\n learningsFile: string;\n indexFile: string;\n globalLearningsFile: string;\n globalIndexFile: string;\n}\n\nexport function getMemoryPaths(projectPath: string): MemoryPaths {\n const projectMemoryDir = join(projectPath, '.skillkit', 'memory');\n const globalMemoryDir = join(homedir(), '.skillkit', 'memory');\n\n return {\n projectMemoryDir,\n globalMemoryDir,\n observationsFile: join(projectMemoryDir, 'observations.yaml'),\n learningsFile: join(projectMemoryDir, 'learnings.yaml'),\n indexFile: join(projectMemoryDir, 'index.yaml'),\n globalLearningsFile: join(globalMemoryDir, 'global.yaml'),\n globalIndexFile: join(globalMemoryDir, 'index.yaml'),\n };\n}\n\nexport function initializeMemoryDirectory(projectPath: string): MemoryPaths {\n const paths = getMemoryPaths(projectPath);\n\n // Create project memory directory\n if (!existsSync(paths.projectMemoryDir)) {\n mkdirSync(paths.projectMemoryDir, { recursive: true });\n }\n\n // Create global memory directory\n if (!existsSync(paths.globalMemoryDir)) {\n mkdirSync(paths.globalMemoryDir, { recursive: true });\n }\n\n return paths;\n}\n\nexport function memoryDirectoryExists(projectPath: string): boolean {\n const paths = getMemoryPaths(projectPath);\n return existsSync(paths.projectMemoryDir);\n}\n\nexport function globalMemoryDirectoryExists(): boolean {\n const globalMemoryDir = join(homedir(), '.skillkit', 'memory');\n return existsSync(globalMemoryDir);\n}\n\nexport interface MemoryStatus {\n projectMemoryExists: boolean;\n globalMemoryExists: boolean;\n hasObservations: boolean;\n hasLearnings: boolean;\n hasGlobalLearnings: boolean;\n hasIndex: boolean;\n hasGlobalIndex: boolean;\n}\n\nexport function getMemoryStatus(projectPath: string): MemoryStatus {\n const paths = getMemoryPaths(projectPath);\n\n return {\n projectMemoryExists: existsSync(paths.projectMemoryDir),\n globalMemoryExists: existsSync(paths.globalMemoryDir),\n hasObservations: existsSync(paths.observationsFile),\n hasLearnings: existsSync(paths.learningsFile),\n hasGlobalLearnings: existsSync(paths.globalLearningsFile),\n hasIndex: existsSync(paths.indexFile),\n hasGlobalIndex: existsSync(paths.globalIndexFile),\n };\n}\n","/**\n * Memory Observer\n *\n * Captures observations during skill execution and stores them in the ObservationStore.\n * Provides intelligent filtering to capture only significant events.\n */\n\nimport type { AgentType } from '../types.js';\nimport type { ExecutionProgressEvent } from '../executor/engine.js';\nimport type { ObservationType, ObservationContent, Observation } from './types.js';\nimport { ObservationStore } from './observation-store.js';\n\n/**\n * Event types that can be observed\n */\nexport type ObservableEventType =\n | 'task_start'\n | 'task_complete'\n | 'task_failed'\n | 'checkpoint_reached'\n | 'checkpoint_decision'\n | 'verification_passed'\n | 'verification_failed'\n | 'file_modified'\n | 'error_encountered'\n | 'solution_applied'\n | 'execution_start'\n | 'execution_complete'\n | 'execution_paused';\n\n/**\n * Observable event structure\n */\nexport interface ObservableEvent {\n type: ObservableEventType;\n timestamp: string;\n skillName?: string;\n taskId?: string;\n taskName?: string;\n taskAction?: string;\n files?: string[];\n error?: string;\n output?: string;\n decision?: string;\n context?: string;\n}\n\n/**\n * Observer configuration\n */\nexport interface MemoryObserverConfig {\n /** Minimum relevance score to store (0-100) */\n minRelevance?: number;\n /** Whether to capture task starts */\n captureTaskStarts?: boolean;\n /** Whether to capture checkpoints */\n captureCheckpoints?: boolean;\n /** Whether to capture file modifications */\n captureFileModifications?: boolean;\n /** Whether to capture errors */\n captureErrors?: boolean;\n /** Whether to capture solutions */\n captureSolutions?: boolean;\n /** Custom relevance scorer */\n relevanceScorer?: (event: ObservableEvent) => number;\n}\n\nconst DEFAULT_CONFIG: Required<Omit<MemoryObserverConfig, 'relevanceScorer'>> = {\n minRelevance: 30,\n captureTaskStarts: false, // Task starts are usually low-value\n captureCheckpoints: true,\n captureFileModifications: true,\n captureErrors: true,\n captureSolutions: true,\n};\n\n/**\n * Memory Observer\n *\n * Captures and filters observations during skill execution.\n */\nexport class MemoryObserver {\n private store: ObservationStore;\n private config: Required<Omit<MemoryObserverConfig, 'relevanceScorer'>> & {\n relevanceScorer?: (event: ObservableEvent) => number;\n };\n private currentAgent: AgentType = 'claude-code';\n private currentSkillName?: string;\n private pendingErrors: Map<string, ObservableEvent> = new Map();\n\n constructor(projectPath: string, sessionId?: string, config?: MemoryObserverConfig) {\n this.store = new ObservationStore(projectPath, sessionId);\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Set the current agent being used\n */\n setAgent(agent: AgentType): void {\n this.currentAgent = agent;\n }\n\n /**\n * Set the current skill being executed\n */\n setSkillName(skillName: string): void {\n this.currentSkillName = skillName;\n }\n\n /**\n * Get the underlying observation store\n */\n getStore(): ObservationStore {\n return this.store;\n }\n\n /**\n * Observe an event and potentially store it\n */\n observe(event: ObservableEvent): Observation | null {\n // Check if we should capture this event type\n if (!this.shouldCapture(event)) {\n return null;\n }\n\n // Classify the event into an observation type\n const observationType = this.classifyEvent(event);\n\n // Extract content from the event\n const content = this.extractContent(event);\n\n // Score relevance\n const relevance = this.scoreRelevance(event);\n\n // Check minimum relevance threshold\n if (relevance < this.config.minRelevance) {\n return null;\n }\n\n // Store the observation\n return this.store.add(observationType, content, this.currentAgent, relevance);\n }\n\n /**\n * Create an observation callback for the SkillExecutionEngine\n */\n createProgressCallback(): (event: ExecutionProgressEvent) => void {\n return (progressEvent: ExecutionProgressEvent) => {\n const observableEvent = this.convertProgressEvent(progressEvent);\n if (observableEvent) {\n this.observe(observableEvent);\n }\n };\n }\n\n /**\n * Convert ExecutionProgressEvent to ObservableEvent\n */\n private convertProgressEvent(event: ExecutionProgressEvent): ObservableEvent | null {\n const baseEvent = {\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n taskId: event.taskId,\n taskName: event.taskName,\n };\n\n switch (event.type) {\n case 'task_start':\n return {\n ...baseEvent,\n type: 'task_start',\n context: `Starting task ${event.taskIndex !== undefined ? event.taskIndex + 1 : ''} of ${event.totalTasks || '?'}`,\n };\n\n case 'task_complete':\n if (event.status === 'failed') {\n return {\n ...baseEvent,\n type: 'task_failed',\n error: event.error,\n context: event.message,\n };\n }\n return {\n ...baseEvent,\n type: 'task_complete',\n output: event.message,\n context: `Completed task ${event.taskIndex !== undefined ? event.taskIndex + 1 : ''} of ${event.totalTasks || '?'}`,\n };\n\n case 'checkpoint':\n return {\n ...baseEvent,\n type: 'checkpoint_reached',\n context: event.message,\n };\n\n case 'verification':\n const passed = event.message?.includes('passed');\n return {\n ...baseEvent,\n type: passed ? 'verification_passed' : 'verification_failed',\n context: event.message,\n error: passed ? undefined : event.message,\n };\n\n case 'complete':\n return {\n ...baseEvent,\n type: 'execution_complete',\n context: event.message,\n error: event.status === 'failed' ? event.message : undefined,\n };\n\n default:\n return null;\n }\n }\n\n /**\n * Record a file modification event\n */\n recordFileModification(files: string[], context: string): Observation | null {\n return this.observe({\n type: 'file_modified',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n files,\n context,\n });\n }\n\n /**\n * Record an error event\n */\n recordError(error: string, context: string, taskId?: string): Observation | null {\n const event: ObservableEvent = {\n type: 'error_encountered',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n taskId,\n error,\n context,\n };\n\n // Store pending error for potential solution matching\n const errorKey = this.generateErrorKey(error);\n this.pendingErrors.set(errorKey, event);\n\n return this.observe(event);\n }\n\n /**\n * Record a solution event (potentially matching a previous error)\n */\n recordSolution(solution: string, context: string, relatedError?: string): Observation | null {\n const event: ObservableEvent = {\n type: 'solution_applied',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n output: solution,\n context,\n error: relatedError,\n };\n\n // If we can match this to a pending error, increase relevance\n if (relatedError) {\n const errorKey = this.generateErrorKey(relatedError);\n this.pendingErrors.delete(errorKey);\n }\n\n return this.observe(event);\n }\n\n /**\n * Record a decision event\n */\n recordDecision(decision: string, options: string[], context: string): Observation | null {\n return this.observe({\n type: 'checkpoint_decision',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n decision,\n context: `Decision: ${decision} (options: ${options.join(', ')}). Context: ${context}`,\n });\n }\n\n /**\n * Record execution start\n */\n recordExecutionStart(skillName: string, agent: AgentType): Observation | null {\n this.currentSkillName = skillName;\n this.currentAgent = agent;\n\n return this.observe({\n type: 'execution_start',\n timestamp: new Date().toISOString(),\n skillName,\n context: `Started execution of skill \"${skillName}\" with agent \"${agent}\"`,\n });\n }\n\n /**\n * Record execution pause\n */\n recordExecutionPause(reason?: string): Observation | null {\n return this.observe({\n type: 'execution_paused',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n context: reason || 'Execution paused',\n });\n }\n\n /**\n * Check if we should capture this event type\n */\n private shouldCapture(event: ObservableEvent): boolean {\n switch (event.type) {\n case 'task_start':\n return this.config.captureTaskStarts;\n case 'checkpoint_reached':\n case 'checkpoint_decision':\n return this.config.captureCheckpoints;\n case 'file_modified':\n return this.config.captureFileModifications;\n case 'error_encountered':\n case 'task_failed':\n case 'verification_failed':\n return this.config.captureErrors;\n case 'solution_applied':\n return this.config.captureSolutions;\n default:\n return true;\n }\n }\n\n /**\n * Classify event into observation type\n */\n private classifyEvent(event: ObservableEvent): ObservationType {\n switch (event.type) {\n case 'error_encountered':\n case 'task_failed':\n case 'verification_failed':\n return 'error';\n\n case 'solution_applied':\n return 'solution';\n\n case 'checkpoint_decision':\n return 'decision';\n\n case 'file_modified':\n return 'file_change';\n\n case 'execution_paused':\n case 'checkpoint_reached':\n return 'checkpoint';\n\n case 'task_start':\n case 'task_complete':\n case 'verification_passed':\n case 'execution_start':\n case 'execution_complete':\n default:\n return 'tool_use';\n }\n }\n\n /**\n * Extract content from event\n */\n private extractContent(event: ObservableEvent): ObservationContent {\n const content: ObservationContent = {\n action: this.getActionDescription(event),\n context: event.context || this.generateContext(event),\n };\n\n if (event.output) {\n content.result = event.output;\n }\n\n if (event.files && event.files.length > 0) {\n content.files = event.files;\n }\n\n if (event.error) {\n content.error = event.error;\n }\n\n if (event.type === 'solution_applied' && event.output) {\n content.solution = event.output;\n }\n\n // Generate tags based on event\n content.tags = this.generateTags(event);\n\n return content;\n }\n\n /**\n * Get action description from event\n */\n private getActionDescription(event: ObservableEvent): string {\n switch (event.type) {\n case 'task_start':\n return `Started task: ${event.taskName || 'unknown'}`;\n case 'task_complete':\n return `Completed task: ${event.taskName || 'unknown'}`;\n case 'task_failed':\n return `Task failed: ${event.taskName || 'unknown'}`;\n case 'checkpoint_reached':\n return `Checkpoint: ${event.taskName || 'unknown'}`;\n case 'checkpoint_decision':\n return `Decision made: ${event.decision || 'unknown'}`;\n case 'verification_passed':\n return `Verification passed: ${event.taskName || 'unknown'}`;\n case 'verification_failed':\n return `Verification failed: ${event.taskName || 'unknown'}`;\n case 'file_modified':\n return `Modified files: ${event.files?.join(', ') || 'unknown'}`;\n case 'error_encountered':\n return `Error: ${event.error?.slice(0, 100) || 'unknown'}`;\n case 'solution_applied':\n return `Solution applied: ${event.output?.slice(0, 100) || 'unknown'}`;\n case 'execution_start':\n return `Started skill: ${event.skillName || 'unknown'}`;\n case 'execution_complete':\n return `Completed skill: ${event.skillName || 'unknown'}`;\n case 'execution_paused':\n return `Paused skill: ${event.skillName || 'unknown'}`;\n default:\n return 'Unknown action';\n }\n }\n\n /**\n * Generate context if not provided\n */\n private generateContext(event: ObservableEvent): string {\n const parts: string[] = [];\n\n if (event.skillName) {\n parts.push(`Skill: ${event.skillName}`);\n }\n\n if (event.taskName) {\n parts.push(`Task: ${event.taskName}`);\n }\n\n if (event.taskAction) {\n parts.push(`Action: ${event.taskAction}`);\n }\n\n return parts.join(' | ') || 'No context available';\n }\n\n /**\n * Generate tags for event\n */\n private generateTags(event: ObservableEvent): string[] {\n const tags: string[] = [];\n\n // Add event type as tag\n tags.push(event.type.replace(/_/g, '-'));\n\n // Add skill name if present\n if (event.skillName) {\n tags.push(event.skillName.toLowerCase().replace(/[^a-z0-9-]/g, '-'));\n }\n\n // Add error-related tags\n if (event.error) {\n if (event.error.toLowerCase().includes('type')) tags.push('typescript');\n if (event.error.toLowerCase().includes('import')) tags.push('imports');\n if (event.error.toLowerCase().includes('null') || event.error.toLowerCase().includes('undefined'))\n tags.push('null-check');\n if (event.error.toLowerCase().includes('async') || event.error.toLowerCase().includes('await'))\n tags.push('async');\n }\n\n // Add file-related tags\n if (event.files) {\n for (const file of event.files) {\n if (file.endsWith('.ts') || file.endsWith('.tsx')) tags.push('typescript');\n if (file.endsWith('.js') || file.endsWith('.jsx')) tags.push('javascript');\n if (file.endsWith('.css') || file.endsWith('.scss')) tags.push('styles');\n if (file.includes('test') || file.includes('spec')) tags.push('testing');\n if (file.includes('component')) tags.push('components');\n }\n }\n\n return [...new Set(tags)];\n }\n\n /**\n * Score relevance of event\n */\n private scoreRelevance(event: ObservableEvent): number {\n // Use custom scorer if provided\n if (this.config.relevanceScorer) {\n return this.config.relevanceScorer(event);\n }\n\n // Default relevance scoring\n let score = 50; // Base score\n\n switch (event.type) {\n // High relevance events\n case 'error_encountered':\n case 'task_failed':\n score = 85;\n break;\n\n case 'solution_applied':\n score = 90;\n // Bonus if it matches a pending error\n if (event.error) {\n const errorKey = this.generateErrorKey(event.error);\n if (this.pendingErrors.has(errorKey)) {\n score = 95;\n }\n }\n break;\n\n case 'checkpoint_decision':\n score = 75;\n break;\n\n case 'verification_failed':\n score = 80;\n break;\n\n // Medium relevance events\n case 'file_modified':\n score = 60;\n // More files = higher relevance\n if (event.files && event.files.length > 3) {\n score = 70;\n }\n break;\n\n case 'checkpoint_reached':\n score = 55;\n break;\n\n case 'task_complete':\n case 'verification_passed':\n score = 50;\n break;\n\n // Lower relevance events\n case 'task_start':\n score = 30;\n break;\n\n case 'execution_start':\n case 'execution_complete':\n score = 40;\n break;\n\n case 'execution_paused':\n score = 60;\n break;\n\n default:\n score = 50;\n }\n\n // Adjust based on content richness\n if (event.context && event.context.length > 100) {\n score += 5;\n }\n\n if (event.files && event.files.length > 0) {\n score += 5;\n }\n\n // Cap at 100\n return Math.min(score, 100);\n }\n\n /**\n * Generate a key for matching errors to solutions\n */\n private generateErrorKey(error: string): string {\n // Normalize error string for matching\n return error\n .toLowerCase()\n .replace(/[0-9]+/g, 'N') // Replace numbers\n .replace(/['\"`]/g, '') // Remove quotes\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .slice(0, 100); // Limit length\n }\n\n /**\n * Get session ID\n */\n getSessionId(): string {\n return this.store.getSessionId();\n }\n\n /**\n * Get all observations\n */\n getObservations(): Observation[] {\n return this.store.getAll();\n }\n\n /**\n * Get observation count\n */\n getObservationCount(): number {\n return this.store.count();\n }\n\n /**\n * Clear all observations\n */\n clear(): void {\n this.store.clear();\n this.pendingErrors.clear();\n }\n}\n\n/**\n * Create a MemoryObserver instance\n */\nexport function createMemoryObserver(\n projectPath: string,\n sessionId?: string,\n config?: MemoryObserverConfig\n): MemoryObserver {\n return new MemoryObserver(projectPath, sessionId, config);\n}\n","/**\n * Memory-Enabled Execution Engine Integration\n *\n * Provides utilities to integrate MemoryObserver with SkillExecutionEngine.\n */\n\nimport type { AgentType } from '../types.js';\nimport {\n SkillExecutionEngine,\n createExecutionEngine,\n type ExecutionProgressCallback,\n type ExecutionProgressEvent,\n} from '../executor/engine.js';\nimport type { CheckpointHandler, ExecutionOptions, ExecutableSkill } from '../executor/types.js';\nimport { MemoryObserver, type MemoryObserverConfig } from './observer.js';\n\n/**\n * Options for creating a memory-enabled execution engine\n */\nexport interface MemoryEnabledEngineOptions {\n /** Checkpoint handler for interactive checkpoints */\n checkpointHandler?: CheckpointHandler;\n /** Additional progress callback (called alongside memory observer) */\n onProgress?: ExecutionProgressCallback;\n /** Memory observer configuration */\n memoryConfig?: MemoryObserverConfig;\n /** Session ID for the memory observer */\n sessionId?: string;\n /** Default agent type */\n defaultAgent?: AgentType;\n}\n\n/**\n * Memory-enabled execution engine wrapper\n */\nexport class MemoryEnabledEngine {\n private engine: SkillExecutionEngine;\n private observer: MemoryObserver;\n private userProgressCallback?: ExecutionProgressCallback;\n\n constructor(projectPath: string, options: MemoryEnabledEngineOptions = {}) {\n // Create memory observer\n this.observer = new MemoryObserver(projectPath, options.sessionId, options.memoryConfig);\n\n // Set default agent if provided\n if (options.defaultAgent) {\n this.observer.setAgent(options.defaultAgent);\n }\n\n // Store user's progress callback\n this.userProgressCallback = options.onProgress;\n\n // Create the combined progress callback\n const combinedProgressCallback: ExecutionProgressCallback = (event: ExecutionProgressEvent) => {\n // Forward to memory observer\n const observerCallback = this.observer.createProgressCallback();\n observerCallback(event);\n\n // Forward to user's callback if provided\n if (this.userProgressCallback) {\n this.userProgressCallback(event);\n }\n };\n\n // Create the underlying engine with the combined callback\n this.engine = createExecutionEngine(projectPath, {\n checkpointHandler: options.checkpointHandler,\n onProgress: combinedProgressCallback,\n });\n }\n\n /**\n * Execute a skill with memory observation\n */\n async execute(\n skill: ExecutableSkill,\n options: ExecutionOptions = {}\n ): ReturnType<SkillExecutionEngine['execute']> {\n // Set skill name in observer\n this.observer.setSkillName(skill.name);\n\n // Set agent if provided in options\n if (options.agent) {\n this.observer.setAgent(options.agent);\n }\n\n // Record execution start\n this.observer.recordExecutionStart(skill.name, options.agent || 'claude-code');\n\n try {\n // Execute the skill\n const result = await this.engine.execute(skill, options);\n\n // Record file modifications from result\n if (result.filesModified.length > 0) {\n this.observer.recordFileModification(\n result.filesModified,\n `Files modified during skill \"${skill.name}\" execution`\n );\n }\n\n // Record any errors\n if (result.error) {\n this.observer.recordError(result.error, `Skill \"${skill.name}\" failed`);\n }\n\n return result;\n } catch (error) {\n // Record unexpected errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.observer.recordError(errorMessage, `Unexpected error during skill \"${skill.name}\" execution`);\n throw error;\n }\n }\n\n /**\n * Record a manual error observation\n */\n recordError(error: string, context: string, taskId?: string): void {\n this.observer.recordError(error, context, taskId);\n }\n\n /**\n * Record a manual solution observation\n */\n recordSolution(solution: string, context: string, relatedError?: string): void {\n this.observer.recordSolution(solution, context, relatedError);\n }\n\n /**\n * Record a file modification observation\n */\n recordFileModification(files: string[], context: string): void {\n this.observer.recordFileModification(files, context);\n }\n\n /**\n * Record a decision observation\n */\n recordDecision(decision: string, options: string[], context: string): void {\n this.observer.recordDecision(decision, options, context);\n }\n\n /**\n * Pause execution\n */\n pause(): boolean {\n const paused = this.engine.pause();\n if (paused) {\n this.observer.recordExecutionPause();\n }\n return paused;\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n return this.engine.isPaused();\n }\n\n /**\n * Get the memory observer\n */\n getObserver(): MemoryObserver {\n return this.observer;\n }\n\n /**\n * Get the underlying execution engine\n */\n getEngine(): SkillExecutionEngine {\n return this.engine;\n }\n\n /**\n * Get the session manager\n */\n getSessionManager(): ReturnType<SkillExecutionEngine['getSessionManager']> {\n return this.engine.getSessionManager();\n }\n\n /**\n * Get observation count\n */\n getObservationCount(): number {\n return this.observer.getObservationCount();\n }\n\n /**\n * Get all observations\n */\n getObservations(): ReturnType<MemoryObserver['getObservations']> {\n return this.observer.getObservations();\n }\n\n /**\n * Clear observations\n */\n clearObservations(): void {\n this.observer.clear();\n }\n}\n\n/**\n * Create a memory-enabled execution engine\n */\nexport function createMemoryEnabledEngine(\n projectPath: string,\n options?: MemoryEnabledEngineOptions\n): MemoryEnabledEngine {\n return new MemoryEnabledEngine(projectPath, options);\n}\n\n/**\n * Wrap an existing progress callback with memory observation\n */\nexport function wrapProgressCallbackWithMemory(\n projectPath: string,\n existingCallback?: ExecutionProgressCallback,\n memoryConfig?: MemoryObserverConfig,\n sessionId?: string\n): { callback: ExecutionProgressCallback; observer: MemoryObserver } {\n const observer = new MemoryObserver(projectPath, sessionId, memoryConfig);\n const observerCallback = observer.createProgressCallback();\n\n const wrappedCallback: ExecutionProgressCallback = (event: ExecutionProgressEvent) => {\n observerCallback(event);\n if (existingCallback) {\n existingCallback(event);\n }\n };\n\n return { callback: wrappedCallback, observer };\n}\n","/**\n * Memory Compression Engine\n *\n * Compresses raw observations into learnings using either rule-based\n * extraction or AI-powered compression.\n */\n\nimport { homedir } from 'node:os';\nimport type { Observation, Learning, ObservationType } from './types.js';\nimport { LearningStore } from './learning-store.js';\nimport { MemoryIndexStore } from './memory-index.js';\n\n/**\n * Compression result for a single learning\n */\nexport interface CompressedLearning {\n title: string;\n content: string;\n tags: string[];\n frameworks?: string[];\n patterns?: string[];\n importance: number; // 1-10\n sourceObservationIds: string[];\n}\n\n/**\n * Compression result\n */\nexport interface CompressionResult {\n learnings: CompressedLearning[];\n processedObservationIds: string[];\n skippedObservationIds: string[];\n stats: {\n inputCount: number;\n outputCount: number;\n compressionRatio: number;\n };\n}\n\n/**\n * Compression options\n */\nexport interface CompressionOptions {\n /** Minimum observations to trigger compression */\n minObservations?: number;\n /** Maximum learnings to generate per compression */\n maxLearnings?: number;\n /** Minimum importance score (1-10) to keep a learning */\n minImportance?: number;\n /** Whether to include low-relevance observations */\n includeLowRelevance?: boolean;\n /** Custom tags to add to all learnings */\n additionalTags?: string[];\n /** Project name for context */\n projectName?: string;\n}\n\nconst DEFAULT_COMPRESSION_OPTIONS: Required<CompressionOptions> = {\n minObservations: 3,\n maxLearnings: 10,\n minImportance: 4,\n includeLowRelevance: false,\n additionalTags: [],\n projectName: '',\n};\n\n/**\n * Compression engine interface\n */\nexport interface CompressionEngine {\n /**\n * Compress observations into learnings\n */\n compress(observations: Observation[], options?: CompressionOptions): Promise<CompressionResult>;\n\n /**\n * Get the engine type\n */\n getType(): 'rule-based' | 'api';\n}\n\n/**\n * Rule-based compression engine\n *\n * Uses heuristics and patterns to extract learnings without AI.\n */\nexport class RuleBasedCompressor implements CompressionEngine {\n getType(): 'rule-based' | 'api' {\n return 'rule-based';\n }\n\n async compress(\n observations: Observation[],\n options: CompressionOptions = {}\n ): Promise<CompressionResult> {\n const opts = { ...DEFAULT_COMPRESSION_OPTIONS, ...options };\n\n // Filter observations\n const filtered = opts.includeLowRelevance\n ? observations\n : observations.filter((o) => o.relevance >= 50);\n\n if (filtered.length < opts.minObservations) {\n return {\n learnings: [],\n processedObservationIds: [],\n skippedObservationIds: observations.map((o) => o.id),\n stats: {\n inputCount: observations.length,\n outputCount: 0,\n compressionRatio: 0,\n },\n };\n }\n\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Group observations by type\n const byType = this.groupByType(filtered);\n\n // Extract error-solution pairs\n const errorSolutionLearnings = this.extractErrorSolutionPairs(byType, opts);\n learnings.push(...errorSolutionLearnings.learnings);\n processedIds.push(...errorSolutionLearnings.processedIds);\n\n // Extract decision patterns\n const decisionLearnings = this.extractDecisionPatterns(byType, opts);\n learnings.push(...decisionLearnings.learnings);\n processedIds.push(...decisionLearnings.processedIds);\n\n // Extract file change patterns\n const fileChangeLearnings = this.extractFileChangePatterns(byType, opts);\n learnings.push(...fileChangeLearnings.learnings);\n processedIds.push(...fileChangeLearnings.processedIds);\n\n // Extract tool usage patterns\n const toolUsageLearnings = this.extractToolUsagePatterns(byType, opts);\n learnings.push(...toolUsageLearnings.learnings);\n processedIds.push(...toolUsageLearnings.processedIds);\n\n // Filter by importance and limit\n const finalLearnings = learnings\n .filter((l) => l.importance >= opts.minImportance)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, opts.maxLearnings);\n\n // Add additional tags\n if (opts.additionalTags.length > 0) {\n for (const learning of finalLearnings) {\n learning.tags = [...new Set([...learning.tags, ...opts.additionalTags])];\n }\n }\n\n const skippedIds = observations\n .map((o) => o.id)\n .filter((id) => !processedIds.includes(id));\n\n return {\n learnings: finalLearnings,\n processedObservationIds: processedIds,\n skippedObservationIds: skippedIds,\n stats: {\n inputCount: observations.length,\n outputCount: finalLearnings.length,\n compressionRatio: observations.length > 0 ? finalLearnings.length / observations.length : 0,\n },\n };\n }\n\n private groupByType(observations: Observation[]): Map<ObservationType, Observation[]> {\n const groups = new Map<ObservationType, Observation[]>();\n for (const obs of observations) {\n const existing = groups.get(obs.type) || [];\n existing.push(obs);\n groups.set(obs.type, existing);\n }\n return groups;\n }\n\n private extractErrorSolutionPairs(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const errors = byType.get('error') || [];\n const solutions = byType.get('solution') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Match errors with solutions\n for (const error of errors) {\n const errorText = error.content.error || error.content.action;\n const matchingSolution = solutions.find((s) => {\n const solutionContext = s.content.context?.toLowerCase() || '';\n const solutionAction = s.content.action?.toLowerCase() || '';\n const errorLower = errorText.toLowerCase();\n\n // Require keyword similarity between error and solution\n const hasKeywordMatch = this.hasSimilarKeywords(errorLower, solutionContext) ||\n this.hasSimilarKeywords(errorLower, solutionAction);\n if (!hasKeywordMatch) {\n return false;\n }\n\n // Solution should indicate it's a fix/resolution, or have strong keyword overlap\n const isSolutionIndicator = solutionContext.includes('fix') ||\n solutionContext.includes('resolve') ||\n solutionContext.includes('solution') ||\n solutionAction.includes('fix') ||\n solutionAction.includes('resolve');\n\n // Require both keyword match AND solution indicator\n return isSolutionIndicator || this.hasStrongKeywordOverlap(errorLower, solutionContext);\n });\n\n if (matchingSolution) {\n const title = this.generateTitle('Error Resolution', errorText);\n const content = this.formatErrorSolutionContent(error, matchingSolution);\n const tags = this.extractTags([error, matchingSolution]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['error-handling', 'debugging'],\n importance: 8,\n sourceObservationIds: [error.id, matchingSolution.id],\n });\n\n processedIds.push(error.id, matchingSolution.id);\n } else if (error.content.error) {\n // Standalone error learning\n const title = this.generateTitle('Error Pattern', errorText);\n const content = this.formatStandaloneErrorContent(error);\n const tags = this.extractTags([error]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['error-handling'],\n importance: 6,\n sourceObservationIds: [error.id],\n });\n\n processedIds.push(error.id);\n }\n }\n\n // Process remaining solutions\n for (const solution of solutions) {\n if (!processedIds.includes(solution.id)) {\n const title = this.generateTitle('Solution', solution.content.action);\n const content = this.formatSolutionContent(solution);\n const tags = this.extractTags([solution]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['solution-pattern'],\n importance: 7,\n sourceObservationIds: [solution.id],\n });\n\n processedIds.push(solution.id);\n }\n }\n\n return { learnings, processedIds };\n }\n\n private extractDecisionPatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const decisions = byType.get('decision') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n for (const decision of decisions) {\n const title = this.generateTitle('Decision', decision.content.action);\n const content = this.formatDecisionContent(decision);\n const tags = this.extractTags([decision]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['decision-making', 'architecture'],\n importance: 7,\n sourceObservationIds: [decision.id],\n });\n\n processedIds.push(decision.id);\n }\n\n return { learnings, processedIds };\n }\n\n private extractFileChangePatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const fileChanges = byType.get('file_change') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Group file changes by pattern (same files modified together)\n const filePatterns = new Map<string, Observation[]>();\n for (const change of fileChanges) {\n const files = change.content.files || [];\n const pattern = this.getFilePattern(files);\n const existing = filePatterns.get(pattern) || [];\n existing.push(change);\n filePatterns.set(pattern, existing);\n }\n\n // Create learnings for significant patterns (2+ occurrences)\n for (const [pattern, changes] of filePatterns) {\n if (changes.length >= 2 || changes.some((c) => (c.content.files?.length || 0) > 3)) {\n const title = `File Modification Pattern: ${pattern}`;\n const content = this.formatFileChangeContent(changes);\n const tags = this.extractTags(changes);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['file-organization', 'code-structure'],\n importance: 5,\n sourceObservationIds: changes.map((c) => c.id),\n });\n\n processedIds.push(...changes.map((c) => c.id));\n }\n }\n\n return { learnings, processedIds };\n }\n\n private extractToolUsagePatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const toolUses = byType.get('tool_use') || [];\n const checkpoints = byType.get('checkpoint') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Only extract if there are significant patterns\n const allObs = [...toolUses, ...checkpoints];\n if (allObs.length >= 5) {\n // Group by common action patterns\n const actionPatterns = new Map<string, Observation[]>();\n for (const obs of allObs) {\n const actionType = this.getActionType(obs.content.action);\n const existing = actionPatterns.get(actionType) || [];\n existing.push(obs);\n actionPatterns.set(actionType, existing);\n }\n\n for (const [actionType, observations] of actionPatterns) {\n if (observations.length >= 3) {\n const title = `Workflow Pattern: ${actionType}`;\n const content = this.formatToolUsageContent(observations);\n const tags = this.extractTags(observations);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['workflow', 'automation'],\n importance: 4,\n sourceObservationIds: observations.map((o) => o.id),\n });\n\n processedIds.push(...observations.map((o) => o.id));\n }\n }\n }\n\n return { learnings, processedIds };\n }\n\n private generateTitle(prefix: string, text: string): string {\n // Extract key words from text\n const cleaned = text\n .replace(/[^a-zA-Z0-9\\s]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n const words = cleaned.split(' ').slice(0, 5).join(' ');\n return `${prefix}: ${words}`.slice(0, 80);\n }\n\n private formatErrorSolutionContent(error: Observation, solution: Observation): string {\n return `## Problem\n${error.content.error || error.content.action}\n\n**Context:** ${error.content.context}\n\n## Solution\n${solution.content.solution || solution.content.action}\n\n**How it was applied:** ${solution.content.context}\n\n## Files Involved\n${[...(error.content.files || []), ...(solution.content.files || [])].join(', ') || 'N/A'}\n`;\n }\n\n private formatStandaloneErrorContent(error: Observation): string {\n return `## Error\n${error.content.error || error.content.action}\n\n**Context:** ${error.content.context}\n\n## Files Involved\n${error.content.files?.join(', ') || 'N/A'}\n\n## Notes\nThis error was encountered but no direct solution was recorded. Consider investigating similar patterns.\n`;\n }\n\n private formatSolutionContent(solution: Observation): string {\n return `## Solution\n${solution.content.solution || solution.content.action}\n\n**Context:** ${solution.content.context}\n\n## Result\n${solution.content.result || 'Solution applied successfully'}\n\n## Files Involved\n${solution.content.files?.join(', ') || 'N/A'}\n`;\n }\n\n private formatDecisionContent(decision: Observation): string {\n return `## Decision\n${decision.content.action}\n\n**Context:** ${decision.content.context}\n\n## Reasoning\nThis decision was made during skill execution. The context above explains why this approach was chosen.\n\n## Result\n${decision.content.result || 'Decision implemented'}\n`;\n }\n\n private formatFileChangeContent(changes: Observation[]): string {\n const allFiles = new Set<string>();\n const contexts: string[] = [];\n\n for (const change of changes) {\n for (const file of change.content.files || []) {\n allFiles.add(file);\n }\n if (change.content.context) {\n contexts.push(`- ${change.content.context}`);\n }\n }\n\n return `## Files Modified\n${Array.from(allFiles).join('\\n')}\n\n## Contexts\n${contexts.join('\\n') || 'Various modifications'}\n\n## Pattern\nThese files were frequently modified together, suggesting a common pattern or component boundary.\n`;\n }\n\n private formatToolUsageContent(observations: Observation[]): string {\n const actions = observations\n .map((o) => `- ${o.content.action}`)\n .slice(0, 10)\n .join('\\n');\n\n return `## Workflow Steps\n${actions}\n\n## Pattern\nThis sequence of actions was repeated during execution, indicating a common workflow pattern.\n\n## Recommendation\nConsider automating or documenting this workflow for future reference.\n`;\n }\n\n private extractTags(observations: Observation[]): string[] {\n const tags = new Set<string>();\n for (const obs of observations) {\n for (const tag of obs.content.tags || []) {\n tags.add(tag.toLowerCase());\n }\n }\n return Array.from(tags);\n }\n\n private extractFrameworks(tags: string[]): string[] {\n const frameworks = [\n 'react',\n 'nextjs',\n 'vue',\n 'angular',\n 'svelte',\n 'express',\n 'nestjs',\n 'fastify',\n 'django',\n 'flask',\n 'rails',\n 'spring',\n 'typescript',\n 'javascript',\n 'python',\n 'rust',\n 'go',\n ];\n return tags.filter((t) => frameworks.includes(t.toLowerCase()));\n }\n\n private getFilePattern(files: string[]): string {\n if (files.length === 0) return 'unknown';\n\n // Extract common directory\n const dirs = files.map((f) => {\n const parts = f.split('/');\n return parts.slice(0, -1).join('/') || 'root';\n });\n\n const uniqueDirs = [...new Set(dirs)];\n if (uniqueDirs.length === 1) {\n return uniqueDirs[0];\n }\n\n // Extract file types\n const extensions = files.map((f) => {\n const ext = f.split('.').pop() || 'unknown';\n return ext;\n });\n const uniqueExts = [...new Set(extensions)];\n\n return `${uniqueDirs[0]} (${uniqueExts.join(', ')})`;\n }\n\n private getActionType(action: string): string {\n const actionLower = action.toLowerCase();\n if (actionLower.includes('read') || actionLower.includes('view')) return 'read';\n if (actionLower.includes('write') || actionLower.includes('create')) return 'write';\n if (actionLower.includes('edit') || actionLower.includes('modify')) return 'edit';\n if (actionLower.includes('delete') || actionLower.includes('remove')) return 'delete';\n if (actionLower.includes('test') || actionLower.includes('verify')) return 'test';\n if (actionLower.includes('build') || actionLower.includes('compile')) return 'build';\n if (actionLower.includes('start') || actionLower.includes('run')) return 'run';\n return 'other';\n }\n\n private hasSimilarKeywords(text1: string, text2: string): boolean {\n // Normalize: lowercase and strip punctuation for better matching\n const normalize = (word: string) => word.toLowerCase().replace(/[^a-z0-9]/g, '');\n const words1 = text1.split(/\\s+/).map(normalize).filter((w) => w.length > 3);\n const words2 = new Set(text2.split(/\\s+/).map(normalize).filter((w) => w.length > 3));\n return words1.some((w) => words2.has(w));\n }\n\n /**\n * Check for strong keyword overlap (multiple matching words)\n * More strict than hasSimilarKeywords - requires at least 2 matching words\n */\n private hasStrongKeywordOverlap(text1: string, text2: string): boolean {\n // Normalize: lowercase and strip punctuation for better matching\n const normalize = (word: string) => word.toLowerCase().replace(/[^a-z0-9]/g, '');\n const words1 = text1.split(/\\s+/).map(normalize).filter((w) => w.length > 3);\n const words2 = new Set(text2.split(/\\s+/).map(normalize).filter((w) => w.length > 3));\n const matchCount = words1.filter((w) => words2.has(w)).length;\n return matchCount >= 2;\n }\n}\n\n/**\n * API-based compression engine configuration\n */\nexport interface APICompressionConfig {\n /** API provider */\n provider: 'anthropic' | 'openai';\n /** API key */\n apiKey: string;\n /** Model to use */\n model?: string;\n /** Maximum tokens for response */\n maxTokens?: number;\n}\n\n/**\n * API-based compression engine\n *\n * Uses Claude or OpenAI to extract learnings from observations.\n */\nexport class APIBasedCompressor implements CompressionEngine {\n private config: APICompressionConfig;\n\n constructor(config: APICompressionConfig) {\n this.config = config;\n }\n\n getType(): 'rule-based' | 'api' {\n return 'api';\n }\n\n async compress(\n observations: Observation[],\n options: CompressionOptions = {}\n ): Promise<CompressionResult> {\n const opts = { ...DEFAULT_COMPRESSION_OPTIONS, ...options };\n\n // Filter observations\n const filtered = opts.includeLowRelevance\n ? observations\n : observations.filter((o) => o.relevance >= 50);\n\n if (filtered.length < opts.minObservations) {\n return {\n learnings: [],\n processedObservationIds: [],\n skippedObservationIds: observations.map((o) => o.id),\n stats: {\n inputCount: observations.length,\n outputCount: 0,\n compressionRatio: 0,\n },\n };\n }\n\n // Format observations for the prompt\n const observationsText = this.formatObservationsForPrompt(filtered);\n\n // Build the prompt\n const prompt = this.buildCompressionPrompt(observationsText, opts);\n\n try {\n // Call the API\n const response = await this.callAPI(prompt);\n\n // Parse the response\n const learnings = this.parseAPIResponse(response, filtered);\n\n // Filter and limit\n const finalLearnings = learnings\n .filter((l) => l.importance >= opts.minImportance)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, opts.maxLearnings);\n\n // Add additional tags\n if (opts.additionalTags.length > 0) {\n for (const learning of finalLearnings) {\n learning.tags = [...new Set([...learning.tags, ...opts.additionalTags])];\n }\n }\n\n const processedIds = finalLearnings.flatMap((l) => l.sourceObservationIds);\n const skippedIds = observations\n .map((o) => o.id)\n .filter((id) => !processedIds.includes(id));\n\n return {\n learnings: finalLearnings,\n processedObservationIds: processedIds,\n skippedObservationIds: skippedIds,\n stats: {\n inputCount: observations.length,\n outputCount: finalLearnings.length,\n compressionRatio:\n observations.length > 0 ? finalLearnings.length / observations.length : 0,\n },\n };\n } catch (error) {\n // Fall back to rule-based compression on API failure\n console.warn('API compression failed, falling back to rule-based:', error);\n const fallback = new RuleBasedCompressor();\n return fallback.compress(observations, options);\n }\n }\n\n private formatObservationsForPrompt(observations: Observation[]): string {\n return observations\n .map(\n (o, i) => `\n[Observation ${i + 1}] ID: ${o.id}\nType: ${o.type}\nTimestamp: ${o.timestamp}\nAction: ${o.content.action}\nContext: ${o.content.context}\n${o.content.error ? `Error: ${o.content.error}` : ''}\n${o.content.solution ? `Solution: ${o.content.solution}` : ''}\n${o.content.result ? `Result: ${o.content.result}` : ''}\n${o.content.files?.length ? `Files: ${o.content.files.join(', ')}` : ''}\n${o.content.tags?.length ? `Tags: ${o.content.tags.join(', ')}` : ''}\nRelevance: ${o.relevance}/100\n`\n )\n .join('\\n---\\n');\n }\n\n private buildCompressionPrompt(observationsText: string, opts: Required<CompressionOptions>): string {\n return `Analyze these session observations and extract key learnings that would be valuable for future development sessions.\n\n## Observations\n${observationsText}\n\n## Instructions\nExtract meaningful learnings from these observations. For each learning:\n1. Create a concise, actionable title (max 80 characters)\n2. Write content that explains:\n - What was learned\n - When/why this is useful\n - How to apply it\n3. Add relevant tags (lowercase, hyphenated)\n4. Rate importance (1-10, where 10 is critical)\n\nFocus on:\n- Error patterns and their solutions\n- Decisions made and their reasoning\n- Workflow patterns that emerged\n- Best practices discovered\n- Gotchas and edge cases\n\n${opts.projectName ? `Project context: ${opts.projectName}` : ''}\n\n## Output Format\nRespond with valid JSON array:\n[\n {\n \"title\": \"...\",\n \"content\": \"...\",\n \"tags\": [\"tag1\", \"tag2\"],\n \"frameworks\": [\"react\", \"typescript\"],\n \"patterns\": [\"error-handling\", \"debugging\"],\n \"importance\": 8,\n \"sourceObservationIds\": [\"obs-id-1\", \"obs-id-2\"]\n }\n]\n\nGenerate up to ${opts.maxLearnings} learnings. Only include learnings with importance >= ${opts.minImportance}.`;\n }\n\n private async callAPI(prompt: string): Promise<string> {\n if (this.config.provider === 'anthropic') {\n return this.callAnthropic(prompt);\n } else {\n return this.callOpenAI(prompt);\n }\n }\n\n private async callAnthropic(prompt: string): Promise<string> {\n const model = this.config.model || 'claude-3-haiku-20240307';\n const maxTokens = this.config.maxTokens || 4096;\n\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: maxTokens,\n messages: [{ role: 'user', content: prompt }],\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as { content: Array<{ text: string }> };\n return data.content[0]?.text || '';\n }\n\n private async callOpenAI(prompt: string): Promise<string> {\n const model = this.config.model || 'gpt-4o-mini';\n const maxTokens = this.config.maxTokens || 4096;\n\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model,\n max_tokens: maxTokens,\n messages: [{ role: 'user', content: prompt }],\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as {\n choices: Array<{ message: { content: string } }>;\n };\n return data.choices[0]?.message?.content || '';\n }\n\n private parseAPIResponse(response: string, observations: Observation[]): CompressedLearning[] {\n try {\n // Extract JSON from response (handle markdown code blocks)\n let jsonStr = response;\n const jsonMatch = response.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) {\n jsonStr = jsonMatch[1];\n }\n\n const parsed = JSON.parse(jsonStr.trim());\n\n if (!Array.isArray(parsed)) {\n throw new Error('Response is not an array');\n }\n\n // Validate and clean up each learning\n const observationIds = new Set(observations.map((o) => o.id));\n return parsed\n .filter((item): item is CompressedLearning => {\n return (\n typeof item === 'object' &&\n typeof item.title === 'string' &&\n typeof item.content === 'string' &&\n Array.isArray(item.tags) &&\n typeof item.importance === 'number'\n );\n })\n .map((item) => ({\n ...item,\n // Validate source observation IDs\n sourceObservationIds: (item.sourceObservationIds || []).filter((id: string) =>\n observationIds.has(id)\n ),\n frameworks: item.frameworks || [],\n patterns: item.patterns || [],\n }));\n } catch (error) {\n console.warn('Failed to parse API response:', error);\n return [];\n }\n }\n}\n\n/**\n * Memory compressor that manages compression and stores results\n */\nexport class MemoryCompressor {\n private engine: CompressionEngine;\n private learningStore: LearningStore;\n private indexStore: MemoryIndexStore;\n private projectName?: string;\n\n constructor(\n projectPath: string,\n options?: {\n engine?: CompressionEngine;\n scope?: 'project' | 'global';\n projectName?: string;\n }\n ) {\n this.engine = options?.engine || new RuleBasedCompressor();\n this.learningStore = new LearningStore(\n options?.scope || 'project',\n projectPath,\n options?.projectName\n );\n // For global scope, use home directory; for project scope, use project path\n const indexBasePath = options?.scope === 'global' ? homedir() : projectPath;\n this.indexStore = new MemoryIndexStore(indexBasePath, options?.scope === 'global');\n this.projectName = options?.projectName;\n }\n\n /**\n * Set the compression engine\n */\n setEngine(engine: CompressionEngine): void {\n this.engine = engine;\n }\n\n /**\n * Compress observations without storing (for dry-run/preview)\n */\n async compress(\n observations: Observation[],\n options?: CompressionOptions\n ): Promise<CompressionResult> {\n const compressionOptions = {\n ...options,\n projectName: this.projectName || options?.projectName,\n };\n return this.engine.compress(observations, compressionOptions);\n }\n\n /**\n * Compress observations and store as learnings\n */\n async compressAndStore(\n observations: Observation[],\n options?: CompressionOptions\n ): Promise<{\n learnings: Learning[];\n result: CompressionResult;\n }> {\n const compressionOptions = {\n ...options,\n projectName: this.projectName || options?.projectName,\n };\n\n // Compress observations\n const result = await this.engine.compress(observations, compressionOptions);\n\n // Store each learning\n const storedLearnings: Learning[] = [];\n for (const compressed of result.learnings) {\n const learning = this.learningStore.add({\n source: 'session',\n sourceObservations: compressed.sourceObservationIds,\n title: compressed.title,\n content: compressed.content,\n tags: compressed.tags,\n frameworks: compressed.frameworks,\n patterns: compressed.patterns,\n });\n\n // Index the learning\n this.indexStore.indexLearning(learning);\n\n storedLearnings.push(learning);\n }\n\n return {\n learnings: storedLearnings,\n result,\n };\n }\n\n /**\n * Get the learning store\n */\n getLearningStore(): LearningStore {\n return this.learningStore;\n }\n\n /**\n * Get the index store\n */\n getIndexStore(): MemoryIndexStore {\n return this.indexStore;\n }\n\n /**\n * Get compression engine type\n */\n getEngineType(): 'rule-based' | 'api' {\n return this.engine.getType();\n }\n}\n\n/**\n * Learning consolidator\n *\n * Merges similar learnings to reduce redundancy.\n */\nexport class LearningConsolidator {\n /**\n * Find similar learnings\n */\n findSimilar(learnings: Learning[], similarity = 0.7): Array<[Learning, Learning]> {\n const pairs: Array<[Learning, Learning]> = [];\n\n for (let i = 0; i < learnings.length; i++) {\n for (let j = i + 1; j < learnings.length; j++) {\n const score = this.calculateSimilarity(learnings[i], learnings[j]);\n if (score >= similarity) {\n pairs.push([learnings[i], learnings[j]]);\n }\n }\n }\n\n return pairs;\n }\n\n /**\n * Merge two similar learnings\n */\n merge(learning1: Learning, learning2: Learning): Omit<Learning, 'id' | 'createdAt' | 'updatedAt'> {\n // Keep the more effective/used one as base\n const base = this.getBetterLearning(learning1, learning2);\n const other = base === learning1 ? learning2 : learning1;\n\n return {\n // Preserve the source from the base learning instead of hard-coding 'session'\n source: base.source,\n sourceObservations: [\n ...(base.sourceObservations || []),\n ...(other.sourceObservations || []),\n ],\n title: base.title,\n content: this.mergeContent(base.content, other.content),\n scope: base.scope,\n project: base.project,\n tags: [...new Set([...base.tags, ...other.tags])],\n frameworks: [...new Set([...(base.frameworks || []), ...(other.frameworks || [])])],\n patterns: [...new Set([...(base.patterns || []), ...(other.patterns || [])])],\n useCount: base.useCount + other.useCount,\n lastUsed: base.lastUsed || other.lastUsed,\n effectiveness: base.effectiveness ?? other.effectiveness,\n };\n }\n\n /**\n * Consolidate a list of learnings\n */\n consolidate(\n learnings: Learning[],\n store: LearningStore,\n index: MemoryIndexStore,\n similarity = 0.7\n ): { merged: number; remaining: number } {\n const pairs = this.findSimilar(learnings, similarity);\n const mergedIds = new Set<string>();\n let mergedCount = 0;\n\n for (const [l1, l2] of pairs) {\n if (mergedIds.has(l1.id) || mergedIds.has(l2.id)) {\n continue;\n }\n\n // Merge the learnings\n const merged = this.merge(l1, l2);\n\n // Add the merged learning\n const newLearning = store.add(merged);\n index.indexLearning(newLearning);\n\n // Remove the old learnings\n store.delete(l1.id);\n store.delete(l2.id);\n index.removeLearning(l1.id);\n index.removeLearning(l2.id);\n\n mergedIds.add(l1.id);\n mergedIds.add(l2.id);\n mergedCount++;\n }\n\n return {\n merged: mergedCount,\n remaining: learnings.length - mergedCount * 2 + mergedCount,\n };\n }\n\n private calculateSimilarity(l1: Learning, l2: Learning): number {\n let score = 0;\n\n // Title similarity (Jaccard)\n const title1Words = new Set(l1.title.toLowerCase().split(/\\s+/));\n const title2Words = new Set(l2.title.toLowerCase().split(/\\s+/));\n const titleIntersection = [...title1Words].filter((w) => title2Words.has(w)).length;\n const titleUnion = new Set([...title1Words, ...title2Words]).size;\n score += (titleIntersection / titleUnion) * 0.3;\n\n // Tag overlap\n const tags1 = new Set(l1.tags);\n const tags2 = new Set(l2.tags);\n const tagIntersection = [...tags1].filter((t) => tags2.has(t)).length;\n const tagUnion = new Set([...tags1, ...tags2]).size;\n if (tagUnion > 0) {\n score += (tagIntersection / tagUnion) * 0.3;\n }\n\n // Pattern overlap\n const patterns1 = new Set(l1.patterns || []);\n const patterns2 = new Set(l2.patterns || []);\n const patternIntersection = [...patterns1].filter((p) => patterns2.has(p)).length;\n const patternUnion = new Set([...patterns1, ...patterns2]).size;\n if (patternUnion > 0) {\n score += (patternIntersection / patternUnion) * 0.2;\n }\n\n // Content similarity (simple word overlap)\n const content1Words = new Set(\n l1.content\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 4)\n );\n const content2Words = new Set(\n l2.content\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 4)\n );\n const contentIntersection = [...content1Words].filter((w) => content2Words.has(w)).length;\n const contentUnion = new Set([...content1Words, ...content2Words]).size;\n if (contentUnion > 0) {\n score += (contentIntersection / contentUnion) * 0.2;\n }\n\n return score;\n }\n\n private getBetterLearning(l1: Learning, l2: Learning): Learning {\n // Prefer higher effectiveness\n if (l1.effectiveness !== l2.effectiveness) {\n return (l1.effectiveness || 0) > (l2.effectiveness || 0) ? l1 : l2;\n }\n // Prefer higher use count\n if (l1.useCount !== l2.useCount) {\n return l1.useCount > l2.useCount ? l1 : l2;\n }\n // Prefer more recent\n return new Date(l1.updatedAt) > new Date(l2.updatedAt) ? l1 : l2;\n }\n\n private mergeContent(content1: string, content2: string): string {\n // Simple merge: keep the longer one and add a note\n if (content1.length >= content2.length) {\n return content1;\n }\n return content2;\n }\n}\n\n/**\n * Create a rule-based compressor\n */\nexport function createRuleBasedCompressor(): RuleBasedCompressor {\n return new RuleBasedCompressor();\n}\n\n/**\n * Create an API-based compressor\n */\nexport function createAPIBasedCompressor(config: APICompressionConfig): APIBasedCompressor {\n return new APIBasedCompressor(config);\n}\n\n/**\n * Create a memory compressor\n */\nexport function createMemoryCompressor(\n projectPath: string,\n options?: {\n engine?: CompressionEngine;\n scope?: 'project' | 'global';\n projectName?: string;\n }\n): MemoryCompressor {\n return new MemoryCompressor(projectPath, options);\n}\n","/**\n * Memory Injector\n *\n * Injects relevant memories into agent context with relevance matching,\n * agent-specific formatting, and token budgeting.\n */\n\nimport type { AgentType } from '../types.js';\nimport type { ProjectContext } from '../context/types.js';\nimport type { Learning, MemorySummary, MemoryPreview, MemoryFull } from './types.js';\nimport { LearningStore } from './learning-store.js';\n\n/**\n * Injection options\n */\nexport interface InjectionOptions {\n /** Maximum tokens to use for injected memories */\n maxTokens?: number;\n /** Minimum relevance score to include (0-100) */\n minRelevance?: number;\n /** Maximum number of learnings to inject */\n maxLearnings?: number;\n /** Include global memories */\n includeGlobal?: boolean;\n /** Specific tags to match */\n tags?: string[];\n /** Current task description for relevance matching */\n currentTask?: string;\n /** Progressive disclosure level */\n disclosureLevel?: 'summary' | 'preview' | 'full';\n}\n\n/**\n * Injected memory with relevance score\n */\nexport interface InjectedMemory {\n learning: Learning;\n relevanceScore: number;\n matchedBy: {\n frameworks: string[];\n tags: string[];\n keywords: string[];\n patterns: string[];\n };\n tokenEstimate: number;\n}\n\n/**\n * Injection result\n */\nexport interface InjectionResult {\n memories: InjectedMemory[];\n formattedContent: string;\n totalTokens: number;\n stats: {\n considered: number;\n matched: number;\n injected: number;\n truncated: number;\n };\n}\n\n/**\n * Default injection options\n */\nconst DEFAULT_OPTIONS: Required<Omit<InjectionOptions, 'tags' | 'currentTask'>> = {\n maxTokens: 2000,\n minRelevance: 30,\n maxLearnings: 10,\n includeGlobal: true,\n disclosureLevel: 'preview',\n};\n\n/**\n * Approximate tokens per character (conservative estimate)\n */\nconst TOKENS_PER_CHAR = 0.25;\n\n/**\n * Memory Injector\n *\n * Retrieves and formats relevant memories for injection into agent context.\n */\nexport class MemoryInjector {\n private projectStore: LearningStore;\n private globalStore: LearningStore;\n private projectContext?: ProjectContext;\n\n constructor(\n projectPath: string,\n projectName?: string,\n projectContext?: ProjectContext\n ) {\n this.projectStore = new LearningStore('project', projectPath, projectName);\n this.globalStore = new LearningStore('global');\n this.projectContext = projectContext;\n }\n\n /**\n * Set project context for better relevance matching\n */\n setProjectContext(context: ProjectContext): void {\n this.projectContext = context;\n }\n\n /**\n * Get relevant memories for injection\n */\n async getRelevantMemories(options: InjectionOptions = {}): Promise<InjectedMemory[]> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Collect all learnings\n const projectLearnings = this.projectStore.getAll();\n const globalLearnings = opts.includeGlobal ? this.globalStore.getAll() : [];\n const allLearnings = [...projectLearnings, ...globalLearnings];\n\n // Score each learning for relevance\n const scored = allLearnings.map((learning) => ({\n learning,\n ...this.scoreLearning(learning, opts),\n }));\n\n // Filter by minimum relevance\n const filtered = scored.filter((s) => s.relevanceScore >= opts.minRelevance);\n\n // Sort by relevance (descending)\n filtered.sort((a, b) => b.relevanceScore - a.relevanceScore);\n\n // Limit to max learnings\n return filtered.slice(0, opts.maxLearnings);\n }\n\n /**\n * Score a learning for relevance to current context\n */\n private scoreLearning(\n learning: Learning,\n options: InjectionOptions\n ): Omit<InjectedMemory, 'learning'> {\n let score = 0;\n const matchedBy = {\n frameworks: [] as string[],\n tags: [] as string[],\n keywords: [] as string[],\n patterns: [] as string[],\n };\n\n // Match by frameworks from project context\n if (this.projectContext?.stack) {\n const projectFrameworks = this.extractFrameworkNames();\n const learningFrameworks = learning.frameworks || [];\n\n for (const fw of learningFrameworks) {\n if (projectFrameworks.has(fw.toLowerCase())) {\n score += 15;\n matchedBy.frameworks.push(fw);\n }\n }\n }\n\n // Match by explicitly requested tags\n if (options.tags && options.tags.length > 0) {\n const requestedTags = new Set(options.tags.map((t) => t.toLowerCase()));\n for (const tag of learning.tags) {\n if (requestedTags.has(tag.toLowerCase())) {\n score += 20;\n matchedBy.tags.push(tag);\n }\n }\n }\n\n // Match by current task keywords\n if (options.currentTask) {\n const taskKeywords = this.extractKeywords(options.currentTask);\n const learningKeywords = [\n ...this.extractKeywords(learning.title),\n ...this.extractKeywords(learning.content),\n ...learning.tags,\n ];\n\n const learningKeywordSet = new Set(learningKeywords.map((k) => k.toLowerCase()));\n for (const kw of taskKeywords) {\n if (learningKeywordSet.has(kw.toLowerCase())) {\n score += 10;\n if (!matchedBy.keywords.includes(kw)) {\n matchedBy.keywords.push(kw);\n }\n }\n }\n }\n\n // Match by patterns\n if (learning.patterns && learning.patterns.length > 0) {\n // Patterns are valuable - boost score\n score += learning.patterns.length * 5;\n matchedBy.patterns.push(...learning.patterns);\n }\n\n // Boost by effectiveness if known\n if (learning.effectiveness !== undefined) {\n score += (learning.effectiveness / 100) * 20;\n }\n\n // Boost by use count (popular learnings are likely valuable)\n score += Math.min(learning.useCount * 2, 15);\n\n // Boost recent learnings\n const daysSinceUpdate = this.daysSince(learning.updatedAt);\n if (daysSinceUpdate < 7) {\n score += 10;\n } else if (daysSinceUpdate < 30) {\n score += 5;\n }\n\n // Cap score at 100\n score = Math.min(score, 100);\n\n // Estimate token count\n const tokenEstimate = this.estimateTokens(learning, options.disclosureLevel || 'preview');\n\n return {\n relevanceScore: score,\n matchedBy,\n tokenEstimate,\n };\n }\n\n /**\n * Extract framework names from project context\n */\n private extractFrameworkNames(): Set<string> {\n const names = new Set<string>();\n\n if (!this.projectContext?.stack) return names;\n\n const stack = this.projectContext.stack;\n const categories = [\n stack.languages,\n stack.frameworks,\n stack.libraries,\n stack.styling,\n stack.testing,\n stack.databases,\n stack.tools,\n stack.runtime,\n ];\n\n for (const category of categories) {\n for (const detection of category) {\n names.add(detection.name.toLowerCase());\n }\n }\n\n return names;\n }\n\n /**\n * Extract keywords from text\n */\n private extractKeywords(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[\\s\\-_.,;:!?()[\\]{}'\"]+/)\n .filter((word) => word.length > 2 && !STOP_WORDS.has(word));\n }\n\n /**\n * Calculate days since a date\n */\n private daysSince(dateStr: string): number {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n return Math.floor(diffMs / (1000 * 60 * 60 * 24));\n }\n\n /**\n * Estimate tokens for a learning\n */\n private estimateTokens(\n learning: Learning,\n level: 'summary' | 'preview' | 'full'\n ): number {\n switch (level) {\n case 'summary':\n return Math.ceil((learning.title.length + learning.tags.join(' ').length) * TOKENS_PER_CHAR);\n case 'preview':\n const excerpt = learning.content.slice(0, 200);\n return Math.ceil(\n (learning.title.length + excerpt.length + learning.tags.join(' ').length) * TOKENS_PER_CHAR\n );\n case 'full':\n return Math.ceil(\n (learning.title.length + learning.content.length + learning.tags.join(' ').length) *\n TOKENS_PER_CHAR\n );\n }\n }\n\n /**\n * Inject memories and return formatted content\n */\n async inject(options: InjectionOptions = {}): Promise<InjectionResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const allMemories = await this.getRelevantMemories(opts);\n\n // Select memories within token budget\n const selected: InjectedMemory[] = [];\n let totalTokens = 0;\n let truncated = 0;\n\n for (const memory of allMemories) {\n if (totalTokens + memory.tokenEstimate <= opts.maxTokens) {\n selected.push(memory);\n totalTokens += memory.tokenEstimate;\n\n // Increment use count\n if (memory.learning.scope === 'project') {\n this.projectStore.incrementUseCount(memory.learning.id);\n } else {\n this.globalStore.incrementUseCount(memory.learning.id);\n }\n } else {\n truncated++;\n }\n }\n\n // Format the content\n const formattedContent = this.formatMemories(selected, opts.disclosureLevel || 'preview');\n\n return {\n memories: selected,\n formattedContent,\n totalTokens,\n stats: {\n considered: this.projectStore.count() + (opts.includeGlobal ? this.globalStore.count() : 0),\n matched: allMemories.length,\n injected: selected.length,\n truncated,\n },\n };\n }\n\n /**\n * Inject memories formatted for a specific agent\n */\n async injectForAgent(\n agent: AgentType,\n options: InjectionOptions = {}\n ): Promise<InjectionResult> {\n const result = await this.inject(options);\n\n // Reformat for specific agent\n result.formattedContent = this.formatForAgent(result.memories, agent, options.disclosureLevel);\n\n return result;\n }\n\n /**\n * Format memories for display\n */\n private formatMemories(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n if (memories.length === 0) {\n return '';\n }\n\n const lines: string[] = ['# Relevant Memories', ''];\n\n for (const { learning, relevanceScore, matchedBy } of memories) {\n lines.push(`## ${learning.title}`);\n lines.push(`*Relevance: ${relevanceScore}% | Tags: ${learning.tags.join(', ')}*`);\n\n if (matchedBy.frameworks.length > 0) {\n lines.push(`*Matched frameworks: ${matchedBy.frameworks.join(', ')}*`);\n }\n\n lines.push('');\n\n switch (level) {\n case 'summary':\n // Just title and tags (already shown above)\n break;\n case 'preview':\n lines.push(learning.content.slice(0, 200) + (learning.content.length > 200 ? '...' : ''));\n break;\n case 'full':\n lines.push(learning.content);\n break;\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format memories for a specific agent\n */\n formatForAgent(\n memories: InjectedMemory[],\n agent: AgentType,\n level: 'summary' | 'preview' | 'full' = 'preview'\n ): string {\n if (memories.length === 0) {\n return '';\n }\n\n switch (agent) {\n case 'claude-code':\n return this.formatForClaude(memories, level);\n case 'cursor':\n return this.formatForCursor(memories, level);\n case 'codex':\n case 'github-copilot':\n return this.formatForCopilot(memories, level);\n default:\n return this.formatMemories(memories, level);\n }\n }\n\n /**\n * Format memories for Claude (XML tags)\n */\n private formatForClaude(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = ['<memories>'];\n\n for (const { learning, relevanceScore } of memories) {\n lines.push(` <memory relevance=\"${relevanceScore}\" scope=\"${learning.scope}\">`);\n lines.push(` <title>${this.escapeXml(learning.title)}</title>`);\n lines.push(` <tags>${learning.tags.join(', ')}</tags>`);\n\n if (level !== 'summary') {\n const content =\n level === 'preview' ? learning.content.slice(0, 200) : learning.content;\n lines.push(` <content>${this.escapeXml(content)}</content>`);\n }\n\n if (learning.frameworks && learning.frameworks.length > 0) {\n lines.push(` <frameworks>${learning.frameworks.join(', ')}</frameworks>`);\n }\n\n lines.push(' </memory>');\n }\n\n lines.push('</memories>');\n return lines.join('\\n');\n }\n\n /**\n * Format memories for Cursor (.mdc format)\n */\n private formatForCursor(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = [\n '---',\n 'description: Relevant memories from previous sessions',\n 'globs:',\n ' - \"**/*\"',\n '---',\n '',\n '# Session Memories',\n '',\n ];\n\n for (const { learning, relevanceScore } of memories) {\n lines.push(`## ${learning.title}`);\n lines.push('');\n lines.push(`> Relevance: ${relevanceScore}% | Tags: ${learning.tags.join(', ')}`);\n lines.push('');\n\n if (level !== 'summary') {\n const content =\n level === 'preview'\n ? learning.content.slice(0, 200) + (learning.content.length > 200 ? '...' : '')\n : learning.content;\n lines.push(content);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format memories for Copilot/Codex (concise markdown)\n */\n private formatForCopilot(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = ['<!-- Session Memories -->'];\n\n for (const { learning } of memories) {\n lines.push(`### ${learning.title}`);\n lines.push(`Tags: ${learning.tags.join(', ')}`);\n\n if (level !== 'summary') {\n const content =\n level === 'preview' ? learning.content.slice(0, 150) : learning.content;\n lines.push(content);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Escape XML special characters\n */\n private escapeXml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n /**\n * Get memory summaries (for progressive disclosure)\n */\n getSummaries(options: InjectionOptions = {}): MemorySummary[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const projectLearnings = this.projectStore.getAll();\n const globalLearnings = opts.includeGlobal ? this.globalStore.getAll() : [];\n const allLearnings = [...projectLearnings, ...globalLearnings];\n\n return allLearnings.map((learning) => ({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n }));\n }\n\n /**\n * Get memory previews (for progressive disclosure)\n */\n getPreviews(ids: string[], options: InjectionOptions = {}): MemoryPreview[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const previews: MemoryPreview[] = [];\n\n for (const id of ids) {\n let learning = this.projectStore.getById(id);\n if (!learning && opts.includeGlobal) {\n learning = this.globalStore.getById(id);\n }\n\n if (learning) {\n previews.push({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n excerpt: learning.content.slice(0, 200),\n lastUsed: learning.lastUsed,\n });\n }\n }\n\n return previews;\n }\n\n /**\n * Get full memories (for progressive disclosure)\n */\n getFullMemories(ids: string[], options: InjectionOptions = {}): MemoryFull[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const fullMemories: MemoryFull[] = [];\n\n for (const id of ids) {\n let learning = this.projectStore.getById(id);\n if (!learning && opts.includeGlobal) {\n learning = this.globalStore.getById(id);\n }\n\n if (learning) {\n fullMemories.push({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n excerpt: learning.content.slice(0, 200),\n lastUsed: learning.lastUsed,\n content: learning.content,\n });\n }\n }\n\n return fullMemories;\n }\n\n /**\n * Search memories by query\n */\n search(query: string, options: InjectionOptions = {}): InjectedMemory[] {\n const opts = { ...DEFAULT_OPTIONS, ...options, currentTask: query };\n const projectResults = this.projectStore.search(query);\n const globalResults = opts.includeGlobal ? this.globalStore.search(query) : [];\n const allResults = [...projectResults, ...globalResults];\n\n return allResults\n .map((learning) => ({\n learning,\n ...this.scoreLearning(learning, opts),\n }))\n .filter((m) => m.relevanceScore >= opts.minRelevance)\n .sort((a, b) => b.relevanceScore - a.relevanceScore)\n .slice(0, opts.maxLearnings);\n }\n}\n\n/**\n * Common stop words to ignore in keyword extraction\n */\nconst STOP_WORDS = new Set([\n 'the',\n 'a',\n 'an',\n 'and',\n 'or',\n 'but',\n 'in',\n 'on',\n 'at',\n 'to',\n 'for',\n 'of',\n 'with',\n 'by',\n 'from',\n 'as',\n 'is',\n 'was',\n 'are',\n 'were',\n 'been',\n 'be',\n 'have',\n 'has',\n 'had',\n 'do',\n 'does',\n 'did',\n 'will',\n 'would',\n 'could',\n 'should',\n 'may',\n 'might',\n 'must',\n 'can',\n 'this',\n 'that',\n 'these',\n 'those',\n 'i',\n 'you',\n 'he',\n 'she',\n 'it',\n 'we',\n 'they',\n 'what',\n 'which',\n 'who',\n 'when',\n 'where',\n 'why',\n 'how',\n 'all',\n 'each',\n 'every',\n 'both',\n 'few',\n 'more',\n 'most',\n 'other',\n 'some',\n 'such',\n 'no',\n 'nor',\n 'not',\n 'only',\n 'own',\n 'same',\n 'so',\n 'than',\n 'too',\n 'very',\n 'just',\n 'also',\n]);\n\n/**\n * Create a MemoryInjector instance\n */\nexport function createMemoryInjector(\n projectPath: string,\n projectName?: string,\n projectContext?: ProjectContext\n): MemoryInjector {\n return new MemoryInjector(projectPath, projectName, projectContext);\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","existsSync","readFileSync","statSync","join","z","execSync","existsSync","rmSync","readFileSync","writeFileSync","mkdirSync","join","tmpdir","homedir","randomUUID","join","homedir","tmpdir","randomUUID","execSync","existsSync","readFileSync","rmSync","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","readdirSync","writeFileSync","mkdirSync","join","parse","stringify","parse","existsSync","readFileSync","join","readdirSync","mkdirSync","writeFileSync","stringify","randomUUID","execSync","randomUUID","randomUUID","resolve","execSync","resolve","existsSync","readFileSync","join","parseYaml","resolve","result","existsSync","readFileSync","writeFileSync","mkdirSync","unlinkSync","join","homedir","join","homedir","existsSync","mkdirSync","readFileSync","writeFileSync","unlinkSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","parseYaml","stringifyYaml","randomUUID","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","homedir","parseYaml","stringifyYaml","randomUUID","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","parseYaml","stringifyYaml","existsSync","mkdirSync","join","homedir","homedir","homedir"]}
|
|
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/context/loader.ts","../src/recommend/types.ts","../src/recommend/engine.ts","../src/recommend/fetcher.ts","../src/session/types.ts","../src/session/manager.ts","../src/workflow/types.ts","../src/workflow/parser.ts","../src/workflow/orchestrator.ts","../src/executor/engine.ts","../src/executor/agents.ts","../src/executor/skill-executor.ts","../src/testing/runner.ts","../src/marketplace/types.ts","../src/marketplace/aggregator.ts","../src/cicd/templates.ts","../src/memory/types.ts","../src/memory/observation-store.ts","../src/memory/learning-store.ts","../src/memory/memory-index.ts","../src/memory/initializer.ts","../src/memory/observer.ts","../src/memory/engine-integration.ts","../src/memory/compressor.ts","../src/memory/injector.ts","../src/team/manager.ts","../src/team/bundle.ts","../src/plugins/manager.ts","../src/plugins/loader.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 cacheDir: z.string().optional(),\n marketplaceSources: z.array(z.string()).optional(),\n defaultTimeout: z.number().optional(),\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(global = false): SkillkitConfig {\n const projectPath = getProjectConfigPath();\n const globalPath = getGlobalConfigPath();\n\n // If global is explicitly requested, only load from global path\n if (global) {\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 return {\n version: 1,\n agent: 'universal',\n autoSync: true,\n };\n }\n\n // Default behavior: project config takes precedence over global\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","/**\n * Context Loader\n *\n * Smart context loading with token budgets and category-based loading.\n */\n\nimport { existsSync, readFileSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\n\n/**\n * Context category with size limits\n */\nexport interface ContextCategory {\n /** Category name */\n name: string;\n /** Maximum tokens for this category */\n maxTokens: number;\n /** Whether to always load this category */\n alwaysLoad: boolean;\n /** File path (relative to project) */\n file?: string;\n /** Inline content */\n content?: string;\n}\n\n/**\n * Context loading options\n */\nexport interface ContextLoadOptions {\n /** Total token budget */\n totalBudget?: number;\n /** Categories to load (load all if not specified) */\n categories?: string[];\n /** Whether to warn when approaching budget limits */\n warnOnBudgetLimit?: boolean;\n}\n\n/**\n * Loaded context result\n */\nexport interface LoadedContext {\n /** All loaded content combined */\n content: string;\n /** Total tokens used */\n totalTokens: number;\n /** Budget remaining */\n budgetRemaining: number;\n /** Categories loaded */\n categoriesLoaded: string[];\n /** Categories skipped (due to budget or not found) */\n categoriesSkipped: string[];\n /** Warnings generated */\n warnings: string[];\n /** Whether budget is near limit (>50% used) */\n nearBudgetLimit: boolean;\n /** Whether context is degraded (>70% used) */\n contextDegraded: boolean;\n}\n\n/**\n * Default context categories\n */\nexport const DEFAULT_CONTEXT_CATEGORIES: ContextCategory[] = [\n {\n name: 'project',\n maxTokens: 2000,\n alwaysLoad: true,\n file: '.skillkit/context.yaml',\n },\n {\n name: 'requirements',\n maxTokens: 5000,\n alwaysLoad: false,\n file: 'REQUIREMENTS.md',\n },\n {\n name: 'decisions',\n maxTokens: 1000,\n alwaysLoad: false,\n file: '.skillkit/decisions.yaml',\n },\n {\n name: 'readme',\n maxTokens: 3000,\n alwaysLoad: false,\n file: 'README.md',\n },\n];\n\n/**\n * Rough estimate of tokens from text\n * (approximation: ~4 characters per token for English text)\n */\nexport function estimateTokens(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\n/**\n * Context Loader class\n */\nexport class ContextLoader {\n private projectPath: string;\n private categories: ContextCategory[];\n private defaultBudget: number;\n\n constructor(projectPath: string, options?: { categories?: ContextCategory[]; defaultBudget?: number }) {\n this.projectPath = projectPath;\n this.categories = options?.categories || DEFAULT_CONTEXT_CATEGORIES;\n this.defaultBudget = options?.defaultBudget || 32000; // Default ~32k tokens\n }\n\n /**\n * Load context based on options\n */\n load(options: ContextLoadOptions = {}): LoadedContext {\n const totalBudget = options.totalBudget || this.defaultBudget;\n const requestedCategories = options.categories;\n\n const result: LoadedContext = {\n content: '',\n totalTokens: 0,\n budgetRemaining: totalBudget,\n categoriesLoaded: [],\n categoriesSkipped: [],\n warnings: [],\n nearBudgetLimit: false,\n contextDegraded: false,\n };\n\n const contentParts: string[] = [];\n\n // First pass: load alwaysLoad categories\n for (const category of this.categories) {\n if (!category.alwaysLoad) continue;\n if (requestedCategories && !requestedCategories.includes(category.name)) continue;\n\n this.loadCategory(category, result, contentParts, totalBudget);\n }\n\n // Second pass: load requested categories\n for (const category of this.categories) {\n if (category.alwaysLoad) continue; // Already loaded\n if (requestedCategories && !requestedCategories.includes(category.name)) continue;\n\n this.loadCategory(category, result, contentParts, totalBudget);\n }\n\n // Combine content\n result.content = contentParts.join('\\n\\n---\\n\\n');\n\n // Check budget status\n const usagePercent = (result.totalTokens / totalBudget) * 100;\n result.nearBudgetLimit = usagePercent >= 50;\n result.contextDegraded = usagePercent >= 70;\n\n // Add warnings for budget limits\n if (result.contextDegraded && options.warnOnBudgetLimit !== false) {\n result.warnings.push(\n `Context usage at ${Math.round(usagePercent)}% - quality may degrade. Consider spawning a fresh agent.`\n );\n } else if (result.nearBudgetLimit && options.warnOnBudgetLimit !== false) {\n result.warnings.push(`Context usage at ${Math.round(usagePercent)}% - approaching limit.`);\n }\n\n return result;\n }\n\n /**\n * Load a single category\n */\n private loadCategory(\n category: ContextCategory,\n result: LoadedContext,\n contentParts: string[],\n totalBudget: number\n ): void {\n let content: string | null = null;\n\n // Load from file\n if (category.file) {\n const filePath = join(this.projectPath, category.file);\n if (existsSync(filePath)) {\n try {\n content = readFileSync(filePath, 'utf-8');\n } catch {\n result.categoriesSkipped.push(category.name);\n return;\n }\n }\n }\n\n // Use inline content if no file\n if (!content && category.content) {\n content = category.content;\n }\n\n if (!content) {\n result.categoriesSkipped.push(category.name);\n return;\n }\n\n // Estimate tokens\n const tokens = estimateTokens(content);\n\n // Check category limit\n if (tokens > category.maxTokens) {\n // Truncate to category limit\n const truncateChars = category.maxTokens * 4;\n content = content.slice(0, truncateChars) + '\\n\\n[... content truncated ...]';\n result.warnings.push(\n `Category \"${category.name}\" truncated to ${category.maxTokens} tokens`\n );\n }\n\n // Check total budget\n const truncatedTokens = estimateTokens(content);\n if (result.totalTokens + truncatedTokens > totalBudget) {\n // Skip if would exceed budget\n result.categoriesSkipped.push(category.name);\n result.warnings.push(\n `Category \"${category.name}\" skipped - would exceed budget`\n );\n return;\n }\n\n // Add to result\n contentParts.push(`# ${category.name.toUpperCase()}\\n\\n${content}`);\n result.totalTokens += truncatedTokens;\n result.budgetRemaining = totalBudget - result.totalTokens;\n result.categoriesLoaded.push(category.name);\n }\n\n /**\n * Get category by name\n */\n getCategory(name: string): ContextCategory | undefined {\n return this.categories.find((c) => c.name === name);\n }\n\n /**\n * Add a custom category\n */\n addCategory(category: ContextCategory): void {\n const existing = this.categories.findIndex((c) => c.name === category.name);\n if (existing >= 0) {\n this.categories[existing] = category;\n } else {\n this.categories.push(category);\n }\n }\n\n /**\n * Remove a category\n */\n removeCategory(name: string): void {\n this.categories = this.categories.filter((c) => c.name !== name);\n }\n\n /**\n * Get estimated context size for categories\n */\n estimateSize(categoryNames?: string[]): { category: string; tokens: number; available: boolean }[] {\n const estimates: { category: string; tokens: number; available: boolean }[] = [];\n\n for (const category of this.categories) {\n if (categoryNames && !categoryNames.includes(category.name)) continue;\n\n let tokens = 0;\n let available = false;\n\n if (category.file) {\n const filePath = join(this.projectPath, category.file);\n if (existsSync(filePath)) {\n try {\n const stat = statSync(filePath);\n tokens = Math.ceil(stat.size / 4); // Rough estimate\n available = true;\n } catch {\n // File not accessible\n }\n }\n } else if (category.content) {\n tokens = estimateTokens(category.content);\n available = true;\n }\n\n estimates.push({\n category: category.name,\n tokens: Math.min(tokens, category.maxTokens),\n available,\n });\n }\n\n return estimates;\n }\n\n /**\n * Check if context would exceed budget threshold\n */\n wouldExceedThreshold(additionalTokens: number, threshold: number = 0.7): boolean {\n const currentTokens = this.load().totalTokens;\n const newTotal = currentTokens + additionalTokens;\n return newTotal / this.defaultBudget > threshold;\n }\n\n /**\n * Suggest spawning fresh agent if context is degraded\n */\n shouldSpawnFreshAgent(): { should: boolean; reason?: string } {\n const context = this.load();\n\n if (context.contextDegraded) {\n return {\n should: true,\n reason: `Context at ${Math.round((context.totalTokens / this.defaultBudget) * 100)}% capacity`,\n };\n }\n\n return { should: false };\n }\n}\n\n/**\n * Create a context loader\n */\nexport function createContextLoader(\n projectPath: string,\n options?: { categories?: ContextCategory[]; defaultBudget?: number }\n): ContextLoader {\n return new ContextLoader(projectPath, 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","import { execSync } from 'node:child_process';\nimport { existsSync, rmSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir, homedir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport type { SkillIndex, SkillSummary, IndexSource } from './types.js';\nimport { discoverSkills, extractFrontmatter } from '../skills.js';\n\n/**\n * Known skill repositories to index\n */\nexport const KNOWN_SKILL_REPOS = [\n { owner: 'anthropics', repo: 'courses', description: 'Anthropic official courses and skills' },\n { owner: 'vercel-labs', repo: 'ai-sdk-preview-internal-knowledge-base', description: 'Vercel AI SDK skills' },\n { owner: 'composioHQ', repo: 'awesome-claude-code-skills', description: 'Curated Claude Code skills' },\n] as const;\n\n/**\n * Index file path\n */\nexport const INDEX_PATH = join(homedir(), '.skillkit', 'index.json');\nexport const INDEX_CACHE_HOURS = 24;\n\n/**\n * Fetch skills from a GitHub repository\n */\nexport async function fetchSkillsFromRepo(\n owner: string,\n repo: string\n): Promise<{ skills: SkillSummary[]; error?: string }> {\n const cloneUrl = `https://github.com/${owner}/${repo}.git`;\n const tempDir = join(tmpdir(), `skillkit-fetch-${randomUUID()}`);\n\n try {\n // Shallow clone for speed\n execSync(`git clone --depth 1 ${cloneUrl} ${tempDir}`, {\n stdio: ['pipe', 'pipe', 'pipe'],\n encoding: 'utf-8',\n timeout: 60000, // 60 second timeout\n });\n\n // Discover skills in the cloned repo\n const discoveredSkills = discoverSkills(tempDir);\n const skills: SkillSummary[] = [];\n\n for (const skill of discoveredSkills) {\n const skillMdPath = join(skill.path, 'SKILL.md');\n if (!existsSync(skillMdPath)) continue;\n\n try {\n const content = readFileSync(skillMdPath, 'utf-8');\n const frontmatter = extractFrontmatter(content);\n\n const summary: SkillSummary = {\n name: skill.name,\n description: skill.description || frontmatter?.description as string || 'No description',\n source: `${owner}/${repo}`,\n tags: (frontmatter?.tags as string[]) || [],\n compatibility: {\n frameworks: (frontmatter?.compatibility as Record<string, unknown>)?.frameworks as string[] || [],\n languages: (frontmatter?.compatibility as Record<string, unknown>)?.languages as string[] || [],\n libraries: (frontmatter?.compatibility as Record<string, unknown>)?.libraries as string[] || [],\n },\n popularity: 0,\n quality: 50,\n lastUpdated: new Date().toISOString(),\n verified: owner === 'anthropics' || owner === 'vercel-labs',\n };\n\n skills.push(summary);\n } catch {\n // Skip skills that fail to parse\n }\n }\n\n return { skills };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { skills: [], error: `Failed to fetch ${owner}/${repo}: ${message}` };\n } finally {\n // Clean up temp directory\n if (existsSync(tempDir)) {\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Ignore cleanup errors\n }\n }\n }\n}\n\n/**\n * Fetch skills from all known repositories and build index\n */\nexport async function buildSkillIndex(\n repos: typeof KNOWN_SKILL_REPOS = KNOWN_SKILL_REPOS,\n onProgress?: (message: string) => void\n): Promise<{ index: SkillIndex; errors: string[] }> {\n const allSkills: SkillSummary[] = [];\n const sources: IndexSource[] = [];\n const errors: string[] = [];\n\n for (const { owner, repo } of repos) {\n onProgress?.(`Fetching ${owner}/${repo}...`);\n\n const result = await fetchSkillsFromRepo(owner, repo);\n\n if (result.error) {\n errors.push(result.error);\n }\n\n if (result.skills.length > 0) {\n allSkills.push(...result.skills);\n sources.push({\n name: `${owner}/${repo}`,\n url: `https://github.com/${owner}/${repo}`,\n lastFetched: new Date().toISOString(),\n skillCount: result.skills.length,\n });\n onProgress?.(` Found ${result.skills.length} skills`);\n } else if (!result.error) {\n onProgress?.(` No skills found`);\n }\n }\n\n // Add fallback sample skills if no repos could be fetched\n if (allSkills.length === 0) {\n onProgress?.('No skills fetched, using sample index...');\n allSkills.push(...getSampleSkills());\n sources.push({\n name: 'skillkit-samples',\n url: 'https://github.com/skillkit/samples',\n lastFetched: new Date().toISOString(),\n skillCount: allSkills.length,\n });\n }\n\n const index: SkillIndex = {\n version: 1,\n lastUpdated: new Date().toISOString(),\n skills: allSkills,\n sources,\n };\n\n return { index, errors };\n}\n\n/**\n * Save skill index to cache\n */\nexport function saveIndex(index: SkillIndex): void {\n const indexDir = join(homedir(), '.skillkit');\n if (!existsSync(indexDir)) {\n mkdirSync(indexDir, { recursive: true });\n }\n writeFileSync(INDEX_PATH, JSON.stringify(index, null, 2));\n}\n\n/**\n * Load skill index from cache\n */\nexport function loadIndex(): SkillIndex | null {\n if (!existsSync(INDEX_PATH)) {\n return null;\n }\n\n try {\n const content = readFileSync(INDEX_PATH, 'utf-8');\n return JSON.parse(content) as SkillIndex;\n } catch {\n return null;\n }\n}\n\n/**\n * Check if index is stale\n */\nexport function isIndexStale(index: SkillIndex): boolean {\n const lastUpdated = new Date(index.lastUpdated);\n const hoursSinceUpdate = (Date.now() - lastUpdated.getTime()) / (1000 * 60 * 60);\n return hoursSinceUpdate > INDEX_CACHE_HOURS;\n}\n\n/**\n * Get index status\n */\nexport function getIndexStatus(): 'missing' | 'stale' | 'fresh' {\n const index = loadIndex();\n if (!index) return 'missing';\n return isIndexStale(index) ? 'stale' : 'fresh';\n}\n\n/**\n * Sample skills fallback (when repos can't be fetched)\n */\nfunction getSampleSkills(): SkillSummary[] {\n return [\n {\n name: 'react-best-practices',\n description: 'Modern React patterns including Server Components, hooks best practices, and performance optimization',\n source: 'skillkit/samples',\n tags: ['react', 'frontend', 'typescript', 'nextjs', 'performance'],\n compatibility: {\n frameworks: ['react', 'nextjs'],\n languages: ['typescript', 'javascript'],\n libraries: [],\n },\n popularity: 1500,\n quality: 95,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'tailwind-patterns',\n description: 'Tailwind CSS utility patterns, responsive design, and component styling best practices',\n source: 'skillkit/samples',\n tags: ['tailwind', 'css', 'styling', 'frontend', 'responsive'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript'],\n libraries: ['tailwindcss'],\n },\n popularity: 1200,\n quality: 92,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'typescript-strict-patterns',\n description: 'TypeScript strict mode patterns, type safety, and advanced type utilities',\n source: 'skillkit/samples',\n tags: ['typescript', 'types', 'safety', 'patterns'],\n compatibility: {\n frameworks: [],\n languages: ['typescript'],\n libraries: [],\n },\n popularity: 900,\n quality: 90,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'security-best-practices',\n description: 'Security patterns for web applications including XSS prevention, CSRF, and secure headers',\n source: 'skillkit/samples',\n tags: ['security', 'xss', 'csrf', 'headers', 'owasp'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript', 'python'],\n libraries: [],\n },\n popularity: 600,\n quality: 95,\n lastUpdated: new Date().toISOString(),\n verified: true,\n },\n {\n name: 'testing-patterns',\n description: 'Testing patterns with Vitest/Jest including mocking, assertions, and test organization',\n source: 'skillkit/samples',\n tags: ['vitest', 'jest', 'testing', 'typescript', 'mocking', 'tdd'],\n compatibility: {\n frameworks: [],\n languages: ['typescript', 'javascript'],\n libraries: ['vitest', 'jest'],\n },\n popularity: 700,\n quality: 86,\n lastUpdated: new Date().toISOString(),\n verified: false,\n },\n ];\n}\n","/**\n * Session State Types\n *\n * Types for managing skill execution sessions with pause/resume support.\n */\n\n/**\n * Status of a task in execution\n */\nexport type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'paused';\n\n/**\n * A single task within a skill execution\n */\nexport interface SessionTask {\n /** Task identifier */\n id: string;\n /** Task name/description */\n name: string;\n /** Task type (auto, checkpoint:human-verify, checkpoint:decision, checkpoint:human-action) */\n type: 'auto' | 'checkpoint:human-verify' | 'checkpoint:decision' | 'checkpoint:human-action';\n /** Current status */\n status: TaskStatus;\n /** Start time */\n startedAt?: string;\n /** Completion time */\n completedAt?: string;\n /** Error message if failed */\n error?: string;\n /** Output/result of the task */\n output?: string;\n /** Files modified by this task */\n filesModified?: string[];\n /** Git commit SHA if committed */\n commitSha?: string;\n}\n\n/**\n * Current skill execution state\n */\nexport interface CurrentExecution {\n /** Skill being executed */\n skillName: string;\n /** Skill source (repo) */\n skillSource: string;\n /** Current step/task index */\n currentStep: number;\n /** Total steps */\n totalSteps: number;\n /** Execution status */\n status: 'running' | 'paused' | 'completed' | 'failed';\n /** When execution started */\n startedAt: string;\n /** When execution was paused (if paused) */\n pausedAt?: string;\n /** Tasks in this execution */\n tasks: SessionTask[];\n}\n\n/**\n * Historical execution record\n */\nexport interface ExecutionHistory {\n /** Skill name */\n skillName: string;\n /** Skill source */\n skillSource: string;\n /** When execution completed */\n completedAt: string;\n /** Duration in milliseconds */\n durationMs: number;\n /** Final status */\n status: 'completed' | 'failed' | 'cancelled';\n /** Git commits created */\n commits: string[];\n /** Files modified */\n filesModified: string[];\n /** Error if failed */\n error?: string;\n}\n\n/**\n * User decisions made during skill execution\n */\nexport interface SessionDecision {\n /** Decision key/identifier */\n key: string;\n /** Decision value */\n value: string;\n /** When decision was made */\n madeAt: string;\n /** Skill that prompted the decision */\n skillName?: string;\n}\n\n/**\n * Full session state\n */\nexport interface SessionState {\n /** Schema version */\n version: 1;\n /** Last activity timestamp */\n lastActivity: string;\n /** Project path this session is for */\n projectPath: string;\n /** Current execution (if any) */\n currentExecution?: CurrentExecution;\n /** Execution history */\n history: ExecutionHistory[];\n /** User decisions */\n decisions: SessionDecision[];\n}\n\n/**\n * Session state file path within .skillkit directory\n */\nexport const SESSION_FILE = 'session.yaml';\n","/**\n * Session Manager\n *\n * Manages session state for skill execution with pause/resume support.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse, stringify } from 'yaml';\nimport type {\n SessionState,\n CurrentExecution,\n ExecutionHistory,\n SessionTask,\n TaskStatus,\n} from './types.js';\nimport { SESSION_FILE } from './types.js';\n\n/**\n * Session Manager for tracking skill execution state\n */\nexport class SessionManager {\n private projectPath: string;\n private sessionPath: string;\n private state: SessionState | null = null;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.sessionPath = join(projectPath, '.skillkit', SESSION_FILE);\n }\n\n /**\n * Get session file path\n */\n getSessionPath(): string {\n return this.sessionPath;\n }\n\n /**\n * Load session state from disk\n */\n load(): SessionState | null {\n if (!existsSync(this.sessionPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(this.sessionPath, 'utf-8');\n this.state = parse(content) as SessionState;\n return this.state;\n } catch (error) {\n console.error('Failed to load session:', error);\n return null;\n }\n }\n\n /**\n * Save session state to disk\n */\n save(): void {\n if (!this.state) {\n return;\n }\n\n const dir = join(this.projectPath, '.skillkit');\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n this.state.lastActivity = new Date().toISOString();\n writeFileSync(this.sessionPath, stringify(this.state));\n }\n\n /**\n * Initialize a new session\n */\n init(): SessionState {\n this.state = {\n version: 1,\n lastActivity: new Date().toISOString(),\n projectPath: this.projectPath,\n history: [],\n decisions: [],\n };\n this.save();\n return this.state;\n }\n\n /**\n * Get current session state (load if needed)\n */\n get(): SessionState | null {\n if (!this.state) {\n this.state = this.load();\n }\n return this.state;\n }\n\n /**\n * Get or create session\n */\n getOrCreate(): SessionState {\n const state = this.get();\n if (state) {\n return state;\n }\n return this.init();\n }\n\n /**\n * Start a new skill execution\n */\n startExecution(skillName: string, skillSource: string, tasks: Omit<SessionTask, 'status'>[]): CurrentExecution {\n const state = this.getOrCreate();\n\n const execution: CurrentExecution = {\n skillName,\n skillSource,\n currentStep: 0,\n totalSteps: tasks.length,\n status: 'running',\n startedAt: new Date().toISOString(),\n tasks: tasks.map((t) => ({\n ...t,\n status: 'pending' as TaskStatus,\n })),\n };\n\n state.currentExecution = execution;\n this.save();\n return execution;\n }\n\n /**\n * Update task status\n */\n updateTask(\n taskId: string,\n updates: Partial<Pick<SessionTask, 'status' | 'output' | 'error' | 'filesModified' | 'commitSha'>>\n ): void {\n const state = this.get();\n if (!state?.currentExecution) {\n return;\n }\n\n const task = state.currentExecution.tasks.find((t) => t.id === taskId);\n if (!task) {\n return;\n }\n\n Object.assign(task, updates);\n\n if (updates.status === 'in_progress' && !task.startedAt) {\n task.startedAt = new Date().toISOString();\n }\n\n if (updates.status === 'completed' || updates.status === 'failed') {\n task.completedAt = new Date().toISOString();\n }\n\n // Update current step\n const completedCount = state.currentExecution.tasks.filter(\n (t) => t.status === 'completed' || t.status === 'failed'\n ).length;\n state.currentExecution.currentStep = completedCount;\n\n this.save();\n }\n\n /**\n * Advance to next task\n */\n advanceToNextTask(): SessionTask | null {\n const state = this.get();\n if (!state?.currentExecution) {\n return null;\n }\n\n const nextTask = state.currentExecution.tasks.find((t) => t.status === 'pending');\n if (nextTask) {\n nextTask.status = 'in_progress';\n nextTask.startedAt = new Date().toISOString();\n this.save();\n }\n\n return nextTask || null;\n }\n\n /**\n * Pause current execution\n */\n pause(): boolean {\n const state = this.get();\n if (!state?.currentExecution || state.currentExecution.status !== 'running') {\n return false;\n }\n\n state.currentExecution.status = 'paused';\n state.currentExecution.pausedAt = new Date().toISOString();\n\n // Mark any in-progress tasks as paused\n for (const task of state.currentExecution.tasks) {\n if (task.status === 'in_progress') {\n task.status = 'paused';\n }\n }\n\n this.save();\n return true;\n }\n\n /**\n * Resume paused execution\n */\n resume(): boolean {\n const state = this.get();\n if (!state?.currentExecution || state.currentExecution.status !== 'paused') {\n return false;\n }\n\n state.currentExecution.status = 'running';\n delete state.currentExecution.pausedAt;\n\n // Resume paused tasks\n for (const task of state.currentExecution.tasks) {\n if (task.status === 'paused') {\n task.status = 'in_progress';\n }\n }\n\n this.save();\n return true;\n }\n\n /**\n * Complete current execution\n */\n completeExecution(status: 'completed' | 'failed' | 'cancelled', error?: string): void {\n const state = this.get();\n if (!state?.currentExecution) {\n return;\n }\n\n const execution = state.currentExecution;\n const startTime = new Date(execution.startedAt).getTime();\n const endTime = Date.now();\n\n const historyEntry: ExecutionHistory = {\n skillName: execution.skillName,\n skillSource: execution.skillSource,\n completedAt: new Date().toISOString(),\n durationMs: endTime - startTime,\n status,\n commits: execution.tasks\n .map((t) => t.commitSha)\n .filter((sha): sha is string => !!sha),\n filesModified: Array.from(\n new Set(execution.tasks.flatMap((t) => t.filesModified || []))\n ),\n error,\n };\n\n state.history.unshift(historyEntry);\n delete state.currentExecution;\n\n // Keep only last 50 history entries\n if (state.history.length > 50) {\n state.history = state.history.slice(0, 50);\n }\n\n this.save();\n }\n\n /**\n * Record a user decision\n */\n recordDecision(key: string, value: string, skillName?: string): void {\n const state = this.getOrCreate();\n\n // Update existing decision or add new one\n const existing = state.decisions.find((d) => d.key === key);\n if (existing) {\n existing.value = value;\n existing.madeAt = new Date().toISOString();\n existing.skillName = skillName;\n } else {\n state.decisions.push({\n key,\n value,\n madeAt: new Date().toISOString(),\n skillName,\n });\n }\n\n this.save();\n }\n\n /**\n * Get a decision value\n */\n getDecision(key: string): string | undefined {\n const state = this.get();\n return state?.decisions.find((d) => d.key === key)?.value;\n }\n\n /**\n * Get execution history\n */\n getHistory(limit?: number): ExecutionHistory[] {\n const state = this.get();\n if (!state) {\n return [];\n }\n return limit ? state.history.slice(0, limit) : state.history;\n }\n\n /**\n * Check if there's an active execution\n */\n hasActiveExecution(): boolean {\n const state = this.get();\n return !!state?.currentExecution;\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n const state = this.get();\n return state?.currentExecution?.status === 'paused';\n }\n\n /**\n * Clear session (delete file)\n */\n clear(): void {\n if (existsSync(this.sessionPath)) {\n unlinkSync(this.sessionPath);\n }\n this.state = null;\n }\n}\n\n/**\n * Create a new session manager\n */\nexport function createSessionManager(projectPath: string): SessionManager {\n return new SessionManager(projectPath);\n}\n","/**\n * Workflow Types\n *\n * Types for skill composition and workflow orchestration.\n */\n\n/**\n * A skill reference within a workflow\n */\nexport interface WorkflowSkill {\n /** Skill name or source (e.g., \"typescript-strict-mode\" or \"owner/repo/skill\") */\n skill: string;\n /** Optional configuration overrides */\n config?: Record<string, unknown>;\n /** Optional condition to run this skill */\n condition?: string;\n}\n\n/**\n * A wave of skills to execute (parallel or sequential)\n */\nexport interface WorkflowWave {\n /** Wave name/description */\n name?: string;\n /** Whether skills in this wave run in parallel */\n parallel: boolean;\n /** Skills to execute in this wave */\n skills: (string | WorkflowSkill)[];\n /** Continue to next wave even if this wave has failures */\n continueOnError?: boolean;\n}\n\n/**\n * Workflow definition\n */\nexport interface Workflow {\n /** Workflow name (used as identifier) */\n name: string;\n /** Human-readable description */\n description?: string;\n /** Workflow version */\n version?: string;\n /** Author information */\n author?: string;\n /** Tags for discovery */\n tags?: string[];\n /** Waves of skills to execute */\n waves: WorkflowWave[];\n /** Environment variables to set */\n env?: Record<string, string>;\n /** Pre-execution hooks */\n preHooks?: string[];\n /** Post-execution hooks */\n postHooks?: string[];\n}\n\n/**\n * Workflow execution status\n */\nexport type WorkflowExecutionStatus = 'pending' | 'running' | 'paused' | 'completed' | 'failed' | 'cancelled';\n\n/**\n * Status of a wave execution\n */\nexport interface WaveExecutionStatus {\n /** Wave index */\n waveIndex: number;\n /** Wave name */\n waveName?: string;\n /** Status */\n status: WorkflowExecutionStatus;\n /** Skills statuses */\n skills: {\n skill: string;\n status: WorkflowExecutionStatus;\n startedAt?: string;\n completedAt?: string;\n error?: string;\n }[];\n /** When wave started */\n startedAt?: string;\n /** When wave completed */\n completedAt?: string;\n}\n\n/**\n * Workflow execution state\n */\nexport interface WorkflowExecution {\n /** Workflow being executed */\n workflow: Workflow;\n /** Execution ID */\n executionId: string;\n /** Overall status */\n status: WorkflowExecutionStatus;\n /** Current wave index */\n currentWave: number;\n /** Wave statuses */\n waves: WaveExecutionStatus[];\n /** When execution started */\n startedAt: string;\n /** When execution completed */\n completedAt?: string;\n /** Error if failed */\n error?: string;\n}\n\n/**\n * Workflow file location\n */\nexport const WORKFLOWS_DIR = 'workflows';\nexport const WORKFLOW_EXTENSION = '.yaml';\n","/**\n * Workflow Parser\n *\n * Parses workflow YAML files into Workflow objects.\n */\n\nimport { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { parse, stringify } from 'yaml';\nimport type { Workflow, WorkflowWave, WorkflowSkill } from './types.js';\nimport { WORKFLOWS_DIR, WORKFLOW_EXTENSION } from './types.js';\n\n/**\n * Parse a workflow from YAML content\n */\nexport function parseWorkflow(content: string): Workflow {\n const data = parse(content) as Record<string, unknown>;\n\n if (!data.name || typeof data.name !== 'string') {\n throw new Error('Workflow must have a name');\n }\n\n if (!data.waves || !Array.isArray(data.waves)) {\n throw new Error('Workflow must have waves array');\n }\n\n const waves: WorkflowWave[] = data.waves.map((wave: unknown, index: number) => {\n if (typeof wave !== 'object' || wave === null) {\n throw new Error(`Wave ${index} must be an object`);\n }\n\n const waveObj = wave as Record<string, unknown>;\n const skills = waveObj.skills;\n\n if (!skills || !Array.isArray(skills)) {\n throw new Error(`Wave ${index} must have skills array`);\n }\n\n return {\n name: waveObj.name as string | undefined,\n parallel: waveObj.parallel === true,\n skills: skills.map((s: unknown) => {\n if (typeof s === 'string') {\n return s;\n }\n if (typeof s === 'object' && s !== null) {\n const skillObj = s as Record<string, unknown>;\n return {\n skill: skillObj.skill as string,\n config: skillObj.config as Record<string, unknown> | undefined,\n condition: skillObj.condition as string | undefined,\n } as WorkflowSkill;\n }\n throw new Error(`Invalid skill in wave ${index}`);\n }),\n continueOnError: waveObj.continueOnError === true,\n };\n });\n\n return {\n name: data.name as string,\n description: data.description as string | undefined,\n version: data.version as string | undefined,\n author: data.author as string | undefined,\n tags: data.tags as string[] | undefined,\n waves,\n env: data.env as Record<string, string> | undefined,\n preHooks: data.preHooks as string[] | undefined,\n postHooks: data.postHooks as string[] | undefined,\n };\n}\n\n/**\n * Load a workflow from a file\n */\nexport function loadWorkflow(filePath: string): Workflow {\n if (!existsSync(filePath)) {\n throw new Error(`Workflow file not found: ${filePath}`);\n }\n\n const content = readFileSync(filePath, 'utf-8');\n return parseWorkflow(content);\n}\n\n/**\n * Load a workflow by name from the project's workflows directory\n */\nexport function loadWorkflowByName(projectPath: string, name: string): Workflow | null {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n return null;\n }\n\n // Try exact name match first\n const exactPath = join(workflowsDir, `${name}${WORKFLOW_EXTENSION}`);\n if (existsSync(exactPath)) {\n return loadWorkflow(exactPath);\n }\n\n // Try finding by workflow name property\n const files = readdirSync(workflowsDir).filter((f) => f.endsWith(WORKFLOW_EXTENSION));\n\n for (const file of files) {\n try {\n const workflow = loadWorkflow(join(workflowsDir, file));\n if (workflow.name === name) {\n return workflow;\n }\n } catch {\n // Skip invalid workflow files\n }\n }\n\n return null;\n}\n\n/**\n * List all workflows in a project\n */\nexport function listWorkflows(projectPath: string): Workflow[] {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n return [];\n }\n\n const files = readdirSync(workflowsDir).filter((f) => f.endsWith(WORKFLOW_EXTENSION));\n const workflows: Workflow[] = [];\n\n for (const file of files) {\n try {\n const workflow = loadWorkflow(join(workflowsDir, file));\n workflows.push(workflow);\n } catch {\n // Skip invalid workflow files\n }\n }\n\n return workflows;\n}\n\n/**\n * Save a workflow to a file\n */\nexport function saveWorkflow(projectPath: string, workflow: Workflow): string {\n const workflowsDir = join(projectPath, '.skillkit', WORKFLOWS_DIR);\n\n if (!existsSync(workflowsDir)) {\n mkdirSync(workflowsDir, { recursive: true });\n }\n\n const fileName = `${workflow.name.replace(/[^a-z0-9-]/gi, '-').toLowerCase()}${WORKFLOW_EXTENSION}`;\n const filePath = join(workflowsDir, fileName);\n\n writeFileSync(filePath, stringify(workflow));\n\n return filePath;\n}\n\n/**\n * Serialize a workflow to YAML\n */\nexport function serializeWorkflow(workflow: Workflow): string {\n return stringify(workflow);\n}\n\n/**\n * Validate a workflow\n */\nexport function validateWorkflow(workflow: Workflow): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!workflow.name) {\n errors.push('Workflow must have a name');\n }\n\n if (!workflow.waves || workflow.waves.length === 0) {\n errors.push('Workflow must have at least one wave');\n }\n\n for (let i = 0; i < workflow.waves.length; i++) {\n const wave = workflow.waves[i];\n\n if (!wave.skills || wave.skills.length === 0) {\n errors.push(`Wave ${i + 1} must have at least one skill`);\n }\n\n for (let j = 0; j < wave.skills.length; j++) {\n const skill = wave.skills[j];\n const skillName = typeof skill === 'string' ? skill : skill.skill;\n\n if (!skillName) {\n errors.push(`Wave ${i + 1}, skill ${j + 1} must have a name`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n/**\n * Create a new workflow from a template\n */\nexport function createWorkflowTemplate(name: string, description?: string): Workflow {\n return {\n name,\n description: description || `Workflow: ${name}`,\n version: '1.0.0',\n waves: [\n {\n name: 'Setup',\n parallel: true,\n skills: [],\n },\n {\n name: 'Main',\n parallel: false,\n skills: [],\n },\n ],\n };\n}\n","/**\n * Workflow Orchestrator\n *\n * Executes workflows with wave-based orchestration.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type {\n Workflow,\n WorkflowWave,\n WorkflowSkill,\n WorkflowExecution,\n WorkflowExecutionStatus,\n} from './types.js';\n\n/**\n * Skill executor function type\n */\nexport type SkillExecutor = (\n skillName: string,\n config?: Record<string, unknown>\n) => Promise<{ success: boolean; error?: string }>;\n\n/**\n * Progress callback for workflow execution\n */\nexport type WorkflowProgressCallback = (event: {\n type: 'wave_start' | 'wave_complete' | 'skill_start' | 'skill_complete' | 'workflow_complete';\n waveIndex?: number;\n waveName?: string;\n skillName?: string;\n status?: WorkflowExecutionStatus;\n error?: string;\n}) => void;\n\n/**\n * Workflow Orchestrator\n *\n * Manages the execution of workflows with parallel/sequential waves.\n */\nexport class WorkflowOrchestrator {\n private execution: WorkflowExecution | null = null;\n private executor: SkillExecutor;\n private onProgress?: WorkflowProgressCallback;\n\n constructor(executor: SkillExecutor, onProgress?: WorkflowProgressCallback) {\n this.executor = executor;\n this.onProgress = onProgress;\n }\n\n /**\n * Get current execution state\n */\n getExecution(): WorkflowExecution | null {\n return this.execution;\n }\n\n /**\n * Execute a workflow\n */\n async execute(workflow: Workflow): Promise<WorkflowExecution> {\n // Initialize execution state\n this.execution = {\n workflow,\n executionId: randomUUID(),\n status: 'running',\n currentWave: 0,\n waves: workflow.waves.map((wave, index) => ({\n waveIndex: index,\n waveName: wave.name,\n status: 'pending',\n skills: wave.skills.map((s) => ({\n skill: typeof s === 'string' ? s : s.skill,\n status: 'pending' as WorkflowExecutionStatus,\n })),\n })),\n startedAt: new Date().toISOString(),\n };\n\n try {\n // Execute each wave\n for (let i = 0; i < workflow.waves.length; i++) {\n if (this.execution.status === 'cancelled' || this.execution.status === 'paused') {\n break;\n }\n\n this.execution.currentWave = i;\n await this.executeWave(workflow.waves[i], i);\n\n // Check if wave failed and should stop\n const waveStatus = this.execution.waves[i];\n if (waveStatus.status === 'failed' && !workflow.waves[i].continueOnError) {\n this.execution.status = 'failed';\n this.execution.error = `Wave ${i + 1} failed`;\n break;\n }\n }\n\n // Mark as completed if not already failed/cancelled/paused\n if (this.execution.status === 'running') {\n this.execution.status = 'completed';\n }\n\n this.execution.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'workflow_complete',\n status: this.execution.status,\n error: this.execution.error,\n });\n\n return this.execution;\n } catch (error) {\n this.execution.status = 'failed';\n this.execution.error = error instanceof Error ? error.message : String(error);\n this.execution.completedAt = new Date().toISOString();\n return this.execution;\n }\n }\n\n /**\n * Execute a single wave\n */\n private async executeWave(wave: WorkflowWave, waveIndex: number): Promise<void> {\n const waveStatus = this.execution!.waves[waveIndex];\n waveStatus.status = 'running';\n waveStatus.startedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'wave_start',\n waveIndex,\n waveName: wave.name,\n });\n\n const skills = wave.skills.map((s) => ({\n name: typeof s === 'string' ? s : s.skill,\n config: typeof s === 'string' ? undefined : (s as WorkflowSkill).config,\n }));\n\n if (wave.parallel) {\n // Execute skills in parallel\n await Promise.all(\n skills.map((skill, skillIndex) =>\n this.executeSkill(skill.name, skill.config, waveIndex, skillIndex)\n )\n );\n } else {\n // Execute skills sequentially\n for (let i = 0; i < skills.length; i++) {\n if (this.execution!.status === 'cancelled' || this.execution!.status === 'paused') {\n break;\n }\n\n await this.executeSkill(skills[i].name, skills[i].config, waveIndex, i);\n\n // Stop on first failure in sequential mode\n const skillStatus = waveStatus.skills[i];\n if (skillStatus.status === 'failed' && !wave.continueOnError) {\n break;\n }\n }\n }\n\n // Determine wave status based on skill statuses\n const hasFailures = waveStatus.skills.some((s) => s.status === 'failed');\n const allCompleted = waveStatus.skills.every(\n (s) => s.status === 'completed' || s.status === 'failed'\n );\n\n if (allCompleted) {\n waveStatus.status = hasFailures ? 'failed' : 'completed';\n }\n\n waveStatus.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'wave_complete',\n waveIndex,\n waveName: wave.name,\n status: waveStatus.status,\n });\n }\n\n /**\n * Execute a single skill\n */\n private async executeSkill(\n skillName: string,\n config: Record<string, unknown> | undefined,\n waveIndex: number,\n skillIndex: number\n ): Promise<void> {\n const skillStatus = this.execution!.waves[waveIndex].skills[skillIndex];\n skillStatus.status = 'running';\n skillStatus.startedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'skill_start',\n waveIndex,\n skillName,\n });\n\n try {\n const result = await this.executor(skillName, config);\n\n if (result.success) {\n skillStatus.status = 'completed';\n } else {\n skillStatus.status = 'failed';\n skillStatus.error = result.error;\n }\n } catch (error) {\n skillStatus.status = 'failed';\n skillStatus.error = error instanceof Error ? error.message : String(error);\n }\n\n skillStatus.completedAt = new Date().toISOString();\n\n this.onProgress?.({\n type: 'skill_complete',\n waveIndex,\n skillName,\n status: skillStatus.status,\n error: skillStatus.error,\n });\n }\n\n /**\n * Pause execution\n */\n pause(): boolean {\n if (!this.execution || this.execution.status !== 'running') {\n return false;\n }\n\n this.execution.status = 'paused';\n return true;\n }\n\n /**\n * Check if execution should continue\n */\n private shouldContinue(): boolean {\n if (!this.execution) return false;\n return this.execution.status === 'running';\n }\n\n /**\n * Resume execution\n */\n async resume(): Promise<WorkflowExecution | null> {\n if (!this.execution || this.execution.status !== 'paused') {\n return null;\n }\n\n this.execution.status = 'running';\n\n // Continue from current wave\n const workflow = this.execution.workflow;\n for (let i = this.execution.currentWave; i < workflow.waves.length; i++) {\n if (!this.shouldContinue()) {\n break;\n }\n\n this.execution.currentWave = i;\n\n // Skip already completed waves\n if (this.execution.waves[i].status === 'completed') {\n continue;\n }\n\n await this.executeWave(workflow.waves[i], i);\n\n const waveStatus = this.execution.waves[i];\n if (waveStatus.status === 'failed' && !workflow.waves[i].continueOnError) {\n this.execution.status = 'failed';\n this.execution.error = `Wave ${i + 1} failed`;\n break;\n }\n }\n\n if (this.execution.status === 'running') {\n this.execution.status = 'completed';\n }\n\n this.execution.completedAt = new Date().toISOString();\n return this.execution;\n }\n\n /**\n * Cancel execution\n */\n cancel(): boolean {\n if (!this.execution || this.execution.status === 'completed' || this.execution.status === 'failed') {\n return false;\n }\n\n this.execution.status = 'cancelled';\n this.execution.completedAt = new Date().toISOString();\n return true;\n }\n}\n\n/**\n * Create a new workflow orchestrator\n */\nexport function createWorkflowOrchestrator(\n executor: SkillExecutor,\n onProgress?: WorkflowProgressCallback\n): WorkflowOrchestrator {\n return new WorkflowOrchestrator(executor, onProgress);\n}\n","/**\n * Skill Execution Engine\n *\n * Executes skills with task-based orchestration, verification, and state management.\n */\n\nimport { execSync } from 'node:child_process';\nimport { randomUUID } from 'node:crypto';\nimport type {\n ExecutableSkill,\n ExecutableTask,\n ExecutionOptions,\n TaskExecutionResult,\n SkillExecutionResult,\n CheckpointHandler,\n CheckpointResponse,\n ExecutionTaskStatus,\n} from './types.js';\nimport { SessionManager } from '../session/manager.js';\nimport type { SessionTask } from '../session/types.js';\n\n/**\n * Progress event for execution\n */\nexport interface ExecutionProgressEvent {\n type: 'task_start' | 'task_complete' | 'checkpoint' | 'verification' | 'complete';\n taskId?: string;\n taskName?: string;\n taskIndex?: number;\n totalTasks?: number;\n status?: ExecutionTaskStatus | 'paused' | 'cancelled';\n message?: string;\n error?: string;\n}\n\n/**\n * Progress callback type\n */\nexport type ExecutionProgressCallback = (event: ExecutionProgressEvent) => void;\n\n/**\n * Skill Execution Engine\n */\nexport class SkillExecutionEngine {\n private projectPath: string;\n private sessionManager: SessionManager;\n private checkpointHandler?: CheckpointHandler;\n private onProgress?: ExecutionProgressCallback;\n\n constructor(\n projectPath: string,\n options?: {\n checkpointHandler?: CheckpointHandler;\n onProgress?: ExecutionProgressCallback;\n }\n ) {\n this.projectPath = projectPath;\n this.sessionManager = new SessionManager(projectPath);\n this.checkpointHandler = options?.checkpointHandler;\n this.onProgress = options?.onProgress;\n }\n\n /**\n * Execute a skill\n */\n async execute(\n skill: ExecutableSkill,\n options: ExecutionOptions = {}\n ): Promise<SkillExecutionResult> {\n const startTime = new Date();\n const tasks = skill.tasks || [];\n\n // Handle dry run\n if (options.dryRun) {\n return this.createDryRunResult(skill);\n }\n\n // Check if there's an existing paused execution for this skill\n const existingState = this.sessionManager.get();\n if (existingState?.currentExecution?.skillName === skill.name) {\n if (existingState.currentExecution.status === 'paused') {\n // Resume from paused state\n return this.resumeExecution(skill, options);\n }\n }\n\n // Start new execution\n const sessionTasks: Omit<SessionTask, 'status'>[] = tasks.map((task, index) => ({\n id: task.id || `task-${index}`,\n name: task.name,\n type: task.type === 'auto' ? 'auto' : task.type,\n }));\n\n this.sessionManager.startExecution(skill.name, skill.source, sessionTasks);\n\n const taskResults: TaskExecutionResult[] = [];\n let overallStatus: 'completed' | 'failed' | 'cancelled' | 'paused' = 'completed';\n let overallError: string | undefined;\n\n // Execute tasks\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n\n this.onProgress?.({\n type: 'task_start',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n // Handle checkpoints\n if (task.type !== 'auto') {\n const checkpointResult = await this.handleCheckpoint(task, {\n skillName: skill.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n if (!checkpointResult.continue) {\n overallStatus = 'paused';\n this.sessionManager.pause();\n break;\n }\n\n // For decision checkpoints, record the decision\n if (task.type === 'checkpoint:decision' && checkpointResult.selectedOption) {\n this.sessionManager.recordDecision(\n `${skill.name}:${task.id}`,\n checkpointResult.selectedOption,\n skill.name\n );\n }\n }\n\n // Execute the task\n const taskResult = await this.executeTask(task, skill, options);\n taskResults.push(taskResult);\n\n this.sessionManager.updateTask(task.id || `task-${i}`, {\n status: taskResult.status === 'completed' ? 'completed' : 'failed',\n output: taskResult.output,\n error: taskResult.error,\n filesModified: taskResult.filesModified,\n commitSha: taskResult.commitSha,\n });\n\n this.onProgress?.({\n type: 'task_complete',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n status: taskResult.status,\n error: taskResult.error,\n });\n\n // Handle task failure\n if (taskResult.status === 'failed') {\n if (!options.continueOnError) {\n overallStatus = 'failed';\n overallError = taskResult.error;\n break;\n }\n }\n\n // Run verification if enabled\n if (options.verify && task.verify) {\n const verificationPassed = await this.runVerification(task, taskResult);\n if (!verificationPassed && !options.continueOnError) {\n overallStatus = 'failed';\n overallError = 'Verification failed';\n break;\n }\n }\n }\n\n const endTime = new Date();\n\n // Complete the execution\n if (overallStatus !== 'paused') {\n this.sessionManager.completeExecution(overallStatus, overallError);\n }\n\n const result: SkillExecutionResult = {\n skillName: skill.name,\n skillSource: skill.source,\n status: overallStatus,\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n tasks: taskResults,\n filesModified: Array.from(new Set(taskResults.flatMap((t) => t.filesModified || []))),\n commits: taskResults.map((t) => t.commitSha).filter((sha): sha is string => !!sha),\n error: overallError,\n };\n\n const statusMessages: Record<'completed' | 'failed' | 'cancelled' | 'paused', string> = {\n completed: 'Skill execution completed',\n paused: 'Skill execution paused',\n failed: overallError || 'Skill execution failed',\n cancelled: 'Skill execution cancelled',\n };\n\n this.onProgress?.({\n type: 'complete',\n status: overallStatus,\n message: statusMessages[overallStatus],\n });\n\n return result;\n }\n\n /**\n * Resume a paused execution\n */\n private async resumeExecution(\n skill: ExecutableSkill,\n options: ExecutionOptions\n ): Promise<SkillExecutionResult> {\n const state = this.sessionManager.get();\n if (!state?.currentExecution) {\n throw new Error('No execution to resume');\n }\n\n this.sessionManager.resume();\n const execution = state.currentExecution;\n const tasks = skill.tasks || [];\n\n const taskResults: TaskExecutionResult[] = [];\n let overallStatus: 'completed' | 'failed' | 'cancelled' | 'paused' = 'completed';\n let overallError: string | undefined;\n\n // Find where to resume from\n const startIndex = execution.currentStep;\n\n for (let i = startIndex; i < tasks.length; i++) {\n const task = tasks[i];\n\n this.onProgress?.({\n type: 'task_start',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n // Handle checkpoints (same as in execute)\n if (task.type !== 'auto') {\n const checkpointResult = await this.handleCheckpoint(task, {\n skillName: skill.name,\n taskIndex: i,\n totalTasks: tasks.length,\n });\n\n if (!checkpointResult.continue) {\n overallStatus = 'paused';\n this.sessionManager.pause();\n break;\n }\n\n // For decision checkpoints, record the decision\n if (task.type === 'checkpoint:decision' && checkpointResult.selectedOption) {\n this.sessionManager.recordDecision(\n `${skill.name}:${task.id}`,\n checkpointResult.selectedOption,\n skill.name\n );\n }\n }\n\n const taskResult = await this.executeTask(task, skill, options);\n taskResults.push(taskResult);\n\n this.sessionManager.updateTask(task.id || `task-${i}`, {\n status: taskResult.status === 'completed' ? 'completed' : 'failed',\n output: taskResult.output,\n error: taskResult.error,\n filesModified: taskResult.filesModified,\n commitSha: taskResult.commitSha,\n });\n\n // Emit task_complete progress event (matching execute behavior)\n this.onProgress?.({\n type: 'task_complete',\n taskId: task.id,\n taskName: task.name,\n taskIndex: i,\n totalTasks: tasks.length,\n status: taskResult.status,\n error: taskResult.error,\n });\n\n // Handle task failure\n if (taskResult.status === 'failed') {\n if (!options.continueOnError) {\n overallStatus = 'failed';\n overallError = taskResult.error;\n break;\n }\n }\n\n // Run verification if enabled (matching execute behavior)\n if (options.verify && task.verify) {\n const verificationPassed = await this.runVerification(task, taskResult);\n if (!verificationPassed && !options.continueOnError) {\n overallStatus = 'failed';\n overallError = 'Verification failed';\n break;\n }\n }\n }\n\n // Only complete execution if not paused\n if (overallStatus !== 'paused') {\n this.sessionManager.completeExecution(overallStatus, overallError);\n }\n\n return {\n skillName: skill.name,\n skillSource: skill.source,\n status: overallStatus,\n startedAt: execution.startedAt,\n completedAt: new Date().toISOString(),\n durationMs: Date.now() - new Date(execution.startedAt).getTime(),\n tasks: taskResults,\n filesModified: Array.from(new Set(taskResults.flatMap((t) => t.filesModified || []))),\n commits: taskResults.map((t) => t.commitSha).filter((sha): sha is string => !!sha),\n error: overallError,\n };\n }\n\n /**\n * Execute a single task\n */\n private async executeTask(\n task: ExecutableTask,\n _skill: ExecutableSkill,\n _options: ExecutionOptions\n ): Promise<TaskExecutionResult> {\n const startTime = new Date();\n const taskId = task.id || randomUUID();\n\n try {\n // For now, we simulate task execution\n // In a real implementation, this would integrate with the AI agent\n // to execute the task action based on the skill content\n\n // Simulate some work\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n const endTime = new Date();\n\n return {\n taskId,\n taskName: task.name,\n status: 'completed',\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n output: `Task \"${task.name}\" completed successfully`,\n filesModified: task.files,\n };\n } catch (error) {\n const endTime = new Date();\n\n return {\n taskId,\n taskName: task.name,\n status: 'failed',\n startedAt: startTime.toISOString(),\n completedAt: endTime.toISOString(),\n durationMs: endTime.getTime() - startTime.getTime(),\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Handle a checkpoint\n */\n private async handleCheckpoint(\n task: ExecutableTask,\n context: { skillName: string; taskIndex: number; totalTasks: number }\n ): Promise<CheckpointResponse> {\n this.onProgress?.({\n type: 'checkpoint',\n taskId: task.id,\n taskName: task.name,\n taskIndex: context.taskIndex,\n totalTasks: context.totalTasks,\n message: `Checkpoint: ${task.type}`,\n });\n\n if (this.checkpointHandler) {\n return this.checkpointHandler(task, context);\n }\n\n // Default: auto-continue for non-decision checkpoints\n if (task.type === 'checkpoint:decision') {\n // Use first option if no handler\n return {\n continue: true,\n selectedOption: task.options?.[0],\n };\n }\n\n return { continue: true };\n }\n\n /**\n * Check if a regex pattern is potentially dangerous (ReDoS-vulnerable)\n * Rejects patterns with nested quantifiers and other known problematic constructs\n */\n private isUnsafeRegexPattern(pattern: string): boolean {\n // Detect nested quantifiers like (a+)+, (a*)+, (a+)*, (a*)*\n // These are the primary cause of catastrophic backtracking\n const nestedQuantifierPattern = /\\([^)]*[+*][^)]*\\)[+*?]/;\n if (nestedQuantifierPattern.test(pattern)) {\n return true;\n }\n\n // Detect overlapping alternations with quantifiers like (a|a)+\n const overlappingAlternation = /\\([^|)]*\\|[^|)]*\\)[+*]/;\n if (overlappingAlternation.test(pattern)) {\n return true;\n }\n\n // Detect excessive quantifiers (more than 3 quantifiers in a row-ish)\n const quantifierCount = (pattern.match(/[+*?]|\\{\\d+/g) || []).length;\n if (quantifierCount > 10) {\n return true;\n }\n\n // Detect very long character classes which can be slow\n const longCharClass = /\\[[^\\]]{50,}\\]/;\n if (longCharClass.test(pattern)) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Safely test a regex pattern with ReDoS prevention\n *\n * This method validates patterns before execution to prevent catastrophic backtracking.\n * Note: This cannot guarantee protection against all ReDoS patterns, but catches common ones.\n */\n private safeRegexTest(pattern: string, input: string, _timeoutMs = 1000): boolean {\n // Strict length limits to prevent excessive processing\n if (pattern.length > 200 || input.length > 50000) {\n console.warn(`Regex test skipped: pattern or input too long`);\n return false;\n }\n\n // Reject patterns known to cause ReDoS\n if (this.isUnsafeRegexPattern(pattern)) {\n console.warn(`Regex pattern rejected as potentially unsafe: ${pattern.slice(0, 50)}...`);\n return false;\n }\n\n try {\n const regex = new RegExp(pattern);\n return regex.test(input);\n } catch {\n // Invalid regex pattern\n return false;\n }\n }\n\n /**\n * Run verification for a task\n *\n * SECURITY NOTE: Verification commands are executed from skill configuration.\n * Only run skills from trusted sources. Commands run with the same privileges\n * as the skillkit process.\n */\n private async runVerification(\n task: ExecutableTask,\n result: TaskExecutionResult\n ): Promise<boolean> {\n if (!task.verify) {\n return true;\n }\n\n const verificationResults = {\n automated: [] as { rule: string; passed: boolean; output?: string }[],\n human: [] as { description: string; passed: boolean }[],\n };\n\n // Run automated verification\n if (task.verify.automated) {\n for (const rule of task.verify.automated) {\n if (rule.command) {\n try {\n // SECURITY: Commands are from skill config - only run trusted skills\n const output = execSync(rule.command, {\n cwd: this.projectPath,\n encoding: 'utf-8',\n timeout: 30000,\n });\n\n let passed = true;\n if (rule.expect) {\n if (rule.expect === 'success') {\n passed = true;\n } else if (rule.expect.startsWith('contains:')) {\n const expected = rule.expect.slice(9);\n passed = output.includes(expected);\n } else if (rule.expect.startsWith('matches:')) {\n const pattern = rule.expect.slice(8);\n // Use safe regex test to prevent ReDoS\n passed = this.safeRegexTest(pattern, output);\n }\n }\n\n verificationResults.automated.push({\n rule: rule.command,\n passed,\n output,\n });\n\n this.onProgress?.({\n type: 'verification',\n taskId: task.id,\n taskName: task.name,\n message: `Verification ${passed ? 'passed' : 'failed'}: ${rule.command}`,\n });\n\n if (!passed) {\n return false;\n }\n } catch (error) {\n verificationResults.automated.push({\n rule: rule.command,\n passed: false,\n output: error instanceof Error ? error.message : String(error),\n });\n return false;\n }\n }\n }\n }\n\n // Human verification would be handled by checkpoint handler\n result.verificationResults = verificationResults;\n return true;\n }\n\n /**\n * Create a dry run result\n */\n private createDryRunResult(skill: ExecutableSkill): SkillExecutionResult {\n const tasks = skill.tasks || [];\n\n return {\n skillName: skill.name,\n skillSource: skill.source,\n status: 'completed',\n startedAt: new Date().toISOString(),\n completedAt: new Date().toISOString(),\n durationMs: 0,\n tasks: tasks.map((task) => ({\n taskId: task.id || randomUUID(),\n taskName: task.name,\n status: 'skipped' as ExecutionTaskStatus,\n startedAt: new Date().toISOString(),\n completedAt: new Date().toISOString(),\n durationMs: 0,\n output: '[Dry run - not executed]',\n })),\n filesModified: [],\n commits: [],\n };\n }\n\n /**\n * Pause current execution\n */\n pause(): boolean {\n return this.sessionManager.pause();\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n return this.sessionManager.isPaused();\n }\n\n /**\n * Get session manager\n */\n getSessionManager(): SessionManager {\n return this.sessionManager;\n }\n}\n\n/**\n * Create a new skill execution engine\n */\nexport function createExecutionEngine(\n projectPath: string,\n options?: {\n checkpointHandler?: CheckpointHandler;\n onProgress?: ExecutionProgressCallback;\n }\n): SkillExecutionEngine {\n return new SkillExecutionEngine(projectPath, options);\n}\n","/**\n * Agent Execution Module\n *\n * Handles real execution of skills through various AI agent CLIs.\n */\n\nimport { spawn, type SpawnOptions } from 'node:child_process';\nimport type { AgentType } from '../types.js';\n\n/**\n * Agent CLI configuration\n */\nexport interface AgentCLIConfig {\n /** Agent type */\n type: AgentType;\n /** CLI command name */\n command: string;\n /** Whether the agent supports CLI execution */\n supportsCLI: boolean;\n /** Arguments to pass the prompt/skill content */\n promptArgs?: string[];\n /** Arguments for non-interactive mode */\n nonInteractiveArgs?: string[];\n /** Environment variables needed */\n envVars?: Record<string, string>;\n /** How to check if agent is installed */\n checkCommand?: string;\n}\n\n/**\n * Execution result from an agent\n */\nexport interface AgentExecutionResult {\n success: boolean;\n output: string;\n error?: string;\n exitCode: number;\n duration: number;\n}\n\n/**\n * Agent CLI configurations\n */\nexport const AGENT_CLI_CONFIGS: AgentCLIConfig[] = [\n {\n type: 'claude-code',\n command: 'claude',\n supportsCLI: true,\n promptArgs: ['--print', '-p'],\n nonInteractiveArgs: ['--no-input'],\n checkCommand: 'claude --version',\n },\n {\n type: 'codex',\n command: 'codex',\n supportsCLI: true,\n promptArgs: ['-p'],\n checkCommand: 'codex --version',\n },\n {\n type: 'gemini-cli',\n command: 'gemini',\n supportsCLI: true,\n promptArgs: [],\n checkCommand: 'gemini --version',\n },\n {\n type: 'opencode',\n command: 'opencode',\n supportsCLI: true,\n promptArgs: ['--prompt'],\n checkCommand: 'opencode --version',\n },\n {\n type: 'goose',\n command: 'goose',\n supportsCLI: true,\n promptArgs: ['run'],\n checkCommand: 'goose --version',\n },\n // IDE-based agents (no CLI execution)\n {\n type: 'cursor',\n command: 'cursor',\n supportsCLI: false,\n },\n {\n type: 'windsurf',\n command: 'windsurf',\n supportsCLI: false,\n },\n {\n type: 'github-copilot',\n command: 'gh copilot',\n supportsCLI: false,\n },\n];\n\n/**\n * Get CLI config for an agent\n */\nexport function getAgentCLIConfig(agentType: AgentType): AgentCLIConfig | undefined {\n return AGENT_CLI_CONFIGS.find((c) => c.type === agentType);\n}\n\n/**\n * Check if an agent CLI is available\n */\nexport async function isAgentCLIAvailable(agentType: AgentType): Promise<boolean> {\n const config = getAgentCLIConfig(agentType);\n if (!config || !config.supportsCLI) return false;\n\n try {\n // Check if command exists\n const checkCmd = config.checkCommand || `which ${config.command}`;\n const result = await executeCommand(checkCmd.split(' ')[0], checkCmd.split(' ').slice(1), {\n timeout: 5000,\n });\n return result.exitCode === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Get all available CLI agents\n */\nexport async function getAvailableCLIAgents(): Promise<AgentType[]> {\n const available: AgentType[] = [];\n\n for (const config of AGENT_CLI_CONFIGS) {\n if (config.supportsCLI && (await isAgentCLIAvailable(config.type))) {\n available.push(config.type);\n }\n }\n\n return available;\n}\n\n/**\n * Execute a skill using an agent CLI\n */\nexport async function executeWithAgent(\n agentType: AgentType,\n prompt: string,\n options: {\n cwd?: string;\n timeout?: number;\n env?: Record<string, string>;\n } = {}\n): Promise<AgentExecutionResult> {\n const config = getAgentCLIConfig(agentType);\n\n if (!config) {\n return {\n success: false,\n output: '',\n error: `Unknown agent type: ${agentType}`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n if (!config.supportsCLI) {\n return {\n success: false,\n output: '',\n error: `Agent ${agentType} does not support CLI execution. Please use IDE integration.`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n const isAvailable = await isAgentCLIAvailable(agentType);\n if (!isAvailable) {\n return {\n success: false,\n output: '',\n error: `Agent CLI '${config.command}' is not installed or not in PATH`,\n exitCode: 1,\n duration: 0,\n };\n }\n\n // Build command arguments\n const args: string[] = [...(config.promptArgs || [])];\n\n // For Claude Code, use --print mode with the prompt\n if (agentType === 'claude-code') {\n args.push(prompt);\n } else {\n // For other agents, pass prompt as argument\n args.push(prompt);\n }\n\n // Add non-interactive flags if available\n if (config.nonInteractiveArgs) {\n args.push(...config.nonInteractiveArgs);\n }\n\n return executeCommand(config.command, args, {\n cwd: options.cwd || process.cwd(),\n timeout: options.timeout || 300000, // 5 minutes default\n env: {\n ...process.env,\n ...config.envVars,\n ...options.env,\n },\n });\n}\n\n/**\n * Execute a command and capture output\n */\nasync function executeCommand(\n command: string,\n args: string[],\n options: {\n cwd?: string;\n timeout?: number;\n env?: NodeJS.ProcessEnv;\n } = {}\n): Promise<AgentExecutionResult> {\n return new Promise((resolve) => {\n const startTime = Date.now();\n let stdout = '';\n let stderr = '';\n let timedOut = false;\n\n const spawnOptions: SpawnOptions = {\n cwd: options.cwd,\n env: options.env as NodeJS.ProcessEnv,\n // shell: false (default) - prevents shell injection when passing untrusted input\n };\n\n const child = spawn(command, args, spawnOptions);\n\n // Set up timeout\n const timeoutId = options.timeout\n ? setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, options.timeout)\n : null;\n\n child.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n child.on('error', (error) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve({\n success: false,\n output: stdout,\n error: error.message,\n exitCode: 1,\n duration: Date.now() - startTime,\n });\n });\n\n child.on('close', (code) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve({\n success: code === 0 && !timedOut,\n output: stdout,\n error: timedOut ? 'Execution timed out' : stderr || undefined,\n exitCode: code ?? 1,\n duration: Date.now() - startTime,\n });\n });\n });\n}\n\n/**\n * Format skill content as a prompt for an agent\n */\nexport function formatSkillAsPrompt(\n skillName: string,\n skillContent: string,\n taskDescription?: string\n): string {\n let prompt = `Execute the following skill: ${skillName}\\n\\n`;\n\n if (taskDescription) {\n prompt += `Task: ${taskDescription}\\n\\n`;\n }\n\n prompt += `Skill Content:\\n${skillContent}`;\n\n return prompt;\n}\n\n/**\n * Agent execution strategy\n */\nexport type ExecutionStrategy = 'cli' | 'ide' | 'api' | 'manual';\n\n/**\n * Get recommended execution strategy for an agent\n */\nexport function getExecutionStrategy(agentType: AgentType): ExecutionStrategy {\n const config = getAgentCLIConfig(agentType);\n\n if (config?.supportsCLI) {\n return 'cli';\n }\n\n // IDE-based agents\n if (['cursor', 'windsurf', 'github-copilot', 'kilo'].includes(agentType)) {\n return 'ide';\n }\n\n return 'manual';\n}\n\n/**\n * Get instructions for manual/IDE execution\n */\nexport function getManualExecutionInstructions(\n agentType: AgentType,\n skillPath: string\n): string {\n const strategy = getExecutionStrategy(agentType);\n\n if (strategy === 'ide') {\n return `\nTo execute this skill with ${agentType}:\n1. Open your project in ${agentType}\n2. The skill has been synced to the agent's skills directory\n3. Open the AI assistant/chat\n4. Reference the skill or ask the assistant to follow the instructions\n\nSkill location: ${skillPath}\n`;\n }\n\n return `\nTo execute this skill manually:\n1. Open the skill file: ${skillPath}\n2. Copy the skill content\n3. Paste it into your AI coding assistant\n4. Follow the instructions in the skill\n`;\n}\n","/**\n * Skill Executor for Workflows\n *\n * Provides a real skill executor that finds skills by name\n * and executes them using available agent CLIs.\n */\n\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { findSkill, readSkillContent, SKILL_DISCOVERY_PATHS } from '../skills.js';\nimport type { AgentType } from '../types.js';\nimport {\n executeWithAgent,\n getAvailableCLIAgents,\n formatSkillAsPrompt,\n getExecutionStrategy,\n getManualExecutionInstructions,\n} from './agents.js';\nimport type { SkillExecutor } from '../workflow/orchestrator.js';\n\n/**\n * Options for creating a skill executor\n */\nexport interface SkillExecutorOptions {\n /** Project path to search for skills */\n projectPath?: string;\n /** Preferred agent to use for execution */\n preferredAgent?: AgentType;\n /** Timeout for skill execution (ms) */\n timeout?: number;\n /** Whether to fall back to other agents if preferred is unavailable */\n fallbackToAvailable?: boolean;\n /** Callback for execution events */\n onExecutionEvent?: (event: SkillExecutionEvent) => void;\n}\n\n/**\n * Skill execution event\n */\nexport interface SkillExecutionEvent {\n type: 'skill_found' | 'skill_not_found' | 'agent_selected' | 'execution_start' | 'execution_complete';\n skillName: string;\n agent?: AgentType;\n message?: string;\n success?: boolean;\n error?: string;\n}\n\n/**\n * Get search directories for skills\n */\nfunction getSearchDirs(projectPath: string): string[] {\n const dirs: string[] = [];\n\n // Project-local paths\n for (const searchPath of SKILL_DISCOVERY_PATHS) {\n const fullPath = join(projectPath, searchPath);\n if (existsSync(fullPath)) {\n dirs.push(fullPath);\n }\n }\n\n // Global paths\n const home = homedir();\n const globalPaths = [\n join(home, '.claude', 'skills'),\n join(home, '.cursor', 'skills'),\n join(home, '.codex', 'skills'),\n join(home, '.skillkit', 'skills'),\n ];\n\n for (const globalPath of globalPaths) {\n if (existsSync(globalPath)) {\n dirs.push(globalPath);\n }\n }\n\n return dirs;\n}\n\n/**\n * Create a skill executor for workflow orchestration\n *\n * This returns a function compatible with the WorkflowOrchestrator's SkillExecutor type.\n */\nexport function createSkillExecutor(options: SkillExecutorOptions = {}): SkillExecutor {\n const {\n projectPath = process.cwd(),\n preferredAgent,\n timeout = 300000, // 5 minutes\n fallbackToAvailable = true,\n onExecutionEvent,\n } = options;\n\n return async (skillName: string, config?: Record<string, unknown>): Promise<{ success: boolean; error?: string }> => {\n // Find the skill\n const searchDirs = getSearchDirs(projectPath);\n const skill = findSkill(skillName, searchDirs);\n\n if (!skill) {\n onExecutionEvent?.({\n type: 'skill_not_found',\n skillName,\n message: `Skill \"${skillName}\" not found in any search directory`,\n });\n\n return {\n success: false,\n error: `Skill \"${skillName}\" not found. Search paths: ${searchDirs.join(', ')}`,\n };\n }\n\n onExecutionEvent?.({\n type: 'skill_found',\n skillName,\n message: `Found skill at: ${skill.path}`,\n });\n\n // Read skill content\n const content = readSkillContent(skill.path);\n if (!content) {\n return {\n success: false,\n error: `Could not read skill content from: ${skill.path}`,\n };\n }\n\n // Determine which agent to use\n let agentToUse: AgentType | undefined = preferredAgent;\n\n if (!agentToUse || fallbackToAvailable) {\n const availableAgents = await getAvailableCLIAgents();\n\n if (preferredAgent && availableAgents.includes(preferredAgent)) {\n agentToUse = preferredAgent;\n } else if (availableAgents.length > 0) {\n // Prefer claude-code if available, otherwise use first available\n agentToUse = availableAgents.includes('claude-code') ? 'claude-code' : availableAgents[0];\n }\n }\n\n // If no CLI agent available, provide manual instructions or error\n if (!agentToUse) {\n const strategy = getExecutionStrategy(preferredAgent || 'universal');\n const instructions = getManualExecutionInstructions(preferredAgent || 'universal', skill.path);\n\n if (strategy === 'ide' || strategy === 'manual') {\n onExecutionEvent?.({\n type: 'execution_complete',\n skillName,\n success: false,\n message: 'No CLI agent available',\n error: `No CLI agent available for execution.\\n${instructions}`,\n });\n\n return {\n success: false,\n error: `No CLI agent available for automated execution. ${instructions}`,\n };\n }\n\n // strategy is 'cli' but the preferred agent's CLI is not installed\n const errorMsg = preferredAgent\n ? `The preferred agent \"${preferredAgent}\" supports CLI execution but its CLI is not installed.`\n : 'No CLI agent is available for execution.';\n\n onExecutionEvent?.({\n type: 'execution_complete',\n skillName,\n success: false,\n message: 'CLI not installed',\n error: `${errorMsg}\\n${instructions}`,\n });\n\n return {\n success: false,\n error: `${errorMsg} ${instructions}`,\n };\n }\n\n onExecutionEvent?.({\n type: 'agent_selected',\n skillName,\n agent: agentToUse,\n message: `Using agent: ${agentToUse}`,\n });\n\n // Format the prompt with skill content and any config\n let taskDescription: string | undefined;\n if (config?.task) {\n taskDescription = String(config.task);\n }\n\n const prompt = formatSkillAsPrompt(skillName, content, taskDescription);\n\n onExecutionEvent?.({\n type: 'execution_start',\n skillName,\n agent: agentToUse,\n message: `Starting execution with ${agentToUse}`,\n });\n\n // Execute with the agent\n const result = await executeWithAgent(agentToUse!, prompt, {\n cwd: projectPath,\n timeout,\n });\n\n onExecutionEvent?.({\n type: 'execution_complete',\n skillName,\n agent: agentToUse,\n success: result.success,\n error: result.error,\n message: result.success ? 'Execution completed successfully' : `Execution failed: ${result.error}`,\n });\n\n return {\n success: result.success,\n error: result.error,\n };\n };\n}\n\n/**\n * Create a simulated skill executor for testing/dry-run\n *\n * This executor doesn't actually run skills but simulates execution.\n */\nexport function createSimulatedSkillExecutor(options: {\n delay?: number;\n shouldFail?: (skillName: string) => boolean;\n onExecute?: (skillName: string) => void;\n} = {}): SkillExecutor {\n const { delay = 100, shouldFail, onExecute } = options;\n\n return async (skillName: string, _config?: Record<string, unknown>): Promise<{ success: boolean; error?: string }> => {\n onExecute?.(skillName);\n\n // Simulate execution time\n await new Promise((resolve) => setTimeout(resolve, delay));\n\n const failed = shouldFail?.(skillName) ?? false;\n\n return {\n success: !failed,\n error: failed ? `Simulated failure for skill: ${skillName}` : undefined,\n };\n };\n}\n","/**\n * Skill Test Runner\n *\n * Executes test suites and assertions for skill verification.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { exec } from 'node:child_process';\nimport { createServer } from 'node:net';\nimport { promisify } from 'node:util';\nimport { parse as parseYaml } from 'yaml';\nimport type {\n TestAssertion,\n AssertionResult,\n SkillTestCase,\n TestCaseResult,\n SkillTestSuite,\n TestSuiteResult,\n TestRunnerOptions,\n} from './types.js';\n\nconst execAsync = promisify(exec);\n\n/**\n * Default timeout for assertions (30 seconds)\n */\nconst DEFAULT_TIMEOUT = 30000;\n\n/**\n * Run a single assertion\n */\nasync function runAssertion(\n assertion: TestAssertion,\n cwd: string,\n timeout: number\n): Promise<AssertionResult> {\n const startTime = Date.now();\n\n try {\n switch (assertion.type) {\n case 'file_exists':\n return assertFileExists(assertion, cwd, startTime);\n\n case 'file_not_exists':\n return assertFileNotExists(assertion, cwd, startTime);\n\n case 'file_contains':\n return assertFileContains(assertion, cwd, startTime);\n\n case 'file_not_contains':\n return assertFileNotContains(assertion, cwd, startTime);\n\n case 'file_matches':\n return assertFileMatches(assertion, cwd, startTime);\n\n case 'command_succeeds':\n return assertCommandSucceeds(assertion, cwd, timeout, startTime);\n\n case 'command_fails':\n return assertCommandFails(assertion, cwd, timeout, startTime);\n\n case 'command_output_contains':\n return assertCommandOutputContains(assertion, cwd, timeout, startTime);\n\n case 'json_valid':\n return assertJsonValid(assertion, cwd, startTime);\n\n case 'json_has_key':\n return assertJsonHasKey(assertion, cwd, startTime);\n\n case 'yaml_valid':\n return assertYamlValid(assertion, cwd, startTime);\n\n case 'type_check':\n return assertTypeCheck(cwd, timeout, startTime);\n\n case 'lint_passes':\n return assertLintPasses(cwd, timeout, startTime);\n\n case 'test_passes':\n return assertTestPasses(cwd, timeout, startTime);\n\n case 'env_var_set':\n return assertEnvVarSet(assertion, startTime);\n\n case 'port_available':\n return assertPortAvailable(assertion, startTime);\n\n case 'url_responds':\n return assertUrlResponds(assertion, timeout, startTime);\n\n case 'custom':\n return assertCustom(assertion, cwd, timeout, startTime);\n\n default:\n return {\n assertion,\n passed: false,\n error: `Unknown assertion type: ${assertion.type}`,\n duration: Date.now() - startTime,\n };\n }\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\n// Assertion implementations\n\nfunction assertFileExists(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n const exists = existsSync(filePath);\n\n return {\n assertion,\n passed: exists,\n actual: exists ? 'exists' : 'not found',\n expected: 'exists',\n error: exists ? undefined : `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileNotExists(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n const exists = existsSync(filePath);\n\n return {\n assertion,\n passed: !exists,\n actual: exists ? 'exists' : 'not found',\n expected: 'not found',\n error: !exists ? undefined : `File should not exist: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileContains(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const expected = String(assertion.expected || '');\n const contains = content.includes(expected);\n\n return {\n assertion,\n passed: contains,\n actual: contains ? 'contains' : 'not found in file',\n expected: `contains \"${expected}\"`,\n error: contains ? undefined : `File does not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileNotContains(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: true, // File doesn't exist, so it doesn't contain the text\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const expected = String(assertion.expected || '');\n const contains = content.includes(expected);\n\n return {\n assertion,\n passed: !contains,\n actual: contains ? 'found in file' : 'not found',\n expected: `does not contain \"${expected}\"`,\n error: !contains ? undefined : `File should not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertFileMatches(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n const content = readFileSync(filePath, 'utf-8');\n const pattern = new RegExp(String(assertion.expected || ''));\n const matches = pattern.test(content);\n\n return {\n assertion,\n passed: matches,\n actual: matches ? 'matches' : 'no match',\n expected: `matches /${assertion.expected}/`,\n error: matches ? undefined : `File does not match pattern: ${assertion.expected}`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertCommandSucceeds(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: true,\n actual: 'exit code 0',\n expected: 'exit code 0',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'non-zero exit code',\n expected: 'exit code 0',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCommandFails(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: false,\n actual: 'exit code 0',\n expected: 'non-zero exit code',\n error: 'Command should have failed but succeeded',\n duration: Date.now() - startTime,\n };\n } catch {\n return {\n assertion,\n passed: true,\n actual: 'non-zero exit code',\n expected: 'non-zero exit code',\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCommandOutputContains(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n try {\n const { stdout, stderr } = await execAsync(assertion.target || '', {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n const output = stdout + stderr;\n const expected = String(assertion.expected || '');\n const contains = output.includes(expected);\n\n return {\n assertion,\n passed: contains,\n actual: contains ? 'found in output' : 'not found',\n expected: `contains \"${expected}\"`,\n error: contains ? undefined : `Command output does not contain: ${expected}`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertJsonValid(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n JSON.parse(content);\n\n return {\n assertion,\n passed: true,\n actual: 'valid JSON',\n expected: 'valid JSON',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'invalid JSON',\n expected: 'valid JSON',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertJsonHasKey(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n const json = JSON.parse(content);\n const key = String(assertion.expected || '');\n const keys = key.split('.');\n\n let value = json;\n for (const k of keys) {\n if (value === undefined || value === null || !(k in value)) {\n return {\n assertion,\n passed: false,\n actual: 'key not found',\n expected: `has key \"${key}\"`,\n error: `JSON does not have key: ${key}`,\n duration: Date.now() - startTime,\n };\n }\n value = value[k];\n }\n\n return {\n assertion,\n passed: true,\n actual: 'key found',\n expected: `has key \"${key}\"`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nfunction assertYamlValid(\n assertion: TestAssertion,\n cwd: string,\n startTime: number\n): AssertionResult {\n const filePath = join(cwd, assertion.target || '');\n\n if (!existsSync(filePath)) {\n return {\n assertion,\n passed: false,\n error: `File not found: ${assertion.target}`,\n duration: Date.now() - startTime,\n };\n }\n\n try {\n const content = readFileSync(filePath, 'utf-8');\n parseYaml(content);\n\n return {\n assertion,\n passed: true,\n actual: 'valid YAML',\n expected: 'valid YAML',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'invalid YAML',\n expected: 'valid YAML',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertTypeCheck(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'type_check' };\n\n // Try various type check commands\n const commands = [\n 'npx tsc --noEmit',\n 'pnpm tsc --noEmit',\n 'yarn tsc --noEmit',\n 'npm run type-check',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'types valid',\n expected: 'types valid',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'type errors',\n expected: 'types valid',\n error: 'Type check failed or TypeScript not configured',\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertLintPasses(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'lint_passes' };\n\n // Try various lint commands\n const commands = [\n 'npx eslint . --max-warnings=0',\n 'pnpm eslint . --max-warnings=0',\n 'npm run lint',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'lint passes',\n expected: 'lint passes',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'lint errors',\n expected: 'lint passes',\n error: 'Lint check failed or ESLint not configured',\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertTestPasses(\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const assertion: TestAssertion = { type: 'test_passes' };\n\n // Try various test commands\n const commands = [\n 'npm test',\n 'pnpm test',\n 'yarn test',\n 'npx vitest run',\n 'npx jest',\n ];\n\n for (const cmd of commands) {\n try {\n await execAsync(cmd, { cwd, timeout });\n return {\n assertion,\n passed: true,\n actual: 'tests pass',\n expected: 'tests pass',\n duration: Date.now() - startTime,\n };\n } catch {\n // Try next command\n }\n }\n\n return {\n assertion,\n passed: false,\n actual: 'tests fail',\n expected: 'tests pass',\n error: 'Tests failed or test framework not configured',\n duration: Date.now() - startTime,\n };\n}\n\nfunction assertEnvVarSet(\n assertion: TestAssertion,\n startTime: number\n): AssertionResult {\n const varName = assertion.target || '';\n const isSet = process.env[varName] !== undefined;\n\n return {\n assertion,\n passed: isSet,\n actual: isSet ? 'set' : 'not set',\n expected: 'set',\n error: isSet ? undefined : `Environment variable not set: ${varName}`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function checkPortAvailable(port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const server = createServer();\n server.once('error', () => resolve(false));\n server.once('listening', () => {\n server.close();\n resolve(true);\n });\n server.listen(port, '127.0.0.1');\n });\n}\n\nasync function assertPortAvailable(\n assertion: TestAssertion,\n startTime: number\n): Promise<AssertionResult> {\n const port = parseInt(assertion.target || '0', 10);\n\n if (port <= 0 || port > 65535) {\n return {\n assertion,\n passed: false,\n actual: `invalid port ${port}`,\n expected: 'valid port number (1-65535)',\n error: 'Invalid port number',\n duration: Date.now() - startTime,\n };\n }\n\n const isAvailable = await checkPortAvailable(port);\n\n return {\n assertion,\n passed: isAvailable,\n actual: isAvailable ? 'available' : 'in use',\n expected: 'available',\n error: isAvailable ? undefined : `Port ${port} is already in use`,\n duration: Date.now() - startTime,\n };\n}\n\nasync function assertUrlResponds(\n assertion: TestAssertion,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n const url = assertion.target || '';\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), assertion.timeout || timeout);\n\n const response = await fetch(url, { signal: controller.signal });\n clearTimeout(timeoutId);\n\n const responds = response.ok;\n\n return {\n assertion,\n passed: responds,\n actual: `status ${response.status}`,\n expected: 'status 2xx',\n error: responds ? undefined : `URL returned status ${response.status}`,\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\nasync function assertCustom(\n assertion: TestAssertion,\n cwd: string,\n timeout: number,\n startTime: number\n): Promise<AssertionResult> {\n if (!assertion.command) {\n return {\n assertion,\n passed: false,\n error: 'Custom assertion requires a command',\n duration: Date.now() - startTime,\n };\n }\n\n try {\n await execAsync(assertion.command, {\n cwd,\n timeout: assertion.timeout || timeout,\n });\n\n return {\n assertion,\n passed: true,\n actual: 'command succeeded',\n expected: 'command succeeds',\n duration: Date.now() - startTime,\n };\n } catch (error) {\n return {\n assertion,\n passed: false,\n actual: 'command failed',\n expected: 'command succeeds',\n error: error instanceof Error ? error.message : String(error),\n duration: Date.now() - startTime,\n };\n }\n}\n\n/**\n * Run a single test case\n */\nasync function runTestCase(\n testCase: SkillTestCase,\n cwd: string,\n options: TestRunnerOptions\n): Promise<TestCaseResult> {\n const startTime = Date.now();\n const timeout = testCase.assertions[0]?.timeout || options.timeout || DEFAULT_TIMEOUT;\n\n // Check if test should be skipped\n if (testCase.skip) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n\n // Check tag filters - if tags are specified, only run tests with matching tags\n if (options.tags && options.tags.length > 0) {\n // Tests without tags should be skipped when tag filter is active\n if (!testCase.tags || testCase.tags.length === 0) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n const hasRequiredTag = options.tags.some((t) => testCase.tags?.includes(t));\n if (!hasRequiredTag) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n }\n\n if (options.skipTags && testCase.tags) {\n const hasSkipTag = options.skipTags.some((t) => testCase.tags?.includes(t));\n if (hasSkipTag) {\n return {\n testCase,\n passed: true,\n assertions: [],\n duration: 0,\n skipped: true,\n };\n }\n }\n\n // Run setup commands\n let setupError: string | undefined;\n if (testCase.setup) {\n for (const cmd of testCase.setup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n setupError = error instanceof Error ? error.message : String(error);\n break;\n }\n }\n }\n\n if (setupError) {\n return {\n testCase,\n passed: false,\n assertions: [],\n setupError,\n duration: Date.now() - startTime,\n skipped: false,\n };\n }\n\n // Run assertions\n const assertionResults: AssertionResult[] = [];\n let allPassed = true;\n\n for (const assertion of testCase.assertions) {\n options.onProgress?.({\n type: 'assertion_start',\n testName: testCase.name,\n assertionType: assertion.type,\n });\n\n const result = await runAssertion(assertion, cwd, timeout);\n assertionResults.push(result);\n\n options.onProgress?.({\n type: 'assertion_end',\n testName: testCase.name,\n assertionType: assertion.type,\n passed: result.passed,\n error: result.error,\n });\n\n if (!result.passed) {\n allPassed = false;\n if (options.bail) {\n break;\n }\n }\n }\n\n // Run cleanup commands\n let cleanupError: string | undefined;\n if (testCase.cleanup) {\n for (const cmd of testCase.cleanup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n cleanupError = error instanceof Error ? error.message : String(error);\n }\n }\n }\n\n return {\n testCase,\n passed: allPassed,\n assertions: assertionResults,\n cleanupError,\n duration: Date.now() - startTime,\n skipped: false,\n };\n}\n\n/**\n * Run a test suite\n */\nexport async function runTestSuite(\n suite: SkillTestSuite,\n options: TestRunnerOptions = {}\n): Promise<TestSuiteResult> {\n const startTime = Date.now();\n const cwd = options.cwd || process.cwd();\n const timeout = suite.defaultTimeout || options.timeout || DEFAULT_TIMEOUT;\n\n options.onProgress?.({\n type: 'suite_start',\n skillName: suite.skillName,\n });\n\n // Run global setup\n let globalSetupError: string | undefined;\n if (suite.globalSetup) {\n for (const cmd of suite.globalSetup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n globalSetupError = error instanceof Error ? error.message : String(error);\n break;\n }\n }\n }\n\n if (globalSetupError) {\n return {\n skillName: suite.skillName,\n passed: false,\n tests: [],\n passedCount: 0,\n failedCount: 0,\n skippedCount: 0,\n duration: Date.now() - startTime,\n globalSetupError,\n };\n }\n\n // Check for 'only' tests\n const hasOnly = suite.tests.some((t) => t.only);\n const testsToRun = hasOnly ? suite.tests.filter((t) => t.only) : suite.tests;\n\n // Run tests\n const testResults: TestCaseResult[] = [];\n let passedCount = 0;\n let failedCount = 0;\n let skippedCount = 0;\n\n for (const testCase of testsToRun) {\n options.onProgress?.({\n type: 'test_start',\n skillName: suite.skillName,\n testName: testCase.name,\n });\n\n const result = await runTestCase(testCase, cwd, { ...options, timeout });\n testResults.push(result);\n\n if (result.skipped) {\n skippedCount++;\n } else if (result.passed) {\n passedCount++;\n } else {\n failedCount++;\n }\n\n options.onProgress?.({\n type: 'test_end',\n skillName: suite.skillName,\n testName: testCase.name,\n passed: result.passed,\n error: result.assertions.find((a) => !a.passed)?.error,\n });\n\n if (!result.passed && options.bail) {\n break;\n }\n }\n\n // Run global cleanup\n let globalCleanupError: string | undefined;\n if (suite.globalCleanup) {\n for (const cmd of suite.globalCleanup) {\n try {\n await execAsync(cmd, { cwd, timeout });\n } catch (error) {\n globalCleanupError = error instanceof Error ? error.message : String(error);\n }\n }\n }\n\n const result: TestSuiteResult = {\n skillName: suite.skillName,\n passed: failedCount === 0,\n tests: testResults,\n passedCount,\n failedCount,\n skippedCount,\n duration: Date.now() - startTime,\n globalCleanupError,\n };\n\n options.onProgress?.({\n type: 'suite_end',\n skillName: suite.skillName,\n passed: result.passed,\n });\n\n return result;\n}\n\n/**\n * Create a test suite from skill frontmatter\n */\nexport function createTestSuiteFromFrontmatter(\n skillName: string,\n frontmatter: Record<string, unknown>\n): SkillTestSuite | null {\n const tests = frontmatter.tests;\n\n if (!tests || !Array.isArray(tests)) {\n return null;\n }\n\n const testCases: SkillTestCase[] = tests.map((t: Record<string, unknown>) => ({\n name: String(t.name || 'Unnamed test'),\n description: t.description as string | undefined,\n assertions: parseAssertions(t.assertions || t.assert),\n setup: t.setup as string[] | undefined,\n cleanup: t.cleanup as string[] | undefined,\n skip: t.skip === true,\n only: t.only === true,\n tags: t.tags as string[] | undefined,\n }));\n\n return {\n skillName,\n tests: testCases,\n globalSetup: frontmatter.globalSetup as string[] | undefined,\n globalCleanup: frontmatter.globalCleanup as string[] | undefined,\n defaultTimeout: frontmatter.testTimeout as number | undefined,\n };\n}\n\n/**\n * Parse assertions from various formats\n */\nfunction parseAssertions(assertions: unknown): TestAssertion[] {\n if (!assertions) return [];\n\n if (typeof assertions === 'string') {\n // Simple string assertion like \"file_exists: config.json\"\n return [parseAssertionString(assertions)];\n }\n\n if (Array.isArray(assertions)) {\n return assertions.map((a) => {\n if (typeof a === 'string') {\n return parseAssertionString(a);\n }\n return a as TestAssertion;\n });\n }\n\n return [assertions as TestAssertion];\n}\n\n/**\n * Parse a string assertion\n */\nfunction parseAssertionString(str: string): TestAssertion {\n // Format: \"type: target\" or \"type: target = expected\"\n const match = str.match(/^(\\w+):\\s*(.+?)(?:\\s*=\\s*(.+))?$/);\n\n if (match) {\n return {\n type: match[1] as TestAssertion['type'],\n target: match[2].trim(),\n expected: match[3]?.trim(),\n };\n }\n\n // Fallback: treat as command\n return {\n type: 'command_succeeds',\n target: str,\n };\n}\n","/**\n * Skill Marketplace Types\n *\n * Types for the aggregated skill marketplace.\n */\n\n/**\n * Skill source repository\n */\nexport interface SkillSource {\n /** Repository owner */\n owner: string;\n /** Repository name */\n repo: string;\n /** Human-readable name */\n name: string;\n /** Description */\n description?: string;\n /** Whether this is an official source */\n official?: boolean;\n /** Branch to fetch from */\n branch?: string;\n /** Path to skills index file */\n indexPath?: string;\n}\n\n/**\n * Skill entry in the marketplace\n */\nexport interface MarketplaceSkill {\n /** Unique identifier (owner/repo/path) */\n id: string;\n /** Skill name */\n name: string;\n /** Description */\n description: string;\n /** Source repository */\n source: SkillSource;\n /** Path within the repository */\n path: string;\n /** Version if available */\n version?: string;\n /** Author */\n author?: string;\n /** Tags for categorization */\n tags: string[];\n /** Supported agents */\n agents?: string[];\n /** GitHub stars (if available) */\n stars?: number;\n /** Last updated date */\n updatedAt?: string;\n /** Download/install count */\n downloads?: number;\n /** Raw content URL */\n rawUrl?: string;\n}\n\n/**\n * Marketplace index (cached locally)\n */\nexport interface MarketplaceIndex {\n /** Index version */\n version: number;\n /** When the index was last updated */\n updatedAt: string;\n /** Sources included in this index */\n sources: SkillSource[];\n /** All skills in the index */\n skills: MarketplaceSkill[];\n /** Total skill count */\n totalCount: number;\n}\n\n/**\n * Search options for the marketplace\n */\nexport interface MarketplaceSearchOptions {\n /** Search query */\n query?: string;\n /** Filter by tags */\n tags?: string[];\n /** Filter by source */\n source?: string;\n /** Filter by agent compatibility */\n agent?: string;\n /** Sort by field */\n sortBy?: 'name' | 'stars' | 'downloads' | 'updatedAt';\n /** Sort direction */\n sortOrder?: 'asc' | 'desc';\n /** Limit results */\n limit?: number;\n /** Offset for pagination */\n offset?: number;\n}\n\n/**\n * Search result\n */\nexport interface MarketplaceSearchResult {\n /** Matching skills */\n skills: MarketplaceSkill[];\n /** Total matches (before limit) */\n total: number;\n /** Query that was searched */\n query?: string;\n}\n\n/**\n * Marketplace configuration\n */\nexport interface MarketplaceConfig {\n /** Custom sources to include */\n sources?: SkillSource[];\n /** Cache directory */\n cacheDir?: string;\n /** Cache TTL in milliseconds */\n cacheTTL?: number;\n /** GitHub token for API access */\n githubToken?: string;\n}\n\n/**\n * Default skill sources\n */\nexport const DEFAULT_SKILL_SOURCES: SkillSource[] = [\n {\n owner: 'composioHQ',\n repo: 'awesome-claude-code-skills',\n name: 'Composio Curated',\n description: 'Curated collection of Claude Code skills',\n official: false,\n branch: 'main',\n },\n {\n owner: 'anthropics',\n repo: 'courses',\n name: 'Anthropic Official',\n description: 'Official Anthropic courses and skills',\n official: true,\n branch: 'master',\n },\n];\n\n/**\n * Cache file name\n */\nexport const MARKETPLACE_CACHE_FILE = 'marketplace-index.json';\n\n/**\n * Default cache TTL (1 hour)\n */\nexport const DEFAULT_CACHE_TTL = 60 * 60 * 1000;\n","/**\n * Marketplace Aggregator\n *\n * Fetches and indexes skills from multiple GitHub repositories.\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, unlinkSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport type {\n SkillSource,\n MarketplaceSkill,\n MarketplaceIndex,\n MarketplaceSearchOptions,\n MarketplaceSearchResult,\n MarketplaceConfig,\n} from './types.js';\nimport {\n DEFAULT_SKILL_SOURCES,\n MARKETPLACE_CACHE_FILE,\n DEFAULT_CACHE_TTL,\n} from './types.js';\n\n/**\n * Marketplace Aggregator\n */\nexport class MarketplaceAggregator {\n private config: MarketplaceConfig;\n private cacheDir: string;\n private cachePath: string;\n private index: MarketplaceIndex | null = null;\n\n constructor(config: MarketplaceConfig = {}) {\n this.config = config;\n this.cacheDir = config.cacheDir || join(homedir(), '.skillkit', 'marketplace');\n this.cachePath = join(this.cacheDir, MARKETPLACE_CACHE_FILE);\n\n // Ensure cache directory exists\n if (!existsSync(this.cacheDir)) {\n mkdirSync(this.cacheDir, { recursive: true });\n }\n }\n\n /**\n * Get all sources (default + custom)\n */\n getSources(): SkillSource[] {\n return [...DEFAULT_SKILL_SOURCES, ...(this.config.sources || [])];\n }\n\n /**\n * Load cached index\n */\n loadCache(): MarketplaceIndex | null {\n if (!existsSync(this.cachePath)) {\n return null;\n }\n\n try {\n const content = readFileSync(this.cachePath, 'utf-8');\n const index = JSON.parse(content) as MarketplaceIndex;\n\n // Check if cache is expired\n const cacheAge = Date.now() - new Date(index.updatedAt).getTime();\n const ttl = this.config.cacheTTL || DEFAULT_CACHE_TTL;\n\n if (cacheAge > ttl) {\n return null; // Cache expired\n }\n\n this.index = index;\n return index;\n } catch {\n return null;\n }\n }\n\n /**\n * Save index to cache\n */\n saveCache(index: MarketplaceIndex): void {\n writeFileSync(this.cachePath, JSON.stringify(index, null, 2));\n this.index = index;\n }\n\n /**\n * Fetch skills from a single source\n */\n async fetchSource(source: SkillSource): Promise<MarketplaceSkill[]> {\n const skills: MarketplaceSkill[] = [];\n const branch = source.branch || 'main';\n\n try {\n // Try to fetch skills index file\n const indexPaths = [\n source.indexPath,\n 'skills.json',\n 'index.json',\n '.skillkit/skills.json',\n ].filter(Boolean) as string[];\n\n for (const indexPath of indexPaths) {\n try {\n const url = `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${indexPath}`;\n const response = await fetch(url);\n\n if (response.ok) {\n const data = (await response.json()) as unknown;\n\n if (Array.isArray(data)) {\n for (const item of data) {\n skills.push(this.parseSkillEntry(item as Record<string, unknown>, source));\n }\n return skills;\n }\n\n const dataObj = data as Record<string, unknown>;\n if (dataObj.skills && Array.isArray(dataObj.skills)) {\n for (const item of dataObj.skills) {\n skills.push(this.parseSkillEntry(item as Record<string, unknown>, source));\n }\n return skills;\n }\n }\n } catch {\n // Try next path\n }\n }\n\n // Fallback: Try to parse README for skill links\n const readmeUrl = `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/README.md`;\n const readmeResponse = await fetch(readmeUrl);\n\n if (readmeResponse.ok) {\n const readme = await readmeResponse.text();\n const parsedSkills = this.parseReadmeForSkills(readme, source);\n skills.push(...parsedSkills);\n }\n\n // If still no skills, add the repo itself as a skill source\n if (skills.length === 0) {\n skills.push({\n id: `${source.owner}/${source.repo}`,\n name: source.repo,\n description: source.description || `Skills from ${source.name}`,\n source,\n path: '/',\n tags: ['repository'],\n rawUrl: `https://github.com/${source.owner}/${source.repo}`,\n });\n }\n } catch (error) {\n console.error(`Failed to fetch skills from ${source.owner}/${source.repo}:`, error);\n }\n\n return skills;\n }\n\n /**\n * Check if a path is an absolute URL\n */\n private isAbsoluteUrl(path: string): boolean {\n return /^https?:\\/\\//i.test(path);\n }\n\n /**\n * Convert a GitHub URL to raw content URL\n */\n private toRawUrl(url: string): string {\n return url\n .replace('://github.com/', '://raw.githubusercontent.com/')\n .replace('/blob/', '/');\n }\n\n /**\n * Parse a skill entry from JSON\n */\n private parseSkillEntry(\n item: Record<string, unknown>,\n source: SkillSource\n ): MarketplaceSkill {\n const name = String(item.name || item.title || 'Unknown');\n const path = String(item.path || item.file || item.url || '/');\n\n // Handle absolute URLs - use them directly instead of building from source\n const rawUrl = this.isAbsoluteUrl(path)\n ? this.toRawUrl(path)\n : this.buildRawUrl(source, path);\n\n return {\n id: `${source.owner}/${source.repo}/${path}`,\n name,\n description: String(item.description || item.desc || ''),\n source,\n path,\n version: item.version as string | undefined,\n author: item.author as string | undefined,\n tags: Array.isArray(item.tags) ? item.tags : [],\n agents: Array.isArray(item.agents) ? item.agents : undefined,\n stars: typeof item.stars === 'number' ? item.stars : undefined,\n updatedAt: item.updatedAt as string | undefined,\n downloads: typeof item.downloads === 'number' ? item.downloads : undefined,\n rawUrl,\n };\n }\n\n /**\n * Parse README for skill links\n */\n private parseReadmeForSkills(\n readme: string,\n source: SkillSource\n ): MarketplaceSkill[] {\n const skills: MarketplaceSkill[] = [];\n const branch = source.branch || 'main';\n\n // Look for markdown links to skill files\n const linkPattern = /\\[([^\\]]+)\\]\\(([^)]+\\.md)\\)/g;\n let match;\n\n while ((match = linkPattern.exec(readme)) !== null) {\n const name = match[1];\n const path = match[2];\n\n // Skip external links and non-skill files\n if (path.startsWith('http') && !path.includes(source.repo)) {\n continue;\n }\n\n // Extract description from surrounding text\n const contextStart = Math.max(0, match.index - 200);\n const contextEnd = Math.min(readme.length, match.index + 200);\n const context = readme.slice(contextStart, contextEnd);\n\n // Try to find description in list item or paragraph\n const descMatch = context.match(/[-*]\\s*\\[.*?\\]\\(.*?\\)\\s*[-:]\\s*(.+?)(?:\\n|$)/);\n const description = descMatch ? descMatch[1].trim() : '';\n\n // Handle absolute URLs in README links\n const isAbsolute = this.isAbsoluteUrl(path);\n const normalizedPath = isAbsolute ? path : (path.startsWith('/') ? path : `/${path}`);\n const rawUrl = isAbsolute\n ? this.toRawUrl(path)\n : `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${path}`;\n\n skills.push({\n id: `${source.owner}/${source.repo}/${path}`,\n name,\n description,\n source,\n path: normalizedPath,\n tags: this.inferTags(name, description),\n rawUrl,\n });\n }\n\n return skills;\n }\n\n /**\n * Build raw URL for a skill\n */\n private buildRawUrl(source: SkillSource, path: string): string {\n const branch = source.branch || 'main';\n const cleanPath = path.startsWith('/') ? path.slice(1) : path;\n return `https://raw.githubusercontent.com/${source.owner}/${source.repo}/${branch}/${cleanPath}`;\n }\n\n /**\n * Infer tags from name and description\n */\n private inferTags(name: string, description: string): string[] {\n const tags: string[] = [];\n const text = `${name} ${description}`.toLowerCase();\n\n const tagKeywords: Record<string, string[]> = {\n typescript: ['typescript', 'ts', 'tsc'],\n javascript: ['javascript', 'js', 'node'],\n react: ['react', 'jsx', 'tsx'],\n nextjs: ['next', 'nextjs', 'next.js'],\n testing: ['test', 'jest', 'vitest', 'mocha'],\n linting: ['lint', 'eslint', 'prettier'],\n auth: ['auth', 'authentication', 'login', 'oauth'],\n database: ['database', 'db', 'postgres', 'mysql', 'mongo'],\n api: ['api', 'rest', 'graphql'],\n devops: ['ci', 'cd', 'docker', 'kubernetes'],\n git: ['git', 'github', 'commit'],\n };\n\n for (const [tag, keywords] of Object.entries(tagKeywords)) {\n if (keywords.some((k) => text.includes(k))) {\n tags.push(tag);\n }\n }\n\n return tags;\n }\n\n /**\n * Refresh the marketplace index\n */\n async refresh(): Promise<MarketplaceIndex> {\n const sources = this.getSources();\n const allSkills: MarketplaceSkill[] = [];\n\n // Fetch from all sources in parallel\n const results = await Promise.all(\n sources.map((source) => this.fetchSource(source))\n );\n\n for (const skills of results) {\n allSkills.push(...skills);\n }\n\n // Create index\n const index: MarketplaceIndex = {\n version: 1,\n updatedAt: new Date().toISOString(),\n sources,\n skills: allSkills,\n totalCount: allSkills.length,\n };\n\n // Save to cache\n this.saveCache(index);\n\n return index;\n }\n\n /**\n * Get the marketplace index (from cache or refresh)\n */\n async getIndex(forceRefresh = false): Promise<MarketplaceIndex> {\n // Check in-memory cache first\n if (!forceRefresh && this.index) {\n return this.index;\n }\n\n // Check file cache\n if (!forceRefresh) {\n const cached = this.loadCache();\n if (cached) {\n return cached;\n }\n }\n\n return this.refresh();\n }\n\n /**\n * Search the marketplace\n */\n async search(options: MarketplaceSearchOptions = {}): Promise<MarketplaceSearchResult> {\n const index = await this.getIndex();\n let skills = [...index.skills];\n\n // Filter by query\n if (options.query) {\n const query = options.query.toLowerCase();\n skills = skills.filter(\n (s) =>\n s.name.toLowerCase().includes(query) ||\n s.description.toLowerCase().includes(query) ||\n s.tags.some((t) => t.toLowerCase().includes(query))\n );\n }\n\n // Filter by tags\n if (options.tags && options.tags.length > 0) {\n skills = skills.filter((s) =>\n options.tags!.some((t) => s.tags.includes(t))\n );\n }\n\n // Filter by source\n if (options.source) {\n skills = skills.filter(\n (s) =>\n s.source.name === options.source ||\n `${s.source.owner}/${s.source.repo}` === options.source\n );\n }\n\n // Filter by agent\n if (options.agent) {\n skills = skills.filter(\n (s) => !s.agents || s.agents.includes(options.agent!)\n );\n }\n\n // Sort\n const sortBy = options.sortBy || 'name';\n const sortOrder = options.sortOrder || 'asc';\n\n skills.sort((a, b) => {\n let comparison = 0;\n\n switch (sortBy) {\n case 'name':\n comparison = a.name.localeCompare(b.name);\n break;\n case 'stars':\n comparison = (a.stars || 0) - (b.stars || 0);\n break;\n case 'downloads':\n comparison = (a.downloads || 0) - (b.downloads || 0);\n break;\n case 'updatedAt':\n comparison =\n new Date(a.updatedAt || 0).getTime() -\n new Date(b.updatedAt || 0).getTime();\n break;\n }\n\n return sortOrder === 'desc' ? -comparison : comparison;\n });\n\n const total = skills.length;\n\n // Apply pagination\n if (options.offset) {\n skills = skills.slice(options.offset);\n }\n\n if (options.limit) {\n skills = skills.slice(0, options.limit);\n }\n\n return {\n skills,\n total,\n query: options.query,\n };\n }\n\n /**\n * Get a skill by ID\n */\n async getSkill(id: string): Promise<MarketplaceSkill | null> {\n const index = await this.getIndex();\n return index.skills.find((s) => s.id === id) || null;\n }\n\n /**\n * Get skill content\n */\n async getSkillContent(skill: MarketplaceSkill): Promise<string | null> {\n if (!skill.rawUrl) {\n return null;\n }\n\n try {\n const response = await fetch(skill.rawUrl);\n if (response.ok) {\n return response.text();\n }\n } catch {\n // Fetch failed\n }\n\n return null;\n }\n\n /**\n * Get popular tags\n */\n async getPopularTags(limit = 20): Promise<{ tag: string; count: number }[]> {\n const index = await this.getIndex();\n const tagCounts = new Map<string, number>();\n\n for (const skill of index.skills) {\n for (const tag of skill.tags) {\n tagCounts.set(tag, (tagCounts.get(tag) || 0) + 1);\n }\n }\n\n const tags = Array.from(tagCounts.entries())\n .map(([tag, count]) => ({ tag, count }))\n .sort((a, b) => b.count - a.count)\n .slice(0, limit);\n\n return tags;\n }\n\n /**\n * Add a custom source\n */\n addSource(source: SkillSource): void {\n if (!this.config.sources) {\n this.config.sources = [];\n }\n this.config.sources.push(source);\n this.clearCache();\n }\n\n /**\n * Remove a custom source\n */\n removeSource(owner: string, repo: string): void {\n if (this.config.sources) {\n this.config.sources = this.config.sources.filter(\n (s) => s.owner !== owner || s.repo !== repo\n );\n }\n this.clearCache();\n }\n\n /**\n * Clear cache\n */\n clearCache(): void {\n if (existsSync(this.cachePath)) {\n unlinkSync(this.cachePath);\n }\n this.index = null;\n }\n}\n\n/**\n * Create a marketplace aggregator\n */\nexport function createMarketplaceAggregator(\n config?: MarketplaceConfig\n): MarketplaceAggregator {\n return new MarketplaceAggregator(config);\n}\n","/**\n * CI/CD Templates\n *\n * Provides templates for GitHub Actions, pre-commit hooks, and other CI/CD integrations.\n */\n\n/**\n * GitHub Action workflow for skill validation\n */\nexport const GITHUB_ACTION_TEMPLATE = `# Skill Validation Workflow\n# This workflow validates skills in your repository\n\nname: Validate Skills\n\non:\n push:\n paths:\n - '.claude/skills/**'\n - '.cursor/skills/**'\n - 'skills/**'\n pull_request:\n paths:\n - '.claude/skills/**'\n - '.cursor/skills/**'\n - 'skills/**'\n\njobs:\n validate:\n runs-on: ubuntu-latest\n\n steps:\n - name: Checkout\n uses: actions/checkout@v4\n\n - name: Setup Node.js\n uses: actions/setup-node@v4\n with:\n node-version: '20'\n\n - name: Install SkillKit\n run: npm install -g skillkit\n\n - name: Validate Skills\n run: skillkit validate\n\n - name: Run Skill Tests\n run: skillkit test --json > test-results.json\n continue-on-error: true\n\n - name: Upload Test Results\n uses: actions/upload-artifact@v4\n with:\n name: skill-test-results\n path: test-results.json\n retention-days: 30\n\n - name: Check Test Results\n run: |\n if [ -f test-results.json ]; then\n passed=$(cat test-results.json | jq -r '.passed')\n if [ \"$passed\" = \"false\" ]; then\n echo \"Some skill tests failed\"\n exit 1\n fi\n fi\n`;\n\n/**\n * Pre-commit hook script for skill validation\n */\nexport const PRE_COMMIT_HOOK_TEMPLATE = `#!/bin/bash\n# SkillKit Pre-commit Hook\n# Validates skills before commit\n\n# Colors for output\nRED='\\\\033[0;31m'\nGREEN='\\\\033[0;32m'\nYELLOW='\\\\033[0;33m'\nNC='\\\\033[0m' # No Color\n\necho -e \"\\${YELLOW}Running SkillKit validation...\\${NC}\"\n\n# Check if skillkit is installed\nif ! command -v skillkit &> /dev/null; then\n echo -e \"\\${RED}SkillKit not found. Install with: npm install -g skillkit\\${NC}\"\n exit 1\nfi\n\n# Get list of staged skill files\nSKILL_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\\\\.(md|mdc)$' | grep -E '(skills|.claude|.cursor)')\n\nif [ -z \"$SKILL_FILES\" ]; then\n echo -e \"\\${GREEN}No skill files staged, skipping validation.\\${NC}\"\n exit 0\nfi\n\necho \"Validating skill files:\"\necho \"$SKILL_FILES\"\n\n# Run validation\nif ! skillkit validate; then\n echo -e \"\\${RED}Skill validation failed. Please fix the errors and try again.\\${NC}\"\n exit 1\nfi\n\n# Run tests if any\nif skillkit test --json 2>/dev/null | jq -e '.passed == false' > /dev/null 2>&1; then\n echo -e \"\\${RED}Skill tests failed. Please fix the failing tests.\\${NC}\"\n exit 1\nfi\n\necho -e \"\\${GREEN}All skills validated successfully!\\${NC}\"\nexit 0\n`;\n\n/**\n * Pre-commit config for .pre-commit-config.yaml\n */\nexport const PRE_COMMIT_CONFIG_TEMPLATE = `# SkillKit Pre-commit Configuration\n# Add this to your .pre-commit-config.yaml\n\nrepos:\n - repo: local\n hooks:\n - id: skillkit-validate\n name: SkillKit Validate\n entry: skillkit validate\n language: system\n files: \\\\.(md|mdc)$\n pass_filenames: false\n\n - id: skillkit-test\n name: SkillKit Test\n entry: skillkit test\n language: system\n files: \\\\.(md|mdc)$\n pass_filenames: false\n`;\n\n/**\n * GitLab CI template\n */\nexport const GITLAB_CI_TEMPLATE = `# SkillKit GitLab CI Configuration\n# Add this to your .gitlab-ci.yml\n\nskill-validation:\n image: node:20\n stage: test\n before_script:\n - npm install -g skillkit\n script:\n - skillkit validate\n - skillkit test --json > test-results.json\n artifacts:\n # Note: test-results.json is JSON format, not JUnit XML\n paths:\n - test-results.json\n expire_in: 30 days\n rules:\n - changes:\n - \".claude/skills/**\"\n - \".cursor/skills/**\"\n - \"skills/**\"\n`;\n\n/**\n * CircleCI config template\n */\nexport const CIRCLECI_CONFIG_TEMPLATE = `# SkillKit CircleCI Configuration\n# Add this to your .circleci/config.yml\n\nversion: 2.1\n\njobs:\n validate-skills:\n docker:\n - image: cimg/node:20.0\n steps:\n - checkout\n - run:\n name: Install SkillKit\n command: npm install -g skillkit\n - run:\n name: Validate Skills\n command: skillkit validate\n - run:\n name: Run Skill Tests\n command: skillkit test --json > test-results.json\n - store_artifacts:\n path: test-results.json\n destination: skill-tests\n\nworkflows:\n skill-validation:\n jobs:\n - validate-skills:\n filters:\n branches:\n only: /.*/\n`;\n\n/**\n * Get a CI/CD template by name\n */\nexport function getCICDTemplate(name: string): string | null {\n switch (name.toLowerCase()) {\n case 'github':\n case 'github-action':\n case 'github-actions':\n return GITHUB_ACTION_TEMPLATE;\n case 'pre-commit':\n case 'pre-commit-hook':\n return PRE_COMMIT_HOOK_TEMPLATE;\n case 'pre-commit-config':\n return PRE_COMMIT_CONFIG_TEMPLATE;\n case 'gitlab':\n case 'gitlab-ci':\n return GITLAB_CI_TEMPLATE;\n case 'circleci':\n case 'circle-ci':\n return CIRCLECI_CONFIG_TEMPLATE;\n default:\n return null;\n }\n}\n\n/**\n * List available CI/CD templates\n */\nexport function listCICDTemplates(): { name: string; description: string }[] {\n return [\n { name: 'github-action', description: 'GitHub Actions workflow for skill validation' },\n { name: 'pre-commit-hook', description: 'Git pre-commit hook script' },\n { name: 'pre-commit-config', description: 'pre-commit framework configuration' },\n { name: 'gitlab-ci', description: 'GitLab CI configuration' },\n { name: 'circleci', description: 'CircleCI configuration' },\n ];\n}\n","import type { AgentType } from '../types.js';\n\nexport type ObservationType =\n | 'tool_use'\n | 'decision'\n | 'error'\n | 'solution'\n | 'pattern'\n | 'file_change'\n | 'checkpoint';\n\nexport interface ObservationContent {\n action: string;\n context: string;\n result?: string;\n files?: string[];\n tags?: string[];\n error?: string;\n solution?: string;\n}\n\nexport interface Observation {\n id: string;\n timestamp: string;\n sessionId: string;\n agent: AgentType;\n type: ObservationType;\n content: ObservationContent;\n relevance: number;\n}\n\nexport interface Learning {\n id: string;\n createdAt: string;\n updatedAt: string;\n source: 'session' | 'manual' | 'imported';\n sourceObservations?: string[];\n\n title: string;\n content: string;\n\n scope: 'project' | 'global';\n project?: string;\n\n tags: string[];\n frameworks?: string[];\n patterns?: string[];\n\n useCount: number;\n lastUsed?: string;\n effectiveness?: number;\n}\n\nexport interface MemoryIndex {\n version: 1;\n lastUpdated: string;\n entries: Record<string, string[]>;\n tags: Record<string, string[]>;\n}\n\nexport interface MemorySummary {\n id: string;\n title: string;\n tags: string[];\n relevance: number;\n}\n\nexport interface MemoryPreview extends MemorySummary {\n excerpt: string;\n lastUsed?: string;\n}\n\nexport interface MemoryFull extends MemoryPreview {\n content: string;\n sourceObservations?: Observation[];\n}\n\nexport interface ObservationStoreData {\n version: 1;\n sessionId: string;\n observations: Observation[];\n}\n\nexport interface LearningStoreData {\n version: 1;\n learnings: Learning[];\n}\n\nexport interface MemoryConfig {\n autoCompress: boolean;\n compressionThreshold: number;\n compressionModel?: string;\n maxObservations: number;\n maxLearnings: number;\n}\n\nexport const DEFAULT_MEMORY_CONFIG: MemoryConfig = {\n autoCompress: true,\n compressionThreshold: 50,\n maxObservations: 1000,\n maxLearnings: 500,\n};\n\nexport interface MemorySearchOptions {\n query?: string;\n tags?: string[];\n scope?: 'project' | 'global' | 'all';\n limit?: number;\n minRelevance?: number;\n}\n\nexport interface MemorySearchResult {\n learning: Learning;\n score: number;\n matchedKeywords: string[];\n matchedTags: string[];\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { randomUUID } from 'node:crypto';\nimport type {\n Observation,\n ObservationContent,\n ObservationStoreData,\n ObservationType,\n} from './types.js';\nimport type { AgentType } from '../types.js';\n\nexport class ObservationStore {\n private readonly filePath: string;\n private data: ObservationStoreData | null = null;\n private sessionId: string;\n\n constructor(projectPath: string, sessionId?: string) {\n this.filePath = join(projectPath, '.skillkit', 'memory', 'observations.yaml');\n this.sessionId = sessionId || randomUUID();\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): ObservationStoreData {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as ObservationStoreData;\n if (this.data.sessionId !== this.sessionId) {\n this.data.sessionId = this.sessionId;\n this.data.observations = [];\n }\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): ObservationStoreData {\n return {\n version: 1,\n sessionId: this.sessionId,\n observations: [],\n };\n }\n\n private save(): void {\n this.ensureDir();\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n add(\n type: ObservationType,\n content: ObservationContent,\n agent: AgentType,\n relevance = 50\n ): Observation {\n const data = this.load();\n\n const observation: Observation = {\n id: randomUUID(),\n timestamp: new Date().toISOString(),\n sessionId: this.sessionId,\n agent,\n type,\n content,\n relevance,\n };\n\n data.observations.push(observation);\n this.save();\n\n return observation;\n }\n\n getAll(): Observation[] {\n return this.load().observations;\n }\n\n getByType(type: ObservationType): Observation[] {\n return this.load().observations.filter((o) => o.type === type);\n }\n\n getByRelevance(minRelevance: number): Observation[] {\n return this.load().observations.filter((o) => o.relevance >= minRelevance);\n }\n\n getRecent(count: number): Observation[] {\n const observations = this.load().observations;\n return observations.slice(-count);\n }\n\n getUncompressed(compressedIds: string[]): Observation[] {\n const compressedSet = new Set(compressedIds);\n return this.load().observations.filter((o) => !compressedSet.has(o.id));\n }\n\n count(): number {\n return this.load().observations.length;\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n getById(id: string): Observation | undefined {\n return this.load().observations.find((o) => o.id === id);\n }\n\n getByIds(ids: string[]): Observation[] {\n const idSet = new Set(ids);\n return this.load().observations.filter((o) => idSet.has(o.id));\n }\n\n getSessionId(): string {\n return this.sessionId;\n }\n\n setSessionId(sessionId: string): void {\n this.sessionId = sessionId;\n if (this.data) {\n this.data.sessionId = sessionId;\n }\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n delete(id: string): boolean {\n const data = this.load();\n const index = data.observations.findIndex((o) => o.id === id);\n\n if (index === -1) return false;\n\n data.observations.splice(index, 1);\n this.save();\n return true;\n }\n\n deleteMany(ids: string[]): number {\n const idSet = new Set(ids);\n const data = this.load();\n const initialLength = data.observations.length;\n\n data.observations = data.observations.filter((o) => !idSet.has(o.id));\n\n if (data.observations.length !== initialLength) {\n this.save();\n }\n\n return initialLength - data.observations.length;\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { randomUUID } from 'node:crypto';\nimport type { Learning, LearningStoreData } from './types.js';\n\nexport class LearningStore {\n private readonly filePath: string;\n private readonly scope: 'project' | 'global';\n private readonly projectName?: string;\n private data: LearningStoreData | null = null;\n\n constructor(\n scope: 'project' | 'global',\n projectPath?: string,\n projectName?: string\n ) {\n this.scope = scope;\n this.projectName = projectName;\n\n if (scope === 'project' && projectPath) {\n this.filePath = join(projectPath, '.skillkit', 'memory', 'learnings.yaml');\n } else {\n this.filePath = join(homedir(), '.skillkit', 'memory', 'global.yaml');\n }\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): LearningStoreData {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as LearningStoreData;\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): LearningStoreData {\n return {\n version: 1,\n learnings: [],\n };\n }\n\n private save(): void {\n this.ensureDir();\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n add(learning: Omit<Learning, 'id' | 'createdAt' | 'updatedAt' | 'useCount' | 'scope' | 'project'>): Learning {\n const data = this.load();\n const now = new Date().toISOString();\n\n const newLearning: Learning = {\n ...learning,\n id: randomUUID(),\n createdAt: now,\n updatedAt: now,\n useCount: 0,\n scope: this.scope,\n project: this.projectName,\n };\n\n data.learnings.push(newLearning);\n this.save();\n\n return newLearning;\n }\n\n update(id: string, updates: Partial<Omit<Learning, 'id' | 'createdAt'>>): Learning | null {\n const data = this.load();\n const index = data.learnings.findIndex((l) => l.id === id);\n\n if (index === -1) return null;\n\n data.learnings[index] = {\n ...data.learnings[index],\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n\n this.save();\n return data.learnings[index];\n }\n\n delete(id: string): boolean {\n const data = this.load();\n const index = data.learnings.findIndex((l) => l.id === id);\n\n if (index === -1) return false;\n\n data.learnings.splice(index, 1);\n this.save();\n return true;\n }\n\n getAll(): Learning[] {\n return this.load().learnings;\n }\n\n getById(id: string): Learning | undefined {\n return this.load().learnings.find((l) => l.id === id);\n }\n\n getByTags(tags: string[]): Learning[] {\n const tagSet = new Set(tags.map((t) => t.toLowerCase()));\n return this.load().learnings.filter((l) =>\n l.tags.some((t) => tagSet.has(t.toLowerCase()))\n );\n }\n\n getByFrameworks(frameworks: string[]): Learning[] {\n const fwSet = new Set(frameworks.map((f) => f.toLowerCase()));\n return this.load().learnings.filter((l) =>\n l.frameworks?.some((f) => fwSet.has(f.toLowerCase()))\n );\n }\n\n getRecent(count: number): Learning[] {\n const learnings = this.load().learnings;\n return [...learnings]\n .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime())\n .slice(0, count);\n }\n\n getMostUsed(count: number): Learning[] {\n const learnings = this.load().learnings;\n return [...learnings].sort((a, b) => b.useCount - a.useCount).slice(0, count);\n }\n\n getMostEffective(count: number): Learning[] {\n const learnings = this.load().learnings.filter((l) => l.effectiveness !== undefined);\n return [...learnings]\n .sort((a, b) => (b.effectiveness || 0) - (a.effectiveness || 0))\n .slice(0, count);\n }\n\n incrementUseCount(id: string): void {\n const data = this.load();\n const learning = data.learnings.find((l) => l.id === id);\n\n if (learning) {\n learning.useCount += 1;\n learning.lastUsed = new Date().toISOString();\n this.save();\n }\n }\n\n setEffectiveness(id: string, effectiveness: number): void {\n const data = this.load();\n const learning = data.learnings.find((l) => l.id === id);\n\n if (learning) {\n learning.effectiveness = Math.max(0, Math.min(100, effectiveness));\n learning.updatedAt = new Date().toISOString();\n this.save();\n }\n }\n\n search(query: string): Learning[] {\n const queryLower = query.toLowerCase();\n const queryWords = queryLower.split(/\\s+/).filter((w) => w.length > 2);\n\n return this.load().learnings.filter((l) => {\n const titleMatch = l.title.toLowerCase().includes(queryLower);\n const contentMatch = l.content.toLowerCase().includes(queryLower);\n const tagMatch = l.tags.some((t) => t.toLowerCase().includes(queryLower));\n const wordMatch = queryWords.some(\n (word) =>\n l.title.toLowerCase().includes(word) ||\n l.content.toLowerCase().includes(word)\n );\n\n return titleMatch || contentMatch || tagMatch || wordMatch;\n });\n }\n\n count(): number {\n return this.load().learnings.length;\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n getScope(): 'project' | 'global' {\n return this.scope;\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport type { Learning, MemoryIndex } from './types.js';\n\nexport class MemoryIndexStore {\n private readonly filePath: string;\n private data: MemoryIndex | null = null;\n\n constructor(basePath: string, _isGlobal = false) {\n // Both global and project use .skillkit subdirectory\n // Global: ~/.skillkit/memory/index.yaml (basePath = homedir())\n // Project: <projectPath>/.skillkit/memory/index.yaml (basePath = projectPath)\n // Note: _isGlobal kept for API compatibility but basePath determines the actual path\n this.filePath = join(basePath, '.skillkit', 'memory', 'index.yaml');\n }\n\n private ensureDir(): void {\n const dir = dirname(this.filePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n }\n\n private load(): MemoryIndex {\n if (this.data) return this.data;\n\n if (existsSync(this.filePath)) {\n try {\n const content = readFileSync(this.filePath, 'utf-8');\n this.data = parseYaml(content) as MemoryIndex;\n } catch {\n this.data = this.createEmpty();\n }\n } else {\n this.data = this.createEmpty();\n }\n\n return this.data;\n }\n\n private createEmpty(): MemoryIndex {\n return {\n version: 1,\n lastUpdated: new Date().toISOString(),\n entries: {},\n tags: {},\n };\n }\n\n private save(): void {\n this.ensureDir();\n if (this.data) {\n this.data.lastUpdated = new Date().toISOString();\n }\n const content = stringifyYaml(this.data, { lineWidth: 0 });\n writeFileSync(this.filePath, content, 'utf-8');\n }\n\n private extractKeywords(text: string): string[] {\n // Extract meaningful keywords from text\n const stopWords = new Set([\n 'a', 'an', 'the', 'and', 'or', 'but', 'in', 'on', 'at', 'to', 'for',\n 'of', 'with', 'by', 'from', 'is', 'are', 'was', 'were', 'be', 'been',\n 'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would',\n 'could', 'should', 'may', 'might', 'must', 'can', 'this', 'that',\n 'these', 'those', 'it', 'its', 'i', 'you', 'we', 'they', 'he', 'she',\n ]);\n\n const words = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s-]/g, ' ')\n .split(/\\s+/)\n .filter((word) => word.length > 2 && !stopWords.has(word));\n\n return [...new Set(words)];\n }\n\n indexLearning(learning: Learning): void {\n const data = this.load();\n\n // Extract keywords from title and content\n const titleKeywords = this.extractKeywords(learning.title);\n const contentKeywords = this.extractKeywords(learning.content);\n const allKeywords = [...new Set([...titleKeywords, ...contentKeywords])];\n\n // Index by keywords\n for (const keyword of allKeywords) {\n if (!data.entries[keyword]) {\n data.entries[keyword] = [];\n }\n if (!data.entries[keyword].includes(learning.id)) {\n data.entries[keyword].push(learning.id);\n }\n }\n\n // Index by tags\n for (const tag of learning.tags) {\n const normalizedTag = tag.toLowerCase();\n if (!data.tags[normalizedTag]) {\n data.tags[normalizedTag] = [];\n }\n if (!data.tags[normalizedTag].includes(learning.id)) {\n data.tags[normalizedTag].push(learning.id);\n }\n }\n\n // Index by frameworks if present\n if (learning.frameworks) {\n for (const framework of learning.frameworks) {\n const normalizedFw = framework.toLowerCase();\n if (!data.tags[normalizedFw]) {\n data.tags[normalizedFw] = [];\n }\n if (!data.tags[normalizedFw].includes(learning.id)) {\n data.tags[normalizedFw].push(learning.id);\n }\n }\n }\n\n this.save();\n }\n\n removeLearning(learningId: string): void {\n const data = this.load();\n\n // Remove from keyword entries\n for (const keyword of Object.keys(data.entries)) {\n data.entries[keyword] = data.entries[keyword].filter((id) => id !== learningId);\n if (data.entries[keyword].length === 0) {\n delete data.entries[keyword];\n }\n }\n\n // Remove from tags\n for (const tag of Object.keys(data.tags)) {\n data.tags[tag] = data.tags[tag].filter((id) => id !== learningId);\n if (data.tags[tag].length === 0) {\n delete data.tags[tag];\n }\n }\n\n this.save();\n }\n\n searchByKeywords(query: string): string[] {\n const data = this.load();\n const keywords = this.extractKeywords(query);\n\n if (keywords.length === 0) return [];\n\n // Find IDs that match any keyword\n const matchCounts = new Map<string, number>();\n\n for (const keyword of keywords) {\n // Exact match\n if (data.entries[keyword]) {\n for (const id of data.entries[keyword]) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 2);\n }\n }\n\n // Partial match (keyword is substring of indexed word, but not exact match)\n for (const [indexed, ids] of Object.entries(data.entries)) {\n // Skip exact matches - they're already counted above with higher weight\n if (indexed === keyword) continue;\n if (indexed.includes(keyword) || keyword.includes(indexed)) {\n for (const id of ids) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 1);\n }\n }\n }\n }\n\n // Sort by match count (most matches first)\n return [...matchCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([id]) => id);\n }\n\n searchByTags(tags: string[]): string[] {\n const data = this.load();\n const normalizedTags = tags.map((t) => t.toLowerCase());\n\n const matchCounts = new Map<string, number>();\n\n for (const tag of normalizedTags) {\n if (data.tags[tag]) {\n for (const id of data.tags[tag]) {\n matchCounts.set(id, (matchCounts.get(id) || 0) + 1);\n }\n }\n }\n\n // Sort by match count\n return [...matchCounts.entries()]\n .sort((a, b) => b[1] - a[1])\n .map(([id]) => id);\n }\n\n search(query: string, tags?: string[]): string[] {\n const keywordResults = this.searchByKeywords(query);\n const tagResults = tags ? this.searchByTags(tags) : [];\n\n if (!tags || tags.length === 0) {\n return keywordResults;\n }\n\n if (!query || query.trim().length === 0) {\n return tagResults;\n }\n\n // Combine results, prioritizing items that match both\n const keywordSet = new Set(keywordResults);\n const tagSet = new Set(tagResults);\n\n const both: string[] = [];\n const keywordOnly: string[] = [];\n const tagOnly: string[] = [];\n\n for (const id of keywordResults) {\n if (tagSet.has(id)) {\n both.push(id);\n } else {\n keywordOnly.push(id);\n }\n }\n\n for (const id of tagResults) {\n if (!keywordSet.has(id)) {\n tagOnly.push(id);\n }\n }\n\n return [...both, ...keywordOnly, ...tagOnly];\n }\n\n getAllTags(): string[] {\n const data = this.load();\n return Object.keys(data.tags).sort();\n }\n\n getTagCounts(): Record<string, number> {\n const data = this.load();\n const counts: Record<string, number> = {};\n for (const [tag, ids] of Object.entries(data.tags)) {\n counts[tag] = ids.length;\n }\n return counts;\n }\n\n rebuildIndex(learnings: Learning[]): void {\n // Clear existing index\n this.data = this.createEmpty();\n\n // Re-index all learnings\n for (const learning of learnings) {\n this.indexLearning(learning);\n }\n\n this.save();\n }\n\n clear(): void {\n this.data = this.createEmpty();\n this.save();\n }\n\n exists(): boolean {\n return existsSync(this.filePath);\n }\n\n getStats(): { keywords: number; tags: number; lastUpdated: string } {\n const data = this.load();\n return {\n keywords: Object.keys(data.entries).length,\n tags: Object.keys(data.tags).length,\n lastUpdated: data.lastUpdated,\n };\n }\n}\n","import { existsSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nexport interface MemoryPaths {\n projectMemoryDir: string;\n globalMemoryDir: string;\n observationsFile: string;\n learningsFile: string;\n indexFile: string;\n globalLearningsFile: string;\n globalIndexFile: string;\n}\n\nexport function getMemoryPaths(projectPath: string): MemoryPaths {\n const projectMemoryDir = join(projectPath, '.skillkit', 'memory');\n const globalMemoryDir = join(homedir(), '.skillkit', 'memory');\n\n return {\n projectMemoryDir,\n globalMemoryDir,\n observationsFile: join(projectMemoryDir, 'observations.yaml'),\n learningsFile: join(projectMemoryDir, 'learnings.yaml'),\n indexFile: join(projectMemoryDir, 'index.yaml'),\n globalLearningsFile: join(globalMemoryDir, 'global.yaml'),\n globalIndexFile: join(globalMemoryDir, 'index.yaml'),\n };\n}\n\nexport function initializeMemoryDirectory(projectPath: string): MemoryPaths {\n const paths = getMemoryPaths(projectPath);\n\n // Create project memory directory\n if (!existsSync(paths.projectMemoryDir)) {\n mkdirSync(paths.projectMemoryDir, { recursive: true });\n }\n\n // Create global memory directory\n if (!existsSync(paths.globalMemoryDir)) {\n mkdirSync(paths.globalMemoryDir, { recursive: true });\n }\n\n return paths;\n}\n\nexport function memoryDirectoryExists(projectPath: string): boolean {\n const paths = getMemoryPaths(projectPath);\n return existsSync(paths.projectMemoryDir);\n}\n\nexport function globalMemoryDirectoryExists(): boolean {\n const globalMemoryDir = join(homedir(), '.skillkit', 'memory');\n return existsSync(globalMemoryDir);\n}\n\nexport interface MemoryStatus {\n projectMemoryExists: boolean;\n globalMemoryExists: boolean;\n hasObservations: boolean;\n hasLearnings: boolean;\n hasGlobalLearnings: boolean;\n hasIndex: boolean;\n hasGlobalIndex: boolean;\n}\n\nexport function getMemoryStatus(projectPath: string): MemoryStatus {\n const paths = getMemoryPaths(projectPath);\n\n return {\n projectMemoryExists: existsSync(paths.projectMemoryDir),\n globalMemoryExists: existsSync(paths.globalMemoryDir),\n hasObservations: existsSync(paths.observationsFile),\n hasLearnings: existsSync(paths.learningsFile),\n hasGlobalLearnings: existsSync(paths.globalLearningsFile),\n hasIndex: existsSync(paths.indexFile),\n hasGlobalIndex: existsSync(paths.globalIndexFile),\n };\n}\n","/**\n * Memory Observer\n *\n * Captures observations during skill execution and stores them in the ObservationStore.\n * Provides intelligent filtering to capture only significant events.\n */\n\nimport type { AgentType } from '../types.js';\nimport type { ExecutionProgressEvent } from '../executor/engine.js';\nimport type { ObservationType, ObservationContent, Observation } from './types.js';\nimport { ObservationStore } from './observation-store.js';\n\n/**\n * Event types that can be observed\n */\nexport type ObservableEventType =\n | 'task_start'\n | 'task_complete'\n | 'task_failed'\n | 'checkpoint_reached'\n | 'checkpoint_decision'\n | 'verification_passed'\n | 'verification_failed'\n | 'file_modified'\n | 'error_encountered'\n | 'solution_applied'\n | 'execution_start'\n | 'execution_complete'\n | 'execution_paused';\n\n/**\n * Observable event structure\n */\nexport interface ObservableEvent {\n type: ObservableEventType;\n timestamp: string;\n skillName?: string;\n taskId?: string;\n taskName?: string;\n taskAction?: string;\n files?: string[];\n error?: string;\n output?: string;\n decision?: string;\n context?: string;\n}\n\n/**\n * Observer configuration\n */\nexport interface MemoryObserverConfig {\n /** Minimum relevance score to store (0-100) */\n minRelevance?: number;\n /** Whether to capture task starts */\n captureTaskStarts?: boolean;\n /** Whether to capture checkpoints */\n captureCheckpoints?: boolean;\n /** Whether to capture file modifications */\n captureFileModifications?: boolean;\n /** Whether to capture errors */\n captureErrors?: boolean;\n /** Whether to capture solutions */\n captureSolutions?: boolean;\n /** Custom relevance scorer */\n relevanceScorer?: (event: ObservableEvent) => number;\n}\n\nconst DEFAULT_CONFIG: Required<Omit<MemoryObserverConfig, 'relevanceScorer'>> = {\n minRelevance: 30,\n captureTaskStarts: false, // Task starts are usually low-value\n captureCheckpoints: true,\n captureFileModifications: true,\n captureErrors: true,\n captureSolutions: true,\n};\n\n/**\n * Memory Observer\n *\n * Captures and filters observations during skill execution.\n */\nexport class MemoryObserver {\n private store: ObservationStore;\n private config: Required<Omit<MemoryObserverConfig, 'relevanceScorer'>> & {\n relevanceScorer?: (event: ObservableEvent) => number;\n };\n private currentAgent: AgentType = 'claude-code';\n private currentSkillName?: string;\n private pendingErrors: Map<string, ObservableEvent> = new Map();\n\n constructor(projectPath: string, sessionId?: string, config?: MemoryObserverConfig) {\n this.store = new ObservationStore(projectPath, sessionId);\n this.config = { ...DEFAULT_CONFIG, ...config };\n }\n\n /**\n * Set the current agent being used\n */\n setAgent(agent: AgentType): void {\n this.currentAgent = agent;\n }\n\n /**\n * Set the current skill being executed\n */\n setSkillName(skillName: string): void {\n this.currentSkillName = skillName;\n }\n\n /**\n * Get the underlying observation store\n */\n getStore(): ObservationStore {\n return this.store;\n }\n\n /**\n * Observe an event and potentially store it\n */\n observe(event: ObservableEvent): Observation | null {\n // Check if we should capture this event type\n if (!this.shouldCapture(event)) {\n return null;\n }\n\n // Classify the event into an observation type\n const observationType = this.classifyEvent(event);\n\n // Extract content from the event\n const content = this.extractContent(event);\n\n // Score relevance\n const relevance = this.scoreRelevance(event);\n\n // Check minimum relevance threshold\n if (relevance < this.config.minRelevance) {\n return null;\n }\n\n // Store the observation\n return this.store.add(observationType, content, this.currentAgent, relevance);\n }\n\n /**\n * Create an observation callback for the SkillExecutionEngine\n */\n createProgressCallback(): (event: ExecutionProgressEvent) => void {\n return (progressEvent: ExecutionProgressEvent) => {\n const observableEvent = this.convertProgressEvent(progressEvent);\n if (observableEvent) {\n this.observe(observableEvent);\n }\n };\n }\n\n /**\n * Convert ExecutionProgressEvent to ObservableEvent\n */\n private convertProgressEvent(event: ExecutionProgressEvent): ObservableEvent | null {\n const baseEvent = {\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n taskId: event.taskId,\n taskName: event.taskName,\n };\n\n switch (event.type) {\n case 'task_start':\n return {\n ...baseEvent,\n type: 'task_start',\n context: `Starting task ${event.taskIndex !== undefined ? event.taskIndex + 1 : ''} of ${event.totalTasks || '?'}`,\n };\n\n case 'task_complete':\n if (event.status === 'failed') {\n return {\n ...baseEvent,\n type: 'task_failed',\n error: event.error,\n context: event.message,\n };\n }\n return {\n ...baseEvent,\n type: 'task_complete',\n output: event.message,\n context: `Completed task ${event.taskIndex !== undefined ? event.taskIndex + 1 : ''} of ${event.totalTasks || '?'}`,\n };\n\n case 'checkpoint':\n return {\n ...baseEvent,\n type: 'checkpoint_reached',\n context: event.message,\n };\n\n case 'verification':\n const passed = event.message?.includes('passed');\n return {\n ...baseEvent,\n type: passed ? 'verification_passed' : 'verification_failed',\n context: event.message,\n error: passed ? undefined : event.message,\n };\n\n case 'complete':\n return {\n ...baseEvent,\n type: 'execution_complete',\n context: event.message,\n error: event.status === 'failed' ? event.message : undefined,\n };\n\n default:\n return null;\n }\n }\n\n /**\n * Record a file modification event\n */\n recordFileModification(files: string[], context: string): Observation | null {\n return this.observe({\n type: 'file_modified',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n files,\n context,\n });\n }\n\n /**\n * Record an error event\n */\n recordError(error: string, context: string, taskId?: string): Observation | null {\n const event: ObservableEvent = {\n type: 'error_encountered',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n taskId,\n error,\n context,\n };\n\n // Store pending error for potential solution matching\n const errorKey = this.generateErrorKey(error);\n this.pendingErrors.set(errorKey, event);\n\n return this.observe(event);\n }\n\n /**\n * Record a solution event (potentially matching a previous error)\n */\n recordSolution(solution: string, context: string, relatedError?: string): Observation | null {\n const event: ObservableEvent = {\n type: 'solution_applied',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n output: solution,\n context,\n error: relatedError,\n };\n\n // If we can match this to a pending error, increase relevance\n if (relatedError) {\n const errorKey = this.generateErrorKey(relatedError);\n this.pendingErrors.delete(errorKey);\n }\n\n return this.observe(event);\n }\n\n /**\n * Record a decision event\n */\n recordDecision(decision: string, options: string[], context: string): Observation | null {\n return this.observe({\n type: 'checkpoint_decision',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n decision,\n context: `Decision: ${decision} (options: ${options.join(', ')}). Context: ${context}`,\n });\n }\n\n /**\n * Record execution start\n */\n recordExecutionStart(skillName: string, agent: AgentType): Observation | null {\n this.currentSkillName = skillName;\n this.currentAgent = agent;\n\n return this.observe({\n type: 'execution_start',\n timestamp: new Date().toISOString(),\n skillName,\n context: `Started execution of skill \"${skillName}\" with agent \"${agent}\"`,\n });\n }\n\n /**\n * Record execution pause\n */\n recordExecutionPause(reason?: string): Observation | null {\n return this.observe({\n type: 'execution_paused',\n timestamp: new Date().toISOString(),\n skillName: this.currentSkillName,\n context: reason || 'Execution paused',\n });\n }\n\n /**\n * Check if we should capture this event type\n */\n private shouldCapture(event: ObservableEvent): boolean {\n switch (event.type) {\n case 'task_start':\n return this.config.captureTaskStarts;\n case 'checkpoint_reached':\n case 'checkpoint_decision':\n return this.config.captureCheckpoints;\n case 'file_modified':\n return this.config.captureFileModifications;\n case 'error_encountered':\n case 'task_failed':\n case 'verification_failed':\n return this.config.captureErrors;\n case 'solution_applied':\n return this.config.captureSolutions;\n default:\n return true;\n }\n }\n\n /**\n * Classify event into observation type\n */\n private classifyEvent(event: ObservableEvent): ObservationType {\n switch (event.type) {\n case 'error_encountered':\n case 'task_failed':\n case 'verification_failed':\n return 'error';\n\n case 'solution_applied':\n return 'solution';\n\n case 'checkpoint_decision':\n return 'decision';\n\n case 'file_modified':\n return 'file_change';\n\n case 'execution_paused':\n case 'checkpoint_reached':\n return 'checkpoint';\n\n case 'task_start':\n case 'task_complete':\n case 'verification_passed':\n case 'execution_start':\n case 'execution_complete':\n default:\n return 'tool_use';\n }\n }\n\n /**\n * Extract content from event\n */\n private extractContent(event: ObservableEvent): ObservationContent {\n const content: ObservationContent = {\n action: this.getActionDescription(event),\n context: event.context || this.generateContext(event),\n };\n\n if (event.output) {\n content.result = event.output;\n }\n\n if (event.files && event.files.length > 0) {\n content.files = event.files;\n }\n\n if (event.error) {\n content.error = event.error;\n }\n\n if (event.type === 'solution_applied' && event.output) {\n content.solution = event.output;\n }\n\n // Generate tags based on event\n content.tags = this.generateTags(event);\n\n return content;\n }\n\n /**\n * Get action description from event\n */\n private getActionDescription(event: ObservableEvent): string {\n switch (event.type) {\n case 'task_start':\n return `Started task: ${event.taskName || 'unknown'}`;\n case 'task_complete':\n return `Completed task: ${event.taskName || 'unknown'}`;\n case 'task_failed':\n return `Task failed: ${event.taskName || 'unknown'}`;\n case 'checkpoint_reached':\n return `Checkpoint: ${event.taskName || 'unknown'}`;\n case 'checkpoint_decision':\n return `Decision made: ${event.decision || 'unknown'}`;\n case 'verification_passed':\n return `Verification passed: ${event.taskName || 'unknown'}`;\n case 'verification_failed':\n return `Verification failed: ${event.taskName || 'unknown'}`;\n case 'file_modified':\n return `Modified files: ${event.files?.join(', ') || 'unknown'}`;\n case 'error_encountered':\n return `Error: ${event.error?.slice(0, 100) || 'unknown'}`;\n case 'solution_applied':\n return `Solution applied: ${event.output?.slice(0, 100) || 'unknown'}`;\n case 'execution_start':\n return `Started skill: ${event.skillName || 'unknown'}`;\n case 'execution_complete':\n return `Completed skill: ${event.skillName || 'unknown'}`;\n case 'execution_paused':\n return `Paused skill: ${event.skillName || 'unknown'}`;\n default:\n return 'Unknown action';\n }\n }\n\n /**\n * Generate context if not provided\n */\n private generateContext(event: ObservableEvent): string {\n const parts: string[] = [];\n\n if (event.skillName) {\n parts.push(`Skill: ${event.skillName}`);\n }\n\n if (event.taskName) {\n parts.push(`Task: ${event.taskName}`);\n }\n\n if (event.taskAction) {\n parts.push(`Action: ${event.taskAction}`);\n }\n\n return parts.join(' | ') || 'No context available';\n }\n\n /**\n * Generate tags for event\n */\n private generateTags(event: ObservableEvent): string[] {\n const tags: string[] = [];\n\n // Add event type as tag\n tags.push(event.type.replace(/_/g, '-'));\n\n // Add skill name if present\n if (event.skillName) {\n tags.push(event.skillName.toLowerCase().replace(/[^a-z0-9-]/g, '-'));\n }\n\n // Add error-related tags\n if (event.error) {\n if (event.error.toLowerCase().includes('type')) tags.push('typescript');\n if (event.error.toLowerCase().includes('import')) tags.push('imports');\n if (event.error.toLowerCase().includes('null') || event.error.toLowerCase().includes('undefined'))\n tags.push('null-check');\n if (event.error.toLowerCase().includes('async') || event.error.toLowerCase().includes('await'))\n tags.push('async');\n }\n\n // Add file-related tags\n if (event.files) {\n for (const file of event.files) {\n if (file.endsWith('.ts') || file.endsWith('.tsx')) tags.push('typescript');\n if (file.endsWith('.js') || file.endsWith('.jsx')) tags.push('javascript');\n if (file.endsWith('.css') || file.endsWith('.scss')) tags.push('styles');\n if (file.includes('test') || file.includes('spec')) tags.push('testing');\n if (file.includes('component')) tags.push('components');\n }\n }\n\n return [...new Set(tags)];\n }\n\n /**\n * Score relevance of event\n */\n private scoreRelevance(event: ObservableEvent): number {\n // Use custom scorer if provided\n if (this.config.relevanceScorer) {\n return this.config.relevanceScorer(event);\n }\n\n // Default relevance scoring\n let score = 50; // Base score\n\n switch (event.type) {\n // High relevance events\n case 'error_encountered':\n case 'task_failed':\n score = 85;\n break;\n\n case 'solution_applied':\n score = 90;\n // Bonus if it matches a pending error\n if (event.error) {\n const errorKey = this.generateErrorKey(event.error);\n if (this.pendingErrors.has(errorKey)) {\n score = 95;\n }\n }\n break;\n\n case 'checkpoint_decision':\n score = 75;\n break;\n\n case 'verification_failed':\n score = 80;\n break;\n\n // Medium relevance events\n case 'file_modified':\n score = 60;\n // More files = higher relevance\n if (event.files && event.files.length > 3) {\n score = 70;\n }\n break;\n\n case 'checkpoint_reached':\n score = 55;\n break;\n\n case 'task_complete':\n case 'verification_passed':\n score = 50;\n break;\n\n // Lower relevance events\n case 'task_start':\n score = 30;\n break;\n\n case 'execution_start':\n case 'execution_complete':\n score = 40;\n break;\n\n case 'execution_paused':\n score = 60;\n break;\n\n default:\n score = 50;\n }\n\n // Adjust based on content richness\n if (event.context && event.context.length > 100) {\n score += 5;\n }\n\n if (event.files && event.files.length > 0) {\n score += 5;\n }\n\n // Cap at 100\n return Math.min(score, 100);\n }\n\n /**\n * Generate a key for matching errors to solutions\n */\n private generateErrorKey(error: string): string {\n // Normalize error string for matching\n return error\n .toLowerCase()\n .replace(/[0-9]+/g, 'N') // Replace numbers\n .replace(/['\"`]/g, '') // Remove quotes\n .replace(/\\s+/g, ' ') // Normalize whitespace\n .slice(0, 100); // Limit length\n }\n\n /**\n * Get session ID\n */\n getSessionId(): string {\n return this.store.getSessionId();\n }\n\n /**\n * Get all observations\n */\n getObservations(): Observation[] {\n return this.store.getAll();\n }\n\n /**\n * Get observation count\n */\n getObservationCount(): number {\n return this.store.count();\n }\n\n /**\n * Clear all observations\n */\n clear(): void {\n this.store.clear();\n this.pendingErrors.clear();\n }\n}\n\n/**\n * Create a MemoryObserver instance\n */\nexport function createMemoryObserver(\n projectPath: string,\n sessionId?: string,\n config?: MemoryObserverConfig\n): MemoryObserver {\n return new MemoryObserver(projectPath, sessionId, config);\n}\n","/**\n * Memory-Enabled Execution Engine Integration\n *\n * Provides utilities to integrate MemoryObserver with SkillExecutionEngine.\n */\n\nimport type { AgentType } from '../types.js';\nimport {\n SkillExecutionEngine,\n createExecutionEngine,\n type ExecutionProgressCallback,\n type ExecutionProgressEvent,\n} from '../executor/engine.js';\nimport type { CheckpointHandler, ExecutionOptions, ExecutableSkill } from '../executor/types.js';\nimport { MemoryObserver, type MemoryObserverConfig } from './observer.js';\n\n/**\n * Options for creating a memory-enabled execution engine\n */\nexport interface MemoryEnabledEngineOptions {\n /** Checkpoint handler for interactive checkpoints */\n checkpointHandler?: CheckpointHandler;\n /** Additional progress callback (called alongside memory observer) */\n onProgress?: ExecutionProgressCallback;\n /** Memory observer configuration */\n memoryConfig?: MemoryObserverConfig;\n /** Session ID for the memory observer */\n sessionId?: string;\n /** Default agent type */\n defaultAgent?: AgentType;\n}\n\n/**\n * Memory-enabled execution engine wrapper\n */\nexport class MemoryEnabledEngine {\n private engine: SkillExecutionEngine;\n private observer: MemoryObserver;\n private userProgressCallback?: ExecutionProgressCallback;\n\n constructor(projectPath: string, options: MemoryEnabledEngineOptions = {}) {\n // Create memory observer\n this.observer = new MemoryObserver(projectPath, options.sessionId, options.memoryConfig);\n\n // Set default agent if provided\n if (options.defaultAgent) {\n this.observer.setAgent(options.defaultAgent);\n }\n\n // Store user's progress callback\n this.userProgressCallback = options.onProgress;\n\n // Create the combined progress callback\n const combinedProgressCallback: ExecutionProgressCallback = (event: ExecutionProgressEvent) => {\n // Forward to memory observer\n const observerCallback = this.observer.createProgressCallback();\n observerCallback(event);\n\n // Forward to user's callback if provided\n if (this.userProgressCallback) {\n this.userProgressCallback(event);\n }\n };\n\n // Create the underlying engine with the combined callback\n this.engine = createExecutionEngine(projectPath, {\n checkpointHandler: options.checkpointHandler,\n onProgress: combinedProgressCallback,\n });\n }\n\n /**\n * Execute a skill with memory observation\n */\n async execute(\n skill: ExecutableSkill,\n options: ExecutionOptions = {}\n ): ReturnType<SkillExecutionEngine['execute']> {\n // Set skill name in observer\n this.observer.setSkillName(skill.name);\n\n // Set agent if provided in options\n if (options.agent) {\n this.observer.setAgent(options.agent);\n }\n\n // Record execution start\n this.observer.recordExecutionStart(skill.name, options.agent || 'claude-code');\n\n try {\n // Execute the skill\n const result = await this.engine.execute(skill, options);\n\n // Record file modifications from result\n if (result.filesModified.length > 0) {\n this.observer.recordFileModification(\n result.filesModified,\n `Files modified during skill \"${skill.name}\" execution`\n );\n }\n\n // Record any errors\n if (result.error) {\n this.observer.recordError(result.error, `Skill \"${skill.name}\" failed`);\n }\n\n return result;\n } catch (error) {\n // Record unexpected errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n this.observer.recordError(errorMessage, `Unexpected error during skill \"${skill.name}\" execution`);\n throw error;\n }\n }\n\n /**\n * Record a manual error observation\n */\n recordError(error: string, context: string, taskId?: string): void {\n this.observer.recordError(error, context, taskId);\n }\n\n /**\n * Record a manual solution observation\n */\n recordSolution(solution: string, context: string, relatedError?: string): void {\n this.observer.recordSolution(solution, context, relatedError);\n }\n\n /**\n * Record a file modification observation\n */\n recordFileModification(files: string[], context: string): void {\n this.observer.recordFileModification(files, context);\n }\n\n /**\n * Record a decision observation\n */\n recordDecision(decision: string, options: string[], context: string): void {\n this.observer.recordDecision(decision, options, context);\n }\n\n /**\n * Pause execution\n */\n pause(): boolean {\n const paused = this.engine.pause();\n if (paused) {\n this.observer.recordExecutionPause();\n }\n return paused;\n }\n\n /**\n * Check if execution is paused\n */\n isPaused(): boolean {\n return this.engine.isPaused();\n }\n\n /**\n * Get the memory observer\n */\n getObserver(): MemoryObserver {\n return this.observer;\n }\n\n /**\n * Get the underlying execution engine\n */\n getEngine(): SkillExecutionEngine {\n return this.engine;\n }\n\n /**\n * Get the session manager\n */\n getSessionManager(): ReturnType<SkillExecutionEngine['getSessionManager']> {\n return this.engine.getSessionManager();\n }\n\n /**\n * Get observation count\n */\n getObservationCount(): number {\n return this.observer.getObservationCount();\n }\n\n /**\n * Get all observations\n */\n getObservations(): ReturnType<MemoryObserver['getObservations']> {\n return this.observer.getObservations();\n }\n\n /**\n * Clear observations\n */\n clearObservations(): void {\n this.observer.clear();\n }\n}\n\n/**\n * Create a memory-enabled execution engine\n */\nexport function createMemoryEnabledEngine(\n projectPath: string,\n options?: MemoryEnabledEngineOptions\n): MemoryEnabledEngine {\n return new MemoryEnabledEngine(projectPath, options);\n}\n\n/**\n * Wrap an existing progress callback with memory observation\n */\nexport function wrapProgressCallbackWithMemory(\n projectPath: string,\n existingCallback?: ExecutionProgressCallback,\n memoryConfig?: MemoryObserverConfig,\n sessionId?: string\n): { callback: ExecutionProgressCallback; observer: MemoryObserver } {\n const observer = new MemoryObserver(projectPath, sessionId, memoryConfig);\n const observerCallback = observer.createProgressCallback();\n\n const wrappedCallback: ExecutionProgressCallback = (event: ExecutionProgressEvent) => {\n observerCallback(event);\n if (existingCallback) {\n existingCallback(event);\n }\n };\n\n return { callback: wrappedCallback, observer };\n}\n","/**\n * Memory Compression Engine\n *\n * Compresses raw observations into learnings using either rule-based\n * extraction or AI-powered compression.\n */\n\nimport { homedir } from 'node:os';\nimport type { Observation, Learning, ObservationType } from './types.js';\nimport { LearningStore } from './learning-store.js';\nimport { MemoryIndexStore } from './memory-index.js';\n\n/**\n * Compression result for a single learning\n */\nexport interface CompressedLearning {\n title: string;\n content: string;\n tags: string[];\n frameworks?: string[];\n patterns?: string[];\n importance: number; // 1-10\n sourceObservationIds: string[];\n}\n\n/**\n * Compression result\n */\nexport interface CompressionResult {\n learnings: CompressedLearning[];\n processedObservationIds: string[];\n skippedObservationIds: string[];\n stats: {\n inputCount: number;\n outputCount: number;\n compressionRatio: number;\n };\n}\n\n/**\n * Compression options\n */\nexport interface CompressionOptions {\n /** Minimum observations to trigger compression */\n minObservations?: number;\n /** Maximum learnings to generate per compression */\n maxLearnings?: number;\n /** Minimum importance score (1-10) to keep a learning */\n minImportance?: number;\n /** Whether to include low-relevance observations */\n includeLowRelevance?: boolean;\n /** Custom tags to add to all learnings */\n additionalTags?: string[];\n /** Project name for context */\n projectName?: string;\n}\n\nconst DEFAULT_COMPRESSION_OPTIONS: Required<CompressionOptions> = {\n minObservations: 3,\n maxLearnings: 10,\n minImportance: 4,\n includeLowRelevance: false,\n additionalTags: [],\n projectName: '',\n};\n\n/**\n * Compression engine interface\n */\nexport interface CompressionEngine {\n /**\n * Compress observations into learnings\n */\n compress(observations: Observation[], options?: CompressionOptions): Promise<CompressionResult>;\n\n /**\n * Get the engine type\n */\n getType(): 'rule-based' | 'api';\n}\n\n/**\n * Rule-based compression engine\n *\n * Uses heuristics and patterns to extract learnings without AI.\n */\nexport class RuleBasedCompressor implements CompressionEngine {\n getType(): 'rule-based' | 'api' {\n return 'rule-based';\n }\n\n async compress(\n observations: Observation[],\n options: CompressionOptions = {}\n ): Promise<CompressionResult> {\n const opts = { ...DEFAULT_COMPRESSION_OPTIONS, ...options };\n\n // Filter observations\n const filtered = opts.includeLowRelevance\n ? observations\n : observations.filter((o) => o.relevance >= 50);\n\n if (filtered.length < opts.minObservations) {\n return {\n learnings: [],\n processedObservationIds: [],\n skippedObservationIds: observations.map((o) => o.id),\n stats: {\n inputCount: observations.length,\n outputCount: 0,\n compressionRatio: 0,\n },\n };\n }\n\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Group observations by type\n const byType = this.groupByType(filtered);\n\n // Extract error-solution pairs\n const errorSolutionLearnings = this.extractErrorSolutionPairs(byType, opts);\n learnings.push(...errorSolutionLearnings.learnings);\n processedIds.push(...errorSolutionLearnings.processedIds);\n\n // Extract decision patterns\n const decisionLearnings = this.extractDecisionPatterns(byType, opts);\n learnings.push(...decisionLearnings.learnings);\n processedIds.push(...decisionLearnings.processedIds);\n\n // Extract file change patterns\n const fileChangeLearnings = this.extractFileChangePatterns(byType, opts);\n learnings.push(...fileChangeLearnings.learnings);\n processedIds.push(...fileChangeLearnings.processedIds);\n\n // Extract tool usage patterns\n const toolUsageLearnings = this.extractToolUsagePatterns(byType, opts);\n learnings.push(...toolUsageLearnings.learnings);\n processedIds.push(...toolUsageLearnings.processedIds);\n\n // Filter by importance and limit\n const finalLearnings = learnings\n .filter((l) => l.importance >= opts.minImportance)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, opts.maxLearnings);\n\n // Add additional tags\n if (opts.additionalTags.length > 0) {\n for (const learning of finalLearnings) {\n learning.tags = [...new Set([...learning.tags, ...opts.additionalTags])];\n }\n }\n\n const skippedIds = observations\n .map((o) => o.id)\n .filter((id) => !processedIds.includes(id));\n\n return {\n learnings: finalLearnings,\n processedObservationIds: processedIds,\n skippedObservationIds: skippedIds,\n stats: {\n inputCount: observations.length,\n outputCount: finalLearnings.length,\n compressionRatio: observations.length > 0 ? finalLearnings.length / observations.length : 0,\n },\n };\n }\n\n private groupByType(observations: Observation[]): Map<ObservationType, Observation[]> {\n const groups = new Map<ObservationType, Observation[]>();\n for (const obs of observations) {\n const existing = groups.get(obs.type) || [];\n existing.push(obs);\n groups.set(obs.type, existing);\n }\n return groups;\n }\n\n private extractErrorSolutionPairs(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const errors = byType.get('error') || [];\n const solutions = byType.get('solution') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Match errors with solutions\n for (const error of errors) {\n const errorText = error.content.error || error.content.action;\n const matchingSolution = solutions.find((s) => {\n const solutionContext = s.content.context?.toLowerCase() || '';\n const solutionAction = s.content.action?.toLowerCase() || '';\n const errorLower = errorText.toLowerCase();\n\n // Require keyword similarity between error and solution\n const hasKeywordMatch = this.hasSimilarKeywords(errorLower, solutionContext) ||\n this.hasSimilarKeywords(errorLower, solutionAction);\n if (!hasKeywordMatch) {\n return false;\n }\n\n // Solution should indicate it's a fix/resolution, or have strong keyword overlap\n const isSolutionIndicator = solutionContext.includes('fix') ||\n solutionContext.includes('resolve') ||\n solutionContext.includes('solution') ||\n solutionAction.includes('fix') ||\n solutionAction.includes('resolve');\n\n // Require both keyword match AND solution indicator\n return isSolutionIndicator || this.hasStrongKeywordOverlap(errorLower, solutionContext);\n });\n\n if (matchingSolution) {\n const title = this.generateTitle('Error Resolution', errorText);\n const content = this.formatErrorSolutionContent(error, matchingSolution);\n const tags = this.extractTags([error, matchingSolution]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['error-handling', 'debugging'],\n importance: 8,\n sourceObservationIds: [error.id, matchingSolution.id],\n });\n\n processedIds.push(error.id, matchingSolution.id);\n } else if (error.content.error) {\n // Standalone error learning\n const title = this.generateTitle('Error Pattern', errorText);\n const content = this.formatStandaloneErrorContent(error);\n const tags = this.extractTags([error]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['error-handling'],\n importance: 6,\n sourceObservationIds: [error.id],\n });\n\n processedIds.push(error.id);\n }\n }\n\n // Process remaining solutions\n for (const solution of solutions) {\n if (!processedIds.includes(solution.id)) {\n const title = this.generateTitle('Solution', solution.content.action);\n const content = this.formatSolutionContent(solution);\n const tags = this.extractTags([solution]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['solution-pattern'],\n importance: 7,\n sourceObservationIds: [solution.id],\n });\n\n processedIds.push(solution.id);\n }\n }\n\n return { learnings, processedIds };\n }\n\n private extractDecisionPatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const decisions = byType.get('decision') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n for (const decision of decisions) {\n const title = this.generateTitle('Decision', decision.content.action);\n const content = this.formatDecisionContent(decision);\n const tags = this.extractTags([decision]);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['decision-making', 'architecture'],\n importance: 7,\n sourceObservationIds: [decision.id],\n });\n\n processedIds.push(decision.id);\n }\n\n return { learnings, processedIds };\n }\n\n private extractFileChangePatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const fileChanges = byType.get('file_change') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Group file changes by pattern (same files modified together)\n const filePatterns = new Map<string, Observation[]>();\n for (const change of fileChanges) {\n const files = change.content.files || [];\n const pattern = this.getFilePattern(files);\n const existing = filePatterns.get(pattern) || [];\n existing.push(change);\n filePatterns.set(pattern, existing);\n }\n\n // Create learnings for significant patterns (2+ occurrences)\n for (const [pattern, changes] of filePatterns) {\n if (changes.length >= 2 || changes.some((c) => (c.content.files?.length || 0) > 3)) {\n const title = `File Modification Pattern: ${pattern}`;\n const content = this.formatFileChangeContent(changes);\n const tags = this.extractTags(changes);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['file-organization', 'code-structure'],\n importance: 5,\n sourceObservationIds: changes.map((c) => c.id),\n });\n\n processedIds.push(...changes.map((c) => c.id));\n }\n }\n\n return { learnings, processedIds };\n }\n\n private extractToolUsagePatterns(\n byType: Map<ObservationType, Observation[]>,\n _opts: Required<CompressionOptions>\n ): { learnings: CompressedLearning[]; processedIds: string[] } {\n const toolUses = byType.get('tool_use') || [];\n const checkpoints = byType.get('checkpoint') || [];\n const learnings: CompressedLearning[] = [];\n const processedIds: string[] = [];\n\n // Only extract if there are significant patterns\n const allObs = [...toolUses, ...checkpoints];\n if (allObs.length >= 5) {\n // Group by common action patterns\n const actionPatterns = new Map<string, Observation[]>();\n for (const obs of allObs) {\n const actionType = this.getActionType(obs.content.action);\n const existing = actionPatterns.get(actionType) || [];\n existing.push(obs);\n actionPatterns.set(actionType, existing);\n }\n\n for (const [actionType, observations] of actionPatterns) {\n if (observations.length >= 3) {\n const title = `Workflow Pattern: ${actionType}`;\n const content = this.formatToolUsageContent(observations);\n const tags = this.extractTags(observations);\n\n learnings.push({\n title,\n content,\n tags,\n frameworks: this.extractFrameworks(tags),\n patterns: ['workflow', 'automation'],\n importance: 4,\n sourceObservationIds: observations.map((o) => o.id),\n });\n\n processedIds.push(...observations.map((o) => o.id));\n }\n }\n }\n\n return { learnings, processedIds };\n }\n\n private generateTitle(prefix: string, text: string): string {\n // Extract key words from text\n const cleaned = text\n .replace(/[^a-zA-Z0-9\\s]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n const words = cleaned.split(' ').slice(0, 5).join(' ');\n return `${prefix}: ${words}`.slice(0, 80);\n }\n\n private formatErrorSolutionContent(error: Observation, solution: Observation): string {\n return `## Problem\n${error.content.error || error.content.action}\n\n**Context:** ${error.content.context}\n\n## Solution\n${solution.content.solution || solution.content.action}\n\n**How it was applied:** ${solution.content.context}\n\n## Files Involved\n${[...(error.content.files || []), ...(solution.content.files || [])].join(', ') || 'N/A'}\n`;\n }\n\n private formatStandaloneErrorContent(error: Observation): string {\n return `## Error\n${error.content.error || error.content.action}\n\n**Context:** ${error.content.context}\n\n## Files Involved\n${error.content.files?.join(', ') || 'N/A'}\n\n## Notes\nThis error was encountered but no direct solution was recorded. Consider investigating similar patterns.\n`;\n }\n\n private formatSolutionContent(solution: Observation): string {\n return `## Solution\n${solution.content.solution || solution.content.action}\n\n**Context:** ${solution.content.context}\n\n## Result\n${solution.content.result || 'Solution applied successfully'}\n\n## Files Involved\n${solution.content.files?.join(', ') || 'N/A'}\n`;\n }\n\n private formatDecisionContent(decision: Observation): string {\n return `## Decision\n${decision.content.action}\n\n**Context:** ${decision.content.context}\n\n## Reasoning\nThis decision was made during skill execution. The context above explains why this approach was chosen.\n\n## Result\n${decision.content.result || 'Decision implemented'}\n`;\n }\n\n private formatFileChangeContent(changes: Observation[]): string {\n const allFiles = new Set<string>();\n const contexts: string[] = [];\n\n for (const change of changes) {\n for (const file of change.content.files || []) {\n allFiles.add(file);\n }\n if (change.content.context) {\n contexts.push(`- ${change.content.context}`);\n }\n }\n\n return `## Files Modified\n${Array.from(allFiles).join('\\n')}\n\n## Contexts\n${contexts.join('\\n') || 'Various modifications'}\n\n## Pattern\nThese files were frequently modified together, suggesting a common pattern or component boundary.\n`;\n }\n\n private formatToolUsageContent(observations: Observation[]): string {\n const actions = observations\n .map((o) => `- ${o.content.action}`)\n .slice(0, 10)\n .join('\\n');\n\n return `## Workflow Steps\n${actions}\n\n## Pattern\nThis sequence of actions was repeated during execution, indicating a common workflow pattern.\n\n## Recommendation\nConsider automating or documenting this workflow for future reference.\n`;\n }\n\n private extractTags(observations: Observation[]): string[] {\n const tags = new Set<string>();\n for (const obs of observations) {\n for (const tag of obs.content.tags || []) {\n tags.add(tag.toLowerCase());\n }\n }\n return Array.from(tags);\n }\n\n private extractFrameworks(tags: string[]): string[] {\n const frameworks = [\n 'react',\n 'nextjs',\n 'vue',\n 'angular',\n 'svelte',\n 'express',\n 'nestjs',\n 'fastify',\n 'django',\n 'flask',\n 'rails',\n 'spring',\n 'typescript',\n 'javascript',\n 'python',\n 'rust',\n 'go',\n ];\n return tags.filter((t) => frameworks.includes(t.toLowerCase()));\n }\n\n private getFilePattern(files: string[]): string {\n if (files.length === 0) return 'unknown';\n\n // Extract common directory\n const dirs = files.map((f) => {\n const parts = f.split('/');\n return parts.slice(0, -1).join('/') || 'root';\n });\n\n const uniqueDirs = [...new Set(dirs)];\n if (uniqueDirs.length === 1) {\n return uniqueDirs[0];\n }\n\n // Extract file types\n const extensions = files.map((f) => {\n const ext = f.split('.').pop() || 'unknown';\n return ext;\n });\n const uniqueExts = [...new Set(extensions)];\n\n return `${uniqueDirs[0]} (${uniqueExts.join(', ')})`;\n }\n\n private getActionType(action: string): string {\n const actionLower = action.toLowerCase();\n if (actionLower.includes('read') || actionLower.includes('view')) return 'read';\n if (actionLower.includes('write') || actionLower.includes('create')) return 'write';\n if (actionLower.includes('edit') || actionLower.includes('modify')) return 'edit';\n if (actionLower.includes('delete') || actionLower.includes('remove')) return 'delete';\n if (actionLower.includes('test') || actionLower.includes('verify')) return 'test';\n if (actionLower.includes('build') || actionLower.includes('compile')) return 'build';\n if (actionLower.includes('start') || actionLower.includes('run')) return 'run';\n return 'other';\n }\n\n private hasSimilarKeywords(text1: string, text2: string): boolean {\n // Normalize: lowercase and strip punctuation for better matching\n const normalize = (word: string) => word.toLowerCase().replace(/[^a-z0-9]/g, '');\n const words1 = text1.split(/\\s+/).map(normalize).filter((w) => w.length > 3);\n const words2 = new Set(text2.split(/\\s+/).map(normalize).filter((w) => w.length > 3));\n return words1.some((w) => words2.has(w));\n }\n\n /**\n * Check for strong keyword overlap (multiple matching words)\n * More strict than hasSimilarKeywords - requires at least 2 matching words\n */\n private hasStrongKeywordOverlap(text1: string, text2: string): boolean {\n // Normalize: lowercase and strip punctuation for better matching\n const normalize = (word: string) => word.toLowerCase().replace(/[^a-z0-9]/g, '');\n const words1 = text1.split(/\\s+/).map(normalize).filter((w) => w.length > 3);\n const words2 = new Set(text2.split(/\\s+/).map(normalize).filter((w) => w.length > 3));\n const matchCount = words1.filter((w) => words2.has(w)).length;\n return matchCount >= 2;\n }\n}\n\n/**\n * API-based compression engine configuration\n */\nexport interface APICompressionConfig {\n /** API provider */\n provider: 'anthropic' | 'openai';\n /** API key */\n apiKey: string;\n /** Model to use */\n model?: string;\n /** Maximum tokens for response */\n maxTokens?: number;\n}\n\n/**\n * API-based compression engine\n *\n * Uses Claude or OpenAI to extract learnings from observations.\n */\nexport class APIBasedCompressor implements CompressionEngine {\n private config: APICompressionConfig;\n\n constructor(config: APICompressionConfig) {\n this.config = config;\n }\n\n getType(): 'rule-based' | 'api' {\n return 'api';\n }\n\n async compress(\n observations: Observation[],\n options: CompressionOptions = {}\n ): Promise<CompressionResult> {\n const opts = { ...DEFAULT_COMPRESSION_OPTIONS, ...options };\n\n // Filter observations\n const filtered = opts.includeLowRelevance\n ? observations\n : observations.filter((o) => o.relevance >= 50);\n\n if (filtered.length < opts.minObservations) {\n return {\n learnings: [],\n processedObservationIds: [],\n skippedObservationIds: observations.map((o) => o.id),\n stats: {\n inputCount: observations.length,\n outputCount: 0,\n compressionRatio: 0,\n },\n };\n }\n\n // Format observations for the prompt\n const observationsText = this.formatObservationsForPrompt(filtered);\n\n // Build the prompt\n const prompt = this.buildCompressionPrompt(observationsText, opts);\n\n try {\n // Call the API\n const response = await this.callAPI(prompt);\n\n // Parse the response\n const learnings = this.parseAPIResponse(response, filtered);\n\n // Filter and limit\n const finalLearnings = learnings\n .filter((l) => l.importance >= opts.minImportance)\n .sort((a, b) => b.importance - a.importance)\n .slice(0, opts.maxLearnings);\n\n // Add additional tags\n if (opts.additionalTags.length > 0) {\n for (const learning of finalLearnings) {\n learning.tags = [...new Set([...learning.tags, ...opts.additionalTags])];\n }\n }\n\n const processedIds = finalLearnings.flatMap((l) => l.sourceObservationIds);\n const skippedIds = observations\n .map((o) => o.id)\n .filter((id) => !processedIds.includes(id));\n\n return {\n learnings: finalLearnings,\n processedObservationIds: processedIds,\n skippedObservationIds: skippedIds,\n stats: {\n inputCount: observations.length,\n outputCount: finalLearnings.length,\n compressionRatio:\n observations.length > 0 ? finalLearnings.length / observations.length : 0,\n },\n };\n } catch (error) {\n // Fall back to rule-based compression on API failure\n console.warn('API compression failed, falling back to rule-based:', error);\n const fallback = new RuleBasedCompressor();\n return fallback.compress(observations, options);\n }\n }\n\n private formatObservationsForPrompt(observations: Observation[]): string {\n return observations\n .map(\n (o, i) => `\n[Observation ${i + 1}] ID: ${o.id}\nType: ${o.type}\nTimestamp: ${o.timestamp}\nAction: ${o.content.action}\nContext: ${o.content.context}\n${o.content.error ? `Error: ${o.content.error}` : ''}\n${o.content.solution ? `Solution: ${o.content.solution}` : ''}\n${o.content.result ? `Result: ${o.content.result}` : ''}\n${o.content.files?.length ? `Files: ${o.content.files.join(', ')}` : ''}\n${o.content.tags?.length ? `Tags: ${o.content.tags.join(', ')}` : ''}\nRelevance: ${o.relevance}/100\n`\n )\n .join('\\n---\\n');\n }\n\n private buildCompressionPrompt(observationsText: string, opts: Required<CompressionOptions>): string {\n return `Analyze these session observations and extract key learnings that would be valuable for future development sessions.\n\n## Observations\n${observationsText}\n\n## Instructions\nExtract meaningful learnings from these observations. For each learning:\n1. Create a concise, actionable title (max 80 characters)\n2. Write content that explains:\n - What was learned\n - When/why this is useful\n - How to apply it\n3. Add relevant tags (lowercase, hyphenated)\n4. Rate importance (1-10, where 10 is critical)\n\nFocus on:\n- Error patterns and their solutions\n- Decisions made and their reasoning\n- Workflow patterns that emerged\n- Best practices discovered\n- Gotchas and edge cases\n\n${opts.projectName ? `Project context: ${opts.projectName}` : ''}\n\n## Output Format\nRespond with valid JSON array:\n[\n {\n \"title\": \"...\",\n \"content\": \"...\",\n \"tags\": [\"tag1\", \"tag2\"],\n \"frameworks\": [\"react\", \"typescript\"],\n \"patterns\": [\"error-handling\", \"debugging\"],\n \"importance\": 8,\n \"sourceObservationIds\": [\"obs-id-1\", \"obs-id-2\"]\n }\n]\n\nGenerate up to ${opts.maxLearnings} learnings. Only include learnings with importance >= ${opts.minImportance}.`;\n }\n\n private async callAPI(prompt: string): Promise<string> {\n if (this.config.provider === 'anthropic') {\n return this.callAnthropic(prompt);\n } else {\n return this.callOpenAI(prompt);\n }\n }\n\n private async callAnthropic(prompt: string): Promise<string> {\n const model = this.config.model || 'claude-3-haiku-20240307';\n const maxTokens = this.config.maxTokens || 4096;\n\n const response = await fetch('https://api.anthropic.com/v1/messages', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.config.apiKey,\n 'anthropic-version': '2023-06-01',\n },\n body: JSON.stringify({\n model,\n max_tokens: maxTokens,\n messages: [{ role: 'user', content: prompt }],\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Anthropic API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as { content: Array<{ text: string }> };\n return data.content[0]?.text || '';\n }\n\n private async callOpenAI(prompt: string): Promise<string> {\n const model = this.config.model || 'gpt-4o-mini';\n const maxTokens = this.config.maxTokens || 4096;\n\n const response = await fetch('https://api.openai.com/v1/chat/completions', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({\n model,\n max_tokens: maxTokens,\n messages: [{ role: 'user', content: prompt }],\n }),\n });\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`OpenAI API error: ${response.status} - ${error}`);\n }\n\n const data = (await response.json()) as {\n choices: Array<{ message: { content: string } }>;\n };\n return data.choices[0]?.message?.content || '';\n }\n\n private parseAPIResponse(response: string, observations: Observation[]): CompressedLearning[] {\n try {\n // Extract JSON from response (handle markdown code blocks)\n let jsonStr = response;\n const jsonMatch = response.match(/```(?:json)?\\s*([\\s\\S]*?)```/);\n if (jsonMatch) {\n jsonStr = jsonMatch[1];\n }\n\n const parsed = JSON.parse(jsonStr.trim());\n\n if (!Array.isArray(parsed)) {\n throw new Error('Response is not an array');\n }\n\n // Validate and clean up each learning\n const observationIds = new Set(observations.map((o) => o.id));\n return parsed\n .filter((item): item is CompressedLearning => {\n return (\n typeof item === 'object' &&\n typeof item.title === 'string' &&\n typeof item.content === 'string' &&\n Array.isArray(item.tags) &&\n typeof item.importance === 'number'\n );\n })\n .map((item) => ({\n ...item,\n // Validate source observation IDs\n sourceObservationIds: (item.sourceObservationIds || []).filter((id: string) =>\n observationIds.has(id)\n ),\n frameworks: item.frameworks || [],\n patterns: item.patterns || [],\n }));\n } catch (error) {\n console.warn('Failed to parse API response:', error);\n return [];\n }\n }\n}\n\n/**\n * Memory compressor that manages compression and stores results\n */\nexport class MemoryCompressor {\n private engine: CompressionEngine;\n private learningStore: LearningStore;\n private indexStore: MemoryIndexStore;\n private projectName?: string;\n\n constructor(\n projectPath: string,\n options?: {\n engine?: CompressionEngine;\n scope?: 'project' | 'global';\n projectName?: string;\n }\n ) {\n this.engine = options?.engine || new RuleBasedCompressor();\n this.learningStore = new LearningStore(\n options?.scope || 'project',\n projectPath,\n options?.projectName\n );\n // For global scope, use home directory; for project scope, use project path\n const indexBasePath = options?.scope === 'global' ? homedir() : projectPath;\n this.indexStore = new MemoryIndexStore(indexBasePath, options?.scope === 'global');\n this.projectName = options?.projectName;\n }\n\n /**\n * Set the compression engine\n */\n setEngine(engine: CompressionEngine): void {\n this.engine = engine;\n }\n\n /**\n * Compress observations without storing (for dry-run/preview)\n */\n async compress(\n observations: Observation[],\n options?: CompressionOptions\n ): Promise<CompressionResult> {\n const compressionOptions = {\n ...options,\n projectName: this.projectName || options?.projectName,\n };\n return this.engine.compress(observations, compressionOptions);\n }\n\n /**\n * Compress observations and store as learnings\n */\n async compressAndStore(\n observations: Observation[],\n options?: CompressionOptions\n ): Promise<{\n learnings: Learning[];\n result: CompressionResult;\n }> {\n const compressionOptions = {\n ...options,\n projectName: this.projectName || options?.projectName,\n };\n\n // Compress observations\n const result = await this.engine.compress(observations, compressionOptions);\n\n // Store each learning\n const storedLearnings: Learning[] = [];\n for (const compressed of result.learnings) {\n const learning = this.learningStore.add({\n source: 'session',\n sourceObservations: compressed.sourceObservationIds,\n title: compressed.title,\n content: compressed.content,\n tags: compressed.tags,\n frameworks: compressed.frameworks,\n patterns: compressed.patterns,\n });\n\n // Index the learning\n this.indexStore.indexLearning(learning);\n\n storedLearnings.push(learning);\n }\n\n return {\n learnings: storedLearnings,\n result,\n };\n }\n\n /**\n * Get the learning store\n */\n getLearningStore(): LearningStore {\n return this.learningStore;\n }\n\n /**\n * Get the index store\n */\n getIndexStore(): MemoryIndexStore {\n return this.indexStore;\n }\n\n /**\n * Get compression engine type\n */\n getEngineType(): 'rule-based' | 'api' {\n return this.engine.getType();\n }\n}\n\n/**\n * Learning consolidator\n *\n * Merges similar learnings to reduce redundancy.\n */\nexport class LearningConsolidator {\n /**\n * Find similar learnings\n */\n findSimilar(learnings: Learning[], similarity = 0.7): Array<[Learning, Learning]> {\n const pairs: Array<[Learning, Learning]> = [];\n\n for (let i = 0; i < learnings.length; i++) {\n for (let j = i + 1; j < learnings.length; j++) {\n const score = this.calculateSimilarity(learnings[i], learnings[j]);\n if (score >= similarity) {\n pairs.push([learnings[i], learnings[j]]);\n }\n }\n }\n\n return pairs;\n }\n\n /**\n * Merge two similar learnings\n */\n merge(learning1: Learning, learning2: Learning): Omit<Learning, 'id' | 'createdAt' | 'updatedAt'> {\n // Keep the more effective/used one as base\n const base = this.getBetterLearning(learning1, learning2);\n const other = base === learning1 ? learning2 : learning1;\n\n return {\n // Preserve the source from the base learning instead of hard-coding 'session'\n source: base.source,\n sourceObservations: [\n ...(base.sourceObservations || []),\n ...(other.sourceObservations || []),\n ],\n title: base.title,\n content: this.mergeContent(base.content, other.content),\n scope: base.scope,\n project: base.project,\n tags: [...new Set([...base.tags, ...other.tags])],\n frameworks: [...new Set([...(base.frameworks || []), ...(other.frameworks || [])])],\n patterns: [...new Set([...(base.patterns || []), ...(other.patterns || [])])],\n useCount: base.useCount + other.useCount,\n lastUsed: base.lastUsed || other.lastUsed,\n effectiveness: base.effectiveness ?? other.effectiveness,\n };\n }\n\n /**\n * Consolidate a list of learnings\n */\n consolidate(\n learnings: Learning[],\n store: LearningStore,\n index: MemoryIndexStore,\n similarity = 0.7\n ): { merged: number; remaining: number } {\n const pairs = this.findSimilar(learnings, similarity);\n const mergedIds = new Set<string>();\n let mergedCount = 0;\n\n for (const [l1, l2] of pairs) {\n if (mergedIds.has(l1.id) || mergedIds.has(l2.id)) {\n continue;\n }\n\n // Merge the learnings\n const merged = this.merge(l1, l2);\n\n // Add the merged learning\n const newLearning = store.add(merged);\n index.indexLearning(newLearning);\n\n // Remove the old learnings\n store.delete(l1.id);\n store.delete(l2.id);\n index.removeLearning(l1.id);\n index.removeLearning(l2.id);\n\n mergedIds.add(l1.id);\n mergedIds.add(l2.id);\n mergedCount++;\n }\n\n return {\n merged: mergedCount,\n remaining: learnings.length - mergedCount * 2 + mergedCount,\n };\n }\n\n private calculateSimilarity(l1: Learning, l2: Learning): number {\n let score = 0;\n\n // Title similarity (Jaccard)\n const title1Words = new Set(l1.title.toLowerCase().split(/\\s+/));\n const title2Words = new Set(l2.title.toLowerCase().split(/\\s+/));\n const titleIntersection = [...title1Words].filter((w) => title2Words.has(w)).length;\n const titleUnion = new Set([...title1Words, ...title2Words]).size;\n score += (titleIntersection / titleUnion) * 0.3;\n\n // Tag overlap\n const tags1 = new Set(l1.tags);\n const tags2 = new Set(l2.tags);\n const tagIntersection = [...tags1].filter((t) => tags2.has(t)).length;\n const tagUnion = new Set([...tags1, ...tags2]).size;\n if (tagUnion > 0) {\n score += (tagIntersection / tagUnion) * 0.3;\n }\n\n // Pattern overlap\n const patterns1 = new Set(l1.patterns || []);\n const patterns2 = new Set(l2.patterns || []);\n const patternIntersection = [...patterns1].filter((p) => patterns2.has(p)).length;\n const patternUnion = new Set([...patterns1, ...patterns2]).size;\n if (patternUnion > 0) {\n score += (patternIntersection / patternUnion) * 0.2;\n }\n\n // Content similarity (simple word overlap)\n const content1Words = new Set(\n l1.content\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 4)\n );\n const content2Words = new Set(\n l2.content\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 4)\n );\n const contentIntersection = [...content1Words].filter((w) => content2Words.has(w)).length;\n const contentUnion = new Set([...content1Words, ...content2Words]).size;\n if (contentUnion > 0) {\n score += (contentIntersection / contentUnion) * 0.2;\n }\n\n return score;\n }\n\n private getBetterLearning(l1: Learning, l2: Learning): Learning {\n // Prefer higher effectiveness\n if (l1.effectiveness !== l2.effectiveness) {\n return (l1.effectiveness || 0) > (l2.effectiveness || 0) ? l1 : l2;\n }\n // Prefer higher use count\n if (l1.useCount !== l2.useCount) {\n return l1.useCount > l2.useCount ? l1 : l2;\n }\n // Prefer more recent\n return new Date(l1.updatedAt) > new Date(l2.updatedAt) ? l1 : l2;\n }\n\n private mergeContent(content1: string, content2: string): string {\n // Simple merge: keep the longer one and add a note\n if (content1.length >= content2.length) {\n return content1;\n }\n return content2;\n }\n}\n\n/**\n * Create a rule-based compressor\n */\nexport function createRuleBasedCompressor(): RuleBasedCompressor {\n return new RuleBasedCompressor();\n}\n\n/**\n * Create an API-based compressor\n */\nexport function createAPIBasedCompressor(config: APICompressionConfig): APIBasedCompressor {\n return new APIBasedCompressor(config);\n}\n\n/**\n * Create a memory compressor\n */\nexport function createMemoryCompressor(\n projectPath: string,\n options?: {\n engine?: CompressionEngine;\n scope?: 'project' | 'global';\n projectName?: string;\n }\n): MemoryCompressor {\n return new MemoryCompressor(projectPath, options);\n}\n","/**\n * Memory Injector\n *\n * Injects relevant memories into agent context with relevance matching,\n * agent-specific formatting, and token budgeting.\n */\n\nimport type { AgentType } from '../types.js';\nimport type { ProjectContext } from '../context/types.js';\nimport type { Learning, MemorySummary, MemoryPreview, MemoryFull } from './types.js';\nimport { LearningStore } from './learning-store.js';\n\n/**\n * Injection options\n */\nexport interface InjectionOptions {\n /** Maximum tokens to use for injected memories */\n maxTokens?: number;\n /** Minimum relevance score to include (0-100) */\n minRelevance?: number;\n /** Maximum number of learnings to inject */\n maxLearnings?: number;\n /** Include global memories */\n includeGlobal?: boolean;\n /** Specific tags to match */\n tags?: string[];\n /** Current task description for relevance matching */\n currentTask?: string;\n /** Progressive disclosure level */\n disclosureLevel?: 'summary' | 'preview' | 'full';\n}\n\n/**\n * Injected memory with relevance score\n */\nexport interface InjectedMemory {\n learning: Learning;\n relevanceScore: number;\n matchedBy: {\n frameworks: string[];\n tags: string[];\n keywords: string[];\n patterns: string[];\n };\n tokenEstimate: number;\n}\n\n/**\n * Injection result\n */\nexport interface InjectionResult {\n memories: InjectedMemory[];\n formattedContent: string;\n totalTokens: number;\n stats: {\n considered: number;\n matched: number;\n injected: number;\n truncated: number;\n };\n}\n\n/**\n * Default injection options\n */\nconst DEFAULT_OPTIONS: Required<Omit<InjectionOptions, 'tags' | 'currentTask'>> = {\n maxTokens: 2000,\n minRelevance: 30,\n maxLearnings: 10,\n includeGlobal: true,\n disclosureLevel: 'preview',\n};\n\n/**\n * Approximate tokens per character (conservative estimate)\n */\nconst TOKENS_PER_CHAR = 0.25;\n\n/**\n * Memory Injector\n *\n * Retrieves and formats relevant memories for injection into agent context.\n */\nexport class MemoryInjector {\n private projectStore: LearningStore;\n private globalStore: LearningStore;\n private projectContext?: ProjectContext;\n\n constructor(\n projectPath: string,\n projectName?: string,\n projectContext?: ProjectContext\n ) {\n this.projectStore = new LearningStore('project', projectPath, projectName);\n this.globalStore = new LearningStore('global');\n this.projectContext = projectContext;\n }\n\n /**\n * Set project context for better relevance matching\n */\n setProjectContext(context: ProjectContext): void {\n this.projectContext = context;\n }\n\n /**\n * Get relevant memories for injection\n */\n async getRelevantMemories(options: InjectionOptions = {}): Promise<InjectedMemory[]> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n // Collect all learnings\n const projectLearnings = this.projectStore.getAll();\n const globalLearnings = opts.includeGlobal ? this.globalStore.getAll() : [];\n const allLearnings = [...projectLearnings, ...globalLearnings];\n\n // Score each learning for relevance\n const scored = allLearnings.map((learning) => ({\n learning,\n ...this.scoreLearning(learning, opts),\n }));\n\n // Filter by minimum relevance\n const filtered = scored.filter((s) => s.relevanceScore >= opts.minRelevance);\n\n // Sort by relevance (descending)\n filtered.sort((a, b) => b.relevanceScore - a.relevanceScore);\n\n // Limit to max learnings\n return filtered.slice(0, opts.maxLearnings);\n }\n\n /**\n * Score a learning for relevance to current context\n */\n private scoreLearning(\n learning: Learning,\n options: InjectionOptions\n ): Omit<InjectedMemory, 'learning'> {\n let score = 0;\n const matchedBy = {\n frameworks: [] as string[],\n tags: [] as string[],\n keywords: [] as string[],\n patterns: [] as string[],\n };\n\n // Match by frameworks from project context\n if (this.projectContext?.stack) {\n const projectFrameworks = this.extractFrameworkNames();\n const learningFrameworks = learning.frameworks || [];\n\n for (const fw of learningFrameworks) {\n if (projectFrameworks.has(fw.toLowerCase())) {\n score += 15;\n matchedBy.frameworks.push(fw);\n }\n }\n }\n\n // Match by explicitly requested tags\n if (options.tags && options.tags.length > 0) {\n const requestedTags = new Set(options.tags.map((t) => t.toLowerCase()));\n for (const tag of learning.tags) {\n if (requestedTags.has(tag.toLowerCase())) {\n score += 20;\n matchedBy.tags.push(tag);\n }\n }\n }\n\n // Match by current task keywords\n if (options.currentTask) {\n const taskKeywords = this.extractKeywords(options.currentTask);\n const learningKeywords = [\n ...this.extractKeywords(learning.title),\n ...this.extractKeywords(learning.content),\n ...learning.tags,\n ];\n\n const learningKeywordSet = new Set(learningKeywords.map((k) => k.toLowerCase()));\n for (const kw of taskKeywords) {\n if (learningKeywordSet.has(kw.toLowerCase())) {\n score += 10;\n if (!matchedBy.keywords.includes(kw)) {\n matchedBy.keywords.push(kw);\n }\n }\n }\n }\n\n // Match by patterns\n if (learning.patterns && learning.patterns.length > 0) {\n // Patterns are valuable - boost score\n score += learning.patterns.length * 5;\n matchedBy.patterns.push(...learning.patterns);\n }\n\n // Boost by effectiveness if known\n if (learning.effectiveness !== undefined) {\n score += (learning.effectiveness / 100) * 20;\n }\n\n // Boost by use count (popular learnings are likely valuable)\n score += Math.min(learning.useCount * 2, 15);\n\n // Boost recent learnings\n const daysSinceUpdate = this.daysSince(learning.updatedAt);\n if (daysSinceUpdate < 7) {\n score += 10;\n } else if (daysSinceUpdate < 30) {\n score += 5;\n }\n\n // Cap score at 100\n score = Math.min(score, 100);\n\n // Estimate token count\n const tokenEstimate = this.estimateTokens(learning, options.disclosureLevel || 'preview');\n\n return {\n relevanceScore: score,\n matchedBy,\n tokenEstimate,\n };\n }\n\n /**\n * Extract framework names from project context\n */\n private extractFrameworkNames(): Set<string> {\n const names = new Set<string>();\n\n if (!this.projectContext?.stack) return names;\n\n const stack = this.projectContext.stack;\n const categories = [\n stack.languages,\n stack.frameworks,\n stack.libraries,\n stack.styling,\n stack.testing,\n stack.databases,\n stack.tools,\n stack.runtime,\n ];\n\n for (const category of categories) {\n for (const detection of category) {\n names.add(detection.name.toLowerCase());\n }\n }\n\n return names;\n }\n\n /**\n * Extract keywords from text\n */\n private extractKeywords(text: string): string[] {\n return text\n .toLowerCase()\n .split(/[\\s\\-_.,;:!?()[\\]{}'\"]+/)\n .filter((word) => word.length > 2 && !STOP_WORDS.has(word));\n }\n\n /**\n * Calculate days since a date\n */\n private daysSince(dateStr: string): number {\n const date = new Date(dateStr);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n return Math.floor(diffMs / (1000 * 60 * 60 * 24));\n }\n\n /**\n * Estimate tokens for a learning\n */\n private estimateTokens(\n learning: Learning,\n level: 'summary' | 'preview' | 'full'\n ): number {\n switch (level) {\n case 'summary':\n return Math.ceil((learning.title.length + learning.tags.join(' ').length) * TOKENS_PER_CHAR);\n case 'preview':\n const excerpt = learning.content.slice(0, 200);\n return Math.ceil(\n (learning.title.length + excerpt.length + learning.tags.join(' ').length) * TOKENS_PER_CHAR\n );\n case 'full':\n return Math.ceil(\n (learning.title.length + learning.content.length + learning.tags.join(' ').length) *\n TOKENS_PER_CHAR\n );\n }\n }\n\n /**\n * Inject memories and return formatted content\n */\n async inject(options: InjectionOptions = {}): Promise<InjectionResult> {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const allMemories = await this.getRelevantMemories(opts);\n\n // Select memories within token budget\n const selected: InjectedMemory[] = [];\n let totalTokens = 0;\n let truncated = 0;\n\n for (const memory of allMemories) {\n if (totalTokens + memory.tokenEstimate <= opts.maxTokens) {\n selected.push(memory);\n totalTokens += memory.tokenEstimate;\n\n // Increment use count\n if (memory.learning.scope === 'project') {\n this.projectStore.incrementUseCount(memory.learning.id);\n } else {\n this.globalStore.incrementUseCount(memory.learning.id);\n }\n } else {\n truncated++;\n }\n }\n\n // Format the content\n const formattedContent = this.formatMemories(selected, opts.disclosureLevel || 'preview');\n\n return {\n memories: selected,\n formattedContent,\n totalTokens,\n stats: {\n considered: this.projectStore.count() + (opts.includeGlobal ? this.globalStore.count() : 0),\n matched: allMemories.length,\n injected: selected.length,\n truncated,\n },\n };\n }\n\n /**\n * Inject memories formatted for a specific agent\n */\n async injectForAgent(\n agent: AgentType,\n options: InjectionOptions = {}\n ): Promise<InjectionResult> {\n const result = await this.inject(options);\n\n // Reformat for specific agent\n result.formattedContent = this.formatForAgent(result.memories, agent, options.disclosureLevel);\n\n return result;\n }\n\n /**\n * Format memories for display\n */\n private formatMemories(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n if (memories.length === 0) {\n return '';\n }\n\n const lines: string[] = ['# Relevant Memories', ''];\n\n for (const { learning, relevanceScore, matchedBy } of memories) {\n lines.push(`## ${learning.title}`);\n lines.push(`*Relevance: ${relevanceScore}% | Tags: ${learning.tags.join(', ')}*`);\n\n if (matchedBy.frameworks.length > 0) {\n lines.push(`*Matched frameworks: ${matchedBy.frameworks.join(', ')}*`);\n }\n\n lines.push('');\n\n switch (level) {\n case 'summary':\n // Just title and tags (already shown above)\n break;\n case 'preview':\n lines.push(learning.content.slice(0, 200) + (learning.content.length > 200 ? '...' : ''));\n break;\n case 'full':\n lines.push(learning.content);\n break;\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format memories for a specific agent\n */\n formatForAgent(\n memories: InjectedMemory[],\n agent: AgentType,\n level: 'summary' | 'preview' | 'full' = 'preview'\n ): string {\n if (memories.length === 0) {\n return '';\n }\n\n switch (agent) {\n case 'claude-code':\n return this.formatForClaude(memories, level);\n case 'cursor':\n return this.formatForCursor(memories, level);\n case 'codex':\n case 'github-copilot':\n return this.formatForCopilot(memories, level);\n default:\n return this.formatMemories(memories, level);\n }\n }\n\n /**\n * Format memories for Claude (XML tags)\n */\n private formatForClaude(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = ['<memories>'];\n\n for (const { learning, relevanceScore } of memories) {\n lines.push(` <memory relevance=\"${relevanceScore}\" scope=\"${learning.scope}\">`);\n lines.push(` <title>${this.escapeXml(learning.title)}</title>`);\n lines.push(` <tags>${learning.tags.join(', ')}</tags>`);\n\n if (level !== 'summary') {\n const content =\n level === 'preview' ? learning.content.slice(0, 200) : learning.content;\n lines.push(` <content>${this.escapeXml(content)}</content>`);\n }\n\n if (learning.frameworks && learning.frameworks.length > 0) {\n lines.push(` <frameworks>${learning.frameworks.join(', ')}</frameworks>`);\n }\n\n lines.push(' </memory>');\n }\n\n lines.push('</memories>');\n return lines.join('\\n');\n }\n\n /**\n * Format memories for Cursor (.mdc format)\n */\n private formatForCursor(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = [\n '---',\n 'description: Relevant memories from previous sessions',\n 'globs:',\n ' - \"**/*\"',\n '---',\n '',\n '# Session Memories',\n '',\n ];\n\n for (const { learning, relevanceScore } of memories) {\n lines.push(`## ${learning.title}`);\n lines.push('');\n lines.push(`> Relevance: ${relevanceScore}% | Tags: ${learning.tags.join(', ')}`);\n lines.push('');\n\n if (level !== 'summary') {\n const content =\n level === 'preview'\n ? learning.content.slice(0, 200) + (learning.content.length > 200 ? '...' : '')\n : learning.content;\n lines.push(content);\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format memories for Copilot/Codex (concise markdown)\n */\n private formatForCopilot(\n memories: InjectedMemory[],\n level: 'summary' | 'preview' | 'full'\n ): string {\n const lines: string[] = ['<!-- Session Memories -->'];\n\n for (const { learning } of memories) {\n lines.push(`### ${learning.title}`);\n lines.push(`Tags: ${learning.tags.join(', ')}`);\n\n if (level !== 'summary') {\n const content =\n level === 'preview' ? learning.content.slice(0, 150) : learning.content;\n lines.push(content);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Escape XML special characters\n */\n private escapeXml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n /**\n * Get memory summaries (for progressive disclosure)\n */\n getSummaries(options: InjectionOptions = {}): MemorySummary[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n\n const projectLearnings = this.projectStore.getAll();\n const globalLearnings = opts.includeGlobal ? this.globalStore.getAll() : [];\n const allLearnings = [...projectLearnings, ...globalLearnings];\n\n return allLearnings.map((learning) => ({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n }));\n }\n\n /**\n * Get memory previews (for progressive disclosure)\n */\n getPreviews(ids: string[], options: InjectionOptions = {}): MemoryPreview[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const previews: MemoryPreview[] = [];\n\n for (const id of ids) {\n let learning = this.projectStore.getById(id);\n if (!learning && opts.includeGlobal) {\n learning = this.globalStore.getById(id);\n }\n\n if (learning) {\n previews.push({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n excerpt: learning.content.slice(0, 200),\n lastUsed: learning.lastUsed,\n });\n }\n }\n\n return previews;\n }\n\n /**\n * Get full memories (for progressive disclosure)\n */\n getFullMemories(ids: string[], options: InjectionOptions = {}): MemoryFull[] {\n const opts = { ...DEFAULT_OPTIONS, ...options };\n const fullMemories: MemoryFull[] = [];\n\n for (const id of ids) {\n let learning = this.projectStore.getById(id);\n if (!learning && opts.includeGlobal) {\n learning = this.globalStore.getById(id);\n }\n\n if (learning) {\n fullMemories.push({\n id: learning.id,\n title: learning.title,\n tags: learning.tags,\n relevance: this.scoreLearning(learning, opts).relevanceScore,\n excerpt: learning.content.slice(0, 200),\n lastUsed: learning.lastUsed,\n content: learning.content,\n });\n }\n }\n\n return fullMemories;\n }\n\n /**\n * Search memories by query\n */\n search(query: string, options: InjectionOptions = {}): InjectedMemory[] {\n const opts = { ...DEFAULT_OPTIONS, ...options, currentTask: query };\n const projectResults = this.projectStore.search(query);\n const globalResults = opts.includeGlobal ? this.globalStore.search(query) : [];\n const allResults = [...projectResults, ...globalResults];\n\n return allResults\n .map((learning) => ({\n learning,\n ...this.scoreLearning(learning, opts),\n }))\n .filter((m) => m.relevanceScore >= opts.minRelevance)\n .sort((a, b) => b.relevanceScore - a.relevanceScore)\n .slice(0, opts.maxLearnings);\n }\n}\n\n/**\n * Common stop words to ignore in keyword extraction\n */\nconst STOP_WORDS = new Set([\n 'the',\n 'a',\n 'an',\n 'and',\n 'or',\n 'but',\n 'in',\n 'on',\n 'at',\n 'to',\n 'for',\n 'of',\n 'with',\n 'by',\n 'from',\n 'as',\n 'is',\n 'was',\n 'are',\n 'were',\n 'been',\n 'be',\n 'have',\n 'has',\n 'had',\n 'do',\n 'does',\n 'did',\n 'will',\n 'would',\n 'could',\n 'should',\n 'may',\n 'might',\n 'must',\n 'can',\n 'this',\n 'that',\n 'these',\n 'those',\n 'i',\n 'you',\n 'he',\n 'she',\n 'it',\n 'we',\n 'they',\n 'what',\n 'which',\n 'who',\n 'when',\n 'where',\n 'why',\n 'how',\n 'all',\n 'each',\n 'every',\n 'both',\n 'few',\n 'more',\n 'most',\n 'other',\n 'some',\n 'such',\n 'no',\n 'nor',\n 'not',\n 'only',\n 'own',\n 'same',\n 'so',\n 'than',\n 'too',\n 'very',\n 'just',\n 'also',\n]);\n\n/**\n * Create a MemoryInjector instance\n */\nexport function createMemoryInjector(\n projectPath: string,\n projectName?: string,\n projectContext?: ProjectContext\n): MemoryInjector {\n return new MemoryInjector(projectPath, projectName, projectContext);\n}\n","/**\n * Team Manager\n *\n * Manages team skill sharing and collaboration\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { execSync } from 'node:child_process';\nimport { parse as yamlParse, stringify as yamlStringify } from 'yaml';\nimport type {\n TeamConfig,\n TeamRegistry,\n SharedSkill,\n ShareOptions,\n ImportOptions,\n} from './types.js';\nimport type { AgentType } from '../types.js';\nimport { detectProvider } from '../providers/index.js';\n\nconst TEAM_CONFIG_FILE = 'team.yaml';\nconst TEAM_DIR = '.skillkit/team';\n\n/**\n * Team Manager for collaboration features\n */\nexport class TeamManager {\n private projectPath: string;\n private config: TeamConfig | null = null;\n private registry: TeamRegistry | null = null;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n }\n\n /**\n * Initialize team configuration\n */\n async init(config: Omit<TeamConfig, 'teamId'>): Promise<TeamConfig> {\n const teamId = this.generateTeamId();\n const fullConfig: TeamConfig = {\n ...config,\n teamId,\n };\n\n // Create team directory\n const teamDir = join(this.projectPath, TEAM_DIR);\n if (!existsSync(teamDir)) {\n mkdirSync(teamDir, { recursive: true });\n }\n\n // Save config\n this.saveConfig(fullConfig);\n this.config = fullConfig;\n\n // Initialize empty registry\n const registry: TeamRegistry = {\n version: 1,\n teamId,\n teamName: config.teamName,\n skills: [],\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n this.saveRegistry(registry);\n this.registry = registry;\n\n return fullConfig;\n }\n\n /**\n * Load existing team configuration\n */\n load(): TeamConfig | null {\n const configPath = join(this.projectPath, TEAM_DIR, TEAM_CONFIG_FILE);\n if (!existsSync(configPath)) {\n return null;\n }\n\n try {\n const content = readFileSync(configPath, 'utf-8');\n this.config = this.parseYaml(content) as TeamConfig;\n this.loadRegistry();\n return this.config;\n } catch {\n return null;\n }\n }\n\n /**\n * Get current config\n */\n getConfig(): TeamConfig | null {\n return this.config;\n }\n\n /**\n * Get current registry\n */\n getRegistry(): TeamRegistry | null {\n return this.registry;\n }\n\n /**\n * Share a skill to the team registry\n */\n async shareSkill(options: ShareOptions): Promise<SharedSkill> {\n if (!this.config || !this.registry) {\n throw new Error('Team not initialized. Run `skillkit team init` first.');\n }\n\n // Find the skill in local skills directory\n const skillPath = this.findLocalSkill(options.skillName);\n if (!skillPath) {\n throw new Error(`Skill \"${options.skillName}\" not found locally.`);\n }\n\n // Read skill content and metadata\n const skillMdPath = join(skillPath, 'SKILL.md');\n const skillContent = existsSync(skillMdPath)\n ? readFileSync(skillMdPath, 'utf-8')\n : '';\n\n // Parse frontmatter for metadata\n const metadata = this.extractFrontmatter(skillContent);\n\n // Create shared skill entry\n const shared: SharedSkill = {\n name: options.skillName,\n version: (metadata.version as string) || '1.0.0',\n description: options.description || (metadata.description as string) || '',\n author: this.getAuthor(),\n sharedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n source: `${this.config.registryUrl}#${options.skillName}`,\n tags: options.tags || (metadata.tags as string[]) || [],\n agents: options.agents || this.detectCompatibleAgents(skillPath),\n downloads: 0,\n };\n\n // Check if skill already exists\n const existingIndex = this.registry.skills.findIndex(\n (s) => s.name === options.skillName\n );\n\n if (existingIndex >= 0) {\n // Update existing\n shared.sharedAt = this.registry.skills[existingIndex].sharedAt;\n shared.downloads = this.registry.skills[existingIndex].downloads;\n this.registry.skills[existingIndex] = shared;\n } else {\n // Add new\n this.registry.skills.push(shared);\n }\n\n this.registry.updatedAt = new Date().toISOString();\n this.saveRegistry(this.registry);\n\n return shared;\n }\n\n /**\n * List all shared skills in the team registry\n */\n listSharedSkills(): SharedSkill[] {\n return this.registry?.skills || [];\n }\n\n /**\n * Search shared skills\n */\n searchSkills(query: string): SharedSkill[] {\n if (!this.registry) return [];\n\n const lowerQuery = query.toLowerCase();\n return this.registry.skills.filter(\n (s) =>\n s.name.toLowerCase().includes(lowerQuery) ||\n s.description?.toLowerCase().includes(lowerQuery) ||\n s.tags?.some((t) => t.toLowerCase().includes(lowerQuery))\n );\n }\n\n /**\n * Import a shared skill from the team registry\n */\n async importSkill(\n skillName: string,\n options: ImportOptions = {}\n ): Promise<{ success: boolean; path?: string; error?: string }> {\n if (!this.config || !this.registry) {\n return { success: false, error: 'Team not initialized' };\n }\n\n const sharedSkill = this.registry.skills.find((s) => s.name === skillName);\n if (!sharedSkill) {\n return { success: false, error: `Skill \"${skillName}\" not found in team registry` };\n }\n\n // Check if skill exists locally\n const localPath = this.findLocalSkill(skillName);\n if (localPath && !options.overwrite) {\n return {\n success: false,\n error: `Skill \"${skillName}\" already exists. Use --overwrite to replace.`,\n };\n }\n\n if (options.dryRun) {\n return {\n success: true,\n path: join(this.projectPath, '.skillkit', 'skills', skillName),\n };\n }\n\n // Clone from registry source\n try {\n const provider = detectProvider(this.config.registryUrl);\n if (!provider) {\n return { success: false, error: 'Cannot detect provider for registry URL' };\n }\n\n // Build clone options with auth if available\n const cloneOptions: { depth?: number; ssh?: boolean } = { depth: 1 };\n if (this.config.auth?.type === 'ssh') {\n cloneOptions.ssh = true;\n }\n\n const result = await provider.clone(this.config.registryUrl, skillName, cloneOptions);\n\n if (!result.success) {\n return { success: false, error: result.error };\n }\n\n // Update download count\n sharedSkill.downloads = (sharedSkill.downloads || 0) + 1;\n this.saveRegistry(this.registry);\n\n return { success: true, path: result.path };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n }\n\n /**\n * Sync with remote registry\n */\n async sync(): Promise<{\n added: string[];\n updated: string[];\n removed: string[];\n }> {\n if (!this.config) {\n throw new Error('Team not initialized');\n }\n\n if (!this.registry) {\n throw new Error('Team registry not loaded. Call load() first.');\n }\n\n const result = { added: [] as string[], updated: [] as string[], removed: [] as string[] };\n\n try {\n const provider = detectProvider(this.config.registryUrl);\n if (!provider) {\n throw new Error('Cannot detect provider for registry URL');\n }\n\n // Build clone options with auth if available\n const cloneOptions: { depth?: number; ssh?: boolean } = { depth: 1 };\n if (this.config.auth?.type === 'ssh') {\n cloneOptions.ssh = true;\n }\n\n // Fetch remote registry\n const fetchResult = await provider.clone(this.config.registryUrl, '', cloneOptions);\n\n if (!fetchResult.success || !fetchResult.path) {\n throw new Error(fetchResult.error || 'Failed to fetch remote registry');\n }\n\n // Read remote registry\n const remoteRegistryPath = join(fetchResult.path, TEAM_DIR, 'registry.yaml');\n if (existsSync(remoteRegistryPath)) {\n const remoteContent = readFileSync(remoteRegistryPath, 'utf-8');\n const remoteRegistry = this.parseYaml(remoteContent) as TeamRegistry;\n\n // Merge registries\n const localSkillNames = new Set(this.registry?.skills.map((s) => s.name) || []);\n\n // Find added skills\n for (const skill of remoteRegistry.skills) {\n if (!localSkillNames.has(skill.name)) {\n result.added.push(skill.name);\n this.registry?.skills.push(skill);\n } else {\n // Check if updated\n const local = this.registry?.skills.find((s) => s.name === skill.name);\n if (local && new Date(skill.updatedAt) > new Date(local.updatedAt)) {\n result.updated.push(skill.name);\n Object.assign(local, skill);\n }\n }\n }\n\n // Find removed skills (optional - keep local for now)\n // for (const skill of this.registry?.skills || []) {\n // if (!remoteSkillNames.has(skill.name)) {\n // result.removed.push(skill.name);\n // }\n // }\n\n if (this.registry) {\n this.registry.updatedAt = new Date().toISOString();\n this.saveRegistry(this.registry);\n }\n }\n\n // Clean up temp directory\n if (fetchResult.tempRoot) {\n const { rmSync } = await import('node:fs');\n rmSync(fetchResult.tempRoot, { recursive: true, force: true });\n }\n } catch (err) {\n throw new Error(`Sync failed: ${err instanceof Error ? err.message : 'Unknown error'}`);\n }\n\n return result;\n }\n\n /**\n * Remove a skill from the team registry\n */\n removeSkill(skillName: string): boolean {\n if (!this.registry) return false;\n\n const index = this.registry.skills.findIndex((s) => s.name === skillName);\n if (index === -1) return false;\n\n this.registry.skills.splice(index, 1);\n this.registry.updatedAt = new Date().toISOString();\n this.saveRegistry(this.registry);\n\n return true;\n }\n\n // Private helpers\n\n private generateTeamId(): string {\n return `team-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n }\n\n private saveConfig(config: TeamConfig): void {\n const configPath = join(this.projectPath, TEAM_DIR, TEAM_CONFIG_FILE);\n const dir = dirname(configPath);\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n writeFileSync(configPath, this.toYaml(config), 'utf-8');\n }\n\n private loadRegistry(): void {\n const registryPath = join(this.projectPath, TEAM_DIR, 'registry.yaml');\n if (existsSync(registryPath)) {\n const content = readFileSync(registryPath, 'utf-8');\n this.registry = this.parseYaml(content) as TeamRegistry;\n }\n }\n\n private saveRegistry(registry: TeamRegistry): void {\n const registryPath = join(this.projectPath, TEAM_DIR, 'registry.yaml');\n writeFileSync(registryPath, this.toYaml(registry), 'utf-8');\n }\n\n private findLocalSkill(skillName: string): string | null {\n const possiblePaths = [\n join(this.projectPath, '.skillkit', 'skills', skillName),\n join(this.projectPath, 'skills', skillName),\n join(this.projectPath, '.claude', 'skills', skillName),\n ];\n\n for (const p of possiblePaths) {\n if (existsSync(p)) {\n return p;\n }\n }\n\n return null;\n }\n\n private getAuthor(): string {\n // Try to get from git config\n try {\n const name = execSync('git config user.name', { encoding: 'utf-8' }).trim();\n const email = execSync('git config user.email', { encoding: 'utf-8' }).trim();\n return email ? `${name} <${email}>` : name;\n } catch {\n return 'Unknown';\n }\n }\n\n private detectCompatibleAgents(skillPath: string): AgentType[] {\n const agents: AgentType[] = [];\n\n // Check for format-specific files\n if (existsSync(join(skillPath, 'SKILL.md'))) {\n agents.push('claude-code', 'codex', 'gemini-cli', 'universal');\n }\n if (existsSync(join(skillPath, 'skill.mdc'))) {\n agents.push('cursor');\n }\n if (existsSync(join(skillPath, 'rules.md'))) {\n agents.push('windsurf');\n }\n\n return agents.length > 0 ? agents : ['universal'];\n }\n\n private extractFrontmatter(content: string): Record<string, unknown> {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return {};\n\n try {\n return this.parseYaml(match[1]) as Record<string, unknown>;\n } catch {\n return {};\n }\n }\n\n private parseYaml(content: string): unknown {\n return yamlParse(content);\n }\n\n private toYaml(obj: unknown): string {\n return yamlStringify(obj, { indent: 2 });\n }\n}\n\n/**\n * Create a team manager instance\n */\nexport function createTeamManager(projectPath: string): TeamManager {\n return new TeamManager(projectPath);\n}\n","/**\n * Skill Bundle\n *\n * Package multiple skills into a shareable bundle\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, statSync } from 'node:fs';\nimport { join, basename, resolve, relative, dirname, sep } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport type { BundleManifest } from './types.js';\nimport type { AgentType } from '../types.js';\n\nconst BUNDLE_VERSION = 1;\n\n/**\n * Skill Bundle class for creating and managing skill bundles\n */\nexport class SkillBundle {\n private manifest: BundleManifest;\n private skills: Map<string, string> = new Map(); // skillName -> content\n\n constructor(name: string, author: string, description?: string) {\n this.manifest = {\n version: BUNDLE_VERSION,\n name,\n description,\n author,\n createdAt: new Date().toISOString(),\n skills: [],\n totalSize: 0,\n };\n }\n\n /**\n * Add a skill to the bundle\n */\n addSkill(skillPath: string, agents?: AgentType[]): void {\n const skillName = basename(skillPath);\n\n // Check for duplicate skill names\n if (this.skills.has(skillName)) {\n throw new Error(`Skill \"${skillName}\" already exists in bundle`);\n }\n\n const content = this.readSkillContent(skillPath);\n\n this.skills.set(skillName, content);\n this.manifest.skills.push({\n name: skillName,\n path: skillName, // Store only the skill name, not the full path\n agents: agents || this.detectAgents(skillPath),\n });\n\n this.manifest.totalSize += Buffer.byteLength(content, 'utf-8');\n }\n\n /**\n * Remove a skill from the bundle\n */\n removeSkill(skillName: string): boolean {\n const skill = this.manifest.skills.find((s) => s.name === skillName);\n if (!skill) return false;\n\n const content = this.skills.get(skillName);\n if (content) {\n this.manifest.totalSize -= Buffer.byteLength(content, 'utf-8');\n }\n\n this.skills.delete(skillName);\n this.manifest.skills = this.manifest.skills.filter((s) => s.name !== skillName);\n\n return true;\n }\n\n /**\n * Get bundle manifest\n */\n getManifest(): BundleManifest {\n return { ...this.manifest };\n }\n\n /**\n * Get all skill names in bundle\n */\n getSkillNames(): string[] {\n return this.manifest.skills.map((s) => s.name);\n }\n\n /**\n * Get skill content by name\n */\n getSkillContent(skillName: string): string | undefined {\n return this.skills.get(skillName);\n }\n\n /**\n * Calculate bundle checksum\n */\n getChecksum(): string {\n const contents: string[] = [];\n for (const [name, content] of this.skills.entries()) {\n contents.push(`${name}:${content}`);\n }\n contents.sort();\n return createHash('sha256').update(contents.join('\\n')).digest('hex').slice(0, 12);\n }\n\n private readSkillContent(skillPath: string): string {\n const contents: string[] = [];\n\n const readDir = (dir: string, prefix = ''): void => {\n const entries = readdirSync(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const relativePath = prefix ? `${prefix}/${entry}` : entry;\n const stat = statSync(fullPath);\n\n if (stat.isDirectory()) {\n readDir(fullPath, relativePath);\n } else if (stat.isFile()) {\n const content = readFileSync(fullPath, 'utf-8');\n contents.push(`--- ${relativePath} ---\\n${content}`);\n }\n }\n };\n\n if (statSync(skillPath).isDirectory()) {\n readDir(skillPath);\n } else {\n contents.push(readFileSync(skillPath, 'utf-8'));\n }\n\n return contents.join('\\n\\n');\n }\n\n private detectAgents(skillPath: string): AgentType[] {\n const agents: AgentType[] = [];\n\n // Handle single-file skills - check if skillPath is a file\n if (existsSync(skillPath) && statSync(skillPath).isFile()) {\n const fileName = basename(skillPath).toLowerCase();\n if (fileName === 'skill.md') {\n return ['claude-code', 'codex', 'gemini-cli', 'universal'];\n }\n if (fileName === 'skill.mdc') {\n return ['cursor'];\n }\n if (fileName === 'rules.md') {\n return ['windsurf'];\n }\n return ['universal'];\n }\n\n // Directory-based skill detection\n if (existsSync(join(skillPath, 'SKILL.md'))) {\n agents.push('claude-code', 'codex', 'gemini-cli', 'universal');\n }\n if (existsSync(join(skillPath, 'skill.mdc'))) {\n agents.push('cursor');\n }\n if (existsSync(join(skillPath, 'rules.md'))) {\n agents.push('windsurf');\n }\n\n return agents.length > 0 ? agents : ['universal'];\n }\n}\n\n/**\n * Create a new skill bundle\n */\nexport function createSkillBundle(\n name: string,\n author: string,\n description?: string\n): SkillBundle {\n return new SkillBundle(name, author, description);\n}\n\n/**\n * Export a bundle to a file\n */\nexport function exportBundle(\n bundle: SkillBundle,\n outputPath: string\n): { success: boolean; path?: string; error?: string } {\n try {\n const manifest = bundle.getManifest();\n const exportData = {\n manifest,\n skills: {} as Record<string, string>,\n };\n\n for (const skill of manifest.skills) {\n const content = bundle.getSkillContent(skill.name);\n if (content) {\n exportData.skills[skill.name] = content;\n }\n }\n\n const dir = dirname(outputPath);\n if (dir && !existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n // Export as JSON (could be changed to tarball for better compression)\n writeFileSync(outputPath, JSON.stringify(exportData, null, 2), 'utf-8');\n\n return { success: true, path: outputPath };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : 'Unknown error',\n };\n }\n}\n\n/**\n * Import a bundle from a file\n */\nexport function importBundle(\n bundlePath: string,\n targetDir: string,\n options: { overwrite?: boolean } = {}\n): { success: boolean; imported: string[]; errors: string[] } {\n const imported: string[] = [];\n const errors: string[] = [];\n\n try {\n const content = readFileSync(bundlePath, 'utf-8');\n const data = JSON.parse(content) as {\n manifest: BundleManifest;\n skills: Record<string, string>;\n };\n\n // Resolve targetDir to absolute path for consistent path containment checks\n const absoluteTargetDir = resolve(targetDir);\n\n for (const skill of data.manifest.skills) {\n // Validate skill name to prevent path traversal attacks\n if (!skill.name || skill.name.includes('/') || skill.name.includes('\\\\') ||\n skill.name === '..' || skill.name === '.' || skill.name.startsWith('.')) {\n errors.push(`Skill has invalid name: ${skill.name}`);\n continue;\n }\n\n const skillContent = data.skills[skill.name];\n if (!skillContent) {\n errors.push(`Skill \"${skill.name}\" has no content in bundle`);\n continue;\n }\n\n const skillDir = join(absoluteTargetDir, skill.name);\n\n // Double-check the resolved path is within target directory (cross-platform)\n const resolvedSkillDir = resolve(skillDir);\n const relativeToTarget = relative(absoluteTargetDir, resolvedSkillDir);\n if (relativeToTarget.startsWith('..') || relativeToTarget.startsWith(sep)) {\n errors.push(`Skill \"${skill.name}\" would escape target directory`);\n continue;\n }\n\n // Check if exists\n if (existsSync(skillDir) && !options.overwrite) {\n errors.push(`Skill \"${skill.name}\" already exists (use --overwrite)`);\n continue;\n }\n\n // Create skill directory\n if (!existsSync(skillDir)) {\n mkdirSync(skillDir, { recursive: true });\n }\n\n // Parse and write skill files\n const files = parseSkillContent(skillContent);\n for (const [filePath, fileContent] of Object.entries(files)) {\n // Validate path to prevent path traversal attacks\n const fullPath = resolve(skillDir, filePath);\n const relativeToSkill = relative(skillDir, fullPath);\n\n // Check for path traversal (cross-platform)\n if (relativeToSkill.startsWith('..') || relativeToSkill.startsWith(sep)) {\n errors.push(`Skill \"${skill.name}\" contains invalid file path: ${filePath}`);\n continue;\n }\n\n const fileDir = dirname(fullPath);\n if (!existsSync(fileDir)) {\n mkdirSync(fileDir, { recursive: true });\n }\n writeFileSync(fullPath, fileContent, 'utf-8');\n }\n\n imported.push(skill.name);\n }\n\n return { success: errors.length === 0, imported, errors };\n } catch (err) {\n errors.push(err instanceof Error ? err.message : 'Unknown error');\n return { success: false, imported, errors };\n }\n}\n\n/**\n * Parse skill content back into individual files\n */\nfunction parseSkillContent(content: string): Record<string, string> {\n const files: Record<string, string> = {};\n\n // Match file headers at start of string OR after newline\n // This ensures the first file isn't dropped when content starts with \"--- file ---\"\n const sections = content.split(/(?:^|\\n)--- ([^\\n]+) ---\\n/);\n\n // sections[0] is content before first header (empty if content starts with header)\n // Then alternating: filePath, fileContent, filePath, fileContent, ...\n let i = 1;\n while (i < sections.length) {\n const filePath = sections[i];\n const fileContent = sections[i + 1] || '';\n if (filePath && !filePath.startsWith('---')) {\n files[filePath.trim()] = fileContent;\n }\n i += 2;\n }\n\n // If no file markers found, assume it's a single SKILL.md\n if (Object.keys(files).length === 0 && content.trim()) {\n files['SKILL.md'] = content;\n }\n\n return files;\n}\n","/**\n * Plugin Manager\n *\n * Manages plugin registration, lifecycle, and execution\n */\n\nimport { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type {\n Plugin,\n PluginMetadata,\n PluginHooks,\n PluginContext,\n PluginConfig,\n CommandPlugin,\n} from './types.js';\nimport type { AgentType } from '../types.js';\nimport type { CanonicalSkill, FormatTranslator } from '../translator/types.js';\nimport type { GitProviderAdapter } from '../providers/base.js';\n\nconst PLUGINS_DIR = '.skillkit/plugins';\nconst PLUGINS_CONFIG_FILE = 'plugins.json';\n\ninterface PluginsState {\n version: number;\n plugins: Record<string, {\n enabled: boolean;\n config: PluginConfig;\n loadedAt?: string;\n }>;\n}\n\n/**\n * Plugin Manager class\n */\nexport class PluginManager {\n private projectPath: string;\n private plugins: Map<string, Plugin> = new Map();\n private translators: Map<string, FormatTranslator> = new Map();\n private providers: Map<string, GitProviderAdapter> = new Map();\n private commands: Map<string, CommandPlugin> = new Map();\n private hooks: Map<string, PluginHooks> = new Map();\n private state: PluginsState;\n private context: PluginContext;\n\n constructor(projectPath: string) {\n this.projectPath = projectPath;\n this.state = this.loadState();\n this.context = this.createContext();\n }\n\n /**\n * Register a plugin\n */\n async register(plugin: Plugin): Promise<void> {\n const name = plugin.metadata.name;\n\n // Check if already registered\n if (this.plugins.has(name)) {\n throw new Error(`Plugin \"${name}\" is already registered`);\n }\n\n // Check dependencies\n if (plugin.metadata.dependencies) {\n for (const dep of plugin.metadata.dependencies) {\n if (!this.plugins.has(dep)) {\n throw new Error(`Plugin \"${name}\" requires \"${dep}\" which is not loaded`);\n }\n }\n }\n\n // Initialize plugin\n if (plugin.init) {\n await plugin.init(this.context);\n }\n\n // Register translators\n if (plugin.translators) {\n for (const t of plugin.translators) {\n this.translators.set(t.agentType, t.translator);\n }\n }\n\n // Register providers\n if (plugin.providers) {\n for (const p of plugin.providers) {\n this.providers.set(p.providerName, p.provider);\n }\n }\n\n // Register commands\n if (plugin.commands) {\n for (const c of plugin.commands) {\n this.commands.set(c.name, c);\n if (c.aliases) {\n for (const alias of c.aliases) {\n this.commands.set(alias, c);\n }\n }\n }\n }\n\n // Register hooks\n if (plugin.hooks) {\n this.hooks.set(name, plugin.hooks);\n\n // Call onLoad hook\n if (plugin.hooks.onLoad) {\n await plugin.hooks.onLoad(this.context);\n }\n }\n\n // Store plugin\n this.plugins.set(name, plugin);\n\n // Update state\n this.state.plugins[name] = {\n enabled: true,\n config: {},\n loadedAt: new Date().toISOString(),\n };\n this.saveState();\n }\n\n /**\n * Unregister a plugin\n */\n async unregister(name: string): Promise<void> {\n const plugin = this.plugins.get(name);\n if (!plugin) {\n throw new Error(`Plugin \"${name}\" is not registered`);\n }\n\n // Call onUnload hook\n const hooks = this.hooks.get(name);\n if (hooks?.onUnload) {\n await hooks.onUnload();\n }\n\n // Cleanup\n if (plugin.destroy) {\n await plugin.destroy();\n }\n\n // Remove translators\n if (plugin.translators) {\n for (const t of plugin.translators) {\n this.translators.delete(t.agentType);\n }\n }\n\n // Remove providers\n if (plugin.providers) {\n for (const p of plugin.providers) {\n this.providers.delete(p.providerName);\n }\n }\n\n // Remove commands\n if (plugin.commands) {\n for (const c of plugin.commands) {\n this.commands.delete(c.name);\n if (c.aliases) {\n for (const alias of c.aliases) {\n this.commands.delete(alias);\n }\n }\n }\n }\n\n // Remove hooks\n this.hooks.delete(name);\n\n // Remove plugin\n this.plugins.delete(name);\n\n // Update state\n delete this.state.plugins[name];\n this.saveState();\n }\n\n /**\n * Get a registered plugin\n */\n getPlugin(name: string): Plugin | undefined {\n return this.plugins.get(name);\n }\n\n /**\n * Get all registered plugins\n */\n getAllPlugins(): Plugin[] {\n return Array.from(this.plugins.values());\n }\n\n /**\n * Get plugin metadata for all plugins\n */\n listPlugins(): PluginMetadata[] {\n return this.getAllPlugins().map((p) => p.metadata);\n }\n\n /**\n * Get a translator by agent type\n */\n getTranslator(agentType: AgentType | string): FormatTranslator | undefined {\n return this.translators.get(agentType);\n }\n\n /**\n * Get all registered translators\n */\n getAllTranslators(): Map<string, FormatTranslator> {\n return new Map(this.translators);\n }\n\n /**\n * Get a provider by name\n */\n getProvider(name: string): GitProviderAdapter | undefined {\n return this.providers.get(name);\n }\n\n /**\n * Get all registered providers\n */\n getAllProviders(): Map<string, GitProviderAdapter> {\n return new Map(this.providers);\n }\n\n /**\n * Get a command by name\n */\n getCommand(name: string): CommandPlugin | undefined {\n return this.commands.get(name);\n }\n\n /**\n * Get all registered commands\n */\n getAllCommands(): CommandPlugin[] {\n return Array.from(new Set(this.commands.values()));\n }\n\n /**\n * Execute hooks for an event\n */\n async executeHook<K extends keyof PluginHooks>(\n hookName: K,\n ...args: Parameters<NonNullable<PluginHooks[K]>>\n ): Promise<void> {\n for (const [, hooks] of this.hooks) {\n const hook = hooks[hookName];\n if (hook) {\n await (hook as (...args: unknown[]) => Promise<void>)(...args);\n }\n }\n }\n\n /**\n * Execute beforeTranslate hooks (returns transformed skill)\n */\n async executeBeforeTranslate(\n skill: CanonicalSkill,\n targetAgent: AgentType\n ): Promise<CanonicalSkill> {\n let result = skill;\n for (const [, hooks] of this.hooks) {\n if (hooks.beforeTranslate) {\n result = await hooks.beforeTranslate(result, targetAgent);\n }\n }\n return result;\n }\n\n /**\n * Execute afterTranslate hooks (returns transformed content)\n */\n async executeAfterTranslate(\n content: string,\n targetAgent: AgentType\n ): Promise<string> {\n let result = content;\n for (const [, hooks] of this.hooks) {\n if (hooks.afterTranslate) {\n result = await hooks.afterTranslate(result, targetAgent);\n }\n }\n return result;\n }\n\n /**\n * Set plugin configuration\n */\n setPluginConfig(name: string, config: PluginConfig): void {\n if (!this.state.plugins[name]) {\n this.state.plugins[name] = { enabled: true, config };\n } else {\n this.state.plugins[name].config = config;\n }\n this.saveState();\n }\n\n /**\n * Get plugin configuration\n */\n getPluginConfig(name: string): PluginConfig | undefined {\n return this.state.plugins[name]?.config;\n }\n\n /**\n * Enable a plugin\n */\n enablePlugin(name: string): void {\n if (this.state.plugins[name]) {\n this.state.plugins[name].enabled = true;\n this.saveState();\n }\n }\n\n /**\n * Disable a plugin\n */\n disablePlugin(name: string): void {\n if (this.state.plugins[name]) {\n this.state.plugins[name].enabled = false;\n this.saveState();\n }\n }\n\n /**\n * Check if plugin is enabled\n */\n isPluginEnabled(name: string): boolean {\n return this.state.plugins[name]?.enabled ?? true;\n }\n\n // Private helpers\n\n private loadState(): PluginsState {\n const statePath = join(this.projectPath, PLUGINS_DIR, PLUGINS_CONFIG_FILE);\n if (existsSync(statePath)) {\n try {\n return JSON.parse(readFileSync(statePath, 'utf-8'));\n } catch {\n // Return default state on error\n }\n }\n return { version: 1, plugins: {} };\n }\n\n private saveState(): void {\n const pluginsDir = join(this.projectPath, PLUGINS_DIR);\n if (!existsSync(pluginsDir)) {\n mkdirSync(pluginsDir, { recursive: true });\n }\n const statePath = join(pluginsDir, PLUGINS_CONFIG_FILE);\n writeFileSync(statePath, JSON.stringify(this.state, null, 2), 'utf-8');\n }\n\n private createContext(): PluginContext {\n return {\n projectPath: this.projectPath,\n skillkitVersion: '1.4.0',\n config: {},\n log: {\n info: (msg) => console.log(`[plugin] ${msg}`),\n warn: (msg) => console.warn(`[plugin] ${msg}`),\n error: (msg) => console.error(`[plugin] ${msg}`),\n debug: (msg) => {\n if (process.env.DEBUG) console.log(`[plugin:debug] ${msg}`);\n },\n },\n getTranslator: (agentType) => this.translators.get(agentType),\n getProvider: (name) => this.providers.get(name),\n };\n }\n}\n\n/**\n * Create a plugin manager instance\n */\nexport function createPluginManager(projectPath: string): PluginManager {\n return new PluginManager(projectPath);\n}\n","/**\n * Plugin Loader\n *\n * Loads plugins from various sources:\n * - Local files\n * - npm packages\n * - Git repositories\n */\n\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join, extname, basename, isAbsolute } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport type { Plugin, PluginMetadata } from './types.js';\n\n/**\n * Plugin Loader class\n */\nexport class PluginLoader {\n /**\n * Load a plugin from a file path\n */\n async loadFromFile(filePath: string): Promise<Plugin> {\n if (!existsSync(filePath)) {\n throw new Error(`Plugin file not found: ${filePath}`);\n }\n\n const ext = extname(filePath);\n if (ext !== '.js' && ext !== '.mjs') {\n throw new Error(`Unsupported plugin file type: ${ext}. Only .js and .mjs files are supported.`);\n }\n\n try {\n // Use dynamic import for ES modules\n const fileUrl = pathToFileURL(filePath).href;\n const module = await import(fileUrl);\n\n // Plugin can be default export or named export\n const plugin = module.default || module.plugin;\n\n if (!plugin || !plugin.metadata) {\n throw new Error('Invalid plugin: missing metadata');\n }\n\n return this.validatePlugin(plugin);\n } catch (err) {\n throw new Error(\n `Failed to load plugin from ${filePath}: ${\n err instanceof Error ? err.message : 'Unknown error'\n }`\n );\n }\n }\n\n /**\n * Load a plugin from an npm package\n */\n async loadFromPackage(packageName: string): Promise<Plugin> {\n try {\n // Try to resolve the package\n const module = await import(packageName);\n const plugin = module.default || module.plugin;\n\n if (!plugin || !plugin.metadata) {\n throw new Error('Invalid plugin: missing metadata');\n }\n\n return this.validatePlugin(plugin);\n } catch (err) {\n throw new Error(\n `Failed to load plugin from package ${packageName}: ${\n err instanceof Error ? err.message : 'Unknown error'\n }`\n );\n }\n }\n\n /**\n * Load a plugin from a JSON definition (for simple plugins)\n */\n loadFromJson(jsonPath: string): Plugin {\n if (!existsSync(jsonPath)) {\n throw new Error(`Plugin JSON not found: ${jsonPath}`);\n }\n\n try {\n const content = readFileSync(jsonPath, 'utf-8');\n const data = JSON.parse(content);\n\n if (!data.metadata) {\n throw new Error('Invalid plugin JSON: missing metadata');\n }\n\n // JSON plugins can only define metadata, hooks need code\n const plugin: Plugin = {\n metadata: data.metadata,\n };\n\n return this.validatePlugin(plugin);\n } catch (err) {\n throw new Error(\n `Failed to load plugin from ${jsonPath}: ${\n err instanceof Error ? err.message : 'Unknown error'\n }`\n );\n }\n }\n\n /**\n * Scan a directory for plugins\n */\n async scanDirectory(dirPath: string): Promise<PluginMetadata[]> {\n if (!existsSync(dirPath)) {\n return [];\n }\n\n const plugins: PluginMetadata[] = [];\n const entries = readdirSync(dirPath);\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n\n // Guard against unreadable entries (permission denied, broken symlinks)\n let stat;\n try {\n stat = statSync(fullPath);\n } catch {\n // Skip unreadable entries\n continue;\n }\n\n if (stat.isDirectory()) {\n // Check for package.json or plugin.json\n const pkgPath = join(fullPath, 'package.json');\n const pluginPath = join(fullPath, 'plugin.json');\n\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n // Validate required fields before pushing\n if ((pkg.skillkitPlugin || pkg.keywords?.includes('skillkit-plugin')) &&\n pkg.name && typeof pkg.name === 'string' &&\n pkg.version && typeof pkg.version === 'string') {\n plugins.push({\n name: pkg.name,\n version: pkg.version,\n description: pkg.description,\n author: pkg.author,\n homepage: pkg.homepage,\n });\n }\n } catch {\n // Skip invalid packages\n }\n } else if (existsSync(pluginPath)) {\n try {\n const data = JSON.parse(readFileSync(pluginPath, 'utf-8'));\n // Validate metadata has required fields\n if (data.metadata &&\n data.metadata.name && typeof data.metadata.name === 'string' &&\n data.metadata.version && typeof data.metadata.version === 'string') {\n plugins.push(data.metadata);\n }\n } catch {\n // Skip invalid plugins\n }\n }\n } else if (stat.isFile()) {\n // Check for plugin files\n const ext = extname(entry);\n if (ext === '.js' || ext === '.mjs') {\n const name = basename(entry, ext);\n if (name.includes('plugin') || name.startsWith('skillkit-')) {\n plugins.push({\n name,\n version: '0.0.0', // Unknown until loaded\n description: `Plugin file: ${entry}`,\n });\n }\n }\n }\n }\n\n return plugins;\n }\n\n /**\n * Validate a plugin structure\n */\n private validatePlugin(plugin: Plugin): Plugin {\n const { metadata } = plugin;\n\n // Validate required metadata\n if (!metadata.name) {\n throw new Error('Plugin metadata must include a name');\n }\n if (!metadata.version) {\n throw new Error('Plugin metadata must include a version');\n }\n\n // Validate name format (allow scoped npm names like @scope/name)\n if (!/^(?:@[a-z0-9-]+\\/)?[a-z0-9-]+$/.test(metadata.name)) {\n throw new Error(\n 'Plugin name must be lowercase alphanumeric with hyphens only (scoped names like @scope/name are allowed)'\n );\n }\n\n // Validate version format (loose semver check)\n if (!/^\\d+\\.\\d+\\.\\d+/.test(metadata.version)) {\n throw new Error('Plugin version must be semver format (e.g., 1.0.0)');\n }\n\n // Validate translators\n if (plugin.translators) {\n for (const t of plugin.translators) {\n if (!t.agentType || !t.translator) {\n throw new Error('Translator plugin must include agentType and translator');\n }\n }\n }\n\n // Validate providers\n if (plugin.providers) {\n for (const p of plugin.providers) {\n if (!p.providerName || !p.provider) {\n throw new Error('Provider plugin must include providerName and provider');\n }\n }\n }\n\n // Validate commands\n if (plugin.commands) {\n for (const c of plugin.commands) {\n if (!c.name || !c.handler) {\n throw new Error('Command plugin must include name and handler');\n }\n }\n }\n\n return plugin;\n }\n}\n\n/**\n * Load a plugin from a file\n */\nexport async function loadPlugin(source: string): Promise<Plugin> {\n const loader = new PluginLoader();\n\n // Determine source type\n // Check for local file paths: absolute, relative (./, .., paths with /), Windows paths, or tilde\n const isLocalPath =\n source.startsWith('.') || // ./, ../, .hidden\n isAbsolute(source) || // /abs/path or C:\\path\n (source.includes('/') && !source.startsWith('@')) || // plugins/x.js (but not @scope/pkg)\n source.includes('\\\\') || // Windows backslash\n source.startsWith('~'); // ~/path\n\n if (isLocalPath) {\n // File path\n if (source.endsWith('.json')) {\n return loader.loadFromJson(source);\n }\n return loader.loadFromFile(source);\n } else if (source.startsWith('@') || /^[a-z0-9-]+$/.test(source)) {\n // npm package\n return loader.loadFromPackage(source);\n } else {\n throw new Error(`Cannot determine plugin source type: ${source}`);\n }\n}\n\n/**\n * Load all plugins from a directory\n */\nexport async function loadPluginsFromDirectory(dirPath: string): Promise<Plugin[]> {\n const loader = new PluginLoader();\n const plugins: Plugin[] = [];\n\n if (!existsSync(dirPath)) {\n return plugins;\n }\n\n const entries = readdirSync(dirPath);\n\n for (const entry of entries) {\n const fullPath = join(dirPath, entry);\n\n // Guard against unreadable entries (permission denied, broken symlinks)\n let stat;\n try {\n stat = statSync(fullPath);\n } catch {\n // Skip unreadable entries\n continue;\n }\n\n try {\n if (stat.isDirectory()) {\n // Try to load from directory (check ESM .mjs files first, then .js)\n const indexMjsPath = join(fullPath, 'index.mjs');\n const indexPath = join(fullPath, 'index.js');\n const mainMjsPath = join(fullPath, 'plugin.mjs');\n const mainPath = join(fullPath, 'plugin.js');\n const jsonPath = join(fullPath, 'plugin.json');\n\n if (existsSync(indexMjsPath)) {\n plugins.push(await loader.loadFromFile(indexMjsPath));\n } else if (existsSync(indexPath)) {\n plugins.push(await loader.loadFromFile(indexPath));\n } else if (existsSync(mainMjsPath)) {\n plugins.push(await loader.loadFromFile(mainMjsPath));\n } else if (existsSync(mainPath)) {\n plugins.push(await loader.loadFromFile(mainPath));\n } else if (existsSync(jsonPath)) {\n plugins.push(loader.loadFromJson(jsonPath));\n }\n } else if (stat.isFile()) {\n const ext = extname(entry);\n if (ext === '.js' || ext === '.mjs') {\n plugins.push(await loader.loadFromFile(fullPath));\n } else if (ext === '.json' && entry.includes('plugin')) {\n plugins.push(loader.loadFromJson(fullPath));\n }\n }\n } catch (err) {\n // Log but continue loading other plugins\n console.warn(`Failed to load plugin from ${fullPath}: ${err}`);\n }\n }\n\n return plugins;\n}\n"],"mappings":"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","names":["relative","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","existsSync","readFileSync","statSync","join","z","execSync","existsSync","rmSync","readFileSync","writeFileSync","mkdirSync","join","tmpdir","homedir","randomUUID","join","homedir","tmpdir","randomUUID","execSync","existsSync","readFileSync","rmSync","mkdirSync","writeFileSync","existsSync","readFileSync","writeFileSync","mkdirSync","join","join","existsSync","readFileSync","mkdirSync","writeFileSync","existsSync","readFileSync","readdirSync","writeFileSync","mkdirSync","join","parse","stringify","parse","existsSync","readFileSync","join","readdirSync","mkdirSync","writeFileSync","stringify","randomUUID","execSync","randomUUID","randomUUID","resolve","execSync","resolve","existsSync","join","homedir","getSearchDirs","join","existsSync","homedir","resolve","existsSync","readFileSync","join","parseYaml","resolve","result","existsSync","readFileSync","writeFileSync","mkdirSync","unlinkSync","join","homedir","join","homedir","existsSync","mkdirSync","readFileSync","writeFileSync","isAbsolute","unlinkSync","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","parseYaml","stringifyYaml","randomUUID","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","homedir","parseYaml","stringifyYaml","randomUUID","existsSync","mkdirSync","readFileSync","writeFileSync","dirname","join","parseYaml","stringifyYaml","existsSync","mkdirSync","join","homedir","homedir","homedir","existsSync","readFileSync","writeFileSync","mkdirSync","join","dirname","execSync","join","existsSync","mkdirSync","readFileSync","rmSync","dirname","writeFileSync","execSync","existsSync","readFileSync","writeFileSync","mkdirSync","readdirSync","statSync","join","basename","resolve","dirname","parseSkillContent","existsSync","readFileSync","writeFileSync","mkdirSync","join","existsSync","readFileSync","readdirSync","statSync","join","basename","isLocalPath"]}
|