groove-dev 0.13.0 → 0.13.1
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/node_modules/@groove-dev/daemon/skills-registry.json +242 -61
- package/node_modules/@groove-dev/daemon/src/api.js +2 -2
- package/node_modules/@groove-dev/daemon/src/skills.js +33 -6
- package/package.json +1 -1
- package/packages/daemon/skills-registry.json +242 -61
- package/packages/daemon/src/api.js +2 -2
- package/packages/daemon/src/skills.js +33 -6
|
@@ -5,10 +5,20 @@
|
|
|
5
5
|
"description": "Create distinctive, production-grade frontend interfaces with high design quality. Avoids generic AI aesthetics.",
|
|
6
6
|
"author": "Anthropic",
|
|
7
7
|
"category": "design",
|
|
8
|
-
"tags": [
|
|
9
|
-
|
|
8
|
+
"tags": [
|
|
9
|
+
"frontend",
|
|
10
|
+
"ui",
|
|
11
|
+
"css",
|
|
12
|
+
"react",
|
|
13
|
+
"design-system"
|
|
14
|
+
],
|
|
15
|
+
"roles": [
|
|
16
|
+
"frontend",
|
|
17
|
+
"fullstack"
|
|
18
|
+
],
|
|
10
19
|
"source": "claude-official",
|
|
11
|
-
"icon": "P"
|
|
20
|
+
"icon": "P",
|
|
21
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/frontend-design.md"
|
|
12
22
|
},
|
|
13
23
|
{
|
|
14
24
|
"id": "code-review",
|
|
@@ -16,10 +26,19 @@
|
|
|
16
26
|
"description": "Comprehensive PR code review using parallel specialized agents. Checks CLAUDE.md compliance, bugs, git history, and previous PR comments.",
|
|
17
27
|
"author": "Anthropic",
|
|
18
28
|
"category": "quality",
|
|
19
|
-
"tags": [
|
|
20
|
-
|
|
29
|
+
"tags": [
|
|
30
|
+
"review",
|
|
31
|
+
"pr",
|
|
32
|
+
"github",
|
|
33
|
+
"quality"
|
|
34
|
+
],
|
|
35
|
+
"roles": [
|
|
36
|
+
"testing",
|
|
37
|
+
"fullstack"
|
|
38
|
+
],
|
|
21
39
|
"source": "claude-official",
|
|
22
|
-
"icon": "R"
|
|
40
|
+
"icon": "R",
|
|
41
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/code-review.md"
|
|
23
42
|
},
|
|
24
43
|
{
|
|
25
44
|
"id": "security-guidance",
|
|
@@ -27,10 +46,20 @@
|
|
|
27
46
|
"description": "Security-focused development guidance. OWASP top 10, input validation, auth patterns, secrets management.",
|
|
28
47
|
"author": "Anthropic",
|
|
29
48
|
"category": "security",
|
|
30
|
-
"tags": [
|
|
31
|
-
|
|
49
|
+
"tags": [
|
|
50
|
+
"security",
|
|
51
|
+
"owasp",
|
|
52
|
+
"auth",
|
|
53
|
+
"validation"
|
|
54
|
+
],
|
|
55
|
+
"roles": [
|
|
56
|
+
"backend",
|
|
57
|
+
"fullstack",
|
|
58
|
+
"devops"
|
|
59
|
+
],
|
|
32
60
|
"source": "claude-official",
|
|
33
|
-
"icon": "S"
|
|
61
|
+
"icon": "S",
|
|
62
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/security-guidance.md"
|
|
34
63
|
},
|
|
35
64
|
{
|
|
36
65
|
"id": "claude-automation-recommender",
|
|
@@ -38,10 +67,21 @@
|
|
|
38
67
|
"description": "Analyze a codebase and recommend Claude Code automations — hooks, subagents, skills, plugins, MCP servers.",
|
|
39
68
|
"author": "Anthropic",
|
|
40
69
|
"category": "devtools",
|
|
41
|
-
"tags": [
|
|
42
|
-
|
|
70
|
+
"tags": [
|
|
71
|
+
"automation",
|
|
72
|
+
"hooks",
|
|
73
|
+
"plugins",
|
|
74
|
+
"mcp",
|
|
75
|
+
"setup"
|
|
76
|
+
],
|
|
77
|
+
"roles": [
|
|
78
|
+
"planner",
|
|
79
|
+
"devops",
|
|
80
|
+
"fullstack"
|
|
81
|
+
],
|
|
43
82
|
"source": "claude-official",
|
|
44
|
-
"icon": "A"
|
|
83
|
+
"icon": "A",
|
|
84
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/claude-automation-recommender.md"
|
|
45
85
|
},
|
|
46
86
|
{
|
|
47
87
|
"id": "claude-md-improver",
|
|
@@ -49,10 +89,18 @@
|
|
|
49
89
|
"description": "Audit and improve CLAUDE.md files. Scans quality, evaluates against templates, makes targeted updates.",
|
|
50
90
|
"author": "Anthropic",
|
|
51
91
|
"category": "devtools",
|
|
52
|
-
"tags": [
|
|
53
|
-
|
|
92
|
+
"tags": [
|
|
93
|
+
"claude-md",
|
|
94
|
+
"project-config",
|
|
95
|
+
"audit"
|
|
96
|
+
],
|
|
97
|
+
"roles": [
|
|
98
|
+
"planner",
|
|
99
|
+
"fullstack"
|
|
100
|
+
],
|
|
54
101
|
"source": "claude-official",
|
|
55
|
-
"icon": "C"
|
|
102
|
+
"icon": "C",
|
|
103
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/claude-md-improver.md"
|
|
56
104
|
},
|
|
57
105
|
{
|
|
58
106
|
"id": "build-mcp-server",
|
|
@@ -60,10 +108,19 @@
|
|
|
60
108
|
"description": "End-to-end MCP server development. Interrogates use case, picks deployment model, designs tools, hands off to specialized skills.",
|
|
61
109
|
"author": "Anthropic",
|
|
62
110
|
"category": "devtools",
|
|
63
|
-
"tags": [
|
|
64
|
-
|
|
111
|
+
"tags": [
|
|
112
|
+
"mcp",
|
|
113
|
+
"api",
|
|
114
|
+
"integration",
|
|
115
|
+
"tools"
|
|
116
|
+
],
|
|
117
|
+
"roles": [
|
|
118
|
+
"backend",
|
|
119
|
+
"fullstack"
|
|
120
|
+
],
|
|
65
121
|
"source": "claude-official",
|
|
66
|
-
"icon": "M"
|
|
122
|
+
"icon": "M",
|
|
123
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/build-mcp-server.md"
|
|
67
124
|
},
|
|
68
125
|
{
|
|
69
126
|
"id": "build-mcp-app",
|
|
@@ -71,10 +128,19 @@
|
|
|
71
128
|
"description": "Add interactive UI widgets to MCP servers — forms, pickers, dashboards, confirmation dialogs inline in chat.",
|
|
72
129
|
"author": "Anthropic",
|
|
73
130
|
"category": "devtools",
|
|
74
|
-
"tags": [
|
|
75
|
-
|
|
131
|
+
"tags": [
|
|
132
|
+
"mcp",
|
|
133
|
+
"ui",
|
|
134
|
+
"widgets",
|
|
135
|
+
"apps-sdk"
|
|
136
|
+
],
|
|
137
|
+
"roles": [
|
|
138
|
+
"frontend",
|
|
139
|
+
"fullstack"
|
|
140
|
+
],
|
|
76
141
|
"source": "claude-official",
|
|
77
|
-
"icon": "U"
|
|
142
|
+
"icon": "U",
|
|
143
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/build-mcp-app.md"
|
|
78
144
|
},
|
|
79
145
|
{
|
|
80
146
|
"id": "feature-dev",
|
|
@@ -82,10 +148,20 @@
|
|
|
82
148
|
"description": "Guided feature development with codebase understanding and architecture focus. Structured workflow from research to implementation.",
|
|
83
149
|
"author": "Anthropic",
|
|
84
150
|
"category": "workflow",
|
|
85
|
-
"tags": [
|
|
86
|
-
|
|
151
|
+
"tags": [
|
|
152
|
+
"feature",
|
|
153
|
+
"architecture",
|
|
154
|
+
"guided",
|
|
155
|
+
"development"
|
|
156
|
+
],
|
|
157
|
+
"roles": [
|
|
158
|
+
"backend",
|
|
159
|
+
"frontend",
|
|
160
|
+
"fullstack"
|
|
161
|
+
],
|
|
87
162
|
"source": "claude-official",
|
|
88
|
-
"icon": "F"
|
|
163
|
+
"icon": "F",
|
|
164
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/feature-dev.md"
|
|
89
165
|
},
|
|
90
166
|
{
|
|
91
167
|
"id": "skill-creator",
|
|
@@ -93,10 +169,19 @@
|
|
|
93
169
|
"description": "Create new skills, modify existing ones, run evals, benchmark performance. The meta-skill for building skills.",
|
|
94
170
|
"author": "Anthropic",
|
|
95
171
|
"category": "devtools",
|
|
96
|
-
"tags": [
|
|
97
|
-
|
|
172
|
+
"tags": [
|
|
173
|
+
"skills",
|
|
174
|
+
"plugins",
|
|
175
|
+
"meta",
|
|
176
|
+
"evals"
|
|
177
|
+
],
|
|
178
|
+
"roles": [
|
|
179
|
+
"planner",
|
|
180
|
+
"fullstack"
|
|
181
|
+
],
|
|
98
182
|
"source": "claude-official",
|
|
99
|
-
"icon": "K"
|
|
183
|
+
"icon": "K",
|
|
184
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/skill-creator.md"
|
|
100
185
|
},
|
|
101
186
|
{
|
|
102
187
|
"id": "plugin-structure",
|
|
@@ -104,10 +189,18 @@
|
|
|
104
189
|
"description": "Scaffold and organize Claude Code plugins. Directory layout, manifest, components, auto-discovery patterns.",
|
|
105
190
|
"author": "Anthropic",
|
|
106
191
|
"category": "devtools",
|
|
107
|
-
"tags": [
|
|
108
|
-
|
|
192
|
+
"tags": [
|
|
193
|
+
"plugins",
|
|
194
|
+
"scaffold",
|
|
195
|
+
"architecture"
|
|
196
|
+
],
|
|
197
|
+
"roles": [
|
|
198
|
+
"fullstack",
|
|
199
|
+
"devops"
|
|
200
|
+
],
|
|
109
201
|
"source": "claude-official",
|
|
110
|
-
"icon": "L"
|
|
202
|
+
"icon": "L",
|
|
203
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/plugin-structure.md"
|
|
111
204
|
},
|
|
112
205
|
{
|
|
113
206
|
"id": "hook-development",
|
|
@@ -115,10 +208,19 @@
|
|
|
115
208
|
"description": "Create PreToolUse, PostToolUse, Stop hooks. Event-driven automation, tool validation, prompt-based hooks API.",
|
|
116
209
|
"author": "Anthropic",
|
|
117
210
|
"category": "devtools",
|
|
118
|
-
"tags": [
|
|
119
|
-
|
|
211
|
+
"tags": [
|
|
212
|
+
"hooks",
|
|
213
|
+
"automation",
|
|
214
|
+
"events",
|
|
215
|
+
"validation"
|
|
216
|
+
],
|
|
217
|
+
"roles": [
|
|
218
|
+
"devops",
|
|
219
|
+
"fullstack"
|
|
220
|
+
],
|
|
120
221
|
"source": "claude-official",
|
|
121
|
-
"icon": "H"
|
|
222
|
+
"icon": "H",
|
|
223
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/hook-development.md"
|
|
122
224
|
},
|
|
123
225
|
{
|
|
124
226
|
"id": "agent-development",
|
|
@@ -126,10 +228,18 @@
|
|
|
126
228
|
"description": "Create subagents with system prompts, triggering conditions, tool access, and autonomous behavior patterns.",
|
|
127
229
|
"author": "Anthropic",
|
|
128
230
|
"category": "devtools",
|
|
129
|
-
"tags": [
|
|
130
|
-
|
|
231
|
+
"tags": [
|
|
232
|
+
"agents",
|
|
233
|
+
"subagents",
|
|
234
|
+
"autonomous"
|
|
235
|
+
],
|
|
236
|
+
"roles": [
|
|
237
|
+
"planner",
|
|
238
|
+
"fullstack"
|
|
239
|
+
],
|
|
131
240
|
"source": "claude-official",
|
|
132
|
-
"icon": "G"
|
|
241
|
+
"icon": "G",
|
|
242
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/agent-development.md"
|
|
133
243
|
},
|
|
134
244
|
{
|
|
135
245
|
"id": "playground",
|
|
@@ -137,10 +247,19 @@
|
|
|
137
247
|
"description": "Create interactive HTML playgrounds — single-file explorers with live preview, visual controls, and copy-out prompts.",
|
|
138
248
|
"author": "Anthropic",
|
|
139
249
|
"category": "design",
|
|
140
|
-
"tags": [
|
|
141
|
-
|
|
250
|
+
"tags": [
|
|
251
|
+
"playground",
|
|
252
|
+
"interactive",
|
|
253
|
+
"html",
|
|
254
|
+
"demo"
|
|
255
|
+
],
|
|
256
|
+
"roles": [
|
|
257
|
+
"frontend",
|
|
258
|
+
"docs"
|
|
259
|
+
],
|
|
142
260
|
"source": "claude-official",
|
|
143
|
-
"icon": "Y"
|
|
261
|
+
"icon": "Y",
|
|
262
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/playground.md"
|
|
144
263
|
},
|
|
145
264
|
{
|
|
146
265
|
"id": "math-olympiad",
|
|
@@ -148,10 +267,16 @@
|
|
|
148
267
|
"description": "Advanced mathematical problem solving. Competition-level math, proofs, and formal reasoning.",
|
|
149
268
|
"author": "Anthropic",
|
|
150
269
|
"category": "specialized",
|
|
151
|
-
"tags": [
|
|
270
|
+
"tags": [
|
|
271
|
+
"math",
|
|
272
|
+
"proofs",
|
|
273
|
+
"reasoning",
|
|
274
|
+
"competition"
|
|
275
|
+
],
|
|
152
276
|
"roles": [],
|
|
153
277
|
"source": "claude-official",
|
|
154
|
-
"icon": "X"
|
|
278
|
+
"icon": "X",
|
|
279
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/math-olympiad.md"
|
|
155
280
|
},
|
|
156
281
|
{
|
|
157
282
|
"id": "hookify",
|
|
@@ -159,10 +284,19 @@
|
|
|
159
284
|
"description": "Create hooks to prevent unwanted behaviors from conversation analysis or explicit instructions. Rule-based automation.",
|
|
160
285
|
"author": "Anthropic",
|
|
161
286
|
"category": "devtools",
|
|
162
|
-
"tags": [
|
|
163
|
-
|
|
287
|
+
"tags": [
|
|
288
|
+
"hooks",
|
|
289
|
+
"rules",
|
|
290
|
+
"automation",
|
|
291
|
+
"guardrails"
|
|
292
|
+
],
|
|
293
|
+
"roles": [
|
|
294
|
+
"devops",
|
|
295
|
+
"fullstack"
|
|
296
|
+
],
|
|
164
297
|
"source": "claude-official",
|
|
165
|
-
"icon": "I"
|
|
298
|
+
"icon": "I",
|
|
299
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/writing-rules.md"
|
|
166
300
|
},
|
|
167
301
|
{
|
|
168
302
|
"id": "code-simplifier",
|
|
@@ -170,10 +304,20 @@
|
|
|
170
304
|
"description": "Review changed code for reuse, quality, and efficiency. Identifies over-engineering and suggests simplifications.",
|
|
171
305
|
"author": "Anthropic",
|
|
172
306
|
"category": "quality",
|
|
173
|
-
"tags": [
|
|
174
|
-
|
|
307
|
+
"tags": [
|
|
308
|
+
"refactor",
|
|
309
|
+
"simplify",
|
|
310
|
+
"quality",
|
|
311
|
+
"efficiency"
|
|
312
|
+
],
|
|
313
|
+
"roles": [
|
|
314
|
+
"backend",
|
|
315
|
+
"frontend",
|
|
316
|
+
"fullstack"
|
|
317
|
+
],
|
|
175
318
|
"source": "claude-official",
|
|
176
|
-
"icon": "Z"
|
|
319
|
+
"icon": "Z",
|
|
320
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/code-simplifier.md"
|
|
177
321
|
},
|
|
178
322
|
{
|
|
179
323
|
"id": "commit-commands",
|
|
@@ -181,10 +325,20 @@
|
|
|
181
325
|
"description": "Git workflow commands — commit, push, open PR, clean gone branches. Structured commit messages.",
|
|
182
326
|
"author": "Anthropic",
|
|
183
327
|
"category": "workflow",
|
|
184
|
-
"tags": [
|
|
185
|
-
|
|
328
|
+
"tags": [
|
|
329
|
+
"git",
|
|
330
|
+
"commit",
|
|
331
|
+
"pr",
|
|
332
|
+
"workflow"
|
|
333
|
+
],
|
|
334
|
+
"roles": [
|
|
335
|
+
"fullstack",
|
|
336
|
+
"backend",
|
|
337
|
+
"frontend"
|
|
338
|
+
],
|
|
186
339
|
"source": "claude-official",
|
|
187
|
-
"icon": "V"
|
|
340
|
+
"icon": "V",
|
|
341
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/commit.md"
|
|
188
342
|
},
|
|
189
343
|
{
|
|
190
344
|
"id": "pr-review-toolkit",
|
|
@@ -192,10 +346,19 @@
|
|
|
192
346
|
"description": "Comprehensive PR review using specialized parallel agents. Multi-angle analysis with confidence scoring.",
|
|
193
347
|
"author": "Anthropic",
|
|
194
348
|
"category": "quality",
|
|
195
|
-
"tags": [
|
|
196
|
-
|
|
349
|
+
"tags": [
|
|
350
|
+
"pr",
|
|
351
|
+
"review",
|
|
352
|
+
"github",
|
|
353
|
+
"parallel-agents"
|
|
354
|
+
],
|
|
355
|
+
"roles": [
|
|
356
|
+
"testing",
|
|
357
|
+
"fullstack"
|
|
358
|
+
],
|
|
197
359
|
"source": "claude-official",
|
|
198
|
-
"icon": "T"
|
|
360
|
+
"icon": "T",
|
|
361
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/review-pr.md"
|
|
199
362
|
},
|
|
200
363
|
{
|
|
201
364
|
"id": "new-sdk-app",
|
|
@@ -203,10 +366,18 @@
|
|
|
203
366
|
"description": "Create and setup a new Claude Agent SDK application. Scaffolds project structure and configuration.",
|
|
204
367
|
"author": "Anthropic",
|
|
205
368
|
"category": "devtools",
|
|
206
|
-
"tags": [
|
|
207
|
-
|
|
369
|
+
"tags": [
|
|
370
|
+
"agent-sdk",
|
|
371
|
+
"scaffold",
|
|
372
|
+
"setup"
|
|
373
|
+
],
|
|
374
|
+
"roles": [
|
|
375
|
+
"backend",
|
|
376
|
+
"fullstack"
|
|
377
|
+
],
|
|
208
378
|
"source": "claude-official",
|
|
209
|
-
"icon": "N"
|
|
379
|
+
"icon": "N",
|
|
380
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/new-sdk-app.md"
|
|
210
381
|
},
|
|
211
382
|
{
|
|
212
383
|
"id": "explanatory-output",
|
|
@@ -214,10 +385,15 @@
|
|
|
214
385
|
"description": "Output style that explains reasoning and decisions. Teaches while building — great for learning and code review.",
|
|
215
386
|
"author": "Anthropic",
|
|
216
387
|
"category": "workflow",
|
|
217
|
-
"tags": [
|
|
388
|
+
"tags": [
|
|
389
|
+
"output-style",
|
|
390
|
+
"learning",
|
|
391
|
+
"explanatory"
|
|
392
|
+
],
|
|
218
393
|
"roles": [],
|
|
219
394
|
"source": "claude-official",
|
|
220
|
-
"icon": "E"
|
|
395
|
+
"icon": "E",
|
|
396
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/explanatory-output.md"
|
|
221
397
|
},
|
|
222
398
|
{
|
|
223
399
|
"id": "learning-output",
|
|
@@ -225,9 +401,14 @@
|
|
|
225
401
|
"description": "Output style optimized for learning. Step-by-step explanations, concept breakdowns, guided understanding.",
|
|
226
402
|
"author": "Anthropic",
|
|
227
403
|
"category": "workflow",
|
|
228
|
-
"tags": [
|
|
404
|
+
"tags": [
|
|
405
|
+
"output-style",
|
|
406
|
+
"learning",
|
|
407
|
+
"educational"
|
|
408
|
+
],
|
|
229
409
|
"roles": [],
|
|
230
410
|
"source": "claude-official",
|
|
231
|
-
"icon": "W"
|
|
411
|
+
"icon": "W",
|
|
412
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/learning-output.md"
|
|
232
413
|
}
|
|
233
|
-
]
|
|
414
|
+
]
|
|
@@ -382,9 +382,9 @@ export function createApi(app, daemon) {
|
|
|
382
382
|
res.json(daemon.skills.getInstalled());
|
|
383
383
|
});
|
|
384
384
|
|
|
385
|
-
app.post('/api/skills/:id/install', (req, res) => {
|
|
385
|
+
app.post('/api/skills/:id/install', async (req, res) => {
|
|
386
386
|
try {
|
|
387
|
-
const result = daemon.skills.install(req.params.id);
|
|
387
|
+
const result = await daemon.skills.install(req.params.id);
|
|
388
388
|
res.json(result);
|
|
389
389
|
} catch (err) {
|
|
390
390
|
res.status(400).json({ error: err.message });
|
|
@@ -7,18 +7,32 @@ import { fileURLToPath } from 'url';
|
|
|
7
7
|
|
|
8
8
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
9
|
|
|
10
|
+
const REMOTE_REGISTRY = 'https://docs.groovedev.ai/skills/registry.json';
|
|
11
|
+
|
|
10
12
|
export class SkillStore {
|
|
11
13
|
constructor(daemon) {
|
|
12
14
|
this.daemon = daemon;
|
|
13
15
|
this.skillsDir = resolve(daemon.grooveDir, 'skills');
|
|
14
16
|
mkdirSync(this.skillsDir, { recursive: true });
|
|
15
17
|
|
|
16
|
-
// Load bundled registry
|
|
18
|
+
// Load bundled registry as fallback
|
|
17
19
|
this.registry = [];
|
|
18
20
|
try {
|
|
19
21
|
const regPath = resolve(__dirname, '../skills-registry.json');
|
|
20
22
|
this.registry = JSON.parse(readFileSync(regPath, 'utf8'));
|
|
21
23
|
} catch { /* no registry file */ }
|
|
24
|
+
|
|
25
|
+
// Fetch remote registry in background (auto-update)
|
|
26
|
+
this._refreshRegistry();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async _refreshRegistry() {
|
|
30
|
+
try {
|
|
31
|
+
const res = await fetch(REMOTE_REGISTRY, { signal: AbortSignal.timeout(5000) });
|
|
32
|
+
if (res.ok) {
|
|
33
|
+
this.registry = await res.json();
|
|
34
|
+
}
|
|
35
|
+
} catch { /* offline — use bundled */ }
|
|
22
36
|
}
|
|
23
37
|
|
|
24
38
|
/**
|
|
@@ -83,17 +97,30 @@ export class SkillStore {
|
|
|
83
97
|
|
|
84
98
|
/**
|
|
85
99
|
* Install a skill from the registry.
|
|
86
|
-
*
|
|
100
|
+
* Downloads SKILL.md from remote URL, falls back to local Claude plugins.
|
|
87
101
|
*/
|
|
88
|
-
install(skillId) {
|
|
102
|
+
async install(skillId) {
|
|
89
103
|
const entry = this.registry.find((s) => s.id === skillId);
|
|
90
104
|
if (!entry) throw new Error(`Skill not found: ${skillId}`);
|
|
91
105
|
if (this._isInstalled(skillId)) throw new Error(`Skill already installed: ${skillId}`);
|
|
92
106
|
|
|
93
|
-
|
|
94
|
-
|
|
107
|
+
let content = null;
|
|
108
|
+
|
|
109
|
+
// Try remote download first
|
|
110
|
+
if (entry.contentUrl) {
|
|
111
|
+
try {
|
|
112
|
+
const res = await fetch(entry.contentUrl, { signal: AbortSignal.timeout(10000) });
|
|
113
|
+
if (res.ok) content = await res.text();
|
|
114
|
+
} catch { /* fall through to local */ }
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Fall back to local Claude plugins
|
|
118
|
+
if (!content) {
|
|
119
|
+
content = this._findSkillContent(skillId);
|
|
120
|
+
}
|
|
121
|
+
|
|
95
122
|
if (!content) {
|
|
96
|
-
throw new Error(`
|
|
123
|
+
throw new Error(`Could not download skill. Check your internet connection.`);
|
|
97
124
|
}
|
|
98
125
|
|
|
99
126
|
// Save to .groove/skills/<id>/SKILL.md
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "groove-dev",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.1",
|
|
4
4
|
"description": "Open-source agent orchestration layer for AI coding tools. GUI dashboard, multi-agent coordination, zero cold-start (Journalist), infinite sessions (adaptive context rotation), AI Project Manager, Quick Launch. Works with Claude Code, Codex, Gemini CLI, Ollama.",
|
|
5
5
|
"license": "FSL-1.1-Apache-2.0",
|
|
6
6
|
"author": "Groove Dev <hello@groovedev.ai> (https://groovedev.ai)",
|
|
@@ -5,10 +5,20 @@
|
|
|
5
5
|
"description": "Create distinctive, production-grade frontend interfaces with high design quality. Avoids generic AI aesthetics.",
|
|
6
6
|
"author": "Anthropic",
|
|
7
7
|
"category": "design",
|
|
8
|
-
"tags": [
|
|
9
|
-
|
|
8
|
+
"tags": [
|
|
9
|
+
"frontend",
|
|
10
|
+
"ui",
|
|
11
|
+
"css",
|
|
12
|
+
"react",
|
|
13
|
+
"design-system"
|
|
14
|
+
],
|
|
15
|
+
"roles": [
|
|
16
|
+
"frontend",
|
|
17
|
+
"fullstack"
|
|
18
|
+
],
|
|
10
19
|
"source": "claude-official",
|
|
11
|
-
"icon": "P"
|
|
20
|
+
"icon": "P",
|
|
21
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/frontend-design.md"
|
|
12
22
|
},
|
|
13
23
|
{
|
|
14
24
|
"id": "code-review",
|
|
@@ -16,10 +26,19 @@
|
|
|
16
26
|
"description": "Comprehensive PR code review using parallel specialized agents. Checks CLAUDE.md compliance, bugs, git history, and previous PR comments.",
|
|
17
27
|
"author": "Anthropic",
|
|
18
28
|
"category": "quality",
|
|
19
|
-
"tags": [
|
|
20
|
-
|
|
29
|
+
"tags": [
|
|
30
|
+
"review",
|
|
31
|
+
"pr",
|
|
32
|
+
"github",
|
|
33
|
+
"quality"
|
|
34
|
+
],
|
|
35
|
+
"roles": [
|
|
36
|
+
"testing",
|
|
37
|
+
"fullstack"
|
|
38
|
+
],
|
|
21
39
|
"source": "claude-official",
|
|
22
|
-
"icon": "R"
|
|
40
|
+
"icon": "R",
|
|
41
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/code-review.md"
|
|
23
42
|
},
|
|
24
43
|
{
|
|
25
44
|
"id": "security-guidance",
|
|
@@ -27,10 +46,20 @@
|
|
|
27
46
|
"description": "Security-focused development guidance. OWASP top 10, input validation, auth patterns, secrets management.",
|
|
28
47
|
"author": "Anthropic",
|
|
29
48
|
"category": "security",
|
|
30
|
-
"tags": [
|
|
31
|
-
|
|
49
|
+
"tags": [
|
|
50
|
+
"security",
|
|
51
|
+
"owasp",
|
|
52
|
+
"auth",
|
|
53
|
+
"validation"
|
|
54
|
+
],
|
|
55
|
+
"roles": [
|
|
56
|
+
"backend",
|
|
57
|
+
"fullstack",
|
|
58
|
+
"devops"
|
|
59
|
+
],
|
|
32
60
|
"source": "claude-official",
|
|
33
|
-
"icon": "S"
|
|
61
|
+
"icon": "S",
|
|
62
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/security-guidance.md"
|
|
34
63
|
},
|
|
35
64
|
{
|
|
36
65
|
"id": "claude-automation-recommender",
|
|
@@ -38,10 +67,21 @@
|
|
|
38
67
|
"description": "Analyze a codebase and recommend Claude Code automations — hooks, subagents, skills, plugins, MCP servers.",
|
|
39
68
|
"author": "Anthropic",
|
|
40
69
|
"category": "devtools",
|
|
41
|
-
"tags": [
|
|
42
|
-
|
|
70
|
+
"tags": [
|
|
71
|
+
"automation",
|
|
72
|
+
"hooks",
|
|
73
|
+
"plugins",
|
|
74
|
+
"mcp",
|
|
75
|
+
"setup"
|
|
76
|
+
],
|
|
77
|
+
"roles": [
|
|
78
|
+
"planner",
|
|
79
|
+
"devops",
|
|
80
|
+
"fullstack"
|
|
81
|
+
],
|
|
43
82
|
"source": "claude-official",
|
|
44
|
-
"icon": "A"
|
|
83
|
+
"icon": "A",
|
|
84
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/claude-automation-recommender.md"
|
|
45
85
|
},
|
|
46
86
|
{
|
|
47
87
|
"id": "claude-md-improver",
|
|
@@ -49,10 +89,18 @@
|
|
|
49
89
|
"description": "Audit and improve CLAUDE.md files. Scans quality, evaluates against templates, makes targeted updates.",
|
|
50
90
|
"author": "Anthropic",
|
|
51
91
|
"category": "devtools",
|
|
52
|
-
"tags": [
|
|
53
|
-
|
|
92
|
+
"tags": [
|
|
93
|
+
"claude-md",
|
|
94
|
+
"project-config",
|
|
95
|
+
"audit"
|
|
96
|
+
],
|
|
97
|
+
"roles": [
|
|
98
|
+
"planner",
|
|
99
|
+
"fullstack"
|
|
100
|
+
],
|
|
54
101
|
"source": "claude-official",
|
|
55
|
-
"icon": "C"
|
|
102
|
+
"icon": "C",
|
|
103
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/claude-md-improver.md"
|
|
56
104
|
},
|
|
57
105
|
{
|
|
58
106
|
"id": "build-mcp-server",
|
|
@@ -60,10 +108,19 @@
|
|
|
60
108
|
"description": "End-to-end MCP server development. Interrogates use case, picks deployment model, designs tools, hands off to specialized skills.",
|
|
61
109
|
"author": "Anthropic",
|
|
62
110
|
"category": "devtools",
|
|
63
|
-
"tags": [
|
|
64
|
-
|
|
111
|
+
"tags": [
|
|
112
|
+
"mcp",
|
|
113
|
+
"api",
|
|
114
|
+
"integration",
|
|
115
|
+
"tools"
|
|
116
|
+
],
|
|
117
|
+
"roles": [
|
|
118
|
+
"backend",
|
|
119
|
+
"fullstack"
|
|
120
|
+
],
|
|
65
121
|
"source": "claude-official",
|
|
66
|
-
"icon": "M"
|
|
122
|
+
"icon": "M",
|
|
123
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/build-mcp-server.md"
|
|
67
124
|
},
|
|
68
125
|
{
|
|
69
126
|
"id": "build-mcp-app",
|
|
@@ -71,10 +128,19 @@
|
|
|
71
128
|
"description": "Add interactive UI widgets to MCP servers — forms, pickers, dashboards, confirmation dialogs inline in chat.",
|
|
72
129
|
"author": "Anthropic",
|
|
73
130
|
"category": "devtools",
|
|
74
|
-
"tags": [
|
|
75
|
-
|
|
131
|
+
"tags": [
|
|
132
|
+
"mcp",
|
|
133
|
+
"ui",
|
|
134
|
+
"widgets",
|
|
135
|
+
"apps-sdk"
|
|
136
|
+
],
|
|
137
|
+
"roles": [
|
|
138
|
+
"frontend",
|
|
139
|
+
"fullstack"
|
|
140
|
+
],
|
|
76
141
|
"source": "claude-official",
|
|
77
|
-
"icon": "U"
|
|
142
|
+
"icon": "U",
|
|
143
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/build-mcp-app.md"
|
|
78
144
|
},
|
|
79
145
|
{
|
|
80
146
|
"id": "feature-dev",
|
|
@@ -82,10 +148,20 @@
|
|
|
82
148
|
"description": "Guided feature development with codebase understanding and architecture focus. Structured workflow from research to implementation.",
|
|
83
149
|
"author": "Anthropic",
|
|
84
150
|
"category": "workflow",
|
|
85
|
-
"tags": [
|
|
86
|
-
|
|
151
|
+
"tags": [
|
|
152
|
+
"feature",
|
|
153
|
+
"architecture",
|
|
154
|
+
"guided",
|
|
155
|
+
"development"
|
|
156
|
+
],
|
|
157
|
+
"roles": [
|
|
158
|
+
"backend",
|
|
159
|
+
"frontend",
|
|
160
|
+
"fullstack"
|
|
161
|
+
],
|
|
87
162
|
"source": "claude-official",
|
|
88
|
-
"icon": "F"
|
|
163
|
+
"icon": "F",
|
|
164
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/feature-dev.md"
|
|
89
165
|
},
|
|
90
166
|
{
|
|
91
167
|
"id": "skill-creator",
|
|
@@ -93,10 +169,19 @@
|
|
|
93
169
|
"description": "Create new skills, modify existing ones, run evals, benchmark performance. The meta-skill for building skills.",
|
|
94
170
|
"author": "Anthropic",
|
|
95
171
|
"category": "devtools",
|
|
96
|
-
"tags": [
|
|
97
|
-
|
|
172
|
+
"tags": [
|
|
173
|
+
"skills",
|
|
174
|
+
"plugins",
|
|
175
|
+
"meta",
|
|
176
|
+
"evals"
|
|
177
|
+
],
|
|
178
|
+
"roles": [
|
|
179
|
+
"planner",
|
|
180
|
+
"fullstack"
|
|
181
|
+
],
|
|
98
182
|
"source": "claude-official",
|
|
99
|
-
"icon": "K"
|
|
183
|
+
"icon": "K",
|
|
184
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/skill-creator.md"
|
|
100
185
|
},
|
|
101
186
|
{
|
|
102
187
|
"id": "plugin-structure",
|
|
@@ -104,10 +189,18 @@
|
|
|
104
189
|
"description": "Scaffold and organize Claude Code plugins. Directory layout, manifest, components, auto-discovery patterns.",
|
|
105
190
|
"author": "Anthropic",
|
|
106
191
|
"category": "devtools",
|
|
107
|
-
"tags": [
|
|
108
|
-
|
|
192
|
+
"tags": [
|
|
193
|
+
"plugins",
|
|
194
|
+
"scaffold",
|
|
195
|
+
"architecture"
|
|
196
|
+
],
|
|
197
|
+
"roles": [
|
|
198
|
+
"fullstack",
|
|
199
|
+
"devops"
|
|
200
|
+
],
|
|
109
201
|
"source": "claude-official",
|
|
110
|
-
"icon": "L"
|
|
202
|
+
"icon": "L",
|
|
203
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/plugin-structure.md"
|
|
111
204
|
},
|
|
112
205
|
{
|
|
113
206
|
"id": "hook-development",
|
|
@@ -115,10 +208,19 @@
|
|
|
115
208
|
"description": "Create PreToolUse, PostToolUse, Stop hooks. Event-driven automation, tool validation, prompt-based hooks API.",
|
|
116
209
|
"author": "Anthropic",
|
|
117
210
|
"category": "devtools",
|
|
118
|
-
"tags": [
|
|
119
|
-
|
|
211
|
+
"tags": [
|
|
212
|
+
"hooks",
|
|
213
|
+
"automation",
|
|
214
|
+
"events",
|
|
215
|
+
"validation"
|
|
216
|
+
],
|
|
217
|
+
"roles": [
|
|
218
|
+
"devops",
|
|
219
|
+
"fullstack"
|
|
220
|
+
],
|
|
120
221
|
"source": "claude-official",
|
|
121
|
-
"icon": "H"
|
|
222
|
+
"icon": "H",
|
|
223
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/hook-development.md"
|
|
122
224
|
},
|
|
123
225
|
{
|
|
124
226
|
"id": "agent-development",
|
|
@@ -126,10 +228,18 @@
|
|
|
126
228
|
"description": "Create subagents with system prompts, triggering conditions, tool access, and autonomous behavior patterns.",
|
|
127
229
|
"author": "Anthropic",
|
|
128
230
|
"category": "devtools",
|
|
129
|
-
"tags": [
|
|
130
|
-
|
|
231
|
+
"tags": [
|
|
232
|
+
"agents",
|
|
233
|
+
"subagents",
|
|
234
|
+
"autonomous"
|
|
235
|
+
],
|
|
236
|
+
"roles": [
|
|
237
|
+
"planner",
|
|
238
|
+
"fullstack"
|
|
239
|
+
],
|
|
131
240
|
"source": "claude-official",
|
|
132
|
-
"icon": "G"
|
|
241
|
+
"icon": "G",
|
|
242
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/agent-development.md"
|
|
133
243
|
},
|
|
134
244
|
{
|
|
135
245
|
"id": "playground",
|
|
@@ -137,10 +247,19 @@
|
|
|
137
247
|
"description": "Create interactive HTML playgrounds — single-file explorers with live preview, visual controls, and copy-out prompts.",
|
|
138
248
|
"author": "Anthropic",
|
|
139
249
|
"category": "design",
|
|
140
|
-
"tags": [
|
|
141
|
-
|
|
250
|
+
"tags": [
|
|
251
|
+
"playground",
|
|
252
|
+
"interactive",
|
|
253
|
+
"html",
|
|
254
|
+
"demo"
|
|
255
|
+
],
|
|
256
|
+
"roles": [
|
|
257
|
+
"frontend",
|
|
258
|
+
"docs"
|
|
259
|
+
],
|
|
142
260
|
"source": "claude-official",
|
|
143
|
-
"icon": "Y"
|
|
261
|
+
"icon": "Y",
|
|
262
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/playground.md"
|
|
144
263
|
},
|
|
145
264
|
{
|
|
146
265
|
"id": "math-olympiad",
|
|
@@ -148,10 +267,16 @@
|
|
|
148
267
|
"description": "Advanced mathematical problem solving. Competition-level math, proofs, and formal reasoning.",
|
|
149
268
|
"author": "Anthropic",
|
|
150
269
|
"category": "specialized",
|
|
151
|
-
"tags": [
|
|
270
|
+
"tags": [
|
|
271
|
+
"math",
|
|
272
|
+
"proofs",
|
|
273
|
+
"reasoning",
|
|
274
|
+
"competition"
|
|
275
|
+
],
|
|
152
276
|
"roles": [],
|
|
153
277
|
"source": "claude-official",
|
|
154
|
-
"icon": "X"
|
|
278
|
+
"icon": "X",
|
|
279
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/math-olympiad.md"
|
|
155
280
|
},
|
|
156
281
|
{
|
|
157
282
|
"id": "hookify",
|
|
@@ -159,10 +284,19 @@
|
|
|
159
284
|
"description": "Create hooks to prevent unwanted behaviors from conversation analysis or explicit instructions. Rule-based automation.",
|
|
160
285
|
"author": "Anthropic",
|
|
161
286
|
"category": "devtools",
|
|
162
|
-
"tags": [
|
|
163
|
-
|
|
287
|
+
"tags": [
|
|
288
|
+
"hooks",
|
|
289
|
+
"rules",
|
|
290
|
+
"automation",
|
|
291
|
+
"guardrails"
|
|
292
|
+
],
|
|
293
|
+
"roles": [
|
|
294
|
+
"devops",
|
|
295
|
+
"fullstack"
|
|
296
|
+
],
|
|
164
297
|
"source": "claude-official",
|
|
165
|
-
"icon": "I"
|
|
298
|
+
"icon": "I",
|
|
299
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/writing-rules.md"
|
|
166
300
|
},
|
|
167
301
|
{
|
|
168
302
|
"id": "code-simplifier",
|
|
@@ -170,10 +304,20 @@
|
|
|
170
304
|
"description": "Review changed code for reuse, quality, and efficiency. Identifies over-engineering and suggests simplifications.",
|
|
171
305
|
"author": "Anthropic",
|
|
172
306
|
"category": "quality",
|
|
173
|
-
"tags": [
|
|
174
|
-
|
|
307
|
+
"tags": [
|
|
308
|
+
"refactor",
|
|
309
|
+
"simplify",
|
|
310
|
+
"quality",
|
|
311
|
+
"efficiency"
|
|
312
|
+
],
|
|
313
|
+
"roles": [
|
|
314
|
+
"backend",
|
|
315
|
+
"frontend",
|
|
316
|
+
"fullstack"
|
|
317
|
+
],
|
|
175
318
|
"source": "claude-official",
|
|
176
|
-
"icon": "Z"
|
|
319
|
+
"icon": "Z",
|
|
320
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/code-simplifier.md"
|
|
177
321
|
},
|
|
178
322
|
{
|
|
179
323
|
"id": "commit-commands",
|
|
@@ -181,10 +325,20 @@
|
|
|
181
325
|
"description": "Git workflow commands — commit, push, open PR, clean gone branches. Structured commit messages.",
|
|
182
326
|
"author": "Anthropic",
|
|
183
327
|
"category": "workflow",
|
|
184
|
-
"tags": [
|
|
185
|
-
|
|
328
|
+
"tags": [
|
|
329
|
+
"git",
|
|
330
|
+
"commit",
|
|
331
|
+
"pr",
|
|
332
|
+
"workflow"
|
|
333
|
+
],
|
|
334
|
+
"roles": [
|
|
335
|
+
"fullstack",
|
|
336
|
+
"backend",
|
|
337
|
+
"frontend"
|
|
338
|
+
],
|
|
186
339
|
"source": "claude-official",
|
|
187
|
-
"icon": "V"
|
|
340
|
+
"icon": "V",
|
|
341
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/commit.md"
|
|
188
342
|
},
|
|
189
343
|
{
|
|
190
344
|
"id": "pr-review-toolkit",
|
|
@@ -192,10 +346,19 @@
|
|
|
192
346
|
"description": "Comprehensive PR review using specialized parallel agents. Multi-angle analysis with confidence scoring.",
|
|
193
347
|
"author": "Anthropic",
|
|
194
348
|
"category": "quality",
|
|
195
|
-
"tags": [
|
|
196
|
-
|
|
349
|
+
"tags": [
|
|
350
|
+
"pr",
|
|
351
|
+
"review",
|
|
352
|
+
"github",
|
|
353
|
+
"parallel-agents"
|
|
354
|
+
],
|
|
355
|
+
"roles": [
|
|
356
|
+
"testing",
|
|
357
|
+
"fullstack"
|
|
358
|
+
],
|
|
197
359
|
"source": "claude-official",
|
|
198
|
-
"icon": "T"
|
|
360
|
+
"icon": "T",
|
|
361
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/review-pr.md"
|
|
199
362
|
},
|
|
200
363
|
{
|
|
201
364
|
"id": "new-sdk-app",
|
|
@@ -203,10 +366,18 @@
|
|
|
203
366
|
"description": "Create and setup a new Claude Agent SDK application. Scaffolds project structure and configuration.",
|
|
204
367
|
"author": "Anthropic",
|
|
205
368
|
"category": "devtools",
|
|
206
|
-
"tags": [
|
|
207
|
-
|
|
369
|
+
"tags": [
|
|
370
|
+
"agent-sdk",
|
|
371
|
+
"scaffold",
|
|
372
|
+
"setup"
|
|
373
|
+
],
|
|
374
|
+
"roles": [
|
|
375
|
+
"backend",
|
|
376
|
+
"fullstack"
|
|
377
|
+
],
|
|
208
378
|
"source": "claude-official",
|
|
209
|
-
"icon": "N"
|
|
379
|
+
"icon": "N",
|
|
380
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/new-sdk-app.md"
|
|
210
381
|
},
|
|
211
382
|
{
|
|
212
383
|
"id": "explanatory-output",
|
|
@@ -214,10 +385,15 @@
|
|
|
214
385
|
"description": "Output style that explains reasoning and decisions. Teaches while building — great for learning and code review.",
|
|
215
386
|
"author": "Anthropic",
|
|
216
387
|
"category": "workflow",
|
|
217
|
-
"tags": [
|
|
388
|
+
"tags": [
|
|
389
|
+
"output-style",
|
|
390
|
+
"learning",
|
|
391
|
+
"explanatory"
|
|
392
|
+
],
|
|
218
393
|
"roles": [],
|
|
219
394
|
"source": "claude-official",
|
|
220
|
-
"icon": "E"
|
|
395
|
+
"icon": "E",
|
|
396
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/explanatory-output.md"
|
|
221
397
|
},
|
|
222
398
|
{
|
|
223
399
|
"id": "learning-output",
|
|
@@ -225,9 +401,14 @@
|
|
|
225
401
|
"description": "Output style optimized for learning. Step-by-step explanations, concept breakdowns, guided understanding.",
|
|
226
402
|
"author": "Anthropic",
|
|
227
403
|
"category": "workflow",
|
|
228
|
-
"tags": [
|
|
404
|
+
"tags": [
|
|
405
|
+
"output-style",
|
|
406
|
+
"learning",
|
|
407
|
+
"educational"
|
|
408
|
+
],
|
|
229
409
|
"roles": [],
|
|
230
410
|
"source": "claude-official",
|
|
231
|
-
"icon": "W"
|
|
411
|
+
"icon": "W",
|
|
412
|
+
"contentUrl": "https://docs.groovedev.ai/skills/content/learning-output.md"
|
|
232
413
|
}
|
|
233
|
-
]
|
|
414
|
+
]
|
|
@@ -382,9 +382,9 @@ export function createApi(app, daemon) {
|
|
|
382
382
|
res.json(daemon.skills.getInstalled());
|
|
383
383
|
});
|
|
384
384
|
|
|
385
|
-
app.post('/api/skills/:id/install', (req, res) => {
|
|
385
|
+
app.post('/api/skills/:id/install', async (req, res) => {
|
|
386
386
|
try {
|
|
387
|
-
const result = daemon.skills.install(req.params.id);
|
|
387
|
+
const result = await daemon.skills.install(req.params.id);
|
|
388
388
|
res.json(result);
|
|
389
389
|
} catch (err) {
|
|
390
390
|
res.status(400).json({ error: err.message });
|
|
@@ -7,18 +7,32 @@ import { fileURLToPath } from 'url';
|
|
|
7
7
|
|
|
8
8
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
9
|
|
|
10
|
+
const REMOTE_REGISTRY = 'https://docs.groovedev.ai/skills/registry.json';
|
|
11
|
+
|
|
10
12
|
export class SkillStore {
|
|
11
13
|
constructor(daemon) {
|
|
12
14
|
this.daemon = daemon;
|
|
13
15
|
this.skillsDir = resolve(daemon.grooveDir, 'skills');
|
|
14
16
|
mkdirSync(this.skillsDir, { recursive: true });
|
|
15
17
|
|
|
16
|
-
// Load bundled registry
|
|
18
|
+
// Load bundled registry as fallback
|
|
17
19
|
this.registry = [];
|
|
18
20
|
try {
|
|
19
21
|
const regPath = resolve(__dirname, '../skills-registry.json');
|
|
20
22
|
this.registry = JSON.parse(readFileSync(regPath, 'utf8'));
|
|
21
23
|
} catch { /* no registry file */ }
|
|
24
|
+
|
|
25
|
+
// Fetch remote registry in background (auto-update)
|
|
26
|
+
this._refreshRegistry();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async _refreshRegistry() {
|
|
30
|
+
try {
|
|
31
|
+
const res = await fetch(REMOTE_REGISTRY, { signal: AbortSignal.timeout(5000) });
|
|
32
|
+
if (res.ok) {
|
|
33
|
+
this.registry = await res.json();
|
|
34
|
+
}
|
|
35
|
+
} catch { /* offline — use bundled */ }
|
|
22
36
|
}
|
|
23
37
|
|
|
24
38
|
/**
|
|
@@ -83,17 +97,30 @@ export class SkillStore {
|
|
|
83
97
|
|
|
84
98
|
/**
|
|
85
99
|
* Install a skill from the registry.
|
|
86
|
-
*
|
|
100
|
+
* Downloads SKILL.md from remote URL, falls back to local Claude plugins.
|
|
87
101
|
*/
|
|
88
|
-
install(skillId) {
|
|
102
|
+
async install(skillId) {
|
|
89
103
|
const entry = this.registry.find((s) => s.id === skillId);
|
|
90
104
|
if (!entry) throw new Error(`Skill not found: ${skillId}`);
|
|
91
105
|
if (this._isInstalled(skillId)) throw new Error(`Skill already installed: ${skillId}`);
|
|
92
106
|
|
|
93
|
-
|
|
94
|
-
|
|
107
|
+
let content = null;
|
|
108
|
+
|
|
109
|
+
// Try remote download first
|
|
110
|
+
if (entry.contentUrl) {
|
|
111
|
+
try {
|
|
112
|
+
const res = await fetch(entry.contentUrl, { signal: AbortSignal.timeout(10000) });
|
|
113
|
+
if (res.ok) content = await res.text();
|
|
114
|
+
} catch { /* fall through to local */ }
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Fall back to local Claude plugins
|
|
118
|
+
if (!content) {
|
|
119
|
+
content = this._findSkillContent(skillId);
|
|
120
|
+
}
|
|
121
|
+
|
|
95
122
|
if (!content) {
|
|
96
|
-
throw new Error(`
|
|
123
|
+
throw new Error(`Could not download skill. Check your internet connection.`);
|
|
97
124
|
}
|
|
98
125
|
|
|
99
126
|
// Save to .groove/skills/<id>/SKILL.md
|