@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.mjs","names":[],"sources":["../../src/skills/registry.ts"],"sourcesContent":["import type { SkillPack } from \"../types.js\";\n\nconst skillPacks: SkillPack[] = [\n\t{\n\t\tid: \"video-creator\",\n\t\tname: \"Video Creator\",\n\t\tdescription:\n\t\t\t\"Create and process videos programmatically with FFmpeg, Remotion, and MinIO storage\",\n\t\trequiredServices: [\"ffmpeg\", \"remotion\", \"minio\"],\n\t\tskills: [\"ffmpeg-process\", \"remotion-render\", \"minio-storage\"],\n\t\ticon: \"🎬\",\n\t\ttags: [\"video\", \"media\", \"rendering\"],\n\t},\n\t{\n\t\tid: \"research-agent\",\n\t\tname: \"Research Agent\",\n\t\tdescription: \"Research the web, store findings in vector memory, and scrape full pages\",\n\t\trequiredServices: [\"qdrant\", \"searxng\", \"browserless\"],\n\t\tskills: [\"qdrant-memory\", \"searxng-search\", \"browserless-browse\"],\n\t\ticon: \"🔬\",\n\t\ttags: [\"research\", \"rag\", \"web-scraping\"],\n\t},\n\t{\n\t\tid: \"social-media\",\n\t\tname: \"Social Media\",\n\t\tdescription:\n\t\t\t\"Process and manage social media content with video tools, caching, and asset storage\",\n\t\trequiredServices: [\"ffmpeg\", \"redis\", \"minio\"],\n\t\tskills: [\"ffmpeg-process\", \"redis-cache\", \"minio-storage\"],\n\t\ticon: \"📱\",\n\t\ttags: [\"social\", \"content\", \"scheduling\"],\n\t},\n\t{\n\t\tid: \"dev-ops\",\n\t\tname: \"DevOps\",\n\t\tdescription: \"Monitor services, automate workflows, and manage infrastructure alerts\",\n\t\trequiredServices: [\"n8n\", \"redis\", \"uptime-kuma\", \"grafana\", \"prometheus\"],\n\t\tskills: [\"n8n-trigger\", \"redis-cache\"],\n\t\ticon: \"⚙️\",\n\t\ttags: [\"devops\", \"monitoring\", \"automation\"],\n\t},\n\t{\n\t\tid: \"knowledge-base\",\n\t\tname: \"Knowledge Base\",\n\t\tdescription:\n\t\t\t\"Index documents with vector search and full-text search for comprehensive retrieval\",\n\t\trequiredServices: [\"qdrant\", \"postgresql\", \"meilisearch\"],\n\t\tskills: [\"qdrant-memory\"],\n\t\ticon: \"📚\",\n\t\ttags: [\"knowledge\", \"search\", \"indexing\"],\n\t},\n\t{\n\t\tid: \"local-ai\",\n\t\tname: \"Local AI\",\n\t\tdescription: \"Run local LLM inference and speech-to-text transcription without external APIs\",\n\t\trequiredServices: [\"ollama\", \"whisper\"],\n\t\tskills: [\"ollama-local-llm\", \"whisper-transcribe\"],\n\t\ticon: \"🤖\",\n\t\ttags: [\"local-llm\", \"transcription\", \"offline\"],\n\t},\n\t{\n\t\tid: \"content-creator\",\n\t\tname: \"Content Creator\",\n\t\tdescription:\n\t\t\t\"Full social media content pipeline with scheduling, media processing, analytics, and storage\",\n\t\trequiredServices: [\"postiz\", \"ffmpeg\", \"minio\", \"redis\", \"postgresql\"],\n\t\tskills: [\"ffmpeg-process\", \"minio-storage\", \"redis-cache\"],\n\t\ticon: \"📱\",\n\t\ttags: [\"social-media\", \"content\", \"scheduling\", \"analytics\"],\n\t},\n\t{\n\t\tid: \"ai-playground\",\n\t\tname: \"AI Playground\",\n\t\tdescription:\n\t\t\t\"Full AI experimentation stack with chat UIs, LLM gateway, local models, and document chat\",\n\t\trequiredServices: [\"ollama\", \"open-webui\", \"litellm\"],\n\t\tskills: [\"ollama-local-llm\"],\n\t\ticon: \"🧪\",\n\t\ttags: [\"ai\", \"llm\", \"playground\", \"experimentation\"],\n\t},\n\t{\n\t\tid: \"coding-team\",\n\t\tname: \"Coding Team\",\n\t\tdescription:\n\t\t\t\"AI-powered development environment with coding agents, Git hosting, and browser IDE\",\n\t\trequiredServices: [\"claude-code\", \"gitea\", \"code-server\"],\n\t\tskills: [],\n\t\ticon: \"💻\",\n\t\ttags: [\"coding\", \"development\", \"ide\", \"git\"],\n\t},\n\t{\n\t\tid: \"knowledge-hub\",\n\t\tname: \"Knowledge Hub\",\n\t\tdescription:\n\t\t\t\"Enterprise knowledge management with wiki, document processing, analytics, and vector search\",\n\t\trequiredServices: [\"outline\", \"paperless-ngx\", \"qdrant\", \"postgresql\", \"redis\"],\n\t\tskills: [\"qdrant-memory\"],\n\t\ticon: \"📚\",\n\t\ttags: [\"knowledge\", \"wiki\", \"documents\", \"search\"],\n\t},\n];\n\nconst packMap = new Map<string, SkillPack>();\nfor (const pack of skillPacks) {\n\tif (packMap.has(pack.id)) {\n\t\tthrow new Error(`Duplicate skill pack ID: \"${pack.id}\"`);\n\t}\n\tpackMap.set(pack.id, pack);\n}\n\nexport const skillPackRegistry: ReadonlyMap<string, SkillPack> = packMap;\n\nexport function getSkillPackById(id: string): SkillPack | undefined {\n\treturn packMap.get(id);\n}\n\nexport function getAllSkillPacks(): SkillPack[] {\n\treturn [...skillPacks];\n}\n\n/** Get skill packs whose required services are all present in the given service list */\nexport function getCompatibleSkillPacks(availableServiceIds: string[]): SkillPack[] {\n\treturn skillPacks.filter((pack) =>\n\t\tpack.requiredServices.every((req) => availableServiceIds.includes(req)),\n\t);\n}\n"],"mappings":";AAEA,MAAM,aAA0B;CAC/B;EACC,IAAI;EACJ,MAAM;EACN,aACC;EACD,kBAAkB;GAAC;GAAU;GAAY;GAAQ;EACjD,QAAQ;GAAC;GAAkB;GAAmB;GAAgB;EAC9D,MAAM;EACN,MAAM;GAAC;GAAS;GAAS;GAAY;EACrC;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,kBAAkB;GAAC;GAAU;GAAW;GAAc;EACtD,QAAQ;GAAC;GAAiB;GAAkB;GAAqB;EACjE,MAAM;EACN,MAAM;GAAC;GAAY;GAAO;GAAe;EACzC;CACD;EACC,IAAI;EACJ,MAAM;EACN,aACC;EACD,kBAAkB;GAAC;GAAU;GAAS;GAAQ;EAC9C,QAAQ;GAAC;GAAkB;GAAe;GAAgB;EAC1D,MAAM;EACN,MAAM;GAAC;GAAU;GAAW;GAAa;EACzC;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,kBAAkB;GAAC;GAAO;GAAS;GAAe;GAAW;GAAa;EAC1E,QAAQ,CAAC,eAAe,cAAc;EACtC,MAAM;EACN,MAAM;GAAC;GAAU;GAAc;GAAa;EAC5C;CACD;EACC,IAAI;EACJ,MAAM;EACN,aACC;EACD,kBAAkB;GAAC;GAAU;GAAc;GAAc;EACzD,QAAQ,CAAC,gBAAgB;EACzB,MAAM;EACN,MAAM;GAAC;GAAa;GAAU;GAAW;EACzC;CACD;EACC,IAAI;EACJ,MAAM;EACN,aAAa;EACb,kBAAkB,CAAC,UAAU,UAAU;EACvC,QAAQ,CAAC,oBAAoB,qBAAqB;EAClD,MAAM;EACN,MAAM;GAAC;GAAa;GAAiB;GAAU;EAC/C;CACD;EACC,IAAI;EACJ,MAAM;EACN,aACC;EACD,kBAAkB;GAAC;GAAU;GAAU;GAAS;GAAS;GAAa;EACtE,QAAQ;GAAC;GAAkB;GAAiB;GAAc;EAC1D,MAAM;EACN,MAAM;GAAC;GAAgB;GAAW;GAAc;GAAY;EAC5D;CACD;EACC,IAAI;EACJ,MAAM;EACN,aACC;EACD,kBAAkB;GAAC;GAAU;GAAc;GAAU;EACrD,QAAQ,CAAC,mBAAmB;EAC5B,MAAM;EACN,MAAM;GAAC;GAAM;GAAO;GAAc;GAAkB;EACpD;CACD;EACC,IAAI;EACJ,MAAM;EACN,aACC;EACD,kBAAkB;GAAC;GAAe;GAAS;GAAc;EACzD,QAAQ,EAAE;EACV,MAAM;EACN,MAAM;GAAC;GAAU;GAAe;GAAO;GAAM;EAC7C;CACD;EACC,IAAI;EACJ,MAAM;EACN,aACC;EACD,kBAAkB;GAAC;GAAW;GAAiB;GAAU;GAAc;GAAQ;EAC/E,QAAQ,CAAC,gBAAgB;EACzB,MAAM;EACN,MAAM;GAAC;GAAa;GAAQ;GAAa;GAAS;EAClD;CACD;AAED,MAAM,0BAAU,IAAI,KAAwB;AAC5C,KAAK,MAAM,QAAQ,YAAY;AAC9B,KAAI,QAAQ,IAAI,KAAK,GAAG,CACvB,OAAM,IAAI,MAAM,6BAA6B,KAAK,GAAG,GAAG;AAEzD,SAAQ,IAAI,KAAK,IAAI,KAAK;;AAG3B,MAAa,oBAAoD;AAEjE,SAAgB,iBAAiB,IAAmC;AACnE,QAAO,QAAQ,IAAI,GAAG;;AAGvB,SAAgB,mBAAgC;AAC/C,QAAO,CAAC,GAAG,WAAW;;;AAIvB,SAAgB,wBAAwB,qBAA4C;AACnF,QAAO,WAAW,QAAQ,SACzB,KAAK,iBAAiB,OAAO,QAAQ,oBAAoB,SAAS,IAAI,CAAC,CACvE"}
|
|
1
|
+
{"version":3,"file":"registry.mjs","names":[],"sources":["../../src/skills/registry.ts"],"sourcesContent":["import type { SkillPack } from \"../types.js\";\n\nconst skillPacks: SkillPack[] = [\n\t{\n\t\tid: \"video-creator\",\n\t\tname: \"Video Creator\",\n\t\tdescription:\n\t\t\t\"Create and process videos programmatically with FFmpeg, Remotion, and MinIO storage\",\n\t\trequiredServices: [\"ffmpeg\", \"remotion\", \"minio\"],\n\t\tskills: [\"ffmpeg-process\", \"remotion-render\", \"minio-storage\"],\n\t\ticon: \"🎬\",\n\t\ttags: [\"video\", \"media\", \"rendering\"],\n\t},\n\t{\n\t\tid: \"research-agent\",\n\t\tname: \"Research Agent\",\n\t\tdescription: \"Research the web, store findings in vector memory, and scrape full pages\",\n\t\trequiredServices: [\"qdrant\", \"searxng\", \"browserless\"],\n\t\tskills: [\"qdrant-memory\", \"searxng-search\", \"browserless-browse\"],\n\t\ticon: \"🔬\",\n\t\ttags: [\"research\", \"rag\", \"web-scraping\"],\n\t},\n\t{\n\t\tid: \"social-media\",\n\t\tname: \"Social Media\",\n\t\tdescription:\n\t\t\t\"Process and manage social media content with video tools, caching, and asset storage\",\n\t\trequiredServices: [\"ffmpeg\", \"redis\", \"minio\"],\n\t\tskills: [\"ffmpeg-process\", \"redis-cache\", \"minio-storage\"],\n\t\ticon: \"📱\",\n\t\ttags: [\"social\", \"content\", \"scheduling\"],\n\t},\n\t{\n\t\tid: \"dev-ops\",\n\t\tname: \"DevOps\",\n\t\tdescription: \"Monitor services, automate workflows, and manage infrastructure alerts\",\n\t\trequiredServices: [\"n8n\", \"redis\", \"uptime-kuma\", \"grafana\", \"prometheus\"],\n\t\tskills: [\n\t\t\t\"n8n-trigger\",\n\t\t\t\"redis-cache\",\n\t\t\t\"grafana-dashboard\",\n\t\t\t\"prometheus-query\",\n\t\t\t\"uptime-kuma-monitor\",\n\t\t],\n\t\ticon: \"⚙️\",\n\t\ttags: [\"devops\", \"monitoring\", \"automation\"],\n\t},\n\t{\n\t\tid: \"knowledge-base\",\n\t\tname: \"Knowledge Base\",\n\t\tdescription:\n\t\t\t\"Index documents with vector search and full-text search for comprehensive retrieval\",\n\t\trequiredServices: [\"qdrant\", \"postgresql\", \"meilisearch\"],\n\t\tskills: [\"qdrant-memory\", \"postgresql-query\", \"meilisearch-index\"],\n\t\ticon: \"📚\",\n\t\ttags: [\"knowledge\", \"search\", \"indexing\"],\n\t},\n\t{\n\t\tid: \"local-ai\",\n\t\tname: \"Local AI\",\n\t\tdescription: \"Run local LLM inference and speech-to-text transcription without external APIs\",\n\t\trequiredServices: [\"ollama\", \"whisper\"],\n\t\tskills: [\"ollama-local-llm\", \"whisper-transcribe\"],\n\t\ticon: \"🤖\",\n\t\ttags: [\"local-llm\", \"transcription\", \"offline\"],\n\t},\n\t{\n\t\tid: \"content-creator\",\n\t\tname: \"Content Creator\",\n\t\tdescription:\n\t\t\t\"Full social media content pipeline with scheduling, media processing, analytics, and storage\",\n\t\trequiredServices: [\"postiz\", \"ffmpeg\", \"minio\", \"redis\", \"postgresql\"],\n\t\tskills: [\"ffmpeg-process\", \"minio-storage\", \"redis-cache\", \"postiz-schedule\"],\n\t\ticon: \"📱\",\n\t\ttags: [\"social-media\", \"content\", \"scheduling\", \"analytics\"],\n\t},\n\t{\n\t\tid: \"ai-playground\",\n\t\tname: \"AI Playground\",\n\t\tdescription:\n\t\t\t\"Full AI experimentation stack with chat UIs, LLM gateway, local models, and document chat\",\n\t\trequiredServices: [\"ollama\", \"open-webui\", \"litellm\"],\n\t\tskills: [\"ollama-local-llm\", \"open-webui-chat\", \"litellm-gateway\"],\n\t\ticon: \"🧪\",\n\t\ttags: [\"ai\", \"llm\", \"playground\", \"experimentation\"],\n\t},\n\t{\n\t\tid: \"coding-team\",\n\t\tname: \"Coding Team\",\n\t\tdescription:\n\t\t\t\"AI-powered development environment with coding agents, Git hosting, and browser IDE\",\n\t\trequiredServices: [\"claude-code\", \"gitea\", \"code-server\"],\n\t\tskills: [\"claude-code-assist\", \"gitea-repo\", \"code-server-develop\"],\n\t\ticon: \"💻\",\n\t\ttags: [\"coding\", \"development\", \"ide\", \"git\"],\n\t},\n\t{\n\t\tid: \"knowledge-hub\",\n\t\tname: \"Knowledge Hub\",\n\t\tdescription:\n\t\t\t\"Enterprise knowledge management with wiki, document processing, analytics, and vector search\",\n\t\trequiredServices: [\"outline\", \"paperless-ngx\", \"qdrant\", \"postgresql\", \"redis\"],\n\t\tskills: [\n\t\t\t\"qdrant-memory\",\n\t\t\t\"outline-wiki\",\n\t\t\t\"paperless-archive\",\n\t\t\t\"postgresql-query\",\n\t\t\t\"redis-cache\",\n\t\t],\n\t\ticon: \"📚\",\n\t\ttags: [\"knowledge\", \"wiki\", \"documents\", \"search\"],\n\t},\n\t// ── New Skill Packs ───────────────────────────────────────────────\n\t{\n\t\tid: \"data-engineer\",\n\t\tname: \"Data Engineer\",\n\t\tdescription:\n\t\t\t\"Process and transform data with PostgreSQL, CSV/JSON/XML transforms, and PDF extraction\",\n\t\trequiredServices: [\"postgresql\"],\n\t\tskills: [\n\t\t\t\"postgresql-query\",\n\t\t\t\"csv-transform\",\n\t\t\t\"json-transform\",\n\t\t\t\"xml-parse\",\n\t\t\t\"pdf-extract\",\n\t\t\t\"excel-process\",\n\t\t\t\"markdown-convert\",\n\t\t],\n\t\ticon: \"🔧\",\n\t\ttags: [\"data\", \"etl\", \"transform\", \"processing\"],\n\t},\n\t{\n\t\tid: \"nlp-pipeline\",\n\t\tname: \"NLP Pipeline\",\n\t\tdescription:\n\t\t\t\"Natural language processing with summarization, translation, classification, and embeddings via Ollama\",\n\t\trequiredServices: [\"ollama\"],\n\t\tskills: [\"text-summarize\", \"text-translate\", \"text-classify\", \"text-embed\", \"ollama-local-llm\"],\n\t\ticon: \"🧠\",\n\t\ttags: [\"nlp\", \"text\", \"embeddings\", \"translation\"],\n\t},\n\t{\n\t\tid: \"image-processor\",\n\t\tname: \"Image Processor\",\n\t\tdescription: \"Resize, convert, and OCR images with ImageMagick and Tesseract\",\n\t\trequiredServices: [\"ffmpeg\"],\n\t\tskills: [\"image-resize\", \"image-convert\", \"image-ocr\", \"ffmpeg-process\"],\n\t\ticon: \"🖼️\",\n\t\ttags: [\"image\", \"ocr\", \"media\", \"conversion\"],\n\t},\n\t{\n\t\tid: \"api-integrator\",\n\t\tname: \"API Integrator\",\n\t\tdescription: \"HTTP requests, webhooks, and GraphQL queries for external API integration\",\n\t\trequiredServices: [],\n\t\tskills: [\"http-request\", \"api-webhook\", \"graphql-query\"],\n\t\ticon: \"🌐\",\n\t\ttags: [\"api\", \"http\", \"webhook\", \"graphql\"],\n\t},\n\t{\n\t\tid: \"security-ops\",\n\t\tname: \"Security Ops\",\n\t\tdescription: \"JWT validation, hashing, SSL checks, port scanning, and network diagnostics\",\n\t\trequiredServices: [],\n\t\tskills: [\"jwt-manage\", \"hash-generate\", \"ssl-check\", \"dns-lookup\", \"port-scan\", \"ping-check\"],\n\t\ticon: \"🛡️\",\n\t\ttags: [\"security\", \"networking\", \"diagnostics\"],\n\t},\n\t{\n\t\tid: \"communication-hub\",\n\t\tname: \"Communication Hub\",\n\t\tdescription:\n\t\t\t\"Multi-channel messaging with Matrix, Mattermost, Rocket.Chat, email, and push notifications\",\n\t\trequiredServices: [\"matrix-synapse\", \"gotify\"],\n\t\tskills: [\n\t\t\t\"matrix-message\",\n\t\t\t\"mattermost-post\",\n\t\t\t\"rocketchat-send\",\n\t\t\t\"gotify-notify\",\n\t\t\t\"ntfy-publish\",\n\t\t\t\"email-send\",\n\t\t],\n\t\ticon: \"📨\",\n\t\ttags: [\"messaging\", \"notifications\", \"email\", \"chat\"],\n\t},\n\t{\n\t\tid: \"analytics-suite\",\n\t\tname: \"Analytics Suite\",\n\t\tdescription: \"Web and product analytics with Matomo, Umami, OpenPanel, Grafana, and Prometheus\",\n\t\trequiredServices: [\"grafana\", \"prometheus\"],\n\t\tskills: [\n\t\t\t\"matomo-track\",\n\t\t\t\"umami-analytics\",\n\t\t\t\"openpanel-analyze\",\n\t\t\t\"grafana-dashboard\",\n\t\t\t\"prometheus-query\",\n\t\t],\n\t\ticon: \"📊\",\n\t\ttags: [\"analytics\", \"monitoring\", \"metrics\", \"dashboards\"],\n\t},\n\t{\n\t\tid: \"full-devops\",\n\t\tname: \"Full DevOps\",\n\t\tdescription:\n\t\t\t\"Complete DevOps toolkit with Git hosting, container management, deployments, monitoring, and log viewing\",\n\t\trequiredServices: [\"gitea\", \"portainer\", \"coolify\", \"grafana\", \"prometheus\"],\n\t\tskills: [\n\t\t\t\"gitea-repo\",\n\t\t\t\"portainer-manage\",\n\t\t\t\"coolify-deploy\",\n\t\t\t\"dokploy-deploy\",\n\t\t\t\"watchtower-update\",\n\t\t\t\"dozzle-logs\",\n\t\t\t\"grafana-dashboard\",\n\t\t\t\"prometheus-query\",\n\t\t\t\"uptime-kuma-monitor\",\n\t\t\t\"beszel-monitor\",\n\t\t],\n\t\ticon: \"🏗️\",\n\t\ttags: [\"devops\", \"ci-cd\", \"containers\", \"deployment\"],\n\t},\n\t{\n\t\tid: \"document-manager\",\n\t\tname: \"Document Manager\",\n\t\tdescription: \"Document processing pipeline with wiki, archival, OCR, Q&A, and PDF extraction\",\n\t\trequiredServices: [\"outline\", \"paperless-ngx\"],\n\t\tskills: [\"outline-wiki\", \"paperless-archive\", \"docsgpt-ask\", \"pdf-extract\", \"image-ocr\"],\n\t\ticon: \"📑\",\n\t\ttags: [\"documents\", \"wiki\", \"ocr\", \"archive\"],\n\t},\n\t{\n\t\tid: \"ai-coding-team\",\n\t\tname: \"AI Coding Team\",\n\t\tdescription:\n\t\t\t\"Multi-agent AI coding ensemble with Claude Code, Codex, Gemini CLI, OpenCode, and browser IDE\",\n\t\trequiredServices: [\"code-server\", \"gitea\"],\n\t\tskills: [\n\t\t\t\"claude-code-assist\",\n\t\t\t\"codex-generate\",\n\t\t\t\"gemini-cli-query\",\n\t\t\t\"opencode-develop\",\n\t\t\t\"code-server-develop\",\n\t\t\t\"gitea-repo\",\n\t\t],\n\t\ticon: \"🤖\",\n\t\ttags: [\"ai-coding\", \"agents\", \"development\", \"ide\"],\n\t},\n\t// ── Internet-Verified Skill Packs ────────────────────────────────\n\t{\n\t\tid: \"rag-pipeline\",\n\t\tname: \"RAG Pipeline\",\n\t\tdescription:\n\t\t\t\"Build retrieval-augmented generation systems with LangChain, LlamaIndex, Haystack, and vector databases\",\n\t\trequiredServices: [\"milvus\"],\n\t\tskills: [\n\t\t\t\"langchain-agent\",\n\t\t\t\"llamaindex-query\",\n\t\t\t\"haystack-rag\",\n\t\t\t\"ragflow-pipeline\",\n\t\t\t\"milvus-vectors\",\n\t\t\t\"firecrawl-scrape\",\n\t\t],\n\t\ticon: \"🧠\",\n\t\ttags: [\"rag\", \"ai\", \"embeddings\", \"search\", \"llm\"],\n\t},\n\t{\n\t\tid: \"self-hosted-cloud\",\n\t\tname: \"Self-Hosted Cloud\",\n\t\tdescription:\n\t\t\t\"Complete self-hosted infrastructure with cloud storage, photos, media streaming, and password management\",\n\t\trequiredServices: [\"nextcloud\", \"immich\", \"jellyfin\", \"vaultwarden\"],\n\t\tskills: [\"nextcloud-files\", \"immich-photos\", \"jellyfin-media\", \"vaultwarden-manage\"],\n\t\ticon: \"☁️\",\n\t\ttags: [\"self-hosted\", \"cloud\", \"storage\", \"media\", \"security\"],\n\t},\n\t{\n\t\tid: \"ai-agent-orchestra\",\n\t\tname: \"AI Agent Orchestra\",\n\t\tdescription:\n\t\t\t\"Multi-agent AI orchestration with CrewAI, AutoGPT, LangChain, Langflow, and Open Interpreter\",\n\t\trequiredServices: [],\n\t\tskills: [\n\t\t\t\"crewai-orchestrate\",\n\t\t\t\"autogpt-autonomous\",\n\t\t\t\"langchain-agent\",\n\t\t\t\"langflow-build\",\n\t\t\t\"open-interpreter-run\",\n\t\t],\n\t\ticon: \"🎭\",\n\t\ttags: [\"ai\", \"agents\", \"multi-agent\", \"orchestration\", \"autonomous\"],\n\t},\n\t{\n\t\tid: \"cicd-pipeline\",\n\t\tname: \"CI/CD Pipeline\",\n\t\tdescription: \"Full CI/CD pipeline with Jenkins, ArgoCD, Woodpecker, and infrastructure as code\",\n\t\trequiredServices: [\"jenkins\"],\n\t\tskills: [\n\t\t\t\"jenkins-pipeline\",\n\t\t\t\"argocd-deploy\",\n\t\t\t\"woodpecker-ci\",\n\t\t\t\"terraform-provision\",\n\t\t\t\"ansible-configure\",\n\t\t],\n\t\ticon: \"🔄\",\n\t\ttags: [\"ci-cd\", \"devops\", \"gitops\", \"infrastructure\"],\n\t},\n\t{\n\t\tid: \"zero-trust-security\",\n\t\tname: \"Zero-Trust Security\",\n\t\tdescription:\n\t\t\t\"Enterprise security with SSO, secrets management, VPN, intrusion detection, and feature flags\",\n\t\trequiredServices: [\"authentik\", \"crowdsec\"],\n\t\tskills: [\n\t\t\t\"authentik-auth\",\n\t\t\t\"keycloak-auth\",\n\t\t\t\"vault-secrets\",\n\t\t\t\"infisical-secrets\",\n\t\t\t\"netbird-vpn\",\n\t\t\t\"teleport-access\",\n\t\t\t\"crowdsec-protect\",\n\t\t],\n\t\ticon: \"🔒\",\n\t\ttags: [\"security\", \"zero-trust\", \"sso\", \"secrets\", \"vpn\"],\n\t},\n\t{\n\t\tid: \"content-platform\",\n\t\tname: \"Content Platform\",\n\t\tdescription:\n\t\t\t\"Publishing and CMS platform with Ghost, Strapi, Directus, and newsletter management\",\n\t\trequiredServices: [\"ghost\"],\n\t\tskills: [\n\t\t\t\"ghost-publish\",\n\t\t\t\"strapi-cms\",\n\t\t\t\"directus-cms\",\n\t\t\t\"listmonk-email\",\n\t\t\t\"plausible-analytics\",\n\t\t],\n\t\ticon: \"📝\",\n\t\ttags: [\"cms\", \"publishing\", \"blog\", \"newsletter\", \"analytics\"],\n\t},\n\t{\n\t\tid: \"backend-platform\",\n\t\tname: \"Backend Platform\",\n\t\tdescription: \"Backend-as-a-service with Supabase, Appwrite, PocketBase, and API gateway\",\n\t\trequiredServices: [\"supabase\"],\n\t\tskills: [\n\t\t\t\"supabase-query\",\n\t\t\t\"appwrite-backend\",\n\t\t\t\"pocketbase-backend\",\n\t\t\t\"kong-gateway\",\n\t\t\t\"rabbitmq-queue\",\n\t\t],\n\t\ticon: \"⚡\",\n\t\ttags: [\"backend\", \"baas\", \"api\", \"database\", \"messaging\"],\n\t},\n\t{\n\t\tid: \"observability-stack\",\n\t\tname: \"Observability Stack\",\n\t\tdescription:\n\t\t\t\"Full observability with Loki logs, SigNoz APM, Sentry errors, Gatus health, and Elasticsearch\",\n\t\trequiredServices: [\"loki\", \"signoz\"],\n\t\tskills: [\n\t\t\t\"loki-logs\",\n\t\t\t\"signoz-observe\",\n\t\t\t\"sentry-errors\",\n\t\t\t\"gatus-health\",\n\t\t\t\"elasticsearch-search\",\n\t\t],\n\t\ticon: \"📡\",\n\t\ttags: [\"observability\", \"logs\", \"apm\", \"errors\", \"health\"],\n\t},\n\t{\n\t\tid: \"document-hub\",\n\t\tname: \"Document Hub\",\n\t\tdescription:\n\t\t\t\"Document management with Paperless-ngx, BookStack wiki, Stirling PDF tools, and Excalidraw\",\n\t\trequiredServices: [\"paperless-ngx\"],\n\t\tskills: [\"paperless-ngx-docs\", \"bookstack-wiki\", \"stirling-pdf-tools\", \"excalidraw-draw\"],\n\t\ticon: \"📑\",\n\t\ttags: [\"documents\", \"wiki\", \"pdf\", \"collaboration\"],\n\t},\n\t{\n\t\tid: \"smart-home\",\n\t\tname: \"Smart Home\",\n\t\tdescription:\n\t\t\t\"Home automation and event-driven workflows with Home Assistant, Huginn, and Activepieces\",\n\t\trequiredServices: [\"homeassistant\"],\n\t\tskills: [\"home-assistant-automate\", \"huginn-automate\", \"activepieces-flow\"],\n\t\ticon: \"🏠\",\n\t\ttags: [\"iot\", \"automation\", \"smart-home\", \"workflows\"],\n\t},\n\t// ── Aura Build Frontend Design Skills ────────────────────────────\n\t{\n\t\tid: \"frontend-design\",\n\t\tname: \"Frontend Design\",\n\t\tdescription:\n\t\t\t\"Front-end design skills for UI systems, web animations, responsive layouts, copywriting, and asset management — sourced from Aura Build\",\n\t\trequiredServices: [],\n\t\tskills: [\n\t\t\t\"ui-prompting\",\n\t\t\t\"pricing-page-design\",\n\t\t\t\"landing-page-design\",\n\t\t\t\"gsap-animate\",\n\t\t\t\"threejs-scene\",\n\t\t\t\"matterjs-physics\",\n\t\t\t\"globe-gl-visualize\",\n\t\t\t\"tailwindcss-style\",\n\t\t\t\"css-border-gradient\",\n\t\t\t\"progressive-blur\",\n\t\t\t\"animation-on-scroll\",\n\t\t\t\"css-alpha-masking\",\n\t\t\t\"vantajs-background\",\n\t\t\t\"cobejs-globe\",\n\t\t\t\"unicorn-studio-embed\",\n\t\t\t\"ui-design-system\",\n\t\t\t\"tailwind-design-system-v4\",\n\t\t\t\"interaction-design\",\n\t\t\t\"responsive-design\",\n\t\t\t\"web-interface-guidelines\",\n\t\t\t\"threejs-animation\",\n\t\t\t\"copywriting\",\n\t\t\t\"frontend-distinctive-design\",\n\t\t\t\"canvas-design\",\n\t\t\t\"web-design-reviewer\",\n\t\t\t\"animejs-animate\",\n\t\t\t\"aura-asset-images\",\n\t\t],\n\t\ticon: \"🎨\",\n\t\ttags: [\"frontend\", \"design\", \"animation\", \"css\", \"ui\", \"web-design\"],\n\t},\n];\n\nconst packMap = new Map<string, SkillPack>();\nfor (const pack of skillPacks) {\n\tif (packMap.has(pack.id)) {\n\t\tthrow new Error(`Duplicate skill pack ID: \"${pack.id}\"`);\n\t}\n\tpackMap.set(pack.id, pack);\n}\n\nexport const skillPackRegistry: ReadonlyMap<string, SkillPack> = packMap;\n\nexport function getSkillPackById(id: string): SkillPack | undefined {\n\treturn packMap.get(id);\n}\n\nexport function getAllSkillPacks(): SkillPack[] {\n\treturn [...skillPacks];\n}\n\n/** Get skill packs whose required services are all present in the given service list */\nexport function getCompatibleSkillPacks(availableServiceIds: string[]): SkillPack[] {\n\treturn skillPacks.filter((pack) =>\n\t\tpack.requiredServices.every((req) => availableServiceIds.includes(req)),\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/skills/skill-manifest.d.ts
|
|
2
|
+
interface SkillManifestEntry {
|
|
3
|
+
/** Unique skill identifier, e.g. "gsap-animate" */
|
|
4
|
+
id: string;
|
|
5
|
+
/** Relative path to the SKILL.md file */
|
|
6
|
+
path: string;
|
|
7
|
+
/** Display emoji */
|
|
8
|
+
emoji: string;
|
|
9
|
+
/** Docker service IDs this skill depends on (empty for frontend-only skills) */
|
|
10
|
+
services: string[];
|
|
11
|
+
}
|
|
12
|
+
/** Return all skills defined in the local manifest.json */
|
|
13
|
+
declare function getAllManifestSkills(): SkillManifestEntry[];
|
|
14
|
+
/** Look up a single skill by ID */
|
|
15
|
+
declare function getManifestSkillById(id: string): SkillManifestEntry | undefined;
|
|
16
|
+
/** Return the total count of curated skills */
|
|
17
|
+
declare function getManifestSkillCount(): number;
|
|
18
|
+
//#endregion
|
|
19
|
+
export { SkillManifestEntry, getAllManifestSkills, getManifestSkillById, getManifestSkillCount };
|
|
20
|
+
//# sourceMappingURL=skill-manifest.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-manifest.d.mts","names":[],"sources":["../../src/skills/skill-manifest.ts"],"mappings":";UAMiB,kBAAA;EAAA;EAEhB,EAAA;;EAEA,IAAA;EAFA;EAIA,KAAA;EAAA;EAEA,QAAA;AAAA;;iBAyBe,oBAAA,CAAA,GAAwB,kBAAA;;iBAKxB,oBAAA,CAAqB,EAAA,WAAa,kBAAA;;iBAKlC,qBAAA,CAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, resolve } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
|
|
5
|
+
//#region src/skills/skill-manifest.ts
|
|
6
|
+
let _cache = null;
|
|
7
|
+
function loadManifest() {
|
|
8
|
+
if (_cache) return _cache;
|
|
9
|
+
const raw = readFileSync(resolve(dirname(fileURLToPath(import.meta.url)), "../../../../skills/manifest.json"), "utf-8");
|
|
10
|
+
_cache = JSON.parse(raw).skills;
|
|
11
|
+
return _cache;
|
|
12
|
+
}
|
|
13
|
+
/** Return all skills defined in the local manifest.json */
|
|
14
|
+
function getAllManifestSkills() {
|
|
15
|
+
return loadManifest();
|
|
16
|
+
}
|
|
17
|
+
/** Look up a single skill by ID */
|
|
18
|
+
function getManifestSkillById(id) {
|
|
19
|
+
return loadManifest().find((s) => s.id === id);
|
|
20
|
+
}
|
|
21
|
+
/** Return the total count of curated skills */
|
|
22
|
+
function getManifestSkillCount() {
|
|
23
|
+
return loadManifest().length;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//#endregion
|
|
27
|
+
export { getAllManifestSkills, getManifestSkillById, getManifestSkillCount };
|
|
28
|
+
//# sourceMappingURL=skill-manifest.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-manifest.mjs","names":[],"sources":["../../src/skills/skill-manifest.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// ── Types ───────────────────────────────────────────────────────────────────\n\nexport interface SkillManifestEntry {\n\t/** Unique skill identifier, e.g. \"gsap-animate\" */\n\tid: string;\n\t/** Relative path to the SKILL.md file */\n\tpath: string;\n\t/** Display emoji */\n\temoji: string;\n\t/** Docker service IDs this skill depends on (empty for frontend-only skills) */\n\tservices: string[];\n}\n\ninterface SkillManifest {\n\tskills: SkillManifestEntry[];\n}\n\n// ── Manifest loader ─────────────────────────────────────────────────────────\n\nlet _cache: SkillManifestEntry[] | null = null;\n\nfunction loadManifest(): SkillManifestEntry[] {\n\tif (_cache) return _cache;\n\t// Resolve the manifest relative to this file's location\n\t// This file is at packages/core/src/skills/skill-manifest.ts\n\t// The manifest is at skills/manifest.json (repo root / skills /)\n\tconst thisDir = dirname(fileURLToPath(import.meta.url));\n\tconst manifestPath = resolve(thisDir, \"../../../../skills/manifest.json\");\n\tconst raw = readFileSync(manifestPath, \"utf-8\");\n\tconst data = JSON.parse(raw) as SkillManifest;\n\t_cache = data.skills;\n\treturn _cache;\n}\n\n/** Return all skills defined in the local manifest.json */\nexport function getAllManifestSkills(): SkillManifestEntry[] {\n\treturn loadManifest();\n}\n\n/** Look up a single skill by ID */\nexport function getManifestSkillById(id: string): SkillManifestEntry | undefined {\n\treturn loadManifest().find((s) => s.id === id);\n}\n\n/** Return the total count of curated skills */\nexport function getManifestSkillCount(): number {\n\treturn loadManifest().length;\n}\n"],"mappings":";;;;;AAuBA,IAAI,SAAsC;AAE1C,SAAS,eAAqC;AAC7C,KAAI,OAAQ,QAAO;CAMnB,MAAM,MAAM,aADS,QADL,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC,EACjB,mCAAmC,EAClC,QAAQ;AAE/C,UADa,KAAK,MAAM,IAAI,CACd;AACd,QAAO;;;AAIR,SAAgB,uBAA6C;AAC5D,QAAO,cAAc;;;AAItB,SAAgB,qBAAqB,IAA4C;AAChF,QAAO,cAAc,CAAC,MAAM,MAAM,EAAE,OAAO,GAAG;;;AAI/C,SAAgB,wBAAgC;AAC/C,QAAO,cAAc,CAAC"}
|
package/dist/validator.test.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-
|
|
1
|
+
import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-YSByewHe.mjs";
|
|
2
2
|
import { resolve } from "./resolver.mjs";
|
|
3
3
|
import { compose } from "./composer.mjs";
|
|
4
4
|
import { validate } from "./validator.mjs";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-
|
|
1
|
+
import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-YSByewHe.mjs";
|
|
2
2
|
import { getAllServices, getServiceById } from "./services/registry.mjs";
|
|
3
3
|
import { resolve } from "./resolver.mjs";
|
|
4
4
|
import { checkCompatibility, getImageReference, getImageTag, pinImageTags } from "./version-manager.mjs";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version-manager.test.mjs","names":[],"sources":["../src/version-manager.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { resolve } from \"./resolver.js\";\nimport { getAllServices, getServiceById } from \"./services/registry.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"version-manager.test.mjs","names":[],"sources":["../src/version-manager.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { resolve } from \"./resolver.js\";\nimport { getAllServices, getServiceById } from \"./services/registry.js\";\nimport {\n\tcheckCompatibility,\n\tgetImageReference,\n\tgetImageTag,\n\tpinImageTags,\n} from \"./version-manager.js\";\n\ndescribe(\"getImageTag\", () => {\n\tit(\"returns the tag for a known service\", () => {\n\t\tconst tag = getImageTag(\"redis\");\n\t\texpect(tag).toBeDefined();\n\t\texpect(typeof tag).toBe(\"string\");\n\t});\n\n\tit(\"returns undefined for an unknown service\", () => {\n\t\texpect(getImageTag(\"nonexistent-service-xyz\")).toBeUndefined();\n\t});\n});\n\ndescribe(\"getImageReference\", () => {\n\tit(\"returns image:tag for a known service\", () => {\n\t\tconst ref = getImageReference(\"redis\");\n\t\texpect(ref).toBeDefined();\n\t\texpect(ref).toContain(\":\");\n\t\texpect(ref).toMatch(/^.+:.+$/);\n\t});\n\n\tit(\"returns undefined for an unknown service\", () => {\n\t\texpect(getImageReference(\"nonexistent-service-xyz\")).toBeUndefined();\n\t});\n});\n\ndescribe(\"pinImageTags\", () => {\n\tit(\"pins image tags from the registry for all services\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\", \"postgresql\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst pinned = pinImageTags(resolved);\n\n\t\texpect(pinned.services).toHaveLength(resolved.services.length);\n\n\t\tfor (const svc of pinned.services) {\n\t\t\texpect(svc.definition.imageTag).toBeDefined();\n\t\t\texpect(typeof svc.definition.imageTag).toBe(\"string\");\n\t\t\texpect(svc.definition.imageTag.length).toBeGreaterThan(0);\n\t\t}\n\t});\n\n\tit(\"does not mutate the original resolved output\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst originalTag = resolved.services[0]?.definition.imageTag;\n\t\tpinImageTags(resolved);\n\n\t\texpect(resolved.services[0]?.definition.imageTag).toBe(originalTag);\n\t});\n\n\tit(\"preserves non-tag properties\", () => {\n\t\tconst resolved = resolve({\n\t\t\tservices: [\"redis\"],\n\t\t\tskillPacks: [],\n\t\t\tproxy: \"none\",\n\t\t\tgpu: false,\n\t\t\tplatform: \"linux/amd64\",\n\t\t});\n\n\t\tconst pinned = pinImageTags(resolved);\n\t\texpect(pinned.services[0]?.definition.id).toBe(\"redis\");\n\t\texpect(pinned.services[0]?.definition.name).toBe(\"Redis\");\n\t\texpect(pinned.estimatedMemoryMB).toBe(resolved.estimatedMemoryMB);\n\t});\n});\n\ndescribe(\"checkCompatibility\", () => {\n\tit(\"warns when Redis and Valkey are both selected\", () => {\n\t\tconst all = getAllServices();\n\t\tconst redis = all.find((s) => s.id === \"redis\");\n\t\tconst valkey = all.find((s) => s.id === \"valkey\");\n\n\t\tif (redis && valkey) {\n\t\t\tconst warnings = checkCompatibility([redis, valkey]);\n\t\t\texpect(\n\t\t\t\twarnings.some((w) => w.message.includes(\"Redis\") && w.message.includes(\"Valkey\")),\n\t\t\t).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns when Caddy and Traefik are both selected\", () => {\n\t\tconst all = getAllServices();\n\t\tconst caddy = all.find((s) => s.id === \"caddy\");\n\t\tconst traefik = all.find((s) => s.id === \"traefik\");\n\n\t\tif (caddy && traefik) {\n\t\t\tconst warnings = checkCompatibility([caddy, traefik]);\n\t\t\texpect(\n\t\t\t\twarnings.some((w) => w.message.includes(\"Caddy\") && w.message.includes(\"Traefik\")),\n\t\t\t).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns about multiple vector databases\", () => {\n\t\tconst all = getAllServices();\n\t\tconst qdrant = all.find((s) => s.id === \"qdrant\");\n\t\tconst chromadb = all.find((s) => s.id === \"chromadb\");\n\n\t\tif (qdrant && chromadb) {\n\t\t\tconst warnings = checkCompatibility([qdrant, chromadb]);\n\t\t\texpect(warnings.some((w) => w.message.includes(\"vector database\"))).toBe(true);\n\t\t}\n\t});\n\n\tit(\"warns about GPU services\", () => {\n\t\tconst all = getAllServices();\n\t\tconst gpuService = all.find((s) => s.gpuRequired);\n\n\t\tif (gpuService) {\n\t\t\tconst warnings = checkCompatibility([gpuService]);\n\t\t\texpect(warnings.some((w) => w.message.includes(\"GPU\"))).toBe(true);\n\t\t}\n\t});\n\n\tit(\"returns no warnings for a single non-conflicting service\", () => {\n\t\tconst redis = getServiceById(\"redis\");\n\t\tif (redis) {\n\t\t\tconst warnings = checkCompatibility([redis]);\n\t\t\texpect(\n\t\t\t\twarnings.filter((w) => w.type === \"compatibility\" && !w.message.includes(\"GPU\")),\n\t\t\t).toHaveLength(0);\n\t\t}\n\t});\n});\n"],"mappings":"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"}
|
|
@@ -9184,7 +9184,7 @@ function manageArtifactAttachment(attachment) {
|
|
|
9184
9184
|
}
|
|
9185
9185
|
|
|
9186
9186
|
//#endregion
|
|
9187
|
-
//#region node_modules/.pnpm/vitest@4.0.18_@types+node@25.
|
|
9187
|
+
//#region node_modules/.pnpm/vitest@4.0.18_@types+node@25.3.0_yaml@2.8.2/node_modules/vitest/dist/chunks/utils.DvEY5TfP.js
|
|
9188
9188
|
const NAME_WORKER_STATE = "__vitest_worker__";
|
|
9189
9189
|
function getWorkerState() {
|
|
9190
9190
|
const workerState = globalThis[NAME_WORKER_STATE];
|
|
@@ -10296,11 +10296,11 @@ var SnapshotClient = class {
|
|
|
10296
10296
|
};
|
|
10297
10297
|
|
|
10298
10298
|
//#endregion
|
|
10299
|
-
//#region node_modules/.pnpm/vitest@4.0.18_@types+node@25.
|
|
10299
|
+
//#region node_modules/.pnpm/vitest@4.0.18_@types+node@25.3.0_yaml@2.8.2/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js
|
|
10300
10300
|
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
|
|
10301
10301
|
|
|
10302
10302
|
//#endregion
|
|
10303
|
-
//#region node_modules/.pnpm/vitest@4.0.18_@types+node@25.
|
|
10303
|
+
//#region node_modules/.pnpm/vitest@4.0.18_@types+node@25.3.0_yaml@2.8.2/node_modules/vitest/dist/chunks/date.Bq6ZW5rf.js
|
|
10304
10304
|
const RealDate = Date;
|
|
10305
10305
|
let now = null;
|
|
10306
10306
|
var MockDate = class MockDate extends RealDate {
|
|
@@ -10349,7 +10349,7 @@ function resetDate() {
|
|
|
10349
10349
|
}
|
|
10350
10350
|
|
|
10351
10351
|
//#endregion
|
|
10352
|
-
//#region node_modules/.pnpm/vitest@4.0.18_@types+node@25.
|
|
10352
|
+
//#region node_modules/.pnpm/vitest@4.0.18_@types+node@25.3.0_yaml@2.8.2/node_modules/vitest/dist/chunks/vi.2VT5v0um.js
|
|
10353
10353
|
const unsupported = [
|
|
10354
10354
|
"matchSnapshot",
|
|
10355
10355
|
"toMatchSnapshot",
|
|
@@ -12913,4 +12913,4 @@ function getImporter(name) {
|
|
|
12913
12913
|
|
|
12914
12914
|
//#endregion
|
|
12915
12915
|
export { describe as n, it as r, globalExpect as t };
|
|
12916
|
-
//# sourceMappingURL=vi.2VT5v0um-
|
|
12916
|
+
//# sourceMappingURL=vi.2VT5v0um-YSByewHe.mjs.map
|