@empjs/skill 1.0.5 ā 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -5
- package/dist/index.cjs +472 -390
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +471 -389
- package/dist/index.js.map +1 -1
- package/package.json +2 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/install.ts","../src/utils/logger.ts","../src/utils/paths.ts","../src/config/agents.ts","../src/utils/symlink.ts","../src/utils/registry.ts","../src/utils/git.ts","../src/commands/list.ts","../src/commands/remove.ts","../src/commands/agents.ts"],"sourcesContent":["#!/usr/bin/env node\nimport {Command} from 'commander'\nimport {readFileSync} from 'fs'\nimport {fileURLToPath} from 'url'\nimport {dirname, join} from 'path'\nimport {install} from './commands/install.js'\nimport {list} from './commands/list.js'\nimport {remove} from './commands/remove.js'\nimport {agents} from './commands/agents.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\n .name('eskill')\n .description('Unified CLI tool for managing AI agent skills')\n .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) => parseInt(value, 10))\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 {exec} from 'node:child_process'\nimport {promisify} from 'node:util'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\nimport {logger} from '../utils/logger.js'\nimport {\n ensureSharedDir,\n detectInstalledAgents,\n extractSkillName,\n getSharedSkillPath,\n} from '../utils/paths.js'\nimport {createSymlink} from '../utils/symlink.js'\nimport {getRegistry} from '../utils/registry.js'\nimport {parseGitUrl, isGitUrl} from '../utils/git.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: number = 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([\n execAsync(command, execOptions),\n timeoutPromise,\n ])\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 */\nexport async function install(\n skillNameOrPath: string,\n options: InstallOptions = {},\n): Promise<void> {\n logger.info(`Installing skill: ${skillNameOrPath}`)\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 // This prevents URLs from being mistaken as local paths\n if (isGitUrl(skillNameOrPath)) {\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\n ? extractSkillName(path.basename(gitInfo.path))\n : 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 spinner = logger.start(`Cloning ${gitInfo.gitUrl}...`)\n logger.infoWithoutStop(`Repository: ${gitInfo.gitUrl}`)\n if (gitInfo.branch) {\n logger.infoWithoutStop(`Branch: ${gitInfo.branch}`)\n }\n if (gitInfo.path) {\n logger.infoWithoutStop(`Path: ${gitInfo.path}`)\n }\n logger.infoWithoutStop(`Timeout: ${timeout / 1000}s`)\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(`Repository 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(` - Use a different registry: eskill add ${skillNameOrPath} --registry=https://registry.npmjs.org/`)\n logger.info(` - Increase timeout: eskill add ${skillNameOrPath} --timeout=300000`)\n } else if (errorMessage.includes('EACCES') || errorMessage.includes('permission denied') || errorMessage.includes('Permission denied')) {\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(` - Try a different registry: eskill add ${skillNameOrPath} --registry=https://registry.npmjs.org/`)\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\n // Check if already exists\n if (fs.existsSync(targetPath)) {\n if (options.force) {\n logger.warn('Removing existing installation...')\n fs.rmSync(targetPath, {recursive: true, force: true})\n } else {\n logger.error(`Skill already exists: ${targetPath}`)\n logger.info('Use --force to overwrite')\n process.exit(1)\n }\n }\n\n // Copy or link to shared directory\n 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(' - Claude Code (~/.claude/skills)')\n logger.info(' - Cursor (~/.cursor/skills)')\n logger.info(' - Windsurf (~/.windsurf/skills)')\n return\n }\n\n // Determine target agents\n let targetAgents = installedAgents\n\n if (options.agent && options.agent !== 'all') {\n const agent = installedAgents.find((a) => a.name === options.agent)\n if (!agent) {\n logger.error(`Agent not installed: ${options.agent}`)\n logger.info(`\\nInstalled agents: ${installedAgents.map((a) => a.name).join(', ')}`)\n process.exit(1)\n }\n targetAgents = [agent]\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","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 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 {SHARED_SKILLS_DIR, AGENTS, type AgentConfig, getAgentSkillsDirs} 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 os from 'node:os'\nimport path from 'node:path'\nimport fs from 'node:fs'\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}\n\nconst HOME = os.homedir()\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: 'claude',\n displayName: 'Claude Code',\n skillsDir: path.join(HOME, '.claude', 'skills'),\n enabled: true,\n },\n {\n name: 'cursor',\n displayName: 'Cursor',\n skillsDir: path.join(HOME, '.cursor', 'skills'),\n enabled: true,\n },\n {\n name: 'windsurf',\n displayName: 'Windsurf',\n skillsDir: path.join(HOME, '.windsurf', 'skills'),\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: 'gemini',\n displayName: 'Gemini Code',\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: 'opencode',\n displayName: 'OpenCode',\n skillsDir: path.join(HOME, '.opencode', 'skills'),\n enabled: true,\n },\n {\n name: 'antigravity',\n displayName: 'Antigravity',\n skillsDirs: (cwd?: string) => {\n const dirs: string[] = []\n // Global directory\n dirs.push(path.join(HOME, '.gemini', 'antigravity', 'skills'))\n // Project-level .agent/skills directory (always include if cwd is provided)\n if (cwd) {\n dirs.push(path.join(cwd, '.agent', 'skills'))\n }\n // Project-level .shared/skills directory (always include if cwd is provided)\n if (cwd) {\n dirs.push(path.join(cwd, '.shared', 'skills'))\n }\n return dirs\n },\n enabled: true,\n },\n {\n name: 'kiro',\n displayName: 'Kiro',\n skillsDir: path.join(HOME, '.kiro', 'skills'),\n enabled: true,\n },\n {\n name: 'codex',\n displayName: 'Codex CLI',\n skillsDir: path.join(HOME, '.codex', 'skills'),\n enabled: true,\n },\n {\n name: 'qoder',\n displayName: 'Qoder',\n skillsDir: path.join(HOME, '.qoder', 'skills'),\n enabled: true,\n },\n {\n name: 'roocode',\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: '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 fs from 'node:fs'\nimport path from 'node:path'\nimport {getSharedSkillPath, getAgentSkillPaths} from './paths.js'\nimport {logger} from './logger.js'\nimport type {AgentConfig} from '../config/agents.js'\nimport {getAgentSkillsDirs} from '../config/agents.js'\n\n/**\n * Create symlink from shared directory to agent directory(ies)\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 let successCount = 0\n\n for (const target of targets) {\n // Ensure target directory exists\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 {\n logger.warn(`Target exists but is not a symlink, 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 fs.symlinkSync(source, target, 'dir')\n successCount++\n } catch (error: any) {\n logger.error(`Failed to create 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 from agent directory(ies)\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 {\n logger.warn(`Not a symlink: ${target}`)\n }\n } catch (error: any) {\n logger.error(`Failed to remove symlink 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 {exec} from 'node:child_process'\nimport {promisify} from 'node:util'\nimport fs from 'node:fs'\nimport path from 'node:path'\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","/**\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\n const gitlabPatterns = [\n // https://gitlab.com/owner/repo/-/tree/branch/path/to/dir\n /^https?:\\/\\/gitlab\\.com\\/([^\\/]+)\\/([^\\/]+)\\/-\\/tree\\/([^\\/]+)(?:\\/(.+))?$/,\n // https://gitlab.com/owner/repo\n /^https?:\\/\\/gitlab\\.com\\/([^\\/]+)\\/([^\\/]+)(?:\\/)?$/,\n // git@gitlab.com:owner/repo.git\n /^git@gitlab\\.com:([^\\/]+)\\/([^\\/]+)(?:\\.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 const owner = match[1]\n const repo = match[2].replace(/\\.git$/, '')\n let branch: string | undefined\n let path: string | undefined\n\n if (i === 0) {\n // https://gitlab.com/owner/repo/-/tree/branch/path\n branch = match[3]\n path = match[4]\n } else if (i === 1) {\n // https://gitlab.com/owner/repo\n branch = 'main'\n } else {\n // git@gitlab.com:owner/repo.git\n branch = 'main'\n }\n\n const gitUrl = `https://gitlab.com/${owner}/${repo}.git`\n\n return {\n type: 'gitlab',\n owner,\n repo,\n branch,\n path,\n gitUrl,\n installUrl: gitUrl, // Will be used for git clone\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\n */\nexport function isGitUrl(str: string): boolean {\n return (\n str.includes('github.com') ||\n str.includes('gitlab.com') ||\n str.startsWith('git@') ||\n str.startsWith('git+') ||\n str.startsWith('git://')\n )\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport chalk from 'chalk'\nimport {logger} from '../utils/logger.js'\nimport {SHARED_SKILLS_DIR, AGENTS, getAgentSkillsDirs} from '../config/agents.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\n const cwd = process.cwd()\n const linkedAgents: string[] = []\n for (const agent of AGENTS) {\n const skillsDirs = getAgentSkillsDirs(agent, cwd)\n const hasSymlink = skillsDirs.some((dir) => {\n const agentSkillPath = path.join(dir, skill)\n if (fs.existsSync(agentSkillPath) && isSymlink(agentSkillPath)) {\n const target = readSymlink(agentSkillPath)\n return target === skillPath\n }\n return false\n })\n if (hasSymlink) {\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 // Skip entries that can't be read\n continue\n }\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport {logger} from '../utils/logger.js'\nimport {\n getSharedSkillPath,\n getAgentSkillPaths,\n extractSkillName,\n detectInstalledAgents,\n} from '../utils/paths.js'\nimport {removeSymlink, isSymlink} from '../utils/symlink.js'\nimport {AGENTS, getAgentSkillsDirs} from '../config/agents.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 = installedAgents.find((a) => a.name === options.agent)\n if (!agent) {\n logger.error(`Agent not installed: ${options.agent}`)\n logger.info(`\\nInstalled agents: ${installedAgents.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 symlinks in other agents\n const remainingSymlinks: string[] = []\n for (const agent of AGENTS) {\n const agentSkillPaths = getAgentSkillPaths(agent.name, extractedName, cwd)\n const hasSymlink = agentSkillPaths.some((path) => {\n return fs.existsSync(path) && isSymlink(path)\n })\n if (hasSymlink) {\n remainingSymlinks.push(agent.displayName)\n }\n }\n\n if (remainingSymlinks.length > 0) {\n logger.warn(`\\nā ļø Warning: Found remaining symlinks in:`)\n for (const agentName of remainingSymlinks) {\n logger.info(` - ${agentName}`)\n }\n logger.info('\\nYou may need to manually remove these symlinks')\n } else {\n logger.success(`ā
Skill \"${extractedName}\" removed successfully!`)\n }\n}\n","import chalk from 'chalk'\nimport {AGENTS, getAgentSkillsDirs, SHARED_SKILLS_DIR} from '../config/agents.js'\nimport fs from 'node:fs'\nimport os from 'node:os'\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"],"mappings":"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","names":["exec","promisify","fs","path","os","path","path","path","fs","path","fs","path","fs","path","path","execAsync","promisify","exec","path","fs","os","fs","path","chalk","fs","chalk","path","version","fs","fs","path","chalk","fs","os","chalk","__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/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}\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 },\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\n // Check if already exists\n if (fs.existsSync(targetPath)) {\n if (options.force) {\n logger.warn('Removing existing installation...')\n fs.rmSync(targetPath, {recursive: true, force: true})\n } else {\n logger.error(`Skill already exists`)\n logger.dim(`Location: ${shortenPath(targetPath)}`)\n logger.dim(`Tip: Add --force to overwrite`)\n process.exit(1)\n }\n }\n\n // Copy or link to shared directory\n 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 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 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 {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 * Create symlink from shared directory to agent directory(ies)\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 let successCount = 0\n\n for (const target of targets) {\n // Ensure target directory exists\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 {\n logger.warn(`Target exists but is not a symlink, 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 fs.symlinkSync(source, target, 'dir')\n successCount++\n } catch (error: any) {\n logger.error(`Failed to create 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 from agent directory(ies)\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 {\n logger.warn(`Not a symlink: ${target}`)\n }\n } catch (error: any) {\n logger.error(`Failed to remove symlink 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\n const cwd = process.cwd()\n const linkedAgents: string[] = []\n for (const agent of AGENTS) {\n const skillsDirs = getAgentSkillsDirs(agent, cwd)\n const hasSymlink = skillsDirs.some(dir => {\n const agentSkillPath = path.join(dir, skill)\n if (fs.existsSync(agentSkillPath) && isSymlink(agentSkillPath)) {\n const target = readSymlink(agentSkillPath)\n return target === skillPath\n }\n return false\n })\n if (hasSymlink) {\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 {isSymlink, 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 symlinks in other agents\n const remainingSymlinks: string[] = []\n for (const agent of AGENTS) {\n const agentSkillPaths = getAgentSkillPaths(agent.name, extractedName, cwd)\n const hasSymlink = agentSkillPaths.some(path => {\n return fs.existsSync(path) && isSymlink(path)\n })\n if (hasSymlink) {\n remainingSymlinks.push(agent.displayName)\n }\n }\n\n if (remainingSymlinks.length > 0) {\n logger.warn(`\\nā ļø Warning: Found remaining symlinks in:`)\n for (const agentName of remainingSymlinks) {\n logger.info(` - ${agentName}`)\n }\n logger.info('\\nYou may need to manually remove these symlinks')\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","os","path","fs","fs","path","chalk","fs","chalk","path","version","fs","fs","path","__filename","__dirname"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@empjs/skill",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
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": {
|
|
@@ -30,11 +30,7 @@
|
|
|
30
30
|
"chalk": "^5.3.0",
|
|
31
31
|
"ora": "^8.0.0"
|
|
32
32
|
},
|
|
33
|
-
"devDependencies": {
|
|
34
|
-
"@types/node": "^20.0.0",
|
|
35
|
-
"tsup": "^8.0.0",
|
|
36
|
-
"typescript": "^5.3.0"
|
|
37
|
-
},
|
|
33
|
+
"devDependencies": {},
|
|
38
34
|
"repository": {
|
|
39
35
|
"type": "git",
|
|
40
36
|
"url": "git@github.com:emp/skill.git"
|