crewswarm 0.8.1-beta
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/.env.example +155 -0
- package/LICENSE +21 -0
- package/README.md +316 -0
- package/apps/dashboard/dist/assets/chat-core-BwSoInmZ.js +1 -0
- package/apps/dashboard/dist/assets/chat-core-BwSoInmZ.js.br +0 -0
- package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js +1 -0
- package/apps/dashboard/dist/assets/cli-process-COMRNPqr.js.br +0 -0
- package/apps/dashboard/dist/assets/components-CSUb80ze.js +1 -0
- package/apps/dashboard/dist/assets/components-CSUb80ze.js.br +0 -0
- package/apps/dashboard/dist/assets/core-utils-CAVnDoe1.js +1 -0
- package/apps/dashboard/dist/assets/core-utils-CAVnDoe1.js.br +0 -0
- package/apps/dashboard/dist/assets/index-CF0aJRtC.css +1 -0
- package/apps/dashboard/dist/assets/index-CF0aJRtC.css.br +0 -0
- package/apps/dashboard/dist/assets/index-Px49zu76.js +2 -0
- package/apps/dashboard/dist/assets/index-Px49zu76.js.br +0 -0
- package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js +1 -0
- package/apps/dashboard/dist/assets/orchestration-Ca2DLWN-.js.br +0 -0
- package/apps/dashboard/dist/assets/setup-wizard-i3eEixlo.js +1 -0
- package/apps/dashboard/dist/assets/setup-wizard-i3eEixlo.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-agents-tab-BThdsdJY.js +1 -0
- package/apps/dashboard/dist/assets/tab-agents-tab-BThdsdJY.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-benchmarks-tab-DfCuAClu.js +1 -0
- package/apps/dashboard/dist/assets/tab-comms-tab-eHpOSBhG.js +1 -0
- package/apps/dashboard/dist/assets/tab-comms-tab-eHpOSBhG.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-contacts-tab-yEegNyO4.js +1 -0
- package/apps/dashboard/dist/assets/tab-contacts-tab-yEegNyO4.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-engines-tab-C3DYxTwy.js +1 -0
- package/apps/dashboard/dist/assets/tab-engines-tab-C3DYxTwy.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-memory-tab-C59BYFQD.js +1 -0
- package/apps/dashboard/dist/assets/tab-memory-tab-C59BYFQD.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-models-tab-9Ur7pXWA.js +1 -0
- package/apps/dashboard/dist/assets/tab-models-tab-9Ur7pXWA.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-pm-loop-tab-D7mnDelU.js +1 -0
- package/apps/dashboard/dist/assets/tab-pm-loop-tab-D7mnDelU.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-projects-tab-C6h2Mv1K.js +1 -0
- package/apps/dashboard/dist/assets/tab-projects-tab-C6h2Mv1K.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-prompts-tab-C0wZvWK3.js +1 -0
- package/apps/dashboard/dist/assets/tab-prompts-tab-C0wZvWK3.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-services-tab-DBj_w3bc.js +1 -0
- package/apps/dashboard/dist/assets/tab-services-tab-DBj_w3bc.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-settings-tab-ezeqAjZk.js +1 -0
- package/apps/dashboard/dist/assets/tab-settings-tab-ezeqAjZk.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-skills-tab-BYdU2whk.js +1 -0
- package/apps/dashboard/dist/assets/tab-skills-tab-BYdU2whk.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-spending-tab-Bg6w9t_p.js +1 -0
- package/apps/dashboard/dist/assets/tab-spending-tab-Bg6w9t_p.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BBV9HB2X.js +1 -0
- package/apps/dashboard/dist/assets/tab-swarm-chat-tab-BBV9HB2X.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-swarm-tab-ChqLlEVs.js +1 -0
- package/apps/dashboard/dist/assets/tab-swarm-tab-ChqLlEVs.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-usage-tab-B2UWXenJ.js +1 -0
- package/apps/dashboard/dist/assets/tab-usage-tab-B2UWXenJ.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js +1 -0
- package/apps/dashboard/dist/assets/tab-waves-tab-SaJDkb4x.js.br +0 -0
- package/apps/dashboard/dist/assets/tab-workflows-tab-6QSXLJ0i.js +1 -0
- package/apps/dashboard/dist/assets/tab-workflows-tab-6QSXLJ0i.js.br +0 -0
- package/apps/dashboard/dist/favicon.png +0 -0
- package/apps/dashboard/dist/index.html +6466 -0
- package/apps/dashboard/dist/index.html.br +0 -0
- package/apps/dashboard/dist/index.html.gz +0 -0
- package/apps/dashboard/dist/signup.html +446 -0
- package/apps/dashboard/index.html +6442 -0
- package/apps/dashboard/package.json +15 -0
- package/apps/dashboard/src/app.js +2823 -0
- package/apps/dashboard/src/app.js.br +0 -0
- package/apps/dashboard/src/app.js.gz +0 -0
- package/apps/dashboard/src/chat/chat-actions.js +1847 -0
- package/apps/dashboard/src/chat/chat-actions.js.br +0 -0
- package/apps/dashboard/src/chat/unified-messages.js +327 -0
- package/apps/dashboard/src/chat/unified-messages.js.br +0 -0
- package/apps/dashboard/src/cli-process.js +208 -0
- package/apps/dashboard/src/cli-process.js.br +0 -0
- package/apps/dashboard/src/cli-process.js.gz +0 -0
- package/apps/dashboard/src/components/active-tasks-panel.js +175 -0
- package/apps/dashboard/src/components/active-tasks-panel.js.br +0 -0
- package/apps/dashboard/src/core/api.js +18 -0
- package/apps/dashboard/src/core/api.js.br +0 -0
- package/apps/dashboard/src/core/dom.js +220 -0
- package/apps/dashboard/src/core/dom.js.br +0 -0
- package/apps/dashboard/src/core/state.js +91 -0
- package/apps/dashboard/src/core/state.js.br +0 -0
- package/apps/dashboard/src/core/task-manager.js +134 -0
- package/apps/dashboard/src/core/task-manager.js.br +0 -0
- package/apps/dashboard/src/orchestration-status.js +127 -0
- package/apps/dashboard/src/orchestration-status.js.br +0 -0
- package/apps/dashboard/src/setup-wizard.js +555 -0
- package/apps/dashboard/src/setup-wizard.js.br +0 -0
- package/apps/dashboard/src/styles.css +2085 -0
- package/apps/dashboard/src/styles.css.br +0 -0
- package/apps/dashboard/src/styles.css.gz +0 -0
- package/apps/dashboard/src/tabs/agents-tab.js +2237 -0
- package/apps/dashboard/src/tabs/agents-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/benchmarks-tab.js +229 -0
- package/apps/dashboard/src/tabs/benchmarks-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/comms-tab.js +955 -0
- package/apps/dashboard/src/tabs/comms-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/contacts-tab.js +654 -0
- package/apps/dashboard/src/tabs/contacts-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/engines-tab.js +175 -0
- package/apps/dashboard/src/tabs/engines-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/memory-tab.js +182 -0
- package/apps/dashboard/src/tabs/memory-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/models-tab.js +441 -0
- package/apps/dashboard/src/tabs/models-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/pm-loop-tab.js +185 -0
- package/apps/dashboard/src/tabs/pm-loop-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/projects-tab.js +663 -0
- package/apps/dashboard/src/tabs/projects-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/projects-tab.js.gz +0 -0
- package/apps/dashboard/src/tabs/prompts-tab.js +160 -0
- package/apps/dashboard/src/tabs/prompts-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/services-tab.js +202 -0
- package/apps/dashboard/src/tabs/services-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/settings-tab.js +803 -0
- package/apps/dashboard/src/tabs/settings-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/skills-tab.js +284 -0
- package/apps/dashboard/src/tabs/skills-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/spending-tab.js +173 -0
- package/apps/dashboard/src/tabs/spending-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/swarm-chat-tab.js +660 -0
- package/apps/dashboard/src/tabs/swarm-chat-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/swarm-tab.js +538 -0
- package/apps/dashboard/src/tabs/swarm-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/usage-tab.js +390 -0
- package/apps/dashboard/src/tabs/usage-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/waves-tab.js +238 -0
- package/apps/dashboard/src/tabs/waves-tab.js.br +0 -0
- package/apps/dashboard/src/tabs/workflows-tab.js +747 -0
- package/apps/dashboard/src/tabs/workflows-tab.js.br +0 -0
- package/apps/vibe/.crew/agent-memory/pipeline.json +249 -0
- package/apps/vibe/.crew/cost.json +17 -0
- package/apps/vibe/.crew/json-parse-metrics.jsonl +22 -0
- package/apps/vibe/.crew/pipeline-metrics.jsonl +22 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-0f90c392-2425-4ae5-850c-bd9d17b1d690.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-1c269dd9-a63f-4fba-af81-5cf08048ef06.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-288a7765-da24-4a22-89bc-1f3cc9b0562c.jsonl +1 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-2c78fd22-a657-4bd1-bc49-0679fb384409.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-3e6fe08d-3264-404a-8df3-aab7efef10e7.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-42eec610-57fe-4e09-9e7e-b315038495c2.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-4438eb4c-ae13-42b1-90e2-b043d8983be8.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-4740a9f5-86e7-44b6-a394-de433e291727.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-49e1da6a-957e-48fd-9220-415019e4f8e2.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-4c9251db-be68-427b-a3fc-a264f2b5778d.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-65e29a57-664d-4196-8109-017e364f182e.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-6aa04bc5-9593-4b1f-b58d-3bf2978cb602.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-6e1cba53-9b70-457e-99e0-59199149dd21.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-749f41cc-4dac-4204-be64-873a6080a0d2.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-74d68121-e181-4864-bd9a-c3211341dfaf.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-8509bc24-142d-4e07-b44a-a50bf99d1103.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-960339c6-07ca-43ce-9900-f6e1702b39b9.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-9c6480a9-7031-4146-b241-825b9a2d1de1.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-9fd42426-8492-4157-9d5f-e1537c060489.jsonl +2 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-ad6d40a3-2f5e-46a9-a345-47caaccc51aa.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-bc606133-8d5b-4535-8d85-f1a29cdaa981.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-c1a13ccd-634a-4d01-a4a7-1177b8a752ff.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-c7d27b42-249e-4bd4-8f26-6aa998110b8a.jsonl +5 -0
- package/apps/vibe/.crew/pipeline-runs/pipeline-cca2e9b9-4a34-4d25-a311-5c793fa7e91e.jsonl +5 -0
- package/apps/vibe/.crew/sandbox.json +7 -0
- package/apps/vibe/.crew/session.json +285 -0
- package/apps/vibe/.crew/training-data.jsonl +0 -0
- package/apps/vibe/.github/workflows/studio-quality.yml +37 -0
- package/apps/vibe/.studio-data/project-messages/chuck-norris.jsonl +12 -0
- package/apps/vibe/.studio-data/project-messages/general.jsonl +54 -0
- package/apps/vibe/.studio-data/project-messages/studio-local.jsonl +10 -0
- package/apps/vibe/ARCHITECTURE.md +3393 -0
- package/apps/vibe/QUICK-REFERENCE.md +211 -0
- package/apps/vibe/README.md +76 -0
- package/apps/vibe/ROADMAP.md +41 -0
- package/apps/vibe/STUDIO-SETUP-COMPLETE.md +35 -0
- package/apps/vibe/VISUAL-GUIDE.md +378 -0
- package/apps/vibe/capture-demo.mjs +160 -0
- package/apps/vibe/capture-vibe-assets.mjs +71 -0
- package/apps/vibe/capture-vibe-video.mjs +260 -0
- package/apps/vibe/check-buttons.js +41 -0
- package/apps/vibe/diagnose.html +106 -0
- package/apps/vibe/fix-buttons.js +103 -0
- package/apps/vibe/index.html +3401 -0
- package/apps/vibe/package-lock.json +920 -0
- package/apps/vibe/package.json +31 -0
- package/apps/vibe/public/favicon.png +0 -0
- package/apps/vibe/scripts/studio-pty-host.py +117 -0
- package/apps/vibe/server.mjs +1835 -0
- package/apps/vibe/src/main.js +2846 -0
- package/apps/vibe/src/register-all-languages.js +98 -0
- package/apps/vibe/start-studio.sh +11 -0
- package/apps/vibe/test/accessibility-tests.js +77 -0
- package/apps/vibe/test/browser-performance-audit.mjs +205 -0
- package/apps/vibe/test/performance-tests.js +120 -0
- package/apps/vibe/test/security-tests.js +213 -0
- package/apps/vibe/tests/e2e.local.mjs +54 -0
- package/apps/vibe/tests/server.smoke.mjs +106 -0
- package/apps/vibe/update_website.mjs +74 -0
- package/apps/vibe/vite.config.js +19 -0
- package/apps/vibe/watch-server.mjs +108 -0
- package/contrib/openclaw-plugin/README.md +199 -0
- package/contrib/openclaw-plugin/index.ts +306 -0
- package/contrib/openclaw-plugin/openclaw.plugin.json +41 -0
- package/contrib/openclaw-plugin/package.json +27 -0
- package/contrib/openclaw-plugin/skills/crewswarm/SKILL.md +88 -0
- package/crew-lead.mjs +649 -0
- package/engines/claude-code.json +36 -0
- package/engines/codex.json +37 -0
- package/engines/crew-cli.json +42 -0
- package/engines/cursor.json +40 -0
- package/engines/docker-sandbox.json +38 -0
- package/engines/gemini-cli.json +75 -0
- package/engines/opencode.json +31 -0
- package/gateway-bridge.mjs +1575 -0
- package/install.sh +738 -0
- package/lib/agent-registry.mjs +232 -0
- package/lib/agents/daemon.mjs +121 -0
- package/lib/agents/dispatch.mjs +225 -0
- package/lib/agents/permissions.mjs +90 -0
- package/lib/agents/platform-formatting.mjs +102 -0
- package/lib/agents/registry.mjs +81 -0
- package/lib/agents/tool-instructions.mjs +257 -0
- package/lib/agents/validation.mjs +75 -0
- package/lib/approval/policy-manager.mjs +221 -0
- package/lib/autoharness/index.mjs +391 -0
- package/lib/bridges/cli-executor.mjs +332 -0
- package/lib/bridges/gateway-ws.mjs +345 -0
- package/lib/bridges/integration.mjs +229 -0
- package/lib/bridges/rag-helper.mjs +90 -0
- package/lib/browser/opencode-passthrough-filter.js +44 -0
- package/lib/browser/passthrough-stderr.js +109 -0
- package/lib/chat/autonomous-mentions.mjs +373 -0
- package/lib/chat/history.mjs +82 -0
- package/lib/chat/mention-routing-intent.mjs +136 -0
- package/lib/chat/participants.mjs +95 -0
- package/lib/chat/project-messages-rag.mjs +265 -0
- package/lib/chat/project-messages.mjs +479 -0
- package/lib/chat/shared-chat-prompt-overlay.mjs +52 -0
- package/lib/chat/thread-binding.mjs +34 -0
- package/lib/chat/unified-history.mjs +223 -0
- package/lib/chat/unified-wrapper.mjs +41 -0
- package/lib/cli-process-tracker.mjs +228 -0
- package/lib/collections/index.mjs +433 -0
- package/lib/contacts/identity-linker.mjs +248 -0
- package/lib/contacts/index.mjs +341 -0
- package/lib/crew-judge/PROMPT.md +93 -0
- package/lib/crew-judge/judge.mjs +260 -0
- package/lib/crew-lead/agent-manager.mjs +125 -0
- package/lib/crew-lead/background.mjs +270 -0
- package/lib/crew-lead/brain.mjs +110 -0
- package/lib/crew-lead/chat-handler.mjs +2603 -0
- package/lib/crew-lead/chat-handler.mjs.bak +1274 -0
- package/lib/crew-lead/classifier.mjs +83 -0
- package/lib/crew-lead/http-server.mjs +4824 -0
- package/lib/crew-lead/intent.mjs +102 -0
- package/lib/crew-lead/interval-manager.mjs +41 -0
- package/lib/crew-lead/llm-caller.mjs +544 -0
- package/lib/crew-lead/prompts.mjs +392 -0
- package/lib/crew-lead/retry-manager.mjs +118 -0
- package/lib/crew-lead/tools.mjs +318 -0
- package/lib/crew-lead/wave-dispatcher.mjs +798 -0
- package/lib/crew-lead/waves-config.json +73 -0
- package/lib/crew-lead/waves-loader.mjs +110 -0
- package/lib/crew-lead/ws-router.mjs +428 -0
- package/lib/dispatch/parsers.mjs +299 -0
- package/lib/domain-planning/detector.mjs +196 -0
- package/lib/domain-planning/prompts/crew-pm-cli.md +96 -0
- package/lib/domain-planning/prompts/crew-pm-core.md +122 -0
- package/lib/domain-planning/prompts/crew-pm-frontend.md +111 -0
- package/lib/engines/crew-cli-sandbox.mjs +422 -0
- package/lib/engines/crew-cli.mjs +155 -0
- package/lib/engines/cursor-launcher.mjs +110 -0
- package/lib/engines/engine-registry.mjs +253 -0
- package/lib/engines/llm-direct.mjs +184 -0
- package/lib/engines/opencode.mjs +256 -0
- package/lib/engines/ouroboros.mjs +114 -0
- package/lib/engines/rt-envelope.mjs +1643 -0
- package/lib/engines/rt-envelope.mjs.backup-current +870 -0
- package/lib/engines/runners.mjs +1367 -0
- package/lib/gemini-cli-passthrough-noise.mjs +37 -0
- package/lib/integrations/code-search.mjs +259 -0
- package/lib/integrations/greptile.mjs +148 -0
- package/lib/integrations/multimodal.mjs +313 -0
- package/lib/integrations/telegram-streaming.mjs +153 -0
- package/lib/integrations/tts.mjs +312 -0
- package/lib/integrations/twitter-links.mjs +294 -0
- package/lib/memory/shared-adapter.mjs +296 -0
- package/lib/pipeline/manager.mjs +539 -0
- package/lib/preferences/extractor.mjs +347 -0
- package/lib/project-dir.mjs +20 -0
- package/lib/runtime/config.mjs +388 -0
- package/lib/runtime/dlq.mjs +170 -0
- package/lib/runtime/log-rotation.mjs +82 -0
- package/lib/runtime/logger.mjs +58 -0
- package/lib/runtime/memory.mjs +421 -0
- package/lib/runtime/paths.mjs +76 -0
- package/lib/runtime/project-dir.mjs +127 -0
- package/lib/runtime/spending.mjs +204 -0
- package/lib/runtime/startup-guard.mjs +291 -0
- package/lib/runtime/task-lease.mjs +234 -0
- package/lib/runtime/telemetry-schema.mjs +208 -0
- package/lib/runtime/telemetry.mjs +101 -0
- package/lib/runtime/utils.mjs +64 -0
- package/lib/skills/index.mjs +265 -0
- package/lib/tools/browser.mjs +135 -0
- package/lib/tools/executor.mjs +913 -0
- package/lib/types.d.ts +57 -0
- package/package.json +106 -0
- package/pm-loop.mjs +1626 -0
- package/prompts/coder-back.md +27 -0
- package/prompts/coder-front.md +27 -0
- package/prompts/coder.md +28 -0
- package/prompts/copywriter.md +17 -0
- package/prompts/fixer.md +39 -0
- package/prompts/frontend.md +23 -0
- package/prompts/github.md +24 -0
- package/prompts/main.md +39 -0
- package/prompts/pm-cli.md +95 -0
- package/prompts/pm-core.md +121 -0
- package/prompts/pm-frontend.md +110 -0
- package/prompts/pm.md +234 -0
- package/prompts/qa.md +44 -0
- package/prompts/security.md +19 -0
- package/scripts/build-crew-chat.sh +28 -0
- package/scripts/build-llms-full.mjs +52 -0
- package/scripts/chatmock-login.sh +16 -0
- package/scripts/chatmock-serve.sh +16 -0
- package/scripts/check-dashboard.mjs +88 -0
- package/scripts/crew-scribe.mjs +326 -0
- package/scripts/dashboard-helpers.mjs +391 -0
- package/scripts/dashboard-validation.mjs +198 -0
- package/scripts/dashboard.mjs +9717 -0
- package/scripts/dlq-replay.mjs +61 -0
- package/scripts/doctor.mjs +196 -0
- package/scripts/file-lock.mjs +186 -0
- package/scripts/fresh-machine-smoke.sh +323 -0
- package/scripts/generate-changelog.mjs +227 -0
- package/scripts/generate-openapi.mjs +334 -0
- package/scripts/health-check.mjs +229 -0
- package/scripts/install-docker.sh +213 -0
- package/scripts/mcp-server.mjs +1625 -0
- package/scripts/opencrew-rt-daemon.mjs +568 -0
- package/scripts/openswitchctl +646 -0
- package/scripts/refactor-configs.mjs +39 -0
- package/scripts/release-check.sh +46 -0
- package/scripts/resolve-node-bin.sh +25 -0
- package/scripts/restart-all-from-repo.sh +329 -0
- package/scripts/restart-crew-lead.sh +98 -0
- package/scripts/restart-dashboard.sh +104 -0
- package/scripts/restart-service.sh +274 -0
- package/scripts/run-accessibility-audit.mjs +356 -0
- package/scripts/run-integration-bounded.mjs +188 -0
- package/scripts/run-scheduled-pipeline.mjs +230 -0
- package/scripts/run.mjs +41 -0
- package/scripts/scan-skills.mjs +79 -0
- package/scripts/setup-firewall.sh +128 -0
- package/scripts/smoke-dispatch.mjs +149 -0
- package/scripts/smoke.sh +163 -0
- package/scripts/start-crew.mjs +328 -0
- package/scripts/start.mjs +146 -0
- package/scripts/swiftbar-restart-service.sh +19 -0
- package/scripts/sync-agents.mjs +152 -0
- package/scripts/sync-prompts.mjs +79 -0
- package/scripts/validate-config.mjs +337 -0
- package/scripts/wow.mjs +89 -0
- package/telegram-bridge.mjs +2421 -0
- package/unified-orchestrator.mjs +519 -0
- package/whatsapp-bridge.mjs +1481 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strip Gemini CLI banner / status lines from engine passthrough (stdout before JSON lines).
|
|
3
|
+
* Used by crew-lead, dashboard, and Vibe.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
function stripAnsiPassthrough(text) {
|
|
7
|
+
return String(text || "")
|
|
8
|
+
.replace(/\u001b\[[\d;?]*[ -/]*[@-~]/g, "")
|
|
9
|
+
.replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g, "");
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* @param {string} line
|
|
14
|
+
* @returns {boolean} true = do not forward this line as chat content
|
|
15
|
+
*/
|
|
16
|
+
export function shouldSkipGeminiPassthroughLine(line) {
|
|
17
|
+
const t = stripAnsiPassthrough(String(line || "").replace(/\r/g, "")).trim();
|
|
18
|
+
if (!t) return true;
|
|
19
|
+
if (/^YOLO mode is enabled/i.test(t)) return true;
|
|
20
|
+
if (/All tool calls will be automatically approved/i.test(t)) return true;
|
|
21
|
+
if (/Loaded cached credentials/i.test(t)) return true;
|
|
22
|
+
if (/^Using bundled/i.test(t)) return true;
|
|
23
|
+
if (/^Authenticated via/i.test(t)) return true;
|
|
24
|
+
if (/^OpenTelemetry/i.test(t)) return true;
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* @param {string} engine
|
|
30
|
+
* @param {string} text
|
|
31
|
+
*/
|
|
32
|
+
export function filterGeminiPassthroughTextChunk(engine, text) {
|
|
33
|
+
if (engine !== "gemini" && engine !== "gemini-cli") return String(text ?? "");
|
|
34
|
+
const s = String(text ?? "");
|
|
35
|
+
if (!s) return s;
|
|
36
|
+
return s.split("\n").filter((ln) => !shouldSkipGeminiPassthroughLine(ln)).join("\n");
|
|
37
|
+
}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local Semantic Code Search
|
|
3
|
+
* Uses ripgrep + smart ranking for semantic codebase understanding
|
|
4
|
+
* Zero external dependencies, 100% local, instant results
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { execSync } from 'node:child_process';
|
|
8
|
+
import fs from 'node:fs';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Extract meaningful keywords from natural language query
|
|
13
|
+
*/
|
|
14
|
+
function extractKeywords(query) {
|
|
15
|
+
const stopwords = new Set([
|
|
16
|
+
'how', 'does', 'what', 'where', 'when', 'why', 'the', 'is', 'are',
|
|
17
|
+
'was', 'were', 'in', 'on', 'at', 'to', 'for', 'of', 'with', 'by',
|
|
18
|
+
'this', 'that', 'these', 'those', 'a', 'an', 'and', 'or', 'but'
|
|
19
|
+
]);
|
|
20
|
+
|
|
21
|
+
return query
|
|
22
|
+
.toLowerCase()
|
|
23
|
+
.replace(/[^a-z0-9\s]/g, ' ')
|
|
24
|
+
.split(/\s+/)
|
|
25
|
+
.filter(word => word.length > 2 && !stopwords.has(word))
|
|
26
|
+
.slice(0, 5); // Top 5 keywords
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Parse ripgrep JSON output
|
|
31
|
+
*/
|
|
32
|
+
function parseRipgrepJson(output) {
|
|
33
|
+
if (!output || !output.trim()) return [];
|
|
34
|
+
|
|
35
|
+
const matches = [];
|
|
36
|
+
const lines = output.split('\n').filter(l => l.trim());
|
|
37
|
+
|
|
38
|
+
for (const line of lines) {
|
|
39
|
+
try {
|
|
40
|
+
const item = JSON.parse(line);
|
|
41
|
+
if (item.type === 'match') {
|
|
42
|
+
matches.push({
|
|
43
|
+
file: item.data.path.text,
|
|
44
|
+
line: item.data.line_number,
|
|
45
|
+
content: item.data.lines.text,
|
|
46
|
+
matches: item.data.submatches.map(sm => sm.match.text)
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
} catch (e) {
|
|
50
|
+
// Skip malformed JSON
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return matches;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Rank search results by relevance
|
|
59
|
+
*/
|
|
60
|
+
function rankByRelevance(results, query, keywords) {
|
|
61
|
+
const queryLower = query.toLowerCase();
|
|
62
|
+
|
|
63
|
+
return results
|
|
64
|
+
.map(result => {
|
|
65
|
+
let score = 0;
|
|
66
|
+
const contentLower = result.content.toLowerCase();
|
|
67
|
+
|
|
68
|
+
// Exact query match = highest score
|
|
69
|
+
if (contentLower.includes(queryLower)) score += 100;
|
|
70
|
+
|
|
71
|
+
// Keyword matches
|
|
72
|
+
for (const keyword of keywords) {
|
|
73
|
+
if (contentLower.includes(keyword)) score += 10;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Boost for function/class definitions
|
|
77
|
+
if (/^(function|class|def|const|let|var|export)\s/.test(result.content.trim())) {
|
|
78
|
+
score += 20;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Boost for common patterns
|
|
82
|
+
if (/auth|login|session|token|verify/.test(contentLower) && /auth/i.test(query)) {
|
|
83
|
+
score += 15;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return { ...result, score };
|
|
87
|
+
})
|
|
88
|
+
.sort((a, b) => b.score - a.score);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Search codebase with natural language query
|
|
93
|
+
* @param {string} query - Natural language question (e.g., "how does authentication work?")
|
|
94
|
+
* @param {string} projectDir - Root directory to search
|
|
95
|
+
* @param {object} options - Search options
|
|
96
|
+
* @returns {Promise<{query: string, keywords: string[], results: Array, summary: string}>}
|
|
97
|
+
*/
|
|
98
|
+
export async function searchCode(query, projectDir = process.cwd(), options = {}) {
|
|
99
|
+
const {
|
|
100
|
+
maxResults = 20,
|
|
101
|
+
contextLines = 3,
|
|
102
|
+
fileTypes = null // e.g., ['js', 'ts', 'mjs']
|
|
103
|
+
} = options;
|
|
104
|
+
|
|
105
|
+
// Extract keywords from query
|
|
106
|
+
const keywords = extractKeywords(query);
|
|
107
|
+
|
|
108
|
+
if (keywords.length === 0) {
|
|
109
|
+
return {
|
|
110
|
+
query,
|
|
111
|
+
keywords: [],
|
|
112
|
+
results: [],
|
|
113
|
+
summary: 'No meaningful keywords found in query'
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Build ripgrep command
|
|
118
|
+
const searchPattern = keywords.join('|');
|
|
119
|
+
let cmd = `rg --json --context ${contextLines} --max-count ${maxResults} -i`;
|
|
120
|
+
|
|
121
|
+
if (fileTypes && fileTypes.length > 0) {
|
|
122
|
+
cmd += ` ${fileTypes.map(t => `-t ${t}`).join(' ')}`;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
cmd += ` "${searchPattern}" "${projectDir}"`;
|
|
126
|
+
|
|
127
|
+
try {
|
|
128
|
+
const output = execSync(cmd, {
|
|
129
|
+
encoding: 'utf8',
|
|
130
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
131
|
+
maxBuffer: 10 * 1024 * 1024 // 10MB buffer
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
const matches = parseRipgrepJson(output);
|
|
135
|
+
const ranked = rankByRelevance(matches, query, keywords);
|
|
136
|
+
|
|
137
|
+
// Group by file
|
|
138
|
+
const fileGroups = {};
|
|
139
|
+
for (const match of ranked) {
|
|
140
|
+
if (!fileGroups[match.file]) {
|
|
141
|
+
fileGroups[match.file] = [];
|
|
142
|
+
}
|
|
143
|
+
fileGroups[match.file].push(match);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
query,
|
|
148
|
+
keywords,
|
|
149
|
+
results: ranked.slice(0, maxResults),
|
|
150
|
+
fileGroups,
|
|
151
|
+
summary: `Found ${ranked.length} matches across ${Object.keys(fileGroups).length} files`
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
} catch (error) {
|
|
155
|
+
// ripgrep exits with code 1 if no matches found
|
|
156
|
+
if (error.status === 1) {
|
|
157
|
+
return {
|
|
158
|
+
query,
|
|
159
|
+
keywords,
|
|
160
|
+
results: [],
|
|
161
|
+
summary: 'No matches found'
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
throw error;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Format search results for LLM context injection
|
|
170
|
+
*/
|
|
171
|
+
export function formatSearchResults(searchResults, maxChars = 4000) {
|
|
172
|
+
const { query, results, summary } = searchResults;
|
|
173
|
+
|
|
174
|
+
if (results.length === 0) {
|
|
175
|
+
return `## Code Search: "${query}"\n\n${summary}`;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
let output = `## Code Search: "${query}"\n\n${summary}\n\n`;
|
|
179
|
+
let charsUsed = output.length;
|
|
180
|
+
|
|
181
|
+
for (const result of results) {
|
|
182
|
+
const entry = `### ${result.file}:${result.line}\n\`\`\`\n${result.content}\n\`\`\`\n\n`;
|
|
183
|
+
|
|
184
|
+
if (charsUsed + entry.length > maxChars) {
|
|
185
|
+
output += `\n_(${results.length - results.indexOf(result)} more results truncated)_\n`;
|
|
186
|
+
break;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
output += entry;
|
|
190
|
+
charsUsed += entry.length;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
return output;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Find files by pattern
|
|
198
|
+
*/
|
|
199
|
+
export async function findFiles(pattern, projectDir = process.cwd()) {
|
|
200
|
+
try {
|
|
201
|
+
const output = execSync(`rg --files | rg "${pattern}"`, {
|
|
202
|
+
cwd: projectDir,
|
|
203
|
+
encoding: 'utf8',
|
|
204
|
+
stdio: ['pipe', 'pipe', 'ignore']
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
return output.split('\n').filter(f => f.trim());
|
|
208
|
+
} catch (error) {
|
|
209
|
+
if (error.status === 1) return [];
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Search for specific code patterns (regex-based)
|
|
216
|
+
*/
|
|
217
|
+
export async function searchPattern(pattern, projectDir = process.cwd(), options = {}) {
|
|
218
|
+
const { fileTypes = null, contextLines = 2 } = options;
|
|
219
|
+
|
|
220
|
+
let cmd = `rg --json --context ${contextLines}`;
|
|
221
|
+
|
|
222
|
+
if (fileTypes && fileTypes.length > 0) {
|
|
223
|
+
cmd += ` ${fileTypes.map(t => `-t ${t}`).join(' ')}`;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
cmd += ` "${pattern}" "${projectDir}"`;
|
|
227
|
+
|
|
228
|
+
try {
|
|
229
|
+
const output = execSync(cmd, {
|
|
230
|
+
encoding: 'utf8',
|
|
231
|
+
stdio: ['pipe', 'pipe', 'ignore'],
|
|
232
|
+
maxBuffer: 10 * 1024 * 1024
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
return parseRipgrepJson(output);
|
|
236
|
+
} catch (error) {
|
|
237
|
+
if (error.status === 1) return [];
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Helper: Search for function definitions
|
|
244
|
+
*/
|
|
245
|
+
export async function findFunctions(name, projectDir = process.cwd()) {
|
|
246
|
+
// Matches: function name, const name =, export function name, etc.
|
|
247
|
+
// Escape special regex characters in name
|
|
248
|
+
const escapedName = name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
249
|
+
const pattern = `(function|const|let|export)\\s+${escapedName}`;
|
|
250
|
+
return await searchPattern(pattern, projectDir, { fileTypes: ['js', 'ts', 'mjs'] });
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Helper: Search for class definitions
|
|
255
|
+
*/
|
|
256
|
+
export async function findClasses(name, projectDir = process.cwd()) {
|
|
257
|
+
const pattern = `class\\s+${name}\\s*[{(]`;
|
|
258
|
+
return await searchPattern(pattern, projectDir, { fileTypes: ['js', 'ts', 'mjs'] });
|
|
259
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Greptile API Integration
|
|
3
|
+
* Semantic codebase search and RAG for crewswarm agents
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import os from "node:os";
|
|
9
|
+
|
|
10
|
+
const GREPTILE_API_BASE = "https://api.greptile.com/v2";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Get Greptile API key from config or environment
|
|
14
|
+
*/
|
|
15
|
+
function getApiKey() {
|
|
16
|
+
// Try environment first
|
|
17
|
+
if (process.env.GREPTILE_API_KEY) {
|
|
18
|
+
return process.env.GREPTILE_API_KEY;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Try crewswarm.json
|
|
22
|
+
try {
|
|
23
|
+
const cfgPath = path.join(os.homedir(), ".crewswarm/crewswarm.json");
|
|
24
|
+
const cfg = JSON.parse(fs.readFileSync(cfgPath, "utf8"));
|
|
25
|
+
return cfg.providers?.greptile?.apiKey || null;
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Index a GitHub repository
|
|
33
|
+
* @param {string} repository - Format: "owner/repo" (e.g. "vercel/next.js")
|
|
34
|
+
* @param {string} branch - Branch name (e.g. "main", "master", "canary")
|
|
35
|
+
* @param {string} remote - Remote type (default: "github")
|
|
36
|
+
* @returns {Promise<{message: string, statusEndpoint: string, repoData: object}>}
|
|
37
|
+
*/
|
|
38
|
+
export async function indexRepository(repository, branch = "main", remote = "github") {
|
|
39
|
+
const apiKey = getApiKey();
|
|
40
|
+
if (!apiKey) {
|
|
41
|
+
throw new Error("Greptile API key not found. Set GREPTILE_API_KEY or add to ~/.crewswarm/crewswarm.json");
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const response = await fetch(`${GREPTILE_API_BASE}/repositories`, {
|
|
45
|
+
method: "POST",
|
|
46
|
+
headers: {
|
|
47
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
48
|
+
"Content-Type": "application/json",
|
|
49
|
+
},
|
|
50
|
+
body: JSON.stringify({ remote, repository, branch }),
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
if (!response.ok) {
|
|
54
|
+
const error = await response.text();
|
|
55
|
+
throw new Error(`Greptile index failed (${response.status}): ${error}`);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return await response.json();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get repository indexing status
|
|
63
|
+
* @param {string} repository - Format: "owner/repo"
|
|
64
|
+
* @param {string} branch - Branch name
|
|
65
|
+
* @param {string} remote - Remote type (default: "github")
|
|
66
|
+
* @returns {Promise<{status: string, filesProcessed: number, numFiles: number}>}
|
|
67
|
+
*/
|
|
68
|
+
export async function getRepositoryStatus(repository, branch = "main", remote = "github") {
|
|
69
|
+
const apiKey = getApiKey();
|
|
70
|
+
if (!apiKey) {
|
|
71
|
+
throw new Error("Greptile API key not found");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Format: github:branch:owner%2Frepo
|
|
75
|
+
const repoId = `${remote}:${branch}:${repository.replace("/", "%2F")}`;
|
|
76
|
+
|
|
77
|
+
const response = await fetch(`${GREPTILE_API_BASE}/repositories/${repoId}`, {
|
|
78
|
+
method: "GET",
|
|
79
|
+
headers: {
|
|
80
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
if (!response.ok) {
|
|
85
|
+
const error = await response.text();
|
|
86
|
+
throw new Error(`Greptile status check failed (${response.status}): ${error}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return await response.json();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Query repositories using natural language
|
|
94
|
+
* @param {string} query - Natural language question
|
|
95
|
+
* @param {Array<{remote: string, repository: string, branch: string}>} repositories
|
|
96
|
+
* @param {string} sessionId - Optional session ID for conversation history
|
|
97
|
+
* @returns {Promise<{message: string, sources: Array}>}
|
|
98
|
+
*/
|
|
99
|
+
export async function queryRepositories(query, repositories, sessionId = null) {
|
|
100
|
+
const apiKey = getApiKey();
|
|
101
|
+
if (!apiKey) {
|
|
102
|
+
throw new Error("Greptile API key not found");
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const payload = {
|
|
106
|
+
messages: [{ id: "msg-1", content: query, role: "user" }],
|
|
107
|
+
repositories,
|
|
108
|
+
stream: false,
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
if (sessionId) payload.sessionId = sessionId;
|
|
112
|
+
|
|
113
|
+
const response = await fetch(`${GREPTILE_API_BASE}/repositories/query`, {
|
|
114
|
+
method: "POST",
|
|
115
|
+
headers: {
|
|
116
|
+
"Authorization": `Bearer ${apiKey}`,
|
|
117
|
+
"Content-Type": "application/json",
|
|
118
|
+
"X-Github-Token": process.env.GITHUB_TOKEN || "",
|
|
119
|
+
},
|
|
120
|
+
body: JSON.stringify(payload),
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
if (!response.ok) {
|
|
124
|
+
const error = await response.text();
|
|
125
|
+
throw new Error(`Greptile query failed (${response.status}): ${error}`);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return await response.json();
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Helper: Index crewswarm repository
|
|
133
|
+
*/
|
|
134
|
+
export async function indexcrewswarm() {
|
|
135
|
+
return await indexRepository("crewswarm/crewswarm", "main");
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Helper: Search crewswarm codebase
|
|
140
|
+
*/
|
|
141
|
+
export async function searchcrewswarm(query) {
|
|
142
|
+
return await queryRepositories(query, [
|
|
143
|
+
{ remote: "github", repository: "crewswarm/crewswarm", branch: "main" }
|
|
144
|
+
]);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Alias for backwards compatibility
|
|
148
|
+
export const searchRepositories = queryRepositories;
|