@james-jj-wang/agent-skills-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Supported AI Agent definitions.
3
+ * Maps agent CLI flags to their project-level and global skill directories.
4
+ * Based on: https://github.com/vercel-labs/skills (2026-02)
5
+ */
6
+ export interface AgentConfig {
7
+ /** Display name shown in interactive prompts */
8
+ name: string;
9
+ /** CLI flag value for --tool */
10
+ flag: string;
11
+ /** Project-level skills directory (relative to project root) */
12
+ projectPath: string;
13
+ /** Global skills directory (relative to user home ~) */
14
+ globalPath: string;
15
+ }
16
+ export declare const AGENTS: AgentConfig[];
17
+ /** The popular agents shown at the top of the interactive selection list */
18
+ export declare const POPULAR_AGENT_FLAGS: string[];
19
+ /**
20
+ * Find an agent config by its CLI flag value.
21
+ */
22
+ export declare function findAgentByFlag(flag: string): AgentConfig | undefined;
23
+ /**
24
+ * Get the list of all valid agent flag values.
25
+ */
26
+ export declare function getAllAgentFlags(): string[];
27
+ //# sourceMappingURL=agents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,WAAW;IACxB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,MAAM,EAAE,WAAW,EA6C/B,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,mBAAmB,UAU/B,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAErE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAE3C"}
package/dist/agents.js ADDED
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Supported AI Agent definitions.
3
+ * Maps agent CLI flags to their project-level and global skill directories.
4
+ * Based on: https://github.com/vercel-labs/skills (2026-02)
5
+ */
6
+ export const AGENTS = [
7
+ // --- Popular / Mainstream ---
8
+ { name: "Cursor", flag: "cursor", projectPath: ".agents/skills", globalPath: ".cursor/skills" },
9
+ { name: "Claude Code", flag: "claude-code", projectPath: ".claude/skills", globalPath: ".claude/skills" },
10
+ { name: "GitHub Copilot", flag: "github-copilot", projectPath: ".agents/skills", globalPath: ".copilot/skills" },
11
+ { name: "Gemini CLI", flag: "gemini-cli", projectPath: ".agents/skills", globalPath: ".gemini/skills" },
12
+ { name: "Antigravity", flag: "antigravity", projectPath: ".agent/skills", globalPath: ".gemini/antigravity/skills" },
13
+ { name: "Codex", flag: "codex", projectPath: ".agents/skills", globalPath: ".codex/skills" },
14
+ { name: "Windsurf", flag: "windsurf", projectPath: ".windsurf/skills", globalPath: ".codeium/windsurf/skills" },
15
+ { name: "Roo Code", flag: "roo", projectPath: ".roo/skills", globalPath: ".roo/skills" },
16
+ { name: "Cline", flag: "cline", projectPath: ".cline/skills", globalPath: ".cline/skills" },
17
+ // --- Others (alphabetical) ---
18
+ { name: "Amp", flag: "amp", projectPath: ".agents/skills", globalPath: ".config/agents/skills" },
19
+ { name: "Augment", flag: "augment", projectPath: ".augment/skills", globalPath: ".augment/skills" },
20
+ { name: "CodeBuddy", flag: "codebuddy", projectPath: ".codebuddy/skills", globalPath: ".codebuddy/skills" },
21
+ { name: "Command Code", flag: "command-code", projectPath: ".commandcode/skills", globalPath: ".commandcode/skills" },
22
+ { name: "Continue", flag: "continue", projectPath: ".continue/skills", globalPath: ".continue/skills" },
23
+ { name: "Cortex Code", flag: "cortex", projectPath: ".cortex/skills", globalPath: ".snowflake/cortex/skills" },
24
+ { name: "Crush", flag: "crush", projectPath: ".crush/skills", globalPath: ".config/crush/skills" },
25
+ { name: "Droid", flag: "droid", projectPath: ".factory/skills", globalPath: ".factory/skills" },
26
+ { name: "Goose", flag: "goose", projectPath: ".goose/skills", globalPath: ".config/goose/skills" },
27
+ { name: "iFlow CLI", flag: "iflow-cli", projectPath: ".iflow/skills", globalPath: ".iflow/skills" },
28
+ { name: "Junie", flag: "junie", projectPath: ".junie/skills", globalPath: ".junie/skills" },
29
+ { name: "Kilo Code", flag: "kilo", projectPath: ".kilocode/skills", globalPath: ".kilocode/skills" },
30
+ { name: "Kimi Code CLI", flag: "kimi-cli", projectPath: ".agents/skills", globalPath: ".config/agents/skills" },
31
+ { name: "Kiro CLI", flag: "kiro-cli", projectPath: ".kiro/skills", globalPath: ".kiro/skills" },
32
+ { name: "Kode", flag: "kode", projectPath: ".kode/skills", globalPath: ".kode/skills" },
33
+ { name: "MCPJam", flag: "mcpjam", projectPath: ".mcpjam/skills", globalPath: ".mcpjam/skills" },
34
+ { name: "Mistral Vibe", flag: "mistral-vibe", projectPath: ".vibe/skills", globalPath: ".vibe/skills" },
35
+ { name: "Mux", flag: "mux", projectPath: ".mux/skills", globalPath: ".mux/skills" },
36
+ { name: "Neovate", flag: "neovate", projectPath: ".neovate/skills", globalPath: ".neovate/skills" },
37
+ { name: "OpenClaw", flag: "openclaw", projectPath: "skills", globalPath: ".openclaw/skills" },
38
+ { name: "OpenCode", flag: "opencode", projectPath: ".agents/skills", globalPath: ".config/opencode/skills" },
39
+ { name: "OpenHands", flag: "openhands", projectPath: ".openhands/skills", globalPath: ".openhands/skills" },
40
+ { name: "Pi", flag: "pi", projectPath: ".pi/skills", globalPath: ".pi/agent/skills" },
41
+ { name: "Pochi", flag: "pochi", projectPath: ".pochi/skills", globalPath: ".pochi/skills" },
42
+ { name: "Qoder", flag: "qoder", projectPath: ".qoder/skills", globalPath: ".qoder/skills" },
43
+ { name: "Qwen Code", flag: "qwen-code", projectPath: ".qwen/skills", globalPath: ".qwen/skills" },
44
+ { name: "Replit", flag: "replit", projectPath: ".agents/skills", globalPath: ".config/agents/skills" },
45
+ { name: "Trae", flag: "trae", projectPath: ".trae/skills", globalPath: ".trae/skills" },
46
+ { name: "Trae CN", flag: "trae-cn", projectPath: ".trae/skills", globalPath: ".trae-cn/skills" },
47
+ { name: "Universal", flag: "universal", projectPath: ".agents/skills", globalPath: ".config/agents/skills" },
48
+ { name: "Zencoder", flag: "zencoder", projectPath: ".zencoder/skills", globalPath: ".zencoder/skills" },
49
+ { name: "AdaL", flag: "adal", projectPath: ".adal/skills", globalPath: ".adal/skills" },
50
+ ];
51
+ /** The popular agents shown at the top of the interactive selection list */
52
+ export const POPULAR_AGENT_FLAGS = [
53
+ "cursor",
54
+ "claude-code",
55
+ "github-copilot",
56
+ "gemini-cli",
57
+ "antigravity",
58
+ "codex",
59
+ "windsurf",
60
+ "roo",
61
+ "cline",
62
+ ];
63
+ /**
64
+ * Find an agent config by its CLI flag value.
65
+ */
66
+ export function findAgentByFlag(flag) {
67
+ return AGENTS.find((a) => a.flag === flag);
68
+ }
69
+ /**
70
+ * Get the list of all valid agent flag values.
71
+ */
72
+ export function getAllAgentFlags() {
73
+ return AGENTS.map((a) => a.flag);
74
+ }
75
+ //# sourceMappingURL=agents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../src/agents.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,MAAM,CAAC,MAAM,MAAM,GAAkB;IACjC,+BAA+B;IAC/B,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE;IAC/F,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE;IACzG,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE;IAChH,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE;IACvG,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,4BAA4B,EAAE;IACpH,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,eAAe,EAAE;IAC5F,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,0BAA0B,EAAE;IAC/G,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE;IACxF,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE;IAE3F,gCAAgC;IAChC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,uBAAuB,EAAE;IAChG,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE;IACnG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,mBAAmB,EAAE;IAC3G,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,qBAAqB,EAAE,UAAU,EAAE,qBAAqB,EAAE;IACrH,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE;IACvG,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,0BAA0B,EAAE;IAC9G,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,sBAAsB,EAAE;IAClG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE;IAC/F,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,sBAAsB,EAAE;IAClG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE;IACnG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE;IAC3F,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE;IACpG,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,uBAAuB,EAAE;IAC/G,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE;IAC/F,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE;IACvF,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE;IAC/F,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE;IACvG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE;IACnF,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,iBAAiB,EAAE;IACnG,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,kBAAkB,EAAE;IAC7F,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,yBAAyB,EAAE;IAC5G,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,mBAAmB,EAAE;IAC3G,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE;IACrF,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE;IAC3F,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE;IAC3F,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE;IACjG,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,uBAAuB,EAAE;IACtG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE;IACvF,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,iBAAiB,EAAE;IAChG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,UAAU,EAAE,uBAAuB,EAAE;IAC5G,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE;IACvG,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE;CAC1F,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAC/B,QAAQ;IACR,aAAa;IACb,gBAAgB;IAChB,YAAY;IACZ,aAAa;IACb,OAAO;IACP,UAAU;IACV,KAAK;IACL,OAAO;CACV,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const addCommand: Command;
3
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,UAAU,SAkGjB,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { Command } from "commander";
2
+ import pc from "picocolors";
3
+ import { findAgentByFlag, getAllAgentFlags } from "../agents.js";
4
+ import { resolveRepos, fetchAllSkills, installSkill, getInstallDir, cleanupDirs, } from "../git.js";
5
+ import { promptSelectAgent, promptSelectSkills } from "../prompts.js";
6
+ export const addCommand = new Command("add")
7
+ .description("Install skills into your project (or globally with -g)")
8
+ .argument("[skills...]", "Skill names to install (omit for interactive mode)")
9
+ .option("-t, --tool <agent>", `AI agent to install for (${getAllAgentFlags().slice(0, 5).join(", ")}...)`)
10
+ .option("-g, --global", "Install to user-level global directory", false)
11
+ .option("-r, --repo <url>", "Override the source repository URL")
12
+ .action(async (skillNames, opts) => {
13
+ try {
14
+ // 1. Resolve agent
15
+ let agent = opts.tool ? findAgentByFlag(opts.tool) : undefined;
16
+ if (opts.tool && !agent) {
17
+ console.error(pc.red(`Error: Unknown agent "${opts.tool}".`), `\nValid agents: ${getAllAgentFlags().join(", ")}`);
18
+ process.exit(1);
19
+ }
20
+ if (!agent) {
21
+ agent = await promptSelectAgent();
22
+ }
23
+ console.log(pc.cyan(`\n🎯 Target agent: ${pc.bold(agent.name)}`) +
24
+ (opts.global ? pc.yellow(" (global)") : ""));
25
+ // 2. Resolve repos & fetch skills
26
+ const repos = resolveRepos(opts.repo);
27
+ console.log(pc.gray(`\n📡 Fetching available skills...`));
28
+ const { skills, repoCloneMap } = fetchAllSkills(repos);
29
+ const clonedDirs = [...repoCloneMap.values()];
30
+ if (skills.length === 0) {
31
+ console.log(pc.yellow("\n⚠️ No skills found in the repository."));
32
+ cleanupDirs(clonedDirs);
33
+ return;
34
+ }
35
+ // 3. Resolve which skills to install
36
+ let selectedDirNames;
37
+ if (skillNames.length > 0) {
38
+ // Non-interactive: validate provided skill names
39
+ selectedDirNames = [];
40
+ for (const name of skillNames) {
41
+ const found = skills.find((s) => s.dirName === name || s.name === name);
42
+ if (!found) {
43
+ console.error(pc.red(`Error: Skill "${name}" not found.`), `\nAvailable: ${skills.map((s) => s.dirName).join(", ")}`);
44
+ cleanupDirs(clonedDirs);
45
+ process.exit(1);
46
+ }
47
+ selectedDirNames.push(found.dirName);
48
+ }
49
+ }
50
+ else {
51
+ // Interactive: show multi-select
52
+ selectedDirNames = await promptSelectSkills(skills);
53
+ if (selectedDirNames.length === 0) {
54
+ console.log(pc.yellow("\nNo skills selected. Aborting."));
55
+ cleanupDirs(clonedDirs);
56
+ return;
57
+ }
58
+ }
59
+ // 4. Install each selected skill
60
+ const targetDir = getInstallDir(agent.projectPath, agent.globalPath, opts.global);
61
+ console.log(pc.gray(`\n📁 Installing to: ${targetDir}\n`));
62
+ for (const dirName of selectedDirNames) {
63
+ const skill = skills.find((s) => s.dirName === dirName);
64
+ const clonedDir = repoCloneMap.get(skill.repo);
65
+ if (!clonedDir)
66
+ continue;
67
+ installSkill(clonedDir, dirName, targetDir);
68
+ console.log(pc.green(` ✅ ${skill.name}`));
69
+ }
70
+ console.log(pc.green(`\n🎉 Successfully installed ${selectedDirNames.length} skill(s) to ${pc.bold(targetDir)}`));
71
+ // 5. Cleanup
72
+ cleanupDirs(clonedDirs);
73
+ }
74
+ catch (error) {
75
+ if (error instanceof Error) {
76
+ console.error(pc.red(`\n❌ ${error.message}`));
77
+ }
78
+ process.exit(1);
79
+ }
80
+ });
81
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const listCommand: Command;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,WAAW,SAoElB,CAAC"}
@@ -0,0 +1,64 @@
1
+ import path from "node:path";
2
+ import { Command } from "commander";
3
+ import pc from "picocolors";
4
+ import { AGENTS } from "../agents.js";
5
+ import { resolveRepos, fetchAllSkills, scanLocalSkills, cleanupDirs } from "../git.js";
6
+ export const listCommand = new Command("list")
7
+ .alias("ls")
8
+ .description("List installed skills or available remote skills")
9
+ .option("--remote", "List available skills from the remote repository")
10
+ .option("-r, --repo <url>", "Override the source repository URL")
11
+ .action(async (opts) => {
12
+ try {
13
+ if (opts.remote) {
14
+ // List remote skills
15
+ const repos = resolveRepos(opts.repo);
16
+ console.log(pc.cyan("\n📡 Fetching available skills from remote...\n"));
17
+ const { skills, repoCloneMap } = fetchAllSkills(repos);
18
+ const clonedDirs = [...repoCloneMap.values()];
19
+ if (skills.length === 0) {
20
+ console.log(pc.yellow(" No skills found in the repository."));
21
+ }
22
+ else {
23
+ const maxNameLen = Math.max(...skills.map((s) => s.name.length));
24
+ for (const skill of skills) {
25
+ const paddedName = skill.name.padEnd(maxNameLen);
26
+ console.log(` ${pc.green(paddedName)} ${pc.gray(skill.description || "No description")}`);
27
+ }
28
+ console.log(pc.gray(`\n Total: ${skills.length} skill(s) available`));
29
+ }
30
+ cleanupDirs(clonedDirs);
31
+ }
32
+ else {
33
+ // List locally installed skills across all agent directories
34
+ console.log(pc.cyan("\n📦 Scanning locally installed skills...\n"));
35
+ let totalFound = 0;
36
+ for (const agent of AGENTS) {
37
+ const skillsDir = path.resolve(process.cwd(), agent.projectPath);
38
+ const localSkills = scanLocalSkills(skillsDir);
39
+ if (localSkills.length === 0)
40
+ continue;
41
+ console.log(pc.bold(` ${agent.name} (${agent.projectPath}/)`));
42
+ for (const skill of localSkills) {
43
+ console.log(` ${pc.green(skill.name)} ${pc.gray(skill.description || "")}`);
44
+ }
45
+ console.log();
46
+ totalFound += localSkills.length;
47
+ }
48
+ if (totalFound === 0) {
49
+ console.log(pc.yellow(" No skills found in the current project.\n" +
50
+ ' Run "agent-skills add" to install skills.'));
51
+ }
52
+ else {
53
+ console.log(pc.gray(` Total: ${totalFound} skill(s) installed locally`));
54
+ }
55
+ }
56
+ }
57
+ catch (error) {
58
+ if (error instanceof Error) {
59
+ console.error(pc.red(`\n❌ ${error.message}`));
60
+ }
61
+ process.exit(1);
62
+ }
63
+ });
64
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const searchCommand: Command;
3
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,aAAa,SAsDpB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { Command } from "commander";
2
+ import pc from "picocolors";
3
+ import { resolveRepos, fetchAllSkills, cleanupDirs } from "../git.js";
4
+ export const searchCommand = new Command("search")
5
+ .alias("find")
6
+ .description("Search for skills by keyword in the remote repository")
7
+ .argument("<keyword>", "Keyword to search for in skill names and descriptions")
8
+ .option("-r, --repo <url>", "Override the source repository URL")
9
+ .action(async (keyword, opts) => {
10
+ try {
11
+ const repos = resolveRepos(opts.repo);
12
+ console.log(pc.cyan(`\n🔍 Searching for "${keyword}"...\n`));
13
+ const { skills, repoCloneMap } = fetchAllSkills(repos);
14
+ const clonedDirs = [...repoCloneMap.values()];
15
+ const lowerKeyword = keyword.toLowerCase();
16
+ const matched = skills.filter((s) => s.name.toLowerCase().includes(lowerKeyword) ||
17
+ s.description.toLowerCase().includes(lowerKeyword) ||
18
+ s.dirName.toLowerCase().includes(lowerKeyword));
19
+ if (matched.length === 0) {
20
+ console.log(pc.yellow(` No skills found matching "${keyword}".`));
21
+ console.log(pc.gray(` Run ${pc.white("agent-skills list --remote")} to browse all available skills.`));
22
+ }
23
+ else {
24
+ const maxNameLen = Math.max(...matched.map((s) => s.name.length));
25
+ for (const skill of matched) {
26
+ const paddedName = skill.name.padEnd(maxNameLen);
27
+ console.log(` ${pc.green(paddedName)} ${pc.gray(skill.description || "No description")}`);
28
+ }
29
+ console.log(pc.gray(`\n Found ${matched.length} skill(s) matching "${keyword}"`));
30
+ console.log(pc.gray(` Install with: ${pc.white(`agent-skills add <skill-name> --tool <agent>`)}`));
31
+ }
32
+ cleanupDirs(clonedDirs);
33
+ }
34
+ catch (error) {
35
+ if (error instanceof Error) {
36
+ console.error(pc.red(`\n❌ ${error.message}`));
37
+ }
38
+ process.exit(1);
39
+ }
40
+ });
41
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const updateCommand: Command;
3
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,eAAO,MAAM,aAAa,SA4FrB,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { Command } from "commander";
2
+ import pc from "picocolors";
3
+ import { AGENTS } from "../agents.js";
4
+ import { resolveRepos, fetchAllSkills, installSkill, scanLocalSkills, cleanupDirs, getInstallDir, } from "../git.js";
5
+ export const updateCommand = new Command("update")
6
+ .description("Update installed skills to the latest version")
7
+ .argument("[skills...]", "Specific skill names to update (omit to update all)")
8
+ .option("-g, --global", "Update globally installed skills", false)
9
+ .option("-r, --repo <url>", "Override the source repository URL")
10
+ .action(async (skillNames, opts) => {
11
+ try {
12
+ const repos = resolveRepos(opts.repo);
13
+ console.log(pc.cyan("\n🔄 Checking for skill updates...\n"));
14
+ // 1. Fetch latest skills from remote
15
+ const { skills: remoteSkills, repoCloneMap } = fetchAllSkills(repos);
16
+ const clonedDirs = [...repoCloneMap.values()];
17
+ if (remoteSkills.length === 0) {
18
+ console.log(pc.yellow(" No skills found in the remote repository."));
19
+ cleanupDirs(clonedDirs);
20
+ return;
21
+ }
22
+ // 2. Determine which agent directories to scan
23
+ let updatedCount = 0;
24
+ for (const agent of AGENTS) {
25
+ const installDir = getInstallDir(agent.projectPath, agent.globalPath, opts.global);
26
+ const localSkills = scanLocalSkills(installDir);
27
+ if (localSkills.length === 0)
28
+ continue;
29
+ // Filter to only updating specified skills (or all if none specified)
30
+ const toUpdate = localSkills.filter((local) => {
31
+ if (skillNames.length === 0)
32
+ return true;
33
+ return skillNames.some((name) => local.dirName === name || local.name === name);
34
+ });
35
+ if (toUpdate.length === 0)
36
+ continue;
37
+ console.log(pc.bold(` ${agent.name} (${opts.global ? agent.globalPath : agent.projectPath}/)`));
38
+ for (const local of toUpdate) {
39
+ const remote = remoteSkills.find((r) => r.dirName === local.dirName || r.name === local.name);
40
+ if (!remote) {
41
+ console.log(pc.gray(` ⏭ ${local.name} — not found in remote, skipping`));
42
+ continue;
43
+ }
44
+ const clonedDir = repoCloneMap.get(remote.repo);
45
+ if (!clonedDir)
46
+ continue;
47
+ installSkill(clonedDir, remote.dirName, installDir);
48
+ console.log(pc.green(` ✅ ${local.name} — updated`));
49
+ updatedCount++;
50
+ }
51
+ console.log();
52
+ }
53
+ if (updatedCount === 0) {
54
+ console.log(pc.yellow(" No installed skills needed updating.\n" +
55
+ ' Run "agent-skills ls" to see installed skills.'));
56
+ }
57
+ else {
58
+ console.log(pc.green(`🎉 Updated ${updatedCount} skill(s) successfully.`));
59
+ }
60
+ cleanupDirs(clonedDirs);
61
+ }
62
+ catch (error) {
63
+ if (error instanceof Error) {
64
+ console.error(pc.red(`\n❌ ${error.message}`));
65
+ }
66
+ process.exit(1);
67
+ }
68
+ });
69
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /** Default public repository for open-source skills */
2
+ export declare const DEFAULT_REPO = "https://github.com/jame2408/agent-skills.git";
3
+ /** Name of the local project config file for multi-repo support */
4
+ export declare const CONFIG_FILENAME = ".agent-skills.json";
5
+ /** Expected directory names inside the skills repo */
6
+ export declare const SKILLS_DIR = "skills";
7
+ export declare const REFERENCES_DIR = "references";
8
+ /**
9
+ * Parsed SKILL.md frontmatter.
10
+ */
11
+ export interface SkillMeta {
12
+ name: string;
13
+ description: string;
14
+ }
15
+ /**
16
+ * Represents a skill discovered from a repo.
17
+ */
18
+ export interface SkillInfo {
19
+ /** Skill name from SKILL.md frontmatter */
20
+ name: string;
21
+ /** Description from SKILL.md frontmatter */
22
+ description: string;
23
+ /** Directory name inside skills/ */
24
+ dirName: string;
25
+ /** Source repo URL */
26
+ repo: string;
27
+ }
28
+ /**
29
+ * Project-level config file shape (.agent-skills.json).
30
+ */
31
+ export interface ProjectConfig {
32
+ repos: string[];
33
+ }
34
+ /**
35
+ * Parse YAML frontmatter from a SKILL.md content string.
36
+ */
37
+ export declare function parseSkillFrontmatter(content: string): SkillMeta | null;
38
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,uDAAuD;AACvD,eAAO,MAAM,YAAY,iDAAiD,CAAC;AAE3E,mEAAmE;AACnE,eAAO,MAAM,eAAe,uBAAuB,CAAC;AAEpD,sDAAsD;AACtD,eAAO,MAAM,UAAU,WAAW,CAAC;AACnC,eAAO,MAAM,cAAc,eAAe,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,sBAAsB;IACtB,IAAI,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAqBvE"}
package/dist/config.js ADDED
@@ -0,0 +1,36 @@
1
+ import { parse as parseYaml } from "yaml";
2
+ /** Default public repository for open-source skills */
3
+ export const DEFAULT_REPO = "https://github.com/jame2408/agent-skills.git";
4
+ /** Name of the local project config file for multi-repo support */
5
+ export const CONFIG_FILENAME = ".agent-skills.json";
6
+ /** Expected directory names inside the skills repo */
7
+ export const SKILLS_DIR = "skills";
8
+ export const REFERENCES_DIR = "references";
9
+ /**
10
+ * Parse YAML frontmatter from a SKILL.md content string.
11
+ */
12
+ export function parseSkillFrontmatter(content) {
13
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
14
+ if (!match)
15
+ return null;
16
+ try {
17
+ const parsed = parseYaml(match[1]);
18
+ const name = typeof parsed.name === "string" ? parsed.name : "";
19
+ let description = "";
20
+ if (typeof parsed.description === "string") {
21
+ // Take only the first non-empty line for display in list/search
22
+ const firstLine = parsed.description
23
+ .split("\n")
24
+ .map((line) => line.trim())
25
+ .find((line) => line.length > 0);
26
+ description = firstLine ?? "";
27
+ }
28
+ if (!name)
29
+ return null;
30
+ return { name, description };
31
+ }
32
+ catch {
33
+ return null;
34
+ }
35
+ }
36
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAE1C,uDAAuD;AACvD,MAAM,CAAC,MAAM,YAAY,GAAG,8CAA8C,CAAC;AAE3E,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,oBAAoB,CAAC;AAEpD,sDAAsD;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,QAAQ,CAAC;AACnC,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AA+B3C;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC3D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAA4B,CAAC;QAC9D,MAAM,IAAI,GAAG,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,IAAI,WAAW,GAAG,EAAE,CAAC;QACrB,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YACzC,gEAAgE;YAChE,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW;iBAC/B,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1B,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACrC,WAAW,GAAG,SAAS,IAAI,EAAE,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,IAAI,CAAC;IAChB,CAAC;AACL,CAAC"}
package/dist/git.d.ts ADDED
@@ -0,0 +1,49 @@
1
+ import { type SkillInfo } from "./config.js";
2
+ /**
3
+ * Resolve the list of repo URLs to use.
4
+ * Priority: --repo flag > .agent-skills.json > DEFAULT_REPO
5
+ */
6
+ export declare function resolveRepos(repoFlag?: string): string[];
7
+ /**
8
+ * Clone a repo into a temp directory (shallow, single-branch).
9
+ * Returns the path to the cloned directory.
10
+ */
11
+ export declare function cloneRepo(repoUrl: string): string;
12
+ /**
13
+ * Scan a cloned repo's skills/ directory and return a list of SkillInfo.
14
+ */
15
+ export declare function scanSkills(clonedDir: string, repoUrl: string): SkillInfo[];
16
+ /**
17
+ * Scan skills from all resolved repos.
18
+ * Returns aggregated skills list and a map from repo URL to cloned directory.
19
+ */
20
+ export declare function fetchAllSkills(repos: string[]): {
21
+ skills: SkillInfo[];
22
+ repoCloneMap: Map<string, string>;
23
+ };
24
+ /**
25
+ * Copy a skill directory + references directory from a cloned repo into target.
26
+ */
27
+ export declare function installSkill(clonedDir: string, skillDirName: string, targetBaseDir: string): void;
28
+ /**
29
+ * Recursively copy contents of srcDir into destDir (overwrite existing files).
30
+ */
31
+ export declare function copyDirRecursive(srcDir: string, destDir: string): void;
32
+ /**
33
+ * Get the resolved installation base directory for a given agent.
34
+ */
35
+ export declare function getInstallDir(projectPath: string, globalPath: string, isGlobal: boolean): string;
36
+ /**
37
+ * Cleanup temporary cloned directories.
38
+ */
39
+ export declare function cleanupDirs(dirs: string[]): void;
40
+ /**
41
+ * Scan locally installed skills in a given directory.
42
+ * Returns array of { name, description, dirName }.
43
+ */
44
+ export declare function scanLocalSkills(skillsDir: string): Array<{
45
+ name: string;
46
+ description: string;
47
+ dirName: string;
48
+ }>;
49
+ //# sourceMappingURL=git.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"AAKA,OAAO,EAMH,KAAK,SAAS,EAEjB,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAmBxD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAcjD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CA4B1E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG;IAC7C,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACrC,CAaA;AAED;;GAEG;AACH,wBAAgB,YAAY,CACxB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACtB,IAAI,CAsBN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CActE;AAED;;GAEG;AACH,wBAAgB,aAAa,CACzB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,OAAO,GAClB,MAAM,CAKR;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAQhD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC3B,SAAS,EAAE,MAAM,GAClB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B/D"}
package/dist/git.js ADDED
@@ -0,0 +1,181 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ import pc from "picocolors";
6
+ import { SKILLS_DIR, REFERENCES_DIR, DEFAULT_REPO, CONFIG_FILENAME, parseSkillFrontmatter, } from "./config.js";
7
+ /**
8
+ * Resolve the list of repo URLs to use.
9
+ * Priority: --repo flag > .agent-skills.json > DEFAULT_REPO
10
+ */
11
+ export function resolveRepos(repoFlag) {
12
+ if (repoFlag) {
13
+ return [repoFlag];
14
+ }
15
+ const configPath = path.resolve(process.cwd(), CONFIG_FILENAME);
16
+ if (fs.existsSync(configPath)) {
17
+ try {
18
+ const raw = fs.readFileSync(configPath, "utf-8");
19
+ const config = JSON.parse(raw);
20
+ if (Array.isArray(config.repos) && config.repos.length > 0) {
21
+ return config.repos;
22
+ }
23
+ }
24
+ catch {
25
+ // Ignore malformed config, fall through to default
26
+ }
27
+ }
28
+ return [DEFAULT_REPO];
29
+ }
30
+ /**
31
+ * Clone a repo into a temp directory (shallow, single-branch).
32
+ * Returns the path to the cloned directory.
33
+ */
34
+ export function cloneRepo(repoUrl) {
35
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "agent-skills-"));
36
+ try {
37
+ execFileSync("git", ["clone", "--depth", "1", "--single-branch", repoUrl, tmpDir], {
38
+ stdio: "pipe",
39
+ });
40
+ }
41
+ catch (error) {
42
+ fs.rmSync(tmpDir, { recursive: true, force: true });
43
+ throw new Error(`Failed to clone repository: ${repoUrl}\n` +
44
+ `Make sure the URL is correct and you have access (SSH key / token).`);
45
+ }
46
+ return tmpDir;
47
+ }
48
+ /**
49
+ * Scan a cloned repo's skills/ directory and return a list of SkillInfo.
50
+ */
51
+ export function scanSkills(clonedDir, repoUrl) {
52
+ const skillsRoot = path.join(clonedDir, SKILLS_DIR);
53
+ if (!fs.existsSync(skillsRoot)) {
54
+ return [];
55
+ }
56
+ const entries = fs.readdirSync(skillsRoot, { withFileTypes: true });
57
+ const results = [];
58
+ for (const entry of entries) {
59
+ if (!entry.isDirectory())
60
+ continue;
61
+ const skillMdPath = path.join(skillsRoot, entry.name, "SKILL.md");
62
+ if (!fs.existsSync(skillMdPath))
63
+ continue;
64
+ const content = fs.readFileSync(skillMdPath, "utf-8");
65
+ const meta = parseSkillFrontmatter(content);
66
+ if (!meta)
67
+ continue;
68
+ results.push({
69
+ name: meta.name,
70
+ description: meta.description,
71
+ dirName: entry.name,
72
+ repo: repoUrl,
73
+ });
74
+ }
75
+ return results;
76
+ }
77
+ /**
78
+ * Scan skills from all resolved repos.
79
+ * Returns aggregated skills list and a map from repo URL to cloned directory.
80
+ */
81
+ export function fetchAllSkills(repos) {
82
+ const allSkills = [];
83
+ const repoCloneMap = new Map();
84
+ for (const repo of repos) {
85
+ console.log(pc.gray(` Fetching skills from ${repo}...`));
86
+ const clonedDir = cloneRepo(repo);
87
+ repoCloneMap.set(repo, clonedDir);
88
+ const skills = scanSkills(clonedDir, repo);
89
+ allSkills.push(...skills);
90
+ }
91
+ return { skills: allSkills, repoCloneMap };
92
+ }
93
+ /**
94
+ * Copy a skill directory + references directory from a cloned repo into target.
95
+ */
96
+ export function installSkill(clonedDir, skillDirName, targetBaseDir) {
97
+ const skillSrc = path.join(clonedDir, SKILLS_DIR, skillDirName);
98
+ const refSrc = path.join(clonedDir, REFERENCES_DIR);
99
+ if (!fs.existsSync(skillSrc)) {
100
+ throw new Error(`Skill directory "${skillDirName}" not found at expected path: ${skillSrc}\n` +
101
+ `The repository may have an unexpected structure or the skill was removed.`);
102
+ }
103
+ // Ensure target skills directory exists
104
+ const targetSkillsDir = path.join(targetBaseDir, skillDirName);
105
+ fs.mkdirSync(targetSkillsDir, { recursive: true });
106
+ copyDirRecursive(skillSrc, targetSkillsDir);
107
+ // Copy references alongside skills (go up one level from skills/)
108
+ const targetRefDir = path.resolve(targetBaseDir, "..", REFERENCES_DIR);
109
+ if (fs.existsSync(refSrc)) {
110
+ fs.mkdirSync(targetRefDir, { recursive: true });
111
+ copyDirRecursive(refSrc, targetRefDir);
112
+ }
113
+ }
114
+ /**
115
+ * Recursively copy contents of srcDir into destDir (overwrite existing files).
116
+ */
117
+ export function copyDirRecursive(srcDir, destDir) {
118
+ fs.mkdirSync(destDir, { recursive: true });
119
+ const entries = fs.readdirSync(srcDir, { withFileTypes: true });
120
+ for (const entry of entries) {
121
+ const srcPath = path.join(srcDir, entry.name);
122
+ const destPath = path.join(destDir, entry.name);
123
+ if (entry.isDirectory()) {
124
+ copyDirRecursive(srcPath, destPath);
125
+ }
126
+ else {
127
+ fs.copyFileSync(srcPath, destPath);
128
+ }
129
+ }
130
+ }
131
+ /**
132
+ * Get the resolved installation base directory for a given agent.
133
+ */
134
+ export function getInstallDir(projectPath, globalPath, isGlobal) {
135
+ if (isGlobal) {
136
+ return path.join(os.homedir(), globalPath);
137
+ }
138
+ return path.resolve(process.cwd(), projectPath);
139
+ }
140
+ /**
141
+ * Cleanup temporary cloned directories.
142
+ */
143
+ export function cleanupDirs(dirs) {
144
+ for (const dir of dirs) {
145
+ try {
146
+ fs.rmSync(dir, { recursive: true, force: true });
147
+ }
148
+ catch {
149
+ // Ignore cleanup errors
150
+ }
151
+ }
152
+ }
153
+ /**
154
+ * Scan locally installed skills in a given directory.
155
+ * Returns array of { name, description, dirName }.
156
+ */
157
+ export function scanLocalSkills(skillsDir) {
158
+ if (!fs.existsSync(skillsDir)) {
159
+ return [];
160
+ }
161
+ const entries = fs.readdirSync(skillsDir, { withFileTypes: true });
162
+ const results = [];
163
+ for (const entry of entries) {
164
+ if (!entry.isDirectory())
165
+ continue;
166
+ const skillMdPath = path.join(skillsDir, entry.name, "SKILL.md");
167
+ if (!fs.existsSync(skillMdPath))
168
+ continue;
169
+ const content = fs.readFileSync(skillMdPath, "utf-8");
170
+ const meta = parseSkillFrontmatter(content);
171
+ if (!meta)
172
+ continue;
173
+ results.push({
174
+ name: meta.name,
175
+ description: meta.description,
176
+ dirName: entry.name,
177
+ });
178
+ }
179
+ return results;
180
+ }
181
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../src/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from "node:module";
3
+ import { Command } from "commander";
4
+ import { addCommand } from "./commands/add.js";
5
+ import { listCommand } from "./commands/list.js";
6
+ import { searchCommand } from "./commands/search.js";
7
+ import { updateCommand } from "./commands/update.js";
8
+ const require = createRequire(import.meta.url);
9
+ const pkg = require("../package.json");
10
+ const program = new Command();
11
+ program
12
+ .name("agent-skills")
13
+ .description("CLI tool to install, update, and manage Agent Skills across AI coding assistants")
14
+ .version(pkg.version);
15
+ program.addCommand(addCommand);
16
+ program.addCommand(listCommand);
17
+ program.addCommand(searchCommand);
18
+ program.addCommand(updateCommand);
19
+ program.parse();
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AAE9D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,cAAc,CAAC;KACpB,WAAW,CACR,kFAAkF,CACrF;KACA,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAE1B,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAElC,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type AgentConfig } from "./agents.js";
2
+ /**
3
+ * Interactively prompt the user to select an AI agent (tool).
4
+ * Popular agents are shown first with a separator.
5
+ */
6
+ export declare function promptSelectAgent(): Promise<AgentConfig>;
7
+ /**
8
+ * Interactively prompt the user to select one or more skills.
9
+ */
10
+ export declare function promptSelectSkills(skills: Array<{
11
+ name: string;
12
+ description: string;
13
+ dirName: string;
14
+ }>): Promise<string[]>;
15
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5E;;;GAGG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC,CAoC9D;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACpC,MAAM,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACtE,OAAO,CAAC,MAAM,EAAE,CAAC,CAenB"}
@@ -0,0 +1,48 @@
1
+ import { select, checkbox } from "@inquirer/prompts";
2
+ import { AGENTS, POPULAR_AGENT_FLAGS } from "./agents.js";
3
+ /**
4
+ * Interactively prompt the user to select an AI agent (tool).
5
+ * Popular agents are shown first with a separator.
6
+ */
7
+ export async function promptSelectAgent() {
8
+ const popularAgents = AGENTS.filter((a) => POPULAR_AGENT_FLAGS.includes(a.flag));
9
+ const otherAgents = AGENTS.filter((a) => !POPULAR_AGENT_FLAGS.includes(a.flag));
10
+ const choices = [
11
+ ...popularAgents.map((a) => ({
12
+ name: a.name,
13
+ value: a.flag,
14
+ description: `Project: ${a.projectPath}`,
15
+ })),
16
+ { type: "separator" },
17
+ ...otherAgents.map((a) => ({
18
+ name: a.name,
19
+ value: a.flag,
20
+ description: `Project: ${a.projectPath}`,
21
+ })),
22
+ ];
23
+ const selected = await select({
24
+ message: "🛠️ Which AI coding agent are you using?",
25
+ choices: choices,
26
+ });
27
+ const agent = AGENTS.find((a) => a.flag === selected);
28
+ if (!agent)
29
+ throw new Error(`Unknown agent: ${selected}`);
30
+ return agent;
31
+ }
32
+ /**
33
+ * Interactively prompt the user to select one or more skills.
34
+ */
35
+ export async function promptSelectSkills(skills) {
36
+ if (skills.length === 0) {
37
+ return [];
38
+ }
39
+ const selected = await checkbox({
40
+ message: "📦 Select the skills to install (Space to toggle, Enter to confirm):",
41
+ choices: skills.map((s) => ({
42
+ name: `${s.name} — ${s.description || "No description"}`,
43
+ value: s.dirName,
44
+ })),
45
+ });
46
+ return selected;
47
+ }
48
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAoB,MAAM,aAAa,CAAC;AAE5E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACnC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACtC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CACvC,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAC/C,CAAC;IAQF,MAAM,OAAO,GAAiD;QAC1D,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACzB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,IAAI;YACb,WAAW,EAAE,YAAY,CAAC,CAAC,WAAW,EAAE;SAC3C,CAAC,CAAC;QACH,EAAE,IAAI,EAAE,WAAoB,EAAE;QAC9B,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,IAAI;YACb,WAAW,EAAE,YAAY,CAAC,CAAC,WAAW,EAAE;SAC3C,CAAC,CAAC;KACN,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAS;QAClC,OAAO,EAAE,2CAA2C;QACpD,OAAO,EAAE,OAAuE;KACnF,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IACtD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC;IAC1D,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,MAAqE;IAErE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAS;QACpC,OAAO,EACH,uEAAuE;QAC3E,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxB,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,IAAI,gBAAgB,EAAE;YACxD,KAAK,EAAE,CAAC,CAAC,OAAO;SACnB,CAAC,CAAC;KACN,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AACpB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@james-jj-wang/agent-skills-cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool to install, update, and manage Agent Skills across AI coding assistants",
5
+ "type": "module",
6
+ "bin": {
7
+ "agent-skills": "./dist/index.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "tsx src/index.ts",
12
+ "start": "node dist/index.js",
13
+ "prepublishOnly": "npm run build"
14
+ },
15
+ "keywords": [
16
+ "agent-skills",
17
+ "ai",
18
+ "cursor",
19
+ "claude",
20
+ "copilot",
21
+ "gemini",
22
+ "codex",
23
+ "cli"
24
+ ],
25
+ "author": "jame2408",
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/jame2408/agent-skills.git"
30
+ },
31
+ "engines": {
32
+ "node": ">=18.0.0"
33
+ },
34
+ "files": [
35
+ "dist"
36
+ ],
37
+ "dependencies": {
38
+ "commander": "^13.1.0",
39
+ "@inquirer/prompts": "^7.5.0",
40
+ "picocolors": "^1.1.1",
41
+ "yaml": "^2.7.0"
42
+ },
43
+ "devDependencies": {
44
+ "typescript": "^5.7.0",
45
+ "tsx": "^4.19.0",
46
+ "@types/node": "^22.0.0"
47
+ }
48
+ }