skill-master 0.1.6 → 0.1.10

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/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/installer.ts","../src/core/git-source.ts","../src/utils/fs-helpers.ts","../src/utils/errors.ts","../src/utils/logger.ts","../src/core/skill-parser.ts","../src/core/env-manager.ts","../src/utils/paths.ts","../src/platform/agents.ts","../src/core/registry.ts","../src/commands/add.ts","../src/commands/update.ts","../src/commands/remove.ts","../src/commands/env.ts","../src/commands/list.ts","../src/commands/info.ts","../src/commands/doctor.ts","../src/commands/find.ts","../src/commands/init.ts","../src/commands/check.ts","../src/cli.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { cloneRepo, isGitUrl, isLocalPath } from './git-source.js';\nimport { findSkillDirectory, readSkillMd, inferCapabilities, extractEnvKeys } from './skill-parser.js';\nimport { backupEnv, restoreEnv } from './env-manager.js';\nimport { updateRegistry } from './registry.js';\nimport { detectPlatform, getAgentSkillsDir } from '../platform/detector.js';\nimport { copyDir, removePath, symlinkOrCopy, ensureDir, readTextSafe } from '../utils/fs-helpers.js';\nimport { getSkillCanonicalPath, getAgentSkillPath, getAgentGlobalSkillPath } from '../utils/paths.js';\nimport * as logger from '../utils/logger.js';\nimport { SkillNotFoundError, SkillParseError } from '../utils/errors.js';\nimport type { InstallOptions, RegistryEntry, AgentInstall } from '../types/index.js';\n\nconst TOTAL_STEPS = 9;\n\n/**\n * Main installation engine — 9-step process:\n * 1. fetchSource → clone/copy to temp\n * 2. findSkillDir → locate SKILL.md\n * 3. parseSkillMd → parse frontmatter\n * 4. detectAgent → determine target platform\n * 5. backupEnv → preserve existing .env\n * 6. cleanAndInstall → rm old → copy new to canonical\n * 7. restoreEnv → restore .env to both locations\n * 8. linkOrCopy → symlink/copy to agent dir\n * 9. updateRegistry → update registry.json\n */\nexport async function installSkill(options: InstallOptions): Promise<void> {\n const { source, cwd, copy = false, force = false, global: isGlobal = false } = options;\n\n // Step 1: Fetch source\n logger.step(1, TOTAL_STEPS, 'Fetching skill source...');\n let sourceDir: string;\n\n if (source.type === 'git') {\n sourceDir = await cloneRepo(source.url!, source.branch);\n } else if (source.type === 'local') {\n sourceDir = source.path!;\n if (!existsSync(sourceDir)) {\n throw new SkillNotFoundError(sourceDir);\n }\n } else {\n throw new SkillParseError('Invalid source type');\n }\n\n // Step 2: Find skill directory\n logger.step(2, TOTAL_STEPS, 'Locating SKILL.md...');\n const skillDir = await findSkillDirectory(sourceDir);\n if (!skillDir) {\n throw new SkillNotFoundError(`No SKILL.md found in ${sourceDir}`);\n }\n\n // Step 3: Parse SKILL.md\n logger.step(3, TOTAL_STEPS, 'Parsing SKILL.md...');\n const parsed = await readSkillMd(skillDir);\n if (!parsed) {\n throw new SkillParseError('Failed to read SKILL.md');\n }\n const skillName = parsed.frontmatter.name;\n logger.info(`Found skill: ${skillName}${parsed.frontmatter.version ? ` v${parsed.frontmatter.version}` : ''}`);\n\n // Step 4: Detect agent platform\n logger.step(4, TOTAL_STEPS, 'Detecting agent platform...');\n const agent = options.agent ?? detectPlatform(cwd);\n logger.info(`Target platform: ${agent}`);\n\n // Step 5: Backup existing .env\n logger.step(5, TOTAL_STEPS, 'Backing up .env...');\n const agentSkillDir = isGlobal\n ? getAgentGlobalSkillPath(agent, skillName)\n : getAgentSkillPath(cwd, agent, skillName);\n const envBackup = await backupEnv(skillName, agentSkillDir);\n if (envBackup) {\n logger.success(`Backed up ${Object.keys(envBackup).length} env key(s)`);\n } else {\n logger.info('No existing .env found');\n }\n\n // Step 6: Clean and install to canonical path\n logger.step(6, TOTAL_STEPS, 'Installing to canonical path...');\n const canonicalPath = getSkillCanonicalPath(skillName);\n\n if (existsSync(canonicalPath) && !force) {\n logger.info('Replacing existing installation');\n }\n await removePath(canonicalPath);\n await copyDir(skillDir, canonicalPath);\n logger.success(`Installed to ${canonicalPath}`);\n\n // Step 7: Restore .env\n logger.step(7, TOTAL_STEPS, 'Restoring .env...');\n if (envBackup) {\n await restoreEnv(skillName, envBackup, canonicalPath);\n logger.success('.env restored successfully');\n } else {\n // Check if there's a .env.example to hint about\n const examplePath = join(canonicalPath, '.env.example');\n if (existsSync(examplePath)) {\n logger.warn('Found .env.example — run `skill-master env edit ' + skillName + '` to configure');\n }\n }\n\n // Step 8: Link or copy to agent directory\n logger.step(8, TOTAL_STEPS, `Linking to ${agent} skills directory...`);\n const agentPath = isGlobal\n ? getAgentGlobalSkillPath(agent, skillName)\n : getAgentSkillPath(cwd, agent, skillName);\n const linkType = await symlinkOrCopy(canonicalPath, agentPath, copy);\n logger.success(`${linkType === 'symlink' ? 'Symlinked' : 'Copied'} to ${agentPath}`);\n\n // Step 9: Update registry\n logger.step(9, TOTAL_STEPS, 'Updating registry...');\n const capabilities = parsed.frontmatter.capabilities ?? inferCapabilities(parsed.frontmatter['allowed-tools'] ?? []);\n\n // Extract env keys from .env.example\n const envExampleContent = await readTextSafe(join(canonicalPath, '.env.example'));\n const envKeys = envExampleContent ? extractEnvKeys(envExampleContent) : [];\n\n const now = new Date().toISOString();\n const agentInstall: AgentInstall = {\n agent,\n agent_path: agentPath,\n global: isGlobal,\n };\n const entry: RegistryEntry = {\n source: source.type === 'git' ? source.url! : source.path!,\n version: parsed.frontmatter.version,\n installed_at: now,\n updated_at: now,\n agents: [agentInstall],\n env_keys: envKeys,\n capabilities,\n canonical_path: canonicalPath,\n };\n\n await updateRegistry(skillName, entry);\n logger.blank();\n logger.success(`Skill \"${skillName}\" installed successfully!`);\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { existsSync } from 'node:fs';\nimport { ensureDir, createTempDir } from '../utils/fs-helpers.js';\nimport { GitCloneError, SourceParseError } from '../utils/errors.js';\nimport * as logger from '../utils/logger.js';\nimport type { ParsedSource } from '../types/index.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Parse a source string into a structured ParsedSource.\n * Supports:\n * - owner/repo → git\n * - owner/repo@skill → git + skillFilter\n * - owner/repo/sub/path → git + subpath\n * - github.com/o/r/tree/<ref>/<subpath> → git + ref + subpath\n * - github.com/o/r/blob/<ref>/<path> → git + ref + subpath (parent dir)\n * - gitlab.com/o/r/-/tree/<ref>/<subpath> → git + ref + subpath\n * - Full URLs (https/git@/git://) → git\n * - Local paths → local\n */\nexport function parseSource(source: string): ParsedSource {\n // git@ or git:// protocols\n if (source.startsWith('git@') || source.startsWith('git://')) {\n return { type: 'git', url: source };\n }\n\n // Full HTTP(S) URLs\n if (source.startsWith('https://') || source.startsWith('http://')) {\n // GitHub tree URL: github.com/o/r/tree/<ref>/<subpath>\n const ghTree = source.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/([^/]+)(?:\\/(.+))?/);\n if (ghTree) {\n const url = `https://github.com/${ghTree[1]}/${ghTree[2]}.git`;\n return { type: 'git', url, ref: ghTree[3], subpath: ghTree[4] };\n }\n\n // GitHub blob URL: github.com/o/r/blob/<ref>/<path> → parent dir as subpath\n const ghBlob = source.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/blob\\/([^/]+)\\/(.+)/);\n if (ghBlob) {\n const url = `https://github.com/${ghBlob[1]}/${ghBlob[2]}.git`;\n const filePath = ghBlob[4];\n const subpath = filePath.includes('/') ? filePath.slice(0, filePath.lastIndexOf('/')) : undefined;\n return { type: 'git', url, ref: ghBlob[3], subpath };\n }\n\n // GitLab tree URL: gitlab.com/o/r/-/tree/<ref>/<subpath>\n const glTree = source.match(/gitlab\\.com\\/([^/]+)\\/([^/]+)\\/-\\/tree\\/([^/]+)(?:\\/(.+))?/);\n if (glTree) {\n const url = `https://gitlab.com/${glTree[1]}/${glTree[2]}.git`;\n return { type: 'git', url, ref: glTree[3], subpath: glTree[4] };\n }\n\n // Plain github.com or gitlab.com URL\n if (source.includes('github.com/') || source.includes('gitlab.com/')) {\n return { type: 'git', url: source };\n }\n\n // Other https URLs — treat as git\n return { type: 'git', url: source };\n }\n\n // Contains github.com or gitlab.com without protocol\n if (source.includes('github.com/') || source.includes('gitlab.com/')) {\n return parseSource('https://' + source);\n }\n\n // Local path — exists on filesystem\n if (existsSync(source) || source.startsWith('/') || source.startsWith('./') || source.startsWith('../')) {\n return { type: 'local', path: source };\n }\n\n // Shorthand: extract @skill filter first\n let skillFilter: string | undefined;\n let shorthand = source;\n const atIdx = shorthand.indexOf('@');\n if (atIdx > 0 && !shorthand.includes('/') === false) {\n // Could be owner/repo@skill or owner/repo/path@skill\n // Only treat as skillFilter if @ is after the repo part\n const lastAt = shorthand.lastIndexOf('@');\n if (lastAt > 0) {\n const afterAt = shorthand.slice(lastAt + 1);\n const beforeAt = shorthand.slice(0, lastAt);\n // If afterAt has no slashes, it's a skill filter\n if (afterAt && !afterAt.includes('/')) {\n skillFilter = afterAt;\n shorthand = beforeAt;\n }\n }\n }\n\n // owner/repo (exactly 2 segments)\n if (/^[a-zA-Z0-9_.-]+\\/[a-zA-Z0-9_.-]+$/.test(shorthand)) {\n return {\n type: 'git',\n url: `https://github.com/${shorthand}.git`,\n skillFilter,\n };\n }\n\n // owner/repo/sub/path (3+ segments, first two are owner/repo)\n const segments = shorthand.split('/');\n if (segments.length >= 3 && /^[a-zA-Z0-9_.-]+$/.test(segments[0]) && /^[a-zA-Z0-9_.-]+$/.test(segments[1])) {\n const owner = segments[0];\n const repo = segments[1];\n const subpath = segments.slice(2).join('/');\n return {\n type: 'git',\n url: `https://github.com/${owner}/${repo}.git`,\n subpath,\n skillFilter,\n };\n }\n\n throw new SourceParseError(source, 'Unable to determine source type');\n}\n\n/** Check if a string looks like a git URL or GitHub shorthand */\nexport function isGitUrl(source: string): boolean {\n try {\n return parseSource(source).type === 'git';\n } catch {\n return false;\n }\n}\n\n/** Normalize a source string to a full clone URL */\nexport function normalizeGitUrl(source: string): string {\n const parsed = parseSource(source);\n if (parsed.type !== 'git' || !parsed.url) return source;\n\n let url = parsed.url;\n // Ensure .git suffix for HTTPS URLs\n if (url.startsWith('https://') && !url.endsWith('.git')) {\n url += '.git';\n }\n return url;\n}\n\n/** Parse a GitHub URL into owner and repo */\nexport function parseGitUrl(url: string): { owner: string; repo: string; branch?: string } {\n // Handle tree/branch in URL: github.com/owner/repo/tree/branch\n const treeMatch = url.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/(.+)/);\n if (treeMatch) {\n return {\n owner: treeMatch[1],\n repo: treeMatch[2].replace(/\\.git$/, ''),\n branch: treeMatch[3],\n };\n }\n\n // Standard URL: github.com/owner/repo\n const match = url.match(/github\\.com[/:]([^/]+)\\/([^/.]+)/);\n if (match) {\n return { owner: match[1], repo: match[2] };\n }\n\n throw new GitCloneError(url, 'Unable to parse GitHub URL');\n}\n\n/** Clone a git repository to a temporary directory */\nexport async function cloneRepo(\n url: string,\n branch?: string,\n): Promise<string> {\n const normalizedUrl = normalizeGitUrl(url);\n const tempDir = createTempDir();\n await ensureDir(tempDir);\n\n const args = ['clone', '--depth', '1'];\n if (branch) {\n args.push('--branch', branch);\n }\n args.push(normalizedUrl, tempDir);\n\n logger.debug(`Cloning ${normalizedUrl} to ${tempDir}`);\n\n try {\n await execFileAsync('git', args, { timeout: 60_000 });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new GitCloneError(url, msg);\n }\n\n return tempDir;\n}\n\n/** Check if a local path exists and contains a skill */\nexport function isLocalPath(source: string): boolean {\n return existsSync(source);\n}","import { mkdir, cp, readFile, writeFile, rename, symlink, lstat, rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\n\n/** Ensure a directory exists (recursive) */\nexport async function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\n/** Recursively copy a directory */\nexport async function copyDir(src: string, dest: string): Promise<void> {\n await ensureDir(dest);\n await cp(src, dest, { recursive: true, force: true });\n}\n\n/** Remove a directory or file recursively */\nexport async function removePath(target: string): Promise<void> {\n if (existsSync(target)) {\n await rm(target, { recursive: true, force: true });\n }\n}\n\n/** Atomic JSON write: write to .tmp then rename */\nexport async function atomicWriteJson(filePath: string, data: unknown): Promise<void> {\n await ensureDir(dirname(filePath));\n const tmpPath = filePath + '.tmp';\n await writeFile(tmpPath, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\n await rename(tmpPath, filePath);\n}\n\n/** Safely read and parse a JSON file, return null on failure */\nexport async function readJsonSafe<T>(filePath: string): Promise<T | null> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/** Read a text file, return null if not found */\nexport async function readTextSafe(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/** Write text to a file, ensuring parent directory exists */\nexport async function writeText(filePath: string, content: string): Promise<void> {\n await ensureDir(dirname(filePath));\n await writeFile(filePath, content, 'utf-8');\n}\n\n/** Create a symlink, or copy if symlink fails (Windows fallback) */\nexport async function symlinkOrCopy(target: string, linkPath: string, forceCopy = false): Promise<'symlink' | 'copy'> {\n await ensureDir(dirname(linkPath));\n\n // Remove existing link/dir\n await removePath(linkPath);\n\n if (forceCopy) {\n await copyDir(target, linkPath);\n return 'copy';\n }\n\n try {\n await symlink(target, linkPath, 'dir');\n return 'symlink';\n } catch {\n // Fallback to copy on platforms that don't support symlinks\n await copyDir(target, linkPath);\n return 'copy';\n }\n}\n\n/** Check if a path is a symlink */\nexport async function isSymlink(path: string): Promise<boolean> {\n try {\n const stat = await lstat(path);\n return stat.isSymbolicLink();\n } catch {\n return false;\n }\n}\n\n/** Create a temporary directory with a unique name */\nexport function createTempDir(): string {\n const id = randomBytes(8).toString('hex');\n return join(tmpdir(), `skill-master-${id}`);\n}\n","/** Base error class for skill-master */\nexport class SkillManagerError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SkillManagerError';\n }\n}\n\n/** Skill not found in registry or filesystem */\nexport class SkillNotFoundError extends SkillManagerError {\n constructor(skillName: string) {\n super(`Skill \"${skillName}\" not found`);\n this.name = 'SkillNotFoundError';\n }\n}\n\n/** Required .env key is missing */\nexport class EnvMissingError extends SkillManagerError {\n constructor(skillName: string, keys: string[]) {\n super(`Skill \"${skillName}\" is missing env keys: ${keys.join(', ')}`);\n this.name = 'EnvMissingError';\n }\n}\n\n/** Registry file is corrupted or invalid */\nexport class RegistryCorruptError extends SkillManagerError {\n constructor(detail?: string) {\n super(`Registry is corrupted${detail ? ': ' + detail : ''}`);\n this.name = 'RegistryCorruptError';\n }\n}\n\n/** Git clone operation failed */\nexport class GitCloneError extends SkillManagerError {\n constructor(url: string, detail?: string) {\n super(`Failed to clone \"${url}\"${detail ? ': ' + detail : ''}`);\n this.name = 'GitCloneError';\n }\n}\n\n/** SKILL.md parsing or validation failed */\nexport class SkillParseError extends SkillManagerError {\n constructor(detail: string) {\n super(`Failed to parse SKILL.md: ${detail}`);\n this.name = 'SkillParseError';\n }\n}\n\n/** Platform detection failed or unsupported */\nexport class PlatformError extends SkillManagerError {\n constructor(detail: string) {\n super(`Platform error: ${detail}`);\n this.name = 'PlatformError';\n }\n}\n\n/** Source string parsing failed */\nexport class SourceParseError extends SkillManagerError {\n constructor(source: string, detail?: string) {\n super(`Failed to parse source \"${source}\"${detail ? ': ' + detail : ''}`);\n this.name = 'SourceParseError';\n }\n}\n","import chalk from 'chalk';\n\nconst PREFIX = chalk.blue('skill-master');\n\n/** Informational message */\nexport function info(msg: string): void {\n console.log(`${PREFIX} ${chalk.cyan('info')} ${msg}`);\n}\n\n/** Success message */\nexport function success(msg: string): void {\n console.log(`${PREFIX} ${chalk.green('✔')} ${msg}`);\n}\n\n/** Warning message */\nexport function warn(msg: string): void {\n console.log(`${PREFIX} ${chalk.yellow('⚠')} ${msg}`);\n}\n\n/** Error message */\nexport function error(msg: string): void {\n console.error(`${PREFIX} ${chalk.red('✖')} ${msg}`);\n}\n\n/** Debug message (only when DEBUG env is set) */\nexport function debug(msg: string): void {\n if (process.env.DEBUG) {\n console.log(`${PREFIX} ${chalk.gray('debug')} ${msg}`);\n }\n}\n\n/** Step indicator with number */\nexport function step(num: number, total: number, msg: string): void {\n const counter = chalk.gray(`[${num}/${total}]`);\n console.log(`${PREFIX} ${counter} ${msg}`);\n}\n\n/** Print a blank line */\nexport function blank(): void {\n console.log();\n}\n\n/** Print a key-value pair */\nexport function kv(key: string, value: string): void {\n console.log(` ${chalk.gray(key + ':')} ${value}`);\n}\n\n/** Print a table header */\nexport function tableHeader(...cols: string[]): void {\n console.log(chalk.bold(cols.map(c => c.padEnd(20)).join('')));\n console.log(chalk.gray('─'.repeat(cols.length * 20)));\n}\n\n/** Print a table row */\nexport function tableRow(...cols: string[]): void {\n console.log(cols.map(c => c.padEnd(20)).join(''));\n}\n","import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { readdir } from 'node:fs/promises';\nimport { join, basename } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { readTextSafe } from '../utils/fs-helpers.js';\nimport { SkillParseError } from '../utils/errors.js';\nimport type { ParsedSkill, SkillFrontmatter, Capability } from '../types/index.js';\n\n/** Tool-to-capability reverse mapping for Claude Code tools */\nconst TOOL_CAPABILITY_MAP: Record<string, Capability> = {\n 'Bash': 'shell',\n 'Read': 'read_file',\n 'Write': 'write_file',\n 'Edit': 'edit_file',\n 'Glob': 'find_file',\n 'Grep': 'search_content',\n 'Task': 'sub_task',\n 'WebFetch': 'web_fetch',\n 'WebSearch': 'web_search',\n};\n\n/** Parse a SKILL.md file content into frontmatter + body */\nexport function parseSkillMd(content: string, dirName?: string): ParsedSkill {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) {\n throw new SkillParseError('No valid frontmatter block found');\n }\n\n const rawFrontmatter = match[1];\n const body = match[2];\n\n let frontmatter: SkillFrontmatter;\n try {\n frontmatter = parseYaml(rawFrontmatter) as SkillFrontmatter;\n } catch (err) {\n throw new SkillParseError(`YAML parse error: ${(err as Error).message}`);\n }\n\n validateFrontmatter(frontmatter);\n\n // Infer name from directory if not provided in frontmatter\n if (!frontmatter.name && dirName) {\n frontmatter.name = dirName;\n }\n\n if (!frontmatter.name) {\n throw new SkillParseError('Missing \"name\" field and unable to infer from directory');\n }\n\n return { frontmatter, body, rawFrontmatter };\n}\n\n/** Validate required frontmatter fields */\nexport function validateFrontmatter(fm: SkillFrontmatter): void {\n if (fm.name !== undefined && typeof fm.name !== 'string') {\n throw new SkillParseError('Invalid \"name\" field — must be a string');\n }\n if (fm.version !== undefined && typeof fm.version !== 'string') {\n throw new SkillParseError('Invalid \"version\" field — must be a string');\n }\n if (fm['allowed-tools'] !== undefined && !Array.isArray(fm['allowed-tools'])) {\n throw new SkillParseError('Invalid \"allowed-tools\" field — must be an array');\n }\n}\n\n/** Infer abstract capabilities from allowed-tools list */\nexport function inferCapabilities(allowedTools: string[]): Capability[] {\n const caps = new Set<Capability>();\n for (const tool of allowedTools) {\n const cap = TOOL_CAPABILITY_MAP[tool];\n if (cap) {\n caps.add(cap);\n }\n }\n return [...caps];\n}\n\n/** Serialize a ParsedSkill back to SKILL.md format */\nexport function serializeSkillMd(parsed: ParsedSkill): string {\n const yamlStr = stringifyYaml(parsed.frontmatter, { lineWidth: 0 }).trimEnd();\n return `---\\n${yamlStr}\\n---\\n${parsed.body}`;\n}\n\n/** Search for SKILL.md files within a directory (looks in .claude/skills/*) */\nexport async function findSkillDirectory(dir: string): Promise<string | null> {\n const dirs = await findAllSkillDirectories(dir);\n return dirs.length > 0 ? dirs[0] : null;\n}\n\nconst SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build']);\n\n/** Discover all directories containing SKILL.md within a source */\nexport async function findAllSkillDirectories(dir: string, fullDepth = false): Promise<string[]> {\n if (fullDepth) {\n const results = new Set<string>();\n await walkForSkills(dir, 0, 5, results);\n return [...results];\n }\n\n const results: string[] = [];\n\n // Direct SKILL.md in root\n if (existsSync(join(dir, 'SKILL.md'))) {\n results.push(dir);\n return results;\n }\n\n // Search in .claude/skills/*/SKILL.md\n const skillsRoot = join(dir, '.claude', 'skills');\n if (existsSync(skillsRoot)) {\n try {\n const entries = await readdir(skillsRoot, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const skillMdPath = join(skillsRoot, entry.name, 'SKILL.md');\n if (existsSync(skillMdPath)) {\n results.push(join(skillsRoot, entry.name));\n }\n }\n }\n } catch {\n // continue to next search strategy\n }\n }\n\n // Search one-level subdirectories for SKILL.md (skip hidden dirs)\n try {\n const topEntries = await readdir(dir, { withFileTypes: true });\n for (const entry of topEntries) {\n if (entry.isDirectory() && !entry.name.startsWith('.')) {\n const skillMdPath = join(dir, entry.name, 'SKILL.md');\n if (existsSync(skillMdPath)) {\n results.push(join(dir, entry.name));\n }\n }\n }\n } catch {\n // ignore\n }\n\n return results;\n}\n\n/** Recursively walk directories up to maxDepth looking for SKILL.md */\nasync function walkForSkills(dir: string, depth: number, maxDepth: number, results: Set<string>): Promise<void> {\n if (depth > maxDepth) return;\n\n if (existsSync(join(dir, 'SKILL.md'))) {\n results.add(dir);\n }\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith('.') && !SKIP_DIRS.has(entry.name)) {\n await walkForSkills(join(dir, entry.name), depth + 1, maxDepth, results);\n }\n }\n } catch {\n // ignore permission errors etc.\n }\n}\n\n/** Read and parse a SKILL.md from a directory */\nexport async function readSkillMd(dir: string): Promise<ParsedSkill | null> {\n const content = await readTextSafe(join(dir, 'SKILL.md'));\n if (!content) return null;\n return parseSkillMd(content, basename(dir));\n}\n\n/** Extract env keys from a .env.example file */\nexport function extractEnvKeys(envExampleContent: string): string[] {\n const keys: string[] = [];\n for (const line of envExampleContent.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=/);\n if (match) {\n keys.push(match[1]);\n }\n }\n }\n return keys;\n}\n","import { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { readTextSafe, writeText, ensureDir } from '../utils/fs-helpers.js';\nimport { getSkillConfigPath, getSkillCanonicalPath } from '../utils/paths.js';\nimport * as logger from '../utils/logger.js';\nimport type { EnvStatus } from '../types/index.js';\n\n/** Parse a .env file content into key-value pairs */\nexport function parseEnvFile(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n // Strip surrounding quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n result[key] = value;\n }\n return result;\n}\n\n/** Serialize key-value pairs back to .env format */\nexport function serializeEnv(data: Record<string, string>): string {\n return Object.entries(data)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n') + '\\n';\n}\n\n/**\n * Backup .env for a skill, searching multiple locations by priority:\n * 1. ~/.agents/config/<skill>/.env (persistent)\n * 2. agentSkillDir/.env (current agent dir, e.g. .claude/skills/<skill>)\n * 3. ~/.agents/skills/<skill>/.env (canonical)\n */\nexport async function backupEnv(\n skillName: string,\n agentSkillDir?: string,\n): Promise<Record<string, string> | null> {\n const locations = [\n join(getSkillConfigPath(skillName), '.env'),\n ...(agentSkillDir ? [join(agentSkillDir, '.env')] : []),\n join(getSkillCanonicalPath(skillName), '.env'),\n ];\n\n for (const loc of locations) {\n const content = await readTextSafe(loc);\n if (content) {\n const data = parseEnvFile(content);\n if (Object.keys(data).length > 0) {\n logger.debug(`Backed up .env from ${loc}`);\n return data;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Restore .env to both persistent and skill directory locations.\n * Merges with .env.example if present.\n */\nexport async function restoreEnv(\n skillName: string,\n envData: Record<string, string>,\n skillDir: string,\n): Promise<void> {\n // Read .env.example from skill dir if exists\n const exampleContent = await readTextSafe(join(skillDir, '.env.example'));\n let finalContent: string;\n\n if (exampleContent) {\n finalContent = mergeEnv(envData, exampleContent);\n } else {\n finalContent = serializeEnv(envData);\n }\n\n // Write to persistent config location\n const configEnvPath = join(getSkillConfigPath(skillName), '.env');\n await writeText(configEnvPath, finalContent);\n\n // Write to skill directory (for compatibility with loadApiKey)\n const skillEnvPath = join(skillDir, '.env');\n await writeText(skillEnvPath, finalContent);\n\n logger.debug(`Restored .env to ${configEnvPath} and ${skillEnvPath}`);\n}\n\n/**\n * Merge existing env data with .env.example template.\n * - Existing keys are NEVER overwritten\n * - New keys from example are appended with empty values and comments\n */\nexport function mergeEnv(\n existing: Record<string, string>,\n exampleContent: string,\n): string {\n const lines: string[] = [];\n const usedKeys = new Set<string>();\n\n // First, write all existing keys\n for (const [key, value] of Object.entries(existing)) {\n lines.push(`${key}=${value}`);\n usedKeys.add(key);\n }\n\n // Then, append new keys from example\n const exampleKeys = parseEnvFile(exampleContent);\n const newKeys = Object.keys(exampleKeys).filter(k => !usedKeys.has(k));\n\n if (newKeys.length > 0) {\n lines.push('');\n lines.push('# New keys added by skill update (please configure):');\n for (const key of newKeys) {\n lines.push(`# ${key}=`);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/** Check the .env configuration status for a skill */\nexport async function getEnvStatus(\n skillName: string,\n requiredKeys: string[],\n): Promise<EnvStatus> {\n if (requiredKeys.length === 0) return 'configured';\n\n const configEnvPath = join(getSkillConfigPath(skillName), '.env');\n const content = await readTextSafe(configEnvPath);\n\n if (!content) return 'missing';\n\n const data = parseEnvFile(content);\n const configuredKeys = Object.entries(data)\n .filter(([, v]) => v && !v.includes('your_') && !v.includes('_here'))\n .map(([k]) => k);\n\n const allConfigured = requiredKeys.every(k => configuredKeys.includes(k));\n const someConfigured = requiredKeys.some(k => configuredKeys.includes(k));\n\n if (allConfigured) return 'configured';\n if (someConfigured) return 'partial';\n return 'missing';\n}\n\n/** Set a single env value for a skill */\nexport async function setEnvValue(\n skillName: string,\n key: string,\n value: string,\n skillDir?: string,\n): Promise<void> {\n const configEnvPath = join(getSkillConfigPath(skillName), '.env');\n const content = await readTextSafe(configEnvPath);\n const data = content ? parseEnvFile(content) : {};\n\n data[key] = value;\n const newContent = serializeEnv(data);\n\n // Write to persistent location\n await writeText(configEnvPath, newContent);\n\n // Sync to skill directory if provided\n if (skillDir) {\n await writeText(join(skillDir, '.env'), newContent);\n }\n}\n\n/** Get the .env file path for editing */\nexport function getEnvEditPath(skillName: string): string {\n return join(getSkillConfigPath(skillName), '.env');\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n/** Root directory for all skill-master data */\nexport const AGENTS_HOME = join(homedir(), '.agents');\n\n/** Persistent user config (API keys etc.) */\nexport const CONFIG_DIR = join(AGENTS_HOME, 'config');\n\n/** Canonical skill code storage */\nexport const SKILLS_DIR = join(AGENTS_HOME, 'skills');\n\n/** Registry file path */\nexport const REGISTRY_PATH = join(AGENTS_HOME, 'registry.json');\n\n/** Get canonical path for a skill's code */\nexport function getSkillCanonicalPath(name: string): string {\n return join(SKILLS_DIR, name);\n}\n\n/** Get persistent config path for a skill (holds .env) */\nexport function getSkillConfigPath(name: string): string {\n return join(CONFIG_DIR, name);\n}\n\n// Re-export from agents.ts — eliminates duplicate AGENT_SKILL_DIRS mapping\nexport { getAgentSkillPath, getAgentGlobalSkillPath, getAgentSkillsRoot } from '../platform/agents.js';\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst home = homedir();\nconst configHome = process.env.XDG_CONFIG_HOME?.trim() || join(home, '.config');\nconst codexHome = process.env.CODEX_HOME?.trim() || join(home, '.codex');\nconst claudeHome = process.env.CLAUDE_CONFIG_DIR?.trim() || join(home, '.claude');\n\nexport interface AgentConfig {\n name: string;\n displayName: string;\n skillsDir: string;\n globalSkillsDir: string;\n detectMarker?: string;\n}\n\nexport const AGENTS = {\n amp: {\n name: 'amp',\n displayName: 'Amp',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(configHome, 'agents/skills'),\n },\n antigravity: {\n name: 'antigravity',\n displayName: 'Antigravity',\n skillsDir: '.agent/skills',\n globalSkillsDir: join(home, '.gemini/antigravity/skills'),\n detectMarker: '.agent',\n },\n augment: {\n name: 'augment',\n displayName: 'Augment',\n skillsDir: '.augment/skills',\n globalSkillsDir: join(home, '.augment/skills'),\n detectMarker: '.augment',\n },\n 'claude-code': {\n name: 'claude-code',\n displayName: 'Claude Code',\n skillsDir: '.claude/skills',\n globalSkillsDir: join(claudeHome, 'skills'),\n detectMarker: '.claude',\n },\n openclaw: {\n name: 'openclaw',\n displayName: 'OpenClaw',\n skillsDir: 'skills',\n globalSkillsDir: join(home, '.openclaw/skills'),\n },\n cline: {\n name: 'cline',\n displayName: 'Cline',\n skillsDir: '.cline/skills',\n globalSkillsDir: join(home, '.cline/skills'),\n detectMarker: '.cline',\n },\n codebuddy: {\n name: 'codebuddy',\n displayName: 'CodeBuddy',\n skillsDir: '.codebuddy/skills',\n globalSkillsDir: join(home, '.codebuddy/skills'),\n detectMarker: '.codebuddy',\n },\n codex: {\n name: 'codex',\n displayName: 'Codex',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(codexHome, 'skills'),\n },\n 'command-code': {\n name: 'command-code',\n displayName: 'Command Code',\n skillsDir: '.commandcode/skills',\n globalSkillsDir: join(home, '.commandcode/skills'),\n detectMarker: '.commandcode',\n },\n continue: {\n name: 'continue',\n displayName: 'Continue',\n skillsDir: '.continue/skills',\n globalSkillsDir: join(home, '.continue/skills'),\n detectMarker: '.continue',\n },\n crush: {\n name: 'crush',\n displayName: 'Crush',\n skillsDir: '.crush/skills',\n globalSkillsDir: join(home, '.config/crush/skills'),\n },\n cursor: {\n name: 'cursor',\n displayName: 'Cursor',\n skillsDir: '.cursor/skills',\n globalSkillsDir: join(home, '.cursor/skills'),\n detectMarker: '.cursor',\n },\n droid: {\n name: 'droid',\n displayName: 'Droid',\n skillsDir: '.factory/skills',\n globalSkillsDir: join(home, '.factory/skills'),\n detectMarker: '.factory',\n },\n 'gemini-cli': {\n name: 'gemini-cli',\n displayName: 'Gemini CLI',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(home, '.gemini/skills'),\n },\n 'github-copilot': {\n name: 'github-copilot',\n displayName: 'GitHub Copilot',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(home, '.copilot/skills'),\n },\n goose: {\n name: 'goose',\n displayName: 'Goose',\n skillsDir: '.goose/skills',\n globalSkillsDir: join(configHome, 'goose/skills'),\n detectMarker: '.goose',\n },\n junie: {\n name: 'junie',\n displayName: 'Junie',\n skillsDir: '.junie/skills',\n globalSkillsDir: join(home, '.junie/skills'),\n detectMarker: '.junie',\n },\n 'iflow-cli': {\n name: 'iflow-cli',\n displayName: 'iFlow CLI',\n skillsDir: '.iflow/skills',\n globalSkillsDir: join(home, '.iflow/skills'),\n detectMarker: '.iflow',\n },\n kilo: {\n name: 'kilo',\n displayName: 'Kilo Code',\n skillsDir: '.kilocode/skills',\n globalSkillsDir: join(home, '.kilocode/skills'),\n detectMarker: '.kilocode',\n },\n 'kimi-cli': {\n name: 'kimi-cli',\n displayName: 'Kimi Code CLI',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(home, '.config/agents/skills'),\n },\n 'kiro-cli': {\n name: 'kiro-cli',\n displayName: 'Kiro CLI',\n skillsDir: '.kiro/skills',\n globalSkillsDir: join(home, '.kiro/skills'),\n detectMarker: '.kiro',\n },\n kode: {\n name: 'kode',\n displayName: 'Kode',\n skillsDir: '.kode/skills',\n globalSkillsDir: join(home, '.kode/skills'),\n detectMarker: '.kode',\n },\n mcpjam: {\n name: 'mcpjam',\n displayName: 'MCPJam',\n skillsDir: '.mcpjam/skills',\n globalSkillsDir: join(home, '.mcpjam/skills'),\n detectMarker: '.mcpjam',\n },\n 'mistral-vibe': {\n name: 'mistral-vibe',\n displayName: 'Mistral Vibe',\n skillsDir: '.vibe/skills',\n globalSkillsDir: join(home, '.vibe/skills'),\n detectMarker: '.vibe',\n },\n mux: {\n name: 'mux',\n displayName: 'Mux',\n skillsDir: '.mux/skills',\n globalSkillsDir: join(home, '.mux/skills'),\n detectMarker: '.mux',\n },\n opencode: {\n name: 'opencode',\n displayName: 'OpenCode',\n skillsDir: '.opencode/skills',\n globalSkillsDir: join(configHome, 'opencode/skills'),\n },\n openhands: {\n name: 'openhands',\n displayName: 'OpenHands',\n skillsDir: '.openhands/skills',\n globalSkillsDir: join(home, '.openhands/skills'),\n detectMarker: '.openhands',\n },\n pi: {\n name: 'pi',\n displayName: 'Pi',\n skillsDir: '.pi/skills',\n globalSkillsDir: join(home, '.pi/agent/skills'),\n detectMarker: '.pi',\n },\n qoder: {\n name: 'qoder',\n displayName: 'Qoder',\n skillsDir: '.qoder/skills',\n globalSkillsDir: join(home, '.qoder/skills'),\n detectMarker: '.qoder',\n },\n 'qwen-code': {\n name: 'qwen-code',\n displayName: 'Qwen Code',\n skillsDir: '.qwen/skills',\n globalSkillsDir: join(home, '.qwen/skills'),\n detectMarker: '.qwen',\n },\n replit: {\n name: 'replit',\n displayName: 'Replit',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(configHome, 'agents/skills'),\n },\n roo: {\n name: 'roo',\n displayName: 'Roo Code',\n skillsDir: '.roo/skills',\n globalSkillsDir: join(home, '.roo/skills'),\n detectMarker: '.roo',\n },\n trae: {\n name: 'trae',\n displayName: 'Trae',\n skillsDir: '.trae/skills',\n globalSkillsDir: join(home, '.trae/skills'),\n detectMarker: '.trae',\n },\n 'trae-cn': {\n name: 'trae-cn',\n displayName: 'Trae CN',\n skillsDir: '.trae/skills',\n globalSkillsDir: join(home, '.trae-cn/skills'),\n },\n windsurf: {\n name: 'windsurf',\n displayName: 'Windsurf',\n skillsDir: '.windsurf/skills',\n globalSkillsDir: join(home, '.codeium/windsurf/skills'),\n detectMarker: '.windsurf',\n },\n zencoder: {\n name: 'zencoder',\n displayName: 'Zencoder',\n skillsDir: '.zencoder/skills',\n globalSkillsDir: join(home, '.zencoder/skills'),\n detectMarker: '.zencoder',\n },\n neovate: {\n name: 'neovate',\n displayName: 'Neovate',\n skillsDir: '.neovate/skills',\n globalSkillsDir: join(home, '.neovate/skills'),\n detectMarker: '.neovate',\n },\n pochi: {\n name: 'pochi',\n displayName: 'Pochi',\n skillsDir: '.pochi/skills',\n globalSkillsDir: join(home, '.pochi/skills'),\n detectMarker: '.pochi',\n },\n adal: {\n name: 'adal',\n displayName: 'AdaL',\n skillsDir: '.adal/skills',\n globalSkillsDir: join(home, '.adal/skills'),\n detectMarker: '.adal',\n },\n} as const satisfies Record<string, AgentConfig>;\n\nexport type AgentPlatform = keyof typeof AGENTS;\n\n/** Get config for a specific agent */\nexport function getAgentConfig(type: AgentPlatform): AgentConfig {\n return AGENTS[type];\n}\n\n/** List all supported platform keys */\nexport function getSupportedPlatforms(): AgentPlatform[] {\n return Object.keys(AGENTS) as AgentPlatform[];\n}\n\n/** Detect current platform by checking cwd for directory markers */\nexport function detectPlatform(cwd: string): AgentPlatform {\n for (const [key, config] of Object.entries(AGENTS) as Array<[AgentPlatform, AgentConfig]>) {\n if (config.detectMarker && existsSync(join(cwd, config.detectMarker))) {\n return key;\n }\n }\n\n // Fallback: check opencode via global config\n if (existsSync(join(configHome, 'opencode'))) {\n return 'opencode';\n }\n\n return 'claude-code';\n}\n\n/** Get the project-level skills directory name for an agent */\nexport function getAgentSkillsDir(platform: AgentPlatform): string {\n return AGENTS[platform].skillsDir;\n}\n\n/** Get full skill installation path: cwd + skillsDir + skillName */\nexport function getAgentSkillPath(cwd: string, agent: AgentPlatform, name: string): string {\n return join(cwd, AGENTS[agent].skillsDir, name);\n}\n\n/** Get the global skill path: globalSkillsDir + skillName */\nexport function getAgentGlobalSkillPath(agent: AgentPlatform, name: string): string {\n return join(AGENTS[agent].globalSkillsDir, name);\n}\n\n/** Get the agent skills root directory: cwd + skillsDir */\nexport function getAgentSkillsRoot(cwd: string, agent: AgentPlatform): string {\n return join(cwd, AGENTS[agent].skillsDir);\n}\n","import { existsSync } from 'node:fs';\nimport { REGISTRY_PATH } from '../utils/paths.js';\nimport { atomicWriteJson, readJsonSafe } from '../utils/fs-helpers.js';\nimport { RegistryCorruptError } from '../utils/errors.js';\nimport type { Registry, RegistryEntry, RegistryEntryV1, AgentPlatform } from '../types/index.js';\n\n/** Create an empty v2 registry */\nfunction createEmptyRegistry(): Registry {\n return { version: 2, skills: {} };\n}\n\n/** Migrate a v1 entry to v2 format */\nfunction migrateEntryV1(v1: RegistryEntryV1): RegistryEntry {\n return {\n source: v1.source,\n version: v1.version,\n installed_at: v1.installed_at,\n updated_at: v1.updated_at,\n agents: [{\n agent: v1.agent,\n agent_path: v1.agent_path,\n global: v1.agent_path.includes('/.agents/') || v1.agent_path.includes('\\\\.agents\\\\'),\n }],\n env_keys: v1.env_keys,\n capabilities: v1.capabilities,\n canonical_path: v1.canonical_path,\n };\n}\n\n/** Validate and auto-migrate registry */\nfunction validateAndMigrate(data: unknown): Registry | null {\n if (!data || typeof data !== 'object') return null;\n const reg = data as Record<string, unknown>;\n if (typeof reg.skills !== 'object' || reg.skills === null) return null;\n\n // Already v2\n if (reg.version === 2) return data as Registry;\n\n // V1 → V2 migration\n if (reg.version === 1) {\n const v1Skills = reg.skills as Record<string, RegistryEntryV1>;\n const v2Skills: Record<string, RegistryEntry> = {};\n for (const [name, entry] of Object.entries(v1Skills)) {\n v2Skills[name] = migrateEntryV1(entry);\n }\n return { version: 2, skills: v2Skills };\n }\n\n return null;\n}\n\n/** Read the registry, auto-migrating v1 → v2 if needed */\nexport async function readRegistry(): Promise<Registry> {\n if (!existsSync(REGISTRY_PATH)) {\n return createEmptyRegistry();\n }\n\n const data = await readJsonSafe<unknown>(REGISTRY_PATH);\n if (!data) {\n throw new RegistryCorruptError('Failed to parse registry.json');\n }\n\n const registry = validateAndMigrate(data);\n if (!registry) {\n throw new RegistryCorruptError('Invalid registry structure');\n }\n\n // Persist migration if version changed\n if ((data as Record<string, unknown>).version !== registry.version) {\n await atomicWriteJson(REGISTRY_PATH, registry);\n }\n\n return registry;\n}\n\n/**\n * Update or add a skill entry in the registry (atomic write).\n * Merges agents: same agent → replace, new agent → append.\n */\nexport async function updateRegistry(\n skillName: string,\n entry: RegistryEntry,\n): Promise<void> {\n const registry = await readRegistry();\n const existing = registry.skills[skillName];\n\n if (existing) {\n // Merge agents: replace matching, append new\n for (const newAgent of entry.agents) {\n const idx = existing.agents.findIndex(a => a.agent === newAgent.agent);\n if (idx >= 0) {\n existing.agents[idx] = newAgent;\n } else {\n existing.agents.push(newAgent);\n }\n }\n // Update other fields\n existing.source = entry.source;\n existing.version = entry.version;\n existing.updated_at = entry.updated_at;\n existing.env_keys = entry.env_keys;\n existing.capabilities = entry.capabilities;\n existing.canonical_path = entry.canonical_path;\n } else {\n registry.skills[skillName] = entry;\n }\n\n await atomicWriteJson(REGISTRY_PATH, registry);\n}\n\n/** Remove a single agent record from a skill. Removes entire entry if last agent. */\nexport async function removeAgentFromRegistry(\n skillName: string,\n agent: AgentPlatform,\n): Promise<void> {\n const registry = await readRegistry();\n const entry = registry.skills[skillName];\n if (!entry) return;\n\n entry.agents = entry.agents.filter(a => a.agent !== agent);\n if (entry.agents.length === 0) {\n delete registry.skills[skillName];\n }\n await atomicWriteJson(REGISTRY_PATH, registry);\n}\n\n/** Remove a skill entirely from the registry */\nexport async function removeFromRegistry(skillName: string): Promise<void> {\n const registry = await readRegistry();\n delete registry.skills[skillName];\n await atomicWriteJson(REGISTRY_PATH, registry);\n}\n\n/** List all registered skills */\nexport async function listRegistry(): Promise<Record<string, RegistryEntry>> {\n const registry = await readRegistry();\n return registry.skills;\n}\n\n/** Get a single registry entry */\nexport async function getRegistryEntry(skillName: string): Promise<RegistryEntry | null> {\n const registry = await readRegistry();\n return registry.skills[skillName] ?? null;\n}\n","import { installSkill } from '../core/installer.js';\nimport { cloneRepo, parseSource } from '../core/git-source.js';\nimport { findAllSkillDirectories, readSkillMd } from '../core/skill-parser.js';\nimport { SkillNotFoundError } from '../utils/errors.js';\nimport * as logger from '../utils/logger.js';\nimport type { SkillSource, AgentPlatform } from '../types/index.js';\nimport { existsSync } from 'node:fs';\nimport { basename, join } from 'node:path';\n\nexport interface AddFlags {\n global: boolean;\n agent: string[];\n skill: string[];\n yes: boolean;\n list: boolean;\n all: boolean;\n fullDepth: boolean;\n copy: boolean;\n force: boolean;\n help: boolean;\n}\n\n/**\n * Parse POSIX-style flags for the add command.\n * Supports: -g/--global, -a/--agent, -s/--skill, -y/--yes,\n * -l/--list, --all, --full-depth, --copy, --force\n */\nexport function parseAddFlags(args: string[]): { source: string | null; flags: AddFlags } {\n const flags: AddFlags = {\n global: false,\n agent: [],\n skill: [],\n yes: false,\n list: false,\n all: false,\n fullDepth: false,\n copy: false,\n force: false,\n help: false,\n };\n\n let source: string | null = null;\n let i = 0;\n\n while (i < args.length) {\n const arg = args[i];\n\n // Long flags with = syntax (backward compat: --agent=claude-code)\n if (arg.startsWith('--') && arg.includes('=')) {\n const eqIdx = arg.indexOf('=');\n const key = arg.slice(2, eqIdx);\n const val = arg.slice(eqIdx + 1);\n switch (key) {\n case 'agent': flags.agent.push(val); break;\n case 'skill': flags.skill.push(val); break;\n default:\n throw new Error(`Unknown option: --${key}`);\n }\n i++;\n continue;\n }\n\n switch (arg) {\n case '-h':\n case '--help':\n flags.help = true;\n i++;\n break;\n\n case '-g':\n case '--global':\n flags.global = true;\n i++;\n break;\n\n case '-a':\n case '--agent':\n i++;\n while (i < args.length && !args[i].startsWith('-')) {\n flags.agent.push(args[i]);\n i++;\n }\n break;\n\n case '-s':\n case '--skill':\n i++;\n while (i < args.length && !args[i].startsWith('-')) {\n flags.skill.push(args[i]);\n i++;\n }\n break;\n\n case '-y':\n case '--yes':\n flags.yes = true;\n i++;\n break;\n\n case '-l':\n case '--list':\n flags.list = true;\n i++;\n break;\n\n case '--all':\n flags.all = true;\n i++;\n break;\n\n case '--full-depth':\n flags.fullDepth = true;\n i++;\n break;\n\n case '--copy':\n flags.copy = true;\n i++;\n break;\n\n case '--force':\n flags.force = true;\n i++;\n break;\n\n default:\n // First non-flag argument is the source\n if (!arg.startsWith('-') && source === null) {\n source = arg;\n } else if (arg.startsWith('-')) {\n throw new Error(`Unknown option: ${arg}`);\n }\n i++;\n break;\n }\n }\n\n // --all implies --skill '*' --agent '*' -y\n if (flags.all) {\n if (flags.skill.length === 0) flags.skill.push('*');\n if (flags.agent.length === 0) flags.agent.push('*');\n flags.yes = true;\n }\n\n return { source, flags };\n}\n\nfunction printAddHelp(): void {\n console.log('Usage: skill-master add <source> [options]');\n console.log('');\n console.log('Options:');\n console.log(' -h, --help Show this help message');\n console.log(' -g, --global Install globally (~/.agents/)');\n console.log(' -a, --agent <agents> Target agents (space-separated)');\n console.log(' -s, --skill <skills> Select skills (space-separated)');\n console.log(' -y, --yes Skip confirmations');\n console.log(' -l, --list List available skills without installing');\n console.log(' --all Install all skills to all agents');\n console.log(' --full-depth Search all subdirectories');\n console.log(' --copy Copy instead of symlink');\n console.log(' --force Force reinstall');\n}\n\n/** add command — install skills (compatible with `npx skills add`) */\nexport async function add(args: string[]): Promise<void> {\n if (args.length === 0) {\n printAddHelp();\n process.exit(1);\n }\n\n const { source, flags } = parseAddFlags(args);\n\n if (flags.help) {\n printAddHelp();\n process.exit(0);\n }\n\n if (!source) {\n logger.error('No source specified. Provide a GitHub URL, owner/repo, or local path.');\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Parse source string into structured form\n const parsed = parseSource(source);\n\n // Merge skillFilter from source (e.g. owner/repo@skill) into flags.skill\n if (parsed.skillFilter && !flags.skill.includes(parsed.skillFilter)) {\n flags.skill.push(parsed.skillFilter);\n }\n\n // Resolve source directory\n let sourceDir: string;\n\n if (parsed.type === 'git') {\n logger.step(1, 9, 'Fetching skill source...');\n sourceDir = await cloneRepo(parsed.url!, parsed.ref);\n // Narrow to subpath if specified\n if (parsed.subpath) {\n const sub = join(sourceDir, parsed.subpath);\n if (existsSync(sub)) {\n sourceDir = sub;\n }\n }\n } else {\n sourceDir = parsed.path!;\n if (!existsSync(sourceDir)) {\n throw new SkillNotFoundError(sourceDir);\n }\n }\n\n // Discover all skill directories in the source\n const allSkillDirs = await findAllSkillDirectories(sourceDir, flags.fullDepth);\n if (allSkillDirs.length === 0) {\n throw new SkillNotFoundError(`No SKILL.md found in ${sourceDir}`);\n }\n\n // --list mode: print discovered skills and exit\n if (flags.list) {\n logger.blank();\n logger.tableHeader('Skill', 'Version', 'Description');\n for (const dir of allSkillDirs) {\n const sk = await readSkillMd(dir);\n if (sk) {\n logger.tableRow(\n sk.frontmatter.name,\n sk.frontmatter.version ?? '-',\n sk.frontmatter.description ?? '-',\n );\n }\n }\n logger.blank();\n return;\n }\n\n // Filter by --skill if specified\n let targetDirs = allSkillDirs;\n if (flags.skill.length > 0 && !flags.skill.includes('*')) {\n const requested = new Set(flags.skill.map(s => s.toLowerCase()));\n const filtered: string[] = [];\n\n for (const dir of allSkillDirs) {\n const sk = await readSkillMd(dir);\n if (!sk) continue;\n const name = sk.frontmatter.name.toLowerCase();\n const dirName = basename(dir).toLowerCase();\n if (requested.has(name) || requested.has(dirName)) {\n filtered.push(dir);\n }\n }\n\n if (filtered.length === 0) {\n const available = [];\n for (const dir of allSkillDirs) {\n const sk = await readSkillMd(dir);\n if (sk) available.push(sk.frontmatter.name);\n }\n logger.error(\n `No matching skills found for: ${flags.skill.join(', ')}\\n` +\n ` Available skills: ${available.join(', ')}`\n );\n process.exit(1);\n }\n\n targetDirs = filtered;\n }\n\n // If multiple agents specified, install for each\n const agents = flags.agent.length > 0 ? flags.agent : [undefined];\n\n try {\n for (const dir of targetDirs) {\n for (const agent of agents) {\n await installSkill({\n source: { type: 'local', path: dir },\n agent: agent as AgentPlatform | undefined,\n cwd,\n global: flags.global,\n copy: flags.copy,\n force: flags.force,\n yes: flags.yes,\n });\n }\n }\n } catch (err) {\n logger.error((err as Error).message);\n process.exit(1);\n }\n}\n","import { getRegistryEntry } from '../core/registry.js';\nimport { installSkill } from '../core/installer.js';\nimport { isGitUrl } from '../core/git-source.js';\nimport * as logger from '../utils/logger.js';\nimport { SkillNotFoundError } from '../utils/errors.js';\nimport type { SkillSource } from '../types/index.js';\n\nexport async function update(args: string[]): Promise<void> {\n if (args.length === 0) {\n logger.error('Usage: skill-master update <skill-name> [--force]');\n process.exit(1);\n }\n\n const skillName = args[0];\n const force = args.includes('--force');\n\n try {\n const entry = await getRegistryEntry(skillName);\n if (!entry) {\n throw new SkillNotFoundError(skillName);\n }\n\n logger.info(`Updating skill: ${skillName}`);\n logger.info(`Source: ${entry.source}`);\n\n const source: SkillSource = isGitUrl(entry.source)\n ? { type: 'git', url: entry.source }\n : { type: 'local', path: entry.source };\n\n // Reinstall for each registered agent\n for (const agentRecord of entry.agents) {\n await installSkill({\n source,\n agent: agentRecord.agent,\n cwd: process.cwd(),\n global: agentRecord.global,\n force: true,\n });\n }\n\n logger.success(`Skill \"${skillName}\" updated successfully!`);\n } catch (err) {\n logger.error((err as Error).message);\n process.exit(1);\n }\n}\n","import { getRegistryEntry, removeFromRegistry, removeAgentFromRegistry, listRegistry } from '../core/registry.js';\nimport { removePath } from '../utils/fs-helpers.js';\nimport { getSkillCanonicalPath, getSkillConfigPath, getAgentGlobalSkillPath } from '../utils/paths.js';\nimport * as logger from '../utils/logger.js';\nimport { SkillNotFoundError } from '../utils/errors.js';\nimport type { AgentPlatform } from '../types/index.js';\n\nexport interface RemoveFlags {\n global: boolean;\n agent: string[];\n skill: string[];\n yes: boolean;\n all: boolean;\n purge: boolean;\n help: boolean;\n}\n\n/** Parse POSIX-style flags for the remove command */\nexport function parseRemoveFlags(args: string[]): { names: string[]; flags: RemoveFlags } {\n const flags: RemoveFlags = {\n global: false,\n agent: [],\n skill: [],\n yes: false,\n all: false,\n purge: false,\n help: false,\n };\n\n const names: string[] = [];\n let i = 0;\n\n while (i < args.length) {\n const arg = args[i];\n\n // Long flags with = syntax (backward compat: --agent=claude-code)\n if (arg.startsWith('--') && arg.includes('=')) {\n const eqIdx = arg.indexOf('=');\n const key = arg.slice(2, eqIdx);\n const val = arg.slice(eqIdx + 1);\n switch (key) {\n case 'agent': flags.agent.push(val); break;\n case 'skill': flags.skill.push(val); break;\n default:\n throw new Error(`Unknown option: --${key}`);\n }\n i++;\n continue;\n }\n\n switch (arg) {\n case '-h':\n case '--help':\n flags.help = true;\n i++;\n break;\n\n case '-g':\n case '--global':\n flags.global = true;\n i++;\n break;\n\n case '-a':\n case '--agent':\n i++;\n while (i < args.length && !args[i].startsWith('-')) {\n flags.agent.push(args[i]);\n i++;\n }\n break;\n\n case '-s':\n case '--skill':\n i++;\n while (i < args.length && !args[i].startsWith('-')) {\n flags.skill.push(args[i]);\n i++;\n }\n break;\n\n case '-y':\n case '--yes':\n flags.yes = true;\n i++;\n break;\n\n case '--all':\n flags.all = true;\n i++;\n break;\n\n case '--purge':\n flags.purge = true;\n i++;\n break;\n\n default:\n // Non-flag arguments are skill names (positional)\n if (!arg.startsWith('-')) {\n names.push(arg);\n } else {\n throw new Error(`Unknown option: ${arg}`);\n }\n i++;\n break;\n }\n }\n\n // --all implies removing all skills with -y\n if (flags.all) {\n flags.yes = true;\n }\n\n return { names, flags };\n}\n\nfunction printRemoveHelp(): void {\n console.log('Usage: skill-master remove [skills...] [options]');\n console.log('');\n console.log('Options:');\n console.log(' -h, --help Show this help message');\n console.log(' -g, --global Remove from global (~/.agents/)');\n console.log(' -a, --agent <agents> Target agents (space-separated)');\n console.log(' -s, --skill <skills> Select skills (space-separated)');\n console.log(' -y, --yes Skip confirmations');\n console.log(' --all Remove all skills');\n console.log(' --purge Also remove config data');\n}\n\n/** remove command — remove installed skills */\nexport async function remove(args: string[]): Promise<void> {\n if (args.length === 0) {\n printRemoveHelp();\n process.exit(1);\n }\n\n const { names, flags } = parseRemoveFlags(args);\n\n if (flags.help) {\n printRemoveHelp();\n process.exit(0);\n }\n\n // Determine which skills to remove\n let skillNames: string[];\n if (flags.all) {\n const registry = await listRegistry();\n skillNames = Object.keys(registry);\n } else if (flags.skill.length > 0) {\n skillNames = flags.skill;\n } else {\n skillNames = names;\n }\n\n if (skillNames.length === 0) {\n logger.error('No skills specified. Provide skill names or use --all.');\n process.exit(1);\n }\n\n try {\n for (const skillName of skillNames) {\n const entry = await getRegistryEntry(skillName);\n if (!entry) {\n throw new SkillNotFoundError(skillName);\n }\n\n logger.info(`Removing skill: ${skillName}`);\n\n if (flags.agent.length > 0) {\n // Remove only specified agent(s)\n for (const agentName of flags.agent) {\n const agentRecord = entry.agents.find(a => a.agent === agentName);\n if (!agentRecord) {\n logger.warn(`Agent \"${agentName}\" not found for skill \"${skillName}\"`);\n continue;\n }\n await removePath(agentRecord.agent_path);\n logger.success(`Removed ${agentName} path: ${agentRecord.agent_path}`);\n await removeAgentFromRegistry(skillName, agentName as AgentPlatform);\n }\n\n // Check if all agents removed — if so, clean up canonical\n const updated = await getRegistryEntry(skillName);\n if (!updated) {\n await removePath(entry.canonical_path);\n logger.success(`Removed canonical path: ${entry.canonical_path}`);\n if (flags.purge) {\n await removePath(getSkillConfigPath(skillName));\n logger.success('Purged config directory');\n }\n }\n } else {\n // Remove all agent paths\n for (const agentRecord of entry.agents) {\n await removePath(agentRecord.agent_path);\n logger.success(`Removed ${agentRecord.agent} path: ${agentRecord.agent_path}`);\n }\n\n // Remove canonical directory\n await removePath(entry.canonical_path);\n logger.success(`Removed canonical path: ${entry.canonical_path}`);\n\n // Optionally purge config\n if (flags.purge) {\n await removePath(getSkillConfigPath(skillName));\n logger.success('Purged config directory');\n }\n\n // Remove entire registry entry\n await removeFromRegistry(skillName);\n }\n\n logger.success(`Skill \"${skillName}\" removed successfully!`);\n }\n } catch (err) {\n logger.error((err as Error).message);\n process.exit(1);\n }\n}\n","import { listRegistry } from '../core/registry.js';\nimport { getEnvStatus, setEnvValue, getEnvEditPath } from '../core/env-manager.js';\nimport { getSkillCanonicalPath } from '../utils/paths.js';\nimport * as logger from '../utils/logger.js';\nimport { spawn } from 'node:child_process';\n\nexport async function env(args: string[]): Promise<void> {\n const subcommand = args[0];\n\n if (!subcommand || subcommand === 'list') {\n await envList();\n } else if (subcommand === 'set') {\n await envSet(args.slice(1));\n } else if (subcommand === 'edit') {\n await envEdit(args.slice(1));\n } else {\n logger.error('Usage: skill-master env <list|set|edit>');\n process.exit(1);\n }\n}\n\nasync function envList(): Promise<void> {\n const skills = await listRegistry();\n const entries = Object.entries(skills);\n\n if (entries.length === 0) {\n logger.info('No skills installed');\n return;\n }\n\n logger.blank();\n logger.tableHeader('Skill', 'Status', 'Keys');\n\n for (const [name, entry] of entries) {\n const status = await getEnvStatus(name, entry.env_keys);\n const statusIcon = status === 'configured' ? '✓' : status === 'partial' ? '⚠' : '✗';\n logger.tableRow(name, `${statusIcon} ${status}`, entry.env_keys.join(', '));\n }\n logger.blank();\n}\n\nasync function envSet(args: string[]): Promise<void> {\n if (args.length < 2) {\n logger.error('Usage: skill-master env set <skill> KEY=VALUE');\n process.exit(1);\n }\n\n const skillName = args[0];\n const [key, value] = args[1].split('=');\n\n if (!key || !value) {\n logger.error('Invalid format. Use: KEY=VALUE');\n process.exit(1);\n }\n\n try {\n const skillDir = getSkillCanonicalPath(skillName);\n await setEnvValue(skillName, key, value, skillDir);\n logger.success(`Set ${key} for ${skillName}`);\n } catch (err) {\n logger.error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function envEdit(args: string[]): Promise<void> {\n if (args.length === 0) {\n logger.error('Usage: skill-master env edit <skill>');\n process.exit(1);\n }\n\n const skillName = args[0];\n const envPath = getEnvEditPath(skillName);\n const editor = process.env.EDITOR || 'vi';\n\n logger.info(`Opening ${envPath} with ${editor}...`);\n\n const child = spawn(editor, [envPath], {\n stdio: 'inherit',\n shell: true,\n });\n\n child.on('exit', (code) => {\n if (code === 0) {\n logger.success('Saved');\n } else {\n logger.error('Editor exited with error');\n process.exit(1);\n }\n });\n}\n","import { listRegistry } from '../core/registry.js';\nimport * as logger from '../utils/logger.js';\n\nexport interface ListFlags {\n global: boolean;\n agent: string[];\n}\n\n/** Parse flags for the list command */\nexport function parseListFlags(args: string[]): ListFlags {\n const flags: ListFlags = {\n global: false,\n agent: [],\n };\n\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n\n if (arg.startsWith('--') && arg.includes('=')) {\n const eqIdx = arg.indexOf('=');\n const key = arg.slice(2, eqIdx);\n const val = arg.slice(eqIdx + 1);\n if (key === 'agent') flags.agent.push(val);\n i++;\n continue;\n }\n\n switch (arg) {\n case '-g':\n case '--global':\n flags.global = true;\n i++;\n break;\n case '-a':\n case '--agent':\n i++;\n while (i < args.length && !args[i].startsWith('-')) {\n flags.agent.push(args[i]);\n i++;\n }\n break;\n default:\n i++;\n break;\n }\n }\n\n return flags;\n}\n\n/** list command — list installed skills */\nexport async function list(args: string[] = []): Promise<void> {\n const flags = parseListFlags(args);\n const skills = await listRegistry();\n let entries = Object.entries(skills);\n\n // Filter by agent if specified\n if (flags.agent.length > 0) {\n entries = entries.filter(([, entry]) =>\n entry.agents.some(a => flags.agent.includes(a.agent))\n );\n }\n\n if (entries.length === 0) {\n logger.info('No skills installed');\n return;\n }\n\n logger.blank();\n logger.tableHeader('Skill', 'Version', 'Platform(s)', 'Installed');\n\n for (const [name, entry] of entries) {\n const date = new Date(entry.installed_at).toLocaleDateString();\n const platforms = entry.agents.map(a => a.agent).join(', ');\n logger.tableRow(name, entry.version ?? '-', platforms, date);\n }\n logger.blank();\n}\n","import { getRegistryEntry } from '../core/registry.js';\nimport { getEnvStatus } from '../core/env-manager.js';\nimport * as logger from '../utils/logger.js';\nimport { SkillNotFoundError } from '../utils/errors.js';\n\nexport async function info(args: string[]): Promise<void> {\n if (args.length === 0) {\n logger.error('Usage: skill-master info <skill-name>');\n process.exit(1);\n }\n\n const skillName = args[0];\n\n try {\n const entry = await getRegistryEntry(skillName);\n if (!entry) {\n throw new SkillNotFoundError(skillName);\n }\n\n const envStatus = await getEnvStatus(skillName, entry.env_keys);\n\n logger.blank();\n logger.info(`Skill: ${skillName}`);\n logger.kv('Version', entry.version ?? '-');\n logger.kv('Platform(s)', entry.agents.map(a => a.agent).join(', '));\n logger.kv('Source', entry.source);\n logger.kv('Installed', new Date(entry.installed_at).toLocaleString());\n logger.kv('Updated', new Date(entry.updated_at).toLocaleString());\n logger.kv('Canonical Path', entry.canonical_path);\n\n // Show all agent paths\n for (const a of entry.agents) {\n logger.kv(` ${a.agent} Path`, `${a.agent_path}${a.global ? ' (global)' : ''}`);\n }\n\n logger.kv('Capabilities', entry.capabilities.join(', '));\n logger.kv('Env Keys', entry.env_keys.join(', ') || 'none');\n logger.kv('Env Status', envStatus);\n logger.blank();\n } catch (err) {\n logger.error((err as Error).message);\n process.exit(1);\n }\n}\n","import { existsSync } from 'node:fs';\nimport { listRegistry } from '../core/registry.js';\nimport { getEnvStatus } from '../core/env-manager.js';\nimport { isSymlink } from '../utils/fs-helpers.js';\nimport { AGENTS_HOME, CONFIG_DIR, SKILLS_DIR, REGISTRY_PATH } from '../utils/paths.js';\nimport * as logger from '../utils/logger.js';\n\nexport async function doctor(): Promise<void> {\n logger.blank();\n logger.info('Running diagnostics...');\n logger.blank();\n\n let issues = 0;\n\n // Check directory structure\n logger.info('Checking directory structure...');\n const dirs = [AGENTS_HOME, CONFIG_DIR, SKILLS_DIR];\n for (const dir of dirs) {\n if (existsSync(dir)) {\n logger.success(`✓ ${dir}`);\n } else {\n logger.warn(`✗ ${dir} (missing)`);\n issues++;\n }\n }\n logger.blank();\n\n // Check registry\n logger.info('Checking registry...');\n if (existsSync(REGISTRY_PATH)) {\n logger.success(`✓ ${REGISTRY_PATH}`);\n try {\n const skills = await listRegistry();\n logger.info(` Found ${Object.keys(skills).length} skill(s)`);\n } catch (err) {\n logger.error(`✗ Registry corrupted: ${(err as Error).message}`);\n issues++;\n }\n } else {\n logger.info(` No registry found (will be created on first install)`);\n }\n logger.blank();\n\n // Check each skill\n logger.info('Checking installed skills...');\n try {\n const skills = await listRegistry();\n for (const [name, entry] of Object.entries(skills)) {\n logger.info(`Skill: ${name}`);\n\n // Check canonical path\n if (existsSync(entry.canonical_path)) {\n logger.success(` ✓ Canonical path exists`);\n } else {\n logger.error(` ✗ Canonical path missing: ${entry.canonical_path}`);\n issues++;\n }\n\n // Check each agent path\n for (const agentRecord of entry.agents) {\n if (existsSync(agentRecord.agent_path)) {\n const isLink = await isSymlink(agentRecord.agent_path);\n logger.success(` ✓ ${agentRecord.agent} path exists (${isLink ? 'symlink' : 'copy'}${agentRecord.global ? ', global' : ''})`);\n } else {\n logger.error(` ✗ ${agentRecord.agent} path missing: ${agentRecord.agent_path}`);\n issues++;\n }\n }\n\n // Check env status\n const envStatus = await getEnvStatus(name, entry.env_keys);\n if (envStatus === 'configured') {\n logger.success(` ✓ Environment configured`);\n } else if (envStatus === 'partial') {\n logger.warn(` ⚠ Environment partially configured`);\n } else if (entry.env_keys.length > 0) {\n logger.warn(` ⚠ Environment not configured`);\n }\n }\n } catch (err) {\n logger.error(`Failed to check skills: ${(err as Error).message}`);\n issues++;\n }\n\n logger.blank();\n if (issues === 0) {\n logger.success('All checks passed!');\n } else {\n logger.warn(`Found ${issues} issue(s)`);\n }\n logger.blank();\n}\n","import * as logger from '../utils/logger.js';\n\n/** find command — search for skills from the registry */\nexport async function find(args: string[]): Promise<void> {\n const query = args.filter(a => !a.startsWith('-')).join(' ').trim();\n\n if (!query) {\n console.log('Usage: skill-master find <query>');\n console.log('');\n console.log('Search for skills in the online registry.');\n console.log('');\n console.log('Examples:');\n console.log(' skill-master find git');\n console.log(' skill-master find \"code review\"');\n process.exit(0);\n }\n\n logger.info(`Searching for \"${query}\"...`);\n\n try {\n const url = `https://skills.sh/api/search?q=${encodeURIComponent(query)}`;\n const response = await fetch(url, {\n headers: { 'Accept': 'application/json' },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!response.ok) {\n logger.error(`Search API returned ${response.status}: ${response.statusText}`);\n process.exit(1);\n }\n\n const data = await response.json() as SearchResult[];\n\n if (!Array.isArray(data) || data.length === 0) {\n logger.info('No skills found matching your query.');\n return;\n }\n\n logger.blank();\n logger.tableHeader('Name', 'Source', 'Installs');\n\n for (const item of data) {\n logger.tableRow(\n item.name ?? '—',\n item.source ?? '—',\n String(item.installs ?? 0),\n );\n }\n logger.blank();\n } catch (err) {\n if ((err as Error).name === 'TimeoutError') {\n logger.error('Search request timed out. Please try again.');\n } else {\n logger.error(`Search failed: ${(err as Error).message}`);\n }\n process.exit(1);\n }\n}\n\ninterface SearchResult {\n name?: string;\n source?: string;\n installs?: number;\n}\n","import { existsSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { ensureDir, writeText } from '../utils/fs-helpers.js';\nimport * as logger from '../utils/logger.js';\n\nconst SKILL_MD_TEMPLATE = `---\nname: {{NAME}}\nversion: 0.1.0\nauthor: \"\"\ndescription: \"\"\nallowed-tools:\n - Read\n - Edit\n - Write\n - Bash\n - Glob\n - Grep\nuser-invocable: true\n---\n\n# {{NAME}}\n\n<!-- Describe what this skill does -->\n`;\n\n/** init command — create a new skill template */\nexport async function init(args: string[]): Promise<void> {\n const nameArg = args.filter(a => !a.startsWith('-'))[0];\n const cwd = process.cwd();\n\n let targetDir: string;\n let skillName: string;\n\n if (nameArg) {\n targetDir = join(cwd, nameArg);\n skillName = nameArg;\n } else {\n targetDir = cwd;\n skillName = basename(cwd);\n }\n\n const skillMdPath = join(targetDir, 'SKILL.md');\n\n if (existsSync(skillMdPath)) {\n logger.error(`SKILL.md already exists at ${skillMdPath}`);\n process.exit(1);\n }\n\n await ensureDir(targetDir);\n\n const content = SKILL_MD_TEMPLATE\n .replace(/\\{\\{NAME\\}\\}/g, skillName);\n\n await writeText(skillMdPath, content);\n logger.success(`Created ${skillMdPath}`);\n logger.info(`Edit the file to configure your skill.`);\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { listRegistry } from '../core/registry.js';\nimport { isGitUrl, parseGitUrl } from '../core/git-source.js';\nimport * as logger from '../utils/logger.js';\n\nconst execFileAsync = promisify(execFile);\n\n/** check command — check for skill updates */\nexport async function check(_args: string[]): Promise<void> {\n const skills = await listRegistry();\n const entries = Object.entries(skills);\n\n if (entries.length === 0) {\n logger.info('No skills installed');\n return;\n }\n\n logger.info('Checking for updates...');\n logger.blank();\n\n let updatable = 0;\n\n for (const [name, entry] of entries) {\n if (!isGitUrl(entry.source)) {\n logger.info(`${name}: local source — skipped`);\n continue;\n }\n\n // Skip version check for skills without version info\n if (!entry.version) {\n logger.info(`${name}: no version info — skipped`);\n continue;\n }\n\n try {\n const remoteHead = await getRemoteHead(entry.source);\n if (!remoteHead) {\n logger.warn(`${name}: unable to query remote`);\n continue;\n }\n\n // Compare with installed version (stored as git short hash or semver)\n // If version differs from remote HEAD, an update is available\n const isUpToDate = entry.version === remoteHead.slice(0, entry.version.length);\n if (isUpToDate) {\n logger.success(`${name}: up to date (${entry.version})`);\n } else {\n logger.warn(`${name}: update available (${entry.version} → ${remoteHead.slice(0, 7)})`);\n updatable++;\n }\n } catch {\n logger.warn(`${name}: failed to check remote`);\n }\n }\n\n logger.blank();\n if (updatable === 0) {\n logger.success('All skills are up to date!');\n } else {\n logger.info(`${updatable} skill(s) can be updated. Run \"skill-master update <name>\" to update.`);\n }\n}\n\n/** Get the latest commit hash from a remote git repo */\nasync function getRemoteHead(source: string): Promise<string | null> {\n try {\n const { owner, repo } = parseGitUrl(source);\n const url = `https://github.com/${owner}/${repo}.git`;\n const { stdout } = await execFileAsync('git', ['ls-remote', url, 'HEAD'], {\n timeout: 15_000,\n });\n const match = stdout.trim().split(/\\s+/)[0];\n return match || null;\n } catch {\n return null;\n }\n}\n","#!/usr/bin/env node\n\nimport { add } from './commands/add.js';\nimport { update } from './commands/update.js';\nimport { remove } from './commands/remove.js';\nimport { env } from './commands/env.js';\nimport { list } from './commands/list.js';\nimport { info } from './commands/info.js';\nimport { doctor } from './commands/doctor.js';\nimport { find } from './commands/find.js';\nimport { init } from './commands/init.js';\nimport { check } from './commands/check.js';\nimport * as logger from './utils/logger.js';\n\nconst VERSION = '0.1.0';\n\nconst HELP = `\nskill-master v${VERSION}\n\nUsage:\n skill-master add <source> [options] Install skills (aliases: install, a, i)\n skill-master remove [skills...] [opts] Remove skills (aliases: rm, r)\n skill-master list [options] List installed skills (alias: ls)\n skill-master find [query] Search for skills (aliases: search, f, s)\n skill-master update [skill] Update skills (alias: upgrade)\n skill-master init [name] Create a new skill template\n skill-master check Check for skill updates\n skill-master env <list|set|edit> Manage environment variables\n skill-master info <skill-name> Show skill details\n skill-master doctor Run diagnostics\n\nAdd Options:\n -g, --global Install globally (~/.agents/)\n -a, --agent <agents> Target agents (space-separated)\n -s, --skill <skills> Select skills (space-separated)\n -y, --yes Skip confirmations\n -l, --list List available skills without installing\n --all Install all skills to all agents\n --full-depth Search all subdirectories\n --copy Copy instead of symlink\n --force Force reinstall\n\nExamples:\n skill-master add owner/repo\n skill-master add https://github.com/user/skill -a claude-code cursor -y\n skill-master add ./local-skill --agent=cursor --copy\n skill-master remove my-skill --purge\n skill-master find \"code review\"\n skill-master init my-new-skill\n skill-master check\n`;\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {\n console.log(HELP);\n process.exit(0);\n }\n\n if (args[0] === '--version' || args[0] === '-v') {\n console.log(VERSION);\n process.exit(0);\n }\n\n const command = args[0];\n const commandArgs = args.slice(1);\n\n try {\n switch (command) {\n // add (primary) with aliases: install, a, i\n case 'add':\n case 'a':\n case 'install':\n case 'i':\n await add(commandArgs);\n break;\n\n // remove with aliases: rm, r\n case 'remove':\n case 'rm':\n case 'r':\n await remove(commandArgs);\n break;\n\n // list with alias: ls\n case 'list':\n case 'ls':\n await list(commandArgs);\n break;\n\n // find with aliases: search, f, s\n case 'find':\n case 'search':\n case 'f':\n case 's':\n await find(commandArgs);\n break;\n\n // update with alias: upgrade\n case 'update':\n case 'upgrade':\n await update(commandArgs);\n break;\n\n // init\n case 'init':\n await init(commandArgs);\n break;\n\n // check\n case 'check':\n await check(commandArgs);\n break;\n\n // env, info, doctor — skill-master extensions\n case 'env':\n await env(commandArgs);\n break;\n case 'info':\n await info(commandArgs);\n break;\n case 'doctor':\n await doctor();\n break;\n\n default:\n logger.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exit(1);\n }\n } catch (err) {\n logger.error((err as Error).message);\n if (process.env.DEBUG) {\n console.error(err);\n }\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["join","existsSync","existsSync","existsSync","join","existsSync","results","existsSync","join","join","homedir","join","existsSync","join","existsSync","join","join","join","homedir","join","existsSync","existsSync","existsSync","join","existsSync","basename","join","info","existsSync","existsSync","existsSync","join","basename","join","basename","existsSync","execFile","promisify","execFileAsync","promisify","execFile","info"]}
1
+ {"version":3,"sources":["../src/core/installer.ts","../src/core/git-source.ts","../src/utils/fs-helpers.ts","../src/utils/errors.ts","../src/utils/logger.ts","../src/core/skill-parser.ts","../src/core/plugin-manifest.ts","../src/core/env-manager.ts","../src/utils/paths.ts","../src/platform/agents.ts","../src/core/registry.ts","../src/core/local-lock.ts","../src/commands/add.ts","../src/commands/update.ts","../src/commands/remove.ts","../src/commands/env.ts","../src/commands/list.ts","../src/commands/info.ts","../src/commands/doctor.ts","../src/commands/find.ts","../src/commands/init.ts","../src/commands/check.ts","../src/commands/sync.ts","../src/commands/restore.ts","../src/cli.ts"],"sourcesContent":["import { join, resolve, relative } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { cloneRepo, isGitUrl, isLocalPath } from './git-source.js';\nimport { findSkillDirectory, readSkillMd, inferCapabilities, extractEnvKeys } from './skill-parser.js';\nimport { backupEnv, restoreEnv } from './env-manager.js';\nimport { updateRegistry } from './registry.js';\nimport { detectPlatform, getAgentSkillsDir, isUniversalAgent } from '../platform/detector.js';\nimport { copyDir, removePath, symlinkOrCopy, ensureDir, readTextSafe } from '../utils/fs-helpers.js';\nimport { getSkillCanonicalPath, getAgentSkillPath, getAgentGlobalSkillPath, SKILLS_DIR } from '../utils/paths.js';\nimport * as logger from '../utils/logger.js';\nimport { SkillNotFoundError, SkillParseError } from '../utils/errors.js';\nimport type { InstallOptions, RegistryEntry, AgentInstall, InstallResult, InstallMode } from '../types/index.js';\n\nconst TOTAL_STEPS = 9;\n\n/** Sanitize a skill name — strip path traversal and only allow [a-zA-Z0-9_.-] */\nexport function sanitizeName(name: string): string {\n // Remove path traversal sequences first, then filter characters\n let sanitized = name.replace(/\\.\\./g, '').replace(/[^a-zA-Z0-9_.-]/g, '');\n // Strip leading dots to prevent '.' or '.hidden' directory issues\n sanitized = sanitized.replace(/^\\.+/, '');\n return sanitized;\n}\n\n/** Verify that a resolved path stays within the expected base directory */\nexport function isPathSafe(targetPath: string, baseDir: string): boolean {\n const rel = relative(resolve(baseDir), resolve(targetPath));\n // Unsafe if: empty (same as base), starts with '..', or is absolute (Windows drive letter)\n if (!rel || rel === '.') return false;\n return !rel.startsWith('..') && !resolve(rel).includes('..');\n}\n\n/**\n * Main installation engine — 9-step process:\n * 1. fetchSource → clone/copy to temp\n * 2. findSkillDir → locate SKILL.md\n * 3. parseSkillMd → parse frontmatter\n * 4. detectAgent → determine target platform\n * 5. backupEnv → preserve existing .env\n * 6. cleanAndInstall → rm old → copy new to canonical\n * 7. restoreEnv → restore .env to both locations\n * 8. linkOrCopy → symlink/copy to agent dir\n * 9. updateRegistry → update registry.json\n */\nexport async function installSkill(options: InstallOptions): Promise<InstallResult> {\n const { source, cwd, copy = false, force = false, global: isGlobal = false } = options;\n\n // Step 1: Fetch source\n logger.step(1, TOTAL_STEPS, 'Fetching skill source...');\n let sourceDir: string;\n\n if (source.type === 'git') {\n // If localPath is provided (pre-cloned), use it directly\n sourceDir = source.localPath ?? await cloneRepo(source.url!, source.branch);\n } else if (source.type === 'local') {\n sourceDir = source.path!;\n if (!existsSync(sourceDir)) {\n throw new SkillNotFoundError(sourceDir);\n }\n } else {\n throw new SkillParseError('Invalid source type');\n }\n\n // Step 2: Find skill directory\n logger.step(2, TOTAL_STEPS, 'Locating SKILL.md...');\n const skillDir = await findSkillDirectory(sourceDir);\n if (!skillDir) {\n throw new SkillNotFoundError(`No SKILL.md found in ${sourceDir}`);\n }\n\n // Step 3: Parse SKILL.md\n logger.step(3, TOTAL_STEPS, 'Parsing SKILL.md...');\n const parsed = await readSkillMd(skillDir);\n if (!parsed) {\n throw new SkillParseError('Failed to read SKILL.md');\n }\n const skillName = sanitizeName(parsed.frontmatter.name);\n if (!skillName) {\n throw new SkillParseError('Skill name is empty after sanitization');\n }\n logger.info(`Found skill: ${skillName}${parsed.frontmatter.version ? ` v${parsed.frontmatter.version}` : ''}`);\n\n // Step 4: Detect agent platform\n logger.step(4, TOTAL_STEPS, 'Detecting agent platform...');\n const agent = options.agent ?? detectPlatform(cwd);\n logger.info(`Target platform: ${agent}`);\n\n // Step 5: Backup existing .env\n logger.step(5, TOTAL_STEPS, 'Backing up .env...');\n const agentSkillDir = isGlobal\n ? getAgentGlobalSkillPath(agent, skillName)\n : getAgentSkillPath(cwd, agent, skillName);\n const envBackup = await backupEnv(skillName, agentSkillDir);\n if (envBackup) {\n logger.success(`Backed up ${Object.keys(envBackup).length} env key(s)`);\n } else {\n logger.info('No existing .env found');\n }\n\n // Step 6: Clean and install to canonical path\n logger.step(6, TOTAL_STEPS, 'Installing to canonical path...');\n const canonicalPath = getSkillCanonicalPath(skillName);\n\n // Safety check: ensure canonical path is within the skills directory\n if (!isPathSafe(canonicalPath, SKILLS_DIR)) {\n throw new SkillParseError(`Unsafe canonical path: ${canonicalPath}`);\n }\n\n if (existsSync(canonicalPath) && !force) {\n logger.info('Replacing existing installation');\n }\n await removePath(canonicalPath);\n await copyDir(skillDir, canonicalPath);\n logger.success(`Installed to ${canonicalPath}`);\n\n // Step 7: Restore .env\n logger.step(7, TOTAL_STEPS, 'Restoring .env...');\n if (envBackup) {\n await restoreEnv(skillName, envBackup, canonicalPath);\n logger.success('.env restored successfully');\n } else {\n // Check if there's a .env.example to hint about\n const examplePath = join(canonicalPath, '.env.example');\n if (existsSync(examplePath)) {\n logger.warn('Found .env.example — run `skill-master env edit ' + skillName + '` to configure');\n }\n }\n\n // Step 8: Link or copy to agent directory\n logger.step(8, TOTAL_STEPS, `Linking to ${agent} skills directory...`);\n const agentPath = isGlobal\n ? getAgentGlobalSkillPath(agent, skillName)\n : getAgentSkillPath(cwd, agent, skillName);\n\n let installMode: InstallMode;\n // Universal agents in global mode: canonical path IS the agent path, skip symlink\n if (isGlobal && isUniversalAgent(agent) && canonicalPath === agentPath) {\n installMode = 'copy';\n logger.success(`Canonical path is agent path (universal agent): ${agentPath}`);\n } else {\n const linkType = await symlinkOrCopy(canonicalPath, agentPath, copy);\n installMode = linkType;\n logger.success(`${linkType === 'symlink' ? 'Symlinked' : 'Copied'} to ${agentPath}`);\n }\n\n // Step 9: Update registry\n logger.step(9, TOTAL_STEPS, 'Updating registry...');\n const capabilities = parsed.frontmatter.capabilities ?? inferCapabilities(parsed.frontmatter['allowed-tools'] ?? []);\n\n // Extract env keys from .env.example\n const envExampleContent = await readTextSafe(join(canonicalPath, '.env.example'));\n const envKeys = envExampleContent ? extractEnvKeys(envExampleContent) : [];\n\n const now = new Date().toISOString();\n const agentInstall: AgentInstall = {\n agent,\n agent_path: agentPath,\n global: isGlobal,\n };\n const entry: RegistryEntry = {\n source: source.type === 'git' ? source.url! : source.path!,\n version: parsed.frontmatter.version,\n installed_at: now,\n updated_at: now,\n agents: [agentInstall],\n env_keys: envKeys,\n capabilities,\n canonical_path: canonicalPath,\n };\n\n await updateRegistry(skillName, entry);\n logger.blank();\n logger.success(`Skill \"${skillName}\" installed successfully!`);\n\n return {\n skillName,\n version: parsed.frontmatter.version,\n canonicalPath,\n agentPath,\n installMode,\n };\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { existsSync } from 'node:fs';\nimport { ensureDir, createTempDir } from '../utils/fs-helpers.js';\nimport { GitCloneError, SourceParseError } from '../utils/errors.js';\nimport * as logger from '../utils/logger.js';\nimport type { ParsedSource } from '../types/index.js';\n\nconst execFileAsync = promisify(execFile);\n\n/**\n * Parse a source string into a structured ParsedSource.\n * Supports:\n * - owner/repo → git\n * - owner/repo@skill → git + skillFilter\n * - owner/repo/sub/path → git + subpath\n * - github.com/o/r/tree/<ref>/<subpath> → git + ref + subpath\n * - github.com/o/r/blob/<ref>/<path> → git + ref + subpath (parent dir)\n * - gitlab.com/o/r/-/tree/<ref>/<subpath> → git + ref + subpath\n * - Full URLs (https/git@/git://) → git\n * - Local paths → local\n */\nexport function parseSource(source: string): ParsedSource {\n // git@ or git:// protocols\n if (source.startsWith('git@') || source.startsWith('git://')) {\n return { type: 'git', url: source };\n }\n\n // Full HTTP(S) URLs\n if (source.startsWith('https://') || source.startsWith('http://')) {\n // GitHub tree URL: github.com/o/r/tree/<ref>/<subpath>\n const ghTree = source.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/([^/]+)(?:\\/(.+))?/);\n if (ghTree) {\n const url = `https://github.com/${ghTree[1]}/${ghTree[2]}.git`;\n return { type: 'git', url, ref: ghTree[3], subpath: ghTree[4] };\n }\n\n // GitHub blob URL: github.com/o/r/blob/<ref>/<path> → parent dir as subpath\n const ghBlob = source.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/blob\\/([^/]+)\\/(.+)/);\n if (ghBlob) {\n const url = `https://github.com/${ghBlob[1]}/${ghBlob[2]}.git`;\n const filePath = ghBlob[4];\n const subpath = filePath.includes('/') ? filePath.slice(0, filePath.lastIndexOf('/')) : undefined;\n return { type: 'git', url, ref: ghBlob[3], subpath };\n }\n\n // GitLab tree URL: gitlab.com/o/r/-/tree/<ref>/<subpath>\n const glTree = source.match(/gitlab\\.com\\/([^/]+)\\/([^/]+)\\/-\\/tree\\/([^/]+)(?:\\/(.+))?/);\n if (glTree) {\n const url = `https://gitlab.com/${glTree[1]}/${glTree[2]}.git`;\n return { type: 'git', url, ref: glTree[3], subpath: glTree[4] };\n }\n\n // Plain github.com or gitlab.com URL\n if (source.includes('github.com/') || source.includes('gitlab.com/')) {\n return { type: 'git', url: source };\n }\n\n // Other https URLs — treat as git\n return { type: 'git', url: source };\n }\n\n // Contains github.com or gitlab.com without protocol\n if (source.includes('github.com/') || source.includes('gitlab.com/')) {\n return parseSource('https://' + source);\n }\n\n // Local path — exists on filesystem\n if (existsSync(source) || source.startsWith('/') || source.startsWith('./') || source.startsWith('../')) {\n return { type: 'local', path: source };\n }\n\n // Shorthand: extract @skill filter first\n let skillFilter: string | undefined;\n let shorthand = source;\n const atIdx = shorthand.indexOf('@');\n if (atIdx > 0 && !shorthand.includes('/') === false) {\n // Could be owner/repo@skill or owner/repo/path@skill\n // Only treat as skillFilter if @ is after the repo part\n const lastAt = shorthand.lastIndexOf('@');\n if (lastAt > 0) {\n const afterAt = shorthand.slice(lastAt + 1);\n const beforeAt = shorthand.slice(0, lastAt);\n // If afterAt has no slashes, it's a skill filter\n if (afterAt && !afterAt.includes('/')) {\n skillFilter = afterAt;\n shorthand = beforeAt;\n }\n }\n }\n\n // owner/repo (exactly 2 segments)\n if (/^[a-zA-Z0-9_.-]+\\/[a-zA-Z0-9_.-]+$/.test(shorthand)) {\n return {\n type: 'git',\n url: `https://github.com/${shorthand}.git`,\n skillFilter,\n };\n }\n\n // owner/repo/sub/path (3+ segments, first two are owner/repo)\n const segments = shorthand.split('/');\n if (segments.length >= 3 && /^[a-zA-Z0-9_.-]+$/.test(segments[0]) && /^[a-zA-Z0-9_.-]+$/.test(segments[1])) {\n const owner = segments[0];\n const repo = segments[1];\n const subpath = segments.slice(2).join('/');\n return {\n type: 'git',\n url: `https://github.com/${owner}/${repo}.git`,\n subpath,\n skillFilter,\n };\n }\n\n throw new SourceParseError(source, 'Unable to determine source type');\n}\n\n/** Check if a string looks like a git URL or GitHub shorthand */\nexport function isGitUrl(source: string): boolean {\n try {\n return parseSource(source).type === 'git';\n } catch {\n return false;\n }\n}\n\n/** Normalize a source string to a full clone URL */\nexport function normalizeGitUrl(source: string): string {\n const parsed = parseSource(source);\n if (parsed.type !== 'git' || !parsed.url) return source;\n\n let url = parsed.url;\n // Ensure .git suffix for HTTPS URLs\n if (url.startsWith('https://') && !url.endsWith('.git')) {\n url += '.git';\n }\n return url;\n}\n\n/** Parse a GitHub URL into owner and repo */\nexport function parseGitUrl(url: string): { owner: string; repo: string; branch?: string } {\n // Handle tree/branch in URL: github.com/owner/repo/tree/branch\n const treeMatch = url.match(/github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/(.+)/);\n if (treeMatch) {\n return {\n owner: treeMatch[1],\n repo: treeMatch[2].replace(/\\.git$/, ''),\n branch: treeMatch[3],\n };\n }\n\n // Standard URL: github.com/owner/repo\n const match = url.match(/github\\.com[/:]([^/]+)\\/([^/.]+)/);\n if (match) {\n return { owner: match[1], repo: match[2] };\n }\n\n throw new GitCloneError(url, 'Unable to parse GitHub URL');\n}\n\n/** Clone a git repository to a temporary directory */\nexport async function cloneRepo(\n url: string,\n branch?: string,\n): Promise<string> {\n const normalizedUrl = normalizeGitUrl(url);\n const tempDir = createTempDir();\n await ensureDir(tempDir);\n\n const args = ['clone', '--depth', '1'];\n if (branch) {\n args.push('--branch', branch);\n }\n args.push(normalizedUrl, tempDir);\n\n logger.debug(`Cloning ${normalizedUrl} to ${tempDir}`);\n\n try {\n await execFileAsync('git', args, { timeout: 60_000 });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n throw new GitCloneError(url, msg);\n }\n\n return tempDir;\n}\n\n/** Check if a local path exists and contains a skill */\nexport function isLocalPath(source: string): boolean {\n return existsSync(source);\n}","import { mkdir, cp, readFile, writeFile, rename, symlink, lstat, rm } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomBytes } from 'node:crypto';\n\n/** Ensure a directory exists (recursive) */\nexport async function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\n/** Recursively copy a directory */\nexport async function copyDir(src: string, dest: string): Promise<void> {\n await ensureDir(dest);\n await cp(src, dest, { recursive: true, force: true });\n}\n\n/** Remove a directory or file recursively */\nexport async function removePath(target: string): Promise<void> {\n if (existsSync(target)) {\n await rm(target, { recursive: true, force: true });\n }\n}\n\n/** Atomic JSON write: write to .tmp then rename */\nexport async function atomicWriteJson(filePath: string, data: unknown): Promise<void> {\n await ensureDir(dirname(filePath));\n const tmpPath = filePath + '.tmp';\n await writeFile(tmpPath, JSON.stringify(data, null, 2) + '\\n', 'utf-8');\n await rename(tmpPath, filePath);\n}\n\n/** Safely read and parse a JSON file, return null on failure */\nexport async function readJsonSafe<T>(filePath: string): Promise<T | null> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\n/** Read a text file, return null if not found */\nexport async function readTextSafe(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\n/** Write text to a file, ensuring parent directory exists */\nexport async function writeText(filePath: string, content: string): Promise<void> {\n await ensureDir(dirname(filePath));\n await writeFile(filePath, content, 'utf-8');\n}\n\n/** Create a symlink, or copy if symlink fails (Windows fallback) */\nexport async function symlinkOrCopy(target: string, linkPath: string, forceCopy = false): Promise<'symlink' | 'copy'> {\n await ensureDir(dirname(linkPath));\n\n // Remove existing link/dir\n await removePath(linkPath);\n\n if (forceCopy) {\n await copyDir(target, linkPath);\n return 'copy';\n }\n\n try {\n await symlink(target, linkPath, 'dir');\n return 'symlink';\n } catch {\n // Fallback to copy on platforms that don't support symlinks\n await copyDir(target, linkPath);\n return 'copy';\n }\n}\n\n/** Check if a path is a symlink */\nexport async function isSymlink(path: string): Promise<boolean> {\n try {\n const stat = await lstat(path);\n return stat.isSymbolicLink();\n } catch {\n return false;\n }\n}\n\n/** Create a temporary directory with a unique name */\nexport function createTempDir(): string {\n const id = randomBytes(8).toString('hex');\n return join(tmpdir(), `skill-master-${id}`);\n}\n","/** Base error class for skill-master */\nexport class SkillManagerError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'SkillManagerError';\n }\n}\n\n/** Skill not found in registry or filesystem */\nexport class SkillNotFoundError extends SkillManagerError {\n constructor(skillName: string) {\n super(`Skill \"${skillName}\" not found`);\n this.name = 'SkillNotFoundError';\n }\n}\n\n/** Required .env key is missing */\nexport class EnvMissingError extends SkillManagerError {\n constructor(skillName: string, keys: string[]) {\n super(`Skill \"${skillName}\" is missing env keys: ${keys.join(', ')}`);\n this.name = 'EnvMissingError';\n }\n}\n\n/** Registry file is corrupted or invalid */\nexport class RegistryCorruptError extends SkillManagerError {\n constructor(detail?: string) {\n super(`Registry is corrupted${detail ? ': ' + detail : ''}`);\n this.name = 'RegistryCorruptError';\n }\n}\n\n/** Git clone operation failed */\nexport class GitCloneError extends SkillManagerError {\n constructor(url: string, detail?: string) {\n super(`Failed to clone \"${url}\"${detail ? ': ' + detail : ''}`);\n this.name = 'GitCloneError';\n }\n}\n\n/** SKILL.md parsing or validation failed */\nexport class SkillParseError extends SkillManagerError {\n constructor(detail: string) {\n super(`Failed to parse SKILL.md: ${detail}`);\n this.name = 'SkillParseError';\n }\n}\n\n/** Platform detection failed or unsupported */\nexport class PlatformError extends SkillManagerError {\n constructor(detail: string) {\n super(`Platform error: ${detail}`);\n this.name = 'PlatformError';\n }\n}\n\n/** Source string parsing failed */\nexport class SourceParseError extends SkillManagerError {\n constructor(source: string, detail?: string) {\n super(`Failed to parse source \"${source}\"${detail ? ': ' + detail : ''}`);\n this.name = 'SourceParseError';\n }\n}\n","import chalk from 'chalk';\n\nconst PREFIX = chalk.blue('skill-master');\n\n/** Informational message */\nexport function info(msg: string): void {\n console.log(`${PREFIX} ${chalk.cyan('info')} ${msg}`);\n}\n\n/** Success message */\nexport function success(msg: string): void {\n console.log(`${PREFIX} ${chalk.green('✔')} ${msg}`);\n}\n\n/** Warning message */\nexport function warn(msg: string): void {\n console.log(`${PREFIX} ${chalk.yellow('⚠')} ${msg}`);\n}\n\n/** Error message */\nexport function error(msg: string): void {\n console.error(`${PREFIX} ${chalk.red('✖')} ${msg}`);\n}\n\n/** Debug message (only when DEBUG env is set) */\nexport function debug(msg: string): void {\n if (process.env.DEBUG) {\n console.log(`${PREFIX} ${chalk.gray('debug')} ${msg}`);\n }\n}\n\n/** Step indicator with number */\nexport function step(num: number, total: number, msg: string): void {\n const counter = chalk.gray(`[${num}/${total}]`);\n console.log(`${PREFIX} ${counter} ${msg}`);\n}\n\n/** Print a blank line */\nexport function blank(): void {\n console.log();\n}\n\n/** Print a section header (for grouping) */\nexport function section(title: string): void {\n console.log(chalk.bold(title));\n}\n\n/** Print a key-value pair */\nexport function kv(key: string, value: string): void {\n console.log(` ${chalk.gray(key + ':')} ${value}`);\n}\n\n/** Print a table header */\nexport function tableHeader(...cols: string[]): void {\n console.log(chalk.bold(cols.map(c => c.padEnd(20)).join('')));\n console.log(chalk.gray('─'.repeat(cols.length * 20)));\n}\n\n/** Print a table row */\nexport function tableRow(...cols: string[]): void {\n console.log(cols.map(c => c.padEnd(20)).join(''));\n}\n","import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';\nimport { readdir } from 'node:fs/promises';\nimport { join, basename, resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { readTextSafe } from '../utils/fs-helpers.js';\nimport { SkillParseError } from '../utils/errors.js';\nimport { getPluginSkillPaths, getPluginGroupings } from './plugin-manifest.js';\nimport type { ParsedSkill, SkillFrontmatter, Capability } from '../types/index.js';\n\n/** Tool-to-capability reverse mapping for Claude Code tools */\nconst TOOL_CAPABILITY_MAP: Record<string, Capability> = {\n 'Bash': 'shell',\n 'Read': 'read_file',\n 'Write': 'write_file',\n 'Edit': 'edit_file',\n 'Glob': 'find_file',\n 'Grep': 'search_content',\n 'Task': 'sub_task',\n 'WebFetch': 'web_fetch',\n 'WebSearch': 'web_search',\n};\n\n/** Parse a SKILL.md file content into frontmatter + body */\nexport function parseSkillMd(content: string, dirName?: string): ParsedSkill {\n const match = content.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (!match) {\n throw new SkillParseError('No valid frontmatter block found');\n }\n\n const rawFrontmatter = match[1];\n const body = match[2];\n\n let frontmatter: SkillFrontmatter;\n try {\n frontmatter = parseYaml(rawFrontmatter) as SkillFrontmatter;\n } catch (err) {\n throw new SkillParseError(`YAML parse error: ${(err as Error).message}`);\n }\n\n validateFrontmatter(frontmatter);\n\n // Infer name from directory if not provided in frontmatter\n if (!frontmatter.name && dirName) {\n frontmatter.name = dirName;\n }\n\n if (!frontmatter.name) {\n throw new SkillParseError('Missing \"name\" field and unable to infer from directory');\n }\n\n return { frontmatter, body, rawFrontmatter };\n}\n\n/** Validate required frontmatter fields */\nexport function validateFrontmatter(fm: SkillFrontmatter): void {\n if (fm.name !== undefined && typeof fm.name !== 'string') {\n throw new SkillParseError('Invalid \"name\" field — must be a string');\n }\n if (fm.version !== undefined && typeof fm.version !== 'string') {\n throw new SkillParseError('Invalid \"version\" field — must be a string');\n }\n if (fm['allowed-tools'] !== undefined && !Array.isArray(fm['allowed-tools'])) {\n throw new SkillParseError('Invalid \"allowed-tools\" field — must be an array');\n }\n}\n\n/** Infer abstract capabilities from allowed-tools list */\nexport function inferCapabilities(allowedTools: string[]): Capability[] {\n const caps = new Set<Capability>();\n for (const tool of allowedTools) {\n const cap = TOOL_CAPABILITY_MAP[tool];\n if (cap) {\n caps.add(cap);\n }\n }\n return [...caps];\n}\n\n/** Serialize a ParsedSkill back to SKILL.md format */\nexport function serializeSkillMd(parsed: ParsedSkill): string {\n const yamlStr = stringifyYaml(parsed.frontmatter, { lineWidth: 0 }).trimEnd();\n return `---\\n${yamlStr}\\n---\\n${parsed.body}`;\n}\n\n/** Search for SKILL.md files within a directory (looks in .claude/skills/*) */\nexport async function findSkillDirectory(dir: string): Promise<string | null> {\n const dirs = await findAllSkillDirectories(dir);\n return dirs.length > 0 ? dirs[0] : null;\n}\n\nconst SKIP_DIRS = new Set(['node_modules', '.git', 'dist', 'build']);\n\n/** Skill discovery result with optional plugin name */\nexport interface DiscoveredSkill {\n path: string;\n pluginName?: string;\n}\n\n/** Discover all directories containing SKILL.md within a source */\nexport async function findAllSkillDirectories(dir: string, fullDepth = false): Promise<string[]> {\n const results = await findAllSkillDirectoriesWithPlugins(dir, fullDepth);\n return results.map(r => r.path);\n}\n\n/** Discover all directories containing SKILL.md with plugin grouping info */\nexport async function findAllSkillDirectoriesWithPlugins(dir: string, fullDepth = false): Promise<DiscoveredSkill[]> {\n // Get plugin groupings for this source\n const pluginGroupings = await getPluginGroupings(dir);\n\n // Helper to enhance result with plugin name\n const enhance = (skillPath: string): DiscoveredSkill => {\n const resolvedPath = resolve(skillPath);\n const pluginName = pluginGroupings.get(resolvedPath);\n return { path: skillPath, pluginName };\n };\n\n if (fullDepth) {\n const results = new Set<string>();\n await walkForSkills(dir, 0, 5, results);\n return [...results].map(enhance);\n }\n\n const results: DiscoveredSkill[] = [];\n\n // Direct SKILL.md in root\n if (existsSync(join(dir, 'SKILL.md'))) {\n results.push(enhance(dir));\n return results;\n }\n\n // Priority search: common skill directory conventions\n const seenPaths = new Set<string>();\n\n // Get plugin manifest skill paths\n const pluginSkillPaths = await getPluginSkillPaths(dir);\n\n const priorityDirs = [\n ...pluginSkillPaths, // Plugin manifest paths first\n join(dir, 'skills'),\n join(dir, 'skills', '.curated'),\n join(dir, 'skills', '.experimental'),\n join(dir, 'skills', '.system'),\n join(dir, '.agent', 'skills'),\n join(dir, '.agents', 'skills'),\n join(dir, '.claude', 'skills'),\n join(dir, '.cline', 'skills'),\n join(dir, '.codex', 'skills'),\n join(dir, '.github', 'skills'),\n join(dir, '.kiro', 'skills'),\n join(dir, '.opencode', 'skills'),\n join(dir, '.roo', 'skills'),\n join(dir, '.windsurf', 'skills'),\n ];\n\n for (const searchDir of priorityDirs) {\n try {\n const entries = await readdir(searchDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n const skillDir = join(searchDir, entry.name);\n if (existsSync(join(skillDir, 'SKILL.md')) && !seenPaths.has(skillDir)) {\n results.push(enhance(skillDir));\n seenPaths.add(skillDir);\n }\n }\n }\n } catch {\n // directory doesn't exist, skip\n }\n }\n\n // Fallback: search up to 2 levels deep for SKILL.md (skip hidden dirs)\n if (results.length === 0) {\n try {\n const topEntries = await readdir(dir, { withFileTypes: true });\n for (const entry of topEntries) {\n if (entry.isDirectory() && !entry.name.startsWith('.') && !SKIP_DIRS.has(entry.name)) {\n const subDir = join(dir, entry.name);\n if (existsSync(join(subDir, 'SKILL.md')) && !seenPaths.has(subDir)) {\n results.push(enhance(subDir));\n seenPaths.add(subDir);\n }\n try {\n const subEntries = await readdir(subDir, { withFileTypes: true });\n for (const sub of subEntries) {\n if (sub.isDirectory() && !sub.name.startsWith('.') && !SKIP_DIRS.has(sub.name)) {\n const nested = join(subDir, sub.name);\n if (existsSync(join(nested, 'SKILL.md')) && !seenPaths.has(nested)) {\n results.push(enhance(nested));\n seenPaths.add(nested);\n }\n }\n }\n } catch {\n // ignore\n }\n }\n }\n } catch {\n // ignore\n }\n }\n\n return results;\n}\n\n/** Recursively walk directories up to maxDepth looking for SKILL.md */\nasync function walkForSkills(dir: string, depth: number, maxDepth: number, results: Set<string>): Promise<void> {\n if (depth > maxDepth) return;\n\n if (existsSync(join(dir, 'SKILL.md'))) {\n results.add(dir);\n }\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith('.') && !SKIP_DIRS.has(entry.name)) {\n await walkForSkills(join(dir, entry.name), depth + 1, maxDepth, results);\n }\n }\n } catch {\n // ignore permission errors etc.\n }\n}\n\n/** Read and parse a SKILL.md from a directory */\nexport async function readSkillMd(dir: string): Promise<ParsedSkill | null> {\n const content = await readTextSafe(join(dir, 'SKILL.md'));\n if (!content) return null;\n return parseSkillMd(content, basename(dir));\n}\n\n/** Extract env keys from a .env.example file */\nexport function extractEnvKeys(envExampleContent: string): string[] {\n const keys: string[] = [];\n for (const line of envExampleContent.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) {\n const match = trimmed.match(/^([A-Z_][A-Z0-9_]*)=/);\n if (match) {\n keys.push(match[1]);\n }\n }\n }\n return keys;\n}\n\n/** Discover skills inside node_modules (top-level and scoped packages) */\nexport async function discoverNodeModulesSkills(cwd: string): Promise<string[]> {\n const nmDir = join(cwd, 'node_modules');\n if (!existsSync(nmDir)) return [];\n\n const results: string[] = [];\n\n try {\n const entries = await readdir(nmDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n\n if (entry.name.startsWith('@')) {\n // Scoped packages: scan @scope/*\n try {\n const scopeEntries = await readdir(join(nmDir, entry.name), { withFileTypes: true });\n for (const scopeEntry of scopeEntries) {\n if (scopeEntry.isDirectory()) {\n const pkgDir = join(nmDir, entry.name, scopeEntry.name);\n if (existsSync(join(pkgDir, 'SKILL.md'))) {\n results.push(pkgDir);\n }\n }\n }\n } catch {\n // ignore\n }\n } else if (!entry.name.startsWith('.')) {\n const pkgDir = join(nmDir, entry.name);\n if (existsSync(join(pkgDir, 'SKILL.md'))) {\n results.push(pkgDir);\n }\n }\n }\n } catch {\n // ignore\n }\n\n return results;\n}\n","/**\n * Plugin manifest support for Claude Code plugin ecosystem.\n *\n * Handles two manifest formats:\n * - marketplace.json: Multi-plugin catalog at .claude-plugin/marketplace.json\n * - plugin.json: Single plugin at .claude-plugin/plugin.json\n */\n\nimport { readFile, readdir } from 'node:fs/promises';\nimport { join, dirname, resolve, normalize, sep } from 'node:path';\n\n/**\n * Check if a path is contained within a base directory.\n * Prevents path traversal attacks via `..` segments or absolute paths.\n */\nfunction isContainedIn(targetPath: string, basePath: string): boolean {\n const normalizedBase = normalize(resolve(basePath));\n const normalizedTarget = normalize(resolve(targetPath));\n return normalizedTarget.startsWith(normalizedBase + sep) || normalizedTarget === normalizedBase;\n}\n\n/**\n * Validate that a relative path follows Claude Code conventions.\n * Paths must start with './' per the plugin manifest spec.\n */\nfunction isValidRelativePath(path: string): boolean {\n return path.startsWith('./');\n}\n\n/** Plugin manifest entry (individual plugin within marketplace) */\ninterface PluginManifestEntry {\n source?: string | { source: string; repo?: string };\n skills?: string[];\n /** Optional name for grouping skills (e.g., \"document-skills\") */\n name?: string;\n}\n\n/** Marketplace manifest structure (.claude-plugin/marketplace.json) */\ninterface MarketplaceManifest {\n metadata?: { pluginRoot?: string };\n plugins?: PluginManifestEntry[];\n}\n\n/** Single plugin manifest structure (.claude-plugin/plugin.json) */\ninterface PluginManifest {\n skills?: string[];\n name?: string;\n}\n\n/**\n * Extract skill search directories from plugin manifests.\n * Handles both marketplace.json (multi-plugin) and plugin.json (single plugin).\n * Only resolves local paths - remote sources are skipped.\n *\n * Returns directories that CONTAIN skills (to be searched for child SKILL.md files).\n * For explicit skill paths in manifests, adds the parent directory so the\n * existing discovery loop finds them.\n */\nexport async function getPluginSkillPaths(basePath: string): Promise<string[]> {\n const searchDirs: string[] = [];\n\n // Helper: add skill paths for a plugin at a given base path\n // Only adds paths that are contained within basePath (security: prevents traversal)\n const addPluginSkillPaths = (pluginBase: string, skills?: string[]) => {\n // Validate pluginBase itself is contained\n if (!isContainedIn(pluginBase, basePath)) return;\n\n if (skills && skills.length > 0) {\n // Plugin explicitly declares skill paths - add parent dirs so existing loop finds them\n for (const skillPath of skills) {\n // Validate skill path starts with './' (per Claude Code convention)\n if (!isValidRelativePath(skillPath)) continue;\n\n const skillDir = dirname(join(pluginBase, skillPath));\n if (isContainedIn(skillDir, basePath)) {\n searchDirs.push(skillDir);\n }\n }\n }\n // Always add conventional skills/ directory for discovery\n // (deduplication happens via seenNames in discoverSkills)\n searchDirs.push(join(pluginBase, 'skills'));\n };\n\n // Try marketplace.json (multi-plugin catalog)\n try {\n const content = await readFile(join(basePath, '.claude-plugin/marketplace.json'), 'utf-8');\n const manifest: MarketplaceManifest = JSON.parse(content);\n const pluginRoot = manifest.metadata?.pluginRoot;\n\n // Validate pluginRoot starts with './' if provided (per Claude Code convention)\n const validPluginRoot = pluginRoot === undefined || isValidRelativePath(pluginRoot);\n\n if (validPluginRoot) {\n for (const plugin of manifest.plugins ?? []) {\n // Skip remote sources (object with source/repo) - only handle local string paths\n if (typeof plugin.source !== 'string' && plugin.source !== undefined) continue;\n\n // Validate source starts with './' if provided (per Claude Code convention)\n if (plugin.source !== undefined && !isValidRelativePath(plugin.source)) continue;\n\n const pluginBase = join(basePath, pluginRoot ?? '', plugin.source ?? '');\n addPluginSkillPaths(pluginBase, plugin.skills);\n }\n }\n } catch {\n // File doesn't exist or invalid JSON\n }\n\n // Try plugin.json (single plugin at root)\n try {\n const content = await readFile(join(basePath, '.claude-plugin/plugin.json'), 'utf-8');\n const manifest: PluginManifest = JSON.parse(content);\n addPluginSkillPaths(basePath, manifest.skills);\n } catch {\n // File doesn't exist or invalid JSON\n }\n\n return searchDirs;\n}\n\n/**\n * Scan a skills/ directory and map each child skill directory to a plugin name.\n * Used when a plugin manifest declares no explicit skills list.\n */\nasync function scanSkillsDir(\n skillsDir: string,\n pluginName: string,\n basePath: string,\n groupings: Map<string, string>\n): Promise<void> {\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true });\n for (const entry of entries) {\n if (!entry.isDirectory()) continue;\n const skillPath = join(skillsDir, entry.name);\n if (isContainedIn(skillPath, basePath)) {\n groupings.set(resolve(skillPath), pluginName);\n }\n }\n } catch {\n // Directory doesn't exist or unreadable — skip silently\n }\n}\n\n/**\n * Get a map of skill directory paths to plugin names from plugin manifests.\n * This allows grouping skills by their parent plugin.\n *\n * Returns Map<AbsolutePath, PluginName>\n */\nexport async function getPluginGroupings(basePath: string): Promise<Map<string, string>> {\n const groupings = new Map<string, string>();\n\n // Try marketplace.json (multi-plugin catalog)\n try {\n const content = await readFile(join(basePath, '.claude-plugin/marketplace.json'), 'utf-8');\n const manifest: MarketplaceManifest = JSON.parse(content);\n const pluginRoot = manifest.metadata?.pluginRoot;\n\n // Validate pluginRoot starts with './' if provided (per Claude Code convention)\n const validPluginRoot = pluginRoot === undefined || isValidRelativePath(pluginRoot);\n\n if (validPluginRoot) {\n for (const plugin of manifest.plugins ?? []) {\n if (!plugin.name) continue;\n\n // Skip remote sources (object with source/repo) - only handle local string paths\n if (typeof plugin.source !== 'string' && plugin.source !== undefined) continue;\n\n // Validate source starts with './' if provided (per Claude Code convention)\n if (plugin.source !== undefined && !isValidRelativePath(plugin.source)) continue;\n\n const pluginBase = join(basePath, pluginRoot ?? '', plugin.source ?? '');\n\n // Validate pluginBase itself is contained\n if (!isContainedIn(pluginBase, basePath)) continue;\n\n if (plugin.skills && plugin.skills.length > 0) {\n // Explicit skill paths declared — map each to this plugin\n for (const skillPath of plugin.skills) {\n // Validate skill path starts with './' (per Claude Code convention)\n if (!isValidRelativePath(skillPath)) continue;\n\n const skillDir = join(pluginBase, skillPath);\n if (isContainedIn(skillDir, basePath)) {\n // Store absolute path as key for reliable matching\n groupings.set(resolve(skillDir), plugin.name);\n }\n }\n } else {\n // No explicit skills list — scan conventional skills/ directory\n await scanSkillsDir(join(pluginBase, 'skills'), plugin.name, basePath, groupings);\n }\n }\n }\n } catch {\n // File doesn't exist or invalid JSON\n }\n\n // Try plugin.json (single plugin at root)\n try {\n const content = await readFile(join(basePath, '.claude-plugin/plugin.json'), 'utf-8');\n const manifest: PluginManifest = JSON.parse(content);\n if (manifest.name) {\n if (manifest.skills && manifest.skills.length > 0) {\n // Explicit skill paths declared\n for (const skillPath of manifest.skills) {\n if (!isValidRelativePath(skillPath)) continue;\n const skillDir = join(basePath, skillPath);\n if (isContainedIn(skillDir, basePath)) {\n groupings.set(resolve(skillDir), manifest.name);\n }\n }\n } else {\n // No explicit skills list — scan conventional skills/ directory\n await scanSkillsDir(join(basePath, 'skills'), manifest.name, basePath, groupings);\n }\n }\n } catch {\n // File doesn't exist or invalid JSON\n }\n\n return groupings;\n}\n","import { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { readTextSafe, writeText, ensureDir } from '../utils/fs-helpers.js';\nimport { getSkillConfigPath, getSkillCanonicalPath } from '../utils/paths.js';\nimport * as logger from '../utils/logger.js';\nimport type { EnvStatus } from '../types/index.js';\n\n/** Parse a .env file content into key-value pairs */\nexport function parseEnvFile(content: string): Record<string, string> {\n const result: Record<string, string> = {};\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('#')) continue;\n const eqIndex = trimmed.indexOf('=');\n if (eqIndex === -1) continue;\n const key = trimmed.slice(0, eqIndex).trim();\n let value = trimmed.slice(eqIndex + 1).trim();\n // Strip surrounding quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n result[key] = value;\n }\n return result;\n}\n\n/** Serialize key-value pairs back to .env format */\nexport function serializeEnv(data: Record<string, string>): string {\n return Object.entries(data)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n') + '\\n';\n}\n\n/**\n * Backup .env for a skill, searching multiple locations by priority:\n * 1. ~/.agents/config/<skill>/.env (persistent)\n * 2. agentSkillDir/.env (current agent dir, e.g. .claude/skills/<skill>)\n * 3. ~/.agents/skills/<skill>/.env (canonical)\n */\nexport async function backupEnv(\n skillName: string,\n agentSkillDir?: string,\n): Promise<Record<string, string> | null> {\n const locations = [\n join(getSkillConfigPath(skillName), '.env'),\n ...(agentSkillDir ? [join(agentSkillDir, '.env')] : []),\n join(getSkillCanonicalPath(skillName), '.env'),\n ];\n\n for (const loc of locations) {\n const content = await readTextSafe(loc);\n if (content) {\n const data = parseEnvFile(content);\n if (Object.keys(data).length > 0) {\n logger.debug(`Backed up .env from ${loc}`);\n return data;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Restore .env to both persistent and skill directory locations.\n * Merges with .env.example if present.\n */\nexport async function restoreEnv(\n skillName: string,\n envData: Record<string, string>,\n skillDir: string,\n): Promise<void> {\n // Read .env.example from skill dir if exists\n const exampleContent = await readTextSafe(join(skillDir, '.env.example'));\n let finalContent: string;\n\n if (exampleContent) {\n finalContent = mergeEnv(envData, exampleContent);\n } else {\n finalContent = serializeEnv(envData);\n }\n\n // Write to persistent config location\n const configEnvPath = join(getSkillConfigPath(skillName), '.env');\n await writeText(configEnvPath, finalContent);\n\n // Write to skill directory (for compatibility with loadApiKey)\n const skillEnvPath = join(skillDir, '.env');\n await writeText(skillEnvPath, finalContent);\n\n logger.debug(`Restored .env to ${configEnvPath} and ${skillEnvPath}`);\n}\n\n/**\n * Merge existing env data with .env.example template.\n * - Existing keys are NEVER overwritten\n * - New keys from example are appended with empty values and comments\n */\nexport function mergeEnv(\n existing: Record<string, string>,\n exampleContent: string,\n): string {\n const lines: string[] = [];\n const usedKeys = new Set<string>();\n\n // First, write all existing keys\n for (const [key, value] of Object.entries(existing)) {\n lines.push(`${key}=${value}`);\n usedKeys.add(key);\n }\n\n // Then, append new keys from example\n const exampleKeys = parseEnvFile(exampleContent);\n const newKeys = Object.keys(exampleKeys).filter(k => !usedKeys.has(k));\n\n if (newKeys.length > 0) {\n lines.push('');\n lines.push('# New keys added by skill update (please configure):');\n for (const key of newKeys) {\n lines.push(`# ${key}=`);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n/** Check the .env configuration status for a skill */\nexport async function getEnvStatus(\n skillName: string,\n requiredKeys: string[],\n): Promise<EnvStatus> {\n if (requiredKeys.length === 0) return 'configured';\n\n const configEnvPath = join(getSkillConfigPath(skillName), '.env');\n const content = await readTextSafe(configEnvPath);\n\n if (!content) return 'missing';\n\n const data = parseEnvFile(content);\n const configuredKeys = Object.entries(data)\n .filter(([, v]) => v && !v.includes('your_') && !v.includes('_here'))\n .map(([k]) => k);\n\n const allConfigured = requiredKeys.every(k => configuredKeys.includes(k));\n const someConfigured = requiredKeys.some(k => configuredKeys.includes(k));\n\n if (allConfigured) return 'configured';\n if (someConfigured) return 'partial';\n return 'missing';\n}\n\n/** Set a single env value for a skill */\nexport async function setEnvValue(\n skillName: string,\n key: string,\n value: string,\n skillDir?: string,\n): Promise<void> {\n const configEnvPath = join(getSkillConfigPath(skillName), '.env');\n const content = await readTextSafe(configEnvPath);\n const data = content ? parseEnvFile(content) : {};\n\n data[key] = value;\n const newContent = serializeEnv(data);\n\n // Write to persistent location\n await writeText(configEnvPath, newContent);\n\n // Sync to skill directory if provided\n if (skillDir) {\n await writeText(join(skillDir, '.env'), newContent);\n }\n}\n\n/** Get the .env file path for editing */\nexport function getEnvEditPath(skillName: string): string {\n return join(getSkillConfigPath(skillName), '.env');\n}\n","import { homedir } from 'node:os';\nimport { join } from 'node:path';\n\n/** Root directory for all skill-master data */\nexport const AGENTS_HOME = join(homedir(), '.agents');\n\n/** Persistent user config (API keys etc.) */\nexport const CONFIG_DIR = join(AGENTS_HOME, 'config');\n\n/** Canonical skill code storage */\nexport const SKILLS_DIR = join(AGENTS_HOME, 'skills');\n\n/** Registry file path */\nexport const REGISTRY_PATH = join(AGENTS_HOME, 'registry.json');\n\n/** Get canonical path for a skill's code */\nexport function getSkillCanonicalPath(name: string): string {\n return join(SKILLS_DIR, name);\n}\n\n/** Get persistent config path for a skill (holds .env) */\nexport function getSkillConfigPath(name: string): string {\n return join(CONFIG_DIR, name);\n}\n\n// Re-export from agents.ts — eliminates duplicate AGENT_SKILL_DIRS mapping\nexport { getAgentSkillPath, getAgentGlobalSkillPath, getAgentSkillsRoot } from '../platform/agents.js';\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\n\nconst home = homedir();\nconst configHome = process.env.XDG_CONFIG_HOME?.trim() || join(home, '.config');\nconst codexHome = process.env.CODEX_HOME?.trim() || join(home, '.codex');\nconst claudeHome = process.env.CLAUDE_CONFIG_DIR?.trim() || join(home, '.claude');\n\nexport interface AgentConfig {\n name: string;\n displayName: string;\n skillsDir: string;\n globalSkillsDir: string;\n detectMarker?: string;\n showInUniversalList?: boolean;\n}\n\nexport const AGENTS = {\n amp: {\n name: 'amp',\n displayName: 'Amp',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(configHome, 'agents/skills'),\n },\n antigravity: {\n name: 'antigravity',\n displayName: 'Antigravity',\n skillsDir: '.agent/skills',\n globalSkillsDir: join(home, '.gemini/antigravity/skills'),\n detectMarker: '.agent',\n },\n augment: {\n name: 'augment',\n displayName: 'Augment',\n skillsDir: '.augment/skills',\n globalSkillsDir: join(home, '.augment/skills'),\n detectMarker: '.augment',\n },\n 'claude-code': {\n name: 'claude-code',\n displayName: 'Claude Code',\n skillsDir: '.claude/skills',\n globalSkillsDir: join(claudeHome, 'skills'),\n detectMarker: '.claude',\n },\n openclaw: {\n name: 'openclaw',\n displayName: 'OpenClaw',\n skillsDir: 'skills',\n globalSkillsDir: join(home, '.openclaw/skills'),\n },\n cline: {\n name: 'cline',\n displayName: 'Cline',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(home, '.agents', 'skills'),\n detectMarker: '.cline',\n },\n codebuddy: {\n name: 'codebuddy',\n displayName: 'CodeBuddy',\n skillsDir: '.codebuddy/skills',\n globalSkillsDir: join(home, '.codebuddy/skills'),\n detectMarker: '.codebuddy',\n },\n codex: {\n name: 'codex',\n displayName: 'Codex',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(codexHome, 'skills'),\n },\n 'command-code': {\n name: 'command-code',\n displayName: 'Command Code',\n skillsDir: '.commandcode/skills',\n globalSkillsDir: join(home, '.commandcode/skills'),\n detectMarker: '.commandcode',\n },\n cortex: {\n name: 'cortex',\n displayName: 'Cortex',\n skillsDir: '.cortex/skills',\n globalSkillsDir: join(home, '.snowflake/cortex/skills'),\n },\n continue: {\n name: 'continue',\n displayName: 'Continue',\n skillsDir: '.continue/skills',\n globalSkillsDir: join(home, '.continue/skills'),\n detectMarker: '.continue',\n },\n crush: {\n name: 'crush',\n displayName: 'Crush',\n skillsDir: '.crush/skills',\n globalSkillsDir: join(home, '.config/crush/skills'),\n },\n cursor: {\n name: 'cursor',\n displayName: 'Cursor',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(home, '.cursor/skills'),\n detectMarker: '.cursor',\n },\n droid: {\n name: 'droid',\n displayName: 'Droid',\n skillsDir: '.factory/skills',\n globalSkillsDir: join(home, '.factory/skills'),\n detectMarker: '.factory',\n },\n 'gemini-cli': {\n name: 'gemini-cli',\n displayName: 'Gemini CLI',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(home, '.gemini/skills'),\n },\n 'github-copilot': {\n name: 'github-copilot',\n displayName: 'GitHub Copilot',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(home, '.copilot/skills'),\n },\n goose: {\n name: 'goose',\n displayName: 'Goose',\n skillsDir: '.goose/skills',\n globalSkillsDir: join(configHome, 'goose/skills'),\n detectMarker: '.goose',\n },\n junie: {\n name: 'junie',\n displayName: 'Junie',\n skillsDir: '.junie/skills',\n globalSkillsDir: join(home, '.junie/skills'),\n detectMarker: '.junie',\n },\n 'iflow-cli': {\n name: 'iflow-cli',\n displayName: 'iFlow CLI',\n skillsDir: '.iflow/skills',\n globalSkillsDir: join(home, '.iflow/skills'),\n detectMarker: '.iflow',\n },\n kilo: {\n name: 'kilo',\n displayName: 'Kilo Code',\n skillsDir: '.kilocode/skills',\n globalSkillsDir: join(home, '.kilocode/skills'),\n detectMarker: '.kilocode',\n },\n 'kimi-cli': {\n name: 'kimi-cli',\n displayName: 'Kimi Code CLI',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(home, '.config/agents/skills'),\n },\n 'kiro-cli': {\n name: 'kiro-cli',\n displayName: 'Kiro CLI',\n skillsDir: '.kiro/skills',\n globalSkillsDir: join(home, '.kiro/skills'),\n detectMarker: '.kiro',\n },\n kode: {\n name: 'kode',\n displayName: 'Kode',\n skillsDir: '.kode/skills',\n globalSkillsDir: join(home, '.kode/skills'),\n detectMarker: '.kode',\n },\n mcpjam: {\n name: 'mcpjam',\n displayName: 'MCPJam',\n skillsDir: '.mcpjam/skills',\n globalSkillsDir: join(home, '.mcpjam/skills'),\n detectMarker: '.mcpjam',\n },\n 'mistral-vibe': {\n name: 'mistral-vibe',\n displayName: 'Mistral Vibe',\n skillsDir: '.vibe/skills',\n globalSkillsDir: join(home, '.vibe/skills'),\n detectMarker: '.vibe',\n },\n mux: {\n name: 'mux',\n displayName: 'Mux',\n skillsDir: '.mux/skills',\n globalSkillsDir: join(home, '.mux/skills'),\n detectMarker: '.mux',\n },\n opencode: {\n name: 'opencode',\n displayName: 'OpenCode',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(configHome, 'opencode/skills'),\n },\n openhands: {\n name: 'openhands',\n displayName: 'OpenHands',\n skillsDir: '.openhands/skills',\n globalSkillsDir: join(home, '.openhands/skills'),\n detectMarker: '.openhands',\n },\n pi: {\n name: 'pi',\n displayName: 'Pi',\n skillsDir: '.pi/skills',\n globalSkillsDir: join(home, '.pi/agent/skills'),\n detectMarker: '.pi',\n },\n qoder: {\n name: 'qoder',\n displayName: 'Qoder',\n skillsDir: '.qoder/skills',\n globalSkillsDir: join(home, '.qoder/skills'),\n detectMarker: '.qoder',\n },\n 'qwen-code': {\n name: 'qwen-code',\n displayName: 'Qwen Code',\n skillsDir: '.qwen/skills',\n globalSkillsDir: join(home, '.qwen/skills'),\n detectMarker: '.qwen',\n },\n replit: {\n name: 'replit',\n displayName: 'Replit',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(configHome, 'agents/skills'),\n showInUniversalList: false,\n },\n roo: {\n name: 'roo',\n displayName: 'Roo Code',\n skillsDir: '.roo/skills',\n globalSkillsDir: join(home, '.roo/skills'),\n detectMarker: '.roo',\n },\n trae: {\n name: 'trae',\n displayName: 'Trae',\n skillsDir: '.trae/skills',\n globalSkillsDir: join(home, '.trae/skills'),\n detectMarker: '.trae',\n },\n 'trae-cn': {\n name: 'trae-cn',\n displayName: 'Trae CN',\n skillsDir: '.trae/skills',\n globalSkillsDir: join(home, '.trae-cn/skills'),\n },\n windsurf: {\n name: 'windsurf',\n displayName: 'Windsurf',\n skillsDir: '.windsurf/skills',\n globalSkillsDir: join(home, '.codeium/windsurf/skills'),\n detectMarker: '.windsurf',\n },\n zencoder: {\n name: 'zencoder',\n displayName: 'Zencoder',\n skillsDir: '.zencoder/skills',\n globalSkillsDir: join(home, '.zencoder/skills'),\n detectMarker: '.zencoder',\n },\n neovate: {\n name: 'neovate',\n displayName: 'Neovate',\n skillsDir: '.neovate/skills',\n globalSkillsDir: join(home, '.neovate/skills'),\n detectMarker: '.neovate',\n },\n pochi: {\n name: 'pochi',\n displayName: 'Pochi',\n skillsDir: '.pochi/skills',\n globalSkillsDir: join(home, '.pochi/skills'),\n detectMarker: '.pochi',\n },\n adal: {\n name: 'adal',\n displayName: 'AdaL',\n skillsDir: '.adal/skills',\n globalSkillsDir: join(home, '.adal/skills'),\n detectMarker: '.adal',\n },\n universal: {\n name: 'universal',\n displayName: 'Universal',\n skillsDir: '.agents/skills',\n globalSkillsDir: join(configHome, 'agents/skills'),\n showInUniversalList: false,\n },\n} as const satisfies Record<string, AgentConfig>;\n\nexport type AgentPlatform = keyof typeof AGENTS;\n\n/** Get config for a specific agent */\nexport function getAgentConfig(type: AgentPlatform): AgentConfig {\n return AGENTS[type];\n}\n\n/** List all supported platform keys */\nexport function getSupportedPlatforms(): AgentPlatform[] {\n return Object.keys(AGENTS) as AgentPlatform[];\n}\n\n/** Detect current platform by checking cwd for directory markers */\nexport function detectPlatform(cwd: string): AgentPlatform {\n for (const [key, config] of Object.entries(AGENTS) as Array<[AgentPlatform, AgentConfig]>) {\n if (config.detectMarker && existsSync(join(cwd, config.detectMarker))) {\n return key;\n }\n }\n\n // Fallback: check opencode via global config\n if (existsSync(join(configHome, 'opencode'))) {\n return 'opencode';\n }\n\n return 'claude-code';\n}\n\n/** Get the project-level skills directory name for an agent */\nexport function getAgentSkillsDir(platform: AgentPlatform): string {\n return AGENTS[platform].skillsDir;\n}\n\n/** Get full skill installation path: cwd + skillsDir + skillName */\nexport function getAgentSkillPath(cwd: string, agent: AgentPlatform, name: string): string {\n return join(cwd, AGENTS[agent].skillsDir, name);\n}\n\n/** Get the global skill path: globalSkillsDir + skillName */\nexport function getAgentGlobalSkillPath(agent: AgentPlatform, name: string): string {\n return join(AGENTS[agent].globalSkillsDir, name);\n}\n\n/** Get the agent skills root directory: cwd + skillsDir */\nexport function getAgentSkillsRoot(cwd: string, agent: AgentPlatform): string {\n return join(cwd, AGENTS[agent].skillsDir);\n}\n\n/** Get all agents that use the universal `.agents/skills` directory and are visible in universal list */\nexport function getUniversalAgents(): AgentPlatform[] {\n return (Object.entries(AGENTS) as Array<[AgentPlatform, AgentConfig]>)\n .filter(([, config]) => config.skillsDir === '.agents/skills' && config.showInUniversalList !== false)\n .map(([key]) => key);\n}\n\n/** Get all agents that do NOT use the universal `.agents/skills` directory */\nexport function getNonUniversalAgents(): AgentPlatform[] {\n return (Object.entries(AGENTS) as Array<[AgentPlatform, AgentConfig]>)\n .filter(([, config]) => config.skillsDir !== '.agents/skills')\n .map(([key]) => key);\n}\n\n/** Check if an agent uses the universal `.agents/skills` directory */\nexport function isUniversalAgent(type: AgentPlatform): boolean {\n return AGENTS[type].skillsDir === '.agents/skills';\n}\n","import { existsSync } from 'node:fs';\nimport { REGISTRY_PATH } from '../utils/paths.js';\nimport { atomicWriteJson, readJsonSafe } from '../utils/fs-helpers.js';\nimport { RegistryCorruptError } from '../utils/errors.js';\nimport type { Registry, RegistryEntry, RegistryEntryV1, AgentPlatform } from '../types/index.js';\n\n/** Create an empty v2 registry */\nfunction createEmptyRegistry(): Registry {\n return { version: 2, skills: {} };\n}\n\n/** Migrate a v1 entry to v2 format */\nfunction migrateEntryV1(v1: RegistryEntryV1): RegistryEntry {\n return {\n source: v1.source,\n version: v1.version,\n installed_at: v1.installed_at,\n updated_at: v1.updated_at,\n agents: [{\n agent: v1.agent,\n agent_path: v1.agent_path,\n global: v1.agent_path.includes('/.agents/') || v1.agent_path.includes('\\\\.agents\\\\'),\n }],\n env_keys: v1.env_keys,\n capabilities: v1.capabilities,\n canonical_path: v1.canonical_path,\n };\n}\n\n/** Validate and auto-migrate registry */\nfunction validateAndMigrate(data: unknown): Registry | null {\n if (!data || typeof data !== 'object') return null;\n const reg = data as Record<string, unknown>;\n if (typeof reg.skills !== 'object' || reg.skills === null) return null;\n\n // Already v2\n if (reg.version === 2) return data as Registry;\n\n // V1 → V2 migration\n if (reg.version === 1) {\n const v1Skills = reg.skills as Record<string, RegistryEntryV1>;\n const v2Skills: Record<string, RegistryEntry> = {};\n for (const [name, entry] of Object.entries(v1Skills)) {\n v2Skills[name] = migrateEntryV1(entry);\n }\n return { version: 2, skills: v2Skills };\n }\n\n return null;\n}\n\n/** Read the registry, auto-migrating v1 → v2 if needed */\nexport async function readRegistry(): Promise<Registry> {\n if (!existsSync(REGISTRY_PATH)) {\n return createEmptyRegistry();\n }\n\n const data = await readJsonSafe<unknown>(REGISTRY_PATH);\n if (!data) {\n throw new RegistryCorruptError('Failed to parse registry.json');\n }\n\n const registry = validateAndMigrate(data);\n if (!registry) {\n throw new RegistryCorruptError('Invalid registry structure');\n }\n\n // Persist migration if version changed\n if ((data as Record<string, unknown>).version !== registry.version) {\n await atomicWriteJson(REGISTRY_PATH, registry);\n }\n\n return registry;\n}\n\n/**\n * Update or add a skill entry in the registry (atomic write).\n * Merges agents: same agent → replace, new agent → append.\n */\nexport async function updateRegistry(\n skillName: string,\n entry: RegistryEntry,\n): Promise<void> {\n const registry = await readRegistry();\n const existing = registry.skills[skillName];\n\n if (existing) {\n // Merge agents: replace matching, append new\n for (const newAgent of entry.agents) {\n const idx = existing.agents.findIndex(a => a.agent === newAgent.agent);\n if (idx >= 0) {\n existing.agents[idx] = newAgent;\n } else {\n existing.agents.push(newAgent);\n }\n }\n // Update other fields\n existing.source = entry.source;\n existing.version = entry.version;\n existing.updated_at = entry.updated_at;\n existing.env_keys = entry.env_keys;\n existing.capabilities = entry.capabilities;\n existing.canonical_path = entry.canonical_path;\n } else {\n registry.skills[skillName] = entry;\n }\n\n await atomicWriteJson(REGISTRY_PATH, registry);\n}\n\n/** Remove a single agent record from a skill. Removes entire entry if last agent. */\nexport async function removeAgentFromRegistry(\n skillName: string,\n agent: AgentPlatform,\n): Promise<void> {\n const registry = await readRegistry();\n const entry = registry.skills[skillName];\n if (!entry) return;\n\n entry.agents = entry.agents.filter(a => a.agent !== agent);\n if (entry.agents.length === 0) {\n delete registry.skills[skillName];\n }\n await atomicWriteJson(REGISTRY_PATH, registry);\n}\n\n/** Remove a skill entirely from the registry */\nexport async function removeFromRegistry(skillName: string): Promise<void> {\n const registry = await readRegistry();\n delete registry.skills[skillName];\n await atomicWriteJson(REGISTRY_PATH, registry);\n}\n\n/** List all registered skills */\nexport async function listRegistry(): Promise<Record<string, RegistryEntry>> {\n const registry = await readRegistry();\n return registry.skills;\n}\n\n/** Get a single registry entry */\nexport async function getRegistryEntry(skillName: string): Promise<RegistryEntry | null> {\n const registry = await readRegistry();\n return registry.skills[skillName] ?? null;\n}\n","import { join } from 'node:path';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport { atomicWriteJson, readJsonSafe } from '../utils/fs-helpers.js';\nimport type { LocalLock, LocalLockEntry } from '../types/index.js';\n\nconst LOCK_FILENAME = 'skills-lock.json';\n\n/** Excluded entries when computing skill folder hash */\nconst HASH_EXCLUDES = new Set(['.env', '.git', 'node_modules']);\n\n/** Get the lock file path for a project */\nexport function getLocalLockPath(cwd: string): string {\n return join(cwd, LOCK_FILENAME);\n}\n\n/** Create an empty lock structure */\nfunction createEmptyLock(): LocalLock {\n return { version: 1, skills: {} };\n}\n\n/** Read the local lock file; returns empty structure if missing or corrupt */\nexport async function readLocalLock(cwd: string): Promise<LocalLock> {\n const lockPath = getLocalLockPath(cwd);\n const data = await readJsonSafe<LocalLock>(lockPath);\n if (\n !data || typeof data !== 'object' ||\n data.version !== 1 ||\n data.skills === null || Array.isArray(data.skills) ||\n typeof data.skills !== 'object'\n ) {\n return createEmptyLock();\n }\n return data;\n}\n\n/** Write the local lock file with skills sorted alphabetically */\nexport async function writeLocalLock(lock: LocalLock, cwd: string): Promise<void> {\n const lockPath = getLocalLockPath(cwd);\n const sorted: Record<string, LocalLockEntry> = {};\n for (const key of Object.keys(lock.skills).sort()) {\n sorted[key] = lock.skills[key];\n }\n await atomicWriteJson(lockPath, { version: lock.version, skills: sorted });\n}\n\n/** Recursively compute SHA-256 hash of a skill directory */\nexport async function computeSkillFolderHash(dirPath: string): Promise<string> {\n const hash = createHash('sha256');\n await hashDir(dirPath, '', hash);\n return hash.digest('hex');\n}\n\n/** Recursively hash directory contents in sorted order */\nasync function hashDir(basePath: string, relativePath: string, hash: ReturnType<typeof createHash>): Promise<void> {\n const fullPath = relativePath ? join(basePath, relativePath) : basePath;\n const entries = await readdir(fullPath, { withFileTypes: true });\n const sorted = entries.sort((a, b) => a.name.localeCompare(b.name));\n\n for (const entry of sorted) {\n if (HASH_EXCLUDES.has(entry.name)) continue;\n\n const entryRelative = relativePath ? `${relativePath}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n await hashDir(basePath, entryRelative, hash);\n } else if (entry.isFile()) {\n // Use null byte separator to prevent path/content boundary ambiguity\n hash.update(entryRelative);\n hash.update('\\0');\n const content = await readFile(join(basePath, entryRelative));\n hash.update(content);\n hash.update('\\0');\n }\n }\n}\n\n/** Add or update a skill entry in the local lock */\nexport async function addSkillToLocalLock(skillName: string, entry: LocalLockEntry, cwd: string): Promise<void> {\n const lock = await readLocalLock(cwd);\n lock.skills[skillName] = entry;\n await writeLocalLock(lock, cwd);\n}\n\n/** Remove a skill entry from the local lock */\nexport async function removeSkillFromLocalLock(skillName: string, cwd: string): Promise<void> {\n const lock = await readLocalLock(cwd);\n if (!(skillName in lock.skills)) return;\n delete lock.skills[skillName];\n await writeLocalLock(lock, cwd);\n}\n","import { installSkill } from '../core/installer.js';\nimport { cloneRepo, parseSource } from '../core/git-source.js';\nimport { findAllSkillDirectoriesWithPlugins, readSkillMd, type DiscoveredSkill } from '../core/skill-parser.js';\nimport { addSkillToLocalLock, computeSkillFolderHash } from '../core/local-lock.js';\nimport { SkillNotFoundError } from '../utils/errors.js';\nimport * as logger from '../utils/logger.js';\nimport type { SkillSource, AgentPlatform } from '../types/index.js';\nimport { existsSync } from 'node:fs';\nimport { basename, join, relative } from 'node:path';\n\nexport interface AddFlags {\n global: boolean;\n agent: string[];\n skill: string[];\n yes: boolean;\n list: boolean;\n all: boolean;\n fullDepth: boolean;\n copy: boolean;\n force: boolean;\n help: boolean;\n}\n\n/**\n * Parse POSIX-style flags for the add command.\n * Supports: -g/--global, -a/--agent, -s/--skill, -y/--yes,\n * -l/--list, --all, --full-depth, --copy, --force\n */\nexport function parseAddFlags(args: string[]): { source: string | null; flags: AddFlags } {\n const flags: AddFlags = {\n global: false,\n agent: [],\n skill: [],\n yes: false,\n list: false,\n all: false,\n fullDepth: false,\n copy: false,\n force: false,\n help: false,\n };\n\n let source: string | null = null;\n let i = 0;\n\n while (i < args.length) {\n const arg = args[i];\n\n // Long flags with = syntax (backward compat: --agent=claude-code)\n if (arg.startsWith('--') && arg.includes('=')) {\n const eqIdx = arg.indexOf('=');\n const key = arg.slice(2, eqIdx);\n const val = arg.slice(eqIdx + 1);\n switch (key) {\n case 'agent': flags.agent.push(val); break;\n case 'skill': flags.skill.push(val); break;\n default:\n throw new Error(`Unknown option: --${key}`);\n }\n i++;\n continue;\n }\n\n switch (arg) {\n case '-h':\n case '--help':\n flags.help = true;\n i++;\n break;\n\n case '-g':\n case '--global':\n flags.global = true;\n i++;\n break;\n\n case '-a':\n case '--agent':\n i++;\n while (i < args.length && !args[i].startsWith('-')) {\n flags.agent.push(args[i]);\n i++;\n }\n break;\n\n case '-s':\n case '--skill':\n i++;\n while (i < args.length && !args[i].startsWith('-')) {\n flags.skill.push(args[i]);\n i++;\n }\n break;\n\n case '-y':\n case '--yes':\n flags.yes = true;\n i++;\n break;\n\n case '-l':\n case '--list':\n flags.list = true;\n i++;\n break;\n\n case '--all':\n flags.all = true;\n i++;\n break;\n\n case '--full-depth':\n flags.fullDepth = true;\n i++;\n break;\n\n case '--copy':\n flags.copy = true;\n i++;\n break;\n\n case '--force':\n flags.force = true;\n i++;\n break;\n\n default:\n // First non-flag argument is the source\n if (!arg.startsWith('-') && source === null) {\n source = arg;\n } else if (arg.startsWith('-')) {\n throw new Error(`Unknown option: ${arg}`);\n }\n i++;\n break;\n }\n }\n\n // --all implies --skill '*' --agent '*' -y\n if (flags.all) {\n if (flags.skill.length === 0) flags.skill.push('*');\n if (flags.agent.length === 0) flags.agent.push('*');\n flags.yes = true;\n }\n\n return { source, flags };\n}\n\nfunction printAddHelp(): void {\n console.log('Usage: skill-master add <source> [options]');\n console.log('');\n console.log('Options:');\n console.log(' -h, --help Show this help message');\n console.log(' -g, --global Install globally (~/.agents/)');\n console.log(' -a, --agent <agents> Target agents (space-separated)');\n console.log(' -s, --skill <skills> Select skills (space-separated)');\n console.log(' -y, --yes Skip confirmations');\n console.log(' -l, --list List available skills without installing');\n console.log(' --all Install all skills to all agents');\n console.log(' --full-depth Search all subdirectories');\n console.log(' --copy Copy instead of symlink');\n console.log(' --force Force reinstall');\n}\n\n/** add command — install skills (compatible with `npx skills add`) */\nexport async function add(args: string[]): Promise<void> {\n if (args.length === 0) {\n printAddHelp();\n process.exit(1);\n }\n\n const { source, flags } = parseAddFlags(args);\n\n if (flags.help) {\n printAddHelp();\n process.exit(0);\n }\n\n if (!source) {\n logger.error('No source specified. Provide a GitHub URL, owner/repo, or local path.');\n process.exit(1);\n }\n\n const cwd = process.cwd();\n\n // Parse source string into structured form\n const parsed = parseSource(source);\n\n // Merge skillFilter from source (e.g. owner/repo@skill) into flags.skill\n if (parsed.skillFilter && !flags.skill.includes(parsed.skillFilter)) {\n flags.skill.push(parsed.skillFilter);\n }\n\n // Resolve source directory\n let sourceDir: string;\n\n if (parsed.type === 'git') {\n logger.step(1, 9, 'Fetching skill source...');\n sourceDir = await cloneRepo(parsed.url!, parsed.ref);\n // Narrow to subpath if specified\n if (parsed.subpath) {\n const sub = join(sourceDir, parsed.subpath);\n if (existsSync(sub)) {\n sourceDir = sub;\n }\n }\n } else {\n sourceDir = parsed.path!;\n if (!existsSync(sourceDir)) {\n throw new SkillNotFoundError(sourceDir);\n }\n }\n\n // Discover all skill directories in the source (with plugin info)\n const allSkillDirs = await findAllSkillDirectoriesWithPlugins(sourceDir, flags.fullDepth);\n if (allSkillDirs.length === 0) {\n throw new SkillNotFoundError(`No SKILL.md found in ${sourceDir}`);\n }\n\n // --list mode: print discovered skills and exit\n if (flags.list) {\n logger.blank();\n logger.tableHeader('Skill', 'Version', 'Description');\n for (const { path: dir } of allSkillDirs) {\n const sk = await readSkillMd(dir);\n if (sk) {\n logger.tableRow(\n sk.frontmatter.name,\n sk.frontmatter.version ?? '-',\n sk.frontmatter.description ?? '-',\n );\n }\n }\n logger.blank();\n return;\n }\n\n // Filter by --skill if specified\n let targetDirs: DiscoveredSkill[] = allSkillDirs;\n if (flags.skill.length > 0 && !flags.skill.includes('*')) {\n const requested = new Set(flags.skill.map(s => s.toLowerCase()));\n const filtered: DiscoveredSkill[] = [];\n\n for (const item of allSkillDirs) {\n const sk = await readSkillMd(item.path);\n if (!sk) continue;\n const name = sk.frontmatter.name.toLowerCase();\n const dirName = basename(item.path).toLowerCase();\n if (requested.has(name) || requested.has(dirName)) {\n filtered.push(item);\n }\n }\n\n if (filtered.length === 0) {\n const available = [];\n for (const { path: dir } of allSkillDirs) {\n const sk = await readSkillMd(dir);\n if (sk) available.push(sk.frontmatter.name);\n }\n logger.error(\n `No matching skills found for: ${flags.skill.join(', ')}\\n` +\n ` Available skills: ${available.join(', ')}`\n );\n process.exit(1);\n }\n\n targetDirs = filtered;\n }\n\n // If multiple agents specified, install for each\n const agents = flags.agent.length > 0 ? flags.agent : [undefined];\n\n try {\n for (const { path: dir, pluginName } of targetDirs) {\n for (const agent of agents) {\n // Build the original source reference for registry\n // For git sources, preserve the URL; for local, use the actual path\n const installSource: SkillSource = parsed.type === 'git'\n ? { type: 'git', url: parsed.url!, branch: parsed.ref, localPath: dir }\n : { type: 'local', path: dir };\n\n const result = await installSkill({\n source: installSource,\n agent: agent as AgentPlatform | undefined,\n cwd,\n global: flags.global,\n copy: flags.copy,\n force: flags.force,\n yes: flags.yes,\n });\n\n // Update local lock for non-global installs\n if (!flags.global) {\n // Record relative skill dir path for multi-skill source repos\n const skillDir = relative(sourceDir, dir);\n await addSkillToLocalLock(result.skillName, {\n source: source!,\n sourceType: parsed.type === 'git' ? 'github' : 'local',\n computedHash: await computeSkillFolderHash(result.canonicalPath),\n ...(skillDir && skillDir !== '.' ? { skillDir } : {}),\n ...(pluginName ? { pluginName } : {}),\n }, cwd);\n }\n }\n }\n } catch (err) {\n logger.error((err as Error).message);\n process.exit(1);\n }\n}\n","import { getRegistryEntry } from '../core/registry.js';\nimport { installSkill } from '../core/installer.js';\nimport { isGitUrl } from '../core/git-source.js';\nimport * as logger from '../utils/logger.js';\nimport { SkillNotFoundError } from '../utils/errors.js';\nimport type { SkillSource } from '../types/index.js';\n\nexport async function update(args: string[]): Promise<void> {\n if (args.length === 0) {\n logger.error('Usage: skill-master update <skill-name> [--force]');\n process.exit(1);\n }\n\n const skillName = args[0];\n const force = args.includes('--force');\n\n try {\n const entry = await getRegistryEntry(skillName);\n if (!entry) {\n throw new SkillNotFoundError(skillName);\n }\n\n logger.info(`Updating skill: ${skillName}`);\n logger.info(`Source: ${entry.source}`);\n\n const source: SkillSource = isGitUrl(entry.source)\n ? { type: 'git', url: entry.source }\n : { type: 'local', path: entry.source };\n\n // Reinstall for each registered agent\n for (const agentRecord of entry.agents) {\n await installSkill({\n source,\n agent: agentRecord.agent,\n cwd: process.cwd(),\n global: agentRecord.global,\n force: true,\n });\n }\n\n logger.success(`Skill \"${skillName}\" updated successfully!`);\n } catch (err) {\n logger.error((err as Error).message);\n process.exit(1);\n }\n}\n","import { getRegistryEntry, removeFromRegistry, removeAgentFromRegistry, listRegistry } from '../core/registry.js';\nimport { removeSkillFromLocalLock } from '../core/local-lock.js';\nimport { removePath } from '../utils/fs-helpers.js';\nimport { getSkillCanonicalPath, getSkillConfigPath, getAgentGlobalSkillPath } from '../utils/paths.js';\nimport * as logger from '../utils/logger.js';\nimport { SkillNotFoundError } from '../utils/errors.js';\nimport type { AgentPlatform } from '../types/index.js';\n\nexport interface RemoveFlags {\n global: boolean;\n agent: string[];\n skill: string[];\n yes: boolean;\n all: boolean;\n purge: boolean;\n help: boolean;\n}\n\n/** Parse POSIX-style flags for the remove command */\nexport function parseRemoveFlags(args: string[]): { names: string[]; flags: RemoveFlags } {\n const flags: RemoveFlags = {\n global: false,\n agent: [],\n skill: [],\n yes: false,\n all: false,\n purge: false,\n help: false,\n };\n\n const names: string[] = [];\n let i = 0;\n\n while (i < args.length) {\n const arg = args[i];\n\n // Long flags with = syntax (backward compat: --agent=claude-code)\n if (arg.startsWith('--') && arg.includes('=')) {\n const eqIdx = arg.indexOf('=');\n const key = arg.slice(2, eqIdx);\n const val = arg.slice(eqIdx + 1);\n switch (key) {\n case 'agent': flags.agent.push(val); break;\n case 'skill': flags.skill.push(val); break;\n default:\n throw new Error(`Unknown option: --${key}`);\n }\n i++;\n continue;\n }\n\n switch (arg) {\n case '-h':\n case '--help':\n flags.help = true;\n i++;\n break;\n\n case '-g':\n case '--global':\n flags.global = true;\n i++;\n break;\n\n case '-a':\n case '--agent':\n i++;\n while (i < args.length && !args[i].startsWith('-')) {\n flags.agent.push(args[i]);\n i++;\n }\n break;\n\n case '-s':\n case '--skill':\n i++;\n while (i < args.length && !args[i].startsWith('-')) {\n flags.skill.push(args[i]);\n i++;\n }\n break;\n\n case '-y':\n case '--yes':\n flags.yes = true;\n i++;\n break;\n\n case '--all':\n flags.all = true;\n i++;\n break;\n\n case '--purge':\n flags.purge = true;\n i++;\n break;\n\n default:\n // Non-flag arguments are skill names (positional)\n if (!arg.startsWith('-')) {\n names.push(arg);\n } else {\n throw new Error(`Unknown option: ${arg}`);\n }\n i++;\n break;\n }\n }\n\n // --all implies removing all skills with -y\n if (flags.all) {\n flags.yes = true;\n }\n\n return { names, flags };\n}\n\nfunction printRemoveHelp(): void {\n console.log('Usage: skill-master remove [skills...] [options]');\n console.log('');\n console.log('Options:');\n console.log(' -h, --help Show this help message');\n console.log(' -g, --global Remove from global (~/.agents/)');\n console.log(' -a, --agent <agents> Target agents (space-separated)');\n console.log(' -s, --skill <skills> Select skills (space-separated)');\n console.log(' -y, --yes Skip confirmations');\n console.log(' --all Remove all skills');\n console.log(' --purge Also remove config data');\n}\n\n/** remove command — remove installed skills */\nexport async function remove(args: string[]): Promise<void> {\n if (args.length === 0) {\n printRemoveHelp();\n process.exit(1);\n }\n\n const { names, flags } = parseRemoveFlags(args);\n\n if (flags.help) {\n printRemoveHelp();\n process.exit(0);\n }\n\n // Determine which skills to remove\n let skillNames: string[];\n if (flags.all) {\n const registry = await listRegistry();\n skillNames = Object.keys(registry);\n } else if (flags.skill.length > 0) {\n skillNames = flags.skill;\n } else {\n skillNames = names;\n }\n\n if (skillNames.length === 0) {\n logger.error('No skills specified. Provide skill names or use --all.');\n process.exit(1);\n }\n\n try {\n for (const skillName of skillNames) {\n const entry = await getRegistryEntry(skillName);\n if (!entry) {\n throw new SkillNotFoundError(skillName);\n }\n\n logger.info(`Removing skill: ${skillName}`);\n\n if (flags.agent.length > 0) {\n // Remove only specified agent(s)\n for (const agentName of flags.agent) {\n const agentRecord = entry.agents.find(a => a.agent === agentName);\n if (!agentRecord) {\n logger.warn(`Agent \"${agentName}\" not found for skill \"${skillName}\"`);\n continue;\n }\n await removePath(agentRecord.agent_path);\n logger.success(`Removed ${agentName} path: ${agentRecord.agent_path}`);\n await removeAgentFromRegistry(skillName, agentName as AgentPlatform);\n }\n\n // Check if all agents removed — if so, clean up canonical\n const updated = await getRegistryEntry(skillName);\n if (!updated) {\n await removePath(entry.canonical_path);\n logger.success(`Removed canonical path: ${entry.canonical_path}`);\n if (flags.purge) {\n await removePath(getSkillConfigPath(skillName));\n logger.success('Purged config directory');\n }\n await removeSkillFromLocalLock(skillName, process.cwd());\n }\n } else {\n // Remove all agent paths\n for (const agentRecord of entry.agents) {\n await removePath(agentRecord.agent_path);\n logger.success(`Removed ${agentRecord.agent} path: ${agentRecord.agent_path}`);\n }\n\n // Remove canonical directory\n await removePath(entry.canonical_path);\n logger.success(`Removed canonical path: ${entry.canonical_path}`);\n\n // Optionally purge config\n if (flags.purge) {\n await removePath(getSkillConfigPath(skillName));\n logger.success('Purged config directory');\n }\n\n // Remove entire registry entry\n await removeFromRegistry(skillName);\n await removeSkillFromLocalLock(skillName, process.cwd());\n }\n\n logger.success(`Skill \"${skillName}\" removed successfully!`);\n }\n } catch (err) {\n logger.error((err as Error).message);\n process.exit(1);\n }\n}\n","import { listRegistry } from '../core/registry.js';\nimport { getEnvStatus, setEnvValue, getEnvEditPath } from '../core/env-manager.js';\nimport { getSkillCanonicalPath } from '../utils/paths.js';\nimport * as logger from '../utils/logger.js';\nimport { spawn } from 'node:child_process';\n\nexport async function env(args: string[]): Promise<void> {\n const subcommand = args[0];\n\n if (!subcommand || subcommand === 'list') {\n await envList();\n } else if (subcommand === 'set') {\n await envSet(args.slice(1));\n } else if (subcommand === 'edit') {\n await envEdit(args.slice(1));\n } else {\n logger.error('Usage: skill-master env <list|set|edit>');\n process.exit(1);\n }\n}\n\nasync function envList(): Promise<void> {\n const skills = await listRegistry();\n const entries = Object.entries(skills);\n\n if (entries.length === 0) {\n logger.info('No skills installed');\n return;\n }\n\n logger.blank();\n logger.tableHeader('Skill', 'Status', 'Keys');\n\n for (const [name, entry] of entries) {\n const status = await getEnvStatus(name, entry.env_keys);\n const statusIcon = status === 'configured' ? '✓' : status === 'partial' ? '⚠' : '✗';\n logger.tableRow(name, `${statusIcon} ${status}`, entry.env_keys.join(', '));\n }\n logger.blank();\n}\n\nasync function envSet(args: string[]): Promise<void> {\n if (args.length < 2) {\n logger.error('Usage: skill-master env set <skill> KEY=VALUE');\n process.exit(1);\n }\n\n const skillName = args[0];\n const [key, value] = args[1].split('=');\n\n if (!key || !value) {\n logger.error('Invalid format. Use: KEY=VALUE');\n process.exit(1);\n }\n\n try {\n const skillDir = getSkillCanonicalPath(skillName);\n await setEnvValue(skillName, key, value, skillDir);\n logger.success(`Set ${key} for ${skillName}`);\n } catch (err) {\n logger.error((err as Error).message);\n process.exit(1);\n }\n}\n\nasync function envEdit(args: string[]): Promise<void> {\n if (args.length === 0) {\n logger.error('Usage: skill-master env edit <skill>');\n process.exit(1);\n }\n\n const skillName = args[0];\n const envPath = getEnvEditPath(skillName);\n const editor = process.env.EDITOR || 'vi';\n\n logger.info(`Opening ${envPath} with ${editor}...`);\n\n const child = spawn(editor, [envPath], {\n stdio: 'inherit',\n shell: true,\n });\n\n child.on('exit', (code) => {\n if (code === 0) {\n logger.success('Saved');\n } else {\n logger.error('Editor exited with error');\n process.exit(1);\n }\n });\n}\n","import { listRegistry } from '../core/registry.js';\nimport { readLocalLock } from '../core/local-lock.js';\nimport * as logger from '../utils/logger.js';\n\nexport interface ListFlags {\n global: boolean;\n agent: string[];\n}\n\n/** Parse flags for the list command */\nexport function parseListFlags(args: string[]): ListFlags {\n const flags: ListFlags = {\n global: false,\n agent: [],\n };\n\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n\n if (arg.startsWith('--') && arg.includes('=')) {\n const eqIdx = arg.indexOf('=');\n const key = arg.slice(2, eqIdx);\n const val = arg.slice(eqIdx + 1);\n if (key === 'agent') flags.agent.push(val);\n i++;\n continue;\n }\n\n switch (arg) {\n case '-g':\n case '--global':\n flags.global = true;\n i++;\n break;\n case '-a':\n case '--agent':\n i++;\n while (i < args.length && !args[i].startsWith('-')) {\n flags.agent.push(args[i]);\n i++;\n }\n break;\n default:\n i++;\n break;\n }\n }\n\n return flags;\n}\n\n/** Convert kebab-case to Title Case for display */\nfunction toTitleCase(str: string): string {\n return str\n .split('-')\n .map(w => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\n/** list command — list installed skills */\nexport async function list(args: string[] = []): Promise<void> {\n const flags = parseListFlags(args);\n const skills = await listRegistry();\n let entries = Object.entries(skills);\n\n // Filter by agent if specified\n if (flags.agent.length > 0) {\n entries = entries.filter(([, entry]) =>\n entry.agents.some(a => flags.agent.includes(a.agent))\n );\n }\n\n if (entries.length === 0) {\n logger.info('No skills installed');\n return;\n }\n\n // Read local lock to get plugin groupings\n const cwd = process.cwd();\n const localLock = await readLocalLock(cwd);\n\n // Group skills by plugin name\n const groupedSkills: Record<string, Array<[string, typeof entries[0][1]]>> = {};\n const ungroupedSkills: Array<[string, typeof entries[0][1]]> = [];\n\n for (const [name, entry] of entries) {\n const lockEntry = localLock.skills[name];\n if (lockEntry?.pluginName) {\n const group = lockEntry.pluginName;\n if (!groupedSkills[group]) {\n groupedSkills[group] = [];\n }\n groupedSkills[group].push([name, entry]);\n } else {\n ungroupedSkills.push([name, entry]);\n }\n }\n\n const hasGroups = Object.keys(groupedSkills).length > 0;\n\n logger.blank();\n\n if (hasGroups) {\n // Print groups sorted alphabetically\n const sortedGroups = Object.keys(groupedSkills).sort();\n for (const group of sortedGroups) {\n logger.section(toTitleCase(group));\n logger.tableHeader('Skill', 'Version', 'Platform(s)', 'Installed');\n\n for (const [name, entry] of groupedSkills[group]) {\n const date = new Date(entry.installed_at).toLocaleDateString();\n const platforms = entry.agents.map(a => a.agent).join(', ');\n logger.tableRow(name, entry.version ?? '-', platforms, date);\n }\n logger.blank();\n }\n\n // Print ungrouped skills if any exist\n if (ungroupedSkills.length > 0) {\n logger.section('General');\n logger.tableHeader('Skill', 'Version', 'Platform(s)', 'Installed');\n\n for (const [name, entry] of ungroupedSkills) {\n const date = new Date(entry.installed_at).toLocaleDateString();\n const platforms = entry.agents.map(a => a.agent).join(', ');\n logger.tableRow(name, entry.version ?? '-', platforms, date);\n }\n logger.blank();\n }\n } else {\n // No groups, print flat list as before\n logger.tableHeader('Skill', 'Version', 'Platform(s)', 'Installed');\n\n for (const [name, entry] of entries) {\n const date = new Date(entry.installed_at).toLocaleDateString();\n const platforms = entry.agents.map(a => a.agent).join(', ');\n logger.tableRow(name, entry.version ?? '-', platforms, date);\n }\n logger.blank();\n }\n}\n","import { getRegistryEntry } from '../core/registry.js';\nimport { getEnvStatus } from '../core/env-manager.js';\nimport * as logger from '../utils/logger.js';\nimport { SkillNotFoundError } from '../utils/errors.js';\n\nexport async function info(args: string[]): Promise<void> {\n if (args.length === 0) {\n logger.error('Usage: skill-master info <skill-name>');\n process.exit(1);\n }\n\n const skillName = args[0];\n\n try {\n const entry = await getRegistryEntry(skillName);\n if (!entry) {\n throw new SkillNotFoundError(skillName);\n }\n\n const envStatus = await getEnvStatus(skillName, entry.env_keys);\n\n logger.blank();\n logger.info(`Skill: ${skillName}`);\n logger.kv('Version', entry.version ?? '-');\n logger.kv('Platform(s)', entry.agents.map(a => a.agent).join(', '));\n logger.kv('Source', entry.source);\n logger.kv('Installed', new Date(entry.installed_at).toLocaleString());\n logger.kv('Updated', new Date(entry.updated_at).toLocaleString());\n logger.kv('Canonical Path', entry.canonical_path);\n\n // Show all agent paths\n for (const a of entry.agents) {\n logger.kv(` ${a.agent} Path`, `${a.agent_path}${a.global ? ' (global)' : ''}`);\n }\n\n logger.kv('Capabilities', entry.capabilities.join(', '));\n logger.kv('Env Keys', entry.env_keys.join(', ') || 'none');\n logger.kv('Env Status', envStatus);\n logger.blank();\n } catch (err) {\n logger.error((err as Error).message);\n process.exit(1);\n }\n}\n","import { existsSync } from 'node:fs';\nimport { listRegistry } from '../core/registry.js';\nimport { getEnvStatus } from '../core/env-manager.js';\nimport { isSymlink } from '../utils/fs-helpers.js';\nimport { AGENTS_HOME, CONFIG_DIR, SKILLS_DIR, REGISTRY_PATH } from '../utils/paths.js';\nimport * as logger from '../utils/logger.js';\n\nexport async function doctor(): Promise<void> {\n logger.blank();\n logger.info('Running diagnostics...');\n logger.blank();\n\n let issues = 0;\n\n // Check directory structure\n logger.info('Checking directory structure...');\n const dirs = [AGENTS_HOME, CONFIG_DIR, SKILLS_DIR];\n for (const dir of dirs) {\n if (existsSync(dir)) {\n logger.success(`✓ ${dir}`);\n } else {\n logger.warn(`✗ ${dir} (missing)`);\n issues++;\n }\n }\n logger.blank();\n\n // Check registry\n logger.info('Checking registry...');\n if (existsSync(REGISTRY_PATH)) {\n logger.success(`✓ ${REGISTRY_PATH}`);\n try {\n const skills = await listRegistry();\n logger.info(` Found ${Object.keys(skills).length} skill(s)`);\n } catch (err) {\n logger.error(`✗ Registry corrupted: ${(err as Error).message}`);\n issues++;\n }\n } else {\n logger.info(` No registry found (will be created on first install)`);\n }\n logger.blank();\n\n // Check each skill\n logger.info('Checking installed skills...');\n try {\n const skills = await listRegistry();\n for (const [name, entry] of Object.entries(skills)) {\n logger.info(`Skill: ${name}`);\n\n // Check canonical path\n if (existsSync(entry.canonical_path)) {\n logger.success(` ✓ Canonical path exists`);\n } else {\n logger.error(` ✗ Canonical path missing: ${entry.canonical_path}`);\n issues++;\n }\n\n // Check each agent path\n for (const agentRecord of entry.agents) {\n if (existsSync(agentRecord.agent_path)) {\n const isLink = await isSymlink(agentRecord.agent_path);\n logger.success(` ✓ ${agentRecord.agent} path exists (${isLink ? 'symlink' : 'copy'}${agentRecord.global ? ', global' : ''})`);\n } else {\n logger.error(` ✗ ${agentRecord.agent} path missing: ${agentRecord.agent_path}`);\n issues++;\n }\n }\n\n // Check env status\n const envStatus = await getEnvStatus(name, entry.env_keys);\n if (envStatus === 'configured') {\n logger.success(` ✓ Environment configured`);\n } else if (envStatus === 'partial') {\n logger.warn(` ⚠ Environment partially configured`);\n } else if (entry.env_keys.length > 0) {\n logger.warn(` ⚠ Environment not configured`);\n }\n }\n } catch (err) {\n logger.error(`Failed to check skills: ${(err as Error).message}`);\n issues++;\n }\n\n logger.blank();\n if (issues === 0) {\n logger.success('All checks passed!');\n } else {\n logger.warn(`Found ${issues} issue(s)`);\n }\n logger.blank();\n}\n","import * as logger from '../utils/logger.js';\n\n/** find command — search for skills from the registry */\nexport async function find(args: string[]): Promise<void> {\n const query = args.filter(a => !a.startsWith('-')).join(' ').trim();\n\n if (!query) {\n console.log('Usage: skill-master find <query>');\n console.log('');\n console.log('Search for skills in the online registry.');\n console.log('');\n console.log('Examples:');\n console.log(' skill-master find git');\n console.log(' skill-master find \"code review\"');\n process.exit(0);\n }\n\n logger.info(`Searching for \"${query}\"...`);\n\n try {\n const url = `https://skills.sh/api/search?q=${encodeURIComponent(query)}`;\n const response = await fetch(url, {\n headers: { 'Accept': 'application/json' },\n signal: AbortSignal.timeout(10_000),\n });\n\n if (!response.ok) {\n logger.error(`Search API returned ${response.status}: ${response.statusText}`);\n process.exit(1);\n }\n\n const data = await response.json() as SearchResponse;\n const skills = data.skills ?? [];\n\n if (skills.length === 0) {\n logger.info('No skills found matching your query.');\n return;\n }\n\n logger.blank();\n logger.tableHeader('Name', 'Source', 'Installs');\n\n for (const item of skills) {\n logger.tableRow(\n item.name ?? '—',\n item.source ?? '—',\n String(item.installs ?? 0),\n );\n }\n logger.blank();\n } catch (err) {\n if ((err as Error).name === 'TimeoutError') {\n logger.error('Search request timed out. Please try again.');\n } else {\n logger.error(`Search failed: ${(err as Error).message}`);\n }\n process.exit(1);\n }\n}\n\ninterface SearchResult {\n name?: string;\n source?: string;\n installs?: number;\n}\n\ninterface SearchResponse {\n skills?: SearchResult[];\n}\n","import { existsSync } from 'node:fs';\nimport { join, basename } from 'node:path';\nimport { ensureDir, writeText } from '../utils/fs-helpers.js';\nimport * as logger from '../utils/logger.js';\n\nconst SKILL_MD_TEMPLATE = `---\nname: {{NAME}}\nversion: 0.1.0\nauthor: \"\"\ndescription: \"\"\nallowed-tools:\n - Read\n - Edit\n - Write\n - Bash\n - Glob\n - Grep\nuser-invocable: true\n---\n\n# {{NAME}}\n\n<!-- Describe what this skill does -->\n`;\n\n/** init command — create a new skill template */\nexport async function init(args: string[]): Promise<void> {\n const nameArg = args.filter(a => !a.startsWith('-'))[0];\n const cwd = process.cwd();\n\n let targetDir: string;\n let skillName: string;\n\n if (nameArg) {\n targetDir = join(cwd, nameArg);\n skillName = nameArg;\n } else {\n targetDir = cwd;\n skillName = basename(cwd);\n }\n\n const skillMdPath = join(targetDir, 'SKILL.md');\n\n if (existsSync(skillMdPath)) {\n logger.error(`SKILL.md already exists at ${skillMdPath}`);\n process.exit(1);\n }\n\n await ensureDir(targetDir);\n\n const content = SKILL_MD_TEMPLATE\n .replace(/\\{\\{NAME\\}\\}/g, skillName);\n\n await writeText(skillMdPath, content);\n logger.success(`Created ${skillMdPath}`);\n logger.info(`Edit the file to configure your skill.`);\n}\n","import { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\nimport { listRegistry } from '../core/registry.js';\nimport { isGitUrl, parseGitUrl } from '../core/git-source.js';\nimport * as logger from '../utils/logger.js';\n\nconst execFileAsync = promisify(execFile);\n\n/** check command — check for skill updates */\nexport async function check(_args: string[]): Promise<void> {\n const skills = await listRegistry();\n const entries = Object.entries(skills);\n\n if (entries.length === 0) {\n logger.info('No skills installed');\n return;\n }\n\n logger.info('Checking for updates...');\n logger.blank();\n\n let updatable = 0;\n\n for (const [name, entry] of entries) {\n if (!isGitUrl(entry.source)) {\n logger.info(`${name}: local source — skipped`);\n continue;\n }\n\n // Skip version check for skills without version info\n if (!entry.version) {\n logger.info(`${name}: no version info — skipped`);\n continue;\n }\n\n try {\n const remoteHead = await getRemoteHead(entry.source);\n if (!remoteHead) {\n logger.warn(`${name}: unable to query remote`);\n continue;\n }\n\n // Compare with installed version (stored as git short hash or semver)\n // If version differs from remote HEAD, an update is available\n const isUpToDate = entry.version === remoteHead.slice(0, entry.version.length);\n if (isUpToDate) {\n logger.success(`${name}: up to date (${entry.version})`);\n } else {\n logger.warn(`${name}: update available (${entry.version} → ${remoteHead.slice(0, 7)})`);\n updatable++;\n }\n } catch {\n logger.warn(`${name}: failed to check remote`);\n }\n }\n\n logger.blank();\n if (updatable === 0) {\n logger.success('All skills are up to date!');\n } else {\n logger.info(`${updatable} skill(s) can be updated. Run \"skill-master update <name>\" to update.`);\n }\n}\n\n/** Get the latest commit hash from a remote git repo */\nasync function getRemoteHead(source: string): Promise<string | null> {\n try {\n const { owner, repo } = parseGitUrl(source);\n const url = `https://github.com/${owner}/${repo}.git`;\n const { stdout } = await execFileAsync('git', ['ls-remote', url, 'HEAD'], {\n timeout: 15_000,\n });\n const match = stdout.trim().split(/\\s+/)[0];\n return match || null;\n } catch {\n return null;\n }\n}\n","import { installSkill, sanitizeName } from '../core/installer.js';\nimport { discoverNodeModulesSkills, readSkillMd } from '../core/skill-parser.js';\nimport { readLocalLock, addSkillToLocalLock, computeSkillFolderHash } from '../core/local-lock.js';\nimport * as logger from '../utils/logger.js';\nimport type { AgentPlatform } from '../types/index.js';\nimport { relative } from 'node:path';\n\nexport interface SyncFlags {\n agent: string[];\n yes: boolean;\n force: boolean;\n help: boolean;\n}\n\n/** Parse flags for the sync command */\nexport function parseSyncFlags(args: string[]): { flags: SyncFlags } {\n const flags: SyncFlags = {\n agent: [],\n yes: false,\n force: false,\n help: false,\n };\n\n let i = 0;\n while (i < args.length) {\n const arg = args[i];\n switch (arg) {\n case '-h':\n case '--help':\n flags.help = true;\n i++;\n break;\n case '-a':\n case '--agent':\n i++;\n while (i < args.length && !args[i].startsWith('-')) {\n flags.agent.push(args[i]);\n i++;\n }\n break;\n case '-y':\n case '--yes':\n flags.yes = true;\n i++;\n break;\n case '-f':\n case '--force':\n flags.force = true;\n i++;\n break;\n default:\n if (arg.startsWith('-')) {\n throw new Error(`Unknown option: ${arg}`);\n }\n i++;\n break;\n }\n }\n\n\n return { flags };\n}\n\nfunction printSyncHelp(): void {\n console.log('Usage: skill-master sync [options]');\n console.log('');\n console.log('Discover and sync skills from node_modules.');\n console.log('');\n console.log('Options:');\n console.log(' -h, --help Show this help message');\n console.log(' -a, --agent <agents> Target agents (space-separated)');\n console.log(' -y, --yes Skip confirmations');\n console.log(' -f, --force Force reinstall even if unchanged');\n}\n\ninterface SkillInfo {\n dir: string;\n name: string;\n version?: string;\n status: 'new' | 'updated' | 'unchanged';\n}\n\n/** sync command — discover and install skills from node_modules */\nexport async function sync(args: string[]): Promise<void> {\n const { flags } = parseSyncFlags(args);\n\n if (flags.help) {\n printSyncHelp();\n process.exit(0);\n }\n\n const cwd = process.cwd();\n\n // Step 1: Discover skills in node_modules\n logger.info('Scanning node_modules for skills...');\n const skillDirs = await discoverNodeModulesSkills(cwd);\n\n if (skillDirs.length === 0) {\n logger.info('No skills found in node_modules.');\n return;\n }\n\n // Step 2: Read lock and classify skills\n const lock = await readLocalLock(cwd);\n const skills: SkillInfo[] = [];\n\n\n for (const dir of skillDirs) {\n const parsed = await readSkillMd(dir);\n if (!parsed) continue;\n\n const name = sanitizeName(parsed.frontmatter.name);\n const currentHash = await computeSkillFolderHash(dir);\n const lockEntry = lock.skills[name];\n\n let status: SkillInfo['status'];\n if (!lockEntry) {\n status = 'new';\n } else if (lockEntry.computedHash !== currentHash || flags.force) {\n status = 'updated';\n } else {\n status = 'unchanged';\n }\n\n skills.push({ dir, name, version: parsed.frontmatter.version, status });\n }\n\n // Step 3: Show summary\n const actionable = skills.filter(s => s.status !== 'unchanged');\n if (actionable.length === 0) {\n logger.success('All node_modules skills are up to date.');\n return;\n }\n\n logger.blank();\n logger.tableHeader('Skill', 'Version', 'Status');\n for (const s of skills) {\n logger.tableRow(s.name, s.version ?? '-', s.status);\n }\n logger.blank();\n logger.info(`${actionable.length} skill(s) to install/update.`);\n\n // Step 4: Confirm\n if (!flags.yes) {\n const readline = await import('node:readline');\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n const answer = await new Promise<string>(resolve => {\n rl.question('Proceed? [y/N] ', resolve);\n });\n rl.close();\n if (answer.toLowerCase() !== 'y') {\n logger.info('Aborted.');\n return;\n }\n }\n\n // Step 5: Install\n const agents = flags.agent.length > 0 ? flags.agent : [undefined];\n\n for (const s of actionable) {\n for (const agent of agents) {\n try {\n const result = await installSkill({\n source: { type: 'local', path: s.dir },\n agent: agent as AgentPlatform | undefined,\n cwd,\n global: false,\n copy: false,\n force: flags.force,\n yes: true,\n });\n\n await addSkillToLocalLock(result.skillName, {\n source: relative(cwd, s.dir),\n sourceType: 'node_modules',\n computedHash: await computeSkillFolderHash(result.canonicalPath),\n }, cwd);\n } catch (err) {\n logger.error(`Failed to install ${s.name}: ${(err as Error).message}`);\n }\n }\n }\n\n logger.blank();\n logger.success(`Synced ${actionable.length} skill(s) from node_modules.`);\n}\n","import { installSkill, sanitizeName } from '../core/installer.js';\nimport { cloneRepo, parseSource } from '../core/git-source.js';\nimport { readLocalLock, addSkillToLocalLock, computeSkillFolderHash } from '../core/local-lock.js';\nimport { discoverNodeModulesSkills, readSkillMd } from '../core/skill-parser.js';\nimport * as logger from '../utils/logger.js';\nimport { existsSync } from 'node:fs';\n\nexport interface RestoreFlags {\n help: boolean;\n}\n\n/** Parse flags for the restore command */\nexport function parseRestoreFlags(args: string[]): { flags: RestoreFlags } {\n const flags: RestoreFlags = { help: false };\n for (const arg of args) {\n if (arg === '-h' || arg === '--help') {\n flags.help = true;\n }\n }\n return { flags };\n}\n\nfunction printRestoreHelp(): void {\n console.log('Usage: skill-master restore [options]');\n console.log('');\n console.log('Restore skills from skills-lock.json.');\n console.log('');\n console.log('Options:');\n console.log(' -h, --help Show this help message');\n}\n\n\n/** restore command — reinstall skills from skills-lock.json */\nexport async function restore(args: string[]): Promise<void> {\n const { flags } = parseRestoreFlags(args);\n\n if (flags.help) {\n printRestoreHelp();\n process.exit(0);\n }\n\n const cwd = process.cwd();\n const lock = await readLocalLock(cwd);\n const entries = Object.entries(lock.skills);\n\n if (entries.length === 0) {\n logger.info('No skills found in skills-lock.json. Nothing to restore.');\n return;\n }\n\n logger.info(`Restoring ${entries.length} skill(s) from skills-lock.json...`);\n logger.blank();\n\n // Group by sourceType\n const github: Array<[string, typeof lock.skills[string]]> = [];\n const nodeModules: Array<[string, typeof lock.skills[string]]> = [];\n const local: Array<[string, typeof lock.skills[string]]> = [];\n\n for (const [name, entry] of entries) {\n switch (entry.sourceType) {\n case 'github': github.push([name, entry]); break;\n case 'node_modules': nodeModules.push([name, entry]); break;\n case 'local': local.push([name, entry]); break;\n }\n }\n\n let installed = 0;\n let failed = 0;\n\n // Restore node_modules skills via discovery\n if (nodeModules.length > 0) {\n logger.info(`Syncing ${nodeModules.length} node_modules skill(s)...`);\n const nmSkillDirs = await discoverNodeModulesSkills(cwd);\n const nmMap = new Map<string, string>();\n for (const dir of nmSkillDirs) {\n const parsed = await readSkillMd(dir);\n if (parsed) nmMap.set(sanitizeName(parsed.frontmatter.name), dir);\n }\n\n\n for (const [name] of nodeModules) {\n const dir = nmMap.get(name);\n if (!dir) {\n logger.warn(`Skill \"${name}\" not found in node_modules — run npm install first`);\n failed++;\n continue;\n }\n try {\n const result = await installSkill({\n source: { type: 'local', path: dir },\n cwd,\n global: false,\n yes: true,\n });\n await addSkillToLocalLock(result.skillName, {\n source: dir,\n sourceType: 'node_modules',\n computedHash: await computeSkillFolderHash(result.canonicalPath),\n }, cwd);\n installed++;\n } catch (err) {\n logger.error(`Failed to restore \"${name}\": ${(err as Error).message}`);\n failed++;\n }\n }\n }\n\n // Restore github skills via clone\n for (const [name, entry] of github) {\n try {\n const parsed = parseSource(entry.source);\n if (parsed.type !== 'git' || !parsed.url) {\n logger.warn(`Invalid source for \"${name}\": ${entry.source}`);\n failed++;\n continue;\n }\n const sourceDir = await cloneRepo(parsed.url, parsed.ref);\n // Build skill path: start from repo root, apply subpath, then skillDir\n let skillPath = sourceDir;\n if (parsed.subpath) {\n skillPath = `${skillPath}/${parsed.subpath}`;\n }\n if (entry.skillDir) {\n skillPath = `${skillPath}/${entry.skillDir}`;\n }\n const result = await installSkill({\n source: { type: 'local', path: skillPath },\n cwd,\n global: false,\n yes: true,\n });\n await addSkillToLocalLock(result.skillName, {\n source: entry.source,\n sourceType: 'github',\n computedHash: await computeSkillFolderHash(result.canonicalPath),\n ...(entry.skillDir ? { skillDir: entry.skillDir } : {}),\n ...(entry.pluginName ? { pluginName: entry.pluginName } : {}),\n }, cwd);\n installed++;\n } catch (err) {\n logger.error(`Failed to restore \"${name}\": ${(err as Error).message}`);\n failed++;\n }\n }\n\n // Restore local skills\n for (const [name, entry] of local) {\n if (!existsSync(entry.source)) {\n logger.warn(`Local source not found for \"${name}\": ${entry.source}`);\n failed++;\n continue;\n }\n try {\n // Use skillDir to locate specific skill within multi-skill source\n const localPath = entry.skillDir\n ? `${entry.source}/${entry.skillDir}`\n : entry.source;\n const result = await installSkill({\n source: { type: 'local', path: localPath },\n cwd,\n global: false,\n yes: true,\n });\n await addSkillToLocalLock(result.skillName, {\n source: entry.source,\n sourceType: 'local',\n computedHash: await computeSkillFolderHash(result.canonicalPath),\n ...(entry.skillDir ? { skillDir: entry.skillDir } : {}),\n ...(entry.pluginName ? { pluginName: entry.pluginName } : {}),\n }, cwd);\n installed++;\n } catch (err) {\n logger.error(`Failed to restore \"${name}\": ${(err as Error).message}`);\n failed++;\n }\n }\n\n logger.blank();\n if (failed > 0) {\n logger.warn(`Restored ${installed} skill(s), ${failed} failed.`);\n } else {\n logger.success(`Restored ${installed} skill(s) successfully.`);\n }\n}\n","#!/usr/bin/env node\n\nimport { add } from './commands/add.js';\nimport { update } from './commands/update.js';\nimport { remove } from './commands/remove.js';\nimport { env } from './commands/env.js';\nimport { list } from './commands/list.js';\nimport { info } from './commands/info.js';\nimport { doctor } from './commands/doctor.js';\nimport { find } from './commands/find.js';\nimport { init } from './commands/init.js';\nimport { check } from './commands/check.js';\nimport { sync } from './commands/sync.js';\nimport { restore } from './commands/restore.js';\nimport * as logger from './utils/logger.js';\n\nconst VERSION = '0.1.0';\n\nconst HELP = `\nskill-master v${VERSION}\n\nUsage:\n skill-master add <source> [options] Install skills (aliases: install, a, i)\n skill-master remove [skills...] [opts] Remove skills (aliases: rm, r)\n skill-master list [options] List installed skills (alias: ls)\n skill-master find [query] Search for skills (aliases: search, f, s)\n skill-master update [skill] Update skills (alias: upgrade)\n skill-master sync [options] Sync skills from node_modules\n skill-master restore Restore skills from skills-lock.json (alias: install-lock)\n skill-master init [name] Create a new skill template\n skill-master check Check for skill updates\n skill-master env <list|set|edit> Manage environment variables\n skill-master info <skill-name> Show skill details\n skill-master doctor Run diagnostics\n\nAdd Options:\n -g, --global Install globally (~/.agents/)\n -a, --agent <agents> Target agents (space-separated)\n -s, --skill <skills> Select skills (space-separated)\n -y, --yes Skip confirmations\n -l, --list List available skills without installing\n --all Install all skills to all agents\n --full-depth Search all subdirectories\n --copy Copy instead of symlink\n --force Force reinstall\n\nSync Options:\n -a, --agent <agents> Target agents (space-separated)\n -y, --yes Skip confirmations\n -f, --force Force reinstall even if unchanged\n\nExamples:\n skill-master add owner/repo\n skill-master add https://github.com/user/skill -a claude-code cursor -y\n skill-master add ./local-skill --agent=cursor --copy\n skill-master remove my-skill --purge\n skill-master find \"code review\"\n skill-master sync -y\n skill-master restore\n skill-master init my-new-skill\n skill-master check\n`;\n\nasync function main() {\n const args = process.argv.slice(2);\n\n if (args.length === 0 || args[0] === '--help' || args[0] === '-h') {\n console.log(HELP);\n process.exit(0);\n }\n\n if (args[0] === '--version' || args[0] === '-v') {\n console.log(VERSION);\n process.exit(0);\n }\n\n const command = args[0];\n const commandArgs = args.slice(1);\n\n try {\n switch (command) {\n // add (primary) with aliases: install, a, i\n case 'add':\n case 'a':\n case 'install':\n case 'i':\n await add(commandArgs);\n break;\n\n // remove with aliases: rm, r\n case 'remove':\n case 'rm':\n case 'r':\n await remove(commandArgs);\n break;\n\n // list with alias: ls\n case 'list':\n case 'ls':\n await list(commandArgs);\n break;\n\n // find with aliases: search, f, s\n case 'find':\n case 'search':\n case 'f':\n case 's':\n await find(commandArgs);\n break;\n\n // update with alias: upgrade\n case 'update':\n case 'upgrade':\n await update(commandArgs);\n break;\n\n // init\n case 'init':\n await init(commandArgs);\n break;\n\n // check\n case 'check':\n await check(commandArgs);\n break;\n\n // sync — discover and install skills from node_modules\n case 'sync':\n await sync(commandArgs);\n break;\n\n // restore with alias: install-lock\n case 'restore':\n case 'install-lock':\n await restore(commandArgs);\n break;\n\n // env, info, doctor — skill-master extensions\n case 'env':\n await env(commandArgs);\n break;\n case 'info':\n await info(commandArgs);\n break;\n case 'doctor':\n await doctor();\n break;\n\n default:\n logger.error(`Unknown command: ${command}`);\n console.log(HELP);\n process.exit(1);\n }\n } catch (err) {\n logger.error((err as Error).message);\n if (process.env.DEBUG) {\n console.error(err);\n }\n process.exit(1);\n }\n}\n\nmain();\n"],"mappings":"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","names":["join","resolve","existsSync","existsSync","existsSync","readdir","join","resolve","existsSync","readFile","join","dirname","resolve","results","existsSync","join","readdir","join","homedir","join","existsSync","join","existsSync","join","join","join","homedir","join","existsSync","existsSync","resolve","existsSync","join","join","readdir","readFile","join","readdir","readFile","existsSync","basename","join","relative","info","existsSync","existsSync","existsSync","join","basename","join","basename","existsSync","execFile","promisify","execFileAsync","promisify","execFile","relative","resolve","existsSync","info"]}