uasp-skills 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/bin/skills.js +6 -0
- package/dist/cli/commands/add.d.ts +6 -0
- package/dist/cli/commands/add.d.ts.map +1 -0
- package/dist/cli/commands/add.js +81 -0
- package/dist/cli/commands/add.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +28 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/list.d.ts +6 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +39 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/remove.d.ts +6 -0
- package/dist/cli/commands/remove.d.ts.map +1 -0
- package/dist/cli/commands/remove.js +44 -0
- package/dist/cli/commands/remove.js.map +1 -0
- package/dist/cli/commands/search.d.ts +6 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +46 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +26 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/github.d.ts +39 -0
- package/dist/core/github.d.ts.map +1 -0
- package/dist/core/github.js +91 -0
- package/dist/core/github.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/installer.d.ts +88 -0
- package/dist/core/installer.d.ts.map +1 -0
- package/dist/core/installer.js +493 -0
- package/dist/core/installer.js.map +1 -0
- package/dist/core/registry.d.ts +26 -0
- package/dist/core/registry.d.ts.map +1 -0
- package/dist/core/registry.js +69 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/validator.d.ts +17 -0
- package/dist/core/validator.d.ts.map +1 -0
- package/dist/core/validator.js +318 -0
- package/dist/core/validator.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/registry.d.ts +43 -0
- package/dist/types/registry.d.ts.map +1 -0
- package/dist/types/registry.js +5 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/types/skill.d.ts +128 -0
- package/dist/types/skill.d.ts.map +1 -0
- package/dist/types/skill.js +6 -0
- package/dist/types/skill.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill installation management
|
|
3
|
+
*/
|
|
4
|
+
import fs from 'fs-extra';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import os from 'os';
|
|
7
|
+
import yaml from 'yaml';
|
|
8
|
+
import { fetchSkillFile } from './github.js';
|
|
9
|
+
import { validateSkill } from './validator.js';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Directory Paths
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Get the .agent directory path (project-local, new format)
|
|
15
|
+
*/
|
|
16
|
+
export function getAgentDir(projectDir = process.cwd()) {
|
|
17
|
+
return path.join(projectDir, '.agent');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get the ~/.agents directory path (Claude Code global skills)
|
|
21
|
+
*/
|
|
22
|
+
export function getClaudeAgentsDir() {
|
|
23
|
+
return path.join(os.homedir(), '.agents');
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the ~/.agents/skills directory path
|
|
27
|
+
*/
|
|
28
|
+
export function getClaudeSkillsDir() {
|
|
29
|
+
return path.join(getClaudeAgentsDir(), 'skills');
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get the ~/.claude directory path
|
|
33
|
+
*/
|
|
34
|
+
export function getClaudeDir() {
|
|
35
|
+
return path.join(os.homedir(), '.claude');
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the ~/.claude/skills directory path (symlinks)
|
|
39
|
+
*/
|
|
40
|
+
export function getClaudeSymlinksDir() {
|
|
41
|
+
return path.join(getClaudeDir(), 'skills');
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get the ~/.agents/.skill-lock.json path
|
|
45
|
+
*/
|
|
46
|
+
export function getClaudeLockFilePath() {
|
|
47
|
+
return path.join(getClaudeAgentsDir(), '.skill-lock.json');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get the skills directory within .agent
|
|
51
|
+
*/
|
|
52
|
+
export function getSkillsDir(projectDir = process.cwd()) {
|
|
53
|
+
return path.join(getAgentDir(projectDir), 'skills');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Load or create Claude Code lock file
|
|
57
|
+
*/
|
|
58
|
+
async function loadClaudeLockFile() {
|
|
59
|
+
const lockPath = getClaudeLockFilePath();
|
|
60
|
+
if (await fs.pathExists(lockPath)) {
|
|
61
|
+
const content = await fs.readFile(lockPath, 'utf-8');
|
|
62
|
+
return JSON.parse(content);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
version: 3,
|
|
66
|
+
skills: {},
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Save Claude Code lock file
|
|
71
|
+
*/
|
|
72
|
+
async function saveClaudeLockFile(lockFile) {
|
|
73
|
+
const lockPath = getClaudeLockFilePath();
|
|
74
|
+
await fs.ensureDir(path.dirname(lockPath));
|
|
75
|
+
await fs.writeFile(lockPath, JSON.stringify(lockFile, null, 2));
|
|
76
|
+
}
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// UASP to SKILL.md Conversion
|
|
79
|
+
// ============================================================================
|
|
80
|
+
/**
|
|
81
|
+
* Convert a UASP skill to Claude Code SKILL.md format
|
|
82
|
+
*/
|
|
83
|
+
export function convertToSkillMd(skill, registrySkill) {
|
|
84
|
+
const lines = [];
|
|
85
|
+
// Frontmatter
|
|
86
|
+
lines.push('---');
|
|
87
|
+
lines.push(`name: ${skill.meta.name}`);
|
|
88
|
+
lines.push(`description: ${skill.meta.description || registrySkill.description}`);
|
|
89
|
+
// Add allowed-tools for CLI skills
|
|
90
|
+
if (skill.meta.type === 'cli' && skill.commands) {
|
|
91
|
+
lines.push(`allowed-tools: Bash(${skill.meta.name}:*)`);
|
|
92
|
+
}
|
|
93
|
+
lines.push('metadata:');
|
|
94
|
+
lines.push(` version: "${skill.meta.version}"`);
|
|
95
|
+
lines.push(` type: ${skill.meta.type}`);
|
|
96
|
+
lines.push(` format: uasp`);
|
|
97
|
+
lines.push('---');
|
|
98
|
+
lines.push('');
|
|
99
|
+
// Title
|
|
100
|
+
const title = skill.meta.name
|
|
101
|
+
.split('-')
|
|
102
|
+
.map((w) => w.charAt(0).toUpperCase() + w.slice(1))
|
|
103
|
+
.join(' ');
|
|
104
|
+
lines.push(`# ${title}`);
|
|
105
|
+
lines.push('');
|
|
106
|
+
lines.push(skill.meta.description || registrySkill.description);
|
|
107
|
+
lines.push('');
|
|
108
|
+
// Triggers/Keywords
|
|
109
|
+
if (skill.triggers) {
|
|
110
|
+
if (skill.triggers.keywords?.length) {
|
|
111
|
+
lines.push('## Keywords');
|
|
112
|
+
lines.push('');
|
|
113
|
+
lines.push(skill.triggers.keywords.join(', '));
|
|
114
|
+
lines.push('');
|
|
115
|
+
}
|
|
116
|
+
if (skill.triggers.intents?.length) {
|
|
117
|
+
lines.push('## Intents');
|
|
118
|
+
lines.push('');
|
|
119
|
+
skill.triggers.intents.forEach((intent) => lines.push(`- ${intent}`));
|
|
120
|
+
lines.push('');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Constraints
|
|
124
|
+
if (skill.constraints) {
|
|
125
|
+
lines.push('## Constraints');
|
|
126
|
+
lines.push('');
|
|
127
|
+
if (skill.constraints.never?.length) {
|
|
128
|
+
lines.push('### Never');
|
|
129
|
+
lines.push('');
|
|
130
|
+
skill.constraints.never.forEach((c) => lines.push(`- ${c}`));
|
|
131
|
+
lines.push('');
|
|
132
|
+
}
|
|
133
|
+
if (skill.constraints.always?.length) {
|
|
134
|
+
lines.push('### Always');
|
|
135
|
+
lines.push('');
|
|
136
|
+
skill.constraints.always.forEach((c) => lines.push(`- ${c}`));
|
|
137
|
+
lines.push('');
|
|
138
|
+
}
|
|
139
|
+
if (skill.constraints.prefer?.length) {
|
|
140
|
+
lines.push('### Preferences');
|
|
141
|
+
lines.push('');
|
|
142
|
+
skill.constraints.prefer.forEach((p) => {
|
|
143
|
+
const when = p.when ? ` when ${p.when}` : '';
|
|
144
|
+
lines.push(`- Prefer **${p.use}** over ${p.over}${when}`);
|
|
145
|
+
});
|
|
146
|
+
lines.push('');
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Decisions
|
|
150
|
+
if (skill.decisions?.length) {
|
|
151
|
+
lines.push('## Decisions');
|
|
152
|
+
lines.push('');
|
|
153
|
+
skill.decisions.forEach((d) => {
|
|
154
|
+
lines.push(`- **When** ${d.when}: ${d.then}`);
|
|
155
|
+
});
|
|
156
|
+
lines.push('');
|
|
157
|
+
}
|
|
158
|
+
// Commands (for CLI skills)
|
|
159
|
+
if (skill.commands && Object.keys(skill.commands).length > 0) {
|
|
160
|
+
lines.push('## Commands');
|
|
161
|
+
lines.push('');
|
|
162
|
+
for (const [cmdName, cmd] of Object.entries(skill.commands)) {
|
|
163
|
+
lines.push(`### ${cmdName}`);
|
|
164
|
+
lines.push('');
|
|
165
|
+
lines.push('```');
|
|
166
|
+
lines.push(cmd.syntax);
|
|
167
|
+
lines.push('```');
|
|
168
|
+
lines.push('');
|
|
169
|
+
if (cmd.description) {
|
|
170
|
+
lines.push(cmd.description);
|
|
171
|
+
lines.push('');
|
|
172
|
+
}
|
|
173
|
+
if (cmd.args?.length) {
|
|
174
|
+
lines.push('**Arguments:**');
|
|
175
|
+
cmd.args.forEach((arg) => {
|
|
176
|
+
const req = arg.required ? ' (required)' : '';
|
|
177
|
+
const desc = arg.description ? ` - ${arg.description}` : '';
|
|
178
|
+
lines.push(`- \`${arg.name}\`: ${arg.type}${req}${desc}`);
|
|
179
|
+
});
|
|
180
|
+
lines.push('');
|
|
181
|
+
}
|
|
182
|
+
if (cmd.flags?.length) {
|
|
183
|
+
lines.push('**Flags:**');
|
|
184
|
+
cmd.flags.forEach((flag) => {
|
|
185
|
+
const short = flag.short ? `${flag.short}, ` : '';
|
|
186
|
+
lines.push(`- \`${short}${flag.name}\`: ${flag.purpose || flag.type}`);
|
|
187
|
+
});
|
|
188
|
+
lines.push('');
|
|
189
|
+
}
|
|
190
|
+
if (cmd.note) {
|
|
191
|
+
lines.push(`> ${cmd.note}`);
|
|
192
|
+
lines.push('');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Workflows
|
|
197
|
+
if (skill.workflows && Object.keys(skill.workflows).length > 0) {
|
|
198
|
+
lines.push('## Workflows');
|
|
199
|
+
lines.push('');
|
|
200
|
+
for (const [wfName, wf] of Object.entries(skill.workflows)) {
|
|
201
|
+
lines.push(`### ${wfName}`);
|
|
202
|
+
lines.push('');
|
|
203
|
+
lines.push(wf.description);
|
|
204
|
+
lines.push('');
|
|
205
|
+
if (wf.steps?.length) {
|
|
206
|
+
lines.push('**Steps:**');
|
|
207
|
+
wf.steps.forEach((step, i) => {
|
|
208
|
+
const note = step.note ? ` - ${step.note}` : '';
|
|
209
|
+
lines.push(`${i + 1}. \`${step.cmd}\`${note}`);
|
|
210
|
+
});
|
|
211
|
+
lines.push('');
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Sources
|
|
216
|
+
if (skill.sources?.length) {
|
|
217
|
+
lines.push('## References');
|
|
218
|
+
lines.push('');
|
|
219
|
+
skill.sources.forEach((src) => {
|
|
220
|
+
if (src.url) {
|
|
221
|
+
lines.push(`- [${src.id}](${src.url}) - ${src.use_for}`);
|
|
222
|
+
}
|
|
223
|
+
else if (src.path) {
|
|
224
|
+
lines.push(`- ${src.id}: ${src.path} - ${src.use_for}`);
|
|
225
|
+
}
|
|
226
|
+
});
|
|
227
|
+
lines.push('');
|
|
228
|
+
}
|
|
229
|
+
// Footer
|
|
230
|
+
lines.push('---');
|
|
231
|
+
lines.push('');
|
|
232
|
+
lines.push(`*Converted from UASP format (${skill.meta.type} skill)*`);
|
|
233
|
+
return lines.join('\n');
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get the settings.json path
|
|
237
|
+
*/
|
|
238
|
+
export function getSettingsPath(projectDir = process.cwd()) {
|
|
239
|
+
return path.join(getAgentDir(projectDir), 'settings.json');
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Load or create settings.json
|
|
243
|
+
*/
|
|
244
|
+
export async function loadSettings(projectDir = process.cwd()) {
|
|
245
|
+
const settingsPath = getSettingsPath(projectDir);
|
|
246
|
+
if (await fs.pathExists(settingsPath)) {
|
|
247
|
+
const content = await fs.readFile(settingsPath, 'utf-8');
|
|
248
|
+
return JSON.parse(content);
|
|
249
|
+
}
|
|
250
|
+
// Return default config
|
|
251
|
+
return {
|
|
252
|
+
version: '1.0.0',
|
|
253
|
+
skills: {
|
|
254
|
+
installed: [],
|
|
255
|
+
},
|
|
256
|
+
triggers: {
|
|
257
|
+
keywords: {},
|
|
258
|
+
filePatterns: {},
|
|
259
|
+
},
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Save settings.json
|
|
264
|
+
*/
|
|
265
|
+
export async function saveSettings(config, projectDir = process.cwd()) {
|
|
266
|
+
const settingsPath = getSettingsPath(projectDir);
|
|
267
|
+
await fs.ensureDir(path.dirname(settingsPath));
|
|
268
|
+
await fs.writeFile(settingsPath, JSON.stringify(config, null, 2));
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Initialize .agent directory structure
|
|
272
|
+
*/
|
|
273
|
+
export async function initAgentDir(projectDir = process.cwd()) {
|
|
274
|
+
const agentDir = getAgentDir(projectDir);
|
|
275
|
+
const skillsDir = getSkillsDir(projectDir);
|
|
276
|
+
await fs.ensureDir(agentDir);
|
|
277
|
+
await fs.ensureDir(skillsDir);
|
|
278
|
+
// Create settings.json if it doesn't exist
|
|
279
|
+
const settingsPath = getSettingsPath(projectDir);
|
|
280
|
+
if (!(await fs.pathExists(settingsPath))) {
|
|
281
|
+
await saveSettings({
|
|
282
|
+
version: '1.0.0',
|
|
283
|
+
skills: { installed: [] },
|
|
284
|
+
triggers: { keywords: {}, filePatterns: {} },
|
|
285
|
+
}, projectDir);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// ============================================================================
|
|
289
|
+
// Claude Code Installation
|
|
290
|
+
// ============================================================================
|
|
291
|
+
/**
|
|
292
|
+
* Install a skill to Claude Code directories (~/.agents/skills/)
|
|
293
|
+
*/
|
|
294
|
+
async function installToClaudeCode(skillName, skillMdContent, source, registrySkill) {
|
|
295
|
+
// Ensure directories exist
|
|
296
|
+
const skillDir = path.join(getClaudeSkillsDir(), skillName);
|
|
297
|
+
await fs.ensureDir(skillDir);
|
|
298
|
+
await fs.ensureDir(getClaudeSymlinksDir());
|
|
299
|
+
// Write SKILL.md
|
|
300
|
+
const skillMdPath = path.join(skillDir, 'SKILL.md');
|
|
301
|
+
await fs.writeFile(skillMdPath, skillMdContent);
|
|
302
|
+
// Create symlink in ~/.claude/skills/
|
|
303
|
+
const symlinkPath = path.join(getClaudeSymlinksDir(), skillName);
|
|
304
|
+
try {
|
|
305
|
+
// Remove existing symlink if present
|
|
306
|
+
if (await fs.pathExists(symlinkPath)) {
|
|
307
|
+
await fs.remove(symlinkPath);
|
|
308
|
+
}
|
|
309
|
+
await fs.symlink(skillDir, symlinkPath);
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
// Symlink creation might fail on some systems, continue anyway
|
|
313
|
+
}
|
|
314
|
+
// Update lock file
|
|
315
|
+
const lockFile = await loadClaudeLockFile();
|
|
316
|
+
const sourceUrl = source.isLocal
|
|
317
|
+
? `file://${source.localPath}`
|
|
318
|
+
: `https://github.com/${source.owner}/${source.repo}.git`;
|
|
319
|
+
lockFile.skills[skillName] = {
|
|
320
|
+
source: source.isLocal ? 'local' : `${source.owner}/${source.repo}`,
|
|
321
|
+
sourceType: source.isLocal ? 'local' : 'uasp',
|
|
322
|
+
sourceUrl,
|
|
323
|
+
skillPath: `skills/${skillName}/SKILL.md`,
|
|
324
|
+
skillFolderHash: registrySkill.version,
|
|
325
|
+
installedAt: new Date().toISOString(),
|
|
326
|
+
updatedAt: new Date().toISOString(),
|
|
327
|
+
};
|
|
328
|
+
await saveClaudeLockFile(lockFile);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Remove a skill from Claude Code directories
|
|
332
|
+
*/
|
|
333
|
+
async function removeFromClaudeCode(skillName) {
|
|
334
|
+
// Remove skill directory
|
|
335
|
+
const skillDir = path.join(getClaudeSkillsDir(), skillName);
|
|
336
|
+
if (await fs.pathExists(skillDir)) {
|
|
337
|
+
await fs.remove(skillDir);
|
|
338
|
+
}
|
|
339
|
+
// Remove symlink
|
|
340
|
+
const symlinkPath = path.join(getClaudeSymlinksDir(), skillName);
|
|
341
|
+
if (await fs.pathExists(symlinkPath)) {
|
|
342
|
+
await fs.remove(symlinkPath);
|
|
343
|
+
}
|
|
344
|
+
// Update lock file
|
|
345
|
+
const lockFile = await loadClaudeLockFile();
|
|
346
|
+
delete lockFile.skills[skillName];
|
|
347
|
+
await saveClaudeLockFile(lockFile);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Install a skill from a GitHub registry
|
|
351
|
+
*
|
|
352
|
+
* Installs to:
|
|
353
|
+
* 1. .agent/skills/ (project-local, UASP format)
|
|
354
|
+
* 2. ~/.agents/skills/ (Claude Code compatible, SKILL.md format) - if claudeCode option is true
|
|
355
|
+
*/
|
|
356
|
+
export async function installSkill(source, registrySkill, options = {}) {
|
|
357
|
+
const { projectDir = process.cwd(), claudeCode = true } = options;
|
|
358
|
+
try {
|
|
359
|
+
// Fetch the skill file
|
|
360
|
+
const content = await fetchSkillFile(source, registrySkill.path);
|
|
361
|
+
// Parse and validate
|
|
362
|
+
const skillData = yaml.parse(content);
|
|
363
|
+
const validation = validateSkill(skillData);
|
|
364
|
+
if (!validation.valid) {
|
|
365
|
+
return {
|
|
366
|
+
success: false,
|
|
367
|
+
error: `Validation failed: ${validation.errors.join(', ')}`,
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
// ========================================
|
|
371
|
+
// 1. Install to .agent/skills/ (UASP format)
|
|
372
|
+
// ========================================
|
|
373
|
+
await initAgentDir(projectDir);
|
|
374
|
+
// Create skill directory
|
|
375
|
+
const skillDir = path.join(getSkillsDir(projectDir), registrySkill.name);
|
|
376
|
+
await fs.ensureDir(skillDir);
|
|
377
|
+
// Write skill file
|
|
378
|
+
const skillFileName = `${registrySkill.name}.uasp.yaml`;
|
|
379
|
+
const skillPath = path.join(skillDir, skillFileName);
|
|
380
|
+
await fs.writeFile(skillPath, content);
|
|
381
|
+
// Update settings.json
|
|
382
|
+
const settings = await loadSettings(projectDir);
|
|
383
|
+
// Remove existing entry if present
|
|
384
|
+
settings.skills.installed = settings.skills.installed.filter((s) => s.name !== registrySkill.name);
|
|
385
|
+
// Add new entry
|
|
386
|
+
const installedSkill = {
|
|
387
|
+
name: registrySkill.name,
|
|
388
|
+
version: registrySkill.version,
|
|
389
|
+
type: registrySkill.type,
|
|
390
|
+
path: `.agent/skills/${registrySkill.name}/${skillFileName}`,
|
|
391
|
+
enabled: true,
|
|
392
|
+
installedAt: new Date().toISOString(),
|
|
393
|
+
source: `${source.owner}/${source.repo}/${source.path}`,
|
|
394
|
+
};
|
|
395
|
+
settings.skills.installed.push(installedSkill);
|
|
396
|
+
// Update keyword triggers
|
|
397
|
+
if (!settings.triggers) {
|
|
398
|
+
settings.triggers = { keywords: {}, filePatterns: {} };
|
|
399
|
+
}
|
|
400
|
+
if (!settings.triggers.keywords) {
|
|
401
|
+
settings.triggers.keywords = {};
|
|
402
|
+
}
|
|
403
|
+
for (const keyword of registrySkill.keywords) {
|
|
404
|
+
if (!settings.triggers.keywords[keyword]) {
|
|
405
|
+
settings.triggers.keywords[keyword] = [];
|
|
406
|
+
}
|
|
407
|
+
if (!settings.triggers.keywords[keyword].includes(registrySkill.name)) {
|
|
408
|
+
settings.triggers.keywords[keyword].push(registrySkill.name);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
await saveSettings(settings, projectDir);
|
|
412
|
+
// ========================================
|
|
413
|
+
// 2. Install to Claude Code (SKILL.md format)
|
|
414
|
+
// ========================================
|
|
415
|
+
let claudeCodeInstalled = false;
|
|
416
|
+
if (claudeCode) {
|
|
417
|
+
try {
|
|
418
|
+
// Convert to SKILL.md format
|
|
419
|
+
const skillMdContent = convertToSkillMd(skillData, registrySkill);
|
|
420
|
+
// Install to Claude Code directories
|
|
421
|
+
await installToClaudeCode(registrySkill.name, skillMdContent, source, registrySkill);
|
|
422
|
+
claudeCodeInstalled = true;
|
|
423
|
+
}
|
|
424
|
+
catch (error) {
|
|
425
|
+
// Claude Code installation is optional, don't fail the whole install
|
|
426
|
+
console.warn(`Warning: Could not install to Claude Code: ${error.message}`);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
return {
|
|
430
|
+
success: true,
|
|
431
|
+
skill: installedSkill,
|
|
432
|
+
claudeCodeInstalled,
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
catch (error) {
|
|
436
|
+
return {
|
|
437
|
+
success: false,
|
|
438
|
+
error: error instanceof Error ? error.message : String(error),
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Remove an installed skill
|
|
444
|
+
*
|
|
445
|
+
* Removes from:
|
|
446
|
+
* 1. .agent/skills/ (project-local)
|
|
447
|
+
* 2. ~/.agents/skills/ (Claude Code) - if claudeCode option is true
|
|
448
|
+
*/
|
|
449
|
+
export async function removeSkill(skillName, options = {}) {
|
|
450
|
+
const { projectDir = process.cwd(), claudeCode = true } = options;
|
|
451
|
+
const settings = await loadSettings(projectDir);
|
|
452
|
+
// Find the skill
|
|
453
|
+
const skillIndex = settings.skills.installed.findIndex((s) => s.name === skillName);
|
|
454
|
+
if (skillIndex === -1) {
|
|
455
|
+
return false;
|
|
456
|
+
}
|
|
457
|
+
// Remove from settings
|
|
458
|
+
settings.skills.installed.splice(skillIndex, 1);
|
|
459
|
+
// Remove from keyword triggers
|
|
460
|
+
if (settings.triggers?.keywords) {
|
|
461
|
+
for (const keyword of Object.keys(settings.triggers.keywords)) {
|
|
462
|
+
settings.triggers.keywords[keyword] = settings.triggers.keywords[keyword].filter((s) => s !== skillName);
|
|
463
|
+
// Clean up empty arrays
|
|
464
|
+
if (settings.triggers.keywords[keyword].length === 0) {
|
|
465
|
+
delete settings.triggers.keywords[keyword];
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
await saveSettings(settings, projectDir);
|
|
470
|
+
// Remove skill directory from .agent/skills/
|
|
471
|
+
const skillDir = path.join(getSkillsDir(projectDir), skillName);
|
|
472
|
+
if (await fs.pathExists(skillDir)) {
|
|
473
|
+
await fs.remove(skillDir);
|
|
474
|
+
}
|
|
475
|
+
// Remove from Claude Code directories
|
|
476
|
+
if (claudeCode) {
|
|
477
|
+
try {
|
|
478
|
+
await removeFromClaudeCode(skillName);
|
|
479
|
+
}
|
|
480
|
+
catch {
|
|
481
|
+
// Claude Code removal is optional
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
return true;
|
|
485
|
+
}
|
|
486
|
+
/**
|
|
487
|
+
* List installed skills
|
|
488
|
+
*/
|
|
489
|
+
export async function listInstalledSkills(projectDir = process.cwd()) {
|
|
490
|
+
const settings = await loadSettings(projectDir);
|
|
491
|
+
return settings.skills.installed;
|
|
492
|
+
}
|
|
493
|
+
//# sourceMappingURL=installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"installer.js","sourceRoot":"","sources":["../../src/core/installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry management for UASP skills
|
|
3
|
+
*/
|
|
4
|
+
import type { Registry, RegistrySkill } from '../types/index.js';
|
|
5
|
+
import { type GitHubSource } from './github.js';
|
|
6
|
+
/**
|
|
7
|
+
* Parse registry JSON content
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseRegistry(content: string): Registry;
|
|
10
|
+
/**
|
|
11
|
+
* Find a skill in the registry by name
|
|
12
|
+
*/
|
|
13
|
+
export declare function findSkill(registry: Registry, skillName: string): RegistrySkill | null;
|
|
14
|
+
/**
|
|
15
|
+
* Search skills by keyword
|
|
16
|
+
*/
|
|
17
|
+
export declare function searchSkills(registry: Registry, query: string): RegistrySkill[];
|
|
18
|
+
/**
|
|
19
|
+
* Load registry from a GitHub URL
|
|
20
|
+
*/
|
|
21
|
+
export declare function loadRegistry(url: string): Promise<Registry>;
|
|
22
|
+
/**
|
|
23
|
+
* Get the GitHub source for a registry URL
|
|
24
|
+
*/
|
|
25
|
+
export declare function getGitHubSource(url: string): GitHubSource;
|
|
26
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAE/E;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAgBvD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAErF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CAe/E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAQjE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAMzD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry management for UASP skills
|
|
3
|
+
*/
|
|
4
|
+
import { parseGitHubUrl, fetchRegistry } from './github.js';
|
|
5
|
+
/**
|
|
6
|
+
* Parse registry JSON content
|
|
7
|
+
*/
|
|
8
|
+
export function parseRegistry(content) {
|
|
9
|
+
try {
|
|
10
|
+
const registry = JSON.parse(content);
|
|
11
|
+
// Validate required fields
|
|
12
|
+
if (!registry.version || !registry.skills || !Array.isArray(registry.skills)) {
|
|
13
|
+
throw new Error('Invalid registry format: missing required fields');
|
|
14
|
+
}
|
|
15
|
+
return registry;
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
if (error instanceof SyntaxError) {
|
|
19
|
+
throw new Error(`Invalid JSON in registry: ${error.message}`);
|
|
20
|
+
}
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Find a skill in the registry by name
|
|
26
|
+
*/
|
|
27
|
+
export function findSkill(registry, skillName) {
|
|
28
|
+
return registry.skills.find((s) => s.name === skillName) || null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Search skills by keyword
|
|
32
|
+
*/
|
|
33
|
+
export function searchSkills(registry, query) {
|
|
34
|
+
const lowerQuery = query.toLowerCase();
|
|
35
|
+
return registry.skills.filter((skill) => {
|
|
36
|
+
// Match against name
|
|
37
|
+
if (skill.name.toLowerCase().includes(lowerQuery))
|
|
38
|
+
return true;
|
|
39
|
+
// Match against description
|
|
40
|
+
if (skill.description.toLowerCase().includes(lowerQuery))
|
|
41
|
+
return true;
|
|
42
|
+
// Match against keywords
|
|
43
|
+
if (skill.keywords.some((k) => k.toLowerCase().includes(lowerQuery)))
|
|
44
|
+
return true;
|
|
45
|
+
return false;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Load registry from a GitHub URL
|
|
50
|
+
*/
|
|
51
|
+
export async function loadRegistry(url) {
|
|
52
|
+
const source = parseGitHubUrl(url);
|
|
53
|
+
if (!source) {
|
|
54
|
+
throw new Error(`Invalid GitHub URL: ${url}`);
|
|
55
|
+
}
|
|
56
|
+
const content = await fetchRegistry(source);
|
|
57
|
+
return parseRegistry(content);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Get the GitHub source for a registry URL
|
|
61
|
+
*/
|
|
62
|
+
export function getGitHubSource(url) {
|
|
63
|
+
const source = parseGitHubUrl(url);
|
|
64
|
+
if (!source) {
|
|
65
|
+
throw new Error(`Invalid GitHub URL: ${url}`);
|
|
66
|
+
}
|
|
67
|
+
return source;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/core/registry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAE/E;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;QAEjD,2BAA2B;QAC3B,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7E,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,QAAkB,EAAE,SAAiB;IAC7D,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,QAAkB,EAAE,KAAa;IAC5D,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAEvC,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QACtC,qBAAqB;QACrB,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAE/D,4BAA4B;QAC5B,IAAI,KAAK,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtE,yBAAyB;QACzB,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAElF,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW;IAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UASP Skill validation using JSON Schema
|
|
3
|
+
*/
|
|
4
|
+
import type { Skill } from '../types/index.js';
|
|
5
|
+
export interface ValidationResult {
|
|
6
|
+
valid: boolean;
|
|
7
|
+
errors: string[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Validate a skill object against the UASP schema
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateSkill(skill: unknown): ValidationResult;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a skill object has the minimum required structure
|
|
15
|
+
*/
|
|
16
|
+
export declare function isValidSkillStructure(skill: unknown): skill is Skill;
|
|
17
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAqR/C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAc9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,KAAK,CA8BpE"}
|