@empjs/skill 1.1.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/agents.ts","../src/config/agents.ts","../src/commands/install.ts","../src/utils/git.ts","../src/utils/logger.ts","../src/utils/paths.ts","../src/utils/registry.ts","../src/utils/symlink.ts","../src/commands/list.ts","../src/commands/remove.ts"],"sourcesContent":["#!/usr/bin/env node\nimport {Command} from 'commander'\nimport {readFileSync} from 'fs'\nimport {dirname, join} from 'path'\nimport {fileURLToPath} from 'url'\nimport {agents} from './commands/agents.js'\nimport {install} from './commands/install.js'\nimport {list} from './commands/list.js'\nimport {remove} from './commands/remove.js'\n\n// Read version from package.json\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\nconst packageJsonPath = join(__dirname, '..', 'package.json')\nconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'))\nconst version = packageJson.version\n\nconst program = new Command()\n\nprogram.name('eskill').description('Unified CLI tool for managing AI agent skills').version(version)\n\n// Install command (with add alias)\nprogram\n .command('install <skill>')\n .alias('add')\n .description('Install a skill from NPM, Git URL, or local directory')\n .option('-a, --agent <name>', 'Install for specific agent (claude, cursor, windsurf, or all)')\n .option('-l, --link', 'Dev mode: symlink from local directory')\n .option('-f, --force', 'Force reinstall if already exists')\n .option('-r, --registry <url>', 'NPM registry URL (overrides .npmrc and global config)')\n .option('-t, --timeout <ms>', 'Timeout in milliseconds (default: 180000 for npm, 120000 for git)', value =>\n Number.parseInt(value, 10),\n )\n .action(async (skill, options) => {\n try {\n await install(skill, options)\n } catch (error: any) {\n console.error('Error:', error.message)\n process.exit(1)\n }\n })\n\n// List command\nprogram\n .command('list')\n .alias('ls')\n .description('List installed skills')\n .action(() => {\n try {\n list()\n } catch (error: any) {\n console.error('Error:', error.message)\n process.exit(1)\n }\n })\n\n// Remove command (with rm and uninstall aliases)\nprogram\n .command('remove <skill>')\n .alias('rm')\n .alias('uninstall')\n .description('Remove an installed skill')\n .option('-a, --agent <name>', 'Remove symlink for specific agent only (keeps skill in shared directory)')\n .action(async (skill, options) => {\n try {\n await remove(skill, options)\n } catch (error: any) {\n console.error('Error:', error.message)\n process.exit(1)\n }\n })\n\n// Agents command\nprogram\n .command('agents')\n .alias('list-agents')\n .description('List all supported AI agents and their skills directories')\n .action(() => {\n try {\n agents()\n } catch (error: any) {\n console.error('Error:', error.message)\n process.exit(1)\n }\n })\n\nprogram.parse()\n","import fs from 'node:fs'\nimport os from 'node:os'\nimport chalk from 'chalk'\nimport {AGENTS, getAgentSkillsDirs, SHARED_SKILLS_DIR} from '../config/agents.js'\n\n/**\n * List all supported agents and their skills directories\n */\nexport function agents(): void {\n const cwd = process.cwd()\n\n console.log(chalk.bold('\\nšŸ“‹ Supported AI Agents:\\n'))\n\n for (const agent of AGENTS) {\n const skillsDirs = getAgentSkillsDirs(agent, cwd)\n const dirsInfo = skillsDirs.length > 1 ? ` (${skillsDirs.length} directories)` : ''\n\n console.log(chalk.bold(agent.displayName))\n console.log(chalk.gray(` Name: ${agent.name}`))\n\n if (skillsDirs.length === 0) {\n console.log(chalk.yellow(' āš ļø No directories configured'))\n } else {\n console.log(chalk.gray(` Directories${dirsInfo}:`))\n for (const dir of skillsDirs) {\n const exists = fs.existsSync(dir)\n const status = exists ? chalk.green('āœ“') : chalk.gray('ā—‹')\n const pathColor = exists ? chalk.white : chalk.gray\n console.log(` ${status} ${pathColor(dir)}`)\n }\n }\n\n console.log('')\n }\n\n console.log(chalk.bold('šŸ“¦ Shared Skills Directory:'))\n const sharedExists = fs.existsSync(SHARED_SKILLS_DIR)\n const sharedStatus = sharedExists ? chalk.green('āœ“') : chalk.gray('ā—‹')\n const sharedPathColor = sharedExists ? chalk.white : chalk.gray\n console.log(` ${sharedStatus} ${sharedPathColor(SHARED_SKILLS_DIR)}`)\n console.log('')\n\n // Show current working directory if different from home\n const home = os.homedir()\n if (cwd !== home) {\n console.log(chalk.gray(`Current working directory: ${cwd}`))\n console.log(chalk.gray('(Project-level directories are shown above)\\n'))\n }\n}\n","import fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nexport interface AgentConfig {\n name: string\n displayName: string\n skillsDir?: string // Single directory (backward compatibility)\n skillsDirs?: string[] | ((cwd?: string) => string[]) // Multiple directories or function to get directories\n enabled: boolean\n /** Use copy instead of symlink (e.g. Cursor doesn't follow symlinks) */\n useCopyInsteadOfSymlink?: boolean\n}\n\nconst HOME = os.homedir()\n// XDG config: ~/.config on Linux/macOS\nconst CONFIG_HOME = process.env.XDG_CONFIG_HOME || path.join(HOME, '.config')\n\n/**\n * Get all skills directories for an agent\n */\nexport function getAgentSkillsDirs(agent: AgentConfig, cwd?: string): string[] {\n if (agent.skillsDirs) {\n if (typeof agent.skillsDirs === 'function') {\n return agent.skillsDirs(cwd)\n }\n return agent.skillsDirs\n }\n if (agent.skillsDir) {\n return [agent.skillsDir]\n }\n return []\n}\n\n/**\n * Supported AI agents configuration\n */\nexport const AGENTS: AgentConfig[] = [\n {\n name: 'amp',\n displayName: 'AMP',\n skillsDirs: (cwd?: string) => {\n const dirs = [path.join(CONFIG_HOME, 'agents', 'skills')]\n if (cwd) dirs.push(path.join(cwd, '.agents', 'skills'))\n return dirs\n },\n enabled: true,\n },\n {\n name: 'antigravity',\n displayName: 'Antigravity',\n skillsDirs: (cwd?: string) => {\n const dirs = [path.join(HOME, '.gemini', 'antigravity', 'skills')]\n if (cwd) dirs.push(path.join(cwd, '.agent', 'skills'))\n if (cwd) dirs.push(path.join(cwd, '.shared', 'skills'))\n return dirs\n },\n enabled: true,\n },\n {\n name: 'claude',\n displayName: 'Claude Code',\n skillsDir: path.join(process.env.CLAUDE_CONFIG_DIR?.trim() || path.join(HOME, '.claude'), 'skills'),\n enabled: true,\n },\n {\n name: 'clawdbot',\n displayName: 'ClawdBot',\n skillsDirs: () => {\n const openclaw = path.join(HOME, '.openclaw', 'skills')\n const clawdbot = path.join(HOME, '.clawdbot', 'skills')\n const moltbot = path.join(HOME, '.moltbot', 'skills')\n if (fs.existsSync(path.join(HOME, '.openclaw'))) return [openclaw]\n if (fs.existsSync(path.join(HOME, '.clawdbot'))) return [clawdbot]\n if (fs.existsSync(path.join(HOME, '.moltbot'))) return [moltbot]\n return [openclaw] // default for symlink creation\n },\n enabled: true,\n },\n {\n name: 'cline',\n displayName: 'Cline',\n skillsDir: path.join(HOME, '.cline', 'skills'),\n enabled: true,\n },\n {\n name: 'codex',\n displayName: 'Codex',\n skillsDir: path.join(process.env.CODEX_HOME?.trim() || path.join(HOME, '.codex'), 'skills'),\n enabled: true,\n },\n {\n name: 'cursor',\n displayName: 'Cursor',\n skillsDir: path.join(HOME, '.cursor', 'skills'),\n enabled: true,\n /** Cursor does not follow symlinks to discover skills (known bug). Use copy instead. */\n useCopyInsteadOfSymlink: true,\n },\n {\n name: 'droid',\n displayName: 'Droid',\n skillsDir: path.join(HOME, '.factory', 'skills'),\n enabled: true,\n },\n {\n name: 'gemini',\n displayName: 'Gemini',\n skillsDir: path.join(HOME, '.gemini', 'skills'),\n enabled: true,\n },\n {\n name: 'copilot',\n displayName: 'GitHub Copilot',\n skillsDir: path.join(HOME, '.copilot', 'skills'),\n enabled: true,\n },\n {\n name: 'goose',\n displayName: 'Goose',\n skillsDir: path.join(CONFIG_HOME, 'goose', 'skills'),\n enabled: true,\n },\n {\n name: 'kilo',\n displayName: 'Kilo Code',\n skillsDir: path.join(HOME, '.kilocode', 'skills'),\n enabled: true,\n },\n {\n name: 'kiro',\n displayName: 'Kiro CLI',\n skillsDir: path.join(HOME, '.kiro', 'skills'),\n enabled: true,\n },\n {\n name: 'opencode',\n displayName: 'OpenCode',\n skillsDir: path.join(CONFIG_HOME, 'opencode', 'skills'),\n enabled: true,\n },\n {\n name: 'roo',\n displayName: 'Roo Code',\n skillsDir: path.join(HOME, '.roo', 'skills'),\n enabled: true,\n },\n {\n name: 'trae',\n displayName: 'Trae',\n skillsDir: path.join(HOME, '.trae', 'skills'),\n enabled: true,\n },\n {\n name: 'windsurf',\n displayName: 'Windsurf',\n skillsDirs: () => {\n const dirs: string[] = []\n dirs.push(path.join(HOME, '.windsurf', 'skills'))\n dirs.push(path.join(HOME, '.codeium', 'windsurf', 'skills'))\n return dirs\n },\n enabled: true,\n },\n // Additional agents\n {\n name: 'qoder',\n displayName: 'Qoder',\n skillsDir: path.join(HOME, '.qoder', 'skills'),\n enabled: true,\n },\n {\n name: 'continue',\n displayName: 'Continue',\n skillsDir: path.join(HOME, '.continue', 'skills'),\n enabled: true,\n },\n]\n\n/**\n * Shared skills directory for all AI agents\n */\nexport const SHARED_SKILLS_DIR = path.join(HOME, '.emp-agent', 'skills')\n\n/**\n * EMP agent config file\n */\nexport const CONFIG_FILE = path.join(HOME, '.emp-agent', 'config.json')\n\n/**\n * Cache directory\n */\nexport const CACHE_DIR = path.join(HOME, '.emp-agent', 'cache')\n","import {exec} from 'node:child_process'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport {promisify} from 'node:util'\nimport {isGitUrl, parseGitUrl} from '../utils/git.js'\nimport {logger} from '../utils/logger.js'\nimport {AGENTS} from '../config/agents.js'\nimport {detectInstalledAgents, ensureSharedDir, extractSkillName, getSharedSkillPath} from '../utils/paths.js'\nimport {getRegistry} from '../utils/registry.js'\nimport {createSymlink} from '../utils/symlink.js'\n\nconst execAsync = promisify(exec)\n\n/**\n * Execute command with timeout and custom environment\n */\nasync function execWithTimeout(\n command: string,\n timeout = 120000, // 2 minutes default\n env?: NodeJS.ProcessEnv,\n): Promise<{stdout: string; stderr: string}> {\n let timeoutId: NodeJS.Timeout | null = null\n\n const timeoutPromise = new Promise<{stdout: string; stderr: string}>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new Error(`Command timeout after ${timeout / 1000}s`))\n }, timeout)\n })\n\n try {\n const execOptions = env ? {env} : {}\n const result = await Promise.race([execAsync(command, execOptions), timeoutPromise])\n\n // Clear timeout if command completed successfully\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n\n return result\n } catch (error: any) {\n // Clear timeout on error\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n throw error\n }\n}\n\nexport interface InstallOptions {\n agent?: string // specific agent or 'all'\n link?: boolean // dev mode (symlink from local directory)\n force?: boolean // force reinstall\n registry?: string // npm registry URL\n timeout?: number // timeout in milliseconds (default: 180000 for npm, 120000 for git)\n}\n\n/**\n * Install skill to shared directory and create symlinks\n */\n/**\n * Shorten path by replacing home dir with ~\n */\nfunction shortenPath(p: string): string {\n const home = os.homedir()\n return p.startsWith(home) ? p.replace(home, '~') : p\n}\n\nexport async function install(skillNameOrPath: string, options: InstallOptions = {}): Promise<void> {\n const isGit = isGitUrl(skillNameOrPath)\n if (isGit) {\n logger.info('Installing from Git URL')\n logger.dim(skillNameOrPath)\n } else {\n logger.info(`Installing skill: ${skillNameOrPath}`)\n }\n\n // Ensure shared directory exists\n ensureSharedDir()\n\n let skillPath: string\n let skillName: string\n\n // Check Git URL first (before checking local path)\n if (process.env.DEBUG_ESKILL) {\n logger.dim(`[DEBUG] isGitUrl=${isGit}, parseGitUrl=${parseGitUrl(skillNameOrPath) ? 'ok' : 'null'}`)\n }\n if (isGit) {\n // Git URL install mode\n const gitInfo = parseGitUrl(skillNameOrPath)\n if (!gitInfo) {\n logger.error(`Invalid git URL: ${skillNameOrPath}`)\n logger.info('Please ensure the URL is a valid GitHub or GitLab repository URL')\n process.exit(1)\n }\n\n skillName = gitInfo.path ? extractSkillName(path.basename(gitInfo.path)) : extractSkillName(gitInfo.repo)\n const tempDir = path.join('/tmp', `eskill-${Date.now()}`)\n const cloneDir = path.join(tempDir, 'repo')\n\n try {\n const timeout = options.timeout || 120000 // Default 2 minutes for Git\n const gitDetails: string[] = [`${gitInfo.gitUrl}`]\n if (gitInfo.branch) gitDetails.push(`branch: ${gitInfo.branch}`)\n if (gitInfo.path) gitDetails.push(`path: ${gitInfo.path}`)\n logger.dim(gitDetails.join(' Ā· '))\n const spinner = logger.start(`Cloning...`)\n fs.mkdirSync(tempDir, {recursive: true})\n\n // Clone the repository\n const branchFlag = gitInfo.branch ? `-b ${gitInfo.branch}` : ''\n const cloneCommand = branchFlag\n ? `git clone ${branchFlag} ${gitInfo.gitUrl} ${cloneDir} --depth 1 --quiet`\n : `git clone ${gitInfo.gitUrl} ${cloneDir} --depth 1 --quiet`\n\n try {\n await execWithTimeout(cloneCommand, timeout)\n spinner.succeed(`Cloned successfully`)\n } catch (error: any) {\n spinner.fail('Clone failed')\n if (error.message.includes('timeout')) {\n logger.error(`Clone timeout after ${timeout / 1000} seconds`)\n logger.info('')\n logger.info('Possible reasons:')\n logger.info(' - Slow network connection')\n logger.info(' - Large repository size')\n logger.info(' - Git server issues')\n logger.info('')\n logger.info(`Try again or increase timeout: eskill add ${skillNameOrPath} --timeout=300000`)\n }\n throw error\n }\n\n // Determine the skill path\n if (gitInfo.path) {\n // If path is specified, use that subdirectory\n skillPath = path.join(cloneDir, gitInfo.path)\n if (!fs.existsSync(skillPath)) {\n logger.error(`Path not found in repository: ${gitInfo.path}`)\n logger.info(`Repository cloned to: ${cloneDir}`)\n process.exit(1)\n }\n } else {\n // Use the root of the repository\n skillPath = cloneDir\n }\n\n // Verify SKILL.md exists (optional check)\n const skillMdPath = path.join(skillPath, 'SKILL.md')\n if (!fs.existsSync(skillMdPath)) {\n logger.warn(`Warning: SKILL.md not found in ${skillPath}`)\n logger.info('The directory may not be a valid skill package')\n }\n } catch (error: any) {\n logger.error(`Failed to clone repository: ${error.message}`)\n if (error.message.includes('timeout')) {\n logger.error(`Clone timeout after 2 minutes`)\n logger.info('This might be due to:')\n logger.info(' - Slow network connection')\n logger.info(' - Large repository size')\n logger.info(' - Git server issues')\n logger.info(`\\nTry again or check your network connection`)\n }\n logger.info(`\\nTried to clone: ${gitInfo.gitUrl}`)\n if (gitInfo.branch) {\n logger.info(`Branch: ${gitInfo.branch}`)\n }\n process.exit(1)\n }\n } else if (options.link || fs.existsSync(skillNameOrPath)) {\n // Dev mode: link from local directory\n skillPath = path.resolve(skillNameOrPath)\n\n if (!fs.existsSync(skillPath)) {\n logger.error(`Path not found: ${skillPath}`)\n process.exit(1)\n }\n\n // Get skill name from package.json or directory name\n const pkgPath = path.join(skillPath, 'package.json')\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n skillName = extractSkillName(pkg.name)\n } catch {\n skillName = extractSkillName(path.basename(skillPath))\n }\n } else {\n skillName = extractSkillName(path.basename(skillPath))\n }\n } else {\n // NPM install mode\n skillName = extractSkillName(skillNameOrPath)\n const tempDir = path.join('/tmp', `eskill-${Date.now()}`)\n\n try {\n // Determine registry (priority: CLI option > project .npmrc > global npm config > default)\n const registry = options.registry || (await getRegistry())\n const timeout = options.timeout || 180000 // Default 3 minutes for NPM\n\n const spinner = logger.start(`Installing ${skillNameOrPath}...`)\n logger.infoWithoutStop(`Registry: ${registry}`)\n logger.infoWithoutStop(`Timeout: ${timeout / 1000}s`)\n fs.mkdirSync(tempDir, {recursive: true})\n\n // Update spinner with more details\n logger.updateSpinner(`Downloading ${skillNameOrPath} from ${registry}...`)\n\n // Set npm environment variables to avoid permission issues\n // Use user's home directory for npm cache and config\n const homeDir = process.env.HOME || process.env.USERPROFILE || os.homedir()\n const npmCacheDir = path.join(homeDir, '.npm')\n const npmConfigPrefix = path.join(homeDir, '.npm-global')\n\n // Ensure npm cache directory exists\n fs.mkdirSync(npmCacheDir, {recursive: true})\n\n // Build install command with options to avoid global directory access\n const installCommand = `npm install ${skillNameOrPath} --prefix ${tempDir} --registry=${registry} --no-save --silent --no-bin-links --prefer-offline`\n\n // Set environment variables to force npm to use user directories\n const env = {\n ...process.env,\n npm_config_cache: npmCacheDir,\n npm_config_prefix: npmConfigPrefix,\n npm_config_global: 'false',\n }\n\n try {\n await execWithTimeout(installCommand, timeout, env)\n spinner.succeed(`Package ${skillNameOrPath} downloaded successfully`)\n } catch (error: any) {\n spinner.fail('Download failed')\n const errorMessage = error.message || error.stderr || ''\n\n if (errorMessage.includes('timeout')) {\n logger.error(`Download timeout after ${timeout / 1000} seconds`)\n logger.info('')\n logger.info('Possible reasons:')\n logger.info(' - Slow network connection')\n logger.info(' - Registry server issues or unresponsive')\n logger.info(' - Large package size')\n logger.info(' - Network firewall blocking the connection')\n logger.info('')\n logger.info('Suggestions:')\n logger.info(` - Try again: eskill add ${skillNameOrPath}`)\n logger.info(\n ` - Use a different registry: eskill add ${skillNameOrPath} --registry=https://registry.npmjs.org/`,\n )\n logger.info(` - Increase timeout: eskill add ${skillNameOrPath} --timeout=300000`)\n } else if (\n errorMessage.includes('EACCES') ||\n errorMessage.includes('permission denied') ||\n errorMessage.includes('Permission denied')\n ) {\n logger.error('Permission denied error detected')\n logger.info('')\n logger.info('This error occurs when npm tries to access system directories.')\n logger.info('')\n logger.info('šŸ”§ Quick Fix (Recommended):')\n logger.info('')\n logger.info('1. Configure npm to use user directory:')\n logger.info(` mkdir -p ${npmConfigPrefix}`)\n logger.info(` npm config set prefix '${npmConfigPrefix}'`)\n logger.info('')\n logger.info('2. Add to your ~/.zshrc (or ~/.bash_profile):')\n logger.info(` export PATH=\"${npmConfigPrefix}/bin:$PATH\"`)\n logger.info('')\n logger.info('3. Reload shell configuration:')\n logger.info(' source ~/.zshrc')\n logger.info('')\n logger.info('šŸ“š Alternative Solutions:')\n logger.info('')\n logger.info('Option A: Use NVM (Node Version Manager)')\n logger.info(' curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash')\n logger.info(' nvm install --lts')\n logger.info('')\n logger.info('Option B: Fix system directory permissions (requires sudo)')\n logger.info(' sudo chown -R $(whoami) /usr/local/lib/node_modules')\n logger.info('')\n logger.info('Option C: Use sudo (not recommended for security reasons)')\n logger.info(` sudo npm install -g @empjs/skill --registry=${registry}`)\n logger.info('')\n logger.info('After fixing, try again:')\n logger.info(` eskill add ${skillNameOrPath}`)\n } else if (errorMessage.includes('ENOTFOUND') || errorMessage.includes('ECONNREFUSED')) {\n logger.error(`Network connection error: ${errorMessage}`)\n logger.info('')\n logger.info('Please check:')\n logger.info(' - Your internet connection')\n logger.info(` - Registry accessibility: ${registry}`)\n logger.info(\n ` - Try a different registry: eskill add ${skillNameOrPath} --registry=https://registry.npmjs.org/`,\n )\n } else {\n logger.error(`Failed to download: ${errorMessage}`)\n logger.info('')\n logger.info('If this is a permission error, see the solutions above.')\n logger.info('For other errors, please check:')\n logger.info(' - Package name is correct')\n logger.info(' - Registry is accessible')\n logger.info(` - Try: eskill add ${skillNameOrPath} --registry=https://registry.npmjs.org/`)\n }\n process.exit(1)\n }\n\n skillPath = path.join(tempDir, 'node_modules', skillNameOrPath)\n\n if (!fs.existsSync(skillPath)) {\n logger.error(`Failed to download package: ${skillNameOrPath}`)\n process.exit(1)\n }\n } catch (error: any) {\n logger.error(`Failed to download: ${error.message}`)\n process.exit(1)\n }\n }\n\n // Target path in shared directory\n const targetPath = getSharedSkillPath(skillName)\n const sourceIsTarget = path.resolve(skillPath) === path.resolve(targetPath)\n\n // Check if already exists (skip if source is the shared dir - e.g. reinstalling for Cursor only)\n const alreadyExists = fs.existsSync(targetPath) && !sourceIsTarget\n if (alreadyExists) {\n if (options.force) {\n logger.warn('Removing existing installation...')\n fs.rmSync(targetPath, {recursive: true, force: true})\n } else {\n logger.info(`Skill already exists, updating agent links...`)\n }\n }\n\n // Copy or link to shared directory (skip if already exists without --force, or source is shared dir)\n if (sourceIsTarget) {\n logger.info(`Skill already in shared directory, updating agent links...`)\n } else if (alreadyExists && !options.force) {\n // Skip copy, just update agent links\n } else if (options.link) {\n // Dev mode: create symlink\n fs.symlinkSync(skillPath, targetPath, 'dir')\n logger.success(`Linked to shared directory (dev mode)`)\n } else {\n // Production mode: copy files\n copyDir(skillPath, targetPath)\n logger.success(`Installed to shared directory`)\n }\n\n logger.info(`šŸ“ Location: ${targetPath}`)\n\n // Detect installed AI agents\n const cwd = process.cwd()\n const installedAgents = detectInstalledAgents(cwd)\n\n if (installedAgents.length === 0) {\n logger.warn('No AI agents detected')\n logger.info('Skill installed to shared directory, but not linked to any agent')\n logger.info('')\n logger.info('Supported agents:')\n logger.info(' AMP, Antigravity, Claude Code, ClawdBot, Cline, Codex, Cursor, Droid,')\n logger.info(' Gemini, GitHub Copilot, Goose, Kilo, Kiro CLI, OpenCode, Roo, Trae, Windsurf')\n logger.info('')\n logger.info('Run \"eskill agents\" to see all agent directories')\n return\n }\n\n // Determine target agents\n let targetAgents = installedAgents\n\n if (options.agent && options.agent !== 'all') {\n const agent = AGENTS.find(a => a.name === options.agent && a.enabled)\n if (!agent) {\n logger.error(`Unknown agent: ${options.agent}`)\n logger.info(`\\nSupported agents: ${AGENTS.filter(a => a.enabled).map(a => a.name).join(', ')}`)\n process.exit(1)\n }\n targetAgents = [agent]\n if (!installedAgents.find(a => a.name === options.agent)) {\n logger.info(`Note: ${agent.displayName} directory will be created if not exists`)\n }\n }\n\n // Create symlinks\n logger.info('\\nCreating symlinks...')\n let successCount = 0\n for (const agent of targetAgents) {\n if (createSymlink(skillName, agent, cwd)) {\n successCount++\n }\n }\n\n logger.info('')\n logger.success(`āœ… Skill installed successfully!`)\n logger.info(`\\nLinked to ${successCount}/${targetAgents.length} agents`)\n\n if (options.link) {\n logger.info('\\nšŸ’” Dev mode: changes to source files will reflect immediately')\n }\n}\n\n/**\n * Recursively copy directory\n */\nfunction copyDir(src: string, dest: string): void {\n fs.mkdirSync(dest, {recursive: true})\n\n const entries = fs.readdirSync(src, {withFileTypes: true})\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n\n // Skip node_modules and hidden files\n if (entry.name === 'node_modules' || entry.name.startsWith('.')) {\n continue\n }\n\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath)\n } else {\n fs.copyFileSync(srcPath, destPath)\n }\n }\n}\n","/**\n * Parse Git URL for clone/install\n * Supports:\n * - https://github.com/owner/repo\n * - https://github.com/owner/repo/tree/branch\n * - https://github.com/owner/repo/tree/branch/path/to/dir\n * - git@github.com:owner/repo.git\n * - ssh://git@host:port/path/repo.git (e.g. self-hosted GitLab)\n */\nexport interface GitUrlInfo {\n type: 'github' | 'gitlab' | 'other'\n owner: string\n repo: string\n branch?: string\n path?: string\n gitUrl: string\n installUrl: string // npm install compatible format\n}\n\nexport function parseGitUrl(url: string): GitUrlInfo | null {\n // GitHub URL patterns\n const githubPatterns = [\n // https://github.com/owner/repo/tree/branch/path/to/dir\n /^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/([^/]+)(?:\\/(.+))?$/,\n // https://github.com/owner/repo\n /^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)(?:\\/)?$/,\n // git@github.com:owner/repo.git\n /^git@github\\.com:([^/]+)\\/([^/]+)(?:\\.git)?$/,\n ]\n\n // GitLab URL patterns (including self-hosted instances like git.sysop.bigo.sg)\n const gitlabPatterns = [\n // https://host/group/repo/-/tree/branch/path (self-hosted + gitlab.com)\n /^https?:\\/\\/([^/]+)\\/(.+)\\/-\\/tree\\/([^/]+)(?:\\/(.+))?$/,\n // https://gitlab.com/owner/repo\n /^https?:\\/\\/gitlab\\.com\\/([^/]+)\\/([^/]+)(?:\\/)?$/,\n // git@gitlab.com:owner/repo.git or git@host:group/repo.git\n /^git@([^:]+):(.+)(?:\\.git)?$/,\n ]\n\n // Try GitHub patterns\n for (let i = 0; i < githubPatterns.length; i++) {\n const pattern = githubPatterns[i]\n const match = url.match(pattern)\n if (match) {\n const owner = match[1]\n const repo = match[2].replace(/\\.git$/, '')\n // Pattern 0: has branch and path\n // Pattern 1: no branch, no path\n // Pattern 2: SSH format (git@github.com:owner/repo.git)\n let branch: string | undefined\n let path: string | undefined\n let gitUrl: string\n\n if (i === 0) {\n // https://github.com/owner/repo/tree/branch/path\n branch = match[3]\n path = match[4]\n gitUrl = `https://github.com/${owner}/${repo}.git`\n } else if (i === 1) {\n // https://github.com/owner/repo\n branch = 'main'\n gitUrl = `https://github.com/${owner}/${repo}.git`\n } else {\n // git@github.com:owner/repo.git — preserve SSH URL for clone\n branch = 'main'\n gitUrl = url.includes('.git') ? url : `git@github.com:${owner}/${repo}.git`\n }\n\n return {\n type: 'github',\n owner,\n repo,\n branch,\n path,\n gitUrl,\n installUrl: gitUrl,\n }\n }\n }\n\n // Try GitLab patterns\n for (let i = 0; i < gitlabPatterns.length; i++) {\n const pattern = gitlabPatterns[i]\n const match = url.match(pattern)\n if (match) {\n let owner: string\n let repo: string\n let branch: string | undefined\n let path: string | undefined\n let gitUrl: string\n\n if (i === 0) {\n // https://host/group/repo/-/tree/branch/path (self-hosted + gitlab.com)\n const host = match[1]\n const repoPath = match[2].replace(/\\.git$/, '')\n branch = match[3]\n path = match[4]\n const parts = repoPath.split('/')\n repo = parts.pop() || repoPath\n owner = parts.join('/') || repo\n gitUrl = `https://${host}/${repoPath}.git`\n } else if (i === 1) {\n // https://gitlab.com/owner/repo\n owner = match[1]\n repo = match[2].replace(/\\.git$/, '')\n branch = 'main'\n gitUrl = `https://gitlab.com/${owner}/${repo}.git`\n } else {\n // git@host:group/repo.git — preserve SSH URL for clone\n const host = match[1]\n const repoPath = match[2].replace(/\\.git$/, '')\n branch = 'main'\n const parts = repoPath.split('/')\n repo = parts.pop() || repoPath\n owner = parts.join('/') || repo\n gitUrl = url.includes('.git') ? url : `git@${host}:${repoPath}.git`\n }\n\n return {\n type: 'gitlab',\n owner,\n repo,\n branch,\n path,\n gitUrl,\n installUrl: gitUrl,\n }\n }\n }\n\n // ssh://git@host:port/path/repo.git (e.g. ssh://git@git.sysop.bigo.sg:4200/fed-activity/bigolive-skills.git)\n if (url.startsWith('ssh://')) {\n const repoMatch = url.match(/\\/([^/]+)(?:\\.git)?\\/?$/)\n const repo = repoMatch ? repoMatch[1].replace(/\\.git$/, '') : 'repo'\n return {\n type: 'other',\n owner: '',\n repo,\n branch: 'main',\n gitUrl: url.replace(/\\.git\\/?$/, '.git'),\n installUrl: url,\n }\n }\n\n // git+https:// or git+ssh:// or git://\n if (url.startsWith('git+') || url.startsWith('git://')) {\n return {\n type: 'other',\n owner: '',\n repo: '',\n gitUrl: url.replace(/^git\\+/, ''),\n installUrl: url.startsWith('git+') ? url : `git+${url}`,\n }\n }\n\n return null\n}\n\n/**\n * Check if a string is a URL\n */\nexport function isUrl(str: string): boolean {\n try {\n new URL(str)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Check if a string is a GitHub/GitLab URL (including self-hosted GitLab)\n */\nexport function isGitUrl(str: string): boolean {\n return (\n str.includes('github.com') ||\n str.includes('gitlab.com') ||\n str.includes('/-/tree/') || // GitLab web URL pattern (self-hosted)\n str.startsWith('git@') ||\n str.startsWith('ssh://') ||\n str.startsWith('git+') ||\n str.startsWith('git://')\n )\n}\n","import chalk from 'chalk'\nimport ora, {Ora} from 'ora'\n\nclass Logger {\n private spinner: Ora | null = null\n\n info(message: string): void {\n if (this.spinner) this.spinner.stop()\n console.log(chalk.blue('ℹ'), message)\n }\n\n success(message: string): void {\n if (this.spinner) this.spinner.stop()\n console.log(chalk.green('āœ“'), message)\n }\n\n warn(message: string): void {\n if (this.spinner) this.spinner.stop()\n console.log(chalk.yellow('⚠'), message)\n }\n\n error(message: string): void {\n if (this.spinner) this.spinner.stop()\n console.log(chalk.red('āœ—'), message)\n }\n\n dim(message: string): void {\n if (this.spinner) this.spinner.stop()\n console.log(chalk.dim(' ' + message))\n }\n\n start(message: string): Ora {\n if (this.spinner) this.spinner.stop()\n this.spinner = ora(message).start()\n return this.spinner\n }\n\n stopSpinner(): void {\n if (this.spinner) {\n this.spinner.stop()\n this.spinner = null\n }\n }\n\n /**\n * Update spinner text without stopping it\n */\n updateSpinner(message: string): void {\n if (this.spinner) {\n this.spinner.text = message\n }\n }\n\n /**\n * Log info without stopping spinner (for background info)\n */\n infoWithoutStop(message: string): void {\n if (this.spinner) {\n // Temporarily stop to show info, then restart\n const currentText = this.spinner.text\n this.spinner.stop()\n console.log(chalk.blue('ℹ'), message)\n this.spinner.start(currentText)\n } else {\n console.log(chalk.blue('ℹ'), message)\n }\n }\n}\n\nexport const logger = new Logger()\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport {AGENTS, type AgentConfig, getAgentSkillsDirs, SHARED_SKILLS_DIR} from '../config/agents.js'\n\n/**\n * Get skill path in shared directory\n */\nexport function getSharedSkillPath(skillName: string): string {\n return path.join(SHARED_SKILLS_DIR, skillName)\n}\n\n/**\n * Get skill paths in specific AI agent directories (all directories)\n */\nexport function getAgentSkillPaths(agentName: string, skillName: string, cwd?: string): string[] {\n const agent = AGENTS.find(a => a.name === agentName)\n if (!agent) {\n throw new Error(`Unknown agent: ${agentName}`)\n }\n const skillsDirs = getAgentSkillsDirs(agent, cwd)\n return skillsDirs.map(dir => path.join(dir, skillName))\n}\n\n/**\n * Get skill path in specific AI agent directory (first directory, backward compatibility)\n */\nexport function getAgentSkillPath(agentName: string, skillName: string, cwd?: string): string {\n const paths = getAgentSkillPaths(agentName, skillName, cwd)\n if (paths.length === 0) {\n throw new Error(`No skills directories configured for agent: ${agentName}`)\n }\n return paths[0]\n}\n\n/**\n * Ensure shared directory exists\n */\nexport function ensureSharedDir(): void {\n if (!fs.existsSync(SHARED_SKILLS_DIR)) {\n fs.mkdirSync(SHARED_SKILLS_DIR, {recursive: true})\n }\n}\n\n/**\n * Detect installed AI agents\n */\nexport function detectInstalledAgents(cwd?: string): AgentConfig[] {\n return AGENTS.filter(agent => {\n try {\n const skillsDirs = getAgentSkillsDirs(agent, cwd)\n // Check if any directory exists or its parent exists\n return skillsDirs.some(dir => {\n return fs.existsSync(dir) || fs.existsSync(path.dirname(dir))\n })\n } catch {\n return false\n }\n })\n}\n\n/**\n * Extract skill name from package name or path\n * @example\n * extractSkillName('@nova/rn-skill') => 'nova-rn'\n * extractSkillName('/path/to/skill') => 'skill'\n */\nexport function extractSkillName(nameOrPath: string): string {\n if (nameOrPath.startsWith('@')) {\n // NPM package: @nova/rn-skill => nova-rn\n const parts = nameOrPath.split('/')\n if (parts.length === 2) {\n const scope = parts[0].slice(1) // Remove @\n const name = parts[1].replace('-skill', '')\n return `${scope}-${name}`\n }\n }\n\n // Local path\n return path.basename(nameOrPath)\n}\n","import {exec} from 'node:child_process'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport {promisify} from 'node:util'\n\nconst execAsync = promisify(exec)\n\n/**\n * Find .npmrc file by walking up the directory tree\n */\nfunction findNpmrc(startDir: string): string | null {\n let currentDir = path.resolve(startDir)\n\n while (currentDir !== path.dirname(currentDir)) {\n const npmrcPath = path.join(currentDir, '.npmrc')\n if (fs.existsSync(npmrcPath)) {\n return npmrcPath\n }\n currentDir = path.dirname(currentDir)\n }\n\n return null\n}\n\n/**\n * Parse registry from .npmrc file\n */\nfunction parseNpmrc(npmrcPath: string): string | null {\n try {\n const content = fs.readFileSync(npmrcPath, 'utf-8')\n const lines = content.split('\\n')\n\n for (const line of lines) {\n const trimmed = line.trim()\n // Skip comments and empty lines\n if (!trimmed || trimmed.startsWith('#')) {\n continue\n }\n\n // Match registry=... or @scope:registry=...\n const registryMatch = trimmed.match(/^(?:@[^:]+:)?registry\\s*=\\s*(.+)$/)\n if (registryMatch) {\n return registryMatch[1].trim()\n }\n }\n } catch (error) {\n // Ignore parse errors\n }\n\n return null\n}\n\n/**\n * Get registry from global npm config\n */\nasync function getGlobalRegistry(): Promise<string | null> {\n try {\n const {stdout} = await execAsync('npm config get registry')\n const registry = stdout.trim()\n // npm config get registry returns 'undefined' if not set\n if (registry && registry !== 'undefined') {\n return registry\n }\n } catch (error) {\n // Ignore errors\n }\n\n return null\n}\n\n/**\n * Get npm registry with priority:\n * 1. CLI --registry option (handled by caller)\n * 2. Project .npmrc file\n * 3. Global npm config\n * 4. Default https://registry.npmjs.org/\n */\nexport async function getRegistry(cwd: string = process.cwd()): Promise<string> {\n // 1. Check project .npmrc\n const npmrcPath = findNpmrc(cwd)\n if (npmrcPath) {\n const registry = parseNpmrc(npmrcPath)\n if (registry) {\n return registry\n }\n }\n\n // 2. Check global npm config\n const globalRegistry = await getGlobalRegistry()\n if (globalRegistry) {\n return globalRegistry\n }\n\n // 3. Default registry\n return 'https://registry.npmjs.org/'\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type {AgentConfig} from '../config/agents.js'\nimport {getAgentSkillsDirs} from '../config/agents.js'\nimport {logger} from './logger.js'\nimport {getAgentSkillPaths, getSharedSkillPath} from './paths.js'\n\n/**\n * Recursively copy directory (excludes node_modules and hidden files)\n */\nfunction copyDir(src: string, dest: string): void {\n fs.mkdirSync(dest, {recursive: true})\n const entries = fs.readdirSync(src, {withFileTypes: true})\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name.startsWith('.')) continue\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath)\n } else {\n fs.copyFileSync(srcPath, destPath)\n }\n }\n}\n\n/**\n * Create symlink (or copy for Cursor) from shared directory to agent directory(ies)\n * Cursor does not follow symlinks to discover skills - use copy instead.\n */\nexport function createSymlink(skillName: string, agent: AgentConfig, cwd?: string): boolean {\n const source = getSharedSkillPath(skillName)\n\n if (!fs.existsSync(source)) {\n logger.error(`Skill not found: ${source}`)\n return false\n }\n\n const targets = getAgentSkillPaths(agent.name, skillName, cwd)\n const useCopy = agent.useCopyInsteadOfSymlink === true\n let successCount = 0\n\n for (const target of targets) {\n const targetDir = path.dirname(target)\n if (!fs.existsSync(targetDir)) {\n try {\n fs.mkdirSync(targetDir, {recursive: true})\n } catch (error: any) {\n logger.error(`Failed to create directory ${targetDir}: ${error.message}`)\n continue\n }\n }\n\n // Remove existing symlink or directory\n if (fs.existsSync(target)) {\n try {\n const stats = fs.lstatSync(target)\n if (stats.isSymbolicLink()) {\n fs.unlinkSync(target)\n } else if (stats.isDirectory()) {\n fs.rmSync(target, {recursive: true, force: true})\n } else {\n logger.warn(`Target exists but is not a symlink/dir, skipping: ${target}`)\n continue\n }\n } catch (error: any) {\n logger.error(`Failed to remove existing target: ${error.message}`)\n continue\n }\n }\n\n try {\n if (useCopy) {\n copyDir(source, target)\n } else {\n fs.symlinkSync(source, target, 'dir')\n }\n successCount++\n } catch (error: any) {\n logger.error(`Failed to ${useCopy ? 'copy' : 'symlink'} at ${target}: ${error.message}`)\n }\n }\n\n if (successCount > 0) {\n const dirsInfo = targets.length > 1 ? ` (${successCount}/${targets.length} dirs)` : ''\n logger.success(`āœ“ ${agent.displayName}${dirsInfo}`)\n return true\n }\n\n return false\n}\n\n/**\n * Remove symlink or copied directory from agent directory(ies)\n * Handles both symlinks (most agents) and directories (Cursor uses copy)\n */\nexport function removeSymlink(skillName: string, agent: AgentConfig, cwd?: string): boolean {\n const targets = getAgentSkillPaths(agent.name, skillName, cwd)\n let removedCount = 0\n\n for (const target of targets) {\n if (!fs.existsSync(target)) {\n continue\n }\n\n try {\n const stats = fs.lstatSync(target)\n if (stats.isSymbolicLink()) {\n fs.unlinkSync(target)\n removedCount++\n } else if (stats.isDirectory()) {\n fs.rmSync(target, {recursive: true, force: true})\n removedCount++\n } else {\n logger.warn(`Not a symlink or directory: ${target}`)\n }\n } catch (error: any) {\n logger.error(`Failed to remove at ${target}: ${error.message}`)\n }\n }\n\n if (removedCount > 0) {\n const dirsInfo = targets.length > 1 ? ` (${removedCount}/${targets.length} dirs)` : ''\n logger.success(`Unlinked from ${agent.displayName}${dirsInfo}`)\n return true\n }\n\n return false\n}\n\n/**\n * Check if path is a symlink\n */\nexport function isSymlink(filePath: string): boolean {\n try {\n const stats = fs.lstatSync(filePath)\n return stats.isSymbolicLink()\n } catch {\n return false\n }\n}\n\n/**\n * Read symlink target\n */\nexport function readSymlink(filePath: string): string | null {\n try {\n return fs.readlinkSync(filePath)\n } catch {\n return null\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport chalk from 'chalk'\nimport {AGENTS, getAgentSkillsDirs, SHARED_SKILLS_DIR} from '../config/agents.js'\nimport {logger} from '../utils/logger.js'\nimport {isSymlink, readSymlink} from '../utils/symlink.js'\n\n/**\n * List installed skills\n */\nexport function list(): void {\n if (!fs.existsSync(SHARED_SKILLS_DIR)) {\n logger.info('No skills installed')\n logger.info(`\\nTo install a skill, run: ${chalk.cyan('eskill install <skill-name>')}`)\n return\n }\n\n const skills = fs.readdirSync(SHARED_SKILLS_DIR)\n\n if (skills.length === 0) {\n logger.info('No skills installed')\n logger.info(`\\nTo install a skill, run: ${chalk.cyan('eskill install <skill-name>')}`)\n return\n }\n\n console.log(chalk.bold(`\\nInstalled skills in ${SHARED_SKILLS_DIR}:\\n`))\n\n for (const skill of skills) {\n const skillPath = path.join(SHARED_SKILLS_DIR, skill)\n\n try {\n const stats = fs.lstatSync(skillPath)\n\n if (!stats.isDirectory() && !stats.isSymbolicLink()) {\n continue\n }\n\n // Read version from package.json or SKILL.md\n let version = 'unknown'\n\n // Try package.json first\n const pkgPath = path.join(skillPath, 'package.json')\n if (fs.existsSync(pkgPath)) {\n try {\n const pkgContent = fs.readFileSync(pkgPath, 'utf-8')\n const pkg = JSON.parse(pkgContent)\n if (pkg.version && typeof pkg.version === 'string') {\n version = pkg.version\n }\n } catch (error) {\n // JSON parse error, try SKILL.md\n }\n }\n\n // If no version found, try reading from SKILL.md frontmatter\n if (version === 'unknown') {\n const skillMdPath = path.join(skillPath, 'SKILL.md')\n if (fs.existsSync(skillMdPath)) {\n try {\n const skillMdContent = fs.readFileSync(skillMdPath, 'utf-8')\n // Look for version in YAML frontmatter\n const frontmatterMatch = skillMdContent.match(/^---\\s*\\n([\\s\\S]*?)\\n---/)\n if (frontmatterMatch) {\n const frontmatter = frontmatterMatch[1]\n const versionMatch = frontmatter.match(/^version:\\s*(.+)$/m)\n if (versionMatch) {\n version = versionMatch[1].trim().replace(/^[\"']|[\"']$/g, '')\n }\n }\n } catch (error) {\n // Ignore errors\n }\n }\n }\n\n // If still unknown and it's a symlink, try reading from the target\n if (version === 'unknown' && isSymlink(skillPath)) {\n try {\n const targetPath = readSymlink(skillPath)\n if (targetPath) {\n const targetPkgPath = path.join(targetPath, 'package.json')\n if (fs.existsSync(targetPkgPath)) {\n const pkg = JSON.parse(fs.readFileSync(targetPkgPath, 'utf-8'))\n if (pkg.version && typeof pkg.version === 'string') {\n version = pkg.version\n }\n }\n }\n } catch (error) {\n // Ignore errors\n }\n }\n\n // Check if dev mode (symlink in shared dir)\n const isDev = isSymlink(skillPath)\n const devTag = isDev ? chalk.yellow(' (dev)') : ''\n\n // Format version display\n const versionDisplay = version !== 'unknown' ? chalk.gray(`(v${version})`) : ''\n\n console.log(chalk.green('šŸ“¦') + ` ${chalk.bold(skill)}${versionDisplay ? ' ' + versionDisplay : ''}${devTag}`)\n\n // Check which agents are linked (symlink) or copied (e.g. Cursor)\n const cwd = process.cwd()\n const linkedAgents: string[] = []\n for (const agent of AGENTS) {\n const skillsDirs = getAgentSkillsDirs(agent, cwd)\n const hasRef = skillsDirs.some(dir => {\n const agentSkillPath = path.join(dir, skill)\n if (!fs.existsSync(agentSkillPath)) return false\n if (isSymlink(agentSkillPath)) {\n const target = readSymlink(agentSkillPath)\n return target === skillPath\n }\n // Cursor uses copy instead of symlink\n if (agent.useCopyInsteadOfSymlink) {\n return fs.statSync(agentSkillPath).isDirectory()\n }\n return false\n })\n if (hasRef) {\n linkedAgents.push(agent.displayName)\n }\n }\n\n if (linkedAgents.length > 0) {\n console.log(chalk.gray(` → Linked to: ${linkedAgents.join(', ')}`))\n } else {\n console.log(chalk.yellow(` → Not linked to any agent`))\n }\n\n if (isDev) {\n const target = readSymlink(skillPath)\n if (target) {\n console.log(chalk.gray(` → Source: ${target}`))\n }\n }\n\n console.log('')\n } catch (error) {}\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport {AGENTS, getAgentSkillsDirs} from '../config/agents.js'\nimport {logger} from '../utils/logger.js'\nimport {detectInstalledAgents, extractSkillName, getAgentSkillPaths, getSharedSkillPath} from '../utils/paths.js'\nimport {removeSymlink} from '../utils/symlink.js'\n\nexport interface RemoveOptions {\n agent?: string // specific agent or 'all'\n}\n\n/**\n * Remove skill from shared directory and/or agent symlinks\n */\nexport async function remove(skillName: string, options: RemoveOptions = {}): Promise<void> {\n const extractedName = extractSkillName(skillName)\n const sharedPath = getSharedSkillPath(extractedName)\n\n // Check if skill exists in shared directory\n const skillExists = fs.existsSync(sharedPath)\n\n if (!skillExists) {\n logger.error(`Skill not found: ${extractedName}`)\n logger.info(`Location: ${sharedPath}`)\n process.exit(1)\n }\n\n // Detect installed agents\n const cwd = process.cwd()\n const installedAgents = detectInstalledAgents(cwd)\n\n // Determine target agents\n let targetAgents = installedAgents\n\n if (options.agent && options.agent !== 'all') {\n const agent = AGENTS.find(a => a.name === options.agent && a.enabled)\n if (!agent) {\n logger.error(`Unknown agent: ${options.agent}`)\n logger.info(`\\nSupported agents: ${AGENTS.filter(a => a.enabled).map(a => a.name).join(', ')}`)\n process.exit(1)\n }\n targetAgents = [agent]\n }\n\n // Remove symlinks from agent directories\n if (targetAgents.length > 0) {\n logger.info('Removing symlinks from agents...')\n let removedCount = 0\n for (const agent of targetAgents) {\n if (removeSymlink(extractedName, agent, cwd)) {\n removedCount++\n }\n }\n logger.info(`Removed ${removedCount}/${targetAgents.length} symlinks`)\n }\n\n // If --agent is specified, only remove symlinks, keep the skill in shared directory\n if (options.agent && options.agent !== 'all') {\n logger.success(`āœ… Removed symlinks for ${options.agent} only`)\n logger.info(`Skill remains in shared directory: ${sharedPath}`)\n return\n }\n\n // Remove skill from shared directory\n logger.info('Removing skill from shared directory...')\n try {\n const stats = fs.lstatSync(sharedPath)\n if (stats.isSymbolicLink()) {\n fs.unlinkSync(sharedPath)\n logger.success('Removed symlink from shared directory')\n } else {\n fs.rmSync(sharedPath, {recursive: true, force: true})\n logger.success('Removed skill from shared directory')\n }\n } catch (error: any) {\n logger.error(`Failed to remove skill: ${error.message}`)\n process.exit(1)\n }\n\n // Check if there are any remaining links/copies in other agents\n const remainingRefs: string[] = []\n for (const agent of AGENTS) {\n const agentSkillPaths = getAgentSkillPaths(agent.name, extractedName, cwd)\n const hasRef = agentSkillPaths.some(p => fs.existsSync(p))\n if (hasRef) {\n remainingRefs.push(agent.displayName)\n }\n }\n\n if (remainingRefs.length > 0) {\n logger.warn(`\\nāš ļø Warning: Found remaining references in:`)\n for (const agentName of remainingRefs) {\n logger.info(` - ${agentName}`)\n }\n logger.info('\\nYou may need to manually remove these')\n } else {\n logger.success(`āœ… Skill \"${extractedName}\" removed successfully!`)\n }\n}\n"],"mappings":"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","names":["fs","os","fs","os","exec","fs","os","path","promisify","path","chalk","fs","path","path","fs","path","fs","path","fs","path","fs","path","execAsync","promisify","exec","path","fs","os","copyDir","fs","path","chalk","fs","chalk","path","version","fs","fs","__filename","__dirname"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/agents.ts","../src/config/agents.ts","../src/commands/install.ts","../src/utils/git.ts","../src/utils/logger.ts","../src/utils/paths.ts","../src/utils/symlink.ts","../src/utils/collection.ts","../src/utils/config.ts","../src/utils/i18n.ts","../src/commands/list.ts","../src/commands/remove.ts","../src/commands/auth.ts"],"sourcesContent":["#!/usr/bin/env node\nimport {Command} from 'commander'\nimport {readFileSync} from 'fs'\nimport {dirname, join} from 'path'\nimport {fileURLToPath} from 'url'\nimport {agents} from './commands/agents.js'\nimport {install} from './commands/install.js'\nimport {list} from './commands/list.js'\nimport {remove} from './commands/remove.js'\nimport {auth} from './commands/auth.js'\n\n// Read version from package.json\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\nconst packageJsonPath = join(__dirname, '..', 'package.json')\nconst packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'))\nconst version = packageJson.version\n\nconst program = new Command()\n\nprogram.name('eskill').description('Unified CLI tool for managing AI agent skills').version(version)\n\n// Install command (with add alias)\nprogram\n .command('install <skill>')\n .alias('add')\n .description('Install a skill (Supports selective install, local/global scope, and link/copy methods)')\n .option('-a, --agent <name>', 'Install for specific agent (claude, cursor, etc.)')\n .option('--all', 'Install all skills if multiple are found in a collection')\n .option('--global', 'Install to global agent directories (default)')\n .option('--local', 'Install to current project directory (.agent/skills)')\n .option('--link', 'Use symlink for installation (changes reflect instantly)')\n .option('--copy', 'Use full copy for installation (portable)')\n .option('-f, --force', 'Force reinstall if already exists')\n .option('-r, --registry <url>', 'NPM registry URL')\n .option('-t, --timeout <ms>', 'Timeout in milliseconds (default: 180000 for npm, 120000 for git)', value =>\n Number.parseInt(value, 10),\n )\n .action(async (skill, options) => {\n try {\n await install(skill, options)\n } catch (error: any) {\n console.error('Error:', error.message)\n process.exit(1)\n }\n })\n\n// Auth command\nprogram\n .command('auth [domain]')\n .description('Manage access tokens for private repositories')\n .option('-t, --token <token>', 'Access token')\n .option('-l, --list', 'List all saved tokens')\n .option('-r, --remove <domain>', 'Remove token for a domain')\n .action(async (domain, options) => {\n try {\n await auth(domain, options)\n } catch (error: any) {\n console.error('Error:', error.message)\n process.exit(1)\n }\n })\n\n// List command\nprogram\n .command('list')\n .alias('ls')\n .description('List installed skills')\n .action(() => {\n try {\n list()\n } catch (error: any) {\n console.error('Error:', error.message)\n process.exit(1)\n }\n })\n\n// Remove command (with rm and uninstall aliases)\nprogram\n .command('remove <skill>')\n .alias('rm')\n .alias('uninstall')\n .description('Remove an installed skill')\n .option('-a, --agent <name>', 'Remove symlink for specific agent only (keeps skill in shared directory)')\n .action(async (skill, options) => {\n try {\n await remove(skill, options)\n } catch (error: any) {\n console.error('Error:', error.message)\n process.exit(1)\n }\n })\n\n// Agents command\nprogram\n .command('agents')\n .alias('list-agents')\n .description('List all supported AI agents and their skills directories')\n .action(() => {\n try {\n agents()\n } catch (error: any) {\n console.error('Error:', error.message)\n process.exit(1)\n }\n })\n\nprogram.parse()\n","import fs from 'node:fs'\nimport os from 'node:os'\nimport chalk from 'chalk'\nimport {AGENTS, getAgentSkillsDirs, SHARED_SKILLS_DIR} from '../config/agents.js'\n\n/**\n * List all supported agents and their skills directories\n */\nexport function agents(): void {\n const cwd = process.cwd()\n\n console.log(chalk.bold('\\nšŸ“‹ Supported AI Agents:\\n'))\n\n for (const agent of AGENTS) {\n const skillsDirs = getAgentSkillsDirs(agent, cwd)\n const dirsInfo = skillsDirs.length > 1 ? ` (${skillsDirs.length} directories)` : ''\n\n console.log(chalk.bold(agent.displayName))\n console.log(chalk.gray(` Name: ${agent.name}`))\n\n if (skillsDirs.length === 0) {\n console.log(chalk.yellow(' āš ļø No directories configured'))\n } else {\n console.log(chalk.gray(` Directories${dirsInfo}:`))\n for (const dir of skillsDirs) {\n const exists = fs.existsSync(dir)\n const status = exists ? chalk.green('āœ“') : chalk.gray('ā—‹')\n const pathColor = exists ? chalk.white : chalk.gray\n console.log(` ${status} ${pathColor(dir)}`)\n }\n }\n\n console.log('')\n }\n\n console.log(chalk.bold('šŸ“¦ Shared Skills Directory:'))\n const sharedExists = fs.existsSync(SHARED_SKILLS_DIR)\n const sharedStatus = sharedExists ? chalk.green('āœ“') : chalk.gray('ā—‹')\n const sharedPathColor = sharedExists ? chalk.white : chalk.gray\n console.log(` ${sharedStatus} ${sharedPathColor(SHARED_SKILLS_DIR)}`)\n console.log('')\n\n // Show current working directory if different from home\n const home = os.homedir()\n if (cwd !== home) {\n console.log(chalk.gray(`Current working directory: ${cwd}`))\n console.log(chalk.gray('(Project-level directories are shown above)\\n'))\n }\n}\n","import fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nexport interface AgentConfig {\n name: string\n displayName: string\n skillsDir?: string // Single directory (backward compatibility)\n skillsDirs?: string[] | ((cwd?: string) => string[]) // Multiple directories or function to get directories\n enabled: boolean\n /** Use copy instead of symlink (e.g. Cursor doesn't follow symlinks) */\n useCopyInsteadOfSymlink?: boolean\n}\n\nconst HOME = os.homedir()\n// XDG config: ~/.config on Linux/macOS\nconst CONFIG_HOME = process.env.XDG_CONFIG_HOME || path.join(HOME, '.config')\n\n/**\n * Get all skills directories for an agent\n */\nexport function getAgentSkillsDirs(agent: AgentConfig, cwd?: string): string[] {\n if (agent.skillsDirs) {\n if (typeof agent.skillsDirs === 'function') {\n return agent.skillsDirs(cwd)\n }\n return agent.skillsDirs\n }\n if (agent.skillsDir) {\n return [agent.skillsDir]\n }\n return []\n}\n\n/**\n * Supported AI agents configuration\n */\nexport const AGENTS: AgentConfig[] = [\n {\n name: 'amp',\n displayName: 'AMP',\n skillsDirs: (cwd?: string) => {\n const dirs = [path.join(CONFIG_HOME, 'agents', 'skills')]\n if (cwd) dirs.push(path.join(cwd, '.agents', 'skills'))\n return dirs\n },\n enabled: true,\n },\n {\n name: 'antigravity',\n displayName: 'Antigravity',\n skillsDirs: (cwd?: string) => {\n const dirs = [path.join(HOME, '.gemini', 'antigravity', 'skills')]\n if (cwd) dirs.push(path.join(cwd, '.agent', 'skills'))\n if (cwd) dirs.push(path.join(cwd, '.shared', 'skills'))\n return dirs\n },\n enabled: true,\n },\n {\n name: 'claude',\n displayName: 'Claude Code',\n skillsDir: path.join(process.env.CLAUDE_CONFIG_DIR?.trim() || path.join(HOME, '.claude'), 'skills'),\n enabled: true,\n },\n {\n name: 'clawdbot',\n displayName: 'ClawdBot',\n skillsDirs: () => {\n const openclaw = path.join(HOME, '.openclaw', 'skills')\n const clawdbot = path.join(HOME, '.clawdbot', 'skills')\n const moltbot = path.join(HOME, '.moltbot', 'skills')\n if (fs.existsSync(path.join(HOME, '.openclaw'))) return [openclaw]\n if (fs.existsSync(path.join(HOME, '.clawdbot'))) return [clawdbot]\n if (fs.existsSync(path.join(HOME, '.moltbot'))) return [moltbot]\n return [openclaw] // default for symlink creation\n },\n enabled: true,\n },\n {\n name: 'cline',\n displayName: 'Cline',\n skillsDir: path.join(HOME, '.cline', 'skills'),\n enabled: true,\n },\n {\n name: 'codex',\n displayName: 'Codex',\n skillsDir: path.join(process.env.CODEX_HOME?.trim() || path.join(HOME, '.codex'), 'skills'),\n enabled: true,\n },\n {\n name: 'cursor',\n displayName: 'Cursor',\n skillsDir: path.join(HOME, '.cursor', 'skills'),\n enabled: true,\n /** Cursor does not follow symlinks to discover skills (known bug). Use copy instead. */\n useCopyInsteadOfSymlink: true,\n },\n {\n name: 'droid',\n displayName: 'Droid',\n skillsDir: path.join(HOME, '.factory', 'skills'),\n enabled: true,\n },\n {\n name: 'gemini',\n displayName: 'Gemini',\n skillsDir: path.join(HOME, '.gemini', 'skills'),\n enabled: true,\n },\n {\n name: 'copilot',\n displayName: 'GitHub Copilot',\n skillsDir: path.join(HOME, '.copilot', 'skills'),\n enabled: true,\n },\n {\n name: 'goose',\n displayName: 'Goose',\n skillsDir: path.join(CONFIG_HOME, 'goose', 'skills'),\n enabled: true,\n },\n {\n name: 'kilo',\n displayName: 'Kilo Code',\n skillsDir: path.join(HOME, '.kilocode', 'skills'),\n enabled: true,\n },\n {\n name: 'kiro',\n displayName: 'Kiro CLI',\n skillsDir: path.join(HOME, '.kiro', 'skills'),\n enabled: true,\n },\n {\n name: 'opencode',\n displayName: 'OpenCode',\n skillsDir: path.join(CONFIG_HOME, 'opencode', 'skills'),\n enabled: true,\n },\n {\n name: 'roo',\n displayName: 'Roo Code',\n skillsDir: path.join(HOME, '.roo', 'skills'),\n enabled: true,\n },\n {\n name: 'trae',\n displayName: 'Trae',\n skillsDir: path.join(HOME, '.trae', 'skills'),\n enabled: true,\n },\n {\n name: 'windsurf',\n displayName: 'Windsurf',\n skillsDirs: () => {\n const dirs: string[] = []\n dirs.push(path.join(HOME, '.windsurf', 'skills'))\n dirs.push(path.join(HOME, '.codeium', 'windsurf', 'skills'))\n return dirs\n },\n enabled: true,\n },\n // Additional agents\n {\n name: 'qoder',\n displayName: 'Qoder',\n skillsDir: path.join(HOME, '.qoder', 'skills'),\n enabled: true,\n },\n {\n name: 'continue',\n displayName: 'Continue',\n skillsDir: path.join(HOME, '.continue', 'skills'),\n enabled: true,\n },\n]\n\n/**\n * Shared skills directory for all AI agents\n */\nexport const SHARED_SKILLS_DIR = path.join(HOME, '.emp-agent', 'skills')\n\n/**\n * EMP agent config file\n */\nexport const CONFIG_FILE = path.join(HOME, '.emp-agent', 'config.json')\n\n/**\n * Cache directory\n */\nexport const CACHE_DIR = path.join(HOME, '.emp-agent', 'cache')\n","import {exec} from 'node:child_process'\nimport fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport {promisify} from 'node:util'\n// @ts-ignore\nimport enquirer from 'enquirer'\nconst {MultiSelect, Password, Select} = enquirer\nimport chalk from 'chalk'\nimport {isGitUrl, parseGitUrl, convertToSshUrl} from '../utils/git.js'\nimport {logger} from '../utils/logger.js'\nimport {AGENTS} from '../config/agents.js'\nimport {detectInstalledAgents, ensureSharedDir, extractSkillName, getSharedSkillPath} from '../utils/paths.js'\nimport {getRegistry} from '../utils/registry.js'\nimport {createSymlink} from '../utils/symlink.js'\nimport {scanForSkills, type SkillItem} from '../utils/collection.js'\nimport {getToken, saveToken} from '../utils/config.js'\nimport {t} from '../utils/i18n.js'\n\nconst execAsync = promisify(exec)\n\nasync function execWithTimeout(command: string, timeout = 120000, env?: NodeJS.ProcessEnv) {\n let timeoutId: NodeJS.Timeout | null = null\n const timeoutPromise = new Promise((_, reject) => {\n timeoutId = setTimeout(() => reject(new Error(`Timeout ${timeout / 1000}s`)), timeout)\n })\n try {\n const res = await Promise.race([execAsync(command, env ? {env} : {}), timeoutPromise])\n if (timeoutId) clearTimeout(timeoutId)\n return res\n } catch (e) {\n if (timeoutId) clearTimeout(timeoutId)\n throw e\n }\n}\n\nexport interface InstallOptions {\n agent?: string; link?: boolean; copy?: boolean; global?: boolean; local?: boolean; all?: boolean; force?: boolean; registry?: string; timeout?: number\n}\n\n/**\n * Configure OpenClaw-style MultiSelect\n */\nasync function promptSkills(skills: SkillItem[]) {\n const prompt = new MultiSelect({\n name: 'value',\n message: t('selectSkills'),\n choices: skills.map(s => ({\n name: s.name, enabled: true,\n message: `${s.name.substring(0, 20)}${chalk.dim((s.description ? ' - ' + s.description : '').substring(0, 40))}`\n })),\n pointer(state: any, choice: any) { return state.index === choice.index ? chalk.cyan('āÆ') : ' ' },\n indicator(state: any, choice: any) { return choice.enabled ? chalk.green('[āœ”]') : chalk.gray('[ ]') },\n footer: chalk.dim(`\\n (空格勾选, A 全选, Enter 甮认, Esc 退出)`),\n validate(value: string[]) {\n if (value.length === 0) return chalk.red(t('selectAtLeastOne'))\n return true\n }\n })\n return prompt.run()\n}\n\n/**\n * Configure Back-aware Select\n */\nasync function promptSelect(message: string, choices: any[]) {\n const prompt = new Select({\n name: 'value',\n message,\n choices: [...choices, {name: 'back', message: chalk.yellow('← ' + t('back'))}],\n pointer(state: any, choice: any) { return state.index === choice.index ? chalk.cyan('āÆ') : ' ' },\n footer: chalk.dim(`\\n ${t('backHint')}`),\n })\n return prompt.run()\n}\n\nexport async function install(skillNameOrPath: string, options: InstallOptions = {}): Promise<void> {\n const isGit = isGitUrl(skillNameOrPath)\n logger.info(`${chalk.cyan('šŸ”')} ${t('analyzing')} ${chalk.bold(skillNameOrPath)}`)\n ensureSharedDir()\n\n let tempDir = ''; let cloneDir = ''; let availableSkills: SkillItem[] = []\n\n if (isGit) {\n const gitInfo = parseGitUrl(skillNameOrPath)\n if (!gitInfo) { logger.error(t('unsupported', {url: skillNameOrPath})); process.exit(1) }\n tempDir = path.join('/tmp', `eskill-${Date.now()}`); cloneDir = path.join(tempDir, 'repo')\n try {\n const spinner = logger.start(t('fetching')); fs.mkdirSync(tempDir, {recursive: true})\n const domain = new URL(gitInfo.gitUrl).hostname; let gitUrl = gitInfo.gitUrl\n const token = getToken(domain) || process.env[`ESKILL_TOKEN_${domain.toUpperCase().replace(/\\./g, '_')}`]\n const doClone = async (u: string) => execWithTimeout(`git clone ${gitInfo.branch ? '-b ' + gitInfo.branch : ''} ${u} ${cloneDir} --depth 1 --quiet`, options.timeout || 120000)\n \n try {\n let finalUrl = gitUrl; if (token && gitUrl.startsWith('https://')) finalUrl = gitUrl.replace('https://', `https://oauth2:${token}@`)\n await doClone(finalUrl); spinner.succeed(t('sourceReady'))\n } catch (e) {\n const sshUrl = convertToSshUrl(gitUrl)\n if (sshUrl) {\n try { await doClone(sshUrl); spinner.succeed(t('sourceReady')) }\n catch {\n spinner.stop(); logger.warn(`\\nšŸ”’ ${t('authRequired', {domain})}`)\n const newToken = await new Password({ message: t('enterToken', {domain}), validate: (v: string) => v.length > 0 }).run()\n saveToken(domain, newToken); const authedUrl = gitUrl.replace('https://', `https://oauth2:${newToken}@`)\n const fs = logger.start(t('fetching')); await performClone(authedUrl); fs.succeed(t('sourceReady'))\n }\n } else { spinner.fail('Clone failed'); throw e }\n }\n availableSkills = scanForSkills(gitInfo.path ? path.join(cloneDir, gitInfo.path) : cloneDir)\n } catch (error: any) { logger.error(`Error: ${error.message}`); process.exit(1) }\n } else {\n const skillPath = path.resolve(skillNameOrPath)\n if (!fs.existsSync(skillPath)) { logger.error(`Path not found: ${skillPath}`); process.exit(1) }\n availableSkills = scanForSkills(skillPath)\n }\n\n if (availableSkills.length === 0) { logger.error('No skills found'); process.exit(1) }\n\n let step = availableSkills.length === 1 ? 1 : 0 \n let selectedNames: string[] = [availableSkills[0]?.name]\n let installScope: 'global' | 'local' = options.local ? 'local' : 'global'\n let installMethod: 'link' | 'copy' = options.copy ? 'copy' : 'link'\n\n while (step < 3) {\n try {\n if (step === 0) {\n logger.info(`\\nšŸ“¦ ${t('foundSkills', {count: availableSkills.length})}`)\n selectedNames = await promptSkills(availableSkills)\n step = 1\n } else if (step === 1) {\n if (options.global || options.local) { step = 2; continue }\n installScope = await promptSelect(t('selectScope'), [{name: 'global', message: t('globalScope')}, {name: 'local', message: t('localScope')}])\n if (installScope as any === 'back') { step = availableSkills.length === 1 ? -1 : 0; continue }\n step = 2\n } else if (step === 2) {\n if (options.link || options.copy) { step = 3; continue }\n installMethod = await promptSelect(t('selectMethod'), [{name: 'link', message: t('linkMethod')}, {name: 'copy', message: t('copyMethod')}])\n if (installMethod as any === 'back') { step = 1; continue }\n step = 3\n }\n } catch (e) {\n if (step === 0 || step === -1) { logger.warn('\\nInstallation cancelled.'); process.exit(0) }\n step-- // Go back on Esc\n continue\n }\n }\n\n options.local = installScope === 'local'; options.global = installScope === 'global'\n options.copy = installMethod === 'copy'; options.link = installMethod === 'link'\n \n const selectedSkills = selectedNames.map(n => availableSkills.find(s => s.name === n)).filter(Boolean) as SkillItem[]\n const cwd = process.cwd(); let agents = detectInstalledAgents(cwd)\n if (options.local) {\n agents = agents.map(a => ({ ...a, skillsDirs: (c?: string) => (typeof a.skillsDirs === 'function' ? a.skillsDirs(c) : []).filter(d => d.includes(c || cwd))}))\n .filter(a => (typeof a.skillsDirs === 'function' ? a.skillsDirs(cwd) : []).length > 0)\n }\n\n for (const skill of selectedSkills) {\n logger.info(`\\nšŸš€ ${t('installing', {name: skill.name})}`)\n await installFromLocalPath(skill.path, skill.name, options, agents, cwd)\n }\n logger.info(''); logger.success(`āœ… ${t('success', {count: selectedSkills.length})}`)\n}\n\nasync function installFromLocalPath(skillPath: string, skillName: string, options: InstallOptions, installedAgents: any[], cwd: string): Promise<void> {\n const targetPath = getSharedSkillPath(skillName); const sourceIsTarget = path.resolve(skillPath) === path.resolve(targetPath)\n if (fs.existsSync(targetPath) && !sourceIsTarget && options.force) fs.rmSync(targetPath, {recursive: true, force: true})\n if (!sourceIsTarget && (!fs.existsSync(targetPath) || options.force)) {\n if (options.copy) copyDir(skillPath, targetPath)\n else { try { fs.symlinkSync(skillPath, targetPath, 'dir') } catch { copyDir(skillPath, targetPath) } }\n }\n let targets = installedAgents; if (options.agent && options.agent !== 'all') { const a = AGENTS.find(a => a.name === options.agent && a.enabled); if (a) targets = [a] }\n if (targets.length > 0) {\n let count = 0; for (const a of targets) if (createSymlink(skillName, a, cwd, options.copy || a.useCopyInsteadOfSymlink)) count++\n logger.dim(`${skillName} -> ${count} agent(s)`)\n }\n}\n\nfunction copyDir(src: string, dest: string): void {\n fs.mkdirSync(dest, {recursive: true})\n for (const e of fs.readdirSync(src, {withFileTypes: true})) {\n if (e.name === 'node_modules' || e.name.startsWith('.')) continue\n const s = path.join(src, e.name); const d = path.join(dest, e.name)\n if (e.isDirectory()) copyDir(s, d); else fs.copyFileSync(s, d)\n }\n}\n","/**\n * Parse GitHub URL and convert to git install format\n * Supports:\n * - https://github.com/owner/repo\n * - https://github.com/owner/repo/tree/branch\n * - https://github.com/owner/repo/tree/branch/path/to/dir\n * - git@github.com:owner/repo.git\n */\nexport interface GitUrlInfo {\n type: 'github' | 'gitlab' | 'other'\n owner: string\n repo: string\n branch?: string\n path?: string\n gitUrl: string\n installUrl: string // npm install compatible format\n}\n\nexport function parseGitUrl(url: string): GitUrlInfo | null {\n // GitHub URL patterns\n const githubPatterns = [\n // https://github.com/owner/repo/tree/branch/path/to/dir\n /^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/tree\\/([^/]+)(?:\\/(.+))?$/,\n // https://github.com/owner/repo\n /^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)(?:\\/)?$/,\n // git@github.com:owner/repo.git\n /^git@github\\.com:([^/]+)\\/([^/]+)(?:\\.git)?$/,\n ]\n\n // GitLab URL patterns (including self-hosted instances like git.sysop.bigo.sg)\n const gitlabPatterns = [\n // https://host/group/repo/-/tree/branch/path (self-hosted + gitlab.com)\n /^https?:\\/\\/([^/]+)\\/(.+)\\/-\\/tree\\/([^/]+)(?:\\/(.+))?$/,\n // https://gitlab.com/owner/repo\n /^https?:\\/\\/gitlab\\.com\\/([^/]+)\\/([^/]+)(?:\\/)?$/,\n // git@gitlab.com:owner/repo.git or git@host:group/repo.git\n /^git@([^:]+):(.+)(?:\\.git)?$/,\n ]\n\n // Try GitHub patterns\n for (let i = 0; i < githubPatterns.length; i++) {\n const pattern = githubPatterns[i]\n const match = url.match(pattern)\n if (match) {\n const owner = match[1]\n const repo = match[2].replace(/\\.git$/, '')\n // Pattern 0: has branch and path\n // Pattern 1: no branch, no path\n // Pattern 2: SSH format\n let branch: string | undefined\n let path: string | undefined\n\n if (i === 0) {\n // https://github.com/owner/repo/tree/branch/path\n branch = match[3]\n path = match[4]\n } else if (i === 1) {\n // https://github.com/owner/repo\n branch = 'main'\n } else {\n // git@github.com:owner/repo.git\n branch = 'main'\n }\n\n const gitUrl = `https://github.com/${owner}/${repo}.git`\n\n return {\n type: 'github',\n owner,\n repo,\n branch,\n path,\n gitUrl,\n installUrl: gitUrl, // Will be used for git clone\n }\n }\n }\n\n // Try GitLab patterns\n for (let i = 0; i < gitlabPatterns.length; i++) {\n const pattern = gitlabPatterns[i]\n const match = url.match(pattern)\n if (match) {\n let owner: string\n let repo: string\n let branch: string | undefined\n let path: string | undefined\n let gitUrl: string\n\n if (i === 0) {\n // https://host/group/repo/-/tree/branch/path (self-hosted + gitlab.com)\n const host = match[1]\n const repoPath = match[2].replace(/\\.git$/, '')\n branch = match[3]\n path = match[4]\n const parts = repoPath.split('/')\n repo = parts.pop() || repoPath\n owner = parts.join('/') || repo\n gitUrl = `https://${host}/${repoPath}.git`\n } else if (i === 1) {\n // https://gitlab.com/owner/repo\n owner = match[1]\n repo = match[2].replace(/\\.git$/, '')\n branch = 'main'\n gitUrl = `https://gitlab.com/${owner}/${repo}.git`\n } else {\n // git@host:group/repo.git\n const host = match[1]\n const repoPath = match[2].replace(/\\.git$/, '')\n branch = 'main'\n const parts = repoPath.split('/')\n repo = parts.pop() || repoPath\n owner = parts.join('/') || repo\n gitUrl = `https://${host}/${repoPath}.git`\n }\n\n return {\n type: 'gitlab',\n owner,\n repo,\n branch,\n path,\n gitUrl,\n installUrl: gitUrl,\n }\n }\n }\n\n // Check if it's a git URL (git+https:// or git+ssh://)\n if (url.startsWith('git+') || url.startsWith('git://')) {\n return {\n type: 'other',\n owner: '',\n repo: '',\n gitUrl: url.replace(/^git\\+/, ''),\n installUrl: url.startsWith('git+') ? url : `git+${url}`,\n }\n }\n\n return null\n}\n\n/**\n * Check if a string is a URL\n */\nexport function isUrl(str: string): boolean {\n try {\n new URL(str)\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Check if a string is a GitHub/GitLab URL (including self-hosted GitLab)\n */\nexport function convertToSshUrl(httpsUrl: string): string | null {\n try {\n const url = new URL(httpsUrl)\n if (url.protocol !== 'https:' && url.protocol !== 'http:') return null\n // git@host:path\n // Remove leading slash from pathname\n const path = url.pathname.startsWith('/') ? url.pathname.substring(1) : url.pathname\n return `git@${url.hostname}:${path}`\n } catch {\n return null\n }\n}\n\n/**\n * Check if a string is a GitHub/GitLab URL (including self-hosted GitLab)\n */\nexport function isGitUrl(str: string): boolean {\n return (\n str.includes('github.com') ||\n str.includes('gitlab.com') ||\n str.includes('/-/tree/') || // GitLab web URL pattern (self-hosted)\n str.startsWith('git@') ||\n str.startsWith('git+') ||\n str.startsWith('git://')\n )\n}\n","import chalk from 'chalk'\nimport ora, {Ora} from 'ora'\n\nclass Logger {\n private spinner: Ora | null = null\n\n info(message: string): void {\n if (this.spinner) this.spinner.stop()\n console.log(chalk.blue('ℹ'), message)\n }\n\n success(message: string): void {\n if (this.spinner) this.spinner.stop()\n console.log(chalk.green('āœ“'), message)\n }\n\n warn(message: string): void {\n if (this.spinner) this.spinner.stop()\n console.log(chalk.yellow('⚠'), message)\n }\n\n error(message: string): void {\n if (this.spinner) this.spinner.stop()\n console.log(chalk.red('āœ—'), message)\n }\n\n dim(message: string): void {\n if (this.spinner) this.spinner.stop()\n console.log(chalk.dim(' ' + message))\n }\n\n start(message: string): Ora {\n if (this.spinner) this.spinner.stop()\n this.spinner = ora(message).start()\n return this.spinner\n }\n\n stopSpinner(): void {\n if (this.spinner) {\n this.spinner.stop()\n this.spinner = null\n }\n }\n\n /**\n * Update spinner text without stopping it\n */\n updateSpinner(message: string): void {\n if (this.spinner) {\n this.spinner.text = message\n }\n }\n\n /**\n * Log info without stopping spinner (for background info)\n */\n infoWithoutStop(message: string): void {\n if (this.spinner) {\n // Temporarily stop to show info, then restart\n const currentText = this.spinner.text\n this.spinner.stop()\n console.log(chalk.blue('ℹ'), message)\n this.spinner.start(currentText)\n } else {\n console.log(chalk.blue('ℹ'), message)\n }\n }\n}\n\nexport const logger = new Logger()\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport {AGENTS, type AgentConfig, getAgentSkillsDirs, SHARED_SKILLS_DIR} from '../config/agents.js'\n\n/**\n * Get skill path in shared directory\n */\nexport function getSharedSkillPath(skillName: string): string {\n return path.join(SHARED_SKILLS_DIR, skillName)\n}\n\n/**\n * Get skill paths in specific AI agent directories (all directories)\n */\nexport function getAgentSkillPaths(agentName: string, skillName: string, cwd?: string): string[] {\n const agent = AGENTS.find(a => a.name === agentName)\n if (!agent) {\n throw new Error(`Unknown agent: ${agentName}`)\n }\n const skillsDirs = getAgentSkillsDirs(agent, cwd)\n return skillsDirs.map(dir => path.join(dir, skillName))\n}\n\n/**\n * Get skill path in specific AI agent directory (first directory, backward compatibility)\n */\nexport function getAgentSkillPath(agentName: string, skillName: string, cwd?: string): string {\n const paths = getAgentSkillPaths(agentName, skillName, cwd)\n if (paths.length === 0) {\n throw new Error(`No skills directories configured for agent: ${agentName}`)\n }\n return paths[0]\n}\n\n/**\n * Ensure shared directory exists\n */\nexport function ensureSharedDir(): void {\n if (!fs.existsSync(SHARED_SKILLS_DIR)) {\n fs.mkdirSync(SHARED_SKILLS_DIR, {recursive: true})\n }\n}\n\n/**\n * Detect installed AI agents\n */\nexport function detectInstalledAgents(cwd?: string): AgentConfig[] {\n return AGENTS.filter(agent => {\n try {\n const skillsDirs = getAgentSkillsDirs(agent, cwd)\n // Check if any directory exists or its parent exists\n return skillsDirs.some(dir => {\n return fs.existsSync(dir) || fs.existsSync(path.dirname(dir))\n })\n } catch {\n return false\n }\n })\n}\n\n/**\n * Extract skill name from package name or path\n * @example\n * extractSkillName('@nova/rn-skill') => 'nova-rn'\n * extractSkillName('/path/to/skill') => 'skill'\n */\nexport function extractSkillName(nameOrPath: string): string {\n if (nameOrPath.startsWith('@')) {\n // NPM package: @nova/rn-skill => nova-rn\n const parts = nameOrPath.split('/')\n if (parts.length === 2) {\n const scope = parts[0].slice(1) // Remove @\n const name = parts[1].replace('-skill', '')\n return `${scope}-${name}`\n }\n }\n\n // Local path\n return path.basename(nameOrPath)\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport type {AgentConfig} from '../config/agents.js'\nimport {getAgentSkillsDirs} from '../config/agents.js'\nimport {logger} from './logger.js'\nimport {getAgentSkillPaths, getSharedSkillPath} from './paths.js'\n\n/**\n * Recursively copy directory (excludes node_modules and hidden files)\n */\nfunction copyDir(src: string, dest: string): void {\n fs.mkdirSync(dest, {recursive: true})\n const entries = fs.readdirSync(src, {withFileTypes: true})\n for (const entry of entries) {\n if (entry.name === 'node_modules' || entry.name.startsWith('.')) continue\n const srcPath = path.join(src, entry.name)\n const destPath = path.join(dest, entry.name)\n if (entry.isDirectory()) {\n copyDir(srcPath, destPath)\n } else {\n fs.copyFileSync(srcPath, destPath)\n }\n }\n}\n\n/**\n * Create symlink (or copy for Cursor) from shared directory to agent directory(ies)\n * Cursor does not follow symlinks to discover skills - use copy instead.\n */\nexport function createSymlink(\n skillName: string,\n agent: AgentConfig,\n cwd?: string,\n useCopyOverride?: boolean,\n): boolean {\n const source = getSharedSkillPath(skillName)\n\n if (!fs.existsSync(source)) {\n logger.error(`Skill not found: ${source}`)\n return false\n }\n\n const targets = getAgentSkillPaths(agent.name, skillName, cwd)\n const useCopy = useCopyOverride !== undefined ? useCopyOverride : agent.useCopyInsteadOfSymlink === true\n let successCount = 0\n\n for (const target of targets) {\n const targetDir = path.dirname(target)\n if (!fs.existsSync(targetDir)) {\n try {\n fs.mkdirSync(targetDir, {recursive: true})\n } catch (error: any) {\n logger.error(`Failed to create directory ${targetDir}: ${error.message}`)\n continue\n }\n }\n\n // Remove existing symlink or directory\n if (fs.existsSync(target)) {\n try {\n const stats = fs.lstatSync(target)\n if (stats.isSymbolicLink()) {\n fs.unlinkSync(target)\n } else if (stats.isDirectory()) {\n fs.rmSync(target, {recursive: true, force: true})\n } else {\n logger.warn(`Target exists but is not a symlink/dir, skipping: ${target}`)\n continue\n }\n } catch (error: any) {\n logger.error(`Failed to remove existing target: ${error.message}`)\n continue\n }\n }\n\n try {\n if (useCopy) {\n copyDir(source, target)\n } else {\n fs.symlinkSync(source, target, 'dir')\n }\n successCount++\n } catch (error: any) {\n logger.error(`Failed to ${useCopy ? 'copy' : 'symlink'} at ${target}: ${error.message}`)\n }\n }\n\n if (successCount > 0) {\n const dirsInfo = targets.length > 1 ? ` (${successCount}/${targets.length} dirs)` : ''\n logger.success(`āœ“ ${agent.displayName}${dirsInfo}`)\n return true\n }\n\n return false\n}\n\n/**\n * Remove symlink or copied directory from agent directory(ies)\n * Handles both symlinks (most agents) and directories (Cursor uses copy)\n */\nexport function removeSymlink(skillName: string, agent: AgentConfig, cwd?: string): boolean {\n const targets = getAgentSkillPaths(agent.name, skillName, cwd)\n let removedCount = 0\n\n for (const target of targets) {\n if (!fs.existsSync(target)) {\n continue\n }\n\n try {\n const stats = fs.lstatSync(target)\n if (stats.isSymbolicLink()) {\n fs.unlinkSync(target)\n removedCount++\n } else if (stats.isDirectory()) {\n fs.rmSync(target, {recursive: true, force: true})\n removedCount++\n } else {\n logger.warn(`Not a symlink or directory: ${target}`)\n }\n } catch (error: any) {\n logger.error(`Failed to remove at ${target}: ${error.message}`)\n }\n }\n\n if (removedCount > 0) {\n const dirsInfo = targets.length > 1 ? ` (${removedCount}/${targets.length} dirs)` : ''\n logger.success(`Unlinked from ${agent.displayName}${dirsInfo}`)\n return true\n }\n\n return false\n}\n\n/**\n * Check if path is a symlink\n */\nexport function isSymlink(filePath: string): boolean {\n try {\n const stats = fs.lstatSync(filePath)\n return stats.isSymbolicLink()\n } catch {\n return false\n }\n}\n\n/**\n * Read symlink target\n */\nexport function readSymlink(filePath: string): string | null {\n try {\n return fs.readlinkSync(filePath)\n } catch {\n return null\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport interface SkillItem {\n name: string\n path: string\n description?: string\n version?: string\n}\n\n/**\n * Scan directory for skills (directories containing SKILL.md)\n */\nexport function scanForSkills(dir: string): SkillItem[] {\n const skills: SkillItem[] = []\n\n // Check if the directory itself is a skill\n const skillMdPath = path.join(dir, 'SKILL.md')\n if (fs.existsSync(skillMdPath)) {\n skills.push(parseSkillDir(dir))\n }\n\n // Scan subdirectories (only one level deep for performance and clarity)\n const entries = fs.readdirSync(dir, {withFileTypes: true})\n for (const entry of entries) {\n if (entry.isDirectory() && !entry.name.startsWith('.') && entry.name !== 'node_modules') {\n const subDir = path.join(dir, entry.name)\n const subSkillMd = path.join(subDir, 'SKILL.md')\n if (fs.existsSync(subSkillMd)) {\n skills.push(parseSkillDir(subDir))\n }\n }\n }\n\n return skills\n}\n\n/**\n * Parse a skill directory to get name, version, and description\n */\nfunction parseSkillDir(dir: string): SkillItem {\n const name = path.basename(dir)\n let description = ''\n let version = '1.0.0'\n\n // 1. Try to read package.json first (usually more accurate)\n const pkgPath = path.join(dir, 'package.json')\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n if (pkg.description) description = pkg.description\n if (pkg.version) version = pkg.version\n if (pkg.name) {\n return {\n name: pkg.name.replace('@empjs/', ''),\n path: dir,\n description,\n version\n }\n }\n } catch {}\n }\n\n // 2. Fallback to SKILL.md for description\n const skillMdPath = path.join(dir, 'SKILL.md')\n if (fs.existsSync(skillMdPath)) {\n const content = fs.readFileSync(skillMdPath, 'utf-8')\n // Extract description from frontmatter (more robust regex)\n const descMatch = content.match(/description:\\s*(?:\"([^\"]+)\"|'([^']+)'|([^'\"\\n\\r]+))/i)\n if (descMatch) {\n description = descMatch[1] || descMatch[2] || descMatch[3]\n }\n }\n\n return {\n name,\n path: dir,\n description: description.trim(),\n version\n }\n}\n","\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\n\nconst CONFIG_DIR = path.join(os.homedir(), '.emp-agent')\nconst CONFIG_FILE = path.join(CONFIG_DIR, 'config.json')\n\nexport interface SkillSource {\n id: string\n provider: 'gitlab' | 'github'\n url: string\n group: string\n token?: string\n}\n\nexport interface Config {\n sources: SkillSource[]\n tokens: Record<string, string> // domain -> token\n lang?: 'en' | 'zh'\n}\n\nconst DEFAULT_LANG = (Intl.DateTimeFormat().resolvedOptions().locale.startsWith('zh') ? 'zh' : 'en') as 'en' | 'zh'\n\nconst DEFAULT_CONFIG: Config = {\n sources: [],\n tokens: {},\n lang: DEFAULT_LANG\n}\n\nexport function getLang(): 'en' | 'zh' {\n return loadConfig().lang || DEFAULT_LANG\n}\n\nexport function setLang(lang: 'en' | 'zh') {\n const config = loadConfig()\n config.lang = lang\n saveConfig(config)\n}\n\nexport function saveToken(domain: string, token: string) {\n const config = loadConfig()\n config.tokens[domain] = token\n saveConfig(config)\n}\n\nexport function getToken(domain: string): string | undefined {\n const config = loadConfig()\n return config.tokens[domain]\n}\n\nexport function ensureConfigDir() {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true })\n }\n}\n\nexport function loadConfig(): Config {\n ensureConfigDir()\n if (!fs.existsSync(CONFIG_FILE)) {\n return DEFAULT_CONFIG\n }\n try {\n const content = fs.readFileSync(CONFIG_FILE, 'utf-8')\n return { ...DEFAULT_CONFIG, ...JSON.parse(content) }\n } catch {\n return DEFAULT_CONFIG\n }\n}\n\nexport function saveConfig(config: Config) {\n ensureConfigDir()\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2))\n}\n\nexport function addSource(source: SkillSource) {\n const config = loadConfig()\n // Check if ID already exists\n if (config.sources.find(s => s.id === source.id)) {\n throw new Error(`Source with ID '${source.id}' already exists`)\n }\n config.sources.push(source)\n saveConfig(config)\n}\n\nexport function removeSource(id: string) {\n const config = loadConfig()\n const initialLength = config.sources.length\n config.sources = config.sources.filter(s => s.id !== id)\n if (config.sources.length === initialLength) {\n throw new Error(`Source with ID '${id}' not found`)\n }\n saveConfig(config)\n}\n\nexport function listSources(): SkillSource[] {\n return loadConfig().sources\n}\n","import { getLang } from './config.js'\n\nconst translations = {\n en: {\n analyzing: 'Analyzing:',\n fetching: 'Fetching skills from source...',\n sourceReady: 'Source ready',\n foundSkills: 'Found {count} skills:',\n selectSkills: 'Select skills to install',\n selectScope: 'Where do you want to install?',\n selectMethod: 'How do you want to install?',\n globalScope: 'Global (~/.claude, ~/.cursor, etc.)',\n localScope: 'Local Project (./.agent/skills)',\n linkMethod: 'Symlink (Changes reflect instantly)',\n copyMethod: 'Full Copy (Self-contained)',\n installing: 'Installing {name}...',\n processing: 'Processing {name}...',\n success: '{count} skill(s) installed successfully!',\n authRequired: 'Authentication required for {domain}',\n enterToken: 'Please enter Access Token for {domain}:',\n authenticating: 'Authenticating with {domain}...',\n clonedSuccess: 'Cloned successfully',\n noAgents: 'No AI agents detected for the selected scope.',\n linkedTo: 'Linked to: {agents}',\n notLinked: 'Not linked to any agent',\n source: 'Source:',\n installed: 'INSTALLED',\n devLink: 'DEV LINK',\n unsupported: 'Invalid git URL: {url}',\n back: 'Back',\n backHint: '(Press Esc or select Back to go back)',\n selectAtLeastOne: 'Please select at least one skill.'\n },\n zh: {\n analyzing: 'ę­£åœØåˆ†ęž:',\n fetching: 'ę­£åœØä»ŽęŗčŽ·å–ęŠ€čƒ½...',\n sourceReady: 'čŽ·å–ęˆåŠŸ',\n foundSkills: 'å‘ēŽ° {count} äøŖęŠ€čƒ½:',\n selectSkills: 'čÆ·é€‰ę‹©č¦å®‰č£…ēš„ęŠ€čƒ½',\n selectScope: 'ę‚ØåøŒęœ›å®‰č£…åˆ°å“Ŗé‡Œļ¼Ÿ',\n selectMethod: 'ę‚ØåøŒęœ›å¦‚ä½•å®‰č£…ļ¼Ÿ',\n globalScope: '全局目录 (~/.claude, ~/.cursor ē­‰)',\n localScope: 'å½“å‰é”¹ē›® (./.agent/skills)',\n linkMethod: 'č½Æé“¾ęŽ„ (äæ®ę”¹å®žę—¶ē”Ÿę•ˆ)',\n copyMethod: 'å…Øé‡å¤åˆ¶ (离线/独立)',\n installing: 'ę­£åœØå®‰č£… {name}...',\n processing: 'ę­£åœØå¤„ē† {name}...',\n success: 'ęˆåŠŸå®‰č£…äŗ† {count} äøŖęŠ€čƒ½ļ¼',\n authRequired: 'éœ€č¦é‰“ęƒ: {domain}',\n enterToken: '请输兄 {domain} ēš„č®æé—®ä»¤ē‰Œ (Access Token):',\n authenticating: '正在验证 {domain} ēš„é‰“ęƒäæ”ęÆ...',\n clonedSuccess: 'čŽ·å–ęˆåŠŸ',\n noAgents: 'åœØé€‰å®ščŒƒå›“å†…ęœŖę£€ęµ‹åˆ° AI Agent 目录。',\n linkedTo: 'å·²é“¾ęŽ„č‡³: {agents}',\n notLinked: 'ęœŖé“¾ęŽ„åˆ°ä»»ä½• Agent',\n source: '源路径:',\n installed: '已安装',\n devLink: 'å¼€å‘é“¾ęŽ„',\n unsupported: 'ę— ę•ˆēš„ Git URL: {url}',\n back: 'čæ”å›ž',\n backHint: '(ꌉ Esc ęˆ–é€‰ę‹©ā€œčæ”å›žā€ä»„å›žåˆ°äøŠäø€ę­„)',\n selectAtLeastOne: 'čÆ·č‡³å°‘é€‰ę‹©äø€äøŖęŠ€čƒ½ć€‚'\n }\n}\n\nexport function t(key: keyof typeof translations.en, params: Record<string, any> = {}): string {\n const lang = getLang()\n let text = translations[lang][key] || translations.en[key] || key\n \n for (const [p, val] of Object.entries(params)) {\n text = text.replace(`{${p}}`, String(val))\n }\n \n return text\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\nimport chalk from 'chalk'\nimport {AGENTS, getAgentSkillsDirs, SHARED_SKILLS_DIR} from '../config/agents.js'\nimport {logger} from '../utils/logger.js'\nimport {isSymlink, readSymlink} from '../utils/symlink.js'\n\n/**\n * Shorten path by replacing home dir with ~\n */\nfunction shortenPath(p: string): string {\n const home = os.homedir()\n return p.startsWith(home) ? p.replace(home, '~') : p\n}\n\n/**\n * List installed skills\n */\nexport function list(): void {\n if (!fs.existsSync(SHARED_SKILLS_DIR)) {\n logger.info('No skills installed')\n logger.info(`\\nTo install a skill, run: ${chalk.cyan('eskill install <skill-name>')}`)\n return\n }\n\n const skills = fs.readdirSync(SHARED_SKILLS_DIR).filter(s => !s.startsWith('.'))\n\n if (skills.length === 0) {\n logger.info('No skills installed')\n logger.info(`\\nTo install a skill, run: ${chalk.cyan('eskill install <skill-name>')}`)\n return\n }\n\n console.log(chalk.bold(`\\nšŸ“¦ Installed Skills in ${chalk.blue(shortenPath(SHARED_SKILLS_DIR))}:\\n`))\n\n for (const skill of skills) {\n const skillPath = path.join(SHARED_SKILLS_DIR, skill)\n\n try {\n const stats = fs.lstatSync(skillPath)\n\n if (!stats.isDirectory() && !stats.isSymbolicLink()) {\n continue\n }\n\n // Read version from package.json or SKILL.md\n let version = 'unknown'\n let description = ''\n\n // Try package.json first\n const pkgPath = path.join(skillPath, 'package.json')\n if (fs.existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'))\n if (pkg.version) version = pkg.version\n if (pkg.description) description = pkg.description\n } catch (error) {}\n }\n\n // Read description from SKILL.md frontmatter\n if (!description) {\n const skillMdPath = path.join(skillPath, 'SKILL.md')\n if (fs.existsSync(skillMdPath)) {\n const content = fs.readFileSync(skillMdPath, 'utf-8')\n const descMatch = content.match(/description:\\s*[\"']?([^\"'\\n]+)[\"']?/)\n if (descMatch) description = descMatch[1]\n \n if (version === 'unknown') {\n const verMatch = content.match(/version:\\s*(.+)$/m)\n if (verMatch) version = verMatch[1].trim().replace(/^[\"']|[\"']$/g, '')\n }\n }\n }\n\n // Source & Type\n const isDev = isSymlink(skillPath)\n const typeLabel = isDev \n ? chalk.bgYellow.black(' DEV LINK ') \n : chalk.bgBlue.white(' INSTALLED ')\n\n // Format version display\n const versionDisplay = version !== 'unknown' ? chalk.gray(`v${version}`) : ''\n const descDisplay = description ? chalk.dim(` - ${description}`) : ''\n\n console.log(`${chalk.green('ā—')} ${chalk.bold(skill)} ${versionDisplay} ${typeLabel}${descDisplay}`)\n\n // Check linked agents\n const cwd = process.cwd()\n const linkedAgents: string[] = []\n for (const agent of AGENTS) {\n const skillsDirs = getAgentSkillsDirs(agent, cwd)\n const hasRef = skillsDirs.some(dir => {\n const agentSkillPath = path.join(dir, skill)\n if (!fs.existsSync(agentSkillPath)) return false\n if (isSymlink(agentSkillPath)) {\n const target = readSymlink(agentSkillPath)\n return target === skillPath\n }\n if (agent.useCopyInsteadOfSymlink) {\n return fs.statSync(agentSkillPath).isDirectory()\n }\n return false\n })\n if (hasRef) linkedAgents.push(agent.displayName)\n }\n\n if (linkedAgents.length > 0) {\n console.log(chalk.gray(` šŸ”— Linked to: ${chalk.white(linkedAgents.join(', '))}`))\n } else {\n console.log(chalk.red(` āš ļø Not linked to any agent`))\n }\n\n if (isDev) {\n const target = readSymlink(skillPath)\n if (target) {\n console.log(chalk.gray(` šŸ“ Source: ${chalk.dim(shortenPath(target))}`))\n }\n }\n\n console.log('')\n } catch (error) {}\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport {AGENTS, getAgentSkillsDirs} from '../config/agents.js'\nimport {logger} from '../utils/logger.js'\nimport {detectInstalledAgents, extractSkillName, getAgentSkillPaths, getSharedSkillPath} from '../utils/paths.js'\nimport {removeSymlink} from '../utils/symlink.js'\n\nexport interface RemoveOptions {\n agent?: string // specific agent or 'all'\n}\n\n/**\n * Remove skill from shared directory and/or agent symlinks\n */\nexport async function remove(skillName: string, options: RemoveOptions = {}): Promise<void> {\n const extractedName = extractSkillName(skillName)\n const sharedPath = getSharedSkillPath(extractedName)\n\n // Check if skill exists in shared directory\n const skillExists = fs.existsSync(sharedPath)\n\n if (!skillExists) {\n logger.error(`Skill not found: ${extractedName}`)\n logger.info(`Location: ${sharedPath}`)\n process.exit(1)\n }\n\n // Detect installed agents\n const cwd = process.cwd()\n const installedAgents = detectInstalledAgents(cwd)\n\n // Determine target agents\n let targetAgents = installedAgents\n\n if (options.agent && options.agent !== 'all') {\n const agent = AGENTS.find(a => a.name === options.agent && a.enabled)\n if (!agent) {\n logger.error(`Unknown agent: ${options.agent}`)\n logger.info(`\\nSupported agents: ${AGENTS.filter(a => a.enabled).map(a => a.name).join(', ')}`)\n process.exit(1)\n }\n targetAgents = [agent]\n }\n\n // Remove symlinks from agent directories\n if (targetAgents.length > 0) {\n logger.info('Removing symlinks from agents...')\n let removedCount = 0\n for (const agent of targetAgents) {\n if (removeSymlink(extractedName, agent, cwd)) {\n removedCount++\n }\n }\n logger.info(`Removed ${removedCount}/${targetAgents.length} symlinks`)\n }\n\n // If --agent is specified, only remove symlinks, keep the skill in shared directory\n if (options.agent && options.agent !== 'all') {\n logger.success(`āœ… Removed symlinks for ${options.agent} only`)\n logger.info(`Skill remains in shared directory: ${sharedPath}`)\n return\n }\n\n // Remove skill from shared directory\n logger.info('Removing skill from shared directory...')\n try {\n const stats = fs.lstatSync(sharedPath)\n if (stats.isSymbolicLink()) {\n fs.unlinkSync(sharedPath)\n logger.success('Removed symlink from shared directory')\n } else {\n fs.rmSync(sharedPath, {recursive: true, force: true})\n logger.success('Removed skill from shared directory')\n }\n } catch (error: any) {\n logger.error(`Failed to remove skill: ${error.message}`)\n process.exit(1)\n }\n\n // Check if there are any remaining links/copies in other agents\n const remainingRefs: string[] = []\n for (const agent of AGENTS) {\n const agentSkillPaths = getAgentSkillPaths(agent.name, extractedName, cwd)\n const hasRef = agentSkillPaths.some(p => fs.existsSync(p))\n if (hasRef) {\n remainingRefs.push(agent.displayName)\n }\n }\n\n if (remainingRefs.length > 0) {\n logger.warn(`\\nāš ļø Warning: Found remaining references in:`)\n for (const agentName of remainingRefs) {\n logger.info(` - ${agentName}`)\n }\n logger.info('\\nYou may need to manually remove these')\n } else {\n logger.success(`āœ… Skill \"${extractedName}\" removed successfully!`)\n }\n}\n","import { logger } from '../utils/logger.js'\nimport { saveToken, loadConfig } from '../utils/config.js'\n// @ts-ignore\nimport enquirer from 'enquirer'\nconst { Input, Password } = enquirer\n\nexport async function auth(domain?: string, options: { token?: string, list?: boolean, remove?: string } = {}) {\n if (options.list) {\n const config = loadConfig()\n if (Object.keys(config.tokens).length === 0) {\n logger.info('No tokens configured.')\n return\n }\n logger.info('\\nšŸ” Configured Tokens:')\n for (const [dom, token] of Object.entries(config.tokens)) {\n const masked = token.substring(0, 4) + '*'.repeat(token.length - 8) + token.substring(token.length - 4)\n logger.info(` - ${dom}: ${masked}`)\n }\n return\n }\n\n if (options.remove) {\n const config = loadConfig()\n if (config.tokens[options.remove]) {\n delete config.tokens[options.remove]\n saveToken(options.remove, '') // This is a bit hacky with current saveToken, but it works\n logger.success(`Removed token for ${options.remove}`)\n } else {\n logger.error(`No token found for ${options.remove}`)\n }\n return\n }\n\n let targetDomain = domain\n let targetToken = options.token\n\n if (!targetDomain) {\n const prompt = new Input({\n message: 'Enter the domain (e.g., git.internal.corp):',\n validate: (value: string) => value.length > 0\n })\n targetDomain = await prompt.run()\n }\n\n if (!targetToken) {\n const prompt = new Password({\n message: `Enter Access Token for ${targetDomain}:`,\n validate: (value: string) => value.length > 0\n })\n targetToken = await prompt.run()\n }\n\n if (targetDomain && targetToken) {\n saveToken(targetDomain, targetToken)\n logger.success(`Token saved for ${targetDomain}`)\n }\n}\n"],"mappings":"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","names":["fs","os","fs","os","fs","path","chalk","path","path","chalk","fs","path","path","fs","path","fs","path","fs","path","fs","path","version","fs","path","os","CONFIG_FILE","fs","CONFIG_FILE","chalk","path","fs","agents","copyDir","a","fs","path","os","chalk","os","fs","chalk","path","version","fs","fs","enquirer","Password","__filename","__dirname"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empjs/skill",
3
- "version": "1.1.1",
3
+ "version": "1.2.0",
4
4
  "description": "Unified CLI tool for managing AI agent skills across Claude Code, Cursor, Windsurf, and more",
5
5
  "type": "module",
6
6
  "bin": {
@@ -26,11 +26,11 @@
26
26
  "access": "public"
27
27
  },
28
28
  "dependencies": {
29
- "commander": "^12.0.0",
30
29
  "chalk": "^5.3.0",
30
+ "commander": "^12.0.0",
31
+ "enquirer": "^2.4.1",
31
32
  "ora": "^8.0.0"
32
33
  },
33
- "devDependencies": {},
34
34
  "repository": {
35
35
  "type": "git",
36
36
  "url": "git@github.com:emp/skill.git"