crewly 1.5.22 → 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.
Files changed (112) hide show
  1. package/config/roles/orchestrator/prompt.md +182 -25
  2. package/config/skills/agent/core/cancel-followup/SKILL.md +38 -0
  3. package/config/skills/agent/core/cancel-followup/execute.sh +111 -0
  4. package/config/skills/agent/core/cancel-followup/execute.test.sh +42 -0
  5. package/config/skills/agent/core/list-my-followups/SKILL.md +36 -0
  6. package/config/skills/agent/core/list-my-followups/execute.sh +93 -0
  7. package/config/skills/agent/core/list-my-followups/execute.test.sh +41 -0
  8. package/config/skills/agent/core/schedule-followup/SKILL.md +53 -0
  9. package/config/skills/agent/core/schedule-followup/execute.sh +195 -0
  10. package/config/skills/agent/core/schedule-followup/execute.test.sh +48 -0
  11. package/config/skills/agent/core/watch-for-event/SKILL.md +60 -0
  12. package/config/skills/agent/core/watch-for-event/execute.sh +177 -0
  13. package/config/skills/agent/core/watch-for-event/execute.test.sh +43 -0
  14. package/config/skills/orchestrator/credential-manager/SKILL.md +218 -0
  15. package/config/skills/orchestrator/credential-manager/execute.sh +166 -0
  16. package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts +80 -0
  17. package/dist/backend/backend/src/controllers/credentials/credentials.controller.d.ts.map +1 -0
  18. package/dist/backend/backend/src/controllers/credentials/credentials.controller.js +365 -0
  19. package/dist/backend/backend/src/controllers/credentials/credentials.controller.js.map +1 -0
  20. package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts +26 -0
  21. package/dist/backend/backend/src/controllers/credentials/credentials.routes.d.ts.map +1 -0
  22. package/dist/backend/backend/src/controllers/credentials/credentials.routes.js +40 -0
  23. package/dist/backend/backend/src/controllers/credentials/credentials.routes.js.map +1 -0
  24. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +23 -14
  25. package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
  26. package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts +3 -1
  27. package/dist/backend/backend/src/scripts/backfill-mission-priority.d.ts.map +1 -1
  28. package/dist/backend/backend/src/scripts/backfill-mission-priority.js +16 -4
  29. package/dist/backend/backend/src/scripts/backfill-mission-priority.js.map +1 -1
  30. package/dist/backend/backend/src/services/browser/browser-proxy.service.js +1 -1
  31. package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
  32. package/dist/backend/backend/src/services/credential/credential-store.service.d.ts +161 -0
  33. package/dist/backend/backend/src/services/credential/credential-store.service.d.ts.map +1 -0
  34. package/dist/backend/backend/src/services/credential/credential-store.service.js +298 -0
  35. package/dist/backend/backend/src/services/credential/credential-store.service.js.map +1 -0
  36. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +117 -0
  37. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -0
  38. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +293 -0
  39. package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -0
  40. package/dist/backend/backend/src/services/project/task.service.d.ts +18 -2
  41. package/dist/backend/backend/src/services/project/task.service.d.ts.map +1 -1
  42. package/dist/backend/backend/src/services/project/task.service.js +69 -53
  43. package/dist/backend/backend/src/services/project/task.service.js.map +1 -1
  44. package/dist/backend/backend/src/services/v3/contract-matcher.d.ts +20 -0
  45. package/dist/backend/backend/src/services/v3/contract-matcher.d.ts.map +1 -0
  46. package/dist/backend/backend/src/services/v3/contract-matcher.js +33 -0
  47. package/dist/backend/backend/src/services/v3/contract-matcher.js.map +1 -0
  48. package/dist/backend/backend/src/services/v3/escalation.service.d.ts +20 -1
  49. package/dist/backend/backend/src/services/v3/escalation.service.d.ts.map +1 -1
  50. package/dist/backend/backend/src/services/v3/escalation.service.js +97 -28
  51. package/dist/backend/backend/src/services/v3/escalation.service.js.map +1 -1
  52. package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts +6 -4
  53. package/dist/backend/backend/src/services/v3/service-contract-gate.service.d.ts.map +1 -1
  54. package/dist/backend/backend/src/services/v3/service-contract-gate.service.js +18 -28
  55. package/dist/backend/backend/src/services/v3/service-contract-gate.service.js.map +1 -1
  56. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.d.ts.map +1 -1
  57. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js +14 -9
  58. package/dist/backend/backend/src/services/v3/team-trigger-reconciler.service.js.map +1 -1
  59. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts +34 -1
  60. package/dist/backend/backend/src/services/v3/trigger-engine.service.d.ts.map +1 -1
  61. package/dist/backend/backend/src/services/v3/trigger-engine.service.js +115 -5
  62. package/dist/backend/backend/src/services/v3/trigger-engine.service.js.map +1 -1
  63. package/dist/backend/backend/src/types/credential.types.d.ts +185 -0
  64. package/dist/backend/backend/src/types/credential.types.d.ts.map +1 -0
  65. package/dist/backend/backend/src/types/credential.types.js +76 -0
  66. package/dist/backend/backend/src/types/credential.types.js.map +1 -0
  67. package/dist/backend/backend/src/utils/encryption.utils.d.ts +57 -0
  68. package/dist/backend/backend/src/utils/encryption.utils.d.ts.map +1 -0
  69. package/dist/backend/backend/src/utils/encryption.utils.js +162 -0
  70. package/dist/backend/backend/src/utils/encryption.utils.js.map +1 -0
  71. package/dist/cli/backend/src/services/credential/credential-store.service.d.ts +161 -0
  72. package/dist/cli/backend/src/services/credential/credential-store.service.d.ts.map +1 -0
  73. package/dist/cli/backend/src/services/credential/credential-store.service.js +298 -0
  74. package/dist/cli/backend/src/services/credential/credential-store.service.js.map +1 -0
  75. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts +117 -0
  76. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -0
  77. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +293 -0
  78. package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -0
  79. package/dist/cli/backend/src/services/settings/settings.service.d.ts +168 -0
  80. package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -0
  81. package/dist/cli/backend/src/services/settings/settings.service.js +312 -0
  82. package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -0
  83. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts +159 -0
  84. package/dist/cli/backend/src/services/skill/skill-executor.service.d.ts.map +1 -0
  85. package/dist/cli/backend/src/services/skill/skill-executor.service.js +626 -0
  86. package/dist/cli/backend/src/services/skill/skill-executor.service.js.map +1 -0
  87. package/dist/cli/backend/src/services/skill/skill.service.d.ts +273 -0
  88. package/dist/cli/backend/src/services/skill/skill.service.d.ts.map +1 -0
  89. package/dist/cli/backend/src/services/skill/skill.service.js +655 -0
  90. package/dist/cli/backend/src/services/skill/skill.service.js.map +1 -0
  91. package/dist/cli/backend/src/types/credential.types.d.ts +185 -0
  92. package/dist/cli/backend/src/types/credential.types.d.ts.map +1 -0
  93. package/dist/cli/backend/src/types/credential.types.js +76 -0
  94. package/dist/cli/backend/src/types/credential.types.js.map +1 -0
  95. package/dist/cli/backend/src/utils/encryption.utils.d.ts +57 -0
  96. package/dist/cli/backend/src/utils/encryption.utils.d.ts.map +1 -0
  97. package/dist/cli/backend/src/utils/encryption.utils.js +162 -0
  98. package/dist/cli/backend/src/utils/encryption.utils.js.map +1 -0
  99. package/dist/cli/backend/src/utils/skill-md-parser.d.ts +38 -0
  100. package/dist/cli/backend/src/utils/skill-md-parser.d.ts.map +1 -0
  101. package/dist/cli/backend/src/utils/skill-md-parser.js +47 -0
  102. package/dist/cli/backend/src/utils/skill-md-parser.js.map +1 -0
  103. package/frontend/dist/assets/{index-dc92ab64.css → index-6aaa0630.css} +1 -1
  104. package/frontend/dist/assets/{index-76d76633.js → index-9e6d97d1.js} +334 -328
  105. package/frontend/dist/index.html +2 -2
  106. package/package.json +1 -1
  107. package/config/experts/empathetic-resolver/expert.json +0 -11
  108. package/config/experts/empathetic-resolver.md +0 -32
  109. package/config/experts/pragmatic-architect/expert.json +0 -11
  110. package/config/experts/pragmatic-architect.md +0 -32
  111. package/config/experts/viral-alchemist/expert.json +0 -11
  112. package/config/experts/viral-alchemist.md +0 -32
@@ -0,0 +1,273 @@
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 { Skill, SkillWithPrompt, SkillSummary, CreateSkillInput, UpdateSkillInput, SkillFilter } from '../../types/skill.types.js';
13
+ /**
14
+ * Options for initializing the SkillService
15
+ */
16
+ export interface SkillServiceOptions {
17
+ /** Directory containing built-in skills */
18
+ builtinSkillsDir?: string;
19
+ /** Directory for user-created skills */
20
+ userSkillsDir?: string;
21
+ /** Directory for marketplace-installed skills */
22
+ marketplaceSkillsDir?: string;
23
+ }
24
+ /**
25
+ * Service for managing AI agent skills
26
+ *
27
+ * Handles:
28
+ * - Loading built-in skills from config/skills/
29
+ * - Managing user-created skills in ~/.crewly/skills/
30
+ * - CRUD operations for skills
31
+ * - Skill matching for prompts
32
+ * - Integration with role service for skill assignment
33
+ */
34
+ export declare class SkillService {
35
+ private readonly builtinSkillsDir;
36
+ private readonly userSkillsDir;
37
+ private readonly marketplaceSkillsDir;
38
+ private skillsCache;
39
+ private initialized;
40
+ private readonly logger;
41
+ /**
42
+ * Create a new SkillService instance
43
+ *
44
+ * @param options - Configuration options
45
+ */
46
+ constructor(options?: SkillServiceOptions);
47
+ /**
48
+ * Initialize the service by loading all skills
49
+ *
50
+ * Creates user skills directory if it doesn't exist and loads
51
+ * both built-in and user-defined skills into memory.
52
+ */
53
+ initialize(): Promise<void>;
54
+ /**
55
+ * Get all skills, optionally filtered
56
+ *
57
+ * @param filter - Optional filter criteria
58
+ * @returns Array of skill summaries
59
+ */
60
+ listSkills(filter?: SkillFilter): Promise<SkillSummary[]>;
61
+ /**
62
+ * Get a skill by ID with full prompt content
63
+ *
64
+ * @param id - Skill identifier
65
+ * @returns Skill with prompt content or null if not found
66
+ */
67
+ getSkill(id: string): Promise<SkillWithPrompt | null>;
68
+ /**
69
+ * Get skills matching a prompt/input
70
+ *
71
+ * Used by agents to find relevant skills for a task. Scores skills
72
+ * based on trigger matches, tag matches, name matches, and description
73
+ * keyword matches.
74
+ *
75
+ * @param input - User input or prompt to match against
76
+ * @param roleId - Optional role ID to filter by
77
+ * @param maxResults - Maximum number of results to return (default: 5)
78
+ * @returns Array of matching skills with prompt content, sorted by relevance
79
+ */
80
+ matchSkills(input: string, roleId?: string, maxResults?: number): Promise<SkillWithPrompt[]>;
81
+ /**
82
+ * Create a new user-defined skill
83
+ *
84
+ * @param input - Skill creation input
85
+ * @returns The created skill
86
+ * @throws SkillValidationError if input is invalid
87
+ */
88
+ createSkill(input: CreateSkillInput): Promise<Skill>;
89
+ /**
90
+ * Update an existing skill
91
+ *
92
+ * @param id - Skill identifier
93
+ * @param input - Update input with partial skill data
94
+ * @returns The updated skill
95
+ * @throws SkillNotFoundError if skill doesn't exist
96
+ * @throws BuiltinSkillModificationError if trying to modify a built-in skill
97
+ */
98
+ updateSkill(id: string, input: UpdateSkillInput): Promise<Skill>;
99
+ /**
100
+ * Delete a user-created skill
101
+ *
102
+ * @param id - Skill identifier
103
+ * @throws SkillNotFoundError if skill doesn't exist
104
+ * @throws BuiltinSkillModificationError if trying to delete a built-in skill
105
+ */
106
+ deleteSkill(id: string): Promise<void>;
107
+ /**
108
+ * Enable or disable a skill
109
+ *
110
+ * @param id - Skill identifier
111
+ * @param enabled - Whether to enable or disable
112
+ * @returns The updated skill
113
+ */
114
+ setSkillEnabled(id: string, enabled: boolean): Promise<Skill>;
115
+ /**
116
+ * Get skills assigned to a specific role
117
+ *
118
+ * @param roleId - Role identifier
119
+ * @returns Array of skill summaries for the role
120
+ */
121
+ getSkillsForRole(roleId: string): Promise<SkillSummary[]>;
122
+ /**
123
+ * Refresh skills from disk (reload)
124
+ *
125
+ * Clears the cache and reloads all skills from both
126
+ * built-in and user directories.
127
+ */
128
+ refresh(): Promise<void>;
129
+ /**
130
+ * Get the count of all skills
131
+ *
132
+ * @returns Total number of skills in cache
133
+ */
134
+ getSkillCount(): Promise<number>;
135
+ /**
136
+ * Check if a skill exists
137
+ *
138
+ * @param id - Skill identifier
139
+ * @returns True if skill exists
140
+ */
141
+ skillExists(id: string): Promise<boolean>;
142
+ /**
143
+ * Ensure the service is initialized before operations
144
+ */
145
+ private ensureInitialized;
146
+ /**
147
+ * Ensure the user skills directory exists
148
+ */
149
+ private ensureUserSkillsDir;
150
+ /**
151
+ * Load all skills from both builtin and user directories
152
+ */
153
+ private loadAllSkills;
154
+ /**
155
+ * Check if a directory is a skill directory (has SKILL.md or legacy skill.json).
156
+ *
157
+ * @param dir - Directory path to check
158
+ * @returns True if the directory contains a skill definition
159
+ */
160
+ private isSkillDirectory;
161
+ /**
162
+ * Load skills from a directory
163
+ *
164
+ * Handles both flat structure (SKILL.md in immediate subdirs)
165
+ * and nested category structure (category/skill/SKILL.md).
166
+ *
167
+ * @param dir - Directory path
168
+ * @param isBuiltin - Whether these are built-in skills
169
+ * @returns Array of loaded skills
170
+ */
171
+ private loadSkillsFromDir;
172
+ /**
173
+ * Load skills from nested directories (category/skill structure)
174
+ *
175
+ * @param categoryDir - Category directory path
176
+ * @param isBuiltin - Whether these are built-in skills
177
+ * @returns Array of loaded skills from the category
178
+ */
179
+ private loadNestedSkills;
180
+ /**
181
+ * Load a single skill from a directory. Tries SKILL.md first,
182
+ * then falls back to legacy skill.json format.
183
+ *
184
+ * @param skillDir - Directory containing the skill
185
+ * @param isBuiltin - Whether this is a built-in skill
186
+ * @returns Loaded skill or null if loading fails
187
+ */
188
+ private loadSkillFromDir;
189
+ /**
190
+ * Load a skill from SKILL.md format (YAML frontmatter + markdown body).
191
+ *
192
+ * @param skillDir - Directory containing the skill
193
+ * @param skillMdPath - Path to SKILL.md file
194
+ * @param isBuiltin - Whether this is a built-in skill
195
+ * @returns Loaded skill or null if loading fails
196
+ */
197
+ private loadSkillFromSkillMd;
198
+ /**
199
+ * Load a single skill from a legacy skill.json file.
200
+ *
201
+ * @param skillDir - Directory containing the skill
202
+ * @param skillJsonPath - Path to skill.json file
203
+ * @param isBuiltin - Whether this is a built-in skill
204
+ * @returns Loaded skill or null if loading fails
205
+ */
206
+ private loadSkillFromLegacyJson;
207
+ /**
208
+ * Load prompt content for a skill.
209
+ *
210
+ * For SKILL.md format, extracts the markdown body (after frontmatter).
211
+ * For legacy format, reads the separate instructions.md file.
212
+ *
213
+ * @param skill - Skill to load prompt for
214
+ * @returns Prompt content string
215
+ */
216
+ private loadPromptContent;
217
+ /**
218
+ * Save a skill to disk in SKILL.md format (YAML frontmatter + markdown body).
219
+ *
220
+ * @param skill - Skill to save
221
+ * @param promptContent - Optional prompt content (markdown body)
222
+ */
223
+ private saveSkill;
224
+ }
225
+ /**
226
+ * Error thrown when a skill is not found
227
+ */
228
+ export declare class SkillNotFoundError extends Error {
229
+ readonly skillId: string;
230
+ /**
231
+ * Create a SkillNotFoundError
232
+ *
233
+ * @param id - ID of the skill that was not found
234
+ */
235
+ constructor(skillId: string);
236
+ }
237
+ /**
238
+ * Error thrown when skill validation fails
239
+ */
240
+ export declare class SkillValidationError extends Error {
241
+ readonly errors: string[];
242
+ /**
243
+ * Create a SkillValidationError
244
+ *
245
+ * @param errors - Array of validation error messages
246
+ */
247
+ constructor(errors: string[]);
248
+ }
249
+ /**
250
+ * Error thrown when attempting to modify a built-in skill
251
+ */
252
+ export declare class BuiltinSkillModificationError extends Error {
253
+ readonly action: string;
254
+ /**
255
+ * Create a BuiltinSkillModificationError
256
+ *
257
+ * @param action - The action that was attempted (e.g., 'update', 'delete')
258
+ */
259
+ constructor(action: string);
260
+ }
261
+ /**
262
+ * Get the singleton SkillService instance
263
+ *
264
+ * @returns The shared SkillService instance
265
+ */
266
+ export declare function getSkillService(): SkillService;
267
+ /**
268
+ * Reset the singleton SkillService instance
269
+ *
270
+ * Used primarily for testing to ensure a clean state.
271
+ */
272
+ export declare function resetSkillService(): void;
273
+ //# sourceMappingURL=skill.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/skill/skill.service.ts"],"names":[],"mappings":"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"}