groove-dev 0.13.0 → 0.14.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.
@@ -0,0 +1,277 @@
1
+ # Skills Marketplace API — Build Spec
2
+
3
+ > Instructions for building the server-side Skills API that powers the GROOVE Skills Store.
4
+ > This API is hosted on the docs/retail site (docs.groovedev.ai).
5
+
6
+ ## Context
7
+
8
+ GROOVE is an agent orchestration tool. Its GUI has a Skills Store (app-store style) that currently reads from a static `registry.json` file. We need a real API so users can **submit, edit, and sell** their own skills. The GROOVE daemon will fetch from this API instead of the static file.
9
+
10
+ ### What exists today (static files):
11
+ - `https://docs.groovedev.ai/skills/registry.json` — JSON array of all skill metadata
12
+ - `https://docs.groovedev.ai/skills/content/<id>.md` — individual SKILL.md files
13
+
14
+ ### What we're building:
15
+ A REST API that replaces the static files and adds CRUD + author management.
16
+
17
+ ---
18
+
19
+ ## Data Model
20
+
21
+ ### Skill
22
+
23
+ ```json
24
+ {
25
+ "id": "frontend-design",
26
+ "name": "Frontend Design",
27
+ "description": "Create distinctive, production-grade frontend interfaces...",
28
+ "author": "Anthropic",
29
+ "authorId": "user_abc123",
30
+ "authorProfile": {
31
+ "avatar": "https://...",
32
+ "website": "https://anthropic.com",
33
+ "github": "anthropics",
34
+ "twitter": "AnthropicAI",
35
+ "bio": "Building reliable AI systems"
36
+ },
37
+ "category": "design",
38
+ "tags": ["frontend", "ui", "css", "react"],
39
+ "roles": ["frontend", "fullstack"],
40
+ "source": "claude-official",
41
+ "icon": "P",
42
+ "contentUrl": "https://docs.groovedev.ai/skills/content/frontend-design.md",
43
+ "content": "--- (full SKILL.md content) ---",
44
+ "downloads": 1840,
45
+ "rating": 4.8,
46
+ "ratingCount": 124,
47
+ "price": 0,
48
+ "featured": false,
49
+ "status": "published",
50
+ "version": "1.0.0",
51
+ "createdAt": "2026-04-01T00:00:00Z",
52
+ "updatedAt": "2026-04-06T00:00:00Z"
53
+ }
54
+ ```
55
+
56
+ **Categories** (enum): `design`, `quality`, `devtools`, `workflow`, `security`, `specialized`
57
+
58
+ **Status** (enum): `draft`, `review`, `published`, `rejected`, `unlisted`
59
+
60
+ **Source**: `claude-official` for Anthropic skills, `community` for user-submitted
61
+
62
+ ### Author / User
63
+
64
+ ```json
65
+ {
66
+ "id": "user_abc123",
67
+ "githubId": "12345",
68
+ "username": "johndoe",
69
+ "displayName": "John Doe",
70
+ "avatar": "https://avatars.githubusercontent.com/u/12345",
71
+ "bio": "Senior UI designer, 10 years experience",
72
+ "website": "https://johndoe.dev",
73
+ "github": "johndoe",
74
+ "twitter": "johndoe",
75
+ "portfolio": "https://dribbble.com/johndoe",
76
+ "createdAt": "2026-04-01T00:00:00Z",
77
+ "skillCount": 3,
78
+ "totalDownloads": 5200
79
+ }
80
+ ```
81
+
82
+ ---
83
+
84
+ ## API Endpoints
85
+
86
+ Base URL: `https://docs.groovedev.ai/api/v1`
87
+
88
+ ### Public (no auth)
89
+
90
+ #### `GET /skills`
91
+ Returns the full skill registry. This is what the GROOVE daemon fetches on startup.
92
+
93
+ Query params:
94
+ - `search` — text search on name, description, tags
95
+ - `category` — filter by category
96
+ - `sort` — `popular` (default), `rating`, `newest`, `name`
97
+ - `status` — defaults to `published` only
98
+ - `author` — filter by authorId
99
+ - `limit` — pagination (default 50)
100
+ - `offset` — pagination offset
101
+
102
+ Response:
103
+ ```json
104
+ {
105
+ "skills": [ ... ],
106
+ "total": 21,
107
+ "categories": [
108
+ { "id": "devtools", "count": 9 },
109
+ { "id": "quality", "count": 3 }
110
+ ]
111
+ }
112
+ ```
113
+
114
+ **Important:** The response shape must match what the GROOVE daemon expects. The `skills` array uses the same schema as `registry.json` today. The `content` field should NOT be included in list responses (it's large). Only metadata.
115
+
116
+ #### `GET /skills/:id`
117
+ Returns a single skill with full metadata.
118
+
119
+ Response: single skill object (without `content` field)
120
+
121
+ #### `GET /skills/:id/content`
122
+ Returns the full SKILL.md content for a skill.
123
+
124
+ Response:
125
+ ```json
126
+ {
127
+ "id": "frontend-design",
128
+ "content": "---\nname: Frontend Design\n---\n\n..."
129
+ }
130
+ ```
131
+
132
+ #### `GET /skills/registry.json`
133
+ **Backwards compatibility.** Returns the same format as the current static file so older GROOVE versions still work. Just the skills array, no wrapper object.
134
+
135
+ #### `GET /authors/:id`
136
+ Public author profile.
137
+
138
+ Response: author object + their published skills
139
+
140
+ ---
141
+
142
+ ### Authenticated (requires GitHub OAuth token)
143
+
144
+ #### Auth Flow
145
+ - GitHub OAuth (standard web flow)
146
+ - User authorizes, we get GitHub profile
147
+ - Create or update user record
148
+ - Return JWT for subsequent API calls
149
+ - GROOVE daemon does NOT handle auth — this is for the web portal / submission flow
150
+
151
+ #### `POST /skills`
152
+ Submit a new skill.
153
+
154
+ Body:
155
+ ```json
156
+ {
157
+ "name": "My Awesome Skill",
158
+ "description": "Does amazing things...",
159
+ "category": "design",
160
+ "tags": ["ui", "css"],
161
+ "roles": ["frontend"],
162
+ "icon": "A",
163
+ "content": "---\nname: My Awesome Skill\n---\n\nFull SKILL.md content here...",
164
+ "price": 0,
165
+ "version": "1.0.0"
166
+ }
167
+ ```
168
+
169
+ - `id` is auto-generated from slugified `name`
170
+ - `author`, `authorId`, `authorProfile` populated from authenticated user
171
+ - `source` set to `community`
172
+ - `status` set to `draft` initially
173
+ - `downloads`, `rating`, `ratingCount` initialized to 0
174
+
175
+ Response: created skill object
176
+
177
+ #### `PUT /skills/:id`
178
+ Edit an existing skill. Author-only.
179
+
180
+ Body: partial skill object (only changed fields)
181
+
182
+ Restrictions:
183
+ - Can only edit your own skills
184
+ - Cannot change `id`, `authorId`, `source`, `downloads`, `rating`, `ratingCount`
185
+ - Changing `content` bumps `updatedAt`
186
+
187
+ #### `DELETE /skills/:id`
188
+ Remove a skill. Author-only. Sets status to `unlisted` (soft delete).
189
+
190
+ #### `POST /skills/:id/publish`
191
+ Submit a skill for review / publish it.
192
+ - If `price === 0`: auto-publish (set status to `published`)
193
+ - If `price > 0`: set status to `review` (manual review before listing)
194
+
195
+ #### `PUT /authors/me`
196
+ Update your own author profile.
197
+
198
+ Body:
199
+ ```json
200
+ {
201
+ "displayName": "John Doe",
202
+ "bio": "Senior UI designer",
203
+ "website": "https://...",
204
+ "twitter": "johndoe",
205
+ "portfolio": "https://..."
206
+ }
207
+ ```
208
+
209
+ ---
210
+
211
+ ### Future (Payments — don't build yet, but design schema for it)
212
+
213
+ - `POST /skills/:id/purchase` — record a purchase
214
+ - `GET /authors/me/earnings` — seller dashboard
215
+ - Stripe Connect for payouts
216
+ - 80/20 revenue share (creator/platform)
217
+ - Price field already in the skill model, just not enforced yet
218
+
219
+ ---
220
+
221
+ ## Key Design Decisions
222
+
223
+ 1. **Backwards compatible** — `/skills/registry.json` must keep working as a plain JSON array. The GROOVE daemon currently fetches this on startup. Newer daemon versions will switch to `/api/v1/skills`.
224
+
225
+ 2. **Content separate from metadata** — The `content` (full SKILL.md) is large. Never include it in list/registry responses. Only serve it via `/skills/:id/content`.
226
+
227
+ 3. **Soft deletes** — Never hard-delete skills. Set status to `unlisted`.
228
+
229
+ 4. **Download counting** — Increment on install. The GROOVE daemon will POST to `/skills/:id/install` to record an install (new endpoint, unauthenticated, rate-limited by IP).
230
+
231
+ 5. **Rating** — Not building the rating/review system yet, but the fields are in the schema. We'll add `POST /skills/:id/rate` later.
232
+
233
+ 6. **The 21 Anthropic skills** — Seed the database with these. They have `source: "claude-official"` and `author: "Anthropic"`. They should not be editable via the API.
234
+
235
+ 7. **Validation:**
236
+ - `name`: 3-100 chars
237
+ - `description`: 10-500 chars
238
+ - `content`: must be valid markdown, max 50KB
239
+ - `category`: must be one of the enum values
240
+ - `tags`: max 10, each 2-30 chars
241
+ - `icon`: single character
242
+ - `price`: >= 0, max 99.99
243
+
244
+ ---
245
+
246
+ ## Tech Recommendations
247
+
248
+ - Whatever fits the existing docs site stack
249
+ - If starting fresh: Node.js + Express or Hono, SQLite or Postgres
250
+ - GitHub OAuth for auth
251
+ - JWT for session tokens
252
+ - Rate limiting on public endpoints (60/min per IP)
253
+ - CORS: allow `localhost:*` (for GROOVE daemon) + `groovedev.ai` origins
254
+
255
+ ---
256
+
257
+ ## Install Tracking Endpoint
258
+
259
+ Add this for download counting (the GROOVE daemon calls this when a user installs a skill):
260
+
261
+ #### `POST /skills/:id/install`
262
+ Unauthenticated. Rate-limited (1 per skill per IP per hour).
263
+
264
+ Increments the `downloads` counter.
265
+
266
+ Response: `{ "downloads": 1841 }`
267
+
268
+ This replaces the current flow where the daemon downloads from `contentUrl` directly. New flow:
269
+ 1. Daemon calls `POST /api/v1/skills/:id/install` to record the install
270
+ 2. Daemon calls `GET /api/v1/skills/:id/content` to get the SKILL.md
271
+ 3. Daemon saves locally
272
+
273
+ ---
274
+
275
+ ## Seed Data
276
+
277
+ The current `skills-registry.json` in the GROOVE repo has all 21 Anthropic skills with full metadata including downloads, ratings, prices, author profiles, and featured flags. Use this to seed the database.