Modular knowledge-work plugins for OpenClaw with dynamic service discovery.
The system consists of a router plugin that discovers available services in your environment, and pack plugins that provide role-specific skills (sales, recruiting, marketing, etc.).
- Clone and install:
git clone <repo-url>
cd clawdi-plugins
pnpm install- Deploy to your OpenClaw extensions directory:
./scripts/deploy.sh /data/openclaw/extensionsThis builds all packages, copies them with correct plugin ID directory names, and installs runtime dependencies.
- Enable in your
openclaw.json:
{
"plugins": {
"knowledge-work-router": { "enabled": true },
"pack-sales": { "enabled": true },
"pack-productivity": { "enabled": true }
}
}- Restart the agent and run
/connect_appsto discover and connect services.
| Pack | Skills | What It Does |
|---|---|---|
| sales | 8 | Meeting prep, CRM updates, follow-ups, research |
| productivity | 4 | Calendar management, task tracking, email triage |
| recruiting | 4 | Pipeline management, interview prep, offers |
| marketing | 8 | Campaign planning, SEO, content, analytics |
| operations | 9 | Process management, reporting, documentation |
| customer-support | 5 | Ticket triage, knowledge base, escalation |
| engineering | 6 | Sprint planning, code review prep, incident response |
| enterprise-search | 4 | Cross-system search, knowledge retrieval |
| human-resources | 7 | Reviews, comp analysis, onboarding, policy |
| product-management | 8 | Roadmap, specs, user research, metrics |
Total: 63 skills across 10 packs
Run /connect_apps to see what services are available in your environment:
/connect_apps
The router dynamically discovers services from:
- Composio — SaaS integrations (Google Workspace, HubSpot, Slack, etc.)
- Built-in OpenClaw tools — Native tools (web_search, read_file, etc.)
- Lobster workflows — Multi-step orchestrated flows
- CLI tools — Local binaries (pandoc, jq, etc.)
- MCP servers — Any configured MCP server tools
No hardcoded service list — the router adapts to whatever you have connected.
In openclaw.json (plugin IDs are unscoped — no @clawdi-ai/ prefix):
{
"plugins": {
"knowledge-work-router": { "enabled": true },
"pack-sales": { "enabled": true },
"pack-recruiting": { "enabled": false }
}
}{
"plugins": {
"knowledge-work-router": {
"enabled": true,
"config": {
"adapterOrder": ["composio", "openclaw_tool", "lobster", "cli", "mcporter"],
"disabledAdapters": [],
"sideEffectPolicy": "confirm_destructive",
"cacheTtl": 600000,
"capabilityPins": {
"seo.*": "mcporter"
},
"cliMappings": {
"docs.convert_*": "pandoc",
"data.query_*": "jq"
}
}
}
}
}| Field | Description | Default |
|---|---|---|
adapterOrder |
Fallback order for adapter probing | All 5 in order |
disabledAdapters |
Adapters to skip entirely | [] |
sideEffectPolicy |
always_confirm, confirm_destructive, never_confirm |
confirm_destructive |
cacheTtl |
Discovery cache TTL in ms | 600000 (10 min) |
capabilityPins |
Pin capabilities to specific adapters | {} |
cliMappings |
Map capability patterns to CLI binaries | {} |
/check_setup
Shows the status of all capabilities across all installed packs, which adapter resolves each one, and which adapters are enabled.
Pack Skill → capability_execute tool
↓
Router.resolve()
↓
DiscoveryEngine.resolve()
↓
Probe adapters in fallback order:
Composio → OpenClaw Tool → Lobster → CLI → MCPorter
↓
Cache result, execute via adapter
The DiscoveryEngine probes each adapter asking "can you handle this capability?" Adapters search their runtime (Composio's search API, MCP server tool lists, built-in tool names, Lobster workflow registry, PATH binaries) and return a probe result or null.
The router also supports filesystem-based pack discovery — if the plugin API registry is unavailable, it scans /data/openclaw/extensions/pack-* for pack directories.
- Create directory:
packages/pack-yourpack/ - Add
pack-manifest.yaml:
packId: yourpack
displayName: "Your Pack"
capabilities:
required:
- calendar.read_events
optional:
- docs.create_brief
preferredApps:
calendar.*:
- google_workspace
onboarding:
welcomeMessage: "Your pack is ready."
suggestedFirstTask: "Try: 'do something cool'"- Add skills in
skills/your-skill/SKILL.md - Add
openclaw.plugin.json(use unscoped ID):
{
"id": "pack-yourpack",
"name": "Your Pack",
"description": "Description of your pack",
"version": "0.1.0",
"skills": ["./skills"]
}- Add
src/index.tsto register slash commands. Command handlers return{ text: "..." }:
export function register(api: any) {
api.registerCommand({
name: "your_command",
description: "Does something useful",
handler: async () => {
return { text: "Command output here" };
},
});
}- Add
tsconfig.json:
{
"extends": "../../tsconfig.base.json",
"compilerOptions": { "outDir": "dist", "rootDir": "src" },
"include": ["src"],
"exclude": ["src/__tests__"]
}- Run
./scripts/deploy.shto deploy all plugins, or manually copy the built pack to/data/openclaw/extensions/pack-yourpackand runnpm install --omit=dev --ignore-scripts --legacy-peer-depsif it has runtime dependencies. Enable inopenclaw.json.
All fields for pack-manifest.yaml:
| Field | Type | Required | Description |
|---|---|---|---|
packId |
string | yes | Unique pack identifier |
displayName |
string | yes | Human-readable name |
capabilities.required |
string[] | yes | Capabilities the pack needs to function (keep minimal — only free/universally available) |
capabilities.optional |
string[] | yes | Capabilities that enhance the pack (paid integrations go here) |
preferredApps |
Record<pattern, string[]> | no | Preferred app/toolkit per capability pattern |
fallbackOverrides |
Record<pattern, {adapters}> | no | Override adapter order for specific capabilities |
preferences |
Record<string, PackPreference> | no | User-configurable preferences captured at first use or onboarding |
sideEffects |
string[] | no | Capabilities that should always be treated as side-effects |
onboarding.welcomeMessage |
string | yes | Shown when pack is first activated |
onboarding.suggestedFirstTask |
string | yes | Suggested prompt to try |
Each adapter implements probe() and execute():
- Composio: Calls
COMPOSIO_SEARCH_TOOLSwith the capability's intent string. Returns the best matching toolkit and action. - OpenClaw Tool: Matches the capability's
verb_nounagainst built-in tool names. Exact match only. - Lobster: Matches capabilities with
_workflowsuffix against registered Lobster workflows. - CLI: Checks
cliMappingsconfig for pattern match, then verifies binary exists viawhich. - MCPorter: Scans all configured MCP server tool lists for keyword matches.
Results are cached for 10 minutes (configurable). Cache is invalidated on execution failure.
To add a new adapter:
-
Create
src/adapters/your-adapter.tsimplementingCapabilityAdapter:probe(capabilityId, intent, hints?)— return aProbeResultif you can handle this capability, ornullexecute(capabilityId, providerDetails, args, packId)— run the capability using the details from your probe result
-
Register it in
src/index.ts— add to theadaptersarray -
Add its ID to the
adapterOrderenum inopenclaw.plugin.json -
Write tests in
src/__tests__/your-adapter.test.ts
The probe() method should be fast (no side-effects, <5s). Return connectionReady: false with a setupHint if the service needs configuration.
The scripts/deploy.sh script automates deployment following OpenClaw conventions:
# On the remote machine
git clone <repo-url> /root/.openclaw/clawdi-plugins
cd /root/.openclaw/clawdi-plugins
pnpm install
./scripts/deploy.sh /data/openclaw/extensionsThe script:
- Builds all packages
- Reads each plugin's
idfromopenclaw.plugin.json - Copies only deployment files (
dist/,package.json,openclaw.plugin.json,skills/,pack-manifest.yaml) - Installs runtime dependencies per-plugin (
npm install --omit=dev --ignore-scripts --legacy-peer-deps) - Safe to re-run — replaces each plugin directory on every run
To deploy a subset of packs, copy only the desired pack directories manually after building, or modify plugins.allow in openclaw.json to control which plugins load.
OpenClaw uses unscoped plugin IDs. The directory name under /data/openclaw/extensions/ should match the id field in openclaw.plugin.json:
/data/openclaw/extensions/
knowledge-work-router/ → id: "knowledge-work-router"
pack-sales/ → id: "pack-sales"
pack-marketing/ → id: "pack-marketing"
pnpm install # Install dependencies
pnpm build # Build all packages
pnpm test # Run all testsMonorepo layout:
packages/
router/ # Knowledge work router plugin (id: knowledge-work-router)
pack-sales/ # Sales pack (id: pack-sales)
pack-productivity/ # Productivity pack (id: pack-productivity)
... # 8 more packs
docs/
superpowers/ # Specs and plans