Monorepo for all WOPR plugins. Contains 64 packages: 63 plugins covering channels, voice, AI providers, media, memory, utilities, and more, plus the shared plugin-types package that defines the canonical type system.
Built with pnpm workspaces and Turborepo. Published to npm under the @wopr-network scope via Changesets.
| Category | Count | Examples |
|---|---|---|
| channel | 18 | discord, slack, telegram, msteams, whatsapp, irc, matrix, signal, twitter |
| plugin | 14 | acp, evangelist, mattermost, skills, soul, websearch, superpower-* |
| voice | 10 | voice-call, voice-cli, voice-elevenlabs-tts, voice-whisper-local, voice-deepgram-stt |
| utility | 6 | browser, cron, exec, http, tools, webhooks |
| provider | 5 | provider-anthropic, provider-openai, provider-codex, provider-kimi, provider-opencode |
| media | 3 | canvas, imagegen, videogen |
| system | 3 | router, setup, webui |
| memory | 2 | memory-obsidian, memory-semantic |
| integration | 1 | mcp |
| network | 1 | p2p |
All plugins are scoped as @wopr-network/wopr-plugin-<name>. The type definitions live in @wopr-network/wopr-plugin-types.
git clone https://github.com/wopr-network/wopr-plugins.git
cd wopr-plugins
pnpm install
pnpm turbo buildRequirements: Node 22+, pnpm 9+.
- Create a branch for your changes.
- Edit plugin source under
packages/<plugin-name>/src/. - Run lint and build locally:
pnpm turbo lint build --filter=<plugin-name>
- Run tests:
pnpm turbo test --filter=<plugin-name>
- Add a changeset describing your change:
pnpm changeset
- Commit everything and open a PR. Merge queue is enforced -- CI must pass before merge.
This repo uses Changesets for versioning and publishing.
-
Add a changeset -- when your PR includes a user-facing change, run
pnpm changesetand select the affected packages and semver bump type. Commit the generated.changeset/*.mdfile with your PR. -
Version PR -- after changesets merge to
main, the Release workflow automatically opens (or updates) a "chore: version packages" PR that bumpspackage.jsonversions and updates changelogs. -
Publish -- merging the version PR triggers
changeset publish, which publishes all bumped packages to npm with public access.
All packages are published with "access": "public" under the @wopr-network scope.
The CI workflow runs on every PR and push to main (self-hosted runners):
| Step | Command | What it checks |
|---|---|---|
| Lint | pnpm turbo lint --filter='...[origin/main]' |
Biome lint on affected packages |
| Build | pnpm turbo build --filter='...[origin/main]' |
TypeScript compilation (tsc) |
| Test | pnpm turbo test --filter='...[origin/main]' |
Vitest on affected packages |
| Registry | pnpm run generate-registry --check |
Plugin registry is up to date |
| Validate | pnpm turbo validate-package --filter='...[origin/main]' |
Package structure validation |
CI uses Turbo's --filter='...[origin/main]' to only lint, build, and test packages affected by the change.
Merge queue (merge_group) is enabled -- PRs enter the queue only after CI passes.
-
Create the package directory:
mkdir -p packages/plugin-<name>/src
-
Add a
package.json:{ "name": "@wopr-network/wopr-plugin-<name>", "version": "1.0.0", "type": "module", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { "lint": "biome check src/", "build": "tsc", "test": "vitest run --passWithNoTests", "prepublishOnly": "npm run build" }, "license": "MIT", "woprPlugin": { "category": "<category>", "tags": ["wopr", "wopr-plugin"], "maturity": "alpha" } } -
Add a
tsconfig.jsonextending the shared base:{ "extends": "../../tooling/tsconfig.base.json", "compilerOptions": { "outDir": "dist", "rootDir": "src" }, "include": ["src"] } -
Write your plugin entry point in
src/index.ts. -
Run
pnpm installfrom the repo root to link the new workspace. -
Regenerate the plugin registry:
pnpm run generate-registry
-
Verify everything:
pnpm turbo lint build test --filter=plugin-<name>
The file plugin-registry.json at the repo root is the machine-readable index of all 63 plugins. It records each plugin's name, version, description, category, tags, and maturity level.
Regenerate it after adding or modifying plugins:
pnpm run generate-registryCI validates the registry is current via pnpm run generate-registry --check. If the check fails, regenerate and commit the updated file.
You can also validate all plugin manifests independently:
pnpm run validate-manifestsMIT