@better-openclaw/core 1.0.9 → 1.0.11
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/dist/bare-metal-partition.test.mjs +1 -1
- package/dist/composer.snapshot.test.mjs +1 -1
- package/dist/composer.test.mjs +1 -1
- package/dist/generate.d.mts.map +1 -1
- package/dist/generate.mjs +7 -1
- package/dist/generate.mjs.map +1 -1
- package/dist/generate.test.mjs +1 -1
- package/dist/generators/bare-metal-install.test.mjs +1 -1
- package/dist/generators/caddy.test.d.mts +1 -0
- package/dist/generators/caddy.test.mjs +45 -0
- package/dist/generators/caddy.test.mjs.map +1 -0
- package/dist/generators/env.test.d.mts +1 -0
- package/dist/generators/env.test.mjs +60 -0
- package/dist/generators/env.test.mjs.map +1 -0
- package/dist/generators/health-check.d.mts +18 -0
- package/dist/generators/health-check.d.mts.map +1 -0
- package/dist/generators/health-check.mjs +705 -0
- package/dist/generators/health-check.mjs.map +1 -0
- package/dist/generators/health-check.test.d.mts +1 -0
- package/dist/generators/health-check.test.mjs +85 -0
- package/dist/generators/health-check.test.mjs.map +1 -0
- package/dist/generators/scripts.test.d.mts +1 -0
- package/dist/generators/scripts.test.mjs +52 -0
- package/dist/generators/scripts.test.mjs.map +1 -0
- package/dist/generators/traefik.test.mjs +1 -1
- package/dist/generators/traefik.test.mjs.map +1 -1
- package/dist/index.d.mts +4 -2
- package/dist/index.mjs +3 -1
- package/dist/migrations.d.mts.map +1 -1
- package/dist/migrations.mjs.map +1 -1
- package/dist/migrations.test.mjs +1 -1
- package/dist/migrations.test.mjs.map +1 -1
- package/dist/presets/registry.test.mjs +1 -1
- package/dist/resolver.test.mjs +1 -1
- package/dist/schema.test.mjs +1 -1
- package/dist/services/definitions/convex.mjs.map +1 -1
- package/dist/services/definitions/desktop-environment.mjs.map +1 -1
- package/dist/services/definitions/index.d.mts +2 -2
- package/dist/services/definitions/index.mjs +3 -3
- package/dist/services/definitions/index.mjs.map +1 -1
- package/dist/services/definitions/mission-control.mjs.map +1 -1
- package/dist/services/definitions/stream-gateway.mjs.map +1 -1
- package/dist/services/registry.test.mjs +1 -1
- package/dist/skills/registry.d.mts.map +1 -1
- package/dist/skills/registry.mjs +498 -6
- package/dist/skills/registry.mjs.map +1 -1
- package/dist/skills/skill-manifest.d.mts +20 -0
- package/dist/skills/skill-manifest.d.mts.map +1 -0
- package/dist/skills/skill-manifest.mjs +28 -0
- package/dist/skills/skill-manifest.mjs.map +1 -0
- package/dist/validator.test.mjs +1 -1
- package/dist/version-manager.test.mjs +1 -1
- package/dist/version-manager.test.mjs.map +1 -1
- package/dist/{vi.2VT5v0um-Qk6MgAnK.mjs → vi.2VT5v0um-YSByewHe.mjs} +5 -5
- package/dist/{vi.2VT5v0um-Qk6MgAnK.mjs.map → vi.2VT5v0um-YSByewHe.mjs.map} +1 -1
- package/package.json +1 -1
- package/src/generate.ts +15 -3
- package/src/generators/caddy.test.ts +56 -0
- package/src/generators/env.test.ts +73 -0
- package/src/generators/health-check.test.ts +118 -0
- package/src/generators/health-check.ts +774 -0
- package/src/generators/scripts.test.ts +60 -0
- package/src/generators/traefik.test.ts +9 -17
- package/src/index.ts +12 -6
- package/src/migrations.test.ts +1 -1
- package/src/migrations.ts +1 -4
- package/src/services/definitions/convex.ts +2 -4
- package/src/services/definitions/desktop-environment.ts +1 -9
- package/src/services/definitions/index.ts +6 -6
- package/src/services/definitions/mission-control.ts +2 -4
- package/src/services/definitions/stream-gateway.ts +1 -2
- package/src/skills/registry.ts +336 -6
- package/src/skills/skill-manifest.ts +52 -0
- package/src/version-manager.test.ts +15 -4
- package/tsdown.config.ts +6 -6
package/src/skills/registry.ts
CHANGED
|
@@ -35,7 +35,13 @@ const skillPacks: SkillPack[] = [
|
|
|
35
35
|
name: "DevOps",
|
|
36
36
|
description: "Monitor services, automate workflows, and manage infrastructure alerts",
|
|
37
37
|
requiredServices: ["n8n", "redis", "uptime-kuma", "grafana", "prometheus"],
|
|
38
|
-
skills: [
|
|
38
|
+
skills: [
|
|
39
|
+
"n8n-trigger",
|
|
40
|
+
"redis-cache",
|
|
41
|
+
"grafana-dashboard",
|
|
42
|
+
"prometheus-query",
|
|
43
|
+
"uptime-kuma-monitor",
|
|
44
|
+
],
|
|
39
45
|
icon: "⚙️",
|
|
40
46
|
tags: ["devops", "monitoring", "automation"],
|
|
41
47
|
},
|
|
@@ -45,7 +51,7 @@ const skillPacks: SkillPack[] = [
|
|
|
45
51
|
description:
|
|
46
52
|
"Index documents with vector search and full-text search for comprehensive retrieval",
|
|
47
53
|
requiredServices: ["qdrant", "postgresql", "meilisearch"],
|
|
48
|
-
skills: ["qdrant-memory"],
|
|
54
|
+
skills: ["qdrant-memory", "postgresql-query", "meilisearch-index"],
|
|
49
55
|
icon: "📚",
|
|
50
56
|
tags: ["knowledge", "search", "indexing"],
|
|
51
57
|
},
|
|
@@ -64,7 +70,7 @@ const skillPacks: SkillPack[] = [
|
|
|
64
70
|
description:
|
|
65
71
|
"Full social media content pipeline with scheduling, media processing, analytics, and storage",
|
|
66
72
|
requiredServices: ["postiz", "ffmpeg", "minio", "redis", "postgresql"],
|
|
67
|
-
skills: ["ffmpeg-process", "minio-storage", "redis-cache"],
|
|
73
|
+
skills: ["ffmpeg-process", "minio-storage", "redis-cache", "postiz-schedule"],
|
|
68
74
|
icon: "📱",
|
|
69
75
|
tags: ["social-media", "content", "scheduling", "analytics"],
|
|
70
76
|
},
|
|
@@ -74,7 +80,7 @@ const skillPacks: SkillPack[] = [
|
|
|
74
80
|
description:
|
|
75
81
|
"Full AI experimentation stack with chat UIs, LLM gateway, local models, and document chat",
|
|
76
82
|
requiredServices: ["ollama", "open-webui", "litellm"],
|
|
77
|
-
skills: ["ollama-local-llm"],
|
|
83
|
+
skills: ["ollama-local-llm", "open-webui-chat", "litellm-gateway"],
|
|
78
84
|
icon: "🧪",
|
|
79
85
|
tags: ["ai", "llm", "playground", "experimentation"],
|
|
80
86
|
},
|
|
@@ -84,7 +90,7 @@ const skillPacks: SkillPack[] = [
|
|
|
84
90
|
description:
|
|
85
91
|
"AI-powered development environment with coding agents, Git hosting, and browser IDE",
|
|
86
92
|
requiredServices: ["claude-code", "gitea", "code-server"],
|
|
87
|
-
skills: [],
|
|
93
|
+
skills: ["claude-code-assist", "gitea-repo", "code-server-develop"],
|
|
88
94
|
icon: "💻",
|
|
89
95
|
tags: ["coding", "development", "ide", "git"],
|
|
90
96
|
},
|
|
@@ -94,10 +100,334 @@ const skillPacks: SkillPack[] = [
|
|
|
94
100
|
description:
|
|
95
101
|
"Enterprise knowledge management with wiki, document processing, analytics, and vector search",
|
|
96
102
|
requiredServices: ["outline", "paperless-ngx", "qdrant", "postgresql", "redis"],
|
|
97
|
-
skills: [
|
|
103
|
+
skills: [
|
|
104
|
+
"qdrant-memory",
|
|
105
|
+
"outline-wiki",
|
|
106
|
+
"paperless-archive",
|
|
107
|
+
"postgresql-query",
|
|
108
|
+
"redis-cache",
|
|
109
|
+
],
|
|
98
110
|
icon: "📚",
|
|
99
111
|
tags: ["knowledge", "wiki", "documents", "search"],
|
|
100
112
|
},
|
|
113
|
+
// ── New Skill Packs ───────────────────────────────────────────────
|
|
114
|
+
{
|
|
115
|
+
id: "data-engineer",
|
|
116
|
+
name: "Data Engineer",
|
|
117
|
+
description:
|
|
118
|
+
"Process and transform data with PostgreSQL, CSV/JSON/XML transforms, and PDF extraction",
|
|
119
|
+
requiredServices: ["postgresql"],
|
|
120
|
+
skills: [
|
|
121
|
+
"postgresql-query",
|
|
122
|
+
"csv-transform",
|
|
123
|
+
"json-transform",
|
|
124
|
+
"xml-parse",
|
|
125
|
+
"pdf-extract",
|
|
126
|
+
"excel-process",
|
|
127
|
+
"markdown-convert",
|
|
128
|
+
],
|
|
129
|
+
icon: "🔧",
|
|
130
|
+
tags: ["data", "etl", "transform", "processing"],
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
id: "nlp-pipeline",
|
|
134
|
+
name: "NLP Pipeline",
|
|
135
|
+
description:
|
|
136
|
+
"Natural language processing with summarization, translation, classification, and embeddings via Ollama",
|
|
137
|
+
requiredServices: ["ollama"],
|
|
138
|
+
skills: ["text-summarize", "text-translate", "text-classify", "text-embed", "ollama-local-llm"],
|
|
139
|
+
icon: "🧠",
|
|
140
|
+
tags: ["nlp", "text", "embeddings", "translation"],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
id: "image-processor",
|
|
144
|
+
name: "Image Processor",
|
|
145
|
+
description: "Resize, convert, and OCR images with ImageMagick and Tesseract",
|
|
146
|
+
requiredServices: ["ffmpeg"],
|
|
147
|
+
skills: ["image-resize", "image-convert", "image-ocr", "ffmpeg-process"],
|
|
148
|
+
icon: "🖼️",
|
|
149
|
+
tags: ["image", "ocr", "media", "conversion"],
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
id: "api-integrator",
|
|
153
|
+
name: "API Integrator",
|
|
154
|
+
description: "HTTP requests, webhooks, and GraphQL queries for external API integration",
|
|
155
|
+
requiredServices: [],
|
|
156
|
+
skills: ["http-request", "api-webhook", "graphql-query"],
|
|
157
|
+
icon: "🌐",
|
|
158
|
+
tags: ["api", "http", "webhook", "graphql"],
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
id: "security-ops",
|
|
162
|
+
name: "Security Ops",
|
|
163
|
+
description: "JWT validation, hashing, SSL checks, port scanning, and network diagnostics",
|
|
164
|
+
requiredServices: [],
|
|
165
|
+
skills: ["jwt-manage", "hash-generate", "ssl-check", "dns-lookup", "port-scan", "ping-check"],
|
|
166
|
+
icon: "🛡️",
|
|
167
|
+
tags: ["security", "networking", "diagnostics"],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
id: "communication-hub",
|
|
171
|
+
name: "Communication Hub",
|
|
172
|
+
description:
|
|
173
|
+
"Multi-channel messaging with Matrix, Mattermost, Rocket.Chat, email, and push notifications",
|
|
174
|
+
requiredServices: ["matrix-synapse", "gotify"],
|
|
175
|
+
skills: [
|
|
176
|
+
"matrix-message",
|
|
177
|
+
"mattermost-post",
|
|
178
|
+
"rocketchat-send",
|
|
179
|
+
"gotify-notify",
|
|
180
|
+
"ntfy-publish",
|
|
181
|
+
"email-send",
|
|
182
|
+
],
|
|
183
|
+
icon: "📨",
|
|
184
|
+
tags: ["messaging", "notifications", "email", "chat"],
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: "analytics-suite",
|
|
188
|
+
name: "Analytics Suite",
|
|
189
|
+
description: "Web and product analytics with Matomo, Umami, OpenPanel, Grafana, and Prometheus",
|
|
190
|
+
requiredServices: ["grafana", "prometheus"],
|
|
191
|
+
skills: [
|
|
192
|
+
"matomo-track",
|
|
193
|
+
"umami-analytics",
|
|
194
|
+
"openpanel-analyze",
|
|
195
|
+
"grafana-dashboard",
|
|
196
|
+
"prometheus-query",
|
|
197
|
+
],
|
|
198
|
+
icon: "📊",
|
|
199
|
+
tags: ["analytics", "monitoring", "metrics", "dashboards"],
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
id: "full-devops",
|
|
203
|
+
name: "Full DevOps",
|
|
204
|
+
description:
|
|
205
|
+
"Complete DevOps toolkit with Git hosting, container management, deployments, monitoring, and log viewing",
|
|
206
|
+
requiredServices: ["gitea", "portainer", "coolify", "grafana", "prometheus"],
|
|
207
|
+
skills: [
|
|
208
|
+
"gitea-repo",
|
|
209
|
+
"portainer-manage",
|
|
210
|
+
"coolify-deploy",
|
|
211
|
+
"dokploy-deploy",
|
|
212
|
+
"watchtower-update",
|
|
213
|
+
"dozzle-logs",
|
|
214
|
+
"grafana-dashboard",
|
|
215
|
+
"prometheus-query",
|
|
216
|
+
"uptime-kuma-monitor",
|
|
217
|
+
"beszel-monitor",
|
|
218
|
+
],
|
|
219
|
+
icon: "🏗️",
|
|
220
|
+
tags: ["devops", "ci-cd", "containers", "deployment"],
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
id: "document-manager",
|
|
224
|
+
name: "Document Manager",
|
|
225
|
+
description: "Document processing pipeline with wiki, archival, OCR, Q&A, and PDF extraction",
|
|
226
|
+
requiredServices: ["outline", "paperless-ngx"],
|
|
227
|
+
skills: ["outline-wiki", "paperless-archive", "docsgpt-ask", "pdf-extract", "image-ocr"],
|
|
228
|
+
icon: "📑",
|
|
229
|
+
tags: ["documents", "wiki", "ocr", "archive"],
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
id: "ai-coding-team",
|
|
233
|
+
name: "AI Coding Team",
|
|
234
|
+
description:
|
|
235
|
+
"Multi-agent AI coding ensemble with Claude Code, Codex, Gemini CLI, OpenCode, and browser IDE",
|
|
236
|
+
requiredServices: ["code-server", "gitea"],
|
|
237
|
+
skills: [
|
|
238
|
+
"claude-code-assist",
|
|
239
|
+
"codex-generate",
|
|
240
|
+
"gemini-cli-query",
|
|
241
|
+
"opencode-develop",
|
|
242
|
+
"code-server-develop",
|
|
243
|
+
"gitea-repo",
|
|
244
|
+
],
|
|
245
|
+
icon: "🤖",
|
|
246
|
+
tags: ["ai-coding", "agents", "development", "ide"],
|
|
247
|
+
},
|
|
248
|
+
// ── Internet-Verified Skill Packs ────────────────────────────────
|
|
249
|
+
{
|
|
250
|
+
id: "rag-pipeline",
|
|
251
|
+
name: "RAG Pipeline",
|
|
252
|
+
description:
|
|
253
|
+
"Build retrieval-augmented generation systems with LangChain, LlamaIndex, Haystack, and vector databases",
|
|
254
|
+
requiredServices: ["milvus"],
|
|
255
|
+
skills: [
|
|
256
|
+
"langchain-agent",
|
|
257
|
+
"llamaindex-query",
|
|
258
|
+
"haystack-rag",
|
|
259
|
+
"ragflow-pipeline",
|
|
260
|
+
"milvus-vectors",
|
|
261
|
+
"firecrawl-scrape",
|
|
262
|
+
],
|
|
263
|
+
icon: "🧠",
|
|
264
|
+
tags: ["rag", "ai", "embeddings", "search", "llm"],
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
id: "self-hosted-cloud",
|
|
268
|
+
name: "Self-Hosted Cloud",
|
|
269
|
+
description:
|
|
270
|
+
"Complete self-hosted infrastructure with cloud storage, photos, media streaming, and password management",
|
|
271
|
+
requiredServices: ["nextcloud", "immich", "jellyfin", "vaultwarden"],
|
|
272
|
+
skills: ["nextcloud-files", "immich-photos", "jellyfin-media", "vaultwarden-manage"],
|
|
273
|
+
icon: "☁️",
|
|
274
|
+
tags: ["self-hosted", "cloud", "storage", "media", "security"],
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
id: "ai-agent-orchestra",
|
|
278
|
+
name: "AI Agent Orchestra",
|
|
279
|
+
description:
|
|
280
|
+
"Multi-agent AI orchestration with CrewAI, AutoGPT, LangChain, Langflow, and Open Interpreter",
|
|
281
|
+
requiredServices: [],
|
|
282
|
+
skills: [
|
|
283
|
+
"crewai-orchestrate",
|
|
284
|
+
"autogpt-autonomous",
|
|
285
|
+
"langchain-agent",
|
|
286
|
+
"langflow-build",
|
|
287
|
+
"open-interpreter-run",
|
|
288
|
+
],
|
|
289
|
+
icon: "🎭",
|
|
290
|
+
tags: ["ai", "agents", "multi-agent", "orchestration", "autonomous"],
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
id: "cicd-pipeline",
|
|
294
|
+
name: "CI/CD Pipeline",
|
|
295
|
+
description: "Full CI/CD pipeline with Jenkins, ArgoCD, Woodpecker, and infrastructure as code",
|
|
296
|
+
requiredServices: ["jenkins"],
|
|
297
|
+
skills: [
|
|
298
|
+
"jenkins-pipeline",
|
|
299
|
+
"argocd-deploy",
|
|
300
|
+
"woodpecker-ci",
|
|
301
|
+
"terraform-provision",
|
|
302
|
+
"ansible-configure",
|
|
303
|
+
],
|
|
304
|
+
icon: "🔄",
|
|
305
|
+
tags: ["ci-cd", "devops", "gitops", "infrastructure"],
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
id: "zero-trust-security",
|
|
309
|
+
name: "Zero-Trust Security",
|
|
310
|
+
description:
|
|
311
|
+
"Enterprise security with SSO, secrets management, VPN, intrusion detection, and feature flags",
|
|
312
|
+
requiredServices: ["authentik", "crowdsec"],
|
|
313
|
+
skills: [
|
|
314
|
+
"authentik-auth",
|
|
315
|
+
"keycloak-auth",
|
|
316
|
+
"vault-secrets",
|
|
317
|
+
"infisical-secrets",
|
|
318
|
+
"netbird-vpn",
|
|
319
|
+
"teleport-access",
|
|
320
|
+
"crowdsec-protect",
|
|
321
|
+
],
|
|
322
|
+
icon: "🔒",
|
|
323
|
+
tags: ["security", "zero-trust", "sso", "secrets", "vpn"],
|
|
324
|
+
},
|
|
325
|
+
{
|
|
326
|
+
id: "content-platform",
|
|
327
|
+
name: "Content Platform",
|
|
328
|
+
description:
|
|
329
|
+
"Publishing and CMS platform with Ghost, Strapi, Directus, and newsletter management",
|
|
330
|
+
requiredServices: ["ghost"],
|
|
331
|
+
skills: [
|
|
332
|
+
"ghost-publish",
|
|
333
|
+
"strapi-cms",
|
|
334
|
+
"directus-cms",
|
|
335
|
+
"listmonk-email",
|
|
336
|
+
"plausible-analytics",
|
|
337
|
+
],
|
|
338
|
+
icon: "📝",
|
|
339
|
+
tags: ["cms", "publishing", "blog", "newsletter", "analytics"],
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
id: "backend-platform",
|
|
343
|
+
name: "Backend Platform",
|
|
344
|
+
description: "Backend-as-a-service with Supabase, Appwrite, PocketBase, and API gateway",
|
|
345
|
+
requiredServices: ["supabase"],
|
|
346
|
+
skills: [
|
|
347
|
+
"supabase-query",
|
|
348
|
+
"appwrite-backend",
|
|
349
|
+
"pocketbase-backend",
|
|
350
|
+
"kong-gateway",
|
|
351
|
+
"rabbitmq-queue",
|
|
352
|
+
],
|
|
353
|
+
icon: "⚡",
|
|
354
|
+
tags: ["backend", "baas", "api", "database", "messaging"],
|
|
355
|
+
},
|
|
356
|
+
{
|
|
357
|
+
id: "observability-stack",
|
|
358
|
+
name: "Observability Stack",
|
|
359
|
+
description:
|
|
360
|
+
"Full observability with Loki logs, SigNoz APM, Sentry errors, Gatus health, and Elasticsearch",
|
|
361
|
+
requiredServices: ["loki", "signoz"],
|
|
362
|
+
skills: [
|
|
363
|
+
"loki-logs",
|
|
364
|
+
"signoz-observe",
|
|
365
|
+
"sentry-errors",
|
|
366
|
+
"gatus-health",
|
|
367
|
+
"elasticsearch-search",
|
|
368
|
+
],
|
|
369
|
+
icon: "📡",
|
|
370
|
+
tags: ["observability", "logs", "apm", "errors", "health"],
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
id: "document-hub",
|
|
374
|
+
name: "Document Hub",
|
|
375
|
+
description:
|
|
376
|
+
"Document management with Paperless-ngx, BookStack wiki, Stirling PDF tools, and Excalidraw",
|
|
377
|
+
requiredServices: ["paperless-ngx"],
|
|
378
|
+
skills: ["paperless-ngx-docs", "bookstack-wiki", "stirling-pdf-tools", "excalidraw-draw"],
|
|
379
|
+
icon: "📑",
|
|
380
|
+
tags: ["documents", "wiki", "pdf", "collaboration"],
|
|
381
|
+
},
|
|
382
|
+
{
|
|
383
|
+
id: "smart-home",
|
|
384
|
+
name: "Smart Home",
|
|
385
|
+
description:
|
|
386
|
+
"Home automation and event-driven workflows with Home Assistant, Huginn, and Activepieces",
|
|
387
|
+
requiredServices: ["homeassistant"],
|
|
388
|
+
skills: ["home-assistant-automate", "huginn-automate", "activepieces-flow"],
|
|
389
|
+
icon: "🏠",
|
|
390
|
+
tags: ["iot", "automation", "smart-home", "workflows"],
|
|
391
|
+
},
|
|
392
|
+
// ── Aura Build Frontend Design Skills ────────────────────────────
|
|
393
|
+
{
|
|
394
|
+
id: "frontend-design",
|
|
395
|
+
name: "Frontend Design",
|
|
396
|
+
description:
|
|
397
|
+
"Front-end design skills for UI systems, web animations, responsive layouts, copywriting, and asset management — sourced from Aura Build",
|
|
398
|
+
requiredServices: [],
|
|
399
|
+
skills: [
|
|
400
|
+
"ui-prompting",
|
|
401
|
+
"pricing-page-design",
|
|
402
|
+
"landing-page-design",
|
|
403
|
+
"gsap-animate",
|
|
404
|
+
"threejs-scene",
|
|
405
|
+
"matterjs-physics",
|
|
406
|
+
"globe-gl-visualize",
|
|
407
|
+
"tailwindcss-style",
|
|
408
|
+
"css-border-gradient",
|
|
409
|
+
"progressive-blur",
|
|
410
|
+
"animation-on-scroll",
|
|
411
|
+
"css-alpha-masking",
|
|
412
|
+
"vantajs-background",
|
|
413
|
+
"cobejs-globe",
|
|
414
|
+
"unicorn-studio-embed",
|
|
415
|
+
"ui-design-system",
|
|
416
|
+
"tailwind-design-system-v4",
|
|
417
|
+
"interaction-design",
|
|
418
|
+
"responsive-design",
|
|
419
|
+
"web-interface-guidelines",
|
|
420
|
+
"threejs-animation",
|
|
421
|
+
"copywriting",
|
|
422
|
+
"frontend-distinctive-design",
|
|
423
|
+
"canvas-design",
|
|
424
|
+
"web-design-reviewer",
|
|
425
|
+
"animejs-animate",
|
|
426
|
+
"aura-asset-images",
|
|
427
|
+
],
|
|
428
|
+
icon: "🎨",
|
|
429
|
+
tags: ["frontend", "design", "animation", "css", "ui", "web-design"],
|
|
430
|
+
},
|
|
101
431
|
];
|
|
102
432
|
|
|
103
433
|
const packMap = new Map<string, SkillPack>();
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
|
|
5
|
+
// ── Types ───────────────────────────────────────────────────────────────────
|
|
6
|
+
|
|
7
|
+
export interface SkillManifestEntry {
|
|
8
|
+
/** Unique skill identifier, e.g. "gsap-animate" */
|
|
9
|
+
id: string;
|
|
10
|
+
/** Relative path to the SKILL.md file */
|
|
11
|
+
path: string;
|
|
12
|
+
/** Display emoji */
|
|
13
|
+
emoji: string;
|
|
14
|
+
/** Docker service IDs this skill depends on (empty for frontend-only skills) */
|
|
15
|
+
services: string[];
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface SkillManifest {
|
|
19
|
+
skills: SkillManifestEntry[];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// ── Manifest loader ─────────────────────────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
let _cache: SkillManifestEntry[] | null = null;
|
|
25
|
+
|
|
26
|
+
function loadManifest(): SkillManifestEntry[] {
|
|
27
|
+
if (_cache) return _cache;
|
|
28
|
+
// Resolve the manifest relative to this file's location
|
|
29
|
+
// This file is at packages/core/src/skills/skill-manifest.ts
|
|
30
|
+
// The manifest is at skills/manifest.json (repo root / skills /)
|
|
31
|
+
const thisDir = dirname(fileURLToPath(import.meta.url));
|
|
32
|
+
const manifestPath = resolve(thisDir, "../../../../skills/manifest.json");
|
|
33
|
+
const raw = readFileSync(manifestPath, "utf-8");
|
|
34
|
+
const data = JSON.parse(raw) as SkillManifest;
|
|
35
|
+
_cache = data.skills;
|
|
36
|
+
return _cache;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Return all skills defined in the local manifest.json */
|
|
40
|
+
export function getAllManifestSkills(): SkillManifestEntry[] {
|
|
41
|
+
return loadManifest();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Look up a single skill by ID */
|
|
45
|
+
export function getManifestSkillById(id: string): SkillManifestEntry | undefined {
|
|
46
|
+
return loadManifest().find((s) => s.id === id);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Return the total count of curated skills */
|
|
50
|
+
export function getManifestSkillCount(): number {
|
|
51
|
+
return loadManifest().length;
|
|
52
|
+
}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { resolve } from "./resolver.js";
|
|
3
3
|
import { getAllServices, getServiceById } from "./services/registry.js";
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
checkCompatibility,
|
|
6
|
+
getImageReference,
|
|
7
|
+
getImageTag,
|
|
8
|
+
pinImageTags,
|
|
9
|
+
} from "./version-manager.js";
|
|
5
10
|
|
|
6
11
|
describe("getImageTag", () => {
|
|
7
12
|
it("returns the tag for a known service", () => {
|
|
@@ -88,7 +93,9 @@ describe("checkCompatibility", () => {
|
|
|
88
93
|
|
|
89
94
|
if (redis && valkey) {
|
|
90
95
|
const warnings = checkCompatibility([redis, valkey]);
|
|
91
|
-
expect(
|
|
96
|
+
expect(
|
|
97
|
+
warnings.some((w) => w.message.includes("Redis") && w.message.includes("Valkey")),
|
|
98
|
+
).toBe(true);
|
|
92
99
|
}
|
|
93
100
|
});
|
|
94
101
|
|
|
@@ -99,7 +106,9 @@ describe("checkCompatibility", () => {
|
|
|
99
106
|
|
|
100
107
|
if (caddy && traefik) {
|
|
101
108
|
const warnings = checkCompatibility([caddy, traefik]);
|
|
102
|
-
expect(
|
|
109
|
+
expect(
|
|
110
|
+
warnings.some((w) => w.message.includes("Caddy") && w.message.includes("Traefik")),
|
|
111
|
+
).toBe(true);
|
|
103
112
|
}
|
|
104
113
|
});
|
|
105
114
|
|
|
@@ -128,7 +137,9 @@ describe("checkCompatibility", () => {
|
|
|
128
137
|
const redis = getServiceById("redis");
|
|
129
138
|
if (redis) {
|
|
130
139
|
const warnings = checkCompatibility([redis]);
|
|
131
|
-
expect(
|
|
140
|
+
expect(
|
|
141
|
+
warnings.filter((w) => w.type === "compatibility" && !w.message.includes("GPU")),
|
|
142
|
+
).toHaveLength(0);
|
|
132
143
|
}
|
|
133
144
|
});
|
|
134
145
|
});
|
package/tsdown.config.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { defineConfig } from "tsdown";
|
|
2
2
|
|
|
3
3
|
export default defineConfig({
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
entry: "src/**/*.ts",
|
|
5
|
+
format: ["esm"],
|
|
6
|
+
sourcemap: true,
|
|
7
|
+
clean: true,
|
|
8
|
+
dts: true, // Turn off dts generation if not needed for an app, speeds up build
|
|
9
|
+
inlineOnly: false,
|
|
10
10
|
});
|