skillsauth 2.0.0 → 3.0.2
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 +256 -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 +69 -33
- 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/plugins.d.ts +8 -0
- package/dist/commands/plugins.d.ts.map +1 -0
- package/dist/commands/plugins.js +96 -0
- package/dist/commands/plugins.js.map +1 -0
- 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/agent-registry.d.ts +19 -0
- package/dist/lib/agent-registry.d.ts.map +1 -0
- package/dist/lib/agent-registry.js +408 -0
- package/dist/lib/agent-registry.js.map +1 -0
- package/dist/lib/agents.d.ts +9 -1
- package/dist/lib/agents.d.ts.map +1 -1
- package/dist/lib/agents.js +19 -10
- 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 +159 -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 +3 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/constants.d.ts +1 -14
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +1 -15
- 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 +6 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +8 -0
- package/dist/utils/slug.js.map +1 -0
- package/package.json +59 -37
package/dist/lib/installer.js
CHANGED
|
@@ -1,53 +1,185 @@
|
|
|
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 installTargetIsCanonical(skillSlug, agent, scope) {
|
|
15
|
+
const canonicalAbs = scope === 'local'
|
|
16
|
+
? resolve(process.cwd(), '.agents/skills', skillSlug)
|
|
17
|
+
: resolve(join(homedir(), '.agents/skills', skillSlug));
|
|
18
|
+
const filePath = getInstallPath(skillSlug, agent, scope);
|
|
19
|
+
const skillRootAbs = scope === 'local' ? resolve(process.cwd(), dirname(filePath)) : resolve(dirname(filePath));
|
|
20
|
+
return skillRootAbs === canonicalAbs;
|
|
21
|
+
}
|
|
22
|
+
function isPathUnderBase(absPath, baseDirAbs) {
|
|
23
|
+
const base = resolve(baseDirAbs) + sep;
|
|
24
|
+
const resolved = resolve(absPath);
|
|
25
|
+
return resolved === resolve(baseDirAbs) || resolved.startsWith(base);
|
|
26
|
+
}
|
|
27
|
+
function writeSkillFiles(skill, targetDir, force) {
|
|
28
|
+
let anyWritten = false;
|
|
29
|
+
let allUnchanged = true;
|
|
30
|
+
for (const file of skill.files) {
|
|
31
|
+
if (!file.path || file.path.includes('..') || file.path.startsWith('/'))
|
|
32
|
+
continue;
|
|
33
|
+
const normalizedPath = file.path.replace(/\\/g, '/');
|
|
34
|
+
const absPath = resolve(join(targetDir, normalizedPath));
|
|
35
|
+
if (!isPathUnderBase(absPath, targetDir))
|
|
36
|
+
continue;
|
|
37
|
+
const alreadyExists = existsSync(absPath);
|
|
38
|
+
const content = file.content ?? '';
|
|
39
|
+
if (alreadyExists && !force) {
|
|
40
|
+
try {
|
|
41
|
+
if (readFileSync(absPath, 'utf8') === content)
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// unreadable, overwrite
|
|
46
|
+
}
|
|
47
|
+
allUnchanged = false;
|
|
48
|
+
}
|
|
49
|
+
mkdirSync(dirname(absPath), { recursive: true });
|
|
50
|
+
writeFileSync(absPath, content, 'utf8');
|
|
51
|
+
anyWritten = true;
|
|
52
|
+
allUnchanged = false;
|
|
53
|
+
}
|
|
54
|
+
return { anyWritten, allUnchanged };
|
|
55
|
+
}
|
|
56
|
+
function trySymlink(target, linkPath) {
|
|
57
|
+
try {
|
|
58
|
+
mkdirSync(dirname(linkPath), { recursive: true });
|
|
59
|
+
if (existsSync(linkPath)) {
|
|
60
|
+
const stat = lstatSync(linkPath);
|
|
61
|
+
if (stat.isSymbolicLink())
|
|
62
|
+
rmSync(linkPath);
|
|
63
|
+
else
|
|
64
|
+
return false; // real dir already exists, don't replace
|
|
65
|
+
}
|
|
66
|
+
const type = process.platform === 'win32' ? 'junction' : 'dir';
|
|
67
|
+
symlinkSync(target, linkPath, type);
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Install a skill to the canonical store first, then symlink (or copy) into
|
|
76
|
+
* each agent's expected directory.
|
|
77
|
+
*
|
|
78
|
+
* Canonical store: .agents/skills/<slug>/ (local) or ~/.agents/skills/<slug>/ (global)
|
|
79
|
+
* Agent link: .<agent>/skills/<slug>/ -> canonical store
|
|
80
|
+
*
|
|
81
|
+
* When `copyMode` is true, files are copied directly to each agent path
|
|
82
|
+
* (no canonical store / no symlink). This is the legacy behaviour.
|
|
83
|
+
*/
|
|
84
|
+
export function installSkill(skill, agents, scope, force = false, copyMode = false) {
|
|
85
|
+
if (copyMode) {
|
|
86
|
+
return installSkillCopy(skill, agents, scope, force);
|
|
87
|
+
}
|
|
88
|
+
const canonicalRel = `.agents/skills/${skill.slug}`;
|
|
89
|
+
const canonicalAbs = scope === 'local'
|
|
90
|
+
? resolve(process.cwd(), canonicalRel)
|
|
91
|
+
: resolve(join(homedir(), canonicalRel));
|
|
92
|
+
const { anyWritten, allUnchanged } = writeSkillFiles(skill, canonicalAbs, force);
|
|
10
93
|
return agents.map((agent) => {
|
|
11
94
|
const filePath = getInstallPath(skill.slug, agent, scope);
|
|
12
|
-
const
|
|
95
|
+
const agentSkillDir = scope === 'local'
|
|
96
|
+
? resolve(process.cwd(), dirname(filePath), '..')
|
|
97
|
+
: resolve(dirname(filePath), '..');
|
|
98
|
+
// Project `.agents/skills/<slug>` matches canonical store — no symlink (SkillsAuth pattern)
|
|
99
|
+
if (installTargetIsCanonical(skill.slug, agent, scope)) {
|
|
100
|
+
if (allUnchanged && !force)
|
|
101
|
+
return { agent, path: filePath, status: 'skipped' };
|
|
102
|
+
return {
|
|
103
|
+
agent,
|
|
104
|
+
path: filePath,
|
|
105
|
+
status: anyWritten ? 'installed' : 'skipped',
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const linkTarget = resolve(agentSkillDir, skill.slug);
|
|
109
|
+
const linked = trySymlink(canonicalAbs, linkTarget);
|
|
110
|
+
if (linked) {
|
|
111
|
+
return {
|
|
112
|
+
agent,
|
|
113
|
+
path: filePath,
|
|
114
|
+
status: anyWritten ? 'installed' : (allUnchanged && !force ? 'skipped' : 'updated'),
|
|
115
|
+
symlink: true,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// Fallback: copy files directly
|
|
13
119
|
try {
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
if (
|
|
120
|
+
const baseExisted = existsSync(linkTarget);
|
|
121
|
+
const res = writeSkillFiles(skill, linkTarget, force);
|
|
122
|
+
if (res.allUnchanged && !force)
|
|
17
123
|
return { agent, path: filePath, status: 'skipped' };
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
124
|
+
return {
|
|
125
|
+
agent,
|
|
126
|
+
path: filePath,
|
|
127
|
+
status: (res.anyWritten ? (baseExisted ? 'updated' : 'installed') : 'skipped'),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (e) {
|
|
131
|
+
return { agent, path: filePath, status: 'error', error: e.message };
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
function installSkillCopy(skill, agents, scope, force) {
|
|
136
|
+
return agents.map((agent) => {
|
|
137
|
+
const filePath = getInstallPath(skill.slug, agent, scope);
|
|
138
|
+
const baseDirRel = dirname(filePath);
|
|
139
|
+
const baseDirAbs = scope === 'local' ? resolve(process.cwd(), baseDirRel) : resolve(baseDirRel);
|
|
140
|
+
try {
|
|
141
|
+
const baseExisted = existsSync(baseDirAbs);
|
|
142
|
+
const { anyWritten, allUnchanged } = writeSkillFiles(skill, baseDirAbs, force);
|
|
143
|
+
if (allUnchanged && !force)
|
|
144
|
+
return { agent, path: filePath, status: 'skipped' };
|
|
145
|
+
const status = anyWritten
|
|
146
|
+
? (baseExisted ? 'updated' : 'installed')
|
|
147
|
+
: 'skipped';
|
|
22
148
|
return { agent, path: filePath, status };
|
|
23
149
|
}
|
|
24
150
|
catch (e) {
|
|
25
|
-
|
|
26
|
-
return { agent, path: filePath, status: 'error', error: error.message };
|
|
151
|
+
return { agent, path: filePath, status: 'error', error: e.message };
|
|
27
152
|
}
|
|
28
153
|
});
|
|
29
154
|
}
|
|
30
155
|
export function uninstallSkill(slug, agents, scope) {
|
|
156
|
+
if (!isSafeSkillSlug(slug))
|
|
157
|
+
return;
|
|
158
|
+
// Remove from each agent directory
|
|
31
159
|
agents.forEach((agent) => {
|
|
32
160
|
const p = getInstallPath(slug, agent, scope);
|
|
33
|
-
const
|
|
161
|
+
const skillBaseDir = scope === 'local' ? join(process.cwd(), dirname(p)) : dirname(p);
|
|
34
162
|
try {
|
|
35
|
-
|
|
163
|
+
if (existsSync(skillBaseDir)) {
|
|
164
|
+
rmSync(skillBaseDir, { recursive: true, force: true });
|
|
165
|
+
}
|
|
36
166
|
}
|
|
37
167
|
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
|
-
}
|
|
168
|
+
// already missing or permission error
|
|
50
169
|
}
|
|
51
170
|
});
|
|
171
|
+
// Also clean up canonical store
|
|
172
|
+
const canonicalRel = `.agents/skills/${slug}`;
|
|
173
|
+
const canonicalAbs = scope === 'local'
|
|
174
|
+
? resolve(process.cwd(), canonicalRel)
|
|
175
|
+
: resolve(join(homedir(), canonicalRel));
|
|
176
|
+
try {
|
|
177
|
+
if (existsSync(canonicalAbs)) {
|
|
178
|
+
rmSync(canonicalAbs, { recursive: true, force: true });
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
// best-effort
|
|
183
|
+
}
|
|
52
184
|
}
|
|
53
185
|
//# 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"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { readFileSync, existsSync, readdirSync } from 'fs';
|
|
2
|
+
import { join, dirname, resolve, normalize, sep } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Prevent path traversal: ensure target is within basePath.
|
|
5
|
+
*/
|
|
6
|
+
function isContainedIn(targetPath, basePath) {
|
|
7
|
+
const normalizedBase = normalize(resolve(basePath));
|
|
8
|
+
const normalizedTarget = normalize(resolve(targetPath));
|
|
9
|
+
return normalizedTarget.startsWith(normalizedBase + sep) || normalizedTarget === normalizedBase;
|
|
10
|
+
}
|
|
11
|
+
function isValidRelativePath(path) {
|
|
12
|
+
return path.startsWith('./');
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Discover SKILL.md files from plugin manifests and conventional directories
|
|
16
|
+
* within a local path. This supports:
|
|
17
|
+
*
|
|
18
|
+
* 1. `.claude-plugin/marketplace.json` (multi-plugin catalog)
|
|
19
|
+
* 2. `.claude-plugin/plugin.json` (single plugin)
|
|
20
|
+
* 3. `.cursor-plugin/plugin.json` (Cursor plugin)
|
|
21
|
+
* 4. Direct SKILL.md discovery in `skills/`, `.agents/skills/`, etc.
|
|
22
|
+
*/
|
|
23
|
+
export function discoverPluginSkills(basePath) {
|
|
24
|
+
const absBase = resolve(basePath);
|
|
25
|
+
const skills = [];
|
|
26
|
+
const seen = new Set();
|
|
27
|
+
function addSkill(skillDir, pluginName, source) {
|
|
28
|
+
const skillMd = join(skillDir, 'SKILL.md');
|
|
29
|
+
if (!existsSync(skillMd))
|
|
30
|
+
return;
|
|
31
|
+
const normalizedDir = normalize(resolve(skillDir));
|
|
32
|
+
if (seen.has(normalizedDir))
|
|
33
|
+
return;
|
|
34
|
+
seen.add(normalizedDir);
|
|
35
|
+
const name = dirname(skillMd).split(sep).pop() ?? 'unknown';
|
|
36
|
+
skills.push({ name, path: normalizedDir, pluginName, source });
|
|
37
|
+
}
|
|
38
|
+
// 1. Claude Code marketplace.json
|
|
39
|
+
try {
|
|
40
|
+
const content = readFileSync(join(absBase, '.claude-plugin', 'marketplace.json'), 'utf-8');
|
|
41
|
+
const manifest = JSON.parse(content);
|
|
42
|
+
const pluginRoot = manifest.metadata?.pluginRoot;
|
|
43
|
+
const validPluginRoot = pluginRoot === undefined || isValidRelativePath(pluginRoot);
|
|
44
|
+
if (validPluginRoot) {
|
|
45
|
+
for (const plugin of manifest.plugins ?? []) {
|
|
46
|
+
if (typeof plugin.source !== 'string' && plugin.source !== undefined)
|
|
47
|
+
continue;
|
|
48
|
+
if (plugin.source !== undefined && !isValidRelativePath(plugin.source))
|
|
49
|
+
continue;
|
|
50
|
+
const pluginBase = join(absBase, pluginRoot ?? '', plugin.source ?? '');
|
|
51
|
+
if (!isContainedIn(pluginBase, absBase))
|
|
52
|
+
continue;
|
|
53
|
+
if (plugin.skills?.length) {
|
|
54
|
+
for (const sp of plugin.skills) {
|
|
55
|
+
if (!isValidRelativePath(sp))
|
|
56
|
+
continue;
|
|
57
|
+
const skillDir = dirname(join(pluginBase, sp));
|
|
58
|
+
if (isContainedIn(skillDir, absBase)) {
|
|
59
|
+
addSkill(skillDir, plugin.name, 'claude-plugin');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Also scan skills/ subdirectory
|
|
64
|
+
scanSkillsDir(join(pluginBase, 'skills'), plugin.name, 'claude-plugin');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch { /* no marketplace.json */ }
|
|
69
|
+
// 2. Claude Code plugin.json
|
|
70
|
+
try {
|
|
71
|
+
const content = readFileSync(join(absBase, '.claude-plugin', 'plugin.json'), 'utf-8');
|
|
72
|
+
const manifest = JSON.parse(content);
|
|
73
|
+
if (manifest.skills?.length) {
|
|
74
|
+
for (const sp of manifest.skills) {
|
|
75
|
+
if (!isValidRelativePath(sp))
|
|
76
|
+
continue;
|
|
77
|
+
const skillDir = dirname(join(absBase, sp));
|
|
78
|
+
if (isContainedIn(skillDir, absBase)) {
|
|
79
|
+
addSkill(skillDir, manifest.name, 'claude-plugin');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
scanSkillsDir(join(absBase, 'skills'), manifest.name, 'claude-plugin');
|
|
84
|
+
}
|
|
85
|
+
catch { /* no plugin.json */ }
|
|
86
|
+
// 3. Cursor plugin.json
|
|
87
|
+
try {
|
|
88
|
+
const content = readFileSync(join(absBase, '.cursor-plugin', 'plugin.json'), 'utf-8');
|
|
89
|
+
const manifest = JSON.parse(content);
|
|
90
|
+
if (typeof manifest.skills === 'string') {
|
|
91
|
+
// Directory reference like "skills/"
|
|
92
|
+
scanSkillsDir(join(absBase, manifest.skills), manifest.name, 'cursor-plugin');
|
|
93
|
+
}
|
|
94
|
+
else if (Array.isArray(manifest.skills)) {
|
|
95
|
+
for (const sp of manifest.skills) {
|
|
96
|
+
const skillDir = dirname(join(absBase, sp));
|
|
97
|
+
if (isContainedIn(skillDir, absBase)) {
|
|
98
|
+
addSkill(skillDir, manifest.name, 'cursor-plugin');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
scanSkillsDir(join(absBase, 'skills'), manifest.name, 'cursor-plugin');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
catch { /* no cursor plugin.json */ }
|
|
107
|
+
// 4. Conventional directory scan (no manifests needed)
|
|
108
|
+
const conventionalDirs = [
|
|
109
|
+
'skills',
|
|
110
|
+
'.agents/skills',
|
|
111
|
+
'.claude/skills',
|
|
112
|
+
'.cursor/skills',
|
|
113
|
+
];
|
|
114
|
+
for (const dir of conventionalDirs) {
|
|
115
|
+
scanSkillsDir(join(absBase, dir), undefined, 'directory');
|
|
116
|
+
}
|
|
117
|
+
function scanSkillsDir(dir, pluginName, source) {
|
|
118
|
+
if (!existsSync(dir))
|
|
119
|
+
return;
|
|
120
|
+
if (!isContainedIn(dir, absBase))
|
|
121
|
+
return;
|
|
122
|
+
try {
|
|
123
|
+
const entries = readdirSync(dir, { withFileTypes: true });
|
|
124
|
+
for (const entry of entries) {
|
|
125
|
+
if (!entry.isDirectory())
|
|
126
|
+
continue;
|
|
127
|
+
const skillDir = join(dir, entry.name);
|
|
128
|
+
addSkill(skillDir, pluginName, source);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch { /* permission error or not a directory */ }
|
|
132
|
+
}
|
|
133
|
+
return skills;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Check whether a local path looks like it has plugin manifests or skill directories.
|
|
137
|
+
*/
|
|
138
|
+
export function hasPluginManifests(basePath) {
|
|
139
|
+
const abs = resolve(basePath);
|
|
140
|
+
return (existsSync(join(abs, '.claude-plugin', 'marketplace.json')) ||
|
|
141
|
+
existsSync(join(abs, '.claude-plugin', 'plugin.json')) ||
|
|
142
|
+
existsSync(join(abs, '.cursor-plugin', 'plugin.json')));
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=plugin-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-manifest.js","sourceRoot":"","sources":["../../src/lib/plugin-manifest.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import type { AgentType } from './lib/agent-registry.js';
|
|
2
|
+
export type { AgentType } from './lib/agent-registry.js';
|
|
3
|
+
export { AGENT_IDS } from './lib/agent-registry.js';
|
|
1
4
|
export interface CLISkill {
|
|
2
5
|
id: string;
|
|
3
6
|
slug: string;
|
|
@@ -28,7 +31,6 @@ export interface SearchResponse {
|
|
|
28
31
|
total: number;
|
|
29
32
|
results: CLISkill[];
|
|
30
33
|
}
|
|
31
|
-
export type AgentType = 'claude-code' | 'cursor' | 'windsurf';
|
|
32
34
|
export type InstallScope = 'local' | 'global';
|
|
33
35
|
export interface InstalledSkill {
|
|
34
36
|
slug: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,YAAY,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CACxC"}
|
package/dist/types.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {};
|
|
1
|
+
export { AGENT_IDS } from './lib/agent-registry.js';
|
|
2
2
|
//# sourceMappingURL=types.js.map
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { AGENT_PATHS } from '../lib/agent-registry.js';
|
|
1
2
|
export declare const API_BASE_URL: string;
|
|
2
3
|
export declare const SKIP_PROMPTS: boolean;
|
|
3
4
|
export declare const NO_ANALYTICS: boolean;
|
|
@@ -7,18 +8,4 @@ export declare const GLOBAL_DIR: string;
|
|
|
7
8
|
export declare const GLOBAL_LOCK: string;
|
|
8
9
|
export declare const LOCAL_LOCK = ".skillsauth-lock.json";
|
|
9
10
|
export declare const LOCKFILE_VERSION = 1;
|
|
10
|
-
export declare const AGENT_PATHS: {
|
|
11
|
-
readonly 'claude-code': {
|
|
12
|
-
readonly local: (slug: string) => string;
|
|
13
|
-
readonly global: (slug: string) => string;
|
|
14
|
-
};
|
|
15
|
-
readonly cursor: {
|
|
16
|
-
readonly local: (slug: string) => string;
|
|
17
|
-
readonly global: (slug: string) => string;
|
|
18
|
-
};
|
|
19
|
-
readonly windsurf: {
|
|
20
|
-
readonly local: (slug: string) => string;
|
|
21
|
-
readonly global: (slug: string) => string;
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
11
|
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,eAAO,MAAM,YAAY,QAAwE,CAAC;AAClG,eAAO,MAAM,YAAY,SAA2C,CAAC;AACrE,eAAO,MAAM,YAAY,SAAoD,CAAC;AAC9E,eAAO,MAAM,KAAK,SAA6C,CAAC;AAChE,eAAO,MAAM,QAAQ,QAAY,CAAC;AAClC,eAAO,MAAM,UAAU,QAAgC,CAAC;AACxD,eAAO,MAAM,WAAW,QAAgC,CAAC;AACzD,eAAO,MAAM,UAAU,0BAA0B,CAAC;AAClD,eAAO,MAAM,gBAAgB,IAAI,CAAC"}
|
package/dist/utils/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { homedir } from 'os';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
-
|
|
3
|
+
export { AGENT_PATHS } from '../lib/agent-registry.js';
|
|
4
4
|
export const API_BASE_URL = process.env['SKILLSAUTH_API_URL'] ?? 'https://skillsauth.com/api/cli';
|
|
5
5
|
export const SKIP_PROMPTS = process.env['SKILLSAUTH_YES'] === 'true';
|
|
6
6
|
export const NO_ANALYTICS = process.env['SKILLSAUTH_NO_ANALYTICS'] === 'true';
|
|
@@ -10,18 +10,4 @@ export const GLOBAL_DIR = join(HOME_DIR, '.skillsauth');
|
|
|
10
10
|
export const GLOBAL_LOCK = join(GLOBAL_DIR, 'lock.json');
|
|
11
11
|
export const LOCAL_LOCK = '.skillsauth-lock.json';
|
|
12
12
|
export const LOCKFILE_VERSION = 1;
|
|
13
|
-
export const AGENT_PATHS = {
|
|
14
|
-
'claude-code': {
|
|
15
|
-
local: (slug) => `.claude/skills/${slug}/SKILL.md`,
|
|
16
|
-
global: (slug) => join(HOME_DIR, `.claude/skills/${slug}/SKILL.md`),
|
|
17
|
-
},
|
|
18
|
-
'cursor': {
|
|
19
|
-
local: (slug) => `.cursor/skills/${slug}/SKILL.md`,
|
|
20
|
-
global: (slug) => join(HOME_DIR, `.cursor/skills/${slug}/SKILL.md`),
|
|
21
|
-
},
|
|
22
|
-
'windsurf': {
|
|
23
|
-
local: (slug) => `.windsurf/memories/${slug}.md`,
|
|
24
|
-
global: (slug) => join(HOME_DIR, `.windsurf/memories/${slug}.md`),
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
13
|
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,gCAAgC,CAAC;AAClG,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,MAAM,CAAC;AACrE,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,KAAK,MAAM,CAAC;AAC9E,MAAM,CAAC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,MAAM,CAAC;AAChE,MAAM,CAAC,MAAM,QAAQ,GAAG,OAAO,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACxD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,UAAU,GAAG,uBAAuB,CAAC;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG5D,eAAO,MAAM,UAAU,GAAI,GAAG,MAAM,KAAG,IAAuD,CAAC;AAC/F,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,IAA4C,CAAC;AACtF,eAAO,MAAM,YAAY,GAAI,GAAG,MAAM,KAAG,IAA6C,CAAC;AACvF,eAAO,MAAM,SAAS,QAAO,IAAqD,CAAC;AAEnF,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAW3D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAKzD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAQhD"}
|
package/dist/utils/display.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
|
+
import { getDisplayName } from '../lib/agents.js';
|
|
2
3
|
export const printError = (m) => console.error(chalk.red(' ✗ ') + chalk.red(m));
|
|
3
4
|
export const printSuccess = (m) => console.log(chalk.green(' ✓ ') + m);
|
|
4
5
|
export const printWarning = (m) => console.log(chalk.yellow(' ⚠ ') + m);
|
|
@@ -13,12 +14,7 @@ export function printSkillRow(s, i) {
|
|
|
13
14
|
}
|
|
14
15
|
export function printInstalledRow(s) {
|
|
15
16
|
const name = chalk.white.bold(s.slug.padEnd(36));
|
|
16
|
-
const
|
|
17
|
-
'claude-code': 'Claude',
|
|
18
|
-
cursor: 'Cursor',
|
|
19
|
-
windsurf: 'Windsurf',
|
|
20
|
-
};
|
|
21
|
-
const agents = s.agents.map((a) => chalk.cyan(agentLabels[a] ?? a)).join(', ');
|
|
17
|
+
const agents = s.agents.map((a) => chalk.cyan(getDisplayName(a))).join(', ');
|
|
22
18
|
const version = chalk.dim(`v${s.version}`);
|
|
23
19
|
console.log(` ${name} ${version} ${agents}`);
|
|
24
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Slugs from the API use lowercase letters, digits, and hyphens only. */
|
|
2
|
+
export declare const SKILL_SLUG_PATTERN: RegExp;
|
|
3
|
+
/** Hierarchical URL slugs: owner/skillName (both segments match SKILL_SLUG_PATTERN). */
|
|
4
|
+
export declare const HIERARCHICAL_SLUG_PATTERN: RegExp;
|
|
5
|
+
export declare function isSafeSkillSlug(slug: string): boolean;
|
|
6
|
+
//# sourceMappingURL=slug.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,eAAO,MAAM,kBAAkB,QAA+B,CAAC;AAE/D,wFAAwF;AACxF,eAAO,MAAM,yBAAyB,QAAyD,CAAC;AAEhG,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAErD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Slugs from the API use lowercase letters, digits, and hyphens only. */
|
|
2
|
+
export const SKILL_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
3
|
+
/** Hierarchical URL slugs: owner/skillName (both segments match SKILL_SLUG_PATTERN). */
|
|
4
|
+
export const HIERARCHICAL_SLUG_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*\/[a-z0-9]+(?:-[a-z0-9]+)*$/;
|
|
5
|
+
export function isSafeSkillSlug(slug) {
|
|
6
|
+
return SKILL_SLUG_PATTERN.test(slug) || HIERARCHICAL_SLUG_PATTERN.test(slug);
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=slug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slug.js","sourceRoot":"","sources":["../../src/utils/slug.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,MAAM,CAAC,MAAM,kBAAkB,GAAG,4BAA4B,CAAC;AAE/D,wFAAwF;AACxF,MAAM,CAAC,MAAM,yBAAyB,GAAG,sDAAsD,CAAC;AAEhG,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC/E,CAAC"}
|