skillsauth 2.0.0 → 3.0.1
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 +246 -79
- package/dist/__tests__/agents.test.d.ts +2 -0
- package/dist/__tests__/agents.test.d.ts.map +1 -0
- package/dist/__tests__/agents.test.js +48 -0
- package/dist/__tests__/agents.test.js.map +1 -0
- package/dist/__tests__/installer.test.d.ts +2 -0
- package/dist/__tests__/installer.test.d.ts.map +1 -0
- package/dist/__tests__/installer.test.js +126 -0
- package/dist/__tests__/installer.test.js.map +1 -0
- package/dist/__tests__/lockfile.test.d.ts +2 -0
- package/dist/__tests__/lockfile.test.d.ts.map +1 -0
- package/dist/__tests__/lockfile.test.js +76 -0
- package/dist/__tests__/lockfile.test.js.map +1 -0
- package/dist/__tests__/plugin-manifest.test.d.ts +2 -0
- package/dist/__tests__/plugin-manifest.test.d.ts.map +1 -0
- package/dist/__tests__/plugin-manifest.test.js +150 -0
- package/dist/__tests__/plugin-manifest.test.js.map +1 -0
- package/dist/__tests__/slug.test.d.ts +2 -0
- package/dist/__tests__/slug.test.d.ts.map +1 -0
- package/dist/__tests__/slug.test.js +34 -0
- package/dist/__tests__/slug.test.js.map +1 -0
- package/dist/commands/add-local.d.ts +14 -0
- package/dist/commands/add-local.d.ts.map +1 -0
- package/dist/commands/add-local.js +234 -0
- package/dist/commands/add-local.js.map +1 -0
- package/dist/commands/add.d.ts +7 -2
- package/dist/commands/add.d.ts.map +1 -1
- package/dist/commands/add.js +68 -32
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/check.d.ts +7 -0
- package/dist/commands/check.d.ts.map +1 -0
- package/dist/commands/check.js +57 -0
- package/dist/commands/check.js.map +1 -0
- package/dist/commands/find.d.ts +7 -0
- package/dist/commands/find.d.ts.map +1 -0
- package/dist/commands/find.js +60 -0
- package/dist/commands/find.js.map +1 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +146 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/installed.d.ts +1 -0
- package/dist/commands/installed.d.ts.map +1 -1
- package/dist/commands/installed.js +4 -0
- package/dist/commands/installed.js.map +1 -1
- package/dist/commands/remove.d.ts.map +1 -1
- package/dist/commands/remove.js +5 -0
- package/dist/commands/remove.js.map +1 -1
- package/dist/index.js +91 -12
- package/dist/index.js.map +1 -1
- package/dist/lib/agents.d.ts +8 -0
- package/dist/lib/agents.d.ts.map +1 -1
- package/dist/lib/agents.js +57 -5
- package/dist/lib/agents.js.map +1 -1
- package/dist/lib/api.js +2 -2
- package/dist/lib/installer.d.ts +12 -1
- package/dist/lib/installer.d.ts.map +1 -1
- package/dist/lib/installer.js +151 -27
- package/dist/lib/installer.js.map +1 -1
- package/dist/lib/plugin-manifest.d.ts +21 -0
- package/dist/lib/plugin-manifest.d.ts.map +1 -0
- package/dist/lib/plugin-manifest.js +144 -0
- package/dist/lib/plugin-manifest.js.map +1 -0
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +40 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/constants.d.ts +7 -14
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +50 -13
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/display.d.ts.map +1 -1
- package/dist/utils/display.js +2 -6
- package/dist/utils/display.js.map +1 -1
- package/dist/utils/slug.d.ts +4 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +6 -0
- package/dist/utils/slug.js.map +1 -0
- package/package.json +61 -37
package/dist/index.js
CHANGED
|
@@ -3,47 +3,126 @@ import { Command } from 'commander';
|
|
|
3
3
|
import { readFileSync } from 'fs';
|
|
4
4
|
import { fileURLToPath } from 'url';
|
|
5
5
|
import { dirname, join } from 'path';
|
|
6
|
+
import { existsSync } from 'fs';
|
|
6
7
|
import { addCommand } from './commands/add.js';
|
|
8
|
+
import { addLocalCommand } from './commands/add-local.js';
|
|
7
9
|
import { listCommand } from './commands/list.js';
|
|
8
10
|
import { searchCommand } from './commands/search.js';
|
|
11
|
+
import { findCommand } from './commands/find.js';
|
|
9
12
|
import { installedCommand } from './commands/installed.js';
|
|
10
13
|
import { updateCommand } from './commands/update.js';
|
|
11
14
|
import { removeCommand } from './commands/remove.js';
|
|
15
|
+
import { initCommand } from './commands/init.js';
|
|
16
|
+
import { checkCommand } from './commands/check.js';
|
|
17
|
+
import { AGENT_IDS } from './types.js';
|
|
12
18
|
const pkg = JSON.parse(readFileSync(join(dirname(fileURLToPath(import.meta.url)), '../package.json'), 'utf8'));
|
|
13
19
|
const program = new Command()
|
|
14
20
|
.name('skillsauth')
|
|
15
21
|
.description('Install verified AI agent skills from the SkillsAuth marketplace')
|
|
16
22
|
.version(pkg.version);
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
.
|
|
23
|
+
// --- add / install ---
|
|
24
|
+
const addCmd = new Command('add')
|
|
25
|
+
.alias('install')
|
|
26
|
+
.alias('i')
|
|
27
|
+
.argument('<source>', 'Repository (owner/repo) or local path (./ or /path)')
|
|
28
|
+
.argument('[skill...]', 'Optional skill name or slug')
|
|
29
|
+
.description('Install skills from a repository or local directory (with plugin manifest support)')
|
|
20
30
|
.option('-g, --global', 'Install globally')
|
|
21
31
|
.option('-y, --yes', 'Skip all prompts')
|
|
22
|
-
.
|
|
23
|
-
|
|
24
|
-
.
|
|
25
|
-
.
|
|
32
|
+
.option('--copy', 'Copy files instead of symlink')
|
|
33
|
+
.option('--agent <agents...>', 'Target specific agent(s)')
|
|
34
|
+
.option('--all', 'Install all skills without prompting')
|
|
35
|
+
.option('--json', 'Output results as JSON')
|
|
36
|
+
.action((source, skillArgs, opts) => {
|
|
37
|
+
const isLocal = source.startsWith('.') || source.startsWith('/') || source.startsWith('\\') || existsSync(source);
|
|
38
|
+
if (isLocal) {
|
|
39
|
+
return addLocalCommand(source, opts);
|
|
40
|
+
}
|
|
41
|
+
const skill = skillArgs?.length ? skillArgs.join(' ') : undefined;
|
|
42
|
+
return addCommand(source, skill, opts);
|
|
43
|
+
});
|
|
44
|
+
program.addCommand(addCmd);
|
|
45
|
+
// --- list / ls ---
|
|
46
|
+
const listCmd = new Command('list')
|
|
47
|
+
.alias('ls')
|
|
48
|
+
.argument('<repo>', 'Repository (owner/repo)')
|
|
49
|
+
.description('List skills in a repository')
|
|
26
50
|
.action(listCommand);
|
|
51
|
+
program.addCommand(listCmd);
|
|
52
|
+
// --- search ---
|
|
27
53
|
program
|
|
28
54
|
.command('search <query>')
|
|
29
55
|
.description('Search the marketplace')
|
|
30
56
|
.option('-l, --limit <n>', 'Max results', '10')
|
|
31
|
-
.action((q, o) =>
|
|
57
|
+
.action((q, o) => {
|
|
58
|
+
const n = parseInt(o.limit, 10);
|
|
59
|
+
return searchCommand(q, { limit: Number.isFinite(n) && n > 0 ? n : 10 });
|
|
60
|
+
});
|
|
61
|
+
// --- find (interactive search) ---
|
|
32
62
|
program
|
|
33
|
-
.command('
|
|
63
|
+
.command('find [query]')
|
|
64
|
+
.description('Interactive skill discovery')
|
|
65
|
+
.option('-l, --limit <n>', 'Max results', '20')
|
|
66
|
+
.option('--json', 'Output results as JSON')
|
|
67
|
+
.action((q, o) => {
|
|
68
|
+
const n = parseInt(o.limit, 10);
|
|
69
|
+
return findCommand(q, { limit: Number.isFinite(n) && n > 0 ? n : 20, json: o.json });
|
|
70
|
+
});
|
|
71
|
+
// --- installed / status ---
|
|
72
|
+
const installedCmd = new Command('installed')
|
|
73
|
+
.alias('status')
|
|
34
74
|
.description('Show installed skills')
|
|
35
75
|
.option('-g, --global', 'Show global installs')
|
|
76
|
+
.option('--json', 'Output as JSON')
|
|
36
77
|
.action(installedCommand);
|
|
37
|
-
program
|
|
38
|
-
|
|
78
|
+
program.addCommand(installedCmd);
|
|
79
|
+
// --- update / upgrade ---
|
|
80
|
+
const updateCmd = new Command('update')
|
|
81
|
+
.alias('upgrade')
|
|
39
82
|
.description('Update all installed skills')
|
|
40
83
|
.option('-g, --global', 'Update global installs')
|
|
41
84
|
.action(updateCommand);
|
|
85
|
+
program.addCommand(updateCmd);
|
|
86
|
+
// --- check ---
|
|
42
87
|
program
|
|
43
|
-
.command('
|
|
88
|
+
.command('check')
|
|
89
|
+
.description('Check for available updates without installing')
|
|
90
|
+
.option('-g, --global', 'Check global installs')
|
|
91
|
+
.option('--json', 'Output as JSON')
|
|
92
|
+
.action(checkCommand);
|
|
93
|
+
// --- remove / uninstall / rm ---
|
|
94
|
+
const removeCmd = new Command('remove')
|
|
95
|
+
.alias('uninstall')
|
|
96
|
+
.alias('rm')
|
|
97
|
+
.argument('<slug>', 'Skill slug to remove')
|
|
44
98
|
.description('Remove an installed skill')
|
|
45
99
|
.option('-g, --global', 'Remove from global install')
|
|
46
100
|
.option('-y, --yes', 'Skip confirmation')
|
|
47
101
|
.action(removeCommand);
|
|
102
|
+
program.addCommand(removeCmd);
|
|
103
|
+
// --- init ---
|
|
104
|
+
program
|
|
105
|
+
.command('init')
|
|
106
|
+
.description('Scaffold a new skill or plugin')
|
|
107
|
+
.option('--plugin', 'Scaffold a multi-skill plugin with manifests')
|
|
108
|
+
.option('-y, --yes', 'Skip prompts (use defaults)')
|
|
109
|
+
.action(initCommand);
|
|
110
|
+
// --- agents ---
|
|
111
|
+
program
|
|
112
|
+
.command('agents')
|
|
113
|
+
.description('List all supported agents')
|
|
114
|
+
.option('--json', 'Output as JSON')
|
|
115
|
+
.action((opts) => {
|
|
116
|
+
if (opts.json) {
|
|
117
|
+
console.log(JSON.stringify(Array.from(AGENT_IDS), null, 2));
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
console.log(`\n Supported agents (${AGENT_IDS.length}):\n`);
|
|
121
|
+
for (const id of AGENT_IDS) {
|
|
122
|
+
console.log(` ${id}`);
|
|
123
|
+
}
|
|
124
|
+
console.log('');
|
|
125
|
+
}
|
|
126
|
+
});
|
|
48
127
|
program.parse();
|
|
49
128
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,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,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/agents.d.ts
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
import type { AgentType } from '../types.js';
|
|
2
|
+
export interface AgentMeta {
|
|
3
|
+
id: AgentType;
|
|
4
|
+
displayName: string;
|
|
5
|
+
dotDir: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function getAgentMeta(id: AgentType): AgentMeta;
|
|
8
|
+
export declare function getDisplayName(id: AgentType): string;
|
|
2
9
|
export interface AgentDetection {
|
|
3
10
|
id: AgentType;
|
|
4
11
|
name: string;
|
|
5
12
|
detected: boolean;
|
|
6
13
|
}
|
|
7
14
|
export declare function detectAgents(scope: 'local' | 'global', cwd: string): AgentDetection[];
|
|
15
|
+
export declare function detectAutoAgents(scope: 'local' | 'global', cwd: string): AgentType[];
|
|
8
16
|
//# sourceMappingURL=agents.d.ts.map
|
package/dist/lib/agents.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,SAAS,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAChB;AA2CD,wBAAgB,YAAY,CAAC,EAAE,EAAE,SAAS,GAAG,SAAS,CAErD;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,SAAS,GAAG,MAAM,CAEpD;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,SAAS,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAOrF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAIpF"}
|
package/dist/lib/agents.js
CHANGED
|
@@ -1,12 +1,64 @@
|
|
|
1
1
|
import { existsSync } from 'fs';
|
|
2
2
|
import { join } from 'path';
|
|
3
3
|
import { homedir } from 'os';
|
|
4
|
+
import { AGENT_IDS } from '../types.js';
|
|
5
|
+
const META = {
|
|
6
|
+
'claude-code': { displayName: 'Claude Code', dotDir: '.claude' },
|
|
7
|
+
'cursor': { displayName: 'Cursor', dotDir: '.cursor' },
|
|
8
|
+
'windsurf': { displayName: 'Windsurf', dotDir: '.windsurf' },
|
|
9
|
+
'codex': { displayName: 'Codex', dotDir: '.codex' },
|
|
10
|
+
'copilot': { displayName: 'GitHub Copilot', dotDir: '.github' },
|
|
11
|
+
'cline': { displayName: 'Cline', dotDir: '.cline' },
|
|
12
|
+
'roo': { displayName: 'Roo Code', dotDir: '.roo' },
|
|
13
|
+
'aider': { displayName: 'Aider', dotDir: '.aider' },
|
|
14
|
+
'continue': { displayName: 'Continue', dotDir: '.continue' },
|
|
15
|
+
'amp': { displayName: 'Amp', dotDir: '.amp' },
|
|
16
|
+
'zed': { displayName: 'Zed', dotDir: '.zed' },
|
|
17
|
+
'void': { displayName: 'Void', dotDir: '.void' },
|
|
18
|
+
'pear': { displayName: 'PearAI', dotDir: '.pear' },
|
|
19
|
+
'trae': { displayName: 'Trae', dotDir: '.trae' },
|
|
20
|
+
'aide': { displayName: 'Aide', dotDir: '.aide' },
|
|
21
|
+
'augment': { displayName: 'Augment', dotDir: '.augment' },
|
|
22
|
+
'supermaven': { displayName: 'Supermaven', dotDir: '.supermaven' },
|
|
23
|
+
'tabnine': { displayName: 'Tabnine', dotDir: '.tabnine' },
|
|
24
|
+
'cody': { displayName: 'Sourcegraph Cody', dotDir: '.cody' },
|
|
25
|
+
'qodo': { displayName: 'Qodo', dotDir: '.qodo' },
|
|
26
|
+
'bito': { displayName: 'Bito', dotDir: '.bito' },
|
|
27
|
+
'double': { displayName: 'Double', dotDir: '.double' },
|
|
28
|
+
'codestory': { displayName: 'CodeStory', dotDir: '.codestory' },
|
|
29
|
+
'mentat': { displayName: 'Mentat', dotDir: '.mentat' },
|
|
30
|
+
'goose': { displayName: 'Goose', dotDir: '.goose' },
|
|
31
|
+
'otto': { displayName: 'Otto', dotDir: '.otto' },
|
|
32
|
+
'sweep': { displayName: 'Sweep', dotDir: '.sweep' },
|
|
33
|
+
'devin': { displayName: 'Devin', dotDir: '.devin' },
|
|
34
|
+
'replit': { displayName: 'Replit Agent', dotDir: '.replit' },
|
|
35
|
+
'bolt': { displayName: 'Bolt', dotDir: '.bolt' },
|
|
36
|
+
'v0': { displayName: 'v0', dotDir: '.v0' },
|
|
37
|
+
'lovable': { displayName: 'Lovable', dotDir: '.lovable' },
|
|
38
|
+
'same': { displayName: 'Same.dev', dotDir: '.same' },
|
|
39
|
+
'manus': { displayName: 'Manus', dotDir: '.manus' },
|
|
40
|
+
'opencode': { displayName: 'OpenCode', dotDir: '.opencode' },
|
|
41
|
+
'kilo-code': { displayName: 'Kilo Code', dotDir: '.kilo-code' },
|
|
42
|
+
'gemini-cli': { displayName: 'Gemini CLI', dotDir: '.gemini' },
|
|
43
|
+
'agents': { displayName: 'Universal (.agents)', dotDir: '.agents' },
|
|
44
|
+
};
|
|
45
|
+
export function getAgentMeta(id) {
|
|
46
|
+
return { id, ...META[id] };
|
|
47
|
+
}
|
|
48
|
+
export function getDisplayName(id) {
|
|
49
|
+
return META[id].displayName;
|
|
50
|
+
}
|
|
4
51
|
export function detectAgents(scope, cwd) {
|
|
5
52
|
const base = scope === 'local' ? cwd : homedir();
|
|
6
|
-
return
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
53
|
+
return AGENT_IDS.map((id) => ({
|
|
54
|
+
id,
|
|
55
|
+
name: META[id].displayName,
|
|
56
|
+
detected: existsSync(join(base, META[id].dotDir)),
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
export function detectAutoAgents(scope, cwd) {
|
|
60
|
+
return detectAgents(scope, cwd)
|
|
61
|
+
.filter((a) => a.detected)
|
|
62
|
+
.map((a) => a.id);
|
|
11
63
|
}
|
|
12
64
|
//# sourceMappingURL=agents.js.map
|
package/dist/lib/agents.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.js","sourceRoot":"","sources":["../../src/lib/agents.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/api.js
CHANGED
|
@@ -14,7 +14,7 @@ async function apiFetch(path) {
|
|
|
14
14
|
let res;
|
|
15
15
|
try {
|
|
16
16
|
res = await fetch(url, {
|
|
17
|
-
headers: { 'User-Agent': 'skillsauth-cli/
|
|
17
|
+
headers: { 'User-Agent': 'skillsauth-cli/3.0.1' },
|
|
18
18
|
signal: AbortSignal.timeout(15000),
|
|
19
19
|
});
|
|
20
20
|
}
|
|
@@ -52,7 +52,7 @@ export function recordDownload(skillId, agentType) {
|
|
|
52
52
|
return;
|
|
53
53
|
fetch(`${API_BASE_URL}/download`, {
|
|
54
54
|
method: 'POST',
|
|
55
|
-
headers: { 'Content-Type': 'application/json', 'User-Agent': 'skillsauth-cli/
|
|
55
|
+
headers: { 'Content-Type': 'application/json', 'User-Agent': 'skillsauth-cli/3.0.1' },
|
|
56
56
|
body: JSON.stringify({ skillId, agentType }),
|
|
57
57
|
signal: AbortSignal.timeout(5000),
|
|
58
58
|
}).catch(() => { });
|
package/dist/lib/installer.d.ts
CHANGED
|
@@ -3,9 +3,20 @@ export interface InstallResult {
|
|
|
3
3
|
agent: AgentType;
|
|
4
4
|
path: string;
|
|
5
5
|
status: 'installed' | 'updated' | 'skipped' | 'error';
|
|
6
|
+
symlink?: boolean;
|
|
6
7
|
error?: string;
|
|
7
8
|
}
|
|
8
9
|
export declare function getInstallPath(slug: string, agent: AgentType, scope: InstallScope): string;
|
|
9
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Install a skill to the canonical store first, then symlink (or copy) into
|
|
12
|
+
* each agent's expected directory.
|
|
13
|
+
*
|
|
14
|
+
* Canonical store: .agents/skills/<slug>/ (local) or ~/.agents/skills/<slug>/ (global)
|
|
15
|
+
* Agent link: .<agent>/skills/<slug>/ -> canonical store
|
|
16
|
+
*
|
|
17
|
+
* When `copyMode` is true, files are copied directly to each agent path
|
|
18
|
+
* (no canonical store / no symlink). This is the legacy behaviour.
|
|
19
|
+
*/
|
|
20
|
+
export declare function installSkill(skill: CLISkill, agents: AgentType[], scope: InstallScope, force?: boolean, copyMode?: boolean): InstallResult[];
|
|
10
21
|
export declare function uninstallSkill(slug: string, agents: AgentType[], scope: InstallScope): void;
|
|
11
22
|
//# sourceMappingURL=installer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIrE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,GAAG,MAAM,CAO1F;AAwDD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,SAAS,EAAE,EACnB,KAAK,EAAE,YAAY,EACnB,KAAK,UAAQ,EACb,QAAQ,UAAQ,GACf,aAAa,EAAE,CAsDjB;AA2BD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CA4B3F"}
|
package/dist/lib/installer.js
CHANGED
|
@@ -1,53 +1,177 @@
|
|
|
1
|
-
import { writeFileSync, mkdirSync, existsSync, readFileSync,
|
|
2
|
-
import {
|
|
1
|
+
import { writeFileSync, mkdirSync, existsSync, readFileSync, rmSync, symlinkSync, lstatSync, } from 'fs';
|
|
2
|
+
import { dirname, join, resolve, sep } from 'path';
|
|
3
|
+
import { homedir } from 'os';
|
|
3
4
|
import { AGENT_PATHS } from '../utils/constants.js';
|
|
5
|
+
import { isSafeSkillSlug } from '../utils/slug.js';
|
|
4
6
|
export function getInstallPath(slug, agent, scope) {
|
|
7
|
+
if (!isSafeSkillSlug(slug)) {
|
|
8
|
+
throw new Error('Invalid skill slug');
|
|
9
|
+
}
|
|
5
10
|
return scope === 'global'
|
|
6
11
|
? AGENT_PATHS[agent].global(slug)
|
|
7
12
|
: AGENT_PATHS[agent].local(slug);
|
|
8
13
|
}
|
|
9
|
-
|
|
14
|
+
function isPathUnderBase(absPath, baseDirAbs) {
|
|
15
|
+
const base = resolve(baseDirAbs) + sep;
|
|
16
|
+
const resolved = resolve(absPath);
|
|
17
|
+
return resolved === resolve(baseDirAbs) || resolved.startsWith(base);
|
|
18
|
+
}
|
|
19
|
+
function writeSkillFiles(skill, targetDir, force) {
|
|
20
|
+
let anyWritten = false;
|
|
21
|
+
let allUnchanged = true;
|
|
22
|
+
for (const file of skill.files) {
|
|
23
|
+
if (!file.path || file.path.includes('..') || file.path.startsWith('/'))
|
|
24
|
+
continue;
|
|
25
|
+
const normalizedPath = file.path.replace(/\\/g, '/');
|
|
26
|
+
const absPath = resolve(join(targetDir, normalizedPath));
|
|
27
|
+
if (!isPathUnderBase(absPath, targetDir))
|
|
28
|
+
continue;
|
|
29
|
+
const alreadyExists = existsSync(absPath);
|
|
30
|
+
const content = file.content ?? '';
|
|
31
|
+
if (alreadyExists && !force) {
|
|
32
|
+
try {
|
|
33
|
+
if (readFileSync(absPath, 'utf8') === content)
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// unreadable, overwrite
|
|
38
|
+
}
|
|
39
|
+
allUnchanged = false;
|
|
40
|
+
}
|
|
41
|
+
mkdirSync(dirname(absPath), { recursive: true });
|
|
42
|
+
writeFileSync(absPath, content, 'utf8');
|
|
43
|
+
anyWritten = true;
|
|
44
|
+
allUnchanged = false;
|
|
45
|
+
}
|
|
46
|
+
return { anyWritten, allUnchanged };
|
|
47
|
+
}
|
|
48
|
+
function trySymlink(target, linkPath) {
|
|
49
|
+
try {
|
|
50
|
+
mkdirSync(dirname(linkPath), { recursive: true });
|
|
51
|
+
if (existsSync(linkPath)) {
|
|
52
|
+
const stat = lstatSync(linkPath);
|
|
53
|
+
if (stat.isSymbolicLink())
|
|
54
|
+
rmSync(linkPath);
|
|
55
|
+
else
|
|
56
|
+
return false; // real dir already exists, don't replace
|
|
57
|
+
}
|
|
58
|
+
const type = process.platform === 'win32' ? 'junction' : 'dir';
|
|
59
|
+
symlinkSync(target, linkPath, type);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Install a skill to the canonical store first, then symlink (or copy) into
|
|
68
|
+
* each agent's expected directory.
|
|
69
|
+
*
|
|
70
|
+
* Canonical store: .agents/skills/<slug>/ (local) or ~/.agents/skills/<slug>/ (global)
|
|
71
|
+
* Agent link: .<agent>/skills/<slug>/ -> canonical store
|
|
72
|
+
*
|
|
73
|
+
* When `copyMode` is true, files are copied directly to each agent path
|
|
74
|
+
* (no canonical store / no symlink). This is the legacy behaviour.
|
|
75
|
+
*/
|
|
76
|
+
export function installSkill(skill, agents, scope, force = false, copyMode = false) {
|
|
77
|
+
if (copyMode) {
|
|
78
|
+
return installSkillCopy(skill, agents, scope, force);
|
|
79
|
+
}
|
|
80
|
+
const canonicalRel = `.agents/skills/${skill.slug}`;
|
|
81
|
+
const canonicalAbs = scope === 'local'
|
|
82
|
+
? resolve(process.cwd(), canonicalRel)
|
|
83
|
+
: resolve(join(homedir(), canonicalRel));
|
|
84
|
+
const { anyWritten, allUnchanged } = writeSkillFiles(skill, canonicalAbs, force);
|
|
10
85
|
return agents.map((agent) => {
|
|
11
86
|
const filePath = getInstallPath(skill.slug, agent, scope);
|
|
12
|
-
const
|
|
87
|
+
const agentSkillDir = scope === 'local'
|
|
88
|
+
? resolve(process.cwd(), dirname(filePath), '..')
|
|
89
|
+
: resolve(dirname(filePath), '..');
|
|
90
|
+
// For the 'agents' agent type, canonical IS the target; no symlink needed
|
|
91
|
+
if (agent === 'agents') {
|
|
92
|
+
if (allUnchanged && !force)
|
|
93
|
+
return { agent, path: filePath, status: 'skipped' };
|
|
94
|
+
return {
|
|
95
|
+
agent,
|
|
96
|
+
path: filePath,
|
|
97
|
+
status: anyWritten ? 'installed' : 'skipped',
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const linkTarget = resolve(agentSkillDir, skill.slug);
|
|
101
|
+
const linked = trySymlink(canonicalAbs, linkTarget);
|
|
102
|
+
if (linked) {
|
|
103
|
+
return {
|
|
104
|
+
agent,
|
|
105
|
+
path: filePath,
|
|
106
|
+
status: anyWritten ? 'installed' : (allUnchanged && !force ? 'skipped' : 'updated'),
|
|
107
|
+
symlink: true,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// Fallback: copy files directly
|
|
13
111
|
try {
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
if (
|
|
112
|
+
const baseExisted = existsSync(linkTarget);
|
|
113
|
+
const res = writeSkillFiles(skill, linkTarget, force);
|
|
114
|
+
if (res.allUnchanged && !force)
|
|
17
115
|
return { agent, path: filePath, status: 'skipped' };
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
116
|
+
return {
|
|
117
|
+
agent,
|
|
118
|
+
path: filePath,
|
|
119
|
+
status: (res.anyWritten ? (baseExisted ? 'updated' : 'installed') : 'skipped'),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
return { agent, path: filePath, status: 'error', error: e.message };
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
function installSkillCopy(skill, agents, scope, force) {
|
|
128
|
+
return agents.map((agent) => {
|
|
129
|
+
const filePath = getInstallPath(skill.slug, agent, scope);
|
|
130
|
+
const baseDirRel = dirname(filePath);
|
|
131
|
+
const baseDirAbs = scope === 'local' ? resolve(process.cwd(), baseDirRel) : resolve(baseDirRel);
|
|
132
|
+
try {
|
|
133
|
+
const baseExisted = existsSync(baseDirAbs);
|
|
134
|
+
const { anyWritten, allUnchanged } = writeSkillFiles(skill, baseDirAbs, force);
|
|
135
|
+
if (allUnchanged && !force)
|
|
136
|
+
return { agent, path: filePath, status: 'skipped' };
|
|
137
|
+
const status = anyWritten
|
|
138
|
+
? (baseExisted ? 'updated' : 'installed')
|
|
139
|
+
: 'skipped';
|
|
22
140
|
return { agent, path: filePath, status };
|
|
23
141
|
}
|
|
24
142
|
catch (e) {
|
|
25
|
-
|
|
26
|
-
return { agent, path: filePath, status: 'error', error: error.message };
|
|
143
|
+
return { agent, path: filePath, status: 'error', error: e.message };
|
|
27
144
|
}
|
|
28
145
|
});
|
|
29
146
|
}
|
|
30
147
|
export function uninstallSkill(slug, agents, scope) {
|
|
148
|
+
if (!isSafeSkillSlug(slug))
|
|
149
|
+
return;
|
|
150
|
+
// Remove from each agent directory
|
|
31
151
|
agents.forEach((agent) => {
|
|
32
152
|
const p = getInstallPath(slug, agent, scope);
|
|
33
|
-
const
|
|
153
|
+
const skillBaseDir = scope === 'local' ? join(process.cwd(), dirname(p)) : dirname(p);
|
|
34
154
|
try {
|
|
35
|
-
|
|
155
|
+
if (existsSync(skillBaseDir)) {
|
|
156
|
+
rmSync(skillBaseDir, { recursive: true, force: true });
|
|
157
|
+
}
|
|
36
158
|
}
|
|
37
159
|
catch {
|
|
38
|
-
//
|
|
39
|
-
}
|
|
40
|
-
// Remove parent dir if it's a slug-named folder and now empty
|
|
41
|
-
const dir = dirname(abs);
|
|
42
|
-
if (basename(dir) === slug) {
|
|
43
|
-
try {
|
|
44
|
-
if (readdirSync(dir).length === 0)
|
|
45
|
-
rmdirSync(dir);
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
// Directory may not exist or not be empty
|
|
49
|
-
}
|
|
160
|
+
// already missing or permission error
|
|
50
161
|
}
|
|
51
162
|
});
|
|
163
|
+
// Also clean up canonical store
|
|
164
|
+
const canonicalRel = `.agents/skills/${slug}`;
|
|
165
|
+
const canonicalAbs = scope === 'local'
|
|
166
|
+
? resolve(process.cwd(), canonicalRel)
|
|
167
|
+
: resolve(join(homedir(), canonicalRel));
|
|
168
|
+
try {
|
|
169
|
+
if (existsSync(canonicalAbs)) {
|
|
170
|
+
rmSync(canonicalAbs, { recursive: true, force: true });
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// best-effort
|
|
175
|
+
}
|
|
52
176
|
}
|
|
53
177
|
//# sourceMappingURL=installer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/lib/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export interface DiscoveredSkill {
|
|
2
|
+
name: string;
|
|
3
|
+
path: string;
|
|
4
|
+
pluginName?: string;
|
|
5
|
+
source: 'claude-plugin' | 'cursor-plugin' | 'directory';
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Discover SKILL.md files from plugin manifests and conventional directories
|
|
9
|
+
* within a local path. This supports:
|
|
10
|
+
*
|
|
11
|
+
* 1. `.claude-plugin/marketplace.json` (multi-plugin catalog)
|
|
12
|
+
* 2. `.claude-plugin/plugin.json` (single plugin)
|
|
13
|
+
* 3. `.cursor-plugin/plugin.json` (Cursor plugin)
|
|
14
|
+
* 4. Direct SKILL.md discovery in `skills/`, `.agents/skills/`, etc.
|
|
15
|
+
*/
|
|
16
|
+
export declare function discoverPluginSkills(basePath: string): DiscoveredSkill[];
|
|
17
|
+
/**
|
|
18
|
+
* Check whether a local path looks like it has plugin manifests or skill directories.
|
|
19
|
+
*/
|
|
20
|
+
export declare function hasPluginManifests(basePath: string): boolean;
|
|
21
|
+
//# sourceMappingURL=plugin-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-manifest.d.ts","sourceRoot":"","sources":["../../src/lib/plugin-manifest.ts"],"names":[],"mappings":"AA6CA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,eAAe,GAAG,eAAe,GAAG,WAAW,CAAC;CACzD;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CA4GxE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAO5D"}
|