@empjs/skill 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -3
- package/dist/index.cjs +58 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +58 -32
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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)
|
|
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 (
|
|
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
|
|
1106
|
+
const remainingRefs = [];
|
|
1079
1107
|
for (const agent of AGENTS) {
|
|
1080
1108
|
const agentSkillPaths = getAgentSkillPaths(agent.name, extractedName, cwd);
|
|
1081
|
-
const
|
|
1082
|
-
|
|
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 (
|
|
1114
|
+
if (remainingRefs.length > 0) {
|
|
1089
1115
|
logger.warn(`
|
|
1090
|
-
\u26A0\uFE0F Warning: Found remaining
|
|
1091
|
-
for (const agentName of
|
|
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
|
|
1120
|
+
logger.info("\nYou may need to manually remove these");
|
|
1095
1121
|
} else {
|
|
1096
1122
|
logger.success(`\u2705 Skill "${extractedName}" removed successfully!`);
|
|
1097
1123
|
}
|
package/dist/index.cjs.map
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
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 (
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
993
|
+
const hasRef = skillsDirs.some((dir) => {
|
|
970
994
|
const agentSkillPath = path6.join(dir, skill);
|
|
971
|
-
if (fs7.existsSync(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 (
|
|
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
|
|
1079
|
+
const remainingRefs = [];
|
|
1052
1080
|
for (const agent of AGENTS) {
|
|
1053
1081
|
const agentSkillPaths = getAgentSkillPaths(agent.name, extractedName, cwd);
|
|
1054
|
-
const
|
|
1055
|
-
|
|
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 (
|
|
1087
|
+
if (remainingRefs.length > 0) {
|
|
1062
1088
|
logger.warn(`
|
|
1063
|
-
\u26A0\uFE0F Warning: Found remaining
|
|
1064
|
-
for (const agentName of
|
|
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
|
|
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"]}
|