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.
Files changed (87) hide show
  1. package/README.md +256 -79
  2. package/dist/__tests__/agents.test.d.ts +2 -0
  3. package/dist/__tests__/agents.test.d.ts.map +1 -0
  4. package/dist/__tests__/agents.test.js +48 -0
  5. package/dist/__tests__/agents.test.js.map +1 -0
  6. package/dist/__tests__/installer.test.d.ts +2 -0
  7. package/dist/__tests__/installer.test.d.ts.map +1 -0
  8. package/dist/__tests__/installer.test.js +126 -0
  9. package/dist/__tests__/installer.test.js.map +1 -0
  10. package/dist/__tests__/lockfile.test.d.ts +2 -0
  11. package/dist/__tests__/lockfile.test.d.ts.map +1 -0
  12. package/dist/__tests__/lockfile.test.js +76 -0
  13. package/dist/__tests__/lockfile.test.js.map +1 -0
  14. package/dist/__tests__/plugin-manifest.test.d.ts +2 -0
  15. package/dist/__tests__/plugin-manifest.test.d.ts.map +1 -0
  16. package/dist/__tests__/plugin-manifest.test.js +150 -0
  17. package/dist/__tests__/plugin-manifest.test.js.map +1 -0
  18. package/dist/__tests__/slug.test.d.ts +2 -0
  19. package/dist/__tests__/slug.test.d.ts.map +1 -0
  20. package/dist/__tests__/slug.test.js +34 -0
  21. package/dist/__tests__/slug.test.js.map +1 -0
  22. package/dist/commands/add-local.d.ts +14 -0
  23. package/dist/commands/add-local.d.ts.map +1 -0
  24. package/dist/commands/add-local.js +234 -0
  25. package/dist/commands/add-local.js.map +1 -0
  26. package/dist/commands/add.d.ts +7 -2
  27. package/dist/commands/add.d.ts.map +1 -1
  28. package/dist/commands/add.js +69 -33
  29. package/dist/commands/add.js.map +1 -1
  30. package/dist/commands/check.d.ts +7 -0
  31. package/dist/commands/check.d.ts.map +1 -0
  32. package/dist/commands/check.js +57 -0
  33. package/dist/commands/check.js.map +1 -0
  34. package/dist/commands/find.d.ts +7 -0
  35. package/dist/commands/find.d.ts.map +1 -0
  36. package/dist/commands/find.js +60 -0
  37. package/dist/commands/find.js.map +1 -0
  38. package/dist/commands/init.d.ts +7 -0
  39. package/dist/commands/init.d.ts.map +1 -0
  40. package/dist/commands/init.js +146 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/installed.d.ts +1 -0
  43. package/dist/commands/installed.d.ts.map +1 -1
  44. package/dist/commands/installed.js +4 -0
  45. package/dist/commands/installed.js.map +1 -1
  46. package/dist/commands/plugins.d.ts +8 -0
  47. package/dist/commands/plugins.d.ts.map +1 -0
  48. package/dist/commands/plugins.js +96 -0
  49. package/dist/commands/plugins.js.map +1 -0
  50. package/dist/commands/remove.d.ts.map +1 -1
  51. package/dist/commands/remove.js +5 -0
  52. package/dist/commands/remove.js.map +1 -1
  53. package/dist/index.js +91 -12
  54. package/dist/index.js.map +1 -1
  55. package/dist/lib/agent-registry.d.ts +19 -0
  56. package/dist/lib/agent-registry.d.ts.map +1 -0
  57. package/dist/lib/agent-registry.js +408 -0
  58. package/dist/lib/agent-registry.js.map +1 -0
  59. package/dist/lib/agents.d.ts +9 -1
  60. package/dist/lib/agents.d.ts.map +1 -1
  61. package/dist/lib/agents.js +19 -10
  62. package/dist/lib/agents.js.map +1 -1
  63. package/dist/lib/api.js +2 -2
  64. package/dist/lib/installer.d.ts +12 -1
  65. package/dist/lib/installer.d.ts.map +1 -1
  66. package/dist/lib/installer.js +159 -27
  67. package/dist/lib/installer.js.map +1 -1
  68. package/dist/lib/plugin-manifest.d.ts +21 -0
  69. package/dist/lib/plugin-manifest.d.ts.map +1 -0
  70. package/dist/lib/plugin-manifest.js +144 -0
  71. package/dist/lib/plugin-manifest.js.map +1 -0
  72. package/dist/types.d.ts +3 -1
  73. package/dist/types.d.ts.map +1 -1
  74. package/dist/types.js +1 -1
  75. package/dist/types.js.map +1 -1
  76. package/dist/utils/constants.d.ts +1 -14
  77. package/dist/utils/constants.d.ts.map +1 -1
  78. package/dist/utils/constants.js +1 -15
  79. package/dist/utils/constants.js.map +1 -1
  80. package/dist/utils/display.d.ts.map +1 -1
  81. package/dist/utils/display.js +2 -6
  82. package/dist/utils/display.js.map +1 -1
  83. package/dist/utils/slug.d.ts +6 -0
  84. package/dist/utils/slug.d.ts.map +1 -0
  85. package/dist/utils/slug.js +8 -0
  86. package/dist/utils/slug.js.map +1 -0
  87. package/package.json +59 -37
@@ -1,53 +1,185 @@
1
- import { writeFileSync, mkdirSync, existsSync, readFileSync, unlinkSync, readdirSync, rmdirSync } from 'fs';
2
- import { basename, dirname, join } from 'path';
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
- export function installSkill(skill, agents, scope, force = false) {
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 absPath = scope === 'local' ? join(process.cwd(), filePath) : filePath;
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 alreadyExists = existsSync(absPath);
15
- const content = skill.files[0]?.content ?? '';
16
- if (alreadyExists && !force && readFileSync(absPath, 'utf8') === content) {
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
- mkdirSync(dirname(absPath), { recursive: true });
20
- writeFileSync(absPath, content, 'utf8');
21
- const status = alreadyExists ? 'updated' : 'installed';
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
- const error = e;
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 abs = scope === 'local' ? join(process.cwd(), p) : p;
161
+ const skillBaseDir = scope === 'local' ? join(process.cwd(), dirname(p)) : dirname(p);
34
162
  try {
35
- unlinkSync(abs);
163
+ if (existsSync(skillBaseDir)) {
164
+ rmSync(skillBaseDir, { recursive: true, force: true });
165
+ }
36
166
  }
37
167
  catch {
38
- // File may not exist, that's fine
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,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC5G,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AASpD,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAgB,EAAE,KAAmB;IAChF,OAAO,KAAK,KAAK,QAAQ;QACvB,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QACjC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAAe,EACf,MAAmB,EACnB,KAAmB,EACnB,KAAK,GAAG,KAAK;IAEb,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1B,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE7E,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC;YAE9C,IAAI,aAAa,IAAI,CAAC,KAAK,IAAI,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,OAAO,EAAE,CAAC;gBACzE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAC;YAC/D,CAAC;YAED,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACjD,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAExC,MAAM,MAAM,GAA4B,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;YAChF,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QAC3C,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,CAAU,CAAC;YACzB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAgB,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QACnF,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAmB,EAAE,KAAmB;IACnF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACvB,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC;YACH,UAAU,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;QACD,8DAA8D;QAC9D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS,CAAC,GAAG,CAAC,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACP,0CAA0C;YAC5C,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
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;
@@ -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,SAAS,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,CAAC;AAC9D,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"}
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":"AAIA,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;AAElC,eAAO,MAAM,WAAW;;+BAEN,MAAM;gCACL,MAAM;;;+BAGP,MAAM;gCACL,MAAM;;;+BAGP,MAAM;gCACL,MAAM;;CAEf,CAAC"}
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"}
@@ -1,6 +1,6 @@
1
1
  import { homedir } from 'os';
2
2
  import { join } from 'path';
3
- // Production default: https://skillsauth.com/api/cli; override with SKILLSAUTH_API_URL (e.g. http://localhost:3000/api/cli for dev).
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,qIAAqI;AACrI,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;AAElC,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,aAAa,EAAE;QACb,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,kBAAkB,IAAI,WAAW;QAC1D,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,IAAI,WAAW,CAAC;KAC5E;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,kBAAkB,IAAI,WAAW;QAC1D,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,IAAI,WAAW,CAAC;KAC5E;IACD,UAAU,EAAE;QACV,KAAK,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,sBAAsB,IAAI,KAAK;QACxD,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,sBAAsB,IAAI,KAAK,CAAC;KAC1E;CACO,CAAC"}
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;AAE5D,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,CAUzD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAQhD"}
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"}
@@ -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 agentLabels = {
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":"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"}
1
+ {"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/utils/display.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAS,EAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAS,EAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAS,EAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACvF,MAAM,CAAC,MAAM,SAAS,GAAG,GAAS,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAEnF,MAAM,UAAU,aAAa,CAAC,CAAW,EAAE,CAAU;IACnD,MAAM,GAAG,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CACpB,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAC1F,CAAC;IACF,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CACxB,IAAI,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CACzE,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAiB;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,OAAO,MAAM,MAAM,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,CAAW;IACxC,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;IACnF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,GAAG,CAAC,iBAAiB,IAAI,EAAE,CAAC;QAChC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC;QAC1B,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC;QACzB,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAC/B,CAAC;AACJ,CAAC"}
@@ -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"}