@empjs/skill 1.0.7 → 1.0.8

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 CHANGED
@@ -78,7 +78,7 @@ The CLI automatically detects and links to:
78
78
  - **ClawdBot** - `~/.openclaw/skills/` or `~/.clawdbot/skills/`
79
79
  - **Cline** - `~/.cline/skills/`
80
80
  - **Codex** - `~/.codex/skills/`
81
- - **Cursor** - `~/.cursor/skills/`
81
+ - **Cursor** - `~/.cursor/skills/` (uses copy instead of symlink due to [Cursor bug](https://forum.cursor.com/t/cursor-doesnt-follow-symlinks-to-discover-skills/149693))
82
82
  - **Droid** - `~/.factory/skills/`
83
83
  - **Gemini** - `~/.gemini/skills/`
84
84
  - **GitHub Copilot** - `~/.copilot/skills/`
@@ -101,9 +101,9 @@ The CLI automatically detects and links to:
101
101
  ├── config.json
102
102
  └── cache/
103
103
 
104
- # Symlinks to AI agents
104
+ # Symlinks (or copies for Cursor) to AI agents
105
105
  ~/.claude/skills/skill-name -> ~/.emp-agent/skills/skill-name
106
- ~/.cursor/skills/skill-name -> ~/.emp-agent/skills/skill-name
106
+ ~/.cursor/skills/skill-name/ # Copy (Cursor doesn't follow symlinks)
107
107
  ~/.windsurf/skills/skill-name -> ~/.emp-agent/skills/skill-name
108
108
  ```
109
109
 
@@ -264,6 +264,22 @@ ls -la ~/.claude/skills/
264
264
  # Should show symlink arrows (->)
265
265
  ```
266
266
 
267
+ ### Cursor not recognizing skills
268
+
269
+ Cursor has a [known bug](https://forum.cursor.com/t/cursor-doesnt-follow-symlinks-to-discover-skills/149693) where it does not follow symlinks to discover skills. eskill now **copies** (instead of symlinking) skills to `~/.cursor/skills/` for Cursor.
270
+
271
+ If you installed skills before this fix, reinstall to get the copy:
272
+
273
+ ```bash
274
+ # Reinstall for Cursor only (replaces symlink with copy)
275
+ eskill install <skill-name> --force --agent cursor
276
+
277
+ # Or reinstall for all agents
278
+ eskill install <skill-name> --force
279
+ ```
280
+
281
+ Then restart Cursor. Skills appear in **Cursor Settings → Rules → Agent Decides**.
282
+
267
283
  ## License
268
284
 
269
285
  MIT License - EMP Team
package/dist/index.cjs CHANGED
@@ -114,7 +114,9 @@ var AGENTS = [
114
114
  name: "cursor",
115
115
  displayName: "Cursor",
116
116
  skillsDir: import_node_path.default.join(HOME, ".cursor", "skills"),
117
- enabled: true
117
+ enabled: true,
118
+ /** Cursor does not follow symlinks to discover skills (known bug). Use copy instead. */
119
+ useCopyInsteadOfSymlink: true
118
120
  },
119
121
  {
120
122
  name: "droid",
@@ -514,6 +516,20 @@ async function getRegistry(cwd = process.cwd()) {
514
516
  // src/utils/symlink.ts
515
517
  var import_node_fs5 = __toESM(require("fs"), 1);
516
518
  var import_node_path4 = __toESM(require("path"), 1);
519
+ function copyDir(src, dest) {
520
+ import_node_fs5.default.mkdirSync(dest, { recursive: true });
521
+ const entries = import_node_fs5.default.readdirSync(src, { withFileTypes: true });
522
+ for (const entry of entries) {
523
+ if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
524
+ const srcPath = import_node_path4.default.join(src, entry.name);
525
+ const destPath = import_node_path4.default.join(dest, entry.name);
526
+ if (entry.isDirectory()) {
527
+ copyDir(srcPath, destPath);
528
+ } else {
529
+ import_node_fs5.default.copyFileSync(srcPath, destPath);
530
+ }
531
+ }
532
+ }
517
533
  function createSymlink(skillName, agent, cwd) {
518
534
  const source = getSharedSkillPath(skillName);
519
535
  if (!import_node_fs5.default.existsSync(source)) {
@@ -521,6 +537,7 @@ function createSymlink(skillName, agent, cwd) {
521
537
  return false;
522
538
  }
523
539
  const targets = getAgentSkillPaths(agent.name, skillName, cwd);
540
+ const useCopy = agent.useCopyInsteadOfSymlink === true;
524
541
  let successCount = 0;
525
542
  for (const target of targets) {
526
543
  const targetDir = import_node_path4.default.dirname(target);
@@ -537,8 +554,10 @@ function createSymlink(skillName, agent, cwd) {
537
554
  const stats = import_node_fs5.default.lstatSync(target);
538
555
  if (stats.isSymbolicLink()) {
539
556
  import_node_fs5.default.unlinkSync(target);
557
+ } else if (stats.isDirectory()) {
558
+ import_node_fs5.default.rmSync(target, { recursive: true, force: true });
540
559
  } else {
541
- logger.warn(`Target exists but is not a symlink, skipping: ${target}`);
560
+ logger.warn(`Target exists but is not a symlink/dir, skipping: ${target}`);
542
561
  continue;
543
562
  }
544
563
  } catch (error) {
@@ -547,10 +566,14 @@ function createSymlink(skillName, agent, cwd) {
547
566
  }
548
567
  }
549
568
  try {
550
- import_node_fs5.default.symlinkSync(source, target, "dir");
569
+ if (useCopy) {
570
+ copyDir(source, target);
571
+ } else {
572
+ import_node_fs5.default.symlinkSync(source, target, "dir");
573
+ }
551
574
  successCount++;
552
575
  } catch (error) {
553
- logger.error(`Failed to create symlink at ${target}: ${error.message}`);
576
+ logger.error(`Failed to ${useCopy ? "copy" : "symlink"} at ${target}: ${error.message}`);
554
577
  }
555
578
  }
556
579
  if (successCount > 0) {
@@ -572,11 +595,14 @@ function removeSymlink(skillName, agent, cwd) {
572
595
  if (stats.isSymbolicLink()) {
573
596
  import_node_fs5.default.unlinkSync(target);
574
597
  removedCount++;
598
+ } else if (stats.isDirectory()) {
599
+ import_node_fs5.default.rmSync(target, { recursive: true, force: true });
600
+ removedCount++;
575
601
  } else {
576
- logger.warn(`Not a symlink: ${target}`);
602
+ logger.warn(`Not a symlink or directory: ${target}`);
577
603
  }
578
604
  } catch (error) {
579
- logger.error(`Failed to remove symlink at ${target}: ${error.message}`);
605
+ logger.error(`Failed to remove at ${target}: ${error.message}`);
580
606
  }
581
607
  }
582
608
  if (removedCount > 0) {
@@ -625,10 +651,6 @@ async function execWithTimeout(command, timeout = 12e4, env) {
625
651
  throw error;
626
652
  }
627
653
  }
628
- function shortenPath(p) {
629
- const home = import_node_os3.default.homedir();
630
- return p.startsWith(home) ? p.replace(home, "~") : p;
631
- }
632
654
  async function install(skillNameOrPath, options = {}) {
633
655
  const isGit = isGitUrl(skillNameOrPath);
634
656
  if (isGit) {
@@ -835,22 +857,24 @@ Tried to clone: ${gitInfo.gitUrl}`);
835
857
  }
836
858
  }
837
859
  const targetPath = getSharedSkillPath(skillName);
838
- if (import_node_fs6.default.existsSync(targetPath)) {
860
+ const sourceIsTarget = import_node_path5.default.resolve(skillPath) === import_node_path5.default.resolve(targetPath);
861
+ const alreadyExists = import_node_fs6.default.existsSync(targetPath) && !sourceIsTarget;
862
+ if (alreadyExists) {
839
863
  if (options.force) {
840
864
  logger.warn("Removing existing installation...");
841
865
  import_node_fs6.default.rmSync(targetPath, { recursive: true, force: true });
842
866
  } else {
843
- logger.error(`Skill already exists`);
844
- logger.dim(`Location: ${shortenPath(targetPath)}`);
845
- logger.dim(`Tip: Add --force to overwrite`);
846
- process.exit(1);
867
+ logger.info(`Skill already exists, updating agent links...`);
847
868
  }
848
869
  }
849
- if (options.link) {
870
+ if (sourceIsTarget) {
871
+ logger.info(`Skill already in shared directory, updating agent links...`);
872
+ } else if (alreadyExists && !options.force) {
873
+ } else if (options.link) {
850
874
  import_node_fs6.default.symlinkSync(skillPath, targetPath, "dir");
851
875
  logger.success(`Linked to shared directory (dev mode)`);
852
876
  } else {
853
- copyDir(skillPath, targetPath);
877
+ copyDir2(skillPath, targetPath);
854
878
  logger.success(`Installed to shared directory`);
855
879
  }
856
880
  logger.info(`\u{1F4CD} Location: ${targetPath}`);
@@ -896,7 +920,7 @@ Linked to ${successCount}/${targetAgents.length} agents`);
896
920
  logger.info("\n\u{1F4A1} Dev mode: changes to source files will reflect immediately");
897
921
  }
898
922
  }
899
- function copyDir(src, dest) {
923
+ function copyDir2(src, dest) {
900
924
  import_node_fs6.default.mkdirSync(dest, { recursive: true });
901
925
  const entries = import_node_fs6.default.readdirSync(src, { withFileTypes: true });
902
926
  for (const entry of entries) {
@@ -906,7 +930,7 @@ function copyDir(src, dest) {
906
930
  continue;
907
931
  }
908
932
  if (entry.isDirectory()) {
909
- copyDir(srcPath, destPath);
933
+ copyDir2(srcPath, destPath);
910
934
  } else {
911
935
  import_node_fs6.default.copyFileSync(srcPath, destPath);
912
936
  }
@@ -993,15 +1017,19 @@ Installed skills in ${SHARED_SKILLS_DIR}:
993
1017
  const linkedAgents = [];
994
1018
  for (const agent of AGENTS) {
995
1019
  const skillsDirs = getAgentSkillsDirs(agent, cwd);
996
- const hasSymlink = skillsDirs.some((dir) => {
1020
+ const hasRef = skillsDirs.some((dir) => {
997
1021
  const agentSkillPath = import_node_path6.default.join(dir, skill);
998
- if (import_node_fs7.default.existsSync(agentSkillPath) && isSymlink(agentSkillPath)) {
1022
+ if (!import_node_fs7.default.existsSync(agentSkillPath)) return false;
1023
+ if (isSymlink(agentSkillPath)) {
999
1024
  const target = readSymlink(agentSkillPath);
1000
1025
  return target === skillPath;
1001
1026
  }
1027
+ if (agent.useCopyInsteadOfSymlink) {
1028
+ return import_node_fs7.default.statSync(agentSkillPath).isDirectory();
1029
+ }
1002
1030
  return false;
1003
1031
  });
1004
- if (hasSymlink) {
1032
+ if (hasRef) {
1005
1033
  linkedAgents.push(agent.displayName);
1006
1034
  }
1007
1035
  }
@@ -1075,23 +1103,21 @@ Supported agents: ${AGENTS.filter((a) => a.enabled).map((a) => a.name).join(", "
1075
1103
  logger.error(`Failed to remove skill: ${error.message}`);
1076
1104
  process.exit(1);
1077
1105
  }
1078
- const remainingSymlinks = [];
1106
+ const remainingRefs = [];
1079
1107
  for (const agent of AGENTS) {
1080
1108
  const agentSkillPaths = getAgentSkillPaths(agent.name, extractedName, cwd);
1081
- const hasSymlink = agentSkillPaths.some((path7) => {
1082
- return import_node_fs8.default.existsSync(path7) && isSymlink(path7);
1083
- });
1084
- if (hasSymlink) {
1085
- remainingSymlinks.push(agent.displayName);
1109
+ const hasRef = agentSkillPaths.some((p) => import_node_fs8.default.existsSync(p));
1110
+ if (hasRef) {
1111
+ remainingRefs.push(agent.displayName);
1086
1112
  }
1087
1113
  }
1088
- if (remainingSymlinks.length > 0) {
1114
+ if (remainingRefs.length > 0) {
1089
1115
  logger.warn(`
1090
- \u26A0\uFE0F Warning: Found remaining symlinks in:`);
1091
- for (const agentName of remainingSymlinks) {
1116
+ \u26A0\uFE0F Warning: Found remaining references in:`);
1117
+ for (const agentName of remainingRefs) {
1092
1118
  logger.info(` - ${agentName}`);
1093
1119
  }
1094
- logger.info("\nYou may need to manually remove these symlinks");
1120
+ logger.info("\nYou may need to manually remove these");
1095
1121
  } else {
1096
1122
  logger.success(`\u2705 Skill "${extractedName}" removed successfully!`);
1097
1123
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","../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":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","#!/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":["import_node_fs","import_node_os","os","path","fs","chalk","fs","os","import_node_child_process","import_node_fs","import_node_os","import_node_path","import_node_util","path","import_chalk","chalk","ora","import_node_fs","import_node_path","path","fs","path","import_node_fs","import_node_path","path","fs","import_node_fs","import_node_path","fs","path","execAsync","os","path","fs","import_node_fs","import_node_path","import_chalk","fs","chalk","path","version","import_node_fs","fs","path","__filename"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@2.6.1_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.8.2/node_modules/tsup/assets/cjs_shims.js","../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":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","#!/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 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 * 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":["import_node_fs","import_node_os","os","path","fs","chalk","fs","os","import_node_child_process","import_node_fs","import_node_os","import_node_path","import_node_util","path","import_chalk","chalk","ora","import_node_fs","import_node_path","path","fs","path","import_node_fs","import_node_path","path","fs","import_node_fs","import_node_path","fs","path","execAsync","path","fs","os","copyDir","import_node_fs","import_node_path","import_chalk","fs","chalk","path","version","import_node_fs","fs","__filename"]}
package/dist/index.js CHANGED
@@ -87,7 +87,9 @@ var AGENTS = [
87
87
  name: "cursor",
88
88
  displayName: "Cursor",
89
89
  skillsDir: path.join(HOME, ".cursor", "skills"),
90
- enabled: true
90
+ enabled: true,
91
+ /** Cursor does not follow symlinks to discover skills (known bug). Use copy instead. */
92
+ useCopyInsteadOfSymlink: true
91
93
  },
92
94
  {
93
95
  name: "droid",
@@ -487,6 +489,20 @@ async function getRegistry(cwd = process.cwd()) {
487
489
  // src/utils/symlink.ts
488
490
  import fs5 from "fs";
489
491
  import path4 from "path";
492
+ function copyDir(src, dest) {
493
+ fs5.mkdirSync(dest, { recursive: true });
494
+ const entries = fs5.readdirSync(src, { withFileTypes: true });
495
+ for (const entry of entries) {
496
+ if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
497
+ const srcPath = path4.join(src, entry.name);
498
+ const destPath = path4.join(dest, entry.name);
499
+ if (entry.isDirectory()) {
500
+ copyDir(srcPath, destPath);
501
+ } else {
502
+ fs5.copyFileSync(srcPath, destPath);
503
+ }
504
+ }
505
+ }
490
506
  function createSymlink(skillName, agent, cwd) {
491
507
  const source = getSharedSkillPath(skillName);
492
508
  if (!fs5.existsSync(source)) {
@@ -494,6 +510,7 @@ function createSymlink(skillName, agent, cwd) {
494
510
  return false;
495
511
  }
496
512
  const targets = getAgentSkillPaths(agent.name, skillName, cwd);
513
+ const useCopy = agent.useCopyInsteadOfSymlink === true;
497
514
  let successCount = 0;
498
515
  for (const target of targets) {
499
516
  const targetDir = path4.dirname(target);
@@ -510,8 +527,10 @@ function createSymlink(skillName, agent, cwd) {
510
527
  const stats = fs5.lstatSync(target);
511
528
  if (stats.isSymbolicLink()) {
512
529
  fs5.unlinkSync(target);
530
+ } else if (stats.isDirectory()) {
531
+ fs5.rmSync(target, { recursive: true, force: true });
513
532
  } else {
514
- logger.warn(`Target exists but is not a symlink, skipping: ${target}`);
533
+ logger.warn(`Target exists but is not a symlink/dir, skipping: ${target}`);
515
534
  continue;
516
535
  }
517
536
  } catch (error) {
@@ -520,10 +539,14 @@ function createSymlink(skillName, agent, cwd) {
520
539
  }
521
540
  }
522
541
  try {
523
- fs5.symlinkSync(source, target, "dir");
542
+ if (useCopy) {
543
+ copyDir(source, target);
544
+ } else {
545
+ fs5.symlinkSync(source, target, "dir");
546
+ }
524
547
  successCount++;
525
548
  } catch (error) {
526
- logger.error(`Failed to create symlink at ${target}: ${error.message}`);
549
+ logger.error(`Failed to ${useCopy ? "copy" : "symlink"} at ${target}: ${error.message}`);
527
550
  }
528
551
  }
529
552
  if (successCount > 0) {
@@ -545,11 +568,14 @@ function removeSymlink(skillName, agent, cwd) {
545
568
  if (stats.isSymbolicLink()) {
546
569
  fs5.unlinkSync(target);
547
570
  removedCount++;
571
+ } else if (stats.isDirectory()) {
572
+ fs5.rmSync(target, { recursive: true, force: true });
573
+ removedCount++;
548
574
  } else {
549
- logger.warn(`Not a symlink: ${target}`);
575
+ logger.warn(`Not a symlink or directory: ${target}`);
550
576
  }
551
577
  } catch (error) {
552
- logger.error(`Failed to remove symlink at ${target}: ${error.message}`);
578
+ logger.error(`Failed to remove at ${target}: ${error.message}`);
553
579
  }
554
580
  }
555
581
  if (removedCount > 0) {
@@ -598,10 +624,6 @@ async function execWithTimeout(command, timeout = 12e4, env) {
598
624
  throw error;
599
625
  }
600
626
  }
601
- function shortenPath(p) {
602
- const home = os3.homedir();
603
- return p.startsWith(home) ? p.replace(home, "~") : p;
604
- }
605
627
  async function install(skillNameOrPath, options = {}) {
606
628
  const isGit = isGitUrl(skillNameOrPath);
607
629
  if (isGit) {
@@ -808,22 +830,24 @@ Tried to clone: ${gitInfo.gitUrl}`);
808
830
  }
809
831
  }
810
832
  const targetPath = getSharedSkillPath(skillName);
811
- if (fs6.existsSync(targetPath)) {
833
+ const sourceIsTarget = path5.resolve(skillPath) === path5.resolve(targetPath);
834
+ const alreadyExists = fs6.existsSync(targetPath) && !sourceIsTarget;
835
+ if (alreadyExists) {
812
836
  if (options.force) {
813
837
  logger.warn("Removing existing installation...");
814
838
  fs6.rmSync(targetPath, { recursive: true, force: true });
815
839
  } else {
816
- logger.error(`Skill already exists`);
817
- logger.dim(`Location: ${shortenPath(targetPath)}`);
818
- logger.dim(`Tip: Add --force to overwrite`);
819
- process.exit(1);
840
+ logger.info(`Skill already exists, updating agent links...`);
820
841
  }
821
842
  }
822
- if (options.link) {
843
+ if (sourceIsTarget) {
844
+ logger.info(`Skill already in shared directory, updating agent links...`);
845
+ } else if (alreadyExists && !options.force) {
846
+ } else if (options.link) {
823
847
  fs6.symlinkSync(skillPath, targetPath, "dir");
824
848
  logger.success(`Linked to shared directory (dev mode)`);
825
849
  } else {
826
- copyDir(skillPath, targetPath);
850
+ copyDir2(skillPath, targetPath);
827
851
  logger.success(`Installed to shared directory`);
828
852
  }
829
853
  logger.info(`\u{1F4CD} Location: ${targetPath}`);
@@ -869,7 +893,7 @@ Linked to ${successCount}/${targetAgents.length} agents`);
869
893
  logger.info("\n\u{1F4A1} Dev mode: changes to source files will reflect immediately");
870
894
  }
871
895
  }
872
- function copyDir(src, dest) {
896
+ function copyDir2(src, dest) {
873
897
  fs6.mkdirSync(dest, { recursive: true });
874
898
  const entries = fs6.readdirSync(src, { withFileTypes: true });
875
899
  for (const entry of entries) {
@@ -879,7 +903,7 @@ function copyDir(src, dest) {
879
903
  continue;
880
904
  }
881
905
  if (entry.isDirectory()) {
882
- copyDir(srcPath, destPath);
906
+ copyDir2(srcPath, destPath);
883
907
  } else {
884
908
  fs6.copyFileSync(srcPath, destPath);
885
909
  }
@@ -966,15 +990,19 @@ Installed skills in ${SHARED_SKILLS_DIR}:
966
990
  const linkedAgents = [];
967
991
  for (const agent of AGENTS) {
968
992
  const skillsDirs = getAgentSkillsDirs(agent, cwd);
969
- const hasSymlink = skillsDirs.some((dir) => {
993
+ const hasRef = skillsDirs.some((dir) => {
970
994
  const agentSkillPath = path6.join(dir, skill);
971
- if (fs7.existsSync(agentSkillPath) && isSymlink(agentSkillPath)) {
995
+ if (!fs7.existsSync(agentSkillPath)) return false;
996
+ if (isSymlink(agentSkillPath)) {
972
997
  const target = readSymlink(agentSkillPath);
973
998
  return target === skillPath;
974
999
  }
1000
+ if (agent.useCopyInsteadOfSymlink) {
1001
+ return fs7.statSync(agentSkillPath).isDirectory();
1002
+ }
975
1003
  return false;
976
1004
  });
977
- if (hasSymlink) {
1005
+ if (hasRef) {
978
1006
  linkedAgents.push(agent.displayName);
979
1007
  }
980
1008
  }
@@ -1048,23 +1076,21 @@ Supported agents: ${AGENTS.filter((a) => a.enabled).map((a) => a.name).join(", "
1048
1076
  logger.error(`Failed to remove skill: ${error.message}`);
1049
1077
  process.exit(1);
1050
1078
  }
1051
- const remainingSymlinks = [];
1079
+ const remainingRefs = [];
1052
1080
  for (const agent of AGENTS) {
1053
1081
  const agentSkillPaths = getAgentSkillPaths(agent.name, extractedName, cwd);
1054
- const hasSymlink = agentSkillPaths.some((path7) => {
1055
- return fs8.existsSync(path7) && isSymlink(path7);
1056
- });
1057
- if (hasSymlink) {
1058
- remainingSymlinks.push(agent.displayName);
1082
+ const hasRef = agentSkillPaths.some((p) => fs8.existsSync(p));
1083
+ if (hasRef) {
1084
+ remainingRefs.push(agent.displayName);
1059
1085
  }
1060
1086
  }
1061
- if (remainingSymlinks.length > 0) {
1087
+ if (remainingRefs.length > 0) {
1062
1088
  logger.warn(`
1063
- \u26A0\uFE0F Warning: Found remaining symlinks in:`);
1064
- for (const agentName of remainingSymlinks) {
1089
+ \u26A0\uFE0F Warning: Found remaining references in:`);
1090
+ for (const agentName of remainingRefs) {
1065
1091
  logger.info(` - ${agentName}`);
1066
1092
  }
1067
- logger.info("\nYou may need to manually remove these symlinks");
1093
+ logger.info("\nYou may need to manually remove these");
1068
1094
  } else {
1069
1095
  logger.success(`\u2705 Skill "${extractedName}" removed successfully!`);
1070
1096
  }
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}\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"]}
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 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 * 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@empjs/skill",
3
- "version": "1.0.7",
3
+ "version": "1.0.8",
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": {