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,378 @@
|
|
|
1
|
+
# CrewSwarm Vibe — Visual Guide
|
|
2
|
+
|
|
3
|
+
## Vibe Layout
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
┌──────────────────────────────────────────────────────────────────────────────┐
|
|
7
|
+
│ 🐝 CrewSwarm Vibe my-todo-app │
|
|
8
|
+
├─────────────┬────────────────────────────────┬────────────────────────────────┤
|
|
9
|
+
│ │ │ │
|
|
10
|
+
│ EXPLORER │ MONACO EDITOR │ CHAT WITH AGENTS │
|
|
11
|
+
│ │ │ │
|
|
12
|
+
│ 📁 src/ │ function TodoApp() { │ 🟢 crew-lead │
|
|
13
|
+
│ ├─ 📄 app.js│ const [todos, setTodos] │ ⚡ crew-coder │
|
|
14
|
+
│ ├─ 📄 api.js│ = useState([]); │ 🔵 crew-qa │
|
|
15
|
+
│ └─ 📁 comp/│ │ │
|
|
16
|
+
│ 📝 README │ return ( │ ──────────────────────── │
|
|
17
|
+
│ 📦 package │ <div className="app"> │ │
|
|
18
|
+
│ │ <h1>Todo App</h1> │ You: │
|
|
19
|
+
│ │ {todos.map(todo => │ Add input validation for │
|
|
20
|
+
│ │ <TodoItem │ the todo form │
|
|
21
|
+
│ │ key={todo.id} │ │
|
|
22
|
+
│ │ todo={todo} │ crew-lead: │
|
|
23
|
+
│ │ /> │ I'll have crew-coder add │
|
|
24
|
+
│ │ )} │ validation for you. │
|
|
25
|
+
│ │ </div> │ │
|
|
26
|
+
│ │ ); │ [14:32] ⚡ Dispatching to │
|
|
27
|
+
│ │ } │ crew-coder... │
|
|
28
|
+
│ │ │ │
|
|
29
|
+
│ │ export default TodoApp; │ crew-coder: │
|
|
30
|
+
│ │ │ ✅ Added validation to │
|
|
31
|
+
│ │ │ src/TodoForm.jsx: │
|
|
32
|
+
│ │ │ • Required field check │
|
|
33
|
+
│ │ │ • Max length 100 chars │
|
|
34
|
+
│ │ │ • No empty strings │
|
|
35
|
+
│ │ │ │
|
|
36
|
+
│ │ │ ┌─────────────────────────┐ │
|
|
37
|
+
│ │ │ │ Ask the crew anything...│ │
|
|
38
|
+
│ │ │ │ (⌘+Enter to send) │ │
|
|
39
|
+
│ │ │ └─────────────────────────┘ │
|
|
40
|
+
├─────────────┴────────────────────────────────┴────────────────────────────────┤
|
|
41
|
+
│ TERMINAL / AGENT OUTPUT │
|
|
42
|
+
│ │
|
|
43
|
+
│ [14:32:05] 🔗 Connected to RT message bus │
|
|
44
|
+
│ [14:32:15] ⚡ crew-coder started working on task │
|
|
45
|
+
│ [14:32:16] 🔧 crew-coder → write_file src/TodoForm.jsx │
|
|
46
|
+
│ [14:32:17] 🔧 crew-coder → write_file src/validation.js │
|
|
47
|
+
│ [14:32:18] ✅ crew-coder completed task │
|
|
48
|
+
│ [14:32:19] 💾 Saved src/TodoForm.jsx │
|
|
49
|
+
│ │
|
|
50
|
+
└────────────────────────────────────────────────────────────────────────────────┘
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## Color Scheme (vs-dark theme)
|
|
56
|
+
|
|
57
|
+
```css
|
|
58
|
+
Background: #1e1e1e (main editor)
|
|
59
|
+
Sidebar: #252526 (file tree, chat)
|
|
60
|
+
Titlebar: #323233
|
|
61
|
+
Borders: #181818
|
|
62
|
+
Text: #d4d4d4
|
|
63
|
+
Active tab: #1e1e1e
|
|
64
|
+
Inactive tab: #2d2d30
|
|
65
|
+
User message: #0e639c (blue bubble)
|
|
66
|
+
Agent message: #2d2d30 (gray bubble)
|
|
67
|
+
Success: #81c784 (green)
|
|
68
|
+
Error: #e57373 (red)
|
|
69
|
+
Info: #4fc3f7 (cyan)
|
|
70
|
+
Warning: #ffb74d (orange)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Key UI Elements
|
|
76
|
+
|
|
77
|
+
### 1. Titlebar
|
|
78
|
+
```
|
|
79
|
+
┌──────────────────────────────────────────────────────┐
|
|
80
|
+
│ 🐝 CrewSwarm Vibe my-todo-app │
|
|
81
|
+
└──────────────────────────────────────────────────────┘
|
|
82
|
+
↑ Logo ↑ Project name (right aligned)
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### 2. File Tree
|
|
86
|
+
```
|
|
87
|
+
EXPLORER
|
|
88
|
+
|
|
89
|
+
📁 src/
|
|
90
|
+
├─ 📄 app.js ← Click to open
|
|
91
|
+
├─ 📄 api.js
|
|
92
|
+
└─ 📁 components/
|
|
93
|
+
├─ 📄 TodoItem.jsx
|
|
94
|
+
└─ 📄 TodoForm.jsx
|
|
95
|
+
📝 README.md
|
|
96
|
+
📦 package.json
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**States:**
|
|
100
|
+
- Regular: `📄 app.js`
|
|
101
|
+
- Active: `📄 app.js` (highlighted bg: #37373d)
|
|
102
|
+
- Hover: `📄 app.js` (subtle highlight)
|
|
103
|
+
|
|
104
|
+
### 3. Editor Tabs
|
|
105
|
+
```
|
|
106
|
+
┌───────────┬───────────┬───────────┐
|
|
107
|
+
│ app.js × │ api.js × │ README × │
|
|
108
|
+
└───────────┴───────────┴───────────┘
|
|
109
|
+
↑ active ↑ inactive ↑ inactive
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**Active tab:**
|
|
113
|
+
- Background: #1e1e1e
|
|
114
|
+
- Text: #fff
|
|
115
|
+
|
|
116
|
+
**Inactive tab:**
|
|
117
|
+
- Background: transparent
|
|
118
|
+
- Text: #969696
|
|
119
|
+
|
|
120
|
+
### 4. Chat Panel
|
|
121
|
+
```
|
|
122
|
+
┌─────────────────────────────────┐
|
|
123
|
+
│ Chat with Agents │ ← Header
|
|
124
|
+
├─────────────────────────────────┤
|
|
125
|
+
│ 🟢 crew-lead │ ← Status indicators
|
|
126
|
+
│ ⚡ crew-coder │
|
|
127
|
+
│ 🔵 crew-qa │
|
|
128
|
+
├─────────────────────────────────┤
|
|
129
|
+
│ │
|
|
130
|
+
│ [Chat messages scroll here] │
|
|
131
|
+
│ │
|
|
132
|
+
├─────────────────────────────────┤
|
|
133
|
+
│ ┌─────────────────────────────┐ │
|
|
134
|
+
│ │ Ask the crew anything... │ │ ← Input (⌘+Enter)
|
|
135
|
+
│ │ │ │
|
|
136
|
+
│ └─────────────────────────────┘ │
|
|
137
|
+
└─────────────────────────────────┘
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Status indicators:**
|
|
141
|
+
- 🟢 Green = online/available
|
|
142
|
+
- ⚡ Yellow = working on task
|
|
143
|
+
- 🔵 Blue = ready
|
|
144
|
+
- 🔴 Red = error/offline
|
|
145
|
+
|
|
146
|
+
### 5. Terminal
|
|
147
|
+
```
|
|
148
|
+
┌────────────────────────────────────────────────┐
|
|
149
|
+
│ Agent Output [Clear] │ ← Header
|
|
150
|
+
├────────────────────────────────────────────────┤
|
|
151
|
+
│ [14:32:15] ⚡ crew-coder started working │ ← Info (cyan)
|
|
152
|
+
│ [14:32:18] ✅ crew-coder completed task │ ← Success (green)
|
|
153
|
+
│ [14:32:19] 💾 Saved src/TodoForm.jsx │ ← Success (green)
|
|
154
|
+
│ [14:32:20] ❌ Failed to save config.json │ ← Error (red)
|
|
155
|
+
└────────────────────────────────────────────────┘
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
**Log colors:**
|
|
159
|
+
- Info: #4fc3f7
|
|
160
|
+
- Success: #81c784
|
|
161
|
+
- Error: #e57373
|
|
162
|
+
- Warning: #ffb74d
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## Responsive Behavior
|
|
167
|
+
|
|
168
|
+
### Desktop (1920×1080)
|
|
169
|
+
```
|
|
170
|
+
File Tree: 250px
|
|
171
|
+
Editor: flex (grows)
|
|
172
|
+
Chat: 350px
|
|
173
|
+
Terminal: 200px
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Laptop (1440×900)
|
|
177
|
+
```
|
|
178
|
+
File Tree: 200px
|
|
179
|
+
Editor: flex (grows)
|
|
180
|
+
Chat: 300px
|
|
181
|
+
Terminal: 180px
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Tablet (1024×768)
|
|
185
|
+
```
|
|
186
|
+
File Tree: Collapsible (hidden by default)
|
|
187
|
+
Editor: Full width
|
|
188
|
+
Chat: Overlay (slides in from right)
|
|
189
|
+
Terminal: 150px
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## Interactions
|
|
195
|
+
|
|
196
|
+
### File Tree
|
|
197
|
+
- **Click file** → Opens in editor
|
|
198
|
+
- **Hover file** → Slight highlight
|
|
199
|
+
- **Active file** → Bold + highlight
|
|
200
|
+
|
|
201
|
+
### Editor
|
|
202
|
+
- **Type** → Auto-saves after 1s
|
|
203
|
+
- **⌘+S** → Immediate save
|
|
204
|
+
- **Tab close (×)** → Removes tab, switches to previous
|
|
205
|
+
|
|
206
|
+
### Chat
|
|
207
|
+
- **Type** → Input grows (max 3 lines)
|
|
208
|
+
- **⌘+Enter** → Sends message
|
|
209
|
+
- **Messages** → Auto-scroll to bottom
|
|
210
|
+
- **Agent bubbles** → Different colors per role
|
|
211
|
+
|
|
212
|
+
### Terminal
|
|
213
|
+
- **New event** → Auto-scrolls to bottom
|
|
214
|
+
- **Scroll up** → Pauses auto-scroll
|
|
215
|
+
- **Scroll to bottom** → Re-enables auto-scroll
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## Monaco Editor Features
|
|
220
|
+
|
|
221
|
+
**Built-in:**
|
|
222
|
+
- ✅ Syntax highlighting (50+ languages)
|
|
223
|
+
- ✅ Auto-completion (basic)
|
|
224
|
+
- ✅ Find/replace
|
|
225
|
+
- ✅ Minimap
|
|
226
|
+
- ✅ Line numbers
|
|
227
|
+
- ✅ Code folding
|
|
228
|
+
- ✅ Multi-cursor (⌥+Click)
|
|
229
|
+
- ✅ Bracket matching
|
|
230
|
+
|
|
231
|
+
**Coming soon:**
|
|
232
|
+
- 🔄 IntelliSense (full)
|
|
233
|
+
- 🔄 Git diff indicators (green/red bars)
|
|
234
|
+
- 🔄 Error squiggles (from linter)
|
|
235
|
+
- 🔄 Inline agent suggestions
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## Agent Status Icons
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
🟢 Online Agent ready to receive tasks
|
|
243
|
+
⚡ Working Agent actively processing
|
|
244
|
+
✅ Complete Agent finished task
|
|
245
|
+
🔵 Idle Agent available but not active
|
|
246
|
+
🔴 Error Agent encountered error
|
|
247
|
+
⏸️ Paused Agent temporarily disabled
|
|
248
|
+
🔄 Restarting Agent reloading
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Example Workflows
|
|
254
|
+
|
|
255
|
+
### Workflow 1: Open File + Edit
|
|
256
|
+
```
|
|
257
|
+
1. Click "src/app.js" in file tree
|
|
258
|
+
→ File opens in editor
|
|
259
|
+
→ Tab appears at top
|
|
260
|
+
|
|
261
|
+
2. Type changes in editor
|
|
262
|
+
→ Auto-saves after 1s
|
|
263
|
+
→ Terminal shows: "💾 Saved src/app.js"
|
|
264
|
+
|
|
265
|
+
3. Click "×" on tab to close
|
|
266
|
+
→ File closes
|
|
267
|
+
→ Switches to previous tab
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Workflow 2: Ask Agent to Edit
|
|
271
|
+
```
|
|
272
|
+
1. Type in chat: "Add error handling to api.js"
|
|
273
|
+
→ Press ⌘+Enter
|
|
274
|
+
|
|
275
|
+
2. crew-lead responds:
|
|
276
|
+
"I'll have crew-coder add that for you."
|
|
277
|
+
|
|
278
|
+
3. Terminal shows:
|
|
279
|
+
[14:45:00] ⚡ crew-coder started working
|
|
280
|
+
[14:45:05] 🔧 crew-coder → write_file src/api.js
|
|
281
|
+
[14:45:06] ✅ crew-coder completed task
|
|
282
|
+
|
|
283
|
+
4. File tree: "api.js" changes appear
|
|
284
|
+
→ Click to open and review
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
### Workflow 3: Multi-Agent Pipeline
|
|
288
|
+
```
|
|
289
|
+
1. Type: "Build a login page with tests"
|
|
290
|
+
|
|
291
|
+
2. crew-lead coordinates:
|
|
292
|
+
⚡ Dispatching to crew-coder-front...
|
|
293
|
+
⚡ Dispatching to crew-qa...
|
|
294
|
+
|
|
295
|
+
3. Terminal shows both agents working:
|
|
296
|
+
[15:00:00] ⚡ crew-coder-front started
|
|
297
|
+
[15:00:15] ✅ crew-coder-front completed
|
|
298
|
+
[15:00:16] ⚡ crew-qa started
|
|
299
|
+
[15:00:30] ✅ crew-qa completed
|
|
300
|
+
|
|
301
|
+
4. Result:
|
|
302
|
+
✅ Created src/LoginPage.jsx
|
|
303
|
+
✅ Created tests/login.test.js
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## Keyboard Shortcuts (Future)
|
|
309
|
+
|
|
310
|
+
| Shortcut | Action |
|
|
311
|
+
|---|---|
|
|
312
|
+
| ⌘+S | Save current file |
|
|
313
|
+
| ⌘+P | Quick file picker |
|
|
314
|
+
| ⌘+K | Focus chat input |
|
|
315
|
+
| ⌘+J | Toggle terminal |
|
|
316
|
+
| ⌘+B | Toggle file tree |
|
|
317
|
+
| ⌘+Enter | Send chat message |
|
|
318
|
+
| ⌘+W | Close current tab |
|
|
319
|
+
| ⌘+Shift+P | Command palette |
|
|
320
|
+
| ⌘+/ | Toggle comment |
|
|
321
|
+
| ⌘+F | Find in file |
|
|
322
|
+
|
|
323
|
+
---
|
|
324
|
+
|
|
325
|
+
## Comparison to Cursor
|
|
326
|
+
|
|
327
|
+
| Feature | Cursor | Vibe |
|
|
328
|
+
|---|---|---|
|
|
329
|
+
| File editing | ✅ Full IDE | ✅ Monaco |
|
|
330
|
+
| Agent chat | ✅ Inline + panel | ✅ Side panel |
|
|
331
|
+
| File tree | ✅ Full features | ✅ Basic (Phase 1) |
|
|
332
|
+
| Terminal | ✅ Full shell | ✅ Agent logs only |
|
|
333
|
+
| Git | ✅ Built-in | 🔄 Future |
|
|
334
|
+
| Extensions | ✅ VSCode ecosystem | ❌ Not yet |
|
|
335
|
+
| Themes | ✅ Full customization | ✅ vs-dark (default) |
|
|
336
|
+
| Multi-agent | ❌ Single agent | ✅ 20 agents |
|
|
337
|
+
| Real-time updates | ⚠️ Polling | ✅ WebSocket |
|
|
338
|
+
|
|
339
|
+
**Vibe's differentiator:** Real-time multi-agent coordination with visible progress. Cursor is better as a full IDE, Vibe is better for swarm workflows.
|
|
340
|
+
|
|
341
|
+
---
|
|
342
|
+
|
|
343
|
+
## Screenshots (Conceptual)
|
|
344
|
+
|
|
345
|
+
**Main view:**
|
|
346
|
+
```
|
|
347
|
+
┌────────────────────────────────────────────────┐
|
|
348
|
+
│ FILE TREE │ EDITOR │ CHAT │
|
|
349
|
+
│ │ │ │
|
|
350
|
+
│ Click files │ Code here │ Talk to agents│
|
|
351
|
+
└────────────────────────────────────────────────┘
|
|
352
|
+
│ TERMINAL (agent activity) │
|
|
353
|
+
└────────────────────────────┘
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**Chat conversation:**
|
|
357
|
+
```
|
|
358
|
+
You: Add validation
|
|
359
|
+
|
|
360
|
+
crew-lead: Sure! Dispatching to crew-coder...
|
|
361
|
+
|
|
362
|
+
crew-coder: ✅ Added validation.js
|
|
363
|
+
• Required field check
|
|
364
|
+
• Email format validation
|
|
365
|
+
• Password strength check
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
**Terminal activity:**
|
|
369
|
+
```
|
|
370
|
+
[14:32:15] 🔗 Connected to RT bus
|
|
371
|
+
[14:32:20] ⚡ crew-coder started task
|
|
372
|
+
[14:32:25] 🔧 crew-coder → write_file
|
|
373
|
+
[14:32:26] ✅ crew-coder completed task
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
**Next:** See [`STUDIO-SETUP-COMPLETE.md`](./STUDIO-SETUP-COMPLETE.md) in this folder for local setup, verification, and usage.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CrewSwarm Demo Video — Real UI Recording
|
|
4
|
+
*
|
|
5
|
+
* Records a ~45s demo: Vibe IDE chat + Dashboard tour
|
|
6
|
+
* Outputs mp4 + webm via ffmpeg.
|
|
7
|
+
*
|
|
8
|
+
* Requires: dashboard on :4319, vibe on :3333, playwright, ffmpeg
|
|
9
|
+
*/
|
|
10
|
+
import { chromium } from "playwright";
|
|
11
|
+
import { mkdirSync, rmSync, existsSync, statSync, renameSync, readdirSync } from "node:fs";
|
|
12
|
+
import { join, dirname } from "node:path";
|
|
13
|
+
import { fileURLToPath } from "node:url";
|
|
14
|
+
import { execSync } from "node:child_process";
|
|
15
|
+
|
|
16
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
17
|
+
const OUT = join(__dirname, "..", "..", "website", "vibe-assets");
|
|
18
|
+
const FINAL_MP4 = join(OUT, "vibe-demo.mp4");
|
|
19
|
+
const FINAL_WEBM = join(OUT, "vibe-demo.webm");
|
|
20
|
+
|
|
21
|
+
const DASHBOARD_URL = "http://127.0.0.1:4319";
|
|
22
|
+
const VIBE_URL = "http://127.0.0.1:3333";
|
|
23
|
+
const VIEWPORT = { width: 1440, height: 900 };
|
|
24
|
+
|
|
25
|
+
mkdirSync(OUT, { recursive: true });
|
|
26
|
+
|
|
27
|
+
async function record() {
|
|
28
|
+
console.log("⏳ Checking services...");
|
|
29
|
+
|
|
30
|
+
const browser = await chromium.launch({ headless: true });
|
|
31
|
+
const context = await browser.newContext({
|
|
32
|
+
recordVideo: { dir: OUT, size: VIEWPORT },
|
|
33
|
+
viewport: VIEWPORT,
|
|
34
|
+
colorScheme: "dark",
|
|
35
|
+
});
|
|
36
|
+
const page = await context.newPage();
|
|
37
|
+
|
|
38
|
+
try {
|
|
39
|
+
// ─── SCENE 1: Vibe IDE ──────────────────────────
|
|
40
|
+
console.log("🎬 Scene 1: Vibe IDE");
|
|
41
|
+
await page.goto(VIBE_URL, { waitUntil: "load", timeout: 30_000 });
|
|
42
|
+
await page.waitForTimeout(3_000);
|
|
43
|
+
|
|
44
|
+
// Select Studio Workspace project
|
|
45
|
+
console.log(" → Selecting project...");
|
|
46
|
+
try {
|
|
47
|
+
const selects = page.locator("select");
|
|
48
|
+
const count = await selects.count();
|
|
49
|
+
if (count > 0) {
|
|
50
|
+
await selects.first().selectOption({ label: "Studio Workspace" });
|
|
51
|
+
await page.waitForTimeout(2_000);
|
|
52
|
+
}
|
|
53
|
+
} catch (e) { console.log(" (skip project select:", e.message, ")"); }
|
|
54
|
+
|
|
55
|
+
// Click a file in the explorer
|
|
56
|
+
console.log(" → Opening file...");
|
|
57
|
+
try {
|
|
58
|
+
// Click on server.mjs in the file tree
|
|
59
|
+
await page.locator("text=server.mjs").first().click({ timeout: 3000 });
|
|
60
|
+
await page.waitForTimeout(3_000);
|
|
61
|
+
} catch { console.log(" (no file to click)"); }
|
|
62
|
+
|
|
63
|
+
// Type a message in chat
|
|
64
|
+
console.log(" → Typing in chat...");
|
|
65
|
+
try {
|
|
66
|
+
const textarea = page.locator("textarea").first();
|
|
67
|
+
await textarea.click();
|
|
68
|
+
const msg = "Add a GET /health endpoint that returns { status: \"ok\" }";
|
|
69
|
+
for (const ch of msg) {
|
|
70
|
+
await page.keyboard.type(ch, { delay: 30 });
|
|
71
|
+
}
|
|
72
|
+
await page.waitForTimeout(500);
|
|
73
|
+
console.log(" → Sending message...");
|
|
74
|
+
await page.keyboard.press("Enter");
|
|
75
|
+
// Wait for agent response to stream
|
|
76
|
+
console.log(" → Waiting for response (20s)...");
|
|
77
|
+
await page.waitForTimeout(20_000);
|
|
78
|
+
} catch (e) { console.log(" (chat error:", e.message, ")"); }
|
|
79
|
+
|
|
80
|
+
// Show terminal
|
|
81
|
+
console.log(" → Toggling terminal...");
|
|
82
|
+
try {
|
|
83
|
+
await page.locator("button", { hasText: "Terminal" }).click({ timeout: 2000 });
|
|
84
|
+
await page.waitForTimeout(2_000);
|
|
85
|
+
} catch { console.log(" (no terminal button)"); }
|
|
86
|
+
|
|
87
|
+
// Hold for a beat
|
|
88
|
+
await page.waitForTimeout(2_000);
|
|
89
|
+
|
|
90
|
+
// ─── SCENE 2: Dashboard ─────────────────────────
|
|
91
|
+
console.log("🎬 Scene 2: Dashboard");
|
|
92
|
+
await page.goto(DASHBOARD_URL, { waitUntil: "load", timeout: 60_000 });
|
|
93
|
+
await page.waitForTimeout(4_000);
|
|
94
|
+
|
|
95
|
+
// Click through sidebar tabs
|
|
96
|
+
const tabs = ["Sessions", "Agents", "Models", "Engines", "Swarm"];
|
|
97
|
+
for (const name of tabs) {
|
|
98
|
+
try {
|
|
99
|
+
console.log(` → ${name}...`);
|
|
100
|
+
await page.locator(`text="${name}"`).first().click({ timeout: 2000 });
|
|
101
|
+
await page.waitForTimeout(3_500);
|
|
102
|
+
} catch { console.log(` (skip ${name})`); }
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// End on Chat
|
|
106
|
+
try {
|
|
107
|
+
await page.locator('text="Chat"').first().click({ timeout: 2000 });
|
|
108
|
+
await page.waitForTimeout(3_000);
|
|
109
|
+
} catch {}
|
|
110
|
+
|
|
111
|
+
} finally {
|
|
112
|
+
console.log("💾 Saving...");
|
|
113
|
+
await page.close();
|
|
114
|
+
await context.close();
|
|
115
|
+
await browser.close();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Find the recorded webm (Playwright names it randomly)
|
|
119
|
+
const webms = readdirSync(OUT).filter(f => f.endsWith(".webm") && f !== "vibe-demo.webm");
|
|
120
|
+
if (webms.length === 0) {
|
|
121
|
+
console.error("❌ No recording found");
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
// Use the newest one
|
|
125
|
+
webms.sort((a, b) => statSync(join(OUT, b)).mtimeMs - statSync(join(OUT, a)).mtimeMs);
|
|
126
|
+
const rawPath = join(OUT, webms[0]);
|
|
127
|
+
console.log(`📼 Raw recording: ${rawPath}`);
|
|
128
|
+
|
|
129
|
+
// Convert to mp4
|
|
130
|
+
console.log("🎞️ Converting to mp4...");
|
|
131
|
+
rmSync(FINAL_MP4, { force: true });
|
|
132
|
+
execSync(
|
|
133
|
+
`ffmpeg -y -i "${rawPath}" -vcodec libx264 -crf 23 -preset slow -vf "scale=1440:900:flags=lanczos" -movflags +faststart -an "${FINAL_MP4}"`,
|
|
134
|
+
{ stdio: "inherit" }
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
// Convert to webm (for web embed)
|
|
138
|
+
console.log("🎞️ Converting to webm...");
|
|
139
|
+
rmSync(FINAL_WEBM, { force: true });
|
|
140
|
+
execSync(
|
|
141
|
+
`ffmpeg -y -i "${rawPath}" -c:v libvpx-vp9 -crf 30 -b:v 0 -vf "scale=1440:900:flags=lanczos" -an "${FINAL_WEBM}"`,
|
|
142
|
+
{ stdio: "inherit" }
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
// Clean up raw
|
|
146
|
+
rmSync(rawPath, { force: true });
|
|
147
|
+
|
|
148
|
+
const mp4KB = Math.round(statSync(FINAL_MP4).size / 1024);
|
|
149
|
+
const webmKB = Math.round(statSync(FINAL_WEBM).size / 1024);
|
|
150
|
+
console.log(`\n✨ Done:`);
|
|
151
|
+
console.log(` mp4: ${FINAL_MP4} (${mp4KB} KB)`);
|
|
152
|
+
console.log(` webm: ${FINAL_WEBM} (${webmKB} KB)`);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
record()
|
|
156
|
+
.then(() => console.log("\n🎬 Demo capture complete!"))
|
|
157
|
+
.catch((err) => {
|
|
158
|
+
console.error("❌ Failed:", err.message);
|
|
159
|
+
process.exit(1);
|
|
160
|
+
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { chromium } from 'playwright';
|
|
3
|
+
import { mkdirSync } from 'fs';
|
|
4
|
+
import { join, dirname } from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { spawn } from 'child_process';
|
|
7
|
+
|
|
8
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const OUT = join(__dirname, '..', 'website', 'vibe-assets');
|
|
10
|
+
mkdirSync(OUT, { recursive: true });
|
|
11
|
+
|
|
12
|
+
const VIBE_PORT = 3333;
|
|
13
|
+
const SITE_PORT = 8000;
|
|
14
|
+
|
|
15
|
+
async function startVibe() {
|
|
16
|
+
console.log('🐝 Starting Vibe server...');
|
|
17
|
+
const vibe = spawn('npm', ['start'], { cwd: __dirname });
|
|
18
|
+
return new Promise((resolve) => {
|
|
19
|
+
vibe.stdout.on('data', (data) => {
|
|
20
|
+
if (data.toString().includes('running at')) resolve(vibe);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function startSite() {
|
|
26
|
+
console.log('🌐 Starting Marketing Site server...');
|
|
27
|
+
const site = spawn('python3', ['-m', 'http.server', SITE_PORT.toString()], { cwd: join(__dirname, '..', 'website') });
|
|
28
|
+
return new Promise((resolve) => {
|
|
29
|
+
setTimeout(() => resolve(site), 2000); // Give it a moment to start
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function capture() {
|
|
34
|
+
const browser = await chromium.launch({ headless: true });
|
|
35
|
+
const page = await browser.newPage({ viewport: { width: 1400, height: 900 } });
|
|
36
|
+
|
|
37
|
+
try {
|
|
38
|
+
// 1. Capture Vibe IDE
|
|
39
|
+
console.log('📸 Capturing Vibe IDE...');
|
|
40
|
+
await page.goto(`http://127.0.0.1:${VIBE_PORT}`, { waitUntil: 'networkidle' });
|
|
41
|
+
await page.waitForTimeout(3000); // Wait for Monaco and File Tree
|
|
42
|
+
|
|
43
|
+
// Take a full shot
|
|
44
|
+
await page.screenshot({ path: join(OUT, 'vibe-full.png') });
|
|
45
|
+
|
|
46
|
+
// 2. Capture the new Vibe Marketing page
|
|
47
|
+
console.log('📸 Capturing Vibe Marketing page...');
|
|
48
|
+
await page.goto(`http://127.0.0.1:${SITE_PORT}/vibe.html`, { waitUntil: 'networkidle' });
|
|
49
|
+
await page.waitForTimeout(1000);
|
|
50
|
+
await page.screenshot({ path: join(OUT, 'vibe-marketing-hero.png'), fullPage: false });
|
|
51
|
+
|
|
52
|
+
console.log('✨ Screenshots saved to website/vibe-assets/');
|
|
53
|
+
} catch (err) {
|
|
54
|
+
console.error('❌ Error during capture:', err);
|
|
55
|
+
} finally {
|
|
56
|
+
await browser.close();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async function main() {
|
|
61
|
+
const vibe = await startVibe();
|
|
62
|
+
const site = await startSite();
|
|
63
|
+
|
|
64
|
+
await capture();
|
|
65
|
+
|
|
66
|
+
console.log('🛑 Shutting down servers...');
|
|
67
|
+
vibe.kill();
|
|
68
|
+
site.kill();
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
main().catch(console.error);
|