packages/docs/plugins/publish.md
This guide covers the full publishing workflow for a Eliza plugin — from packaging to npm publication and community registry submission.
Choose a package name that follows the established convention:
| Scope | Pattern | Example |
|---|---|---|
| Official elizaOS | @elizaos/plugin-{name} | @elizaos/plugin-openai |
| Community (scoped) | @yourorg/plugin-{name} | @acme/plugin-analytics |
| Community (unscoped) | elizaos-plugin-{name} | elizaos-plugin-weather |
The runtime recognizes all three patterns for auto-discovery.
Your plugin's package.json must include these fields:
{
"name": "@elizaos/plugin-my-feature",
"version": "1.0.0",
"description": "One-line description of what this plugin does",
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"files": ["dist", "elizaos.plugin.json"],
"keywords": ["elizaos", "eliza", "plugin"],
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/yourorg/plugin-my-feature"
},
"peerDependencies": {
"@elizaos/core": ">=2.0.0-alpha"
},
"devDependencies": {
"@elizaos/core": "alpha",
"typescript": "^5.0.0"
}
}
Key points:
@elizaos/core as a peerDependency — not a direct dependency — to avoid version conflicts.elizaos.plugin.json in files so the manifest is published alongside the code."type": "module" for ESM output.Use TypeScript targeting ESM:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"outDir": "dist",
"declaration": true,
"declarationMap": true,
"sourceMap": true,
"strict": true,
"skipLibCheck": true
},
"include": ["src"],
"exclude": ["node_modules", "dist", "**/*.test.ts"]
}
Follow Semantic Versioning:
| Change | Bump |
|---|---|
| New action, provider, or feature (backward compatible) | Minor (1.0.0 → 1.1.0) |
| Bug fixes only | Patch (1.0.0 → 1.0.1) |
| Breaking API change | Major (1.0.0 → 2.0.0) |
For plugins targeting the elizaOS next release line, use prerelease versions:
npm version prerelease --preid=next
# 1.0.0 → 1.0.1-next.0
npm login
bun run build
Verify the dist/ directory contains the compiled output before publishing.
Always preview what will be published:
npm publish --dry-run --access public
Check that the output includes only dist/, elizaos.plugin.json, package.json, and README.md.
npm publish --access public
For prerelease versions targeting the elizaOS next release line:
npm publish --access public --tag next
npm info @yourorg/plugin-my-feature
Include an elizaos.plugin.json at the package root for rich UI integration in the Eliza admin panel:
{
"id": "my-feature",
"name": "My Feature Plugin",
"description": "Does something useful",
"version": "1.0.0",
"kind": "skill",
"requiredSecrets": ["MY_FEATURE_API_KEY"],
"optionalSecrets": ["MY_FEATURE_DEBUG"],
"configSchema": {
"type": "object",
"properties": {
"apiKey": { "type": "string" },
"endpoint": { "type": "string", "format": "uri" }
},
"required": ["apiKey"]
},
"uiHints": {
"apiKey": {
"label": "API Key",
"type": "password",
"sensitive": true
}
}
}
Documentation:
README.md with installation instructions, required environment variables, and usage examples.Security:
runtime.logger carefully.peerDependencies for @elizaos/core to prevent duplicate installations.Compatibility:
next release of @elizaos/core.peerDependencies version range conservatively: "@elizaos/core": ">=2.0.0-alpha".Plugin type-compatible default export — do not use default exports for other purposes.Quality:
scripts/coverage-policy.mjs.)tsc --noEmit in CI to catch type errors.npm pack before publishing.Plugins can include implementations in multiple languages:
my-plugin/
├── typescript/ # Primary TypeScript implementation
│ ├── src/
│ ├── package.json
│ └── tsconfig.json
├── python/ # Optional Python SDK bindings
│ ├── src/
│ └── pyproject.toml
├── rust/ # Optional Rust native module
│ ├── src/
│ └── Cargo.toml
└── elizaos.plugin.json
The TypeScript implementation is always required. Python and Rust implementations are optional and used by their respective SDKs. The elizaos.plugin.json manifest at the root describes the plugin for all languages.
After publishing to npm, submit your plugin to the community registry by opening a PR to elizaos-plugins/registry.
Include in your PR:
index.json mapping your package name to its git repoelizaos.plugin.json manifest in your packageCommunity plugins are reviewed for security, functionality, and documentation quality before listing. See Registry Documentation for details.