@better-openclaw/core 1.0.23 → 1.0.24
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.cjs +3 -4
- package/dist/bare-metal-partition.test.cjs.map +1 -1
- package/dist/bare-metal-partition.test.mjs +3 -4
- package/dist/bare-metal-partition.test.mjs.map +1 -1
- package/dist/composer.cjs +13 -1
- package/dist/composer.cjs.map +1 -1
- package/dist/composer.d.cts.map +1 -1
- package/dist/composer.d.mts.map +1 -1
- package/dist/composer.mjs +13 -1
- package/dist/composer.mjs.map +1 -1
- package/dist/composer.snapshot.test.cjs +1 -1
- package/dist/composer.snapshot.test.mjs +1 -1
- package/dist/composer.test.cjs +3 -2
- package/dist/composer.test.cjs.map +1 -1
- package/dist/composer.test.mjs +3 -2
- package/dist/composer.test.mjs.map +1 -1
- package/dist/deployers/strip-host-ports.test.cjs +1 -1
- package/dist/deployers/strip-host-ports.test.mjs +1 -1
- package/dist/generate.cjs +6 -2
- package/dist/generate.cjs.map +1 -1
- package/dist/generate.d.cts.map +1 -1
- package/dist/generate.d.mts.map +1 -1
- package/dist/generate.mjs +6 -2
- package/dist/generate.mjs.map +1 -1
- package/dist/generate.test.cjs +2 -2
- package/dist/generate.test.cjs.map +1 -1
- package/dist/generate.test.mjs +2 -2
- package/dist/generate.test.mjs.map +1 -1
- package/dist/generators/bare-metal-install.test.cjs +1 -1
- package/dist/generators/bare-metal-install.test.mjs +1 -1
- package/dist/generators/caddy.test.cjs +1 -1
- package/dist/generators/caddy.test.mjs +1 -1
- package/dist/generators/clone-repos.cjs +140 -0
- package/dist/generators/clone-repos.cjs.map +1 -0
- package/dist/generators/clone-repos.d.cts +11 -0
- package/dist/generators/clone-repos.d.cts.map +1 -0
- package/dist/generators/clone-repos.d.mts +11 -0
- package/dist/generators/clone-repos.d.mts.map +1 -0
- package/dist/generators/clone-repos.mjs +139 -0
- package/dist/generators/clone-repos.mjs.map +1 -0
- package/dist/generators/clone-repos.test.cjs +140 -0
- package/dist/generators/clone-repos.test.cjs.map +1 -0
- package/dist/generators/clone-repos.test.d.cts +1 -0
- package/dist/generators/clone-repos.test.d.mts +1 -0
- package/dist/generators/clone-repos.test.mjs +141 -0
- package/dist/generators/clone-repos.test.mjs.map +1 -0
- package/dist/generators/env.test.cjs +1 -1
- package/dist/generators/env.test.mjs +1 -1
- package/dist/generators/health-check.test.cjs +1 -1
- package/dist/generators/health-check.test.mjs +1 -1
- package/dist/generators/postgres-init.cjs +20 -0
- package/dist/generators/postgres-init.cjs.map +1 -1
- package/dist/generators/postgres-init.d.cts.map +1 -1
- package/dist/generators/postgres-init.d.mts.map +1 -1
- package/dist/generators/postgres-init.mjs +20 -0
- package/dist/generators/postgres-init.mjs.map +1 -1
- package/dist/generators/scripts.cjs +332 -3
- package/dist/generators/scripts.cjs.map +1 -1
- package/dist/generators/scripts.d.cts +3 -1
- package/dist/generators/scripts.d.cts.map +1 -1
- package/dist/generators/scripts.d.mts +3 -1
- package/dist/generators/scripts.d.mts.map +1 -1
- package/dist/generators/scripts.mjs +332 -3
- package/dist/generators/scripts.mjs.map +1 -1
- package/dist/generators/scripts.test.cjs +39 -5
- package/dist/generators/scripts.test.cjs.map +1 -1
- package/dist/generators/scripts.test.mjs +39 -5
- package/dist/generators/scripts.test.mjs.map +1 -1
- package/dist/generators/stack-manifest.cjs +1 -0
- package/dist/generators/stack-manifest.cjs.map +1 -1
- package/dist/generators/stack-manifest.d.cts +3 -2
- package/dist/generators/stack-manifest.d.cts.map +1 -1
- package/dist/generators/stack-manifest.d.mts +3 -2
- package/dist/generators/stack-manifest.d.mts.map +1 -1
- package/dist/generators/stack-manifest.mjs +1 -0
- package/dist/generators/stack-manifest.mjs.map +1 -1
- package/dist/generators/traefik.test.cjs +1 -1
- package/dist/generators/traefik.test.mjs +1 -1
- package/dist/index.cjs +8 -1
- package/dist/index.d.cts +5 -3
- package/dist/index.d.mts +5 -3
- package/dist/index.mjs +5 -3
- package/dist/migrations.test.cjs +1 -1
- package/dist/migrations.test.mjs +1 -1
- package/dist/presets/registry.cjs.map +1 -1
- package/dist/presets/registry.d.cts.map +1 -1
- package/dist/presets/registry.d.mts.map +1 -1
- package/dist/presets/registry.mjs.map +1 -1
- package/dist/presets/registry.test.cjs +1 -1
- package/dist/presets/registry.test.mjs +1 -1
- package/dist/resolver.cjs +8 -0
- package/dist/resolver.cjs.map +1 -1
- package/dist/resolver.mjs +9 -1
- package/dist/resolver.mjs.map +1 -1
- package/dist/resolver.test.cjs +47 -12
- package/dist/resolver.test.cjs.map +1 -1
- package/dist/resolver.test.mjs +47 -12
- package/dist/resolver.test.mjs.map +1 -1
- package/dist/{schema-B4c64P8N.d.cts → schema-eX44HhRp.d.mts} +62 -8
- package/dist/schema-eX44HhRp.d.mts.map +1 -0
- package/dist/{schema-CXNhYci1.d.mts → schema-tn5RK8CM.d.cts} +62 -8
- package/dist/schema-tn5RK8CM.d.cts.map +1 -0
- package/dist/schema.cjs +22 -4
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +2 -2
- package/dist/schema.d.mts +2 -2
- package/dist/schema.mjs +21 -5
- package/dist/schema.mjs.map +1 -1
- package/dist/schema.test.cjs +1 -1
- package/dist/schema.test.mjs +1 -1
- package/dist/services/definitions/apptension-saas.cjs +87 -0
- package/dist/services/definitions/apptension-saas.cjs.map +1 -0
- package/dist/services/definitions/apptension-saas.d.cts +7 -0
- package/dist/services/definitions/apptension-saas.d.cts.map +1 -0
- package/dist/services/definitions/apptension-saas.d.mts +7 -0
- package/dist/services/definitions/apptension-saas.d.mts.map +1 -0
- package/dist/services/definitions/apptension-saas.mjs +86 -0
- package/dist/services/definitions/apptension-saas.mjs.map +1 -0
- package/dist/services/definitions/boxyhq-saas.cjs +88 -0
- package/dist/services/definitions/boxyhq-saas.cjs.map +1 -0
- package/dist/services/definitions/boxyhq-saas.d.cts +7 -0
- package/dist/services/definitions/boxyhq-saas.d.cts.map +1 -0
- package/dist/services/definitions/boxyhq-saas.d.mts +7 -0
- package/dist/services/definitions/boxyhq-saas.d.mts.map +1 -0
- package/dist/services/definitions/boxyhq-saas.mjs +87 -0
- package/dist/services/definitions/boxyhq-saas.mjs.map +1 -0
- package/dist/services/definitions/cmsaas-starter.cjs +86 -0
- package/dist/services/definitions/cmsaas-starter.cjs.map +1 -0
- package/dist/services/definitions/cmsaas-starter.d.cts +7 -0
- package/dist/services/definitions/cmsaas-starter.d.cts.map +1 -0
- package/dist/services/definitions/cmsaas-starter.d.mts +7 -0
- package/dist/services/definitions/cmsaas-starter.d.mts.map +1 -0
- package/dist/services/definitions/cmsaas-starter.mjs +85 -0
- package/dist/services/definitions/cmsaas-starter.mjs.map +1 -0
- package/dist/services/definitions/index.cjs +51 -36
- package/dist/services/definitions/index.cjs.map +1 -1
- package/dist/services/definitions/index.d.cts +30 -25
- package/dist/services/definitions/index.d.cts.map +1 -1
- package/dist/services/definitions/index.d.mts +30 -25
- package/dist/services/definitions/index.d.mts.map +1 -1
- package/dist/services/definitions/index.mjs +47 -37
- package/dist/services/definitions/index.mjs.map +1 -1
- package/dist/services/definitions/ixartz-saas.cjs +88 -0
- package/dist/services/definitions/ixartz-saas.cjs.map +1 -0
- package/dist/services/definitions/ixartz-saas.d.cts +7 -0
- package/dist/services/definitions/ixartz-saas.d.cts.map +1 -0
- package/dist/services/definitions/ixartz-saas.d.mts +7 -0
- package/dist/services/definitions/ixartz-saas.d.mts.map +1 -0
- package/dist/services/definitions/ixartz-saas.mjs +87 -0
- package/dist/services/definitions/ixartz-saas.mjs.map +1 -0
- package/dist/services/definitions/mission-control.cjs +16 -2
- package/dist/services/definitions/mission-control.cjs.map +1 -1
- package/dist/services/definitions/mission-control.mjs +16 -2
- package/dist/services/definitions/mission-control.mjs.map +1 -1
- package/dist/services/definitions/open-saas.cjs +81 -0
- package/dist/services/definitions/open-saas.cjs.map +1 -0
- package/dist/services/definitions/open-saas.d.cts +7 -0
- package/dist/services/definitions/open-saas.d.cts.map +1 -0
- package/dist/services/definitions/open-saas.d.mts +7 -0
- package/dist/services/definitions/open-saas.d.mts.map +1 -0
- package/dist/services/definitions/open-saas.mjs +80 -0
- package/dist/services/definitions/open-saas.mjs.map +1 -0
- package/dist/services/registry.cjs +3 -0
- package/dist/services/registry.cjs.map +1 -1
- package/dist/services/registry.d.cts.map +1 -1
- package/dist/services/registry.d.mts.map +1 -1
- package/dist/services/registry.mjs +3 -0
- package/dist/services/registry.mjs.map +1 -1
- package/dist/services/registry.test.cjs +8 -1
- package/dist/services/registry.test.cjs.map +1 -1
- package/dist/services/registry.test.mjs +8 -1
- package/dist/services/registry.test.mjs.map +1 -1
- package/dist/{skill-manifest-BVUXU0__.mjs → skill-manifest-6XhrhWsG.mjs} +49 -1
- package/dist/{skill-manifest--IgY9REK.cjs.map → skill-manifest-6XhrhWsG.mjs.map} +1 -1
- package/dist/{skill-manifest--IgY9REK.cjs → skill-manifest-B8znSsym.cjs} +49 -1
- package/dist/{skill-manifest-BVUXU0__.mjs.map → skill-manifest-B8znSsym.cjs.map} +1 -1
- package/dist/skills/registry.cjs +3 -3
- package/dist/skills/registry.cjs.map +1 -1
- package/dist/skills/registry.mjs +3 -3
- package/dist/skills/registry.mjs.map +1 -1
- package/dist/skills/skill-manifest.cjs +1 -1
- package/dist/skills/skill-manifest.mjs +1 -1
- package/dist/track-analytics.cjs +50 -0
- package/dist/track-analytics.cjs.map +1 -0
- package/dist/track-analytics.d.cts +34 -0
- package/dist/track-analytics.d.cts.map +1 -0
- package/dist/track-analytics.d.mts +34 -0
- package/dist/track-analytics.d.mts.map +1 -0
- package/dist/track-analytics.mjs +48 -0
- package/dist/track-analytics.mjs.map +1 -0
- package/dist/track-analytics.test.cjs +91 -0
- package/dist/track-analytics.test.cjs.map +1 -0
- package/dist/track-analytics.test.d.cts +1 -0
- package/dist/track-analytics.test.d.mts +1 -0
- package/dist/track-analytics.test.mjs +92 -0
- package/dist/track-analytics.test.mjs.map +1 -0
- package/dist/types.cjs +7 -0
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +4 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +4 -2
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs +7 -0
- package/dist/types.mjs.map +1 -1
- package/dist/validator.test.cjs +1 -1
- package/dist/validator.test.mjs +1 -1
- package/dist/version-manager.cjs +1 -1
- package/dist/version-manager.cjs.map +1 -1
- package/dist/version-manager.mjs +1 -1
- package/dist/version-manager.mjs.map +1 -1
- package/dist/version-manager.test.cjs +7 -5
- package/dist/version-manager.test.cjs.map +1 -1
- package/dist/version-manager.test.mjs +7 -5
- package/dist/version-manager.test.mjs.map +1 -1
- package/dist/{vi.2VT5v0um-DvC3SVNc.mjs → vi.2VT5v0um-C_jmO7m2.mjs} +5 -5
- package/dist/{vi.2VT5v0um-DvC3SVNc.mjs.map → vi.2VT5v0um-C_jmO7m2.mjs.map} +1 -1
- package/dist/{vi.2VT5v0um-CRqXre87.cjs → vi.2VT5v0um-iVBt6Fyq.cjs} +5 -5
- package/dist/{vi.2VT5v0um-CRqXre87.cjs.map → vi.2VT5v0um-iVBt6Fyq.cjs.map} +1 -1
- package/package.json +1 -1
- package/src/__snapshots__/composer.snapshot.test.ts.snap +155 -0
- package/src/bare-metal-partition.test.ts +4 -3
- package/src/composer.test.ts +4 -2
- package/src/composer.ts +20 -1
- package/src/generate.test.ts +2 -1
- package/src/generate.ts +10 -1
- package/src/generators/clone-repos.test.ts +154 -0
- package/src/generators/clone-repos.ts +159 -0
- package/src/generators/postgres-init.ts +17 -0
- package/src/generators/scripts.test.ts +52 -4
- package/src/generators/scripts.ts +351 -3
- package/src/generators/stack-manifest.ts +4 -2
- package/src/index.ts +8 -0
- package/src/presets/registry.ts +241 -329
- package/src/resolver.test.ts +53 -15
- package/src/resolver.ts +13 -1
- package/src/schema.ts +33 -4
- package/src/services/definitions/apptension-saas.ts +84 -0
- package/src/services/definitions/boxyhq-saas.ts +84 -0
- package/src/services/definitions/cmsaas-starter.ts +84 -0
- package/src/services/definitions/index.ts +90 -70
- package/src/services/definitions/ixartz-saas.ts +84 -0
- package/src/services/definitions/mission-control.ts +19 -2
- package/src/services/definitions/open-saas.ts +79 -0
- package/src/services/registry.test.ts +8 -0
- package/src/services/registry.ts +7 -0
- package/src/skills/manifest.json +64 -0
- package/src/skills/registry.ts +3 -3
- package/src/track-analytics.test.ts +82 -0
- package/src/track-analytics.ts +76 -0
- package/src/types.ts +11 -0
- package/src/version-manager.test.ts +10 -5
- package/src/version-manager.ts +1 -1
- package/dist/schema-B4c64P8N.d.cts.map +0 -1
- package/dist/schema-CXNhYci1.d.mts.map +0 -1
package/dist/skills/registry.mjs
CHANGED
|
@@ -758,7 +758,7 @@ const skillPacks = [
|
|
|
758
758
|
"redis"
|
|
759
759
|
],
|
|
760
760
|
skills: [
|
|
761
|
-
"chatwoot-
|
|
761
|
+
"chatwoot-support",
|
|
762
762
|
"langfuse-trace",
|
|
763
763
|
"postgresql-query",
|
|
764
764
|
"redis-cache"
|
|
@@ -785,7 +785,7 @@ const skillPacks = [
|
|
|
785
785
|
skills: [
|
|
786
786
|
"twenty-crm",
|
|
787
787
|
"mautic-campaign",
|
|
788
|
-
"listmonk-
|
|
788
|
+
"listmonk-email",
|
|
789
789
|
"postgresql-query"
|
|
790
790
|
],
|
|
791
791
|
icon: "📈",
|
|
@@ -932,7 +932,7 @@ const skillPacks = [
|
|
|
932
932
|
skills: [
|
|
933
933
|
"ghost-publish",
|
|
934
934
|
"mautic-campaign",
|
|
935
|
-
"listmonk-
|
|
935
|
+
"listmonk-email",
|
|
936
936
|
"umami-analytics"
|
|
937
937
|
],
|
|
938
938
|
icon: "📣",
|
|
@@ -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: [\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: \"appwrite-platform\",\n\t\tname: \"Appwrite Platform\",\n\t\tdescription: \"BaaS with Appwrite for auth, databases, storage, functions, and realtime APIs\",\n\t\trequiredServices: [\"appwrite\"],\n\t\tskills: [\"appwrite-backend\", \"rabbitmq-queue\"],\n\t\ticon: \"🧱\",\n\t\ttags: [\"backend\", \"baas\", \"auth\", \"storage\", \"functions\"],\n\t},\n\t{\n\t\tid: \"authelia-security\",\n\t\tname: \"Authelia Security\",\n\t\tdescription:\n\t\t\t\"SSO, MFA, and access control for protecting self-hosted apps behind reverse proxy\",\n\t\trequiredServices: [\"authelia\"],\n\t\tskills: [\"authelia-auth\"],\n\t\ticon: \"🔒\",\n\t\ttags: [\"auth\", \"sso\", \"mfa\", \"access-control\", \"security\"],\n\t},\n\t{\n\t\tid: \"ragflow-platform\",\n\t\tname: \"RAGFlow Platform\",\n\t\tdescription:\n\t\t\t\"End-to-end RAG platform for knowledge ingestion, indexing, and grounded AI assistants\",\n\t\trequiredServices: [\"ragflow\"],\n\t\tskills: [\"ragflow-pipeline\", \"firecrawl-scrape\"],\n\t\ticon: \"🧠\",\n\t\ttags: [\"rag\", \"knowledge\", \"retrieval\", \"ai-platform\"],\n\t},\n\t{\n\t\tid: \"cms-stack\",\n\t\tname: \"CMS Stack\",\n\t\tdescription: \"Headless CMS and publishing with Directus, Strapi, Listmonk, and Stirling PDF\",\n\t\trequiredServices: [\"directus\"],\n\t\tskills: [\"strapi-cms\", \"directus-cms\", \"listmonk-email\", \"stirling-pdf-tools\"],\n\t\ticon: \"📝\",\n\t\ttags: [\"cms\", \"publishing\", \"newsletter\", \"documents\"],\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\t// ── New Skill Packs (from feature analysis) ──────────────────────\n\t{\n\t\tid: \"customer-support\",\n\t\tname: \"Customer Support\",\n\t\tdescription:\n\t\t\t\"AI-powered helpdesk with live chat, LLM observability, and ticket management across channels\",\n\t\trequiredServices: [\"chatwoot\", \"langfuse\", \"postgresql\", \"redis\"],\n\t\tskills: [\"chatwoot-inbox\", \"langfuse-trace\", \"postgresql-query\", \"redis-cache\"],\n\t\ticon: \"💬\",\n\t\ttags: [\"support\", \"chat\", \"helpdesk\", \"tickets\", \"customer-service\"],\n\t},\n\t{\n\t\tid: \"sales-pipeline\",\n\t\tname: \"Sales Pipeline\",\n\t\tdescription:\n\t\t\t\"CRM-driven sales pipeline with email marketing, newsletter management, and lead nurturing\",\n\t\trequiredServices: [\"twenty\", \"mautic\", \"listmonk\", \"postgresql\"],\n\t\tskills: [\"twenty-crm\", \"mautic-campaign\", \"listmonk-newsletter\", \"postgresql-query\"],\n\t\ticon: \"📈\",\n\t\ttags: [\"sales\", \"crm\", \"email\", \"leads\", \"marketing\"],\n\t},\n\t{\n\t\tid: \"data-pipeline\",\n\t\tname: \"Data Pipeline\",\n\t\tdescription:\n\t\t\t\"End-to-end data pipeline with DAG orchestration, 300+ source connectors, and monitoring dashboards\",\n\t\trequiredServices: [\"airflow\", \"airbyte\", \"postgresql\", \"grafana\"],\n\t\tskills: [\"airflow-dag\", \"airbyte-sync\", \"postgresql-query\", \"grafana-dashboard\"],\n\t\ticon: \"🔄\",\n\t\ttags: [\"data\", \"etl\", \"pipeline\", \"orchestration\", \"connectors\"],\n\t},\n\t{\n\t\tid: \"voice-agent\",\n\t\tname: \"Voice Agent\",\n\t\tdescription:\n\t\t\t\"AI-powered voice agent with programmable telephony, speech-to-text transcription, and real-time communication\",\n\t\trequiredServices: [\"fonoster\", \"whisper\", \"livekit\", \"redis\"],\n\t\tskills: [\"fonoster-voice\", \"whisper-transcribe\", \"livekit-stream\", \"redis-cache\"],\n\t\ticon: \"📞\",\n\t\ttags: [\"voice\", \"telephony\", \"transcription\", \"speech\", \"phone\"],\n\t},\n\t{\n\t\tid: \"ecommerce-ops\",\n\t\tname: \"E-Commerce Ops\",\n\t\tdescription:\n\t\t\t\"AI-managed online store with headless commerce, product management, and object storage for media\",\n\t\trequiredServices: [\"medusa\", \"minio\", \"postgresql\", \"redis\"],\n\t\tskills: [\"medusa-commerce\", \"minio-storage\", \"postgresql-query\", \"redis-cache\"],\n\t\ticon: \"🛒\",\n\t\ttags: [\"ecommerce\", \"store\", \"products\", \"orders\", \"commerce\"],\n\t},\n\t{\n\t\tid: \"infra-security\",\n\t\tname: \"Infra Security\",\n\t\tdescription:\n\t\t\t\"Infrastructure security with intrusion detection, encrypted secret management, and uptime monitoring\",\n\t\trequiredServices: [\"crowdsec\", \"infisical\", \"uptime-kuma\"],\n\t\tskills: [\"crowdsec-protect\", \"infisical-secrets\", \"uptime-kuma-monitor\"],\n\t\ticon: \"🛡️\",\n\t\ttags: [\"security\", \"secrets\", \"monitoring\", \"intrusion-detection\"],\n\t},\n\t{\n\t\tid: \"fine-tuning-lab\",\n\t\tname: \"Fine-Tuning Lab\",\n\t\tdescription:\n\t\t\t\"Custom LLM fine-tuning pipeline with LoRA/QLoRA support, local model inference, and dataset storage\",\n\t\trequiredServices: [\"axolotl\", \"ollama\", \"minio\", \"postgresql\"],\n\t\tskills: [\"axolotl-finetune\", \"ollama-local-llm\", \"minio-storage\", \"postgresql-query\"],\n\t\ticon: \"🎯\",\n\t\ttags: [\"fine-tuning\", \"llm\", \"training\", \"lora\", \"models\"],\n\t},\n\t{\n\t\tid: \"marketing-suite\",\n\t\tname: \"Marketing Suite\",\n\t\tdescription:\n\t\t\t\"Full marketing stack with blogging, email automation, newsletter management, and web analytics\",\n\t\trequiredServices: [\"ghost\", \"mautic\", \"listmonk\", \"umami\"],\n\t\tskills: [\"ghost-publish\", \"mautic-campaign\", \"listmonk-newsletter\", \"umami-analytics\"],\n\t\ticon: \"📣\",\n\t\ttags: [\"marketing\", \"blog\", \"email\", \"analytics\", \"content\"],\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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"}
|
|
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: \"appwrite-platform\",\n\t\tname: \"Appwrite Platform\",\n\t\tdescription: \"BaaS with Appwrite for auth, databases, storage, functions, and realtime APIs\",\n\t\trequiredServices: [\"appwrite\"],\n\t\tskills: [\"appwrite-backend\", \"rabbitmq-queue\"],\n\t\ticon: \"🧱\",\n\t\ttags: [\"backend\", \"baas\", \"auth\", \"storage\", \"functions\"],\n\t},\n\t{\n\t\tid: \"authelia-security\",\n\t\tname: \"Authelia Security\",\n\t\tdescription:\n\t\t\t\"SSO, MFA, and access control for protecting self-hosted apps behind reverse proxy\",\n\t\trequiredServices: [\"authelia\"],\n\t\tskills: [\"authelia-auth\"],\n\t\ticon: \"🔒\",\n\t\ttags: [\"auth\", \"sso\", \"mfa\", \"access-control\", \"security\"],\n\t},\n\t{\n\t\tid: \"ragflow-platform\",\n\t\tname: \"RAGFlow Platform\",\n\t\tdescription:\n\t\t\t\"End-to-end RAG platform for knowledge ingestion, indexing, and grounded AI assistants\",\n\t\trequiredServices: [\"ragflow\"],\n\t\tskills: [\"ragflow-pipeline\", \"firecrawl-scrape\"],\n\t\ticon: \"🧠\",\n\t\ttags: [\"rag\", \"knowledge\", \"retrieval\", \"ai-platform\"],\n\t},\n\t{\n\t\tid: \"cms-stack\",\n\t\tname: \"CMS Stack\",\n\t\tdescription: \"Headless CMS and publishing with Directus, Strapi, Listmonk, and Stirling PDF\",\n\t\trequiredServices: [\"directus\"],\n\t\tskills: [\"strapi-cms\", \"directus-cms\", \"listmonk-email\", \"stirling-pdf-tools\"],\n\t\ticon: \"📝\",\n\t\ttags: [\"cms\", \"publishing\", \"newsletter\", \"documents\"],\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\t// ── New Skill Packs (from feature analysis) ──────────────────────\n\t{\n\t\tid: \"customer-support\",\n\t\tname: \"Customer Support\",\n\t\tdescription:\n\t\t\t\"AI-powered helpdesk with live chat, LLM observability, and ticket management across channels\",\n\t\trequiredServices: [\"chatwoot\", \"langfuse\", \"postgresql\", \"redis\"],\n\t\tskills: [\"chatwoot-support\", \"langfuse-trace\", \"postgresql-query\", \"redis-cache\"],\n\t\ticon: \"💬\",\n\t\ttags: [\"support\", \"chat\", \"helpdesk\", \"tickets\", \"customer-service\"],\n\t},\n\t{\n\t\tid: \"sales-pipeline\",\n\t\tname: \"Sales Pipeline\",\n\t\tdescription:\n\t\t\t\"CRM-driven sales pipeline with email marketing, newsletter management, and lead nurturing\",\n\t\trequiredServices: [\"twenty\", \"mautic\", \"listmonk\", \"postgresql\"],\n\t\tskills: [\"twenty-crm\", \"mautic-campaign\", \"listmonk-email\", \"postgresql-query\"],\n\t\ticon: \"📈\",\n\t\ttags: [\"sales\", \"crm\", \"email\", \"leads\", \"marketing\"],\n\t},\n\t{\n\t\tid: \"data-pipeline\",\n\t\tname: \"Data Pipeline\",\n\t\tdescription:\n\t\t\t\"End-to-end data pipeline with DAG orchestration, 300+ source connectors, and monitoring dashboards\",\n\t\trequiredServices: [\"airflow\", \"airbyte\", \"postgresql\", \"grafana\"],\n\t\tskills: [\"airflow-dag\", \"airbyte-sync\", \"postgresql-query\", \"grafana-dashboard\"],\n\t\ticon: \"🔄\",\n\t\ttags: [\"data\", \"etl\", \"pipeline\", \"orchestration\", \"connectors\"],\n\t},\n\t{\n\t\tid: \"voice-agent\",\n\t\tname: \"Voice Agent\",\n\t\tdescription:\n\t\t\t\"AI-powered voice agent with programmable telephony, speech-to-text transcription, and real-time communication\",\n\t\trequiredServices: [\"fonoster\", \"whisper\", \"livekit\", \"redis\"],\n\t\tskills: [\"fonoster-voice\", \"whisper-transcribe\", \"livekit-stream\", \"redis-cache\"],\n\t\ticon: \"📞\",\n\t\ttags: [\"voice\", \"telephony\", \"transcription\", \"speech\", \"phone\"],\n\t},\n\t{\n\t\tid: \"ecommerce-ops\",\n\t\tname: \"E-Commerce Ops\",\n\t\tdescription:\n\t\t\t\"AI-managed online store with headless commerce, product management, and object storage for media\",\n\t\trequiredServices: [\"medusa\", \"minio\", \"postgresql\", \"redis\"],\n\t\tskills: [\"medusa-commerce\", \"minio-storage\", \"postgresql-query\", \"redis-cache\"],\n\t\ticon: \"🛒\",\n\t\ttags: [\"ecommerce\", \"store\", \"products\", \"orders\", \"commerce\"],\n\t},\n\t{\n\t\tid: \"infra-security\",\n\t\tname: \"Infra Security\",\n\t\tdescription:\n\t\t\t\"Infrastructure security with intrusion detection, encrypted secret management, and uptime monitoring\",\n\t\trequiredServices: [\"crowdsec\", \"infisical\", \"uptime-kuma\"],\n\t\tskills: [\"crowdsec-protect\", \"infisical-secrets\", \"uptime-kuma-monitor\"],\n\t\ticon: \"🛡️\",\n\t\ttags: [\"security\", \"secrets\", \"monitoring\", \"intrusion-detection\"],\n\t},\n\t{\n\t\tid: \"fine-tuning-lab\",\n\t\tname: \"Fine-Tuning Lab\",\n\t\tdescription:\n\t\t\t\"Custom LLM fine-tuning pipeline with LoRA/QLoRA support, local model inference, and dataset storage\",\n\t\trequiredServices: [\"axolotl\", \"ollama\", \"minio\", \"postgresql\"],\n\t\tskills: [\"axolotl-finetune\", \"ollama-local-llm\", \"minio-storage\", \"postgresql-query\"],\n\t\ticon: \"🎯\",\n\t\ttags: [\"fine-tuning\", \"llm\", \"training\", \"lora\", \"models\"],\n\t},\n\t{\n\t\tid: \"marketing-suite\",\n\t\tname: \"Marketing Suite\",\n\t\tdescription:\n\t\t\t\"Full marketing stack with blogging, email automation, newsletter management, and web analytics\",\n\t\trequiredServices: [\"ghost\", \"mautic\", \"listmonk\", \"umami\"],\n\t\tskills: [\"ghost-publish\", \"mautic-campaign\", \"listmonk-email\", \"umami-analytics\"],\n\t\ticon: \"📣\",\n\t\ttags: [\"marketing\", \"blog\", \"email\", \"analytics\", \"content\"],\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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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_skill_manifest = require("../skill-manifest
|
|
2
|
+
const require_skill_manifest = require("../skill-manifest-B8znSsym.cjs");
|
|
3
3
|
exports.getAllManifestSkills = require_skill_manifest.getAllManifestSkills;
|
|
4
4
|
exports.getManifestSkillById = require_skill_manifest.getManifestSkillById;
|
|
5
5
|
exports.getManifestSkillCount = require_skill_manifest.getManifestSkillCount;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as getManifestSkillById, r as getManifestSkillCount, t as getAllManifestSkills } from "../skill-manifest-
|
|
1
|
+
import { n as getManifestSkillById, r as getManifestSkillCount, t as getAllManifestSkills } from "../skill-manifest-6XhrhWsG.mjs";
|
|
2
2
|
export { getAllManifestSkills, getManifestSkillById, getManifestSkillCount };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
//#region src/track-analytics.ts
|
|
3
|
+
/**
|
|
4
|
+
* Build an analytics payload from generation input and metadata.
|
|
5
|
+
* Pure function — does not send anything.
|
|
6
|
+
*/
|
|
7
|
+
function buildAnalyticsPayload(input, metadata, source, presetId) {
|
|
8
|
+
return {
|
|
9
|
+
source,
|
|
10
|
+
buildMethod: presetId ? "preset" : "custom",
|
|
11
|
+
presetId: presetId ?? null,
|
|
12
|
+
services: input.services,
|
|
13
|
+
skillPacks: input.skillPacks,
|
|
14
|
+
serviceCount: metadata.serviceCount,
|
|
15
|
+
proxy: input.proxy,
|
|
16
|
+
deployment: input.deployment,
|
|
17
|
+
deploymentType: input.deploymentType,
|
|
18
|
+
platform: input.platform,
|
|
19
|
+
gpu: input.gpu,
|
|
20
|
+
monitoring: input.monitoring,
|
|
21
|
+
hasDomain: Boolean(input.domain),
|
|
22
|
+
openclawImage: input.openclawImage,
|
|
23
|
+
estimatedMemoryMB: metadata.estimatedMemoryMB
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
const DEFAULT_API_URL = "https://better-openclaw.dev/api/v1/analytics/event";
|
|
27
|
+
/**
|
|
28
|
+
* Fire-and-forget POST to the analytics endpoint.
|
|
29
|
+
* Respects DISABLE_ANALYTICS=true env var.
|
|
30
|
+
* Silently catches all errors — tracking must never crash the main flow.
|
|
31
|
+
*/
|
|
32
|
+
async function trackAnalytics(payload, apiUrl = DEFAULT_API_URL) {
|
|
33
|
+
if (process.env.DISABLE_ANALYTICS === "true") return;
|
|
34
|
+
try {
|
|
35
|
+
const controller = new AbortController();
|
|
36
|
+
const timeout = setTimeout(() => controller.abort(), 5e3);
|
|
37
|
+
await fetch(apiUrl, {
|
|
38
|
+
method: "POST",
|
|
39
|
+
headers: { "Content-Type": "application/json" },
|
|
40
|
+
body: JSON.stringify(payload),
|
|
41
|
+
signal: controller.signal
|
|
42
|
+
});
|
|
43
|
+
clearTimeout(timeout);
|
|
44
|
+
} catch {}
|
|
45
|
+
}
|
|
46
|
+
//#endregion
|
|
47
|
+
exports.buildAnalyticsPayload = buildAnalyticsPayload;
|
|
48
|
+
exports.trackAnalytics = trackAnalytics;
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=track-analytics.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-analytics.cjs","names":[],"sources":["../src/track-analytics.ts"],"sourcesContent":["import type { GenerationInput, GenerationMetadata } from \"./types.js\";\n\nexport interface AnalyticsPayload {\n\tsource: \"cli\" | \"web\" | \"api\" | \"mcp\";\n\tbuildMethod: \"preset\" | \"custom\";\n\tpresetId: string | null;\n\tservices: string[];\n\tskillPacks: string[];\n\tserviceCount: number;\n\tproxy: string;\n\tdeployment: string;\n\tdeploymentType: string;\n\tplatform: string;\n\tgpu: boolean;\n\tmonitoring: boolean;\n\thasDomain: boolean;\n\topenclawImage: string;\n\testimatedMemoryMB: number;\n}\n\n/**\n * Build an analytics payload from generation input and metadata.\n * Pure function — does not send anything.\n */\nexport function buildAnalyticsPayload(\n\tinput: GenerationInput,\n\tmetadata: GenerationMetadata,\n\tsource: AnalyticsPayload[\"source\"],\n\tpresetId?: string | null,\n): AnalyticsPayload {\n\treturn {\n\t\tsource,\n\t\tbuildMethod: presetId ? \"preset\" : \"custom\",\n\t\tpresetId: presetId ?? null,\n\t\tservices: input.services,\n\t\tskillPacks: input.skillPacks,\n\t\tserviceCount: metadata.serviceCount,\n\t\tproxy: input.proxy,\n\t\tdeployment: input.deployment,\n\t\tdeploymentType: input.deploymentType,\n\t\tplatform: input.platform,\n\t\tgpu: input.gpu,\n\t\tmonitoring: input.monitoring,\n\t\thasDomain: Boolean(input.domain),\n\t\topenclawImage: input.openclawImage,\n\t\testimatedMemoryMB: metadata.estimatedMemoryMB,\n\t};\n}\n\nconst DEFAULT_API_URL = \"https://better-openclaw.dev/api/v1/analytics/event\";\n\n/**\n * Fire-and-forget POST to the analytics endpoint.\n * Respects DISABLE_ANALYTICS=true env var.\n * Silently catches all errors — tracking must never crash the main flow.\n */\nexport async function trackAnalytics(\n\tpayload: AnalyticsPayload,\n\tapiUrl: string = DEFAULT_API_URL,\n): Promise<void> {\n\tif (process.env.DISABLE_ANALYTICS === \"true\") return;\n\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), 5000);\n\t\tawait fetch(apiUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify(payload),\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tclearTimeout(timeout);\n\t} catch {\n\t\t// Silent — tracking must never block or crash generation\n\t}\n}\n"],"mappings":";;;;;;AAwBA,SAAgB,sBACf,OACA,UACA,QACA,UACmB;AACnB,QAAO;EACN;EACA,aAAa,WAAW,WAAW;EACnC,UAAU,YAAY;EACtB,UAAU,MAAM;EAChB,YAAY,MAAM;EAClB,cAAc,SAAS;EACvB,OAAO,MAAM;EACb,YAAY,MAAM;EAClB,gBAAgB,MAAM;EACtB,UAAU,MAAM;EAChB,KAAK,MAAM;EACX,YAAY,MAAM;EAClB,WAAW,QAAQ,MAAM,OAAO;EAChC,eAAe,MAAM;EACrB,mBAAmB,SAAS;EAC5B;;AAGF,MAAM,kBAAkB;;;;;;AAOxB,eAAsB,eACrB,SACA,SAAiB,iBACD;AAChB,KAAI,QAAQ,IAAI,sBAAsB,OAAQ;AAE9C,KAAI;EACH,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,UAAU,iBAAiB,WAAW,OAAO,EAAE,IAAK;AAC1D,QAAM,MAAM,QAAQ;GACnB,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAC/C,MAAM,KAAK,UAAU,QAAQ;GAC7B,QAAQ,WAAW;GACnB,CAAC;AACF,eAAa,QAAQ;SACd"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { GenerationInput, GenerationMetadata } from "./types.cjs";
|
|
2
|
+
|
|
3
|
+
//#region src/track-analytics.d.ts
|
|
4
|
+
interface AnalyticsPayload {
|
|
5
|
+
source: "cli" | "web" | "api" | "mcp";
|
|
6
|
+
buildMethod: "preset" | "custom";
|
|
7
|
+
presetId: string | null;
|
|
8
|
+
services: string[];
|
|
9
|
+
skillPacks: string[];
|
|
10
|
+
serviceCount: number;
|
|
11
|
+
proxy: string;
|
|
12
|
+
deployment: string;
|
|
13
|
+
deploymentType: string;
|
|
14
|
+
platform: string;
|
|
15
|
+
gpu: boolean;
|
|
16
|
+
monitoring: boolean;
|
|
17
|
+
hasDomain: boolean;
|
|
18
|
+
openclawImage: string;
|
|
19
|
+
estimatedMemoryMB: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build an analytics payload from generation input and metadata.
|
|
23
|
+
* Pure function — does not send anything.
|
|
24
|
+
*/
|
|
25
|
+
declare function buildAnalyticsPayload(input: GenerationInput, metadata: GenerationMetadata, source: AnalyticsPayload["source"], presetId?: string | null): AnalyticsPayload;
|
|
26
|
+
/**
|
|
27
|
+
* Fire-and-forget POST to the analytics endpoint.
|
|
28
|
+
* Respects DISABLE_ANALYTICS=true env var.
|
|
29
|
+
* Silently catches all errors — tracking must never crash the main flow.
|
|
30
|
+
*/
|
|
31
|
+
declare function trackAnalytics(payload: AnalyticsPayload, apiUrl?: string): Promise<void>;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { AnalyticsPayload, buildAnalyticsPayload, trackAnalytics };
|
|
34
|
+
//# sourceMappingURL=track-analytics.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-analytics.d.cts","names":[],"sources":["../src/track-analytics.ts"],"mappings":";;;UAEiB,gBAAA;EAChB,MAAA;EACA,WAAA;EACA,QAAA;EACA,QAAA;EACA,UAAA;EACA,YAAA;EACA,KAAA;EACA,UAAA;EACA,cAAA;EACA,QAAA;EACA,GAAA;EACA,UAAA;EACA,SAAA;EACA,aAAA;EACA,iBAAA;AAAA;;;;;iBAOe,qBAAA,CACf,KAAA,EAAO,eAAA,EACP,QAAA,EAAU,kBAAA,EACV,MAAA,EAAQ,gBAAA,YACR,QAAA,mBACE,gBAAA;;AALH;;;;iBAgCsB,cAAA,CACrB,OAAA,EAAS,gBAAA,EACT,MAAA,YACE,OAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { GenerationInput, GenerationMetadata } from "./types.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/track-analytics.d.ts
|
|
4
|
+
interface AnalyticsPayload {
|
|
5
|
+
source: "cli" | "web" | "api" | "mcp";
|
|
6
|
+
buildMethod: "preset" | "custom";
|
|
7
|
+
presetId: string | null;
|
|
8
|
+
services: string[];
|
|
9
|
+
skillPacks: string[];
|
|
10
|
+
serviceCount: number;
|
|
11
|
+
proxy: string;
|
|
12
|
+
deployment: string;
|
|
13
|
+
deploymentType: string;
|
|
14
|
+
platform: string;
|
|
15
|
+
gpu: boolean;
|
|
16
|
+
monitoring: boolean;
|
|
17
|
+
hasDomain: boolean;
|
|
18
|
+
openclawImage: string;
|
|
19
|
+
estimatedMemoryMB: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Build an analytics payload from generation input and metadata.
|
|
23
|
+
* Pure function — does not send anything.
|
|
24
|
+
*/
|
|
25
|
+
declare function buildAnalyticsPayload(input: GenerationInput, metadata: GenerationMetadata, source: AnalyticsPayload["source"], presetId?: string | null): AnalyticsPayload;
|
|
26
|
+
/**
|
|
27
|
+
* Fire-and-forget POST to the analytics endpoint.
|
|
28
|
+
* Respects DISABLE_ANALYTICS=true env var.
|
|
29
|
+
* Silently catches all errors — tracking must never crash the main flow.
|
|
30
|
+
*/
|
|
31
|
+
declare function trackAnalytics(payload: AnalyticsPayload, apiUrl?: string): Promise<void>;
|
|
32
|
+
//#endregion
|
|
33
|
+
export { AnalyticsPayload, buildAnalyticsPayload, trackAnalytics };
|
|
34
|
+
//# sourceMappingURL=track-analytics.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-analytics.d.mts","names":[],"sources":["../src/track-analytics.ts"],"mappings":";;;UAEiB,gBAAA;EAChB,MAAA;EACA,WAAA;EACA,QAAA;EACA,QAAA;EACA,UAAA;EACA,YAAA;EACA,KAAA;EACA,UAAA;EACA,cAAA;EACA,QAAA;EACA,GAAA;EACA,UAAA;EACA,SAAA;EACA,aAAA;EACA,iBAAA;AAAA;;;;;iBAOe,qBAAA,CACf,KAAA,EAAO,eAAA,EACP,QAAA,EAAU,kBAAA,EACV,MAAA,EAAQ,gBAAA,YACR,QAAA,mBACE,gBAAA;;;AALH;;;iBAgCsB,cAAA,CACrB,OAAA,EAAS,gBAAA,EACT,MAAA,YACE,OAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
//#region src/track-analytics.ts
|
|
2
|
+
/**
|
|
3
|
+
* Build an analytics payload from generation input and metadata.
|
|
4
|
+
* Pure function — does not send anything.
|
|
5
|
+
*/
|
|
6
|
+
function buildAnalyticsPayload(input, metadata, source, presetId) {
|
|
7
|
+
return {
|
|
8
|
+
source,
|
|
9
|
+
buildMethod: presetId ? "preset" : "custom",
|
|
10
|
+
presetId: presetId ?? null,
|
|
11
|
+
services: input.services,
|
|
12
|
+
skillPacks: input.skillPacks,
|
|
13
|
+
serviceCount: metadata.serviceCount,
|
|
14
|
+
proxy: input.proxy,
|
|
15
|
+
deployment: input.deployment,
|
|
16
|
+
deploymentType: input.deploymentType,
|
|
17
|
+
platform: input.platform,
|
|
18
|
+
gpu: input.gpu,
|
|
19
|
+
monitoring: input.monitoring,
|
|
20
|
+
hasDomain: Boolean(input.domain),
|
|
21
|
+
openclawImage: input.openclawImage,
|
|
22
|
+
estimatedMemoryMB: metadata.estimatedMemoryMB
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const DEFAULT_API_URL = "https://better-openclaw.dev/api/v1/analytics/event";
|
|
26
|
+
/**
|
|
27
|
+
* Fire-and-forget POST to the analytics endpoint.
|
|
28
|
+
* Respects DISABLE_ANALYTICS=true env var.
|
|
29
|
+
* Silently catches all errors — tracking must never crash the main flow.
|
|
30
|
+
*/
|
|
31
|
+
async function trackAnalytics(payload, apiUrl = DEFAULT_API_URL) {
|
|
32
|
+
if (process.env.DISABLE_ANALYTICS === "true") return;
|
|
33
|
+
try {
|
|
34
|
+
const controller = new AbortController();
|
|
35
|
+
const timeout = setTimeout(() => controller.abort(), 5e3);
|
|
36
|
+
await fetch(apiUrl, {
|
|
37
|
+
method: "POST",
|
|
38
|
+
headers: { "Content-Type": "application/json" },
|
|
39
|
+
body: JSON.stringify(payload),
|
|
40
|
+
signal: controller.signal
|
|
41
|
+
});
|
|
42
|
+
clearTimeout(timeout);
|
|
43
|
+
} catch {}
|
|
44
|
+
}
|
|
45
|
+
//#endregion
|
|
46
|
+
export { buildAnalyticsPayload, trackAnalytics };
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=track-analytics.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-analytics.mjs","names":[],"sources":["../src/track-analytics.ts"],"sourcesContent":["import type { GenerationInput, GenerationMetadata } from \"./types.js\";\n\nexport interface AnalyticsPayload {\n\tsource: \"cli\" | \"web\" | \"api\" | \"mcp\";\n\tbuildMethod: \"preset\" | \"custom\";\n\tpresetId: string | null;\n\tservices: string[];\n\tskillPacks: string[];\n\tserviceCount: number;\n\tproxy: string;\n\tdeployment: string;\n\tdeploymentType: string;\n\tplatform: string;\n\tgpu: boolean;\n\tmonitoring: boolean;\n\thasDomain: boolean;\n\topenclawImage: string;\n\testimatedMemoryMB: number;\n}\n\n/**\n * Build an analytics payload from generation input and metadata.\n * Pure function — does not send anything.\n */\nexport function buildAnalyticsPayload(\n\tinput: GenerationInput,\n\tmetadata: GenerationMetadata,\n\tsource: AnalyticsPayload[\"source\"],\n\tpresetId?: string | null,\n): AnalyticsPayload {\n\treturn {\n\t\tsource,\n\t\tbuildMethod: presetId ? \"preset\" : \"custom\",\n\t\tpresetId: presetId ?? null,\n\t\tservices: input.services,\n\t\tskillPacks: input.skillPacks,\n\t\tserviceCount: metadata.serviceCount,\n\t\tproxy: input.proxy,\n\t\tdeployment: input.deployment,\n\t\tdeploymentType: input.deploymentType,\n\t\tplatform: input.platform,\n\t\tgpu: input.gpu,\n\t\tmonitoring: input.monitoring,\n\t\thasDomain: Boolean(input.domain),\n\t\topenclawImage: input.openclawImage,\n\t\testimatedMemoryMB: metadata.estimatedMemoryMB,\n\t};\n}\n\nconst DEFAULT_API_URL = \"https://better-openclaw.dev/api/v1/analytics/event\";\n\n/**\n * Fire-and-forget POST to the analytics endpoint.\n * Respects DISABLE_ANALYTICS=true env var.\n * Silently catches all errors — tracking must never crash the main flow.\n */\nexport async function trackAnalytics(\n\tpayload: AnalyticsPayload,\n\tapiUrl: string = DEFAULT_API_URL,\n): Promise<void> {\n\tif (process.env.DISABLE_ANALYTICS === \"true\") return;\n\n\ttry {\n\t\tconst controller = new AbortController();\n\t\tconst timeout = setTimeout(() => controller.abort(), 5000);\n\t\tawait fetch(apiUrl, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\tbody: JSON.stringify(payload),\n\t\t\tsignal: controller.signal,\n\t\t});\n\t\tclearTimeout(timeout);\n\t} catch {\n\t\t// Silent — tracking must never block or crash generation\n\t}\n}\n"],"mappings":";;;;;AAwBA,SAAgB,sBACf,OACA,UACA,QACA,UACmB;AACnB,QAAO;EACN;EACA,aAAa,WAAW,WAAW;EACnC,UAAU,YAAY;EACtB,UAAU,MAAM;EAChB,YAAY,MAAM;EAClB,cAAc,SAAS;EACvB,OAAO,MAAM;EACb,YAAY,MAAM;EAClB,gBAAgB,MAAM;EACtB,UAAU,MAAM;EAChB,KAAK,MAAM;EACX,YAAY,MAAM;EAClB,WAAW,QAAQ,MAAM,OAAO;EAChC,eAAe,MAAM;EACrB,mBAAmB,SAAS;EAC5B;;AAGF,MAAM,kBAAkB;;;;;;AAOxB,eAAsB,eACrB,SACA,SAAiB,iBACD;AAChB,KAAI,QAAQ,IAAI,sBAAsB,OAAQ;AAE9C,KAAI;EACH,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,UAAU,iBAAiB,WAAW,OAAO,EAAE,IAAK;AAC1D,QAAM,MAAM,QAAQ;GACnB,QAAQ;GACR,SAAS,EAAE,gBAAgB,oBAAoB;GAC/C,MAAM,KAAK,UAAU,QAAQ;GAC7B,QAAQ,WAAW;GACnB,CAAC;AACF,eAAa,QAAQ;SACd"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
const require_vi_2VT5v0um = require("./vi.2VT5v0um-iVBt6Fyq.cjs");
|
|
2
|
+
const require_track_analytics = require("./track-analytics.cjs");
|
|
3
|
+
//#region src/track-analytics.test.ts
|
|
4
|
+
const baseInput = {
|
|
5
|
+
projectName: "test-stack",
|
|
6
|
+
services: [
|
|
7
|
+
"postgresql",
|
|
8
|
+
"redis",
|
|
9
|
+
"n8n"
|
|
10
|
+
],
|
|
11
|
+
skillPacks: ["research-agent"],
|
|
12
|
+
aiProviders: ["openai"],
|
|
13
|
+
gsdRuntimes: [],
|
|
14
|
+
proxy: "caddy",
|
|
15
|
+
domain: "example.com",
|
|
16
|
+
gpu: false,
|
|
17
|
+
platform: "linux/amd64",
|
|
18
|
+
deployment: "local",
|
|
19
|
+
deploymentType: "docker",
|
|
20
|
+
generateSecrets: true,
|
|
21
|
+
openclawVersion: "latest",
|
|
22
|
+
monitoring: true,
|
|
23
|
+
openclawImage: "official",
|
|
24
|
+
openclawInstallMethod: "docker",
|
|
25
|
+
hardened: true,
|
|
26
|
+
deployTarget: "local"
|
|
27
|
+
};
|
|
28
|
+
const baseMetadata = {
|
|
29
|
+
serviceCount: 5,
|
|
30
|
+
skillCount: 1,
|
|
31
|
+
estimatedMemoryMB: 2048,
|
|
32
|
+
resolvedServices: [
|
|
33
|
+
"postgresql",
|
|
34
|
+
"redis",
|
|
35
|
+
"n8n",
|
|
36
|
+
"caddy",
|
|
37
|
+
"searxng"
|
|
38
|
+
],
|
|
39
|
+
generatedAt: "2026-03-09T00:00:00.000Z"
|
|
40
|
+
};
|
|
41
|
+
require_vi_2VT5v0um.describe("buildAnalyticsPayload", () => {
|
|
42
|
+
require_vi_2VT5v0um.it("builds payload for a preset-based CLI generation", () => {
|
|
43
|
+
const payload = require_track_analytics.buildAnalyticsPayload(baseInput, baseMetadata, "cli", "researcher");
|
|
44
|
+
require_vi_2VT5v0um.globalExpect(payload.source).toBe("cli");
|
|
45
|
+
require_vi_2VT5v0um.globalExpect(payload.buildMethod).toBe("preset");
|
|
46
|
+
require_vi_2VT5v0um.globalExpect(payload.presetId).toBe("researcher");
|
|
47
|
+
require_vi_2VT5v0um.globalExpect(payload.services).toEqual([
|
|
48
|
+
"postgresql",
|
|
49
|
+
"redis",
|
|
50
|
+
"n8n"
|
|
51
|
+
]);
|
|
52
|
+
require_vi_2VT5v0um.globalExpect(payload.skillPacks).toEqual(["research-agent"]);
|
|
53
|
+
require_vi_2VT5v0um.globalExpect(payload.serviceCount).toBe(5);
|
|
54
|
+
require_vi_2VT5v0um.globalExpect(payload.proxy).toBe("caddy");
|
|
55
|
+
require_vi_2VT5v0um.globalExpect(payload.deployment).toBe("local");
|
|
56
|
+
require_vi_2VT5v0um.globalExpect(payload.deploymentType).toBe("docker");
|
|
57
|
+
require_vi_2VT5v0um.globalExpect(payload.platform).toBe("linux/amd64");
|
|
58
|
+
require_vi_2VT5v0um.globalExpect(payload.gpu).toBe(false);
|
|
59
|
+
require_vi_2VT5v0um.globalExpect(payload.monitoring).toBe(true);
|
|
60
|
+
require_vi_2VT5v0um.globalExpect(payload.hasDomain).toBe(true);
|
|
61
|
+
require_vi_2VT5v0um.globalExpect(payload.openclawImage).toBe("official");
|
|
62
|
+
require_vi_2VT5v0um.globalExpect(payload.estimatedMemoryMB).toBe(2048);
|
|
63
|
+
});
|
|
64
|
+
require_vi_2VT5v0um.it("sets buildMethod to custom when no presetId", () => {
|
|
65
|
+
const payload = require_track_analytics.buildAnalyticsPayload(baseInput, baseMetadata, "web");
|
|
66
|
+
require_vi_2VT5v0um.globalExpect(payload.buildMethod).toBe("custom");
|
|
67
|
+
require_vi_2VT5v0um.globalExpect(payload.presetId).toBeNull();
|
|
68
|
+
});
|
|
69
|
+
require_vi_2VT5v0um.it("sets buildMethod to custom when presetId is null", () => {
|
|
70
|
+
const payload = require_track_analytics.buildAnalyticsPayload(baseInput, baseMetadata, "api", null);
|
|
71
|
+
require_vi_2VT5v0um.globalExpect(payload.buildMethod).toBe("custom");
|
|
72
|
+
require_vi_2VT5v0um.globalExpect(payload.presetId).toBeNull();
|
|
73
|
+
});
|
|
74
|
+
require_vi_2VT5v0um.it("sets hasDomain to false when no domain in input", () => {
|
|
75
|
+
require_vi_2VT5v0um.globalExpect(require_track_analytics.buildAnalyticsPayload({
|
|
76
|
+
...baseInput,
|
|
77
|
+
domain: void 0
|
|
78
|
+
}, baseMetadata, "mcp").hasDomain).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
require_vi_2VT5v0um.it("preserves all source types", () => {
|
|
81
|
+
for (const source of [
|
|
82
|
+
"cli",
|
|
83
|
+
"web",
|
|
84
|
+
"api",
|
|
85
|
+
"mcp"
|
|
86
|
+
]) require_vi_2VT5v0um.globalExpect(require_track_analytics.buildAnalyticsPayload(baseInput, baseMetadata, source).source).toBe(source);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//#endregion
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=track-analytics.test.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-analytics.test.cjs","names":["describe","buildAnalyticsPayload"],"sources":["../src/track-analytics.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { buildAnalyticsPayload } from \"./track-analytics.js\";\nimport type { GenerationInput, GenerationMetadata } from \"./types.js\";\n\nconst baseInput: GenerationInput = {\n\tprojectName: \"test-stack\",\n\tservices: [\"postgresql\", \"redis\", \"n8n\"],\n\tskillPacks: [\"research-agent\"],\n\taiProviders: [\"openai\"],\n\tgsdRuntimes: [],\n\tproxy: \"caddy\",\n\tdomain: \"example.com\",\n\tgpu: false,\n\tplatform: \"linux/amd64\",\n\tdeployment: \"local\",\n\tdeploymentType: \"docker\",\n\tgenerateSecrets: true,\n\topenclawVersion: \"latest\",\n\tmonitoring: true,\n\topenclawImage: \"official\",\n\topenclawInstallMethod: \"docker\",\n\thardened: true,\n\tdeployTarget: \"local\",\n};\n\nconst baseMetadata: GenerationMetadata = {\n\tserviceCount: 5,\n\tskillCount: 1,\n\testimatedMemoryMB: 2048,\n\tresolvedServices: [\"postgresql\", \"redis\", \"n8n\", \"caddy\", \"searxng\"],\n\tgeneratedAt: \"2026-03-09T00:00:00.000Z\",\n};\n\ndescribe(\"buildAnalyticsPayload\", () => {\n\tit(\"builds payload for a preset-based CLI generation\", () => {\n\t\tconst payload = buildAnalyticsPayload(baseInput, baseMetadata, \"cli\", \"researcher\");\n\n\t\texpect(payload.source).toBe(\"cli\");\n\t\texpect(payload.buildMethod).toBe(\"preset\");\n\t\texpect(payload.presetId).toBe(\"researcher\");\n\t\texpect(payload.services).toEqual([\"postgresql\", \"redis\", \"n8n\"]);\n\t\texpect(payload.skillPacks).toEqual([\"research-agent\"]);\n\t\texpect(payload.serviceCount).toBe(5);\n\t\texpect(payload.proxy).toBe(\"caddy\");\n\t\texpect(payload.deployment).toBe(\"local\");\n\t\texpect(payload.deploymentType).toBe(\"docker\");\n\t\texpect(payload.platform).toBe(\"linux/amd64\");\n\t\texpect(payload.gpu).toBe(false);\n\t\texpect(payload.monitoring).toBe(true);\n\t\texpect(payload.hasDomain).toBe(true);\n\t\texpect(payload.openclawImage).toBe(\"official\");\n\t\texpect(payload.estimatedMemoryMB).toBe(2048);\n\t});\n\n\tit(\"sets buildMethod to custom when no presetId\", () => {\n\t\tconst payload = buildAnalyticsPayload(baseInput, baseMetadata, \"web\");\n\n\t\texpect(payload.buildMethod).toBe(\"custom\");\n\t\texpect(payload.presetId).toBeNull();\n\t});\n\n\tit(\"sets buildMethod to custom when presetId is null\", () => {\n\t\tconst payload = buildAnalyticsPayload(baseInput, baseMetadata, \"api\", null);\n\n\t\texpect(payload.buildMethod).toBe(\"custom\");\n\t\texpect(payload.presetId).toBeNull();\n\t});\n\n\tit(\"sets hasDomain to false when no domain in input\", () => {\n\t\tconst noDomainInput = { ...baseInput, domain: undefined };\n\t\tconst payload = buildAnalyticsPayload(noDomainInput, baseMetadata, \"mcp\");\n\n\t\texpect(payload.hasDomain).toBe(false);\n\t});\n\n\tit(\"preserves all source types\", () => {\n\t\tfor (const source of [\"cli\", \"web\", \"api\", \"mcp\"] as const) {\n\t\t\tconst payload = buildAnalyticsPayload(baseInput, baseMetadata, source);\n\t\t\texpect(payload.source).toBe(source);\n\t\t}\n\t});\n});\n"],"mappings":";;;AAIA,MAAM,YAA6B;CAClC,aAAa;CACb,UAAU;EAAC;EAAc;EAAS;EAAM;CACxC,YAAY,CAAC,iBAAiB;CAC9B,aAAa,CAAC,SAAS;CACvB,aAAa,EAAE;CACf,OAAO;CACP,QAAQ;CACR,KAAK;CACL,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,iBAAiB;CACjB,iBAAiB;CACjB,YAAY;CACZ,eAAe;CACf,uBAAuB;CACvB,UAAU;CACV,cAAc;CACd;AAED,MAAM,eAAmC;CACxC,cAAc;CACd,YAAY;CACZ,mBAAmB;CACnB,kBAAkB;EAAC;EAAc;EAAS;EAAO;EAAS;EAAU;CACpE,aAAa;CACb;AAEDA,oBAAAA,SAAS,+BAA+B;AACvC,qBAAA,GAAG,0DAA0D;EAC5D,MAAM,UAAUC,wBAAAA,sBAAsB,WAAW,cAAc,OAAO,aAAa;AAEnF,sBAAA,aAAO,QAAQ,OAAO,CAAC,KAAK,MAAM;AAClC,sBAAA,aAAO,QAAQ,YAAY,CAAC,KAAK,SAAS;AAC1C,sBAAA,aAAO,QAAQ,SAAS,CAAC,KAAK,aAAa;AAC3C,sBAAA,aAAO,QAAQ,SAAS,CAAC,QAAQ;GAAC;GAAc;GAAS;GAAM,CAAC;AAChE,sBAAA,aAAO,QAAQ,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC;AACtD,sBAAA,aAAO,QAAQ,aAAa,CAAC,KAAK,EAAE;AACpC,sBAAA,aAAO,QAAQ,MAAM,CAAC,KAAK,QAAQ;AACnC,sBAAA,aAAO,QAAQ,WAAW,CAAC,KAAK,QAAQ;AACxC,sBAAA,aAAO,QAAQ,eAAe,CAAC,KAAK,SAAS;AAC7C,sBAAA,aAAO,QAAQ,SAAS,CAAC,KAAK,cAAc;AAC5C,sBAAA,aAAO,QAAQ,IAAI,CAAC,KAAK,MAAM;AAC/B,sBAAA,aAAO,QAAQ,WAAW,CAAC,KAAK,KAAK;AACrC,sBAAA,aAAO,QAAQ,UAAU,CAAC,KAAK,KAAK;AACpC,sBAAA,aAAO,QAAQ,cAAc,CAAC,KAAK,WAAW;AAC9C,sBAAA,aAAO,QAAQ,kBAAkB,CAAC,KAAK,KAAK;GAC3C;AAEF,qBAAA,GAAG,qDAAqD;EACvD,MAAM,UAAUA,wBAAAA,sBAAsB,WAAW,cAAc,MAAM;AAErE,sBAAA,aAAO,QAAQ,YAAY,CAAC,KAAK,SAAS;AAC1C,sBAAA,aAAO,QAAQ,SAAS,CAAC,UAAU;GAClC;AAEF,qBAAA,GAAG,0DAA0D;EAC5D,MAAM,UAAUA,wBAAAA,sBAAsB,WAAW,cAAc,OAAO,KAAK;AAE3E,sBAAA,aAAO,QAAQ,YAAY,CAAC,KAAK,SAAS;AAC1C,sBAAA,aAAO,QAAQ,SAAS,CAAC,UAAU;GAClC;AAEF,qBAAA,GAAG,yDAAyD;AAI3D,sBAAA,aAFgBA,wBAAAA,sBADM;GAAE,GAAG;GAAW,QAAQ,KAAA;GAAW,EACJ,cAAc,MAAM,CAE1D,UAAU,CAAC,KAAK,MAAM;GACpC;AAEF,qBAAA,GAAG,oCAAoC;AACtC,OAAK,MAAM,UAAU;GAAC;GAAO;GAAO;GAAO;GAAM,CAEhD,qBAAA,aADgBA,wBAAAA,sBAAsB,WAAW,cAAc,OAAO,CACvD,OAAO,CAAC,KAAK,OAAO;GAEnC;EACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { n as describe, r as it, t as globalExpect } from "./vi.2VT5v0um-C_jmO7m2.mjs";
|
|
2
|
+
import { buildAnalyticsPayload } from "./track-analytics.mjs";
|
|
3
|
+
//#region src/track-analytics.test.ts
|
|
4
|
+
const baseInput = {
|
|
5
|
+
projectName: "test-stack",
|
|
6
|
+
services: [
|
|
7
|
+
"postgresql",
|
|
8
|
+
"redis",
|
|
9
|
+
"n8n"
|
|
10
|
+
],
|
|
11
|
+
skillPacks: ["research-agent"],
|
|
12
|
+
aiProviders: ["openai"],
|
|
13
|
+
gsdRuntimes: [],
|
|
14
|
+
proxy: "caddy",
|
|
15
|
+
domain: "example.com",
|
|
16
|
+
gpu: false,
|
|
17
|
+
platform: "linux/amd64",
|
|
18
|
+
deployment: "local",
|
|
19
|
+
deploymentType: "docker",
|
|
20
|
+
generateSecrets: true,
|
|
21
|
+
openclawVersion: "latest",
|
|
22
|
+
monitoring: true,
|
|
23
|
+
openclawImage: "official",
|
|
24
|
+
openclawInstallMethod: "docker",
|
|
25
|
+
hardened: true,
|
|
26
|
+
deployTarget: "local"
|
|
27
|
+
};
|
|
28
|
+
const baseMetadata = {
|
|
29
|
+
serviceCount: 5,
|
|
30
|
+
skillCount: 1,
|
|
31
|
+
estimatedMemoryMB: 2048,
|
|
32
|
+
resolvedServices: [
|
|
33
|
+
"postgresql",
|
|
34
|
+
"redis",
|
|
35
|
+
"n8n",
|
|
36
|
+
"caddy",
|
|
37
|
+
"searxng"
|
|
38
|
+
],
|
|
39
|
+
generatedAt: "2026-03-09T00:00:00.000Z"
|
|
40
|
+
};
|
|
41
|
+
describe("buildAnalyticsPayload", () => {
|
|
42
|
+
it("builds payload for a preset-based CLI generation", () => {
|
|
43
|
+
const payload = buildAnalyticsPayload(baseInput, baseMetadata, "cli", "researcher");
|
|
44
|
+
globalExpect(payload.source).toBe("cli");
|
|
45
|
+
globalExpect(payload.buildMethod).toBe("preset");
|
|
46
|
+
globalExpect(payload.presetId).toBe("researcher");
|
|
47
|
+
globalExpect(payload.services).toEqual([
|
|
48
|
+
"postgresql",
|
|
49
|
+
"redis",
|
|
50
|
+
"n8n"
|
|
51
|
+
]);
|
|
52
|
+
globalExpect(payload.skillPacks).toEqual(["research-agent"]);
|
|
53
|
+
globalExpect(payload.serviceCount).toBe(5);
|
|
54
|
+
globalExpect(payload.proxy).toBe("caddy");
|
|
55
|
+
globalExpect(payload.deployment).toBe("local");
|
|
56
|
+
globalExpect(payload.deploymentType).toBe("docker");
|
|
57
|
+
globalExpect(payload.platform).toBe("linux/amd64");
|
|
58
|
+
globalExpect(payload.gpu).toBe(false);
|
|
59
|
+
globalExpect(payload.monitoring).toBe(true);
|
|
60
|
+
globalExpect(payload.hasDomain).toBe(true);
|
|
61
|
+
globalExpect(payload.openclawImage).toBe("official");
|
|
62
|
+
globalExpect(payload.estimatedMemoryMB).toBe(2048);
|
|
63
|
+
});
|
|
64
|
+
it("sets buildMethod to custom when no presetId", () => {
|
|
65
|
+
const payload = buildAnalyticsPayload(baseInput, baseMetadata, "web");
|
|
66
|
+
globalExpect(payload.buildMethod).toBe("custom");
|
|
67
|
+
globalExpect(payload.presetId).toBeNull();
|
|
68
|
+
});
|
|
69
|
+
it("sets buildMethod to custom when presetId is null", () => {
|
|
70
|
+
const payload = buildAnalyticsPayload(baseInput, baseMetadata, "api", null);
|
|
71
|
+
globalExpect(payload.buildMethod).toBe("custom");
|
|
72
|
+
globalExpect(payload.presetId).toBeNull();
|
|
73
|
+
});
|
|
74
|
+
it("sets hasDomain to false when no domain in input", () => {
|
|
75
|
+
globalExpect(buildAnalyticsPayload({
|
|
76
|
+
...baseInput,
|
|
77
|
+
domain: void 0
|
|
78
|
+
}, baseMetadata, "mcp").hasDomain).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
it("preserves all source types", () => {
|
|
81
|
+
for (const source of [
|
|
82
|
+
"cli",
|
|
83
|
+
"web",
|
|
84
|
+
"api",
|
|
85
|
+
"mcp"
|
|
86
|
+
]) globalExpect(buildAnalyticsPayload(baseInput, baseMetadata, source).source).toBe(source);
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//#endregion
|
|
90
|
+
export {};
|
|
91
|
+
|
|
92
|
+
//# sourceMappingURL=track-analytics.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track-analytics.test.mjs","names":[],"sources":["../src/track-analytics.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\nimport { buildAnalyticsPayload } from \"./track-analytics.js\";\nimport type { GenerationInput, GenerationMetadata } from \"./types.js\";\n\nconst baseInput: GenerationInput = {\n\tprojectName: \"test-stack\",\n\tservices: [\"postgresql\", \"redis\", \"n8n\"],\n\tskillPacks: [\"research-agent\"],\n\taiProviders: [\"openai\"],\n\tgsdRuntimes: [],\n\tproxy: \"caddy\",\n\tdomain: \"example.com\",\n\tgpu: false,\n\tplatform: \"linux/amd64\",\n\tdeployment: \"local\",\n\tdeploymentType: \"docker\",\n\tgenerateSecrets: true,\n\topenclawVersion: \"latest\",\n\tmonitoring: true,\n\topenclawImage: \"official\",\n\topenclawInstallMethod: \"docker\",\n\thardened: true,\n\tdeployTarget: \"local\",\n};\n\nconst baseMetadata: GenerationMetadata = {\n\tserviceCount: 5,\n\tskillCount: 1,\n\testimatedMemoryMB: 2048,\n\tresolvedServices: [\"postgresql\", \"redis\", \"n8n\", \"caddy\", \"searxng\"],\n\tgeneratedAt: \"2026-03-09T00:00:00.000Z\",\n};\n\ndescribe(\"buildAnalyticsPayload\", () => {\n\tit(\"builds payload for a preset-based CLI generation\", () => {\n\t\tconst payload = buildAnalyticsPayload(baseInput, baseMetadata, \"cli\", \"researcher\");\n\n\t\texpect(payload.source).toBe(\"cli\");\n\t\texpect(payload.buildMethod).toBe(\"preset\");\n\t\texpect(payload.presetId).toBe(\"researcher\");\n\t\texpect(payload.services).toEqual([\"postgresql\", \"redis\", \"n8n\"]);\n\t\texpect(payload.skillPacks).toEqual([\"research-agent\"]);\n\t\texpect(payload.serviceCount).toBe(5);\n\t\texpect(payload.proxy).toBe(\"caddy\");\n\t\texpect(payload.deployment).toBe(\"local\");\n\t\texpect(payload.deploymentType).toBe(\"docker\");\n\t\texpect(payload.platform).toBe(\"linux/amd64\");\n\t\texpect(payload.gpu).toBe(false);\n\t\texpect(payload.monitoring).toBe(true);\n\t\texpect(payload.hasDomain).toBe(true);\n\t\texpect(payload.openclawImage).toBe(\"official\");\n\t\texpect(payload.estimatedMemoryMB).toBe(2048);\n\t});\n\n\tit(\"sets buildMethod to custom when no presetId\", () => {\n\t\tconst payload = buildAnalyticsPayload(baseInput, baseMetadata, \"web\");\n\n\t\texpect(payload.buildMethod).toBe(\"custom\");\n\t\texpect(payload.presetId).toBeNull();\n\t});\n\n\tit(\"sets buildMethod to custom when presetId is null\", () => {\n\t\tconst payload = buildAnalyticsPayload(baseInput, baseMetadata, \"api\", null);\n\n\t\texpect(payload.buildMethod).toBe(\"custom\");\n\t\texpect(payload.presetId).toBeNull();\n\t});\n\n\tit(\"sets hasDomain to false when no domain in input\", () => {\n\t\tconst noDomainInput = { ...baseInput, domain: undefined };\n\t\tconst payload = buildAnalyticsPayload(noDomainInput, baseMetadata, \"mcp\");\n\n\t\texpect(payload.hasDomain).toBe(false);\n\t});\n\n\tit(\"preserves all source types\", () => {\n\t\tfor (const source of [\"cli\", \"web\", \"api\", \"mcp\"] as const) {\n\t\t\tconst payload = buildAnalyticsPayload(baseInput, baseMetadata, source);\n\t\t\texpect(payload.source).toBe(source);\n\t\t}\n\t});\n});\n"],"mappings":";;;AAIA,MAAM,YAA6B;CAClC,aAAa;CACb,UAAU;EAAC;EAAc;EAAS;EAAM;CACxC,YAAY,CAAC,iBAAiB;CAC9B,aAAa,CAAC,SAAS;CACvB,aAAa,EAAE;CACf,OAAO;CACP,QAAQ;CACR,KAAK;CACL,UAAU;CACV,YAAY;CACZ,gBAAgB;CAChB,iBAAiB;CACjB,iBAAiB;CACjB,YAAY;CACZ,eAAe;CACf,uBAAuB;CACvB,UAAU;CACV,cAAc;CACd;AAED,MAAM,eAAmC;CACxC,cAAc;CACd,YAAY;CACZ,mBAAmB;CACnB,kBAAkB;EAAC;EAAc;EAAS;EAAO;EAAS;EAAU;CACpE,aAAa;CACb;AAED,SAAS,+BAA+B;AACvC,IAAG,0DAA0D;EAC5D,MAAM,UAAU,sBAAsB,WAAW,cAAc,OAAO,aAAa;AAEnF,eAAO,QAAQ,OAAO,CAAC,KAAK,MAAM;AAClC,eAAO,QAAQ,YAAY,CAAC,KAAK,SAAS;AAC1C,eAAO,QAAQ,SAAS,CAAC,KAAK,aAAa;AAC3C,eAAO,QAAQ,SAAS,CAAC,QAAQ;GAAC;GAAc;GAAS;GAAM,CAAC;AAChE,eAAO,QAAQ,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC;AACtD,eAAO,QAAQ,aAAa,CAAC,KAAK,EAAE;AACpC,eAAO,QAAQ,MAAM,CAAC,KAAK,QAAQ;AACnC,eAAO,QAAQ,WAAW,CAAC,KAAK,QAAQ;AACxC,eAAO,QAAQ,eAAe,CAAC,KAAK,SAAS;AAC7C,eAAO,QAAQ,SAAS,CAAC,KAAK,cAAc;AAC5C,eAAO,QAAQ,IAAI,CAAC,KAAK,MAAM;AAC/B,eAAO,QAAQ,WAAW,CAAC,KAAK,KAAK;AACrC,eAAO,QAAQ,UAAU,CAAC,KAAK,KAAK;AACpC,eAAO,QAAQ,cAAc,CAAC,KAAK,WAAW;AAC9C,eAAO,QAAQ,kBAAkB,CAAC,KAAK,KAAK;GAC3C;AAEF,IAAG,qDAAqD;EACvD,MAAM,UAAU,sBAAsB,WAAW,cAAc,MAAM;AAErE,eAAO,QAAQ,YAAY,CAAC,KAAK,SAAS;AAC1C,eAAO,QAAQ,SAAS,CAAC,UAAU;GAClC;AAEF,IAAG,0DAA0D;EAC5D,MAAM,UAAU,sBAAsB,WAAW,cAAc,OAAO,KAAK;AAE3E,eAAO,QAAQ,YAAY,CAAC,KAAK,SAAS;AAC1C,eAAO,QAAQ,SAAS,CAAC,UAAU;GAClC;AAEF,IAAG,yDAAyD;AAI3D,eAFgB,sBADM;GAAE,GAAG;GAAW,QAAQ,KAAA;GAAW,EACJ,cAAc,MAAM,CAE1D,UAAU,CAAC,KAAK,MAAM;GACpC;AAEF,IAAG,oCAAoC;AACtC,OAAK,MAAM,UAAU;GAAC;GAAO;GAAO;GAAO;GAAM,CAEhD,cADgB,sBAAsB,WAAW,cAAc,OAAO,CACvD,OAAO,CAAC,KAAK,OAAO;GAEnC;EACD"}
|
package/dist/types.cjs
CHANGED
|
@@ -245,6 +245,13 @@ const SERVICE_CATEGORIES = [
|
|
|
245
245
|
description: "IoT & Edge",
|
|
246
246
|
label: "IoT & Edge",
|
|
247
247
|
icon: "📡"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
id: "saas-boilerplate",
|
|
251
|
+
name: "SaaS Boilerplates",
|
|
252
|
+
description: "Full-stack SaaS starter kits and boilerplates",
|
|
253
|
+
label: "SaaS Boilerplates",
|
|
254
|
+
icon: "🚀"
|
|
248
255
|
}
|
|
249
256
|
];
|
|
250
257
|
//#endregion
|