skill4agent 1.0.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,155 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.install = install;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const fs_extra_1 = __importDefault(require("fs-extra"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const utils_1 = require("../utils");
12
+ const tools_1 = require("../tools");
13
+ const api_1 = require("../api");
14
+ function getAgentNameFromPath(dirPath) {
15
+ const name = path_1.default.basename(dirPath);
16
+ return name.charAt(0).toUpperCase() + name.slice(1);
17
+ }
18
+ function getAgentDisplayName(dirPath) {
19
+ const dirname = path_1.default.basename(path_1.default.dirname(dirPath));
20
+ if (dirname === '.agents')
21
+ return 'Universal';
22
+ return dirname.charAt(0).toUpperCase() + dirname.slice(1);
23
+ }
24
+ function displaySummary(options, skillInfo, typeDisplay, allDirs) {
25
+ const dirNames = allDirs.map(d => getAgentDisplayName(d));
26
+ const dirCount = allDirs.length;
27
+ console.log(chalk_1.default.blue('\nšŸ“Š Installation Summary'));
28
+ console.log(chalk_1.default.gray('─'.repeat(50)));
29
+ console.log(`Skill: ${chalk_1.default.white(skillInfo.name)}`);
30
+ console.log(`Source: ${options.topSource}`);
31
+ console.log(`Type: ${typeDisplay}`);
32
+ console.log(`Scope: ${options.global ? 'Global' : 'Project'}`);
33
+ console.log(`Dirs (${dirCount}): ${dirNames.join(', ')}`);
34
+ console.log(`Method: ${options.method === 'symlink' ? 'Symlink (Recommended)' : 'Copy'}`);
35
+ console.log(chalk_1.default.gray('─'.repeat(50)));
36
+ }
37
+ async function install(options) {
38
+ const { topSource, skillName, type, global, dirs, method } = options;
39
+ console.log(chalk_1.default.blue(`\nšŸ“¦ Installing skill: ${skillName}`));
40
+ console.log(chalk_1.default.gray(` Source: ${topSource}\n`));
41
+ let result;
42
+ try {
43
+ result = await (0, api_1.getSkillInfo)(topSource, skillName);
44
+ }
45
+ catch (error) {
46
+ console.log(chalk_1.default.red(`\nāŒ Skill "${skillName}" not found in source "${topSource}".`));
47
+ console.log(chalk_1.default.gray(` Please check the source repository and skill name.\n`));
48
+ return;
49
+ }
50
+ if (!result.skill) {
51
+ console.log(chalk_1.default.red(`\nāŒ Skill "${skillName}" not found in source "${topSource}".`));
52
+ console.log(chalk_1.default.gray(` Please check the source repository and skill name.\n`));
53
+ return;
54
+ }
55
+ const skillInfo = result.skill;
56
+ console.log(chalk_1.default.blue(`\nšŸ“¦ Skill: ${chalk_1.default.white(skillInfo.name)}`));
57
+ console.log(chalk_1.default.gray(` Category: ${skillInfo.category?.nameEn || 'N/A'} | Installs: ${skillInfo.installs}`));
58
+ if (skillInfo.tags) {
59
+ console.log(chalk_1.default.gray(` Tags: ${skillInfo.tags}`));
60
+ }
61
+ if (!skillInfo.hasScript) {
62
+ console.log(chalk_1.default.gray(` šŸ“œ Scripts: No scripts`));
63
+ }
64
+ else {
65
+ const statusText = skillInfo.scriptCheckResult === 'safe' ? 'āœ… Check passed' : 'āš ļø Needs attention';
66
+ console.log(chalk_1.default.gray(` šŸ“œ Scripts: ${skillInfo.scriptCount} script(s) - ${statusText}`));
67
+ }
68
+ console.log(chalk_1.default.gray(` ${skillInfo.hasTranslation ? 'āœ…' : 'āŒ'} Translation available\n`));
69
+ let finalType = type;
70
+ const isOriginalEnglish = skillInfo.originalLanguage === 'en';
71
+ if (type === 'translated' && !skillInfo.hasTranslation) {
72
+ console.log(chalk_1.default.yellow(`āš ļø Translation not available. Using original (${isOriginalEnglish ? 'English' : 'Chinese'}) version.\n`));
73
+ finalType = 'original';
74
+ }
75
+ const typeDisplay = finalType === 'original'
76
+ ? (isOriginalEnglish ? 'English' : 'Chinese')
77
+ : (isOriginalEnglish ? 'Chinese' : 'English');
78
+ console.log(chalk_1.default.gray(` Type: ${typeDisplay}\n`));
79
+ const isGlobal = global;
80
+ const basePath = isGlobal ? os_1.default.homedir() : process.cwd();
81
+ const allDirs = [tools_1.UNIVERSAL_PATH, ...dirs.map((d) => d.endsWith('/skills') ? d : `${d}/skills`)];
82
+ const dirNames = allDirs.map(d => getAgentDisplayName(d));
83
+ console.log(chalk_1.default.green(`āœ“ Directories: ${dirNames.join(', ')}`));
84
+ if (allDirs.length === 0) {
85
+ console.log(chalk_1.default.yellow('\nāš ļø No directories selected. Installation cancelled.'));
86
+ return;
87
+ }
88
+ displaySummary({ topSource, skillName, type: finalType, global, dirs, method }, skillInfo, typeDisplay, allDirs);
89
+ let tempZip;
90
+ try {
91
+ tempZip = await (0, api_1.downloadSkill)(topSource, skillName, finalType);
92
+ }
93
+ catch (error) {
94
+ if (error.response?.status === 404) {
95
+ console.log(chalk_1.default.red(`\nāŒ Failed to download skill "${skillName}".`));
96
+ console.log(chalk_1.default.gray(` The skill may not exist or the download link is invalid.\n`));
97
+ return;
98
+ }
99
+ console.log(chalk_1.default.red(`\nāŒ Download failed: ${error.message}`));
100
+ return;
101
+ }
102
+ if (method === 'symlink') {
103
+ const universalFullPath = path_1.default.join(basePath, tools_1.UNIVERSAL_PATH);
104
+ fs_extra_1.default.ensureDirSync(universalFullPath);
105
+ const skillDir = path_1.default.join(universalFullPath, skillName);
106
+ if (fs_extra_1.default.existsSync(skillDir)) {
107
+ console.log(chalk_1.default.yellow(`\nāš ļø Skill "${skillName}" already exists. Overwriting...`));
108
+ fs_extra_1.default.removeSync(skillDir);
109
+ }
110
+ await (0, utils_1.extractZip)(tempZip, universalFullPath);
111
+ fs_extra_1.default.removeSync(tempZip);
112
+ console.log(chalk_1.default.green(`āœ… Installed to: ${skillDir}`));
113
+ for (const dir of dirs) {
114
+ const fullDir = dir.endsWith('/skills') ? dir : `${dir}/skills`;
115
+ const dirPath = path_1.default.join(basePath, fullDir);
116
+ fs_extra_1.default.ensureDirSync(dirPath);
117
+ const destDir = path_1.default.join(dirPath, skillName);
118
+ if (fs_extra_1.default.existsSync(destDir)) {
119
+ fs_extra_1.default.removeSync(destDir);
120
+ }
121
+ if (isGlobal) {
122
+ fs_extra_1.default.symlinkSync(skillDir, destDir);
123
+ }
124
+ else {
125
+ const relativePath = path_1.default.relative(dirPath, skillDir);
126
+ fs_extra_1.default.symlinkSync(relativePath, destDir);
127
+ }
128
+ console.log(chalk_1.default.green(`āœ… Linked to: ${destDir}`));
129
+ }
130
+ }
131
+ else {
132
+ const universalFullPath = path_1.default.join(basePath, tools_1.UNIVERSAL_PATH);
133
+ const skillDir = path_1.default.join(universalFullPath, skillName);
134
+ fs_extra_1.default.ensureDirSync(universalFullPath);
135
+ if (fs_extra_1.default.existsSync(skillDir)) {
136
+ fs_extra_1.default.removeSync(skillDir);
137
+ }
138
+ await (0, utils_1.extractZip)(tempZip, universalFullPath);
139
+ fs_extra_1.default.removeSync(tempZip);
140
+ console.log(chalk_1.default.green(`āœ… Copied to: ${skillDir}`));
141
+ for (const dir of dirs) {
142
+ const fullDir = dir.endsWith('/skills') ? dir : `${dir}/skills`;
143
+ const dirPath = path_1.default.join(basePath, fullDir);
144
+ fs_extra_1.default.ensureDirSync(dirPath);
145
+ const destDir = path_1.default.join(dirPath, skillName);
146
+ if (fs_extra_1.default.existsSync(destDir)) {
147
+ fs_extra_1.default.removeSync(destDir);
148
+ }
149
+ fs_extra_1.default.copySync(skillDir, destDir);
150
+ console.log(chalk_1.default.green(`āœ… Copied to: ${destDir}`));
151
+ }
152
+ }
153
+ console.log(chalk_1.default.green('\nšŸŽ‰ Installation completed!\n'));
154
+ }
155
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function list(): Promise<void>;
2
+ export declare function search(query: string): Promise<void>;
3
+ export declare function update(skillName?: string): Promise<void>;
4
+ export declare function uninstall(skillName: string): Promise<void>;
5
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE1C;AAED,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzD;AAED,wBAAsB,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhE"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.list = list;
4
+ exports.search = search;
5
+ exports.update = update;
6
+ exports.uninstall = uninstall;
7
+ async function list() {
8
+ console.log('list command');
9
+ }
10
+ async function search(query) {
11
+ console.log('search command', query);
12
+ }
13
+ async function update(skillName) {
14
+ console.log('update command', skillName);
15
+ }
16
+ async function uninstall(skillName) {
17
+ console.log('uninstall command', skillName);
18
+ }
19
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":";;AAAA,oBAEC;AAED,wBAEC;AAED,wBAEC;AAED,8BAEC;AAdM,KAAK,UAAU,IAAI;IACxB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;AAC9B,CAAC;AAEM,KAAK,UAAU,MAAM,CAAC,KAAa;IACxC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC;AAEM,KAAK,UAAU,MAAM,CAAC,SAAkB;IAC7C,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;AAC3C,CAAC;AAEM,KAAK,UAAU,SAAS,CAAC,SAAiB;IAC/C,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC;AAC9C,CAAC"}
package/dist/main.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
package/dist/main.js ADDED
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const chalk_1 = __importDefault(require("chalk"));
7
+ const commander_1 = require("commander");
8
+ const install_1 = require("./commands/install");
9
+ const add_1 = require("./commands/add");
10
+ const list_1 = require("./commands/list");
11
+ const program = new commander_1.Command();
12
+ program
13
+ .name('skill4agent')
14
+ .description('CLI tool for installing and managing agent skills')
15
+ .version('1.0.0');
16
+ program
17
+ .command('add <top_source> <skill_name>')
18
+ .description('Interactive installation with guided prompts')
19
+ .action(async (topSource, skillName) => {
20
+ await (0, add_1.add)(topSource, skillName);
21
+ });
22
+ program
23
+ .command('install <top_source> <skill_name>')
24
+ .description('Non-interactive installation with command-line options')
25
+ .option('--type <type>', 'Package type: original or translated', 'original')
26
+ .option('--global', 'Install to global storage')
27
+ .option('--dirs <dirs>', 'Additional directories (comma-separated): .trae,.cursor,.qwen')
28
+ .option('--method <method>', 'Installation method: symlink or copy', 'symlink')
29
+ .action(async (topSource, skillName, options) => {
30
+ if (options.type && !['original', 'translated'].includes(options.type)) {
31
+ console.log(chalk_1.default.red('\nāŒ Invalid --type value. Must be "original" or "translated".\n'));
32
+ process.exit(1);
33
+ }
34
+ if (options.method && !['symlink', 'copy'].includes(options.method)) {
35
+ console.log(chalk_1.default.red('\nāŒ Invalid --method value. Must be "symlink" or "copy".\n'));
36
+ process.exit(1);
37
+ }
38
+ const dirsArray = options.dirs
39
+ ? options.dirs.split(',').map((a) => a.trim()).filter((a) => a.length > 0)
40
+ : [];
41
+ await (0, install_1.install)({
42
+ topSource,
43
+ skillName,
44
+ type: options.type || 'original',
45
+ global: !!options.global,
46
+ dirs: dirsArray,
47
+ method: options.method || 'symlink',
48
+ });
49
+ });
50
+ program
51
+ .command('list')
52
+ .description('List installed skills')
53
+ .action(list_1.list);
54
+ program
55
+ .command('search <query>')
56
+ .description('Search for skills')
57
+ .action(list_1.search);
58
+ program
59
+ .command('update [skill_name]')
60
+ .description('Update installed skills')
61
+ .action(list_1.update);
62
+ program
63
+ .command('uninstall <skill_name>')
64
+ .description('Uninstall a skill')
65
+ .action(list_1.uninstall);
66
+ program.parse();
67
+ process.on('unhandledRejection', (reason) => {
68
+ console.error(chalk_1.default.red('Error:'), reason);
69
+ process.exit(1);
70
+ });
71
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface Agent {
2
+ id: string;
3
+ name: string;
4
+ path: string;
5
+ universal: boolean;
6
+ globalPath?: string;
7
+ }
8
+ export declare const UNIVERSAL_AGENTS: Agent[];
9
+ export declare const UNIVERSAL_PATH = ".agents/skills";
10
+ export declare const OTHER_AGENTS: Agent[];
11
+ export declare function getGlobalStoragePath(): string;
12
+ export declare function getAgentPath(agentId: string, isGlobal: boolean): string | null;
13
+ export declare function checkAgentExists(agentPath: string): boolean;
14
+ export declare function getAllAgents(): Agent[];
15
+ export declare function getAgentDisplayPath(agentId: string, isGlobal: boolean): string;
16
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,gBAAgB,EAAE,KAAK,EAOnC,CAAC;AAEF,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAE/C,eAAO,MAAM,YAAY,EAAE,KAAK,EAiC/B,CAAC;AAEF,wBAAgB,oBAAoB,IAAI,MAAM,CAa7C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAY9E;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAG3D;AAED,wBAAgB,YAAY,IAAI,KAAK,EAAE,CAEtC;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,CAc9E"}
package/dist/tools.js ADDED
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OTHER_AGENTS = exports.UNIVERSAL_PATH = exports.UNIVERSAL_AGENTS = void 0;
7
+ exports.getGlobalStoragePath = getGlobalStoragePath;
8
+ exports.getAgentPath = getAgentPath;
9
+ exports.checkAgentExists = checkAgentExists;
10
+ exports.getAllAgents = getAllAgents;
11
+ exports.getAgentDisplayPath = getAgentDisplayPath;
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const os_1 = __importDefault(require("os"));
14
+ const path_1 = __importDefault(require("path"));
15
+ exports.UNIVERSAL_AGENTS = [
16
+ { id: 'amp', name: 'Amp', path: '.agents/skills', universal: true },
17
+ { id: 'codex', name: 'Codex', path: '.agents/skills', universal: true },
18
+ { id: 'gemini-cli', name: 'Gemini CLI', path: '.agents/skills', universal: true },
19
+ { id: 'github-copilot', name: 'GitHub Copilot', path: '.agents/skills', universal: true },
20
+ { id: 'kimi-code-cli', name: 'Kimi Code CLI', path: '.agents/skills', universal: true },
21
+ { id: 'opencode', name: 'OpenCode', path: '.agents/skills', universal: true },
22
+ ];
23
+ exports.UNIVERSAL_PATH = '.agents/skills';
24
+ exports.OTHER_AGENTS = [
25
+ { id: 'antigravity', name: 'Antigravity', path: '.agent/skills', universal: false },
26
+ { id: 'augment', name: 'Augment', path: '.augment/rules', universal: false },
27
+ { id: 'claude-code', name: 'Claude Code', path: '.claude/skills', universal: false },
28
+ { id: 'openclaw', name: 'OpenClaw', path: 'skills', universal: false },
29
+ { id: 'cline', name: 'Cline', path: '.cline/skills', universal: false },
30
+ { id: 'codebuddy', name: 'CodeBuddy', path: '.codebuddy/skills', universal: false },
31
+ { id: 'command-code', name: 'Command Code', path: '.commandcode/skills', universal: false },
32
+ { id: 'continue', name: 'Continue', path: '.continue/skills', universal: false },
33
+ { id: 'crush', name: 'Crush', path: '.crush/skills', universal: false },
34
+ { id: 'cursor', name: 'Cursor', path: '.cursor/skills', universal: false },
35
+ { id: 'droid', name: 'Droid', path: '.factory/skills', universal: false },
36
+ { id: 'goose', name: 'Goose', path: '.goose/skills', universal: false },
37
+ { id: 'junie', name: 'Junie', path: '.junie/skills', universal: false },
38
+ { id: 'iflow-cli', name: 'iFlow CLI', path: '.iflow/skills', universal: false },
39
+ { id: 'kilo-code', name: 'Kilo Code', path: '.kilocode/skills', universal: false },
40
+ { id: 'kiro-cli', name: 'Kiro CLI', path: '.kiro/skills', universal: false },
41
+ { id: 'kode', name: 'Kode', path: '.kode/skills', universal: false },
42
+ { id: 'mcpjam', name: 'MCPJam', path: '.mcpjam/skills', universal: false },
43
+ { id: 'mistral-vibe', name: 'Mistral Vibe', path: '.vibe/skills', universal: false },
44
+ { id: 'mux', name: 'Mux', path: '.mux/skills', universal: false },
45
+ { id: 'openhands', name: 'OpenHands', path: '.openhands/skills', universal: false },
46
+ { id: 'pi', name: 'Pi', path: '.pi/skills', universal: false },
47
+ { id: 'qoder', name: 'Qoder', path: '.qoder/skills', universal: false },
48
+ { id: 'qwen-code', name: 'Qwen Code', path: '.qwen/skills', universal: false },
49
+ { id: 'roo-code', name: 'Roo Code', path: '.roo/skills', universal: false },
50
+ { id: 'trae', name: 'Trae', path: '.trae/skills', universal: false },
51
+ { id: 'trae-cn', name: 'Trae CN', path: '.trae/skills', globalPath: '.trae-cn/skills', universal: false },
52
+ { id: 'windsurf', name: 'Windsurf', path: '.windsurf/skills', universal: false },
53
+ { id: 'zencoder', name: 'Zencoder', path: '.zencoder/skills', universal: false },
54
+ { id: 'neovate', name: 'Neovate', path: '.neovate/skills', universal: false },
55
+ { id: 'pochi', name: 'Pochi', path: '.pochi/skills', universal: false },
56
+ { id: 'adal', name: 'AdaL', path: '.adal/skills', universal: false },
57
+ ];
58
+ function getGlobalStoragePath() {
59
+ const platform = os_1.default.platform();
60
+ const homeDir = os_1.default.homedir();
61
+ switch (platform) {
62
+ case 'win32':
63
+ return path_1.default.join(process.env.LOCALAPPDATA || path_1.default.join(homeDir, 'AppData', 'Local'), 'skill4agent', 'skills');
64
+ case 'linux':
65
+ return path_1.default.join(process.env.XDG_DATA_HOME || path_1.default.join(homeDir, '.local', 'share'), 'skill4agent', 'skills');
66
+ case 'darwin':
67
+ default:
68
+ return path_1.default.join(homeDir, '.skill4agent', 'skills');
69
+ }
70
+ }
71
+ function getAgentPath(agentId, isGlobal) {
72
+ const allAgents = [...exports.UNIVERSAL_AGENTS, ...exports.OTHER_AGENTS];
73
+ const agent = allAgents.find(a => a.id === agentId);
74
+ if (!agent)
75
+ return null;
76
+ const effectivePath = isGlobal && agent.globalPath ? agent.globalPath : agent.path;
77
+ if (isGlobal) {
78
+ return path_1.default.join(os_1.default.homedir(), effectivePath);
79
+ }
80
+ else {
81
+ return path_1.default.resolve(process.cwd(), effectivePath);
82
+ }
83
+ }
84
+ function checkAgentExists(agentPath) {
85
+ const parentDir = path_1.default.dirname(agentPath);
86
+ return fs_1.default.existsSync(parentDir);
87
+ }
88
+ function getAllAgents() {
89
+ return [...exports.UNIVERSAL_AGENTS, ...exports.OTHER_AGENTS];
90
+ }
91
+ function getAgentDisplayPath(agentId, isGlobal) {
92
+ const allAgents = [...exports.UNIVERSAL_AGENTS, ...exports.OTHER_AGENTS];
93
+ const agent = allAgents.find(a => a.id === agentId);
94
+ if (!agent)
95
+ return 'unknown';
96
+ const effectivePath = isGlobal && agent.globalPath ? agent.globalPath : agent.path;
97
+ if (isGlobal) {
98
+ const homeDir = os_1.default.homedir();
99
+ const fullPath = path_1.default.join(homeDir, effectivePath);
100
+ return fullPath.replace(os_1.default.homedir(), '~');
101
+ }
102
+ else {
103
+ return effectivePath;
104
+ }
105
+ }
106
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function extractZip(zipPath: string, destDir: string): Promise<void>;
2
+ export declare function formatSize(bytes: number): string;
3
+ export declare function getSkillDirFromZip(zipPath: string): string | null;
4
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIhF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIhD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYjE"}
package/dist/utils.js ADDED
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractZip = extractZip;
4
+ exports.formatSize = formatSize;
5
+ exports.getSkillDirFromZip = getSkillDirFromZip;
6
+ async function extractZip(zipPath, destDir) {
7
+ const AdmZip = require('adm-zip');
8
+ const zip = new AdmZip(zipPath);
9
+ zip.extractAllTo(destDir, true);
10
+ }
11
+ function formatSize(bytes) {
12
+ if (bytes < 1024)
13
+ return bytes + ' B';
14
+ if (bytes < 1024 * 1024)
15
+ return (bytes / 1024).toFixed(1) + ' KB';
16
+ return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
17
+ }
18
+ function getSkillDirFromZip(zipPath) {
19
+ const AdmZip = require('adm-zip');
20
+ const zip = new AdmZip(zipPath);
21
+ const entries = zip.getEntries();
22
+ for (const entry of entries) {
23
+ const parts = entry.entryName.split('/');
24
+ if (parts.length > 1 && parts[0] !== '__MACOSX') {
25
+ return parts[0];
26
+ }
27
+ }
28
+ return null;
29
+ }
30
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;AAGA,gCAIC;AAED,gCAIC;AAED,gDAYC;AAxBM,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,OAAe;IAC/D,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,UAAU,CAAC,KAAa;IACtC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,KAAK,GAAG,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAClE,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;AACpD,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAAe;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,EAAE,CAAC;IAEjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;YAChD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "skill4agent",
3
+ "version": "1.0.0",
4
+ "description": "CLI tool for installing agent skills",
5
+ "main": "dist/main.js",
6
+ "bin": {
7
+ "skill4agent": "./bin/skill4agent.js"
8
+ },
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "dev": "ts-node src/main.ts",
12
+ "link": "npm run build && npm link",
13
+ "test": "ts-node src/main.ts install vercel-labs/agent-skills frontend-design --skip-prompts"
14
+ },
15
+ "keywords": [
16
+ "cli",
17
+ "agent",
18
+ "skill",
19
+ "ai"
20
+ ],
21
+ "author": "",
22
+ "license": "MIT",
23
+ "dependencies": {
24
+ "adm-zip": "^0.5.10",
25
+ "axios": "^1.6.0",
26
+ "chalk": "^4.1.2",
27
+ "commander": "^11.1.0",
28
+ "fs-extra": "^11.1.1",
29
+ "inquirer": "^9.2.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/adm-zip": "^0.5.2",
33
+ "@types/fs-extra": "^11.0.4",
34
+ "@types/inquirer": "^9.0.3",
35
+ "@types/node": "^20.10.0",
36
+ "typescript": "^5.3.0",
37
+ "ts-node": "^10.9.2"
38
+ }
39
+ }
package/src/api.ts ADDED
@@ -0,0 +1,99 @@
1
+ import axios from 'axios';
2
+ import fs from 'fs-extra';
3
+ import os from 'os';
4
+ import path from 'path';
5
+
6
+ const API_BASE = 'https://skill4agent.com/api';
7
+
8
+ export interface SkillInfo {
9
+ skillName: string;
10
+ name: string;
11
+ nameCn: string;
12
+ description: string;
13
+ descriptionCn: string;
14
+ descriptionTranslated: string;
15
+ category: {
16
+ nameCn: string;
17
+ nameEn: string;
18
+ } | null;
19
+ tags: string;
20
+ tagsCn: string;
21
+ originalLanguage: string;
22
+ hasTranslation: boolean;
23
+ hasScript: boolean;
24
+ scriptCount: number;
25
+ scriptCheckResult: string;
26
+ hasDownloaded: boolean;
27
+ downloadStatus: string;
28
+ installs: number;
29
+ trending24h: number;
30
+ }
31
+
32
+ export async function downloadSkill(
33
+ topSource: string,
34
+ skillName: string,
35
+ type: 'original' | 'translated' = 'original'
36
+ ): Promise<string> {
37
+ const url = `${API_BASE}/download?top_source=${encodeURIComponent(topSource)}&skill_name=${encodeURIComponent(skillName)}&type=${type}`;
38
+
39
+ const response = await axios.get(url, {
40
+ responseType: 'arraybuffer',
41
+ });
42
+
43
+ const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'skill4agent-'));
44
+ const fileName = `${skillName}.zip`;
45
+ const filePath = path.join(tempDir, fileName);
46
+
47
+ fs.writeFileSync(filePath, Buffer.from(response.data));
48
+
49
+ return filePath;
50
+ }
51
+
52
+ export async function getSkillInfo(topSource: string, skillName: string): Promise<{ skill: SkillInfo | null; sourceExists: boolean }> {
53
+ try {
54
+ const url = `${API_BASE}/skills/info?top_source=${encodeURIComponent(topSource)}&skill_name=${encodeURIComponent(skillName)}`;
55
+ const response = await axios.get(url);
56
+
57
+ if (response.status === 404) {
58
+ return { skill: null, sourceExists: false };
59
+ }
60
+
61
+ const skill = response.data.data;
62
+ if (!skill) {
63
+ return { skill: null, sourceExists: true };
64
+ }
65
+
66
+ return {
67
+ skill: {
68
+ skillName: skill.skillName,
69
+ name: skill.name,
70
+ nameCn: skill.nameCn,
71
+ description: skill.description,
72
+ descriptionCn: skill.descriptionCn,
73
+ descriptionTranslated: skill.descriptionTranslated,
74
+ category: skill.category,
75
+ tags: skill.tags,
76
+ tagsCn: skill.tagsCn,
77
+ originalLanguage: skill.originalLanguage,
78
+ hasTranslation: skill.hasTranslation,
79
+ hasScript: skill.hasScript,
80
+ scriptCount: skill.scriptCount,
81
+ scriptCheckResult: skill.scriptCheckResult,
82
+ hasDownloaded: skill.hasDownloaded,
83
+ downloadStatus: skill.downloadStatus,
84
+ installs: skill.installs,
85
+ trending24h: skill.trending24h,
86
+ },
87
+ sourceExists: true,
88
+ };
89
+ } catch (error: any) {
90
+ if (error.response?.status === 404) {
91
+ return { skill: null, sourceExists: false };
92
+ }
93
+ return { skill: null, sourceExists: false };
94
+ }
95
+ }
96
+
97
+ export function getDownloadUrl(topSource: string, skillName: string, type: 'original' | 'translated' = 'original'): string {
98
+ return `${API_BASE}/download?top_source=${encodeURIComponent(topSource)}&skill_name=${encodeURIComponent(skillName)}&type=${type}`;
99
+ }