@quantumclaw/quantumclaw 2026.3.22
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/CHANGELOG.md +4601 -0
- package/LICENSE +21 -0
- package/README.md +559 -0
- package/assets/avatar-placeholder.svg +19 -0
- package/assets/chrome-extension/icons/icon128.png +0 -0
- package/assets/chrome-extension/icons/icon16.png +0 -0
- package/assets/chrome-extension/icons/icon32.png +0 -0
- package/assets/chrome-extension/icons/icon48.png +0 -0
- package/assets/dmg-background-small.png +0 -0
- package/assets/dmg-background.png +0 -0
- package/docs/.i18n/README.md +31 -0
- package/docs/.i18n/glossary.ja-JP.json +14 -0
- package/docs/.i18n/glossary.zh-CN.json +302 -0
- package/docs/.i18n/ja-JP.tm.jsonl +0 -0
- package/docs/assets/install-script.svg +1 -0
- package/docs/assets/macos-onboarding/01-macos-warning.jpeg +0 -0
- package/docs/assets/macos-onboarding/02-local-networks.jpeg +0 -0
- package/docs/assets/macos-onboarding/03-security-notice.png +0 -0
- package/docs/assets/macos-onboarding/04-choose-gateway.png +0 -0
- package/docs/assets/macos-onboarding/05-permissions.png +0 -0
- package/docs/assets/pixel-lobster.svg +60 -0
- package/docs/assets/quantumclaw-logo-text-dark.png +0 -0
- package/docs/assets/quantumclaw-logo-text-dark.svg +418 -0
- package/docs/assets/quantumclaw-logo-text.png +0 -0
- package/docs/assets/quantumclaw-logo-text.svg +418 -0
- package/docs/assets/showcase/agents-ui.jpg +0 -0
- package/docs/assets/showcase/bambu-cli.png +0 -0
- package/docs/assets/showcase/codexmonitor.png +0 -0
- package/docs/assets/showcase/gohome-grafana.png +0 -0
- package/docs/assets/showcase/ios-testflight.jpg +0 -0
- package/docs/assets/showcase/oura-health.png +0 -0
- package/docs/assets/showcase/padel-cli.svg +11 -0
- package/docs/assets/showcase/padel-screenshot.jpg +0 -0
- package/docs/assets/showcase/papla-tts.jpg +0 -0
- package/docs/assets/showcase/pr-review-telegram.jpg +0 -0
- package/docs/assets/showcase/roborock-screenshot.jpg +0 -0
- package/docs/assets/showcase/roborock-status.svg +13 -0
- package/docs/assets/showcase/roof-camera-sky.jpg +0 -0
- package/docs/assets/showcase/snag.png +0 -0
- package/docs/assets/showcase/tesco-shop.jpg +0 -0
- package/docs/assets/showcase/wienerlinien.png +0 -0
- package/docs/assets/showcase/wine-cellar-skill.jpg +0 -0
- package/docs/assets/showcase/winix-air-purifier.jpg +0 -0
- package/docs/assets/showcase/xuezh-pronunciation.jpeg +0 -0
- package/docs/assets/sponsors/blacksmith.svg +14 -0
- package/docs/assets/sponsors/convex.svg +16 -0
- package/docs/assets/sponsors/openai.svg +3 -0
- package/docs/assets/sponsors/vercel.svg +5 -0
- package/docs/auth-credential-semantics.md +53 -0
- package/docs/automation/auth-monitoring.md +44 -0
- package/docs/automation/cron-jobs.md +727 -0
- package/docs/automation/cron-vs-heartbeat.md +286 -0
- package/docs/automation/gmail-pubsub.md +256 -0
- package/docs/automation/hooks.md +1056 -0
- package/docs/automation/poll.md +86 -0
- package/docs/automation/standing-orders.md +251 -0
- package/docs/automation/troubleshooting.md +122 -0
- package/docs/automation/webhook.md +217 -0
- package/docs/brave-search.md +93 -0
- package/docs/channels/bluebubbles.md +347 -0
- package/docs/channels/broadcast-groups.md +442 -0
- package/docs/channels/channel-routing.md +139 -0
- package/docs/channels/discord.md +1229 -0
- package/docs/channels/feishu.md +747 -0
- package/docs/channels/googlechat.md +261 -0
- package/docs/channels/group-messages.md +84 -0
- package/docs/channels/groups.md +379 -0
- package/docs/channels/imessage.md +367 -0
- package/docs/channels/index.md +47 -0
- package/docs/channels/irc.md +242 -0
- package/docs/channels/line.md +194 -0
- package/docs/channels/location.md +56 -0
- package/docs/channels/matrix.md +677 -0
- package/docs/channels/mattermost.md +427 -0
- package/docs/channels/msteams.md +780 -0
- package/docs/channels/nextcloud-talk.md +138 -0
- package/docs/channels/nostr.md +249 -0
- package/docs/channels/pairing.md +114 -0
- package/docs/channels/signal.md +329 -0
- package/docs/channels/slack.md +603 -0
- package/docs/channels/synology-chat.md +134 -0
- package/docs/channels/telegram.md +987 -0
- package/docs/channels/tlon.md +276 -0
- package/docs/channels/troubleshooting.md +118 -0
- package/docs/channels/twitch.md +379 -0
- package/docs/channels/whatsapp.md +460 -0
- package/docs/channels/zalo.md +243 -0
- package/docs/channels/zalouser.md +181 -0
- package/docs/ci.md +55 -0
- package/docs/cli/acp.md +288 -0
- package/docs/cli/agent.md +29 -0
- package/docs/cli/agents.md +123 -0
- package/docs/cli/approvals.md +50 -0
- package/docs/cli/backup.md +76 -0
- package/docs/cli/browser.md +106 -0
- package/docs/cli/channels.md +102 -0
- package/docs/cli/clawbot.md +21 -0
- package/docs/cli/completion.md +35 -0
- package/docs/cli/config.md +295 -0
- package/docs/cli/configure.md +36 -0
- package/docs/cli/cron.md +77 -0
- package/docs/cli/daemon.md +53 -0
- package/docs/cli/dashboard.md +22 -0
- package/docs/cli/devices.md +139 -0
- package/docs/cli/directory.md +63 -0
- package/docs/cli/dns.md +23 -0
- package/docs/cli/docs.md +15 -0
- package/docs/cli/doctor.md +48 -0
- package/docs/cli/gateway.md +235 -0
- package/docs/cli/health.md +21 -0
- package/docs/cli/hooks.md +329 -0
- package/docs/cli/index.md +1150 -0
- package/docs/cli/logs.md +28 -0
- package/docs/cli/memory.md +66 -0
- package/docs/cli/message.md +278 -0
- package/docs/cli/models.md +81 -0
- package/docs/cli/node.md +127 -0
- package/docs/cli/nodes.md +75 -0
- package/docs/cli/onboard.md +157 -0
- package/docs/cli/pairing.md +32 -0
- package/docs/cli/plugins.md +210 -0
- package/docs/cli/qr.md +46 -0
- package/docs/cli/reset.md +20 -0
- package/docs/cli/sandbox.md +197 -0
- package/docs/cli/secrets.md +188 -0
- package/docs/cli/security.md +79 -0
- package/docs/cli/sessions.md +110 -0
- package/docs/cli/setup.md +29 -0
- package/docs/cli/skills.md +36 -0
- package/docs/cli/status.md +30 -0
- package/docs/cli/system.md +60 -0
- package/docs/cli/tui.md +30 -0
- package/docs/cli/uninstall.md +20 -0
- package/docs/cli/update.md +103 -0
- package/docs/cli/voicecall.md +34 -0
- package/docs/cli/webhooks.md +25 -0
- package/docs/concepts/agent-loop.md +148 -0
- package/docs/concepts/agent-workspace.md +236 -0
- package/docs/concepts/agent.md +122 -0
- package/docs/concepts/architecture.md +137 -0
- package/docs/concepts/compaction.md +123 -0
- package/docs/concepts/context-engine.md +268 -0
- package/docs/concepts/context.md +172 -0
- package/docs/concepts/delegate-architecture.md +296 -0
- package/docs/concepts/features.md +73 -0
- package/docs/concepts/markdown-formatting.md +130 -0
- package/docs/concepts/memory.md +108 -0
- package/docs/concepts/messages.md +154 -0
- package/docs/concepts/model-failover.md +152 -0
- package/docs/concepts/model-providers.md +607 -0
- package/docs/concepts/models.md +225 -0
- package/docs/concepts/multi-agent.md +552 -0
- package/docs/concepts/oauth.md +158 -0
- package/docs/concepts/presence.md +102 -0
- package/docs/concepts/queue.md +89 -0
- package/docs/concepts/retry.md +69 -0
- package/docs/concepts/session-pruning.md +121 -0
- package/docs/concepts/session-tool.md +242 -0
- package/docs/concepts/session.md +310 -0
- package/docs/concepts/streaming.md +155 -0
- package/docs/concepts/system-prompt.md +132 -0
- package/docs/concepts/timezone.md +91 -0
- package/docs/concepts/typebox.md +291 -0
- package/docs/concepts/typing-indicators.md +68 -0
- package/docs/concepts/usage-tracking.md +35 -0
- package/docs/date-time.md +128 -0
- package/docs/debug/node-issue.md +85 -0
- package/docs/diagnostics/flags.md +91 -0
- package/docs/docs.json +2078 -0
- package/docs/gateway/authentication.md +179 -0
- package/docs/gateway/background-process.md +97 -0
- package/docs/gateway/bonjour.md +177 -0
- package/docs/gateway/bridge-protocol.md +91 -0
- package/docs/gateway/cli-backends.md +225 -0
- package/docs/gateway/configuration-examples.md +651 -0
- package/docs/gateway/configuration-reference.md +3123 -0
- package/docs/gateway/configuration.md +633 -0
- package/docs/gateway/discovery.md +123 -0
- package/docs/gateway/doctor.md +362 -0
- package/docs/gateway/gateway-lock.md +34 -0
- package/docs/gateway/health.md +44 -0
- package/docs/gateway/heartbeat.md +393 -0
- package/docs/gateway/index.md +261 -0
- package/docs/gateway/local-models.md +152 -0
- package/docs/gateway/logging.md +113 -0
- package/docs/gateway/multiple-gateways.md +112 -0
- package/docs/gateway/network-model.md +22 -0
- package/docs/gateway/openai-http-api.md +132 -0
- package/docs/gateway/openresponses-http-api.md +295 -0
- package/docs/gateway/openshell.md +307 -0
- package/docs/gateway/pairing.md +99 -0
- package/docs/gateway/protocol.md +267 -0
- package/docs/gateway/remote-gateway-readme.md +158 -0
- package/docs/gateway/remote.md +153 -0
- package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +134 -0
- package/docs/gateway/sandboxing.md +469 -0
- package/docs/gateway/secrets-plan-contract.md +116 -0
- package/docs/gateway/secrets.md +503 -0
- package/docs/gateway/security/index.md +1220 -0
- package/docs/gateway/tailscale.md +132 -0
- package/docs/gateway/tools-invoke-http-api.md +118 -0
- package/docs/gateway/troubleshooting.md +378 -0
- package/docs/gateway/trusted-proxy-auth.md +330 -0
- package/docs/help/debugging.md +168 -0
- package/docs/help/environment.md +163 -0
- package/docs/help/faq.md +2997 -0
- package/docs/help/index.md +28 -0
- package/docs/help/scripts.md +28 -0
- package/docs/help/testing.md +526 -0
- package/docs/help/troubleshooting.md +297 -0
- package/docs/images/configure-model-picker-unsearchable.png +0 -0
- package/docs/images/feishu-step2-create-app.png +0 -0
- package/docs/images/feishu-step3-credentials.png +0 -0
- package/docs/images/feishu-step4-permissions.png +0 -0
- package/docs/images/feishu-step5-bot-capability.png +0 -0
- package/docs/images/feishu-step6-event-subscription.png +0 -0
- package/docs/images/feishu-verification-token.png +0 -0
- package/docs/images/groups-flow.svg +52 -0
- package/docs/images/mobile-ui-screenshot.png +0 -0
- package/docs/index.md +196 -0
- package/docs/install/ansible.md +230 -0
- package/docs/install/azure.md +311 -0
- package/docs/install/bun.md +55 -0
- package/docs/install/development-channels.md +120 -0
- package/docs/install/digitalocean.md +129 -0
- package/docs/install/docker-vm-runtime.md +142 -0
- package/docs/install/docker.md +375 -0
- package/docs/install/exe-dev.md +126 -0
- package/docs/install/fly.md +501 -0
- package/docs/install/gcp.md +402 -0
- package/docs/install/hetzner.md +251 -0
- package/docs/install/index.md +183 -0
- package/docs/install/installer.md +415 -0
- package/docs/install/kubernetes.md +191 -0
- package/docs/install/macos-vm.md +281 -0
- package/docs/install/migrating-matrix.md +346 -0
- package/docs/install/migrating.md +110 -0
- package/docs/install/nix.md +89 -0
- package/docs/install/node.md +138 -0
- package/docs/install/northflank.mdx +54 -0
- package/docs/install/oracle.md +156 -0
- package/docs/install/podman.md +133 -0
- package/docs/install/railway.mdx +100 -0
- package/docs/install/raspberry-pi.md +159 -0
- package/docs/install/render.mdx +169 -0
- package/docs/install/uninstall.md +128 -0
- package/docs/install/updating.md +128 -0
- package/docs/ja-JP/index.md +186 -0
- package/docs/ja-JP/start/getting-started.md +125 -0
- package/docs/ja-JP/start/wizard.md +77 -0
- package/docs/logging.md +352 -0
- package/docs/nav-tabs-underline.js +100 -0
- package/docs/network.md +54 -0
- package/docs/nodes/audio.md +187 -0
- package/docs/nodes/camera.md +162 -0
- package/docs/nodes/images.md +72 -0
- package/docs/nodes/index.md +393 -0
- package/docs/nodes/location-command.md +98 -0
- package/docs/nodes/media-understanding.md +394 -0
- package/docs/nodes/talk.md +92 -0
- package/docs/nodes/troubleshooting.md +114 -0
- package/docs/nodes/voicewake.md +66 -0
- package/docs/perplexity.md +174 -0
- package/docs/pi-dev.md +80 -0
- package/docs/pi.md +567 -0
- package/docs/platforms/android.md +168 -0
- package/docs/platforms/digitalocean.md +266 -0
- package/docs/platforms/index.md +54 -0
- package/docs/platforms/ios.md +220 -0
- package/docs/platforms/linux.md +94 -0
- package/docs/platforms/mac/bundled-gateway.md +73 -0
- package/docs/platforms/mac/canvas.md +125 -0
- package/docs/platforms/mac/child-process.md +69 -0
- package/docs/platforms/mac/dev-setup.md +104 -0
- package/docs/platforms/mac/health.md +34 -0
- package/docs/platforms/mac/icon.md +31 -0
- package/docs/platforms/mac/logging.md +57 -0
- package/docs/platforms/mac/menu-bar.md +81 -0
- package/docs/platforms/mac/peekaboo.md +65 -0
- package/docs/platforms/mac/permissions.md +50 -0
- package/docs/platforms/mac/remote.md +84 -0
- package/docs/platforms/mac/signing.md +47 -0
- package/docs/platforms/mac/skills.md +33 -0
- package/docs/platforms/mac/voice-overlay.md +60 -0
- package/docs/platforms/mac/voicewake.md +67 -0
- package/docs/platforms/mac/webchat.md +43 -0
- package/docs/platforms/mac/xpc.md +61 -0
- package/docs/platforms/macos.md +226 -0
- package/docs/platforms/oracle.md +303 -0
- package/docs/platforms/raspberry-pi.md +412 -0
- package/docs/platforms/windows.md +241 -0
- package/docs/plugins/agent-tools.md +10 -0
- package/docs/plugins/architecture.md +1366 -0
- package/docs/plugins/building-extensions.md +10 -0
- package/docs/plugins/building-plugins.md +239 -0
- package/docs/plugins/bundles.md +181 -0
- package/docs/plugins/community.md +145 -0
- package/docs/plugins/manifest.md +241 -0
- package/docs/plugins/sdk-channel-plugins.md +370 -0
- package/docs/plugins/sdk-entrypoints.md +161 -0
- package/docs/plugins/sdk-migration.md +172 -0
- package/docs/plugins/sdk-overview.md +196 -0
- package/docs/plugins/sdk-provider-plugins.md +370 -0
- package/docs/plugins/sdk-runtime.md +345 -0
- package/docs/plugins/sdk-setup.md +331 -0
- package/docs/plugins/sdk-testing.md +263 -0
- package/docs/plugins/voice-call.md +380 -0
- package/docs/plugins/zalouser.md +77 -0
- package/docs/prose.md +134 -0
- package/docs/providers/anthropic.md +259 -0
- package/docs/providers/bedrock.md +176 -0
- package/docs/providers/claude-max-api-proxy.md +154 -0
- package/docs/providers/cloudflare-ai-gateway.md +71 -0
- package/docs/providers/deepgram.md +93 -0
- package/docs/providers/github-copilot.md +72 -0
- package/docs/providers/glm.md +43 -0
- package/docs/providers/google.md +78 -0
- package/docs/providers/groq.md +96 -0
- package/docs/providers/huggingface.md +209 -0
- package/docs/providers/index.md +69 -0
- package/docs/providers/kilocode.md +74 -0
- package/docs/providers/litellm.md +154 -0
- package/docs/providers/minimax.md +224 -0
- package/docs/providers/mistral.md +54 -0
- package/docs/providers/models.md +45 -0
- package/docs/providers/modelstudio.md +66 -0
- package/docs/providers/moonshot.md +175 -0
- package/docs/providers/nvidia.md +55 -0
- package/docs/providers/ollama.md +352 -0
- package/docs/providers/openai.md +303 -0
- package/docs/providers/opencode-go.md +45 -0
- package/docs/providers/opencode.md +64 -0
- package/docs/providers/openrouter.md +37 -0
- package/docs/providers/perplexity-provider.md +62 -0
- package/docs/providers/qianfan.md +38 -0
- package/docs/providers/qwen.md +53 -0
- package/docs/providers/sglang.md +104 -0
- package/docs/providers/synthetic.md +99 -0
- package/docs/providers/together.md +66 -0
- package/docs/providers/venice.md +282 -0
- package/docs/providers/vercel-ai-gateway.md +60 -0
- package/docs/providers/vllm.md +92 -0
- package/docs/providers/volcengine.md +74 -0
- package/docs/providers/xai.md +60 -0
- package/docs/providers/xiaomi.md +86 -0
- package/docs/providers/zai.md +46 -0
- package/docs/reference/AGENTS.default.md +126 -0
- package/docs/reference/RELEASING.md +42 -0
- package/docs/reference/api-usage-costs.md +144 -0
- package/docs/reference/credits.md +30 -0
- package/docs/reference/device-models.md +47 -0
- package/docs/reference/memory-config.md +711 -0
- package/docs/reference/prompt-caching.md +185 -0
- package/docs/reference/rpc.md +43 -0
- package/docs/reference/secretref-credential-surface.md +140 -0
- package/docs/reference/secretref-user-supplied-credentials-matrix.json +563 -0
- package/docs/reference/session-management-compaction.md +324 -0
- package/docs/reference/templates/AGENTS.dev.md +83 -0
- package/docs/reference/templates/AGENTS.md +219 -0
- package/docs/reference/templates/BOOT.md +11 -0
- package/docs/reference/templates/BOOTSTRAP.md +62 -0
- package/docs/reference/templates/HEARTBEAT.md +14 -0
- package/docs/reference/templates/IDENTITY.dev.md +47 -0
- package/docs/reference/templates/IDENTITY.md +29 -0
- package/docs/reference/templates/SOUL.dev.md +76 -0
- package/docs/reference/templates/SOUL.md +43 -0
- package/docs/reference/templates/TOOLS.dev.md +24 -0
- package/docs/reference/templates/TOOLS.md +47 -0
- package/docs/reference/templates/USER.dev.md +18 -0
- package/docs/reference/templates/USER.md +23 -0
- package/docs/reference/test.md +90 -0
- package/docs/reference/token-use.md +175 -0
- package/docs/reference/transcript-hygiene.md +151 -0
- package/docs/reference/wizard.md +235 -0
- package/docs/security/CONTRIBUTING-THREAT-MODEL.md +98 -0
- package/docs/security/THREAT-MODEL-ATLAS.md +611 -0
- package/docs/security/formal-verification.md +167 -0
- package/docs/start/bootstrapping.md +41 -0
- package/docs/start/docs-directory.md +66 -0
- package/docs/start/getting-started.md +116 -0
- package/docs/start/hubs.md +198 -0
- package/docs/start/lore.md +219 -0
- package/docs/start/onboarding-overview.md +67 -0
- package/docs/start/onboarding.md +91 -0
- package/docs/start/openclaw.md +221 -0
- package/docs/start/quickstart.md +22 -0
- package/docs/start/setup.md +164 -0
- package/docs/start/showcase.md +418 -0
- package/docs/start/wizard-cli-automation.md +215 -0
- package/docs/start/wizard-cli-reference.md +299 -0
- package/docs/start/wizard.md +125 -0
- package/docs/style.css +37 -0
- package/docs/tools/acp-agents.md +623 -0
- package/docs/tools/agent-send.md +100 -0
- package/docs/tools/apply-patch.md +51 -0
- package/docs/tools/brave-search.md +93 -0
- package/docs/tools/browser-linux-troubleshooting.md +138 -0
- package/docs/tools/browser-login.md +73 -0
- package/docs/tools/browser-wsl2-windows-remote-cdp-troubleshooting.md +211 -0
- package/docs/tools/browser.md +731 -0
- package/docs/tools/btw.md +142 -0
- package/docs/tools/capability-cookbook.md +119 -0
- package/docs/tools/clawhub.md +298 -0
- package/docs/tools/creating-skills.md +117 -0
- package/docs/tools/diffs.md +386 -0
- package/docs/tools/elevated.md +114 -0
- package/docs/tools/exec-approvals.md +430 -0
- package/docs/tools/exec.md +207 -0
- package/docs/tools/firecrawl.md +140 -0
- package/docs/tools/index.md +137 -0
- package/docs/tools/llm-task.md +119 -0
- package/docs/tools/lobster.md +340 -0
- package/docs/tools/loop-detection.md +100 -0
- package/docs/tools/multi-agent-sandbox-tools.md +364 -0
- package/docs/tools/pdf.md +156 -0
- package/docs/tools/perplexity-search.md +174 -0
- package/docs/tools/plugin.md +255 -0
- package/docs/tools/reactions.md +64 -0
- package/docs/tools/skills-config.md +86 -0
- package/docs/tools/skills.md +309 -0
- package/docs/tools/slash-commands.md +294 -0
- package/docs/tools/subagents.md +295 -0
- package/docs/tools/tavily.md +125 -0
- package/docs/tools/thinking.md +96 -0
- package/docs/tools/tts.md +406 -0
- package/docs/tools/web.md +516 -0
- package/docs/tts.md +406 -0
- package/docs/vps.md +112 -0
- package/docs/web/control-ui.md +275 -0
- package/docs/web/dashboard.md +54 -0
- package/docs/web/index.md +120 -0
- package/docs/web/tui.md +170 -0
- package/docs/web/webchat.md +61 -0
- package/docs/whatsapp-openclaw-ai-zh.jpg +0 -0
- package/docs/whatsapp-openclaw.jpg +0 -0
- package/docs/zh-CN/AGENTS.md +61 -0
- package/docs/zh-CN/automation/auth-monitoring.md +47 -0
- package/docs/zh-CN/automation/cron-jobs.md +435 -0
- package/docs/zh-CN/automation/cron-vs-heartbeat.md +286 -0
- package/docs/zh-CN/automation/gmail-pubsub.md +249 -0
- package/docs/zh-CN/automation/hooks.md +1051 -0
- package/docs/zh-CN/automation/poll.md +76 -0
- package/docs/zh-CN/automation/troubleshooting.md +8 -0
- package/docs/zh-CN/automation/webhook.md +163 -0
- package/docs/zh-CN/brave-search.md +60 -0
- package/docs/zh-CN/channels/bluebubbles.md +354 -0
- package/docs/zh-CN/channels/broadcast-groups.md +449 -0
- package/docs/zh-CN/channels/channel-routing.md +117 -0
- package/docs/zh-CN/channels/discord.md +468 -0
- package/docs/zh-CN/channels/feishu.md +728 -0
- package/docs/zh-CN/channels/googlechat.md +257 -0
- package/docs/zh-CN/channels/grammy.md +38 -0
- package/docs/zh-CN/channels/group-messages.md +91 -0
- package/docs/zh-CN/channels/groups.md +379 -0
- package/docs/zh-CN/channels/imessage.md +302 -0
- package/docs/zh-CN/channels/index.md +53 -0
- package/docs/zh-CN/channels/line.md +180 -0
- package/docs/zh-CN/channels/location.md +63 -0
- package/docs/zh-CN/channels/matrix.md +221 -0
- package/docs/zh-CN/channels/mattermost.md +144 -0
- package/docs/zh-CN/channels/msteams.md +775 -0
- package/docs/zh-CN/channels/nextcloud-talk.md +142 -0
- package/docs/zh-CN/channels/nostr.md +249 -0
- package/docs/zh-CN/channels/pairing.md +89 -0
- package/docs/zh-CN/channels/signal.md +209 -0
- package/docs/zh-CN/channels/slack.md +531 -0
- package/docs/zh-CN/channels/synology-chat.md +138 -0
- package/docs/zh-CN/channels/telegram.md +751 -0
- package/docs/zh-CN/channels/tlon.md +136 -0
- package/docs/zh-CN/channels/troubleshooting.md +36 -0
- package/docs/zh-CN/channels/twitch.md +385 -0
- package/docs/zh-CN/channels/whatsapp.md +411 -0
- package/docs/zh-CN/channels/zalo.md +196 -0
- package/docs/zh-CN/channels/zalouser.md +147 -0
- package/docs/zh-CN/cli/acp.md +173 -0
- package/docs/zh-CN/cli/agent.md +30 -0
- package/docs/zh-CN/cli/agents.md +82 -0
- package/docs/zh-CN/cli/approvals.md +57 -0
- package/docs/zh-CN/cli/browser.md +114 -0
- package/docs/zh-CN/cli/channels.md +86 -0
- package/docs/zh-CN/cli/config.md +57 -0
- package/docs/zh-CN/cli/configure.md +38 -0
- package/docs/zh-CN/cli/cron.md +43 -0
- package/docs/zh-CN/cli/dashboard.md +23 -0
- package/docs/zh-CN/cli/devices.md +74 -0
- package/docs/zh-CN/cli/directory.md +70 -0
- package/docs/zh-CN/cli/dns.md +30 -0
- package/docs/zh-CN/cli/docs.md +22 -0
- package/docs/zh-CN/cli/doctor.md +48 -0
- package/docs/zh-CN/cli/gateway.md +206 -0
- package/docs/zh-CN/cli/health.md +28 -0
- package/docs/zh-CN/cli/hooks.md +298 -0
- package/docs/zh-CN/cli/index.md +1143 -0
- package/docs/zh-CN/cli/logs.md +31 -0
- package/docs/zh-CN/cli/memory.md +52 -0
- package/docs/zh-CN/cli/message.md +246 -0
- package/docs/zh-CN/cli/models.md +85 -0
- package/docs/zh-CN/cli/node.md +115 -0
- package/docs/zh-CN/cli/nodes.md +80 -0
- package/docs/zh-CN/cli/onboard.md +164 -0
- package/docs/zh-CN/cli/pairing.md +28 -0
- package/docs/zh-CN/cli/plugins.md +66 -0
- package/docs/zh-CN/cli/reset.md +24 -0
- package/docs/zh-CN/cli/sandbox.md +158 -0
- package/docs/zh-CN/cli/security.md +33 -0
- package/docs/zh-CN/cli/sessions.md +23 -0
- package/docs/zh-CN/cli/setup.md +36 -0
- package/docs/zh-CN/cli/skills.md +33 -0
- package/docs/zh-CN/cli/status.md +33 -0
- package/docs/zh-CN/cli/system.md +63 -0
- package/docs/zh-CN/cli/tui.md +30 -0
- package/docs/zh-CN/cli/uninstall.md +24 -0
- package/docs/zh-CN/cli/update.md +101 -0
- package/docs/zh-CN/cli/voicecall.md +41 -0
- package/docs/zh-CN/cli/webhooks.md +32 -0
- package/docs/zh-CN/concepts/agent-loop.md +146 -0
- package/docs/zh-CN/concepts/agent-workspace.md +219 -0
- package/docs/zh-CN/concepts/agent.md +115 -0
- package/docs/zh-CN/concepts/architecture.md +123 -0
- package/docs/zh-CN/concepts/compaction.md +67 -0
- package/docs/zh-CN/concepts/context.md +168 -0
- package/docs/zh-CN/concepts/features.md +59 -0
- package/docs/zh-CN/concepts/markdown-formatting.md +117 -0
- package/docs/zh-CN/concepts/memory.md +412 -0
- package/docs/zh-CN/concepts/messages.md +141 -0
- package/docs/zh-CN/concepts/model-failover.md +145 -0
- package/docs/zh-CN/concepts/model-providers.md +606 -0
- package/docs/zh-CN/concepts/models.md +225 -0
- package/docs/zh-CN/concepts/multi-agent.md +372 -0
- package/docs/zh-CN/concepts/oauth.md +164 -0
- package/docs/zh-CN/concepts/presence.md +99 -0
- package/docs/zh-CN/concepts/queue.md +94 -0
- package/docs/zh-CN/concepts/retry.md +76 -0
- package/docs/zh-CN/concepts/session-pruning.md +129 -0
- package/docs/zh-CN/concepts/session-tool.md +200 -0
- package/docs/zh-CN/concepts/session.md +166 -0
- package/docs/zh-CN/concepts/streaming.md +133 -0
- package/docs/zh-CN/concepts/system-prompt.md +101 -0
- package/docs/zh-CN/concepts/timezone.md +96 -0
- package/docs/zh-CN/concepts/typebox.md +284 -0
- package/docs/zh-CN/concepts/typing-indicators.md +74 -0
- package/docs/zh-CN/concepts/usage-tracking.md +42 -0
- package/docs/zh-CN/date-time.md +129 -0
- package/docs/zh-CN/debug/node-issue.md +90 -0
- package/docs/zh-CN/diagnostics/flags.md +98 -0
- package/docs/zh-CN/gateway/authentication.md +184 -0
- package/docs/zh-CN/gateway/background-process.md +100 -0
- package/docs/zh-CN/gateway/bonjour.md +174 -0
- package/docs/zh-CN/gateway/bridge-protocol.md +86 -0
- package/docs/zh-CN/gateway/cli-backends.md +213 -0
- package/docs/zh-CN/gateway/configuration-examples.md +587 -0
- package/docs/zh-CN/gateway/configuration-reference.md +3103 -0
- package/docs/zh-CN/gateway/configuration.md +640 -0
- package/docs/zh-CN/gateway/discovery.md +123 -0
- package/docs/zh-CN/gateway/doctor.md +238 -0
- package/docs/zh-CN/gateway/gateway-lock.md +41 -0
- package/docs/zh-CN/gateway/health.md +42 -0
- package/docs/zh-CN/gateway/heartbeat.md +274 -0
- package/docs/zh-CN/gateway/index.md +335 -0
- package/docs/zh-CN/gateway/local-models.md +159 -0
- package/docs/zh-CN/gateway/logging.md +114 -0
- package/docs/zh-CN/gateway/multiple-gateways.md +119 -0
- package/docs/zh-CN/gateway/network-model.md +23 -0
- package/docs/zh-CN/gateway/openai-http-api.md +125 -0
- package/docs/zh-CN/gateway/openresponses-http-api.md +317 -0
- package/docs/zh-CN/gateway/pairing.md +99 -0
- package/docs/zh-CN/gateway/protocol.md +220 -0
- package/docs/zh-CN/gateway/remote-gateway-readme.md +164 -0
- package/docs/zh-CN/gateway/remote.md +133 -0
- package/docs/zh-CN/gateway/sandbox-vs-tool-policy-vs-elevated.md +135 -0
- package/docs/zh-CN/gateway/sandboxing.md +188 -0
- package/docs/zh-CN/gateway/security/index.md +777 -0
- package/docs/zh-CN/gateway/tailscale.md +124 -0
- package/docs/zh-CN/gateway/tools-invoke-http-api.md +92 -0
- package/docs/zh-CN/gateway/troubleshooting.md +771 -0
- package/docs/zh-CN/help/debugging.md +160 -0
- package/docs/zh-CN/help/environment.md +88 -0
- package/docs/zh-CN/help/faq.md +2640 -0
- package/docs/zh-CN/help/index.md +28 -0
- package/docs/zh-CN/help/scripts.md +35 -0
- package/docs/zh-CN/help/testing.md +375 -0
- package/docs/zh-CN/help/troubleshooting.md +104 -0
- package/docs/zh-CN/index.md +186 -0
- package/docs/zh-CN/install/ansible.md +215 -0
- package/docs/zh-CN/install/bun.md +65 -0
- package/docs/zh-CN/install/development-channels.md +81 -0
- package/docs/zh-CN/install/docker.md +532 -0
- package/docs/zh-CN/install/exe-dev.md +133 -0
- package/docs/zh-CN/install/fly.md +490 -0
- package/docs/zh-CN/install/gcp.md +510 -0
- package/docs/zh-CN/install/hetzner.md +337 -0
- package/docs/zh-CN/install/index.md +235 -0
- package/docs/zh-CN/install/installer.md +422 -0
- package/docs/zh-CN/install/macos-vm.md +288 -0
- package/docs/zh-CN/install/migrating.md +199 -0
- package/docs/zh-CN/install/nix.md +99 -0
- package/docs/zh-CN/install/node.md +8 -0
- package/docs/zh-CN/install/northflank.mdx +60 -0
- package/docs/zh-CN/install/railway.mdx +106 -0
- package/docs/zh-CN/install/render.mdx +169 -0
- package/docs/zh-CN/install/uninstall.md +135 -0
- package/docs/zh-CN/install/updating.md +233 -0
- package/docs/zh-CN/logging.md +329 -0
- package/docs/zh-CN/network.md +59 -0
- package/docs/zh-CN/nodes/audio.md +120 -0
- package/docs/zh-CN/nodes/camera.md +162 -0
- package/docs/zh-CN/nodes/images.md +79 -0
- package/docs/zh-CN/nodes/index.md +348 -0
- package/docs/zh-CN/nodes/location-command.md +120 -0
- package/docs/zh-CN/nodes/media-understanding.md +380 -0
- package/docs/zh-CN/nodes/talk.md +97 -0
- package/docs/zh-CN/nodes/troubleshooting.md +8 -0
- package/docs/zh-CN/nodes/voicewake.md +72 -0
- package/docs/zh-CN/perplexity.md +102 -0
- package/docs/zh-CN/pi-dev.md +77 -0
- package/docs/zh-CN/pi.md +619 -0
- package/docs/zh-CN/platforms/android.md +155 -0
- package/docs/zh-CN/platforms/digitalocean.md +273 -0
- package/docs/zh-CN/platforms/index.md +60 -0
- package/docs/zh-CN/platforms/ios.md +114 -0
- package/docs/zh-CN/platforms/linux.md +100 -0
- package/docs/zh-CN/platforms/mac/bundled-gateway.md +75 -0
- package/docs/zh-CN/platforms/mac/canvas.md +128 -0
- package/docs/zh-CN/platforms/mac/child-process.md +73 -0
- package/docs/zh-CN/platforms/mac/dev-setup.md +109 -0
- package/docs/zh-CN/platforms/mac/health.md +41 -0
- package/docs/zh-CN/platforms/mac/icon.md +38 -0
- package/docs/zh-CN/platforms/mac/logging.md +64 -0
- package/docs/zh-CN/platforms/mac/menu-bar.md +88 -0
- package/docs/zh-CN/platforms/mac/peekaboo.md +62 -0
- package/docs/zh-CN/platforms/mac/permissions.md +46 -0
- package/docs/zh-CN/platforms/mac/remote.md +90 -0
- package/docs/zh-CN/platforms/mac/signing.md +54 -0
- package/docs/zh-CN/platforms/mac/skills.md +40 -0
- package/docs/zh-CN/platforms/mac/voice-overlay.md +67 -0
- package/docs/zh-CN/platforms/mac/voicewake.md +74 -0
- package/docs/zh-CN/platforms/mac/webchat.md +43 -0
- package/docs/zh-CN/platforms/mac/xpc.md +68 -0
- package/docs/zh-CN/platforms/macos.md +193 -0
- package/docs/zh-CN/platforms/oracle.md +310 -0
- package/docs/zh-CN/platforms/raspberry-pi.md +416 -0
- package/docs/zh-CN/platforms/windows.md +247 -0
- package/docs/zh-CN/plugins/agent-tools.md +99 -0
- package/docs/zh-CN/plugins/manifest.md +68 -0
- package/docs/zh-CN/plugins/voice-call.md +250 -0
- package/docs/zh-CN/plugins/zalouser.md +88 -0
- package/docs/zh-CN/prose.md +141 -0
- package/docs/zh-CN/providers/anthropic.md +265 -0
- package/docs/zh-CN/providers/bedrock.md +170 -0
- package/docs/zh-CN/providers/claude-max-api-proxy.md +155 -0
- package/docs/zh-CN/providers/cloudflare-ai-gateway.md +78 -0
- package/docs/zh-CN/providers/deepgram.md +97 -0
- package/docs/zh-CN/providers/github-copilot.md +67 -0
- package/docs/zh-CN/providers/glm.md +50 -0
- package/docs/zh-CN/providers/huggingface.md +216 -0
- package/docs/zh-CN/providers/index.md +69 -0
- package/docs/zh-CN/providers/kilocode.md +80 -0
- package/docs/zh-CN/providers/litellm.md +160 -0
- package/docs/zh-CN/providers/minimax.md +222 -0
- package/docs/zh-CN/providers/mistral.md +61 -0
- package/docs/zh-CN/providers/models.md +51 -0
- package/docs/zh-CN/providers/moonshot.md +182 -0
- package/docs/zh-CN/providers/nvidia.md +62 -0
- package/docs/zh-CN/providers/ollama.md +359 -0
- package/docs/zh-CN/providers/openai.md +308 -0
- package/docs/zh-CN/providers/opencode-go.md +52 -0
- package/docs/zh-CN/providers/opencode.md +71 -0
- package/docs/zh-CN/providers/openrouter.md +44 -0
- package/docs/zh-CN/providers/qianfan.md +45 -0
- package/docs/zh-CN/providers/qwen.md +55 -0
- package/docs/zh-CN/providers/sglang.md +111 -0
- package/docs/zh-CN/providers/synthetic.md +106 -0
- package/docs/zh-CN/providers/together.md +72 -0
- package/docs/zh-CN/providers/venice.md +289 -0
- package/docs/zh-CN/providers/vercel-ai-gateway.md +66 -0
- package/docs/zh-CN/providers/xiaomi.md +93 -0
- package/docs/zh-CN/providers/zai.md +53 -0
- package/docs/zh-CN/reference/AGENTS.default.md +131 -0
- package/docs/zh-CN/reference/RELEASING.md +48 -0
- package/docs/zh-CN/reference/api-usage-costs.md +141 -0
- package/docs/zh-CN/reference/credits.md +34 -0
- package/docs/zh-CN/reference/device-models.md +54 -0
- package/docs/zh-CN/reference/rpc.md +48 -0
- package/docs/zh-CN/reference/session-management-compaction.md +287 -0
- package/docs/zh-CN/reference/templates/AGENTS.dev.md +89 -0
- package/docs/zh-CN/reference/templates/AGENTS.md +225 -0
- package/docs/zh-CN/reference/templates/BOOT.md +17 -0
- package/docs/zh-CN/reference/templates/BOOTSTRAP.md +68 -0
- package/docs/zh-CN/reference/templates/HEARTBEAT.md +18 -0
- package/docs/zh-CN/reference/templates/IDENTITY.dev.md +54 -0
- package/docs/zh-CN/reference/templates/IDENTITY.md +36 -0
- package/docs/zh-CN/reference/templates/SOUL.dev.md +83 -0
- package/docs/zh-CN/reference/templates/SOUL.md +49 -0
- package/docs/zh-CN/reference/templates/TOOLS.dev.md +31 -0
- package/docs/zh-CN/reference/templates/TOOLS.md +53 -0
- package/docs/zh-CN/reference/templates/USER.dev.md +25 -0
- package/docs/zh-CN/reference/templates/USER.md +30 -0
- package/docs/zh-CN/reference/test.md +57 -0
- package/docs/zh-CN/reference/token-use.md +119 -0
- package/docs/zh-CN/reference/transcript-hygiene.md +109 -0
- package/docs/zh-CN/reference/wizard.md +242 -0
- package/docs/zh-CN/security/formal-verification.md +171 -0
- package/docs/zh-CN/start/bootstrapping.md +9 -0
- package/docs/zh-CN/start/docs-directory.md +70 -0
- package/docs/zh-CN/start/getting-started.md +143 -0
- package/docs/zh-CN/start/hubs.md +194 -0
- package/docs/zh-CN/start/lore.md +226 -0
- package/docs/zh-CN/start/onboarding-overview.md +58 -0
- package/docs/zh-CN/start/onboarding.md +105 -0
- package/docs/zh-CN/start/openclaw.md +248 -0
- package/docs/zh-CN/start/quickstart.md +88 -0
- package/docs/zh-CN/start/setup.md +153 -0
- package/docs/zh-CN/start/showcase.md +423 -0
- package/docs/zh-CN/start/wizard-cli-automation.md +222 -0
- package/docs/zh-CN/start/wizard-cli-reference.md +306 -0
- package/docs/zh-CN/start/wizard.md +132 -0
- package/docs/zh-CN/tools/agent-send.md +59 -0
- package/docs/zh-CN/tools/apply-patch.md +57 -0
- package/docs/zh-CN/tools/browser-linux-troubleshooting.md +144 -0
- package/docs/zh-CN/tools/browser-login.md +75 -0
- package/docs/zh-CN/tools/browser.md +553 -0
- package/docs/zh-CN/tools/chrome-extension.md +183 -0
- package/docs/zh-CN/tools/clawhub.md +209 -0
- package/docs/zh-CN/tools/creating-skills.md +61 -0
- package/docs/zh-CN/tools/elevated.md +64 -0
- package/docs/zh-CN/tools/exec-approvals.md +234 -0
- package/docs/zh-CN/tools/exec.md +169 -0
- package/docs/zh-CN/tools/firecrawl.md +68 -0
- package/docs/zh-CN/tools/index.md +515 -0
- package/docs/zh-CN/tools/llm-task.md +117 -0
- package/docs/zh-CN/tools/lobster.md +349 -0
- package/docs/zh-CN/tools/multi-agent-sandbox-tools.md +401 -0
- package/docs/zh-CN/tools/plugin.md +1612 -0
- package/docs/zh-CN/tools/reactions.md +29 -0
- package/docs/zh-CN/tools/skills-config.md +78 -0
- package/docs/zh-CN/tools/skills.md +279 -0
- package/docs/zh-CN/tools/slash-commands.md +205 -0
- package/docs/zh-CN/tools/subagents.md +167 -0
- package/docs/zh-CN/tools/thinking.md +80 -0
- package/docs/zh-CN/tools/web.md +289 -0
- package/docs/zh-CN/tts.md +375 -0
- package/docs/zh-CN/vps.md +47 -0
- package/docs/zh-CN/web/control-ui.md +191 -0
- package/docs/zh-CN/web/dashboard.md +53 -0
- package/docs/zh-CN/web/index.md +118 -0
- package/docs/zh-CN/web/tui.md +166 -0
- package/docs/zh-CN/web/webchat.md +56 -0
- package/package.json +841 -0
- package/quantumclaw.mjs +135 -0
- package/skills/1password/SKILL.md +70 -0
- package/skills/1password/references/cli-examples.md +29 -0
- package/skills/1password/references/get-started.md +17 -0
- package/skills/apple-notes/SKILL.md +77 -0
- package/skills/apple-reminders/SKILL.md +118 -0
- package/skills/bear-notes/SKILL.md +107 -0
- package/skills/blogwatcher/SKILL.md +69 -0
- package/skills/blucli/SKILL.md +47 -0
- package/skills/bluebubbles/SKILL.md +131 -0
- package/skills/camsnap/SKILL.md +45 -0
- package/skills/canvas/SKILL.md +198 -0
- package/skills/clawhub/SKILL.md +77 -0
- package/skills/coding-agent/SKILL.md +295 -0
- package/skills/discord/SKILL.md +197 -0
- package/skills/eightctl/SKILL.md +50 -0
- package/skills/gemini/SKILL.md +43 -0
- package/skills/gh-issues/SKILL.md +865 -0
- package/skills/gifgrep/SKILL.md +79 -0
- package/skills/github/SKILL.md +163 -0
- package/skills/gog/SKILL.md +116 -0
- package/skills/goplaces/SKILL.md +52 -0
- package/skills/healthcheck/SKILL.md +245 -0
- package/skills/himalaya/SKILL.md +257 -0
- package/skills/himalaya/references/configuration.md +184 -0
- package/skills/himalaya/references/message-composition.md +199 -0
- package/skills/imsg/SKILL.md +122 -0
- package/skills/mcporter/SKILL.md +61 -0
- package/skills/model-usage/SKILL.md +69 -0
- package/skills/model-usage/references/codexbar-cli.md +33 -0
- package/skills/model-usage/scripts/model_usage.py +320 -0
- package/skills/model-usage/scripts/test_model_usage.py +40 -0
- package/skills/nano-pdf/SKILL.md +38 -0
- package/skills/node-connect/SKILL.md +142 -0
- package/skills/notion/SKILL.md +174 -0
- package/skills/obsidian/SKILL.md +81 -0
- package/skills/openai-image-gen/SKILL.md +92 -0
- package/skills/openai-image-gen/scripts/gen.py +328 -0
- package/skills/openai-image-gen/scripts/test_gen.py +140 -0
- package/skills/openai-whisper/SKILL.md +38 -0
- package/skills/openai-whisper-api/SKILL.md +52 -0
- package/skills/openai-whisper-api/scripts/transcribe.sh +85 -0
- package/skills/openhue/SKILL.md +112 -0
- package/skills/oracle/SKILL.md +125 -0
- package/skills/ordercli/SKILL.md +78 -0
- package/skills/peekaboo/SKILL.md +190 -0
- package/skills/sag/SKILL.md +87 -0
- package/skills/session-logs/SKILL.md +115 -0
- package/skills/sherpa-onnx-tts/SKILL.md +103 -0
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +178 -0
- package/skills/skill-creator/SKILL.md +372 -0
- package/skills/skill-creator/license.txt +202 -0
- package/skills/skill-creator/scripts/init_skill.py +378 -0
- package/skills/skill-creator/scripts/package_skill.py +139 -0
- package/skills/skill-creator/scripts/quick_validate.py +159 -0
- package/skills/skill-creator/scripts/test_package_skill.py +160 -0
- package/skills/skill-creator/scripts/test_quick_validate.py +72 -0
- package/skills/slack/SKILL.md +144 -0
- package/skills/songsee/SKILL.md +49 -0
- package/skills/sonoscli/SKILL.md +65 -0
- package/skills/spotify-player/SKILL.md +64 -0
- package/skills/summarize/SKILL.md +87 -0
- package/skills/things-mac/SKILL.md +86 -0
- package/skills/tmux/SKILL.md +153 -0
- package/skills/tmux/scripts/find-sessions.sh +112 -0
- package/skills/tmux/scripts/wait-for-text.sh +83 -0
- package/skills/trello/SKILL.md +95 -0
- package/skills/video-frames/SKILL.md +46 -0
- package/skills/video-frames/scripts/frame.sh +81 -0
- package/skills/voice-call/SKILL.md +45 -0
- package/skills/wacli/SKILL.md +72 -0
- package/skills/weather/SKILL.md +112 -0
- package/skills/xurl/SKILL.md +461 -0
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Plugin SDK Setup"
|
|
3
|
+
sidebarTitle: "Setup and Config"
|
|
4
|
+
summary: "Setup wizards, setup-entry.ts, config schemas, and package.json metadata"
|
|
5
|
+
read_when:
|
|
6
|
+
- You are adding a setup wizard to a plugin
|
|
7
|
+
- You need to understand setup-entry.ts vs index.ts
|
|
8
|
+
- You are defining plugin config schemas or package.json quantumclaw metadata
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Plugin Setup and Config
|
|
12
|
+
|
|
13
|
+
Reference for plugin packaging (`package.json` metadata), manifests
|
|
14
|
+
(`quantumclaw.plugin.json`), setup entries, and config schemas.
|
|
15
|
+
|
|
16
|
+
<Tip>
|
|
17
|
+
**Looking for a walkthrough?** The how-to guides cover packaging in context:
|
|
18
|
+
[Channel Plugins](/plugins/sdk-channel-plugins#step-1-package-and-manifest) and
|
|
19
|
+
[Provider Plugins](/plugins/sdk-provider-plugins#step-1-package-and-manifest).
|
|
20
|
+
</Tip>
|
|
21
|
+
|
|
22
|
+
## Package metadata
|
|
23
|
+
|
|
24
|
+
Your `package.json` needs an `quantumclaw` field that tells the plugin system what
|
|
25
|
+
your plugin provides:
|
|
26
|
+
|
|
27
|
+
**Channel plugin:**
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"name": "@myorg/quantumclaw-my-channel",
|
|
32
|
+
"version": "1.0.0",
|
|
33
|
+
"type": "module",
|
|
34
|
+
"quantumclaw": {
|
|
35
|
+
"extensions": ["./index.ts"],
|
|
36
|
+
"setupEntry": "./setup-entry.ts",
|
|
37
|
+
"channel": {
|
|
38
|
+
"id": "my-channel",
|
|
39
|
+
"label": "My Channel",
|
|
40
|
+
"blurb": "Short description of the channel."
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Provider plugin:**
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"name": "@myorg/quantumclaw-my-provider",
|
|
51
|
+
"version": "1.0.0",
|
|
52
|
+
"type": "module",
|
|
53
|
+
"quantumclaw": {
|
|
54
|
+
"extensions": ["./index.ts"],
|
|
55
|
+
"providers": ["my-provider"]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### `quantumclaw` fields
|
|
61
|
+
|
|
62
|
+
| Field | Type | Description |
|
|
63
|
+
| ------------ | ---------- | ------------------------------------------------------------------------------------------ |
|
|
64
|
+
| `extensions` | `string[]` | Entry point files (relative to package root) |
|
|
65
|
+
| `setupEntry` | `string` | Lightweight setup-only entry (optional) |
|
|
66
|
+
| `channel` | `object` | Channel metadata: `id`, `label`, `blurb`, `selectionLabel`, `docsPath`, `order`, `aliases` |
|
|
67
|
+
| `providers` | `string[]` | Provider ids registered by this plugin |
|
|
68
|
+
| `install` | `object` | Install hints: `npmSpec`, `localPath`, `defaultChoice` |
|
|
69
|
+
| `startup` | `object` | Startup behavior flags |
|
|
70
|
+
|
|
71
|
+
### Deferred full load
|
|
72
|
+
|
|
73
|
+
Channel plugins can opt into deferred loading with:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"quantumclaw": {
|
|
78
|
+
"extensions": ["./index.ts"],
|
|
79
|
+
"setupEntry": "./setup-entry.ts",
|
|
80
|
+
"startup": {
|
|
81
|
+
"deferConfiguredChannelFullLoadUntilAfterListen": true
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
When enabled, QuantumClaw loads only `setupEntry` during the pre-listen startup
|
|
88
|
+
phase, even for already-configured channels. The full entry loads after the
|
|
89
|
+
gateway starts listening.
|
|
90
|
+
|
|
91
|
+
<Warning>
|
|
92
|
+
Only enable deferred loading when your `setupEntry` registers everything the
|
|
93
|
+
gateway needs before it starts listening (channel registration, HTTP routes,
|
|
94
|
+
gateway methods). If the full entry owns required startup capabilities, keep
|
|
95
|
+
the default behavior.
|
|
96
|
+
</Warning>
|
|
97
|
+
|
|
98
|
+
## Plugin manifest
|
|
99
|
+
|
|
100
|
+
Every native plugin must ship an `quantumclaw.plugin.json` in the package root.
|
|
101
|
+
QuantumClaw uses this to validate config without executing plugin code.
|
|
102
|
+
|
|
103
|
+
```json
|
|
104
|
+
{
|
|
105
|
+
"id": "my-plugin",
|
|
106
|
+
"name": "My Plugin",
|
|
107
|
+
"description": "Adds My Plugin capabilities to QuantumClaw",
|
|
108
|
+
"configSchema": {
|
|
109
|
+
"type": "object",
|
|
110
|
+
"additionalProperties": false,
|
|
111
|
+
"properties": {
|
|
112
|
+
"webhookSecret": {
|
|
113
|
+
"type": "string",
|
|
114
|
+
"description": "Webhook verification secret"
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
For channel plugins, add `kind` and `channels`:
|
|
122
|
+
|
|
123
|
+
```json
|
|
124
|
+
{
|
|
125
|
+
"id": "my-channel",
|
|
126
|
+
"kind": "channel",
|
|
127
|
+
"channels": ["my-channel"],
|
|
128
|
+
"configSchema": {
|
|
129
|
+
"type": "object",
|
|
130
|
+
"additionalProperties": false,
|
|
131
|
+
"properties": {}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Even plugins with no config must ship a schema. An empty schema is valid:
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"id": "my-plugin",
|
|
141
|
+
"configSchema": {
|
|
142
|
+
"type": "object",
|
|
143
|
+
"additionalProperties": false
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
See [Plugin Manifest](/plugins/manifest) for the full schema reference.
|
|
149
|
+
|
|
150
|
+
## Setup entry
|
|
151
|
+
|
|
152
|
+
The `setup-entry.ts` file is a lightweight alternative to `index.ts` that
|
|
153
|
+
QuantumClaw loads when it only needs setup surfaces (onboarding, config repair,
|
|
154
|
+
disabled channel inspection).
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
// setup-entry.ts
|
|
158
|
+
import { defineSetupPluginEntry } from "quantumclaw/plugin-sdk/core";
|
|
159
|
+
import { myChannelPlugin } from "./src/channel.js";
|
|
160
|
+
|
|
161
|
+
export default defineSetupPluginEntry(myChannelPlugin);
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
This avoids loading heavy runtime code (crypto libraries, CLI registrations,
|
|
165
|
+
background services) during setup flows.
|
|
166
|
+
|
|
167
|
+
**When QuantumClaw uses `setupEntry` instead of the full entry:**
|
|
168
|
+
|
|
169
|
+
- The channel is disabled but needs setup/onboarding surfaces
|
|
170
|
+
- The channel is enabled but unconfigured
|
|
171
|
+
- Deferred loading is enabled (`deferConfiguredChannelFullLoadUntilAfterListen`)
|
|
172
|
+
|
|
173
|
+
**What `setupEntry` must register:**
|
|
174
|
+
|
|
175
|
+
- The channel plugin object (via `defineSetupPluginEntry`)
|
|
176
|
+
- Any HTTP routes required before gateway listen
|
|
177
|
+
- Any gateway methods needed during startup
|
|
178
|
+
|
|
179
|
+
**What `setupEntry` should NOT include:**
|
|
180
|
+
|
|
181
|
+
- CLI registrations
|
|
182
|
+
- Background services
|
|
183
|
+
- Heavy runtime imports (crypto, SDKs)
|
|
184
|
+
- Gateway methods only needed after startup
|
|
185
|
+
|
|
186
|
+
## Config schema
|
|
187
|
+
|
|
188
|
+
Plugin config is validated against the JSON Schema in your manifest. Users
|
|
189
|
+
configure plugins via:
|
|
190
|
+
|
|
191
|
+
```json5
|
|
192
|
+
{
|
|
193
|
+
plugins: {
|
|
194
|
+
entries: {
|
|
195
|
+
"my-plugin": {
|
|
196
|
+
config: {
|
|
197
|
+
webhookSecret: "abc123",
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Your plugin receives this config as `api.pluginConfig` during registration.
|
|
206
|
+
|
|
207
|
+
For channel-specific config, use the channel config section instead:
|
|
208
|
+
|
|
209
|
+
```json5
|
|
210
|
+
{
|
|
211
|
+
channels: {
|
|
212
|
+
"my-channel": {
|
|
213
|
+
token: "bot-token",
|
|
214
|
+
allowFrom: ["user1", "user2"],
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Building channel config schemas
|
|
221
|
+
|
|
222
|
+
Use `buildChannelConfigSchema` from `quantumclaw/plugin-sdk/core` to convert a
|
|
223
|
+
Zod schema into the `ChannelConfigSchema` wrapper that QuantumClaw validates:
|
|
224
|
+
|
|
225
|
+
```typescript
|
|
226
|
+
import { z } from "zod";
|
|
227
|
+
import { buildChannelConfigSchema } from "quantumclaw/plugin-sdk/core";
|
|
228
|
+
|
|
229
|
+
const accountSchema = z.object({
|
|
230
|
+
token: z.string().optional(),
|
|
231
|
+
allowFrom: z.array(z.string()).optional(),
|
|
232
|
+
accounts: z.object({}).catchall(z.any()).optional(),
|
|
233
|
+
defaultAccount: z.string().optional(),
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
const configSchema = buildChannelConfigSchema(accountSchema);
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Setup wizards
|
|
240
|
+
|
|
241
|
+
Channel plugins can provide interactive setup wizards for `quantumclaw onboard`.
|
|
242
|
+
The wizard is a `ChannelSetupWizard` object on the `ChannelPlugin`:
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
import type { ChannelSetupWizard } from "quantumclaw/plugin-sdk/channel-setup";
|
|
246
|
+
|
|
247
|
+
const setupWizard: ChannelSetupWizard = {
|
|
248
|
+
channel: "my-channel",
|
|
249
|
+
status: {
|
|
250
|
+
configuredLabel: "Connected",
|
|
251
|
+
unconfiguredLabel: "Not configured",
|
|
252
|
+
resolveConfigured: ({ cfg }) => Boolean((cfg.channels as any)?.["my-channel"]?.token),
|
|
253
|
+
},
|
|
254
|
+
credentials: [
|
|
255
|
+
{
|
|
256
|
+
inputKey: "token",
|
|
257
|
+
providerHint: "my-channel",
|
|
258
|
+
credentialLabel: "Bot token",
|
|
259
|
+
preferredEnvVar: "MY_CHANNEL_BOT_TOKEN",
|
|
260
|
+
envPrompt: "Use MY_CHANNEL_BOT_TOKEN from environment?",
|
|
261
|
+
keepPrompt: "Keep current token?",
|
|
262
|
+
inputPrompt: "Enter your bot token:",
|
|
263
|
+
inspect: ({ cfg, accountId }) => {
|
|
264
|
+
const token = (cfg.channels as any)?.["my-channel"]?.token;
|
|
265
|
+
return {
|
|
266
|
+
accountConfigured: Boolean(token),
|
|
267
|
+
hasConfiguredValue: Boolean(token),
|
|
268
|
+
};
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
],
|
|
272
|
+
};
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
The `ChannelSetupWizard` type supports `credentials`, `textInputs`,
|
|
276
|
+
`dmPolicy`, `allowFrom`, `groupAccess`, `prepare`, `finalize`, and more.
|
|
277
|
+
See bundled plugins (e.g. `extensions/discord/src/channel.setup.ts`) for
|
|
278
|
+
full examples.
|
|
279
|
+
|
|
280
|
+
For optional setup surfaces that should only appear in certain contexts, use
|
|
281
|
+
`createOptionalChannelSetupSurface` from `quantumclaw/plugin-sdk/channel-setup`:
|
|
282
|
+
|
|
283
|
+
```typescript
|
|
284
|
+
import { createOptionalChannelSetupSurface } from "quantumclaw/plugin-sdk/channel-setup";
|
|
285
|
+
|
|
286
|
+
const setupSurface = createOptionalChannelSetupSurface({
|
|
287
|
+
channel: "my-channel",
|
|
288
|
+
label: "My Channel",
|
|
289
|
+
npmSpec: "@myorg/quantumclaw-my-channel",
|
|
290
|
+
docsPath: "/channels/my-channel",
|
|
291
|
+
});
|
|
292
|
+
// Returns { setupAdapter, setupWizard }
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Publishing and installing
|
|
296
|
+
|
|
297
|
+
**External plugins:** publish to [ClawHub](/tools/clawhub) or npm, then install:
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
quantumclaw plugins install @myorg/quantumclaw-my-plugin
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
QuantumClaw tries ClawHub first and falls back to npm automatically. You can also
|
|
304
|
+
force a specific source:
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
quantumclaw plugins install clawhub:@myorg/quantumclaw-my-plugin # ClawHub only
|
|
308
|
+
quantumclaw plugins install npm:@myorg/quantumclaw-my-plugin # npm only
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
**In-repo plugins:** place under `extensions/` and they are automatically
|
|
312
|
+
discovered during build.
|
|
313
|
+
|
|
314
|
+
**Users can browse and install:**
|
|
315
|
+
|
|
316
|
+
```bash
|
|
317
|
+
quantumclaw plugins search <query>
|
|
318
|
+
quantumclaw plugins install <package-name>
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
<Info>
|
|
322
|
+
For npm-sourced installs, `quantumclaw plugins install` runs
|
|
323
|
+
`npm install --ignore-scripts` (no lifecycle scripts). Keep plugin dependency
|
|
324
|
+
trees pure JS/TS and avoid packages that require `postinstall` builds.
|
|
325
|
+
</Info>
|
|
326
|
+
|
|
327
|
+
## Related
|
|
328
|
+
|
|
329
|
+
- [SDK Entry Points](/plugins/sdk-entrypoints) -- `definePluginEntry` and `defineChannelPluginEntry`
|
|
330
|
+
- [Plugin Manifest](/plugins/manifest) -- full manifest schema reference
|
|
331
|
+
- [Building Plugins](/plugins/building-plugins) -- step-by-step getting started guide
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "SDK Testing"
|
|
3
|
+
sidebarTitle: "Testing"
|
|
4
|
+
summary: "Testing utilities and patterns for QuantumClaw plugins"
|
|
5
|
+
read_when:
|
|
6
|
+
- You are writing tests for a plugin
|
|
7
|
+
- You need test utilities from the plugin SDK
|
|
8
|
+
- You want to understand contract tests for bundled plugins
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Plugin Testing
|
|
12
|
+
|
|
13
|
+
Reference for test utilities, patterns, and lint enforcement for QuantumClaw
|
|
14
|
+
plugins.
|
|
15
|
+
|
|
16
|
+
<Tip>
|
|
17
|
+
**Looking for test examples?** The how-to guides include worked test examples:
|
|
18
|
+
[Channel plugin tests](/plugins/sdk-channel-plugins#step-6-test) and
|
|
19
|
+
[Provider plugin tests](/plugins/sdk-provider-plugins#step-6-test).
|
|
20
|
+
</Tip>
|
|
21
|
+
|
|
22
|
+
## Test utilities
|
|
23
|
+
|
|
24
|
+
**Import:** `quantumclaw/plugin-sdk/testing`
|
|
25
|
+
|
|
26
|
+
The testing subpath exports a narrow set of helpers for plugin authors:
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import {
|
|
30
|
+
installCommonResolveTargetErrorCases,
|
|
31
|
+
shouldAckReaction,
|
|
32
|
+
removeAckReactionAfterReply,
|
|
33
|
+
} from "quantumclaw/plugin-sdk/testing";
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Available exports
|
|
37
|
+
|
|
38
|
+
| Export | Purpose |
|
|
39
|
+
| -------------------------------------- | ------------------------------------------------------ |
|
|
40
|
+
| `installCommonResolveTargetErrorCases` | Shared test cases for target resolution error handling |
|
|
41
|
+
| `shouldAckReaction` | Check whether a channel should add an ack reaction |
|
|
42
|
+
| `removeAckReactionAfterReply` | Remove ack reaction after reply delivery |
|
|
43
|
+
|
|
44
|
+
### Types
|
|
45
|
+
|
|
46
|
+
The testing subpath also re-exports types useful in test files:
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
import type {
|
|
50
|
+
ChannelAccountSnapshot,
|
|
51
|
+
ChannelGatewayContext,
|
|
52
|
+
QuantumClawConfig,
|
|
53
|
+
PluginRuntime,
|
|
54
|
+
RuntimeEnv,
|
|
55
|
+
MockFn,
|
|
56
|
+
} from "quantumclaw/plugin-sdk/testing";
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Testing target resolution
|
|
60
|
+
|
|
61
|
+
Use `installCommonResolveTargetErrorCases` to add standard error cases for
|
|
62
|
+
channel target resolution:
|
|
63
|
+
|
|
64
|
+
```typescript
|
|
65
|
+
import { describe } from "vitest";
|
|
66
|
+
import { installCommonResolveTargetErrorCases } from "quantumclaw/plugin-sdk/testing";
|
|
67
|
+
|
|
68
|
+
describe("my-channel target resolution", () => {
|
|
69
|
+
installCommonResolveTargetErrorCases({
|
|
70
|
+
resolveTarget: ({ to, mode, allowFrom }) => {
|
|
71
|
+
// Your channel's target resolution logic
|
|
72
|
+
return myChannelResolveTarget({ to, mode, allowFrom });
|
|
73
|
+
},
|
|
74
|
+
implicitAllowFrom: ["user1", "user2"],
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
// Add channel-specific test cases
|
|
78
|
+
it("should resolve @username targets", () => {
|
|
79
|
+
// ...
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Testing patterns
|
|
85
|
+
|
|
86
|
+
### Unit testing a channel plugin
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
import { describe, it, expect, vi } from "vitest";
|
|
90
|
+
|
|
91
|
+
describe("my-channel plugin", () => {
|
|
92
|
+
it("should resolve account from config", () => {
|
|
93
|
+
const cfg = {
|
|
94
|
+
channels: {
|
|
95
|
+
"my-channel": {
|
|
96
|
+
token: "test-token",
|
|
97
|
+
allowFrom: ["user1"],
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const account = myPlugin.setup.resolveAccount(cfg, undefined);
|
|
103
|
+
expect(account.token).toBe("test-token");
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("should inspect account without materializing secrets", () => {
|
|
107
|
+
const cfg = {
|
|
108
|
+
channels: {
|
|
109
|
+
"my-channel": { token: "test-token" },
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const inspection = myPlugin.setup.inspectAccount(cfg, undefined);
|
|
114
|
+
expect(inspection.configured).toBe(true);
|
|
115
|
+
expect(inspection.tokenStatus).toBe("available");
|
|
116
|
+
// No token value exposed
|
|
117
|
+
expect(inspection).not.toHaveProperty("token");
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Unit testing a provider plugin
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
import { describe, it, expect } from "vitest";
|
|
126
|
+
|
|
127
|
+
describe("my-provider plugin", () => {
|
|
128
|
+
it("should resolve dynamic models", () => {
|
|
129
|
+
const model = myProvider.resolveDynamicModel({
|
|
130
|
+
modelId: "custom-model-v2",
|
|
131
|
+
// ... context
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
expect(model.id).toBe("custom-model-v2");
|
|
135
|
+
expect(model.provider).toBe("my-provider");
|
|
136
|
+
expect(model.api).toBe("openai-completions");
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("should return catalog when API key is available", async () => {
|
|
140
|
+
const result = await myProvider.catalog.run({
|
|
141
|
+
resolveProviderApiKey: () => ({ apiKey: "test-key" }),
|
|
142
|
+
// ... context
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
expect(result?.provider?.models).toHaveLength(2);
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Mocking the plugin runtime
|
|
151
|
+
|
|
152
|
+
For code that uses `createPluginRuntimeStore`, mock the runtime in tests:
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
import { createPluginRuntimeStore } from "quantumclaw/plugin-sdk/runtime-store";
|
|
156
|
+
import type { PluginRuntime } from "quantumclaw/plugin-sdk/runtime-store";
|
|
157
|
+
|
|
158
|
+
const store = createPluginRuntimeStore<PluginRuntime>("test runtime not set");
|
|
159
|
+
|
|
160
|
+
// In test setup
|
|
161
|
+
const mockRuntime = {
|
|
162
|
+
agent: {
|
|
163
|
+
resolveAgentDir: vi.fn().mockReturnValue("/tmp/agent"),
|
|
164
|
+
// ... other mocks
|
|
165
|
+
},
|
|
166
|
+
config: {
|
|
167
|
+
loadConfig: vi.fn(),
|
|
168
|
+
writeConfigFile: vi.fn(),
|
|
169
|
+
},
|
|
170
|
+
// ... other namespaces
|
|
171
|
+
} as unknown as PluginRuntime;
|
|
172
|
+
|
|
173
|
+
store.setRuntime(mockRuntime);
|
|
174
|
+
|
|
175
|
+
// After tests
|
|
176
|
+
store.clearRuntime();
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Testing with per-instance stubs
|
|
180
|
+
|
|
181
|
+
Prefer per-instance stubs over prototype mutation:
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
// Preferred: per-instance stub
|
|
185
|
+
const client = new MyChannelClient();
|
|
186
|
+
client.sendMessage = vi.fn().mockResolvedValue({ id: "msg-1" });
|
|
187
|
+
|
|
188
|
+
// Avoid: prototype mutation
|
|
189
|
+
// MyChannelClient.prototype.sendMessage = vi.fn();
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Contract tests (in-repo plugins)
|
|
193
|
+
|
|
194
|
+
Bundled plugins have contract tests that verify registration ownership:
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
pnpm test -- src/plugins/contracts/
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
These tests assert:
|
|
201
|
+
|
|
202
|
+
- Which plugins register which providers
|
|
203
|
+
- Which plugins register which speech providers
|
|
204
|
+
- Registration shape correctness
|
|
205
|
+
- Runtime contract compliance
|
|
206
|
+
|
|
207
|
+
### Running scoped tests
|
|
208
|
+
|
|
209
|
+
For a specific plugin:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
pnpm test -- extensions/my-channel/
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
For contract tests only:
|
|
216
|
+
|
|
217
|
+
```bash
|
|
218
|
+
pnpm test -- src/plugins/contracts/shape.contract.test.ts
|
|
219
|
+
pnpm test -- src/plugins/contracts/auth.contract.test.ts
|
|
220
|
+
pnpm test -- src/plugins/contracts/runtime.contract.test.ts
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
## Lint enforcement (in-repo plugins)
|
|
224
|
+
|
|
225
|
+
Three rules are enforced by `pnpm check` for in-repo plugins:
|
|
226
|
+
|
|
227
|
+
1. **No monolithic root imports** -- `quantumclaw/plugin-sdk` root barrel is rejected
|
|
228
|
+
2. **No direct `src/` imports** -- plugins cannot import `../../src/` directly
|
|
229
|
+
3. **No self-imports** -- plugins cannot import their own `plugin-sdk/<name>` subpath
|
|
230
|
+
|
|
231
|
+
External plugins are not subject to these lint rules, but following the same
|
|
232
|
+
patterns is recommended.
|
|
233
|
+
|
|
234
|
+
## Test configuration
|
|
235
|
+
|
|
236
|
+
QuantumClaw uses Vitest with V8 coverage thresholds. For plugin tests:
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
# Run all tests
|
|
240
|
+
pnpm test
|
|
241
|
+
|
|
242
|
+
# Run specific plugin tests
|
|
243
|
+
pnpm test -- extensions/my-channel/src/channel.test.ts
|
|
244
|
+
|
|
245
|
+
# Run with a specific test name filter
|
|
246
|
+
pnpm test -- extensions/my-channel/ -t "resolves account"
|
|
247
|
+
|
|
248
|
+
# Run with coverage
|
|
249
|
+
pnpm test:coverage
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
If local runs cause memory pressure:
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
QUANTUMCLAW_TEST_PROFILE=low QUANTUMCLAW_TEST_SERIAL_GATEWAY=1 pnpm test
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Related
|
|
259
|
+
|
|
260
|
+
- [SDK Overview](/plugins/sdk-overview) -- import conventions
|
|
261
|
+
- [SDK Channel Plugins](/plugins/sdk-channel-plugins) -- channel plugin interface
|
|
262
|
+
- [SDK Provider Plugins](/plugins/sdk-provider-plugins) -- provider plugin hooks
|
|
263
|
+
- [Building Plugins](/plugins/building-plugins) -- getting started guide
|