crewly 1.5.21 → 1.6.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/config/roles/orchestrator/prompt.md +182 -25
- package/config/skills/agent/core/cancel-followup/SKILL.md +38 -0
- package/config/skills/agent/core/cancel-followup/execute.sh +111 -0
- package/config/skills/agent/core/cancel-followup/execute.test.sh +42 -0
- package/config/skills/agent/core/list-my-followups/SKILL.md +36 -0
- package/config/skills/agent/core/list-my-followups/execute.sh +93 -0
- package/config/skills/agent/core/list-my-followups/execute.test.sh +41 -0
- package/config/skills/agent/core/schedule-followup/SKILL.md +53 -0
- package/config/skills/agent/core/schedule-followup/execute.sh +195 -0
- package/config/skills/agent/core/schedule-followup/execute.test.sh +48 -0
- package/config/skills/agent/core/watch-for-event/SKILL.md +60 -0
- package/config/skills/agent/core/watch-for-event/execute.sh +177 -0
- package/config/skills/agent/core/watch-for-event/execute.test.sh +43 -0
- package/config/skills/orchestrator/credential-manager/SKILL.md +218 -0
- package/config/skills/orchestrator/credential-manager/execute.sh +166 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts +80 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.controller.js +365 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts +26 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.routes.js +40 -0
- package/dist/backend/backend/src/controllers/credentials/credentials.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +23 -14
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts +3 -1
- package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts.map +1 -1
- package/dist/backend/backend/src/scripts/backfill-mission-priority.js +16 -4
- package/dist/backend/backend/src/scripts/backfill-mission-priority.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js +22 -2
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/credential/credential-store.service.d.ts +161 -0
- package/dist/backend/backend/src/services/credential/credential-store.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/credential/credential-store.service.js +298 -0
- package/dist/backend/backend/src/services/credential/credential-store.service.js.map +1 -0
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +117 -0
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -0
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +293 -0
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -0
- package/dist/backend/backend/src/services/project/task.service.d.ts +18 -2
- package/dist/backend/backend/src/services/project/task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/project/task.service.js +69 -53
- package/dist/backend/backend/src/services/project/task.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/contract-matcher.d.ts +20 -0
- package/dist/backend/backend/src/services/v3/contract-matcher.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/contract-matcher.js +33 -0
- package/dist/backend/backend/src/services/v3/contract-matcher.js.map +1 -0
- package/dist/backend/backend/src/services/v3/escalation.service.d.ts +20 -1
- package/dist/backend/backend/src/services/v3/escalation.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/escalation.service.js +97 -28
- package/dist/backend/backend/src/services/v3/escalation.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts +6 -4
- package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/service-contract-gate.service.js +18 -28
- package/dist/backend/backend/src/services/v3/service-contract-gate.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js +14 -9
- package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +34 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js +115 -5
- package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
- package/dist/backend/backend/src/types/credential.types.d.ts +185 -0
- package/dist/backend/backend/src/types/credential.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/credential.types.js +76 -0
- package/dist/backend/backend/src/types/credential.types.js.map +1 -0
- package/dist/backend/backend/src/utils/encryption.utils.d.ts +57 -0
- package/dist/backend/backend/src/utils/encryption.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/utils/encryption.utils.js +162 -0
- package/dist/backend/backend/src/utils/encryption.utils.js.map +1 -0
- package/dist/cli/backend/src/services/credential/credential-store.service.d.ts +161 -0
- package/dist/cli/backend/src/services/credential/credential-store.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/credential/credential-store.service.js +298 -0
- package/dist/cli/backend/src/services/credential/credential-store.service.js.map +1 -0
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +117 -0
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -0
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +293 -0
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -0
- package/dist/cli/backend/src/services/settings/settings.service.d.ts +168 -0
- package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/settings/settings.service.js +312 -0
- package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts +159 -0
- package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-executor.service.js +626 -0
- package/dist/cli/backend/src/services/skill/skill-executor.service.js.map +1 -0
- package/dist/cli/backend/src/services/skill/skill.service.d.ts +273 -0
- package/dist/cli/backend/src/services/skill/skill.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill/skill.service.js +655 -0
- package/dist/cli/backend/src/services/skill/skill.service.js.map +1 -0
- package/dist/cli/backend/src/types/credential.types.d.ts +185 -0
- package/dist/cli/backend/src/types/credential.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/credential.types.js +76 -0
- package/dist/cli/backend/src/types/credential.types.js.map +1 -0
- package/dist/cli/backend/src/utils/encryption.utils.d.ts +57 -0
- package/dist/cli/backend/src/utils/encryption.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/encryption.utils.js +162 -0
- package/dist/cli/backend/src/utils/encryption.utils.js.map +1 -0
- package/dist/cli/backend/src/utils/skill-md-parser.d.ts +38 -0
- package/dist/cli/backend/src/utils/skill-md-parser.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/skill-md-parser.js +47 -0
- package/dist/cli/backend/src/utils/skill-md-parser.js.map +1 -0
- package/frontend/dist/assets/{index-dc92ab64.css → index-6aaa0630.css} +1 -1
- package/frontend/dist/assets/{index-76d76633.js → index-9e6d97d1.js} +334 -328
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/config/experts/empathetic-resolver/expert.json +0 -11
- package/config/experts/empathetic-resolver.md +0 -32
- package/config/experts/pragmatic-architect/expert.json +0 -11
- package/config/experts/pragmatic-architect.md +0 -32
- package/config/experts/viral-alchemist/expert.json +0 -11
- package/config/experts/viral-alchemist.md +0 -32
|
@@ -0,0 +1,655 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Service
|
|
3
|
+
*
|
|
4
|
+
* Manages AI agent skills including loading from directories,
|
|
5
|
+
* CRUD operations, and skill matching for prompts.
|
|
6
|
+
*
|
|
7
|
+
* Skills are the evolution of the SOP (Standard Operating Procedures) system,
|
|
8
|
+
* combining prompts, scripts, environment variables, and browser automation.
|
|
9
|
+
*
|
|
10
|
+
* @module services/skill/skill.service
|
|
11
|
+
*/
|
|
12
|
+
import { promises as fs } from 'fs';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
import { existsSync } from 'fs';
|
|
15
|
+
import { SKILL_CONSTANTS, createDefaultSkill, skillToSummary, validateCreateSkillInput, validateUpdateSkillInput, matchesSkillFilter, } from '../../types/skill.types.js';
|
|
16
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
17
|
+
import { parseSkillMd } from '../../utils/skill-md-parser.js';
|
|
18
|
+
/**
|
|
19
|
+
* Service for managing AI agent skills
|
|
20
|
+
*
|
|
21
|
+
* Handles:
|
|
22
|
+
* - Loading built-in skills from config/skills/
|
|
23
|
+
* - Managing user-created skills in ~/.crewly/skills/
|
|
24
|
+
* - CRUD operations for skills
|
|
25
|
+
* - Skill matching for prompts
|
|
26
|
+
* - Integration with role service for skill assignment
|
|
27
|
+
*/
|
|
28
|
+
export class SkillService {
|
|
29
|
+
builtinSkillsDir;
|
|
30
|
+
userSkillsDir;
|
|
31
|
+
marketplaceSkillsDir;
|
|
32
|
+
skillsCache = new Map();
|
|
33
|
+
initialized = false;
|
|
34
|
+
logger = LoggerService.getInstance().createComponentLogger('SkillService');
|
|
35
|
+
/**
|
|
36
|
+
* Create a new SkillService instance
|
|
37
|
+
*
|
|
38
|
+
* @param options - Configuration options
|
|
39
|
+
*/
|
|
40
|
+
constructor(options) {
|
|
41
|
+
this.builtinSkillsDir =
|
|
42
|
+
options?.builtinSkillsDir ?? path.join(process.cwd(), 'config', 'skills');
|
|
43
|
+
this.userSkillsDir =
|
|
44
|
+
options?.userSkillsDir ??
|
|
45
|
+
path.join(process.env.HOME || '~', '.crewly', SKILL_CONSTANTS.PATHS.SKILLS_DIR);
|
|
46
|
+
this.marketplaceSkillsDir =
|
|
47
|
+
options?.marketplaceSkillsDir ??
|
|
48
|
+
path.join(process.env.HOME || '~', '.crewly', 'marketplace', 'skills');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Initialize the service by loading all skills
|
|
52
|
+
*
|
|
53
|
+
* Creates user skills directory if it doesn't exist and loads
|
|
54
|
+
* both built-in and user-defined skills into memory.
|
|
55
|
+
*/
|
|
56
|
+
async initialize() {
|
|
57
|
+
if (this.initialized)
|
|
58
|
+
return;
|
|
59
|
+
await this.ensureUserSkillsDir();
|
|
60
|
+
await this.loadAllSkills();
|
|
61
|
+
this.initialized = true;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Get all skills, optionally filtered
|
|
65
|
+
*
|
|
66
|
+
* @param filter - Optional filter criteria
|
|
67
|
+
* @returns Array of skill summaries
|
|
68
|
+
*/
|
|
69
|
+
async listSkills(filter) {
|
|
70
|
+
await this.ensureInitialized();
|
|
71
|
+
let skills = Array.from(this.skillsCache.values());
|
|
72
|
+
if (filter) {
|
|
73
|
+
skills = skills.filter((skill) => matchesSkillFilter(skill, filter));
|
|
74
|
+
}
|
|
75
|
+
return skills.map(skillToSummary);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get a skill by ID with full prompt content
|
|
79
|
+
*
|
|
80
|
+
* @param id - Skill identifier
|
|
81
|
+
* @returns Skill with prompt content or null if not found
|
|
82
|
+
*/
|
|
83
|
+
async getSkill(id) {
|
|
84
|
+
await this.ensureInitialized();
|
|
85
|
+
const skill = this.skillsCache.get(id);
|
|
86
|
+
if (!skill)
|
|
87
|
+
return null;
|
|
88
|
+
const promptContent = await this.loadPromptContent(skill);
|
|
89
|
+
return { ...skill, promptContent };
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Get skills matching a prompt/input
|
|
93
|
+
*
|
|
94
|
+
* Used by agents to find relevant skills for a task. Scores skills
|
|
95
|
+
* based on trigger matches, tag matches, name matches, and description
|
|
96
|
+
* keyword matches.
|
|
97
|
+
*
|
|
98
|
+
* @param input - User input or prompt to match against
|
|
99
|
+
* @param roleId - Optional role ID to filter by
|
|
100
|
+
* @param maxResults - Maximum number of results to return (default: 5)
|
|
101
|
+
* @returns Array of matching skills with prompt content, sorted by relevance
|
|
102
|
+
*/
|
|
103
|
+
async matchSkills(input, roleId, maxResults = 5) {
|
|
104
|
+
await this.ensureInitialized();
|
|
105
|
+
const inputLower = input.toLowerCase();
|
|
106
|
+
const matches = [];
|
|
107
|
+
for (const skill of this.skillsCache.values()) {
|
|
108
|
+
if (!skill.isEnabled)
|
|
109
|
+
continue;
|
|
110
|
+
// Check role assignment if provided
|
|
111
|
+
if (roleId && !skill.assignableRoles.includes(roleId) && skill.assignableRoles.length > 0) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
let score = 0;
|
|
115
|
+
// Check triggers (highest priority)
|
|
116
|
+
for (const trigger of skill.triggers) {
|
|
117
|
+
if (inputLower.includes(trigger.toLowerCase())) {
|
|
118
|
+
score += 10;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Check tags
|
|
122
|
+
for (const tag of skill.tags) {
|
|
123
|
+
if (inputLower.includes(tag.toLowerCase())) {
|
|
124
|
+
score += 3;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Check name
|
|
128
|
+
if (inputLower.includes(skill.name.toLowerCase())) {
|
|
129
|
+
score += 5;
|
|
130
|
+
}
|
|
131
|
+
// Check description keywords
|
|
132
|
+
const descWords = skill.description.toLowerCase().split(/\s+/);
|
|
133
|
+
for (const word of descWords) {
|
|
134
|
+
if (word.length > 3 && inputLower.includes(word)) {
|
|
135
|
+
score += 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (score > 0) {
|
|
139
|
+
matches.push({ skill, score });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Sort by score descending
|
|
143
|
+
matches.sort((a, b) => b.score - a.score);
|
|
144
|
+
// Get top results with prompt content
|
|
145
|
+
const topMatches = matches.slice(0, maxResults);
|
|
146
|
+
return Promise.all(topMatches.map(async ({ skill }) => ({
|
|
147
|
+
...skill,
|
|
148
|
+
promptContent: await this.loadPromptContent(skill),
|
|
149
|
+
})));
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Create a new user-defined skill
|
|
153
|
+
*
|
|
154
|
+
* @param input - Skill creation input
|
|
155
|
+
* @returns The created skill
|
|
156
|
+
* @throws SkillValidationError if input is invalid
|
|
157
|
+
*/
|
|
158
|
+
async createSkill(input) {
|
|
159
|
+
await this.ensureInitialized();
|
|
160
|
+
const errors = validateCreateSkillInput(input);
|
|
161
|
+
if (errors.length > 0) {
|
|
162
|
+
throw new SkillValidationError(errors);
|
|
163
|
+
}
|
|
164
|
+
const skill = createDefaultSkill({ ...input, skillType: input.skillType });
|
|
165
|
+
skill.execution = input.execution;
|
|
166
|
+
skill.environment = input.environment;
|
|
167
|
+
skill.runtime = input.runtime;
|
|
168
|
+
skill.notices = input.notices;
|
|
169
|
+
skill.assignableRoles = input.assignableRoles ?? [];
|
|
170
|
+
skill.triggers = input.triggers ?? [];
|
|
171
|
+
skill.tags = input.tags ?? [];
|
|
172
|
+
await this.saveSkill(skill, input.promptContent);
|
|
173
|
+
this.skillsCache.set(skill.id, skill);
|
|
174
|
+
return skill;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Update an existing skill
|
|
178
|
+
*
|
|
179
|
+
* @param id - Skill identifier
|
|
180
|
+
* @param input - Update input with partial skill data
|
|
181
|
+
* @returns The updated skill
|
|
182
|
+
* @throws SkillNotFoundError if skill doesn't exist
|
|
183
|
+
* @throws BuiltinSkillModificationError if trying to modify a built-in skill
|
|
184
|
+
*/
|
|
185
|
+
async updateSkill(id, input) {
|
|
186
|
+
await this.ensureInitialized();
|
|
187
|
+
const existing = this.skillsCache.get(id);
|
|
188
|
+
if (!existing) {
|
|
189
|
+
throw new SkillNotFoundError(id);
|
|
190
|
+
}
|
|
191
|
+
if (existing.isBuiltin) {
|
|
192
|
+
throw new BuiltinSkillModificationError('update');
|
|
193
|
+
}
|
|
194
|
+
const validationErrors = validateUpdateSkillInput(input);
|
|
195
|
+
if (validationErrors.length > 0) {
|
|
196
|
+
throw new SkillValidationError(validationErrors);
|
|
197
|
+
}
|
|
198
|
+
const updated = {
|
|
199
|
+
...existing,
|
|
200
|
+
name: input.name ?? existing.name,
|
|
201
|
+
description: input.description ?? existing.description,
|
|
202
|
+
category: input.category ?? existing.category,
|
|
203
|
+
skillType: input.skillType ?? existing.skillType,
|
|
204
|
+
execution: input.execution ?? existing.execution,
|
|
205
|
+
environment: input.environment ?? existing.environment,
|
|
206
|
+
runtime: input.runtime ?? existing.runtime,
|
|
207
|
+
notices: input.notices ?? existing.notices,
|
|
208
|
+
assignableRoles: input.assignableRoles ?? existing.assignableRoles,
|
|
209
|
+
triggers: input.triggers ?? existing.triggers,
|
|
210
|
+
tags: input.tags ?? existing.tags,
|
|
211
|
+
isEnabled: input.isEnabled ?? existing.isEnabled,
|
|
212
|
+
updatedAt: new Date().toISOString(),
|
|
213
|
+
};
|
|
214
|
+
await this.saveSkill(updated, input.promptContent);
|
|
215
|
+
this.skillsCache.set(id, updated);
|
|
216
|
+
return updated;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Delete a user-created skill
|
|
220
|
+
*
|
|
221
|
+
* @param id - Skill identifier
|
|
222
|
+
* @throws SkillNotFoundError if skill doesn't exist
|
|
223
|
+
* @throws BuiltinSkillModificationError if trying to delete a built-in skill
|
|
224
|
+
*/
|
|
225
|
+
async deleteSkill(id) {
|
|
226
|
+
await this.ensureInitialized();
|
|
227
|
+
const skill = this.skillsCache.get(id);
|
|
228
|
+
if (!skill) {
|
|
229
|
+
throw new SkillNotFoundError(id);
|
|
230
|
+
}
|
|
231
|
+
if (skill.isBuiltin) {
|
|
232
|
+
throw new BuiltinSkillModificationError('delete');
|
|
233
|
+
}
|
|
234
|
+
const skillDir = path.join(this.userSkillsDir, id);
|
|
235
|
+
await fs.rm(skillDir, { recursive: true, force: true });
|
|
236
|
+
this.skillsCache.delete(id);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Enable or disable a skill
|
|
240
|
+
*
|
|
241
|
+
* @param id - Skill identifier
|
|
242
|
+
* @param enabled - Whether to enable or disable
|
|
243
|
+
* @returns The updated skill
|
|
244
|
+
*/
|
|
245
|
+
async setSkillEnabled(id, enabled) {
|
|
246
|
+
return this.updateSkill(id, { isEnabled: enabled });
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get skills assigned to a specific role
|
|
250
|
+
*
|
|
251
|
+
* @param roleId - Role identifier
|
|
252
|
+
* @returns Array of skill summaries for the role
|
|
253
|
+
*/
|
|
254
|
+
async getSkillsForRole(roleId) {
|
|
255
|
+
return this.listSkills({ roleId, isEnabled: true });
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Refresh skills from disk (reload)
|
|
259
|
+
*
|
|
260
|
+
* Clears the cache and reloads all skills from both
|
|
261
|
+
* built-in and user directories.
|
|
262
|
+
*/
|
|
263
|
+
async refresh() {
|
|
264
|
+
this.skillsCache.clear();
|
|
265
|
+
this.initialized = false;
|
|
266
|
+
await this.initialize();
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get the count of all skills
|
|
270
|
+
*
|
|
271
|
+
* @returns Total number of skills in cache
|
|
272
|
+
*/
|
|
273
|
+
async getSkillCount() {
|
|
274
|
+
await this.ensureInitialized();
|
|
275
|
+
return this.skillsCache.size;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Check if a skill exists
|
|
279
|
+
*
|
|
280
|
+
* @param id - Skill identifier
|
|
281
|
+
* @returns True if skill exists
|
|
282
|
+
*/
|
|
283
|
+
async skillExists(id) {
|
|
284
|
+
await this.ensureInitialized();
|
|
285
|
+
return this.skillsCache.has(id);
|
|
286
|
+
}
|
|
287
|
+
// ==========================================================================
|
|
288
|
+
// Private methods
|
|
289
|
+
// ==========================================================================
|
|
290
|
+
/**
|
|
291
|
+
* Ensure the service is initialized before operations
|
|
292
|
+
*/
|
|
293
|
+
async ensureInitialized() {
|
|
294
|
+
if (!this.initialized) {
|
|
295
|
+
await this.initialize();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Ensure the user skills directory exists
|
|
300
|
+
*/
|
|
301
|
+
async ensureUserSkillsDir() {
|
|
302
|
+
await fs.mkdir(this.userSkillsDir, { recursive: true });
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Load all skills from both builtin and user directories
|
|
306
|
+
*/
|
|
307
|
+
async loadAllSkills() {
|
|
308
|
+
// Load built-in skills
|
|
309
|
+
try {
|
|
310
|
+
if (existsSync(this.builtinSkillsDir)) {
|
|
311
|
+
const builtinSkills = await this.loadSkillsFromDir(this.builtinSkillsDir, true);
|
|
312
|
+
for (const skill of builtinSkills) {
|
|
313
|
+
this.skillsCache.set(skill.id, skill);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
// Log warning but don't fail - built-in skills may not exist yet
|
|
319
|
+
this.logger.warn('Failed to load built-in skills', { error: error instanceof Error ? error.message : String(error) });
|
|
320
|
+
}
|
|
321
|
+
// Load user skills
|
|
322
|
+
try {
|
|
323
|
+
if (existsSync(this.userSkillsDir)) {
|
|
324
|
+
const userSkills = await this.loadSkillsFromDir(this.userSkillsDir, false);
|
|
325
|
+
for (const skill of userSkills) {
|
|
326
|
+
this.skillsCache.set(skill.id, skill);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
catch (error) {
|
|
331
|
+
// Log warning but don't fail - user skills may not exist yet
|
|
332
|
+
this.logger.warn('Failed to load user skills', { error: error instanceof Error ? error.message : String(error) });
|
|
333
|
+
}
|
|
334
|
+
// Load marketplace-installed skills
|
|
335
|
+
try {
|
|
336
|
+
if (existsSync(this.marketplaceSkillsDir)) {
|
|
337
|
+
const marketplaceSkills = await this.loadSkillsFromDir(this.marketplaceSkillsDir, false);
|
|
338
|
+
for (const skill of marketplaceSkills) {
|
|
339
|
+
skill.isMarketplace = true;
|
|
340
|
+
this.skillsCache.set(skill.id, skill);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
this.logger.warn('Failed to load marketplace skills', { error: error instanceof Error ? error.message : String(error) });
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Check if a directory is a skill directory (has SKILL.md or legacy skill.json).
|
|
350
|
+
*
|
|
351
|
+
* @param dir - Directory path to check
|
|
352
|
+
* @returns True if the directory contains a skill definition
|
|
353
|
+
*/
|
|
354
|
+
isSkillDirectory(dir) {
|
|
355
|
+
return existsSync(path.join(dir, 'SKILL.md')) || existsSync(path.join(dir, 'skill.json'));
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* Load skills from a directory
|
|
359
|
+
*
|
|
360
|
+
* Handles both flat structure (SKILL.md in immediate subdirs)
|
|
361
|
+
* and nested category structure (category/skill/SKILL.md).
|
|
362
|
+
*
|
|
363
|
+
* @param dir - Directory path
|
|
364
|
+
* @param isBuiltin - Whether these are built-in skills
|
|
365
|
+
* @returns Array of loaded skills
|
|
366
|
+
*/
|
|
367
|
+
async loadSkillsFromDir(dir, isBuiltin) {
|
|
368
|
+
const skills = [];
|
|
369
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
370
|
+
for (const entry of entries) {
|
|
371
|
+
if (!entry.isDirectory())
|
|
372
|
+
continue;
|
|
373
|
+
const subDir = path.join(dir, entry.name);
|
|
374
|
+
if (this.isSkillDirectory(subDir)) {
|
|
375
|
+
const skill = await this.loadSkillFromDir(subDir, isBuiltin);
|
|
376
|
+
if (skill) {
|
|
377
|
+
skills.push(skill);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
// This might be a category directory, recurse into it
|
|
382
|
+
const nestedSkills = await this.loadNestedSkills(subDir, isBuiltin);
|
|
383
|
+
skills.push(...nestedSkills);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
return skills;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Load skills from nested directories (category/skill structure)
|
|
390
|
+
*
|
|
391
|
+
* @param categoryDir - Category directory path
|
|
392
|
+
* @param isBuiltin - Whether these are built-in skills
|
|
393
|
+
* @returns Array of loaded skills from the category
|
|
394
|
+
*/
|
|
395
|
+
async loadNestedSkills(categoryDir, isBuiltin) {
|
|
396
|
+
const skills = [];
|
|
397
|
+
try {
|
|
398
|
+
const entries = await fs.readdir(categoryDir, { withFileTypes: true });
|
|
399
|
+
for (const entry of entries) {
|
|
400
|
+
if (!entry.isDirectory())
|
|
401
|
+
continue;
|
|
402
|
+
const skillDir = path.join(categoryDir, entry.name);
|
|
403
|
+
if (this.isSkillDirectory(skillDir)) {
|
|
404
|
+
const skill = await this.loadSkillFromDir(skillDir, isBuiltin);
|
|
405
|
+
if (skill) {
|
|
406
|
+
skills.push(skill);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
catch (error) {
|
|
412
|
+
this.logger.warn('Failed to load nested skills', { categoryDir, error: error instanceof Error ? error.message : String(error) });
|
|
413
|
+
}
|
|
414
|
+
return skills;
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Load a single skill from a directory. Tries SKILL.md first,
|
|
418
|
+
* then falls back to legacy skill.json format.
|
|
419
|
+
*
|
|
420
|
+
* @param skillDir - Directory containing the skill
|
|
421
|
+
* @param isBuiltin - Whether this is a built-in skill
|
|
422
|
+
* @returns Loaded skill or null if loading fails
|
|
423
|
+
*/
|
|
424
|
+
async loadSkillFromDir(skillDir, isBuiltin) {
|
|
425
|
+
const skillMdPath = path.join(skillDir, 'SKILL.md');
|
|
426
|
+
if (existsSync(skillMdPath)) {
|
|
427
|
+
return this.loadSkillFromSkillMd(skillDir, skillMdPath, isBuiltin);
|
|
428
|
+
}
|
|
429
|
+
// Legacy fallback: skill.json
|
|
430
|
+
const skillJsonPath = path.join(skillDir, 'skill.json');
|
|
431
|
+
if (existsSync(skillJsonPath)) {
|
|
432
|
+
return this.loadSkillFromLegacyJson(skillDir, skillJsonPath, isBuiltin);
|
|
433
|
+
}
|
|
434
|
+
return null;
|
|
435
|
+
}
|
|
436
|
+
/**
|
|
437
|
+
* Load a skill from SKILL.md format (YAML frontmatter + markdown body).
|
|
438
|
+
*
|
|
439
|
+
* @param skillDir - Directory containing the skill
|
|
440
|
+
* @param skillMdPath - Path to SKILL.md file
|
|
441
|
+
* @param isBuiltin - Whether this is a built-in skill
|
|
442
|
+
* @returns Loaded skill or null if loading fails
|
|
443
|
+
*/
|
|
444
|
+
async loadSkillFromSkillMd(skillDir, skillMdPath, isBuiltin) {
|
|
445
|
+
try {
|
|
446
|
+
const content = await fs.readFile(skillMdPath, 'utf-8');
|
|
447
|
+
const { frontmatter, body } = parseSkillMd(content);
|
|
448
|
+
const dirName = path.basename(skillDir);
|
|
449
|
+
const fm = frontmatter;
|
|
450
|
+
// Validate required fields
|
|
451
|
+
if (!fm.name || !fm.description) {
|
|
452
|
+
this.logger.warn('SKILL.md missing required fields (name/description)', { skillDir });
|
|
453
|
+
return null;
|
|
454
|
+
}
|
|
455
|
+
const skill = {
|
|
456
|
+
id: fm.id || `skill-${dirName}`,
|
|
457
|
+
name: fm.name,
|
|
458
|
+
description: fm.description,
|
|
459
|
+
category: (fm.category || 'general'),
|
|
460
|
+
skillType: (fm.skillType || 'claude-skill'),
|
|
461
|
+
promptFile: skillMdPath, // body content is in the SKILL.md itself
|
|
462
|
+
execution: fm.execution,
|
|
463
|
+
environment: fm.environment,
|
|
464
|
+
credentials: fm.credentials,
|
|
465
|
+
runtime: fm.runtime,
|
|
466
|
+
notices: fm.notices,
|
|
467
|
+
assignableRoles: fm.assignableRoles || [],
|
|
468
|
+
triggers: fm.triggers || [],
|
|
469
|
+
tags: fm.tags || [],
|
|
470
|
+
version: fm.version || '1.0.0',
|
|
471
|
+
requiredTier: fm.requiredTier,
|
|
472
|
+
fallbackSkill: fm.fallbackSkill,
|
|
473
|
+
isBuiltin,
|
|
474
|
+
isEnabled: true,
|
|
475
|
+
createdAt: fm.createdAt || new Date().toISOString(),
|
|
476
|
+
updatedAt: fm.updatedAt || new Date().toISOString(),
|
|
477
|
+
};
|
|
478
|
+
return skill;
|
|
479
|
+
}
|
|
480
|
+
catch (error) {
|
|
481
|
+
this.logger.warn('Failed to load skill from SKILL.md', { skillDir, error: error instanceof Error ? error.message : String(error) });
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Load a single skill from a legacy skill.json file.
|
|
487
|
+
*
|
|
488
|
+
* @param skillDir - Directory containing the skill
|
|
489
|
+
* @param skillJsonPath - Path to skill.json file
|
|
490
|
+
* @param isBuiltin - Whether this is a built-in skill
|
|
491
|
+
* @returns Loaded skill or null if loading fails
|
|
492
|
+
*/
|
|
493
|
+
async loadSkillFromLegacyJson(skillDir, skillJsonPath, isBuiltin) {
|
|
494
|
+
try {
|
|
495
|
+
const content = await fs.readFile(skillJsonPath, 'utf-8');
|
|
496
|
+
const data = JSON.parse(content);
|
|
497
|
+
const skill = {
|
|
498
|
+
...data,
|
|
499
|
+
isBuiltin,
|
|
500
|
+
isEnabled: true,
|
|
501
|
+
promptFile: path.join(skillDir, data.promptFile || 'instructions.md'),
|
|
502
|
+
};
|
|
503
|
+
return skill;
|
|
504
|
+
}
|
|
505
|
+
catch (error) {
|
|
506
|
+
this.logger.warn('Failed to load skill', { skillDir, error: error instanceof Error ? error.message : String(error) });
|
|
507
|
+
return null;
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Load prompt content for a skill.
|
|
512
|
+
*
|
|
513
|
+
* For SKILL.md format, extracts the markdown body (after frontmatter).
|
|
514
|
+
* For legacy format, reads the separate instructions.md file.
|
|
515
|
+
*
|
|
516
|
+
* @param skill - Skill to load prompt for
|
|
517
|
+
* @returns Prompt content string
|
|
518
|
+
*/
|
|
519
|
+
async loadPromptContent(skill) {
|
|
520
|
+
try {
|
|
521
|
+
const content = await fs.readFile(skill.promptFile, 'utf-8');
|
|
522
|
+
// If promptFile points to a SKILL.md, extract just the body
|
|
523
|
+
if (skill.promptFile.endsWith('SKILL.md')) {
|
|
524
|
+
const { body } = parseSkillMd(content);
|
|
525
|
+
return body;
|
|
526
|
+
}
|
|
527
|
+
return content;
|
|
528
|
+
}
|
|
529
|
+
catch (error) {
|
|
530
|
+
this.logger.warn('Failed to load prompt for skill', { skillId: skill.id, error: error instanceof Error ? error.message : String(error) });
|
|
531
|
+
return '';
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Save a skill to disk in SKILL.md format (YAML frontmatter + markdown body).
|
|
536
|
+
*
|
|
537
|
+
* @param skill - Skill to save
|
|
538
|
+
* @param promptContent - Optional prompt content (markdown body)
|
|
539
|
+
*/
|
|
540
|
+
async saveSkill(skill, promptContent) {
|
|
541
|
+
// Lazy import to avoid circular dependency issues at module load time
|
|
542
|
+
const { stringify: stringifyYAML } = await import('yaml');
|
|
543
|
+
const skillDir = path.join(this.userSkillsDir, skill.id);
|
|
544
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
545
|
+
// Build frontmatter object (id included for reload identity)
|
|
546
|
+
const frontmatter = {
|
|
547
|
+
id: skill.id,
|
|
548
|
+
name: skill.name,
|
|
549
|
+
description: skill.description,
|
|
550
|
+
version: skill.version,
|
|
551
|
+
category: skill.category,
|
|
552
|
+
skillType: skill.skillType,
|
|
553
|
+
};
|
|
554
|
+
if (skill.assignableRoles?.length)
|
|
555
|
+
frontmatter.assignableRoles = skill.assignableRoles;
|
|
556
|
+
if (skill.triggers?.length)
|
|
557
|
+
frontmatter.triggers = skill.triggers;
|
|
558
|
+
if (skill.tags?.length)
|
|
559
|
+
frontmatter.tags = skill.tags;
|
|
560
|
+
if (skill.execution)
|
|
561
|
+
frontmatter.execution = skill.execution;
|
|
562
|
+
if (skill.environment)
|
|
563
|
+
frontmatter.environment = skill.environment;
|
|
564
|
+
if (skill.runtime)
|
|
565
|
+
frontmatter.runtime = skill.runtime;
|
|
566
|
+
if (skill.notices?.length)
|
|
567
|
+
frontmatter.notices = skill.notices;
|
|
568
|
+
if (skill.requiredTier)
|
|
569
|
+
frontmatter.requiredTier = skill.requiredTier;
|
|
570
|
+
if (skill.fallbackSkill)
|
|
571
|
+
frontmatter.fallbackSkill = skill.fallbackSkill;
|
|
572
|
+
const yamlStr = stringifyYAML(frontmatter).trim();
|
|
573
|
+
const body = promptContent || '';
|
|
574
|
+
const skillMdContent = `---\n${yamlStr}\n---\n\n${body}\n`;
|
|
575
|
+
const skillMdPath = path.join(skillDir, 'SKILL.md');
|
|
576
|
+
await fs.writeFile(skillMdPath, skillMdContent);
|
|
577
|
+
// Update skill's prompt file path
|
|
578
|
+
skill.promptFile = skillMdPath;
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
// =============================================================================
|
|
582
|
+
// Error Classes
|
|
583
|
+
// =============================================================================
|
|
584
|
+
/**
|
|
585
|
+
* Error thrown when a skill is not found
|
|
586
|
+
*/
|
|
587
|
+
export class SkillNotFoundError extends Error {
|
|
588
|
+
skillId;
|
|
589
|
+
/**
|
|
590
|
+
* Create a SkillNotFoundError
|
|
591
|
+
*
|
|
592
|
+
* @param id - ID of the skill that was not found
|
|
593
|
+
*/
|
|
594
|
+
constructor(skillId) {
|
|
595
|
+
super(`Skill not found: ${skillId}`);
|
|
596
|
+
this.skillId = skillId;
|
|
597
|
+
this.name = 'SkillNotFoundError';
|
|
598
|
+
}
|
|
599
|
+
}
|
|
600
|
+
/**
|
|
601
|
+
* Error thrown when skill validation fails
|
|
602
|
+
*/
|
|
603
|
+
export class SkillValidationError extends Error {
|
|
604
|
+
errors;
|
|
605
|
+
/**
|
|
606
|
+
* Create a SkillValidationError
|
|
607
|
+
*
|
|
608
|
+
* @param errors - Array of validation error messages
|
|
609
|
+
*/
|
|
610
|
+
constructor(errors) {
|
|
611
|
+
super(`Skill validation failed: ${errors.join(', ')}`);
|
|
612
|
+
this.errors = errors;
|
|
613
|
+
this.name = 'SkillValidationError';
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* Error thrown when attempting to modify a built-in skill
|
|
618
|
+
*/
|
|
619
|
+
export class BuiltinSkillModificationError extends Error {
|
|
620
|
+
action;
|
|
621
|
+
/**
|
|
622
|
+
* Create a BuiltinSkillModificationError
|
|
623
|
+
*
|
|
624
|
+
* @param action - The action that was attempted (e.g., 'update', 'delete')
|
|
625
|
+
*/
|
|
626
|
+
constructor(action) {
|
|
627
|
+
super(`Cannot ${action} a built-in skill`);
|
|
628
|
+
this.action = action;
|
|
629
|
+
this.name = 'BuiltinSkillModificationError';
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
// =============================================================================
|
|
633
|
+
// Singleton Instance
|
|
634
|
+
// =============================================================================
|
|
635
|
+
let skillServiceInstance = null;
|
|
636
|
+
/**
|
|
637
|
+
* Get the singleton SkillService instance
|
|
638
|
+
*
|
|
639
|
+
* @returns The shared SkillService instance
|
|
640
|
+
*/
|
|
641
|
+
export function getSkillService() {
|
|
642
|
+
if (!skillServiceInstance) {
|
|
643
|
+
skillServiceInstance = new SkillService();
|
|
644
|
+
}
|
|
645
|
+
return skillServiceInstance;
|
|
646
|
+
}
|
|
647
|
+
/**
|
|
648
|
+
* Reset the singleton SkillService instance
|
|
649
|
+
*
|
|
650
|
+
* Used primarily for testing to ensure a clean state.
|
|
651
|
+
*/
|
|
652
|
+
export function resetSkillService() {
|
|
653
|
+
skillServiceInstance = null;
|
|
654
|
+
}
|
|
655
|
+
//# sourceMappingURL=skill.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/skill/skill.service.ts"],"names":[],"mappings":"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"}
|