@better-openclaw/core 1.0.10 → 1.0.12

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 (80) hide show
  1. package/dist/bare-metal-partition.test.mjs +1 -1
  2. package/dist/composer.snapshot.test.mjs +1 -1
  3. package/dist/composer.test.mjs +1 -1
  4. package/dist/generate.d.mts.map +1 -1
  5. package/dist/generate.mjs +7 -1
  6. package/dist/generate.mjs.map +1 -1
  7. package/dist/generate.test.mjs +1 -1
  8. package/dist/generators/bare-metal-install.test.mjs +1 -1
  9. package/dist/generators/caddy.test.d.mts +1 -0
  10. package/dist/generators/caddy.test.mjs +45 -0
  11. package/dist/generators/caddy.test.mjs.map +1 -0
  12. package/dist/generators/env.test.d.mts +1 -0
  13. package/dist/generators/env.test.mjs +60 -0
  14. package/dist/generators/env.test.mjs.map +1 -0
  15. package/dist/generators/health-check.d.mts +18 -0
  16. package/dist/generators/health-check.d.mts.map +1 -0
  17. package/dist/generators/health-check.mjs +705 -0
  18. package/dist/generators/health-check.mjs.map +1 -0
  19. package/dist/generators/health-check.test.d.mts +1 -0
  20. package/dist/generators/health-check.test.mjs +85 -0
  21. package/dist/generators/health-check.test.mjs.map +1 -0
  22. package/dist/generators/scripts.test.d.mts +1 -0
  23. package/dist/generators/scripts.test.mjs +52 -0
  24. package/dist/generators/scripts.test.mjs.map +1 -0
  25. package/dist/generators/traefik.test.mjs +1 -1
  26. package/dist/generators/traefik.test.mjs.map +1 -1
  27. package/dist/index.d.mts +4 -2
  28. package/dist/index.mjs +3 -1
  29. package/dist/{magic-string.es-1uTtupLe.mjs → magic-string.es-CfFonO_S.mjs} +1 -1
  30. package/dist/{magic-string.es-1uTtupLe.mjs.map → magic-string.es-CfFonO_S.mjs.map} +1 -1
  31. package/dist/manifest-DSGl8ITO.mjs +1110 -0
  32. package/dist/manifest-DSGl8ITO.mjs.map +1 -0
  33. package/dist/migrations.d.mts.map +1 -1
  34. package/dist/migrations.mjs.map +1 -1
  35. package/dist/migrations.test.mjs +1 -1
  36. package/dist/migrations.test.mjs.map +1 -1
  37. package/dist/presets/registry.test.mjs +1 -1
  38. package/dist/resolver.test.mjs +1 -1
  39. package/dist/schema.test.mjs +1 -1
  40. package/dist/services/definitions/convex.mjs.map +1 -1
  41. package/dist/services/definitions/desktop-environment.mjs.map +1 -1
  42. package/dist/services/definitions/index.d.mts +2 -2
  43. package/dist/services/definitions/index.mjs +3 -3
  44. package/dist/services/definitions/index.mjs.map +1 -1
  45. package/dist/services/definitions/mission-control.mjs.map +1 -1
  46. package/dist/services/definitions/stream-gateway.mjs.map +1 -1
  47. package/dist/services/registry.test.mjs +1 -1
  48. package/dist/skills/registry.d.mts.map +1 -1
  49. package/dist/skills/registry.mjs +44 -0
  50. package/dist/skills/registry.mjs.map +1 -1
  51. package/dist/skills/skill-manifest.d.mts +20 -0
  52. package/dist/skills/skill-manifest.d.mts.map +1 -0
  53. package/dist/skills/skill-manifest.mjs +20 -0
  54. package/dist/skills/skill-manifest.mjs.map +1 -0
  55. package/dist/validator.test.mjs +1 -1
  56. package/dist/version-manager.test.mjs +1 -1
  57. package/dist/version-manager.test.mjs.map +1 -1
  58. package/dist/{vi.2VT5v0um-YSByewHe.mjs → vi.2VT5v0um-BgmKutxR.mjs} +2 -2
  59. package/dist/{vi.2VT5v0um-YSByewHe.mjs.map → vi.2VT5v0um-BgmKutxR.mjs.map} +1 -1
  60. package/package.json +1 -1
  61. package/src/generate.ts +15 -3
  62. package/src/generators/caddy.test.ts +56 -0
  63. package/src/generators/env.test.ts +73 -0
  64. package/src/generators/health-check.test.ts +118 -0
  65. package/src/generators/health-check.ts +812 -0
  66. package/src/generators/scripts.test.ts +60 -0
  67. package/src/generators/traefik.test.ts +9 -17
  68. package/src/index.ts +12 -6
  69. package/src/migrations.test.ts +1 -1
  70. package/src/migrations.ts +1 -5
  71. package/src/services/definitions/convex.ts +2 -4
  72. package/src/services/definitions/desktop-environment.ts +1 -9
  73. package/src/services/definitions/index.ts +6 -6
  74. package/src/services/definitions/mission-control.ts +2 -4
  75. package/src/services/definitions/stream-gateway.ts +1 -2
  76. package/src/skills/manifest.json +1333 -0
  77. package/src/skills/registry.ts +55 -71
  78. package/src/skills/skill-manifest.ts +57 -0
  79. package/src/version-manager.test.ts +15 -4
  80. package/tsdown.config.ts +6 -6
@@ -70,12 +70,7 @@ const skillPacks: SkillPack[] = [
70
70
  description:
71
71
  "Full social media content pipeline with scheduling, media processing, analytics, and storage",
72
72
  requiredServices: ["postiz", "ffmpeg", "minio", "redis", "postgresql"],
73
- skills: [
74
- "ffmpeg-process",
75
- "minio-storage",
76
- "redis-cache",
77
- "postiz-schedule",
78
- ],
73
+ skills: ["ffmpeg-process", "minio-storage", "redis-cache", "postiz-schedule"],
79
74
  icon: "📱",
80
75
  tags: ["social-media", "content", "scheduling", "analytics"],
81
76
  },
@@ -140,59 +135,34 @@ const skillPacks: SkillPack[] = [
140
135
  description:
141
136
  "Natural language processing with summarization, translation, classification, and embeddings via Ollama",
142
137
  requiredServices: ["ollama"],
143
- skills: [
144
- "text-summarize",
145
- "text-translate",
146
- "text-classify",
147
- "text-embed",
148
- "ollama-local-llm",
149
- ],
138
+ skills: ["text-summarize", "text-translate", "text-classify", "text-embed", "ollama-local-llm"],
150
139
  icon: "🧠",
151
140
  tags: ["nlp", "text", "embeddings", "translation"],
152
141
  },
153
142
  {
154
143
  id: "image-processor",
155
144
  name: "Image Processor",
156
- description:
157
- "Resize, convert, and OCR images with ImageMagick and Tesseract",
145
+ description: "Resize, convert, and OCR images with ImageMagick and Tesseract",
158
146
  requiredServices: ["ffmpeg"],
159
- skills: [
160
- "image-resize",
161
- "image-convert",
162
- "image-ocr",
163
- "ffmpeg-process",
164
- ],
147
+ skills: ["image-resize", "image-convert", "image-ocr", "ffmpeg-process"],
165
148
  icon: "🖼️",
166
149
  tags: ["image", "ocr", "media", "conversion"],
167
150
  },
168
151
  {
169
152
  id: "api-integrator",
170
153
  name: "API Integrator",
171
- description:
172
- "HTTP requests, webhooks, and GraphQL queries for external API integration",
154
+ description: "HTTP requests, webhooks, and GraphQL queries for external API integration",
173
155
  requiredServices: [],
174
- skills: [
175
- "http-request",
176
- "api-webhook",
177
- "graphql-query",
178
- ],
156
+ skills: ["http-request", "api-webhook", "graphql-query"],
179
157
  icon: "🌐",
180
158
  tags: ["api", "http", "webhook", "graphql"],
181
159
  },
182
160
  {
183
161
  id: "security-ops",
184
162
  name: "Security Ops",
185
- description:
186
- "JWT validation, hashing, SSL checks, port scanning, and network diagnostics",
163
+ description: "JWT validation, hashing, SSL checks, port scanning, and network diagnostics",
187
164
  requiredServices: [],
188
- skills: [
189
- "jwt-manage",
190
- "hash-generate",
191
- "ssl-check",
192
- "dns-lookup",
193
- "port-scan",
194
- "ping-check",
195
- ],
165
+ skills: ["jwt-manage", "hash-generate", "ssl-check", "dns-lookup", "port-scan", "ping-check"],
196
166
  icon: "🛡️",
197
167
  tags: ["security", "networking", "diagnostics"],
198
168
  },
@@ -216,8 +186,7 @@ const skillPacks: SkillPack[] = [
216
186
  {
217
187
  id: "analytics-suite",
218
188
  name: "Analytics Suite",
219
- description:
220
- "Web and product analytics with Matomo, Umami, OpenPanel, Grafana, and Prometheus",
189
+ description: "Web and product analytics with Matomo, Umami, OpenPanel, Grafana, and Prometheus",
221
190
  requiredServices: ["grafana", "prometheus"],
222
191
  skills: [
223
192
  "matomo-track",
@@ -253,16 +222,9 @@ const skillPacks: SkillPack[] = [
253
222
  {
254
223
  id: "document-manager",
255
224
  name: "Document Manager",
256
- description:
257
- "Document processing pipeline with wiki, archival, OCR, Q&A, and PDF extraction",
225
+ description: "Document processing pipeline with wiki, archival, OCR, Q&A, and PDF extraction",
258
226
  requiredServices: ["outline", "paperless-ngx"],
259
- skills: [
260
- "outline-wiki",
261
- "paperless-archive",
262
- "docsgpt-ask",
263
- "pdf-extract",
264
- "image-ocr",
265
- ],
227
+ skills: ["outline-wiki", "paperless-archive", "docsgpt-ask", "pdf-extract", "image-ocr"],
266
228
  icon: "📑",
267
229
  tags: ["documents", "wiki", "ocr", "archive"],
268
230
  },
@@ -307,12 +269,7 @@ const skillPacks: SkillPack[] = [
307
269
  description:
308
270
  "Complete self-hosted infrastructure with cloud storage, photos, media streaming, and password management",
309
271
  requiredServices: ["nextcloud", "immich", "jellyfin", "vaultwarden"],
310
- skills: [
311
- "nextcloud-files",
312
- "immich-photos",
313
- "jellyfin-media",
314
- "vaultwarden-manage",
315
- ],
272
+ skills: ["nextcloud-files", "immich-photos", "jellyfin-media", "vaultwarden-manage"],
316
273
  icon: "☁️",
317
274
  tags: ["self-hosted", "cloud", "storage", "media", "security"],
318
275
  },
@@ -335,8 +292,7 @@ const skillPacks: SkillPack[] = [
335
292
  {
336
293
  id: "cicd-pipeline",
337
294
  name: "CI/CD Pipeline",
338
- description:
339
- "Full CI/CD pipeline with Jenkins, ArgoCD, Woodpecker, and infrastructure as code",
295
+ description: "Full CI/CD pipeline with Jenkins, ArgoCD, Woodpecker, and infrastructure as code",
340
296
  requiredServices: ["jenkins"],
341
297
  skills: [
342
298
  "jenkins-pipeline",
@@ -385,8 +341,7 @@ const skillPacks: SkillPack[] = [
385
341
  {
386
342
  id: "backend-platform",
387
343
  name: "Backend Platform",
388
- description:
389
- "Backend-as-a-service with Supabase, Appwrite, PocketBase, and API gateway",
344
+ description: "Backend-as-a-service with Supabase, Appwrite, PocketBase, and API gateway",
390
345
  requiredServices: ["supabase"],
391
346
  skills: [
392
347
  "supabase-query",
@@ -420,12 +375,7 @@ const skillPacks: SkillPack[] = [
420
375
  description:
421
376
  "Document management with Paperless-ngx, BookStack wiki, Stirling PDF tools, and Excalidraw",
422
377
  requiredServices: ["paperless-ngx"],
423
- skills: [
424
- "paperless-ngx-docs",
425
- "bookstack-wiki",
426
- "stirling-pdf-tools",
427
- "excalidraw-draw",
428
- ],
378
+ skills: ["paperless-ngx-docs", "bookstack-wiki", "stirling-pdf-tools", "excalidraw-draw"],
429
379
  icon: "📑",
430
380
  tags: ["documents", "wiki", "pdf", "collaboration"],
431
381
  },
@@ -435,17 +385,51 @@ const skillPacks: SkillPack[] = [
435
385
  description:
436
386
  "Home automation and event-driven workflows with Home Assistant, Huginn, and Activepieces",
437
387
  requiredServices: ["homeassistant"],
438
- skills: [
439
- "home-assistant-automate",
440
- "huginn-automate",
441
- "activepieces-flow",
442
- ],
388
+ skills: ["home-assistant-automate", "huginn-automate", "activepieces-flow"],
443
389
  icon: "🏠",
444
390
  tags: ["iot", "automation", "smart-home", "workflows"],
445
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
+ },
446
431
  ];
447
432
 
448
-
449
433
  const packMap = new Map<string, SkillPack>();
450
434
  for (const pack of skillPacks) {
451
435
  if (packMap.has(pack.id)) {
@@ -0,0 +1,57 @@
1
+ // import { readFileSync } from "node:fs";
2
+ // import { dirname, resolve } from "node:path";
3
+ // import { fileURLToPath } from "node:url";
4
+ //import manifestJson from "../../../../skills/manifest.json" with { type: "json" };
5
+ import manifestJson from "./manifest.json" with { type: "json" };
6
+
7
+ // ── Types ───────────────────────────────────────────────────────────────────
8
+
9
+ export interface SkillManifestEntry {
10
+ /** Unique skill identifier, e.g. "gsap-animate" */
11
+ id: string;
12
+ /** Relative path to the SKILL.md file */
13
+ path: string;
14
+ /** Display emoji */
15
+ emoji: string;
16
+ /** Docker service IDs this skill depends on (empty for frontend-only skills) */
17
+ services: string[];
18
+ }
19
+
20
+ interface SkillManifest {
21
+ skills: SkillManifestEntry[];
22
+ }
23
+
24
+ const manifestData = manifestJson as SkillManifest;
25
+
26
+ // ── Manifest loader ─────────────────────────────────────────────────────────
27
+ // let _cache: SkillManifestEntry[] | null = null;
28
+
29
+ // function loadManifest(): SkillManifestEntry[] {
30
+ // if (_cache) return _cache;
31
+ // // Resolve the manifest relative to this file's location
32
+ // // This file is at packages/core/src/skills/skill-manifest.ts
33
+ // // The manifest is at skills/manifest.json (repo root / skills /)
34
+ // const thisDir = dirname(fileURLToPath(import.meta.url));
35
+ // const manifestPath = resolve(thisDir, "../../../../skills/manifest.json");
36
+ // const raw = readFileSync(manifestPath, "utf-8");
37
+ // const data = JSON.parse(raw) as SkillManifest;
38
+ // _cache = data.skills;
39
+ // return _cache;
40
+ // }
41
+ /** Return all skills defined in the local manifest.json */
42
+ export function getAllManifestSkills(): SkillManifestEntry[] {
43
+ return manifestData.skills;
44
+ //return loadManifest();
45
+ }
46
+
47
+ /** Look up a single skill by ID */
48
+ export function getManifestSkillById(id: string): SkillManifestEntry | undefined {
49
+ return manifestData.skills.find((s) => s.id === id);
50
+ //return loadManifest().find((s) => s.id === id);
51
+ }
52
+
53
+ /** Return the total count of curated skills */
54
+ export function getManifestSkillCount(): number {
55
+ return manifestData.skills.length;
56
+ //return loadManifest().length;
57
+ }
@@ -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 { checkCompatibility, getImageReference, getImageTag, pinImageTags } from "./version-manager.js";
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(warnings.some((w) => w.message.includes("Redis") && w.message.includes("Valkey"))).toBe(true);
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(warnings.some((w) => w.message.includes("Caddy") && w.message.includes("Traefik"))).toBe(true);
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(warnings.filter((w) => w.type === "compatibility" && !w.message.includes("GPU"))).toHaveLength(0);
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
- 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,
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
  });