A scaffold for building multi-platform AI coding agent plugins that work across Claude Code, opencode, and OpenClaw. Use this as a starting point for your own enterprise engineering plugins.
This repository demonstrates a production-ready plugin architecture where src/ is the single source of truth, and each AI platform reads from it via symlinks.
One repo serves as a single catalog for the entire organization. Each department owns its own plugin — employees install only the ones they need.
| Plugin | Department | Status |
|---|---|---|
| acme-engineering | Engineering | Full example (agents, skills, runbooks, hooks) |
| acme-people | People/HR | Placeholder — ready to customize |
| acme-finance | Finance | Placeholder — ready to customize |
| acme-marketing | Marketing | Placeholder — ready to customize |
Each plugin is independent — its own agents, skills, commands, and versioning. Employees from different departments install different plugins from the same marketplace.
Pick your platform — you only need to install on the one(s) you use.
# From a Claude Code session:
/plugin marketplace add jdiegosierra/enterprise-agent-plugins
/plugin install acme-engineering@jdiegosierra-enterprise-agent-pluginsUpdates are automatic — Claude Code checks for new versions on each session start.
Test locally without installing:
claude --plugin-dir ./plugins/acme-engineering/claude# 1. Clone the repo
git clone https://github.com/jdiegosierra/enterprise-agent-plugins.git ~/repos/enterprise-agent-plugins
# 2. Run the setup script to symlink agents into opencode's config
bash ~/repos/enterprise-agent-plugins/plugins/acme-engineering/scripts/setup-opencode-agents.sh
# 3. Verify agents are registered
ls -la ~/.config/opencode/agents/Updates: git pull in the repo and re-run the setup script.
OpenClaw loads skills via extraDirs in openclaw.json. Point it to the src/skills/ directory (not openclaw/skills/ — OpenClaw doesn't resolve symlinks inside extraDirs).
# 1. Clone the repo into the OpenClaw workspace
git clone https://github.com/jdiegosierra/enterprise-agent-plugins.git /path/to/repos/enterprise-agent-plugins
# 2. Add to openclaw.json
cat <<EOF >> /dev/null
Add this to your openclaw.json under "skills.load":
{
"skills": {
"load": {
"extraDirs": [
"/path/to/repos/enterprise-agent-plugins/plugins/acme-engineering/src/skills"
],
"watch": true
}
}
}
EOF
# 3. Restart OpenClaw (or wait — watch mode picks up changes automatically)Updates: git pull in the repo. With watch: true, OpenClaw detects changes automatically.
The acme-engineering plugin is a fully functional example with:
- 2 agents — SRE (infrastructure, runbooks) and backend-developer (PRs, testing)
- 4 commands — help, setup, lint-fix, run-tests
- 3 skills — platform map, Kubernetes best practices, SRE runbook executor
- 1 runbook — GitHub access provisioning (end-to-end: Jira ticket to PR)
- 6 hooks — bash safety guard, welcome message, session rules, update checker, onboarding, notifications
- Multi-platform support — Claude Code, opencode, and OpenClaw with symlinks
enterprise-agent-plugins/
├── .claude-plugin/marketplace.json # Catalog — lists all department plugins
├── release-please-config.json # Versioning (one version per plugin)
├── .release-please-manifest.json
├── .github/workflows/
│ └── release-please.yml
└── plugins/
├── acme-engineering/ # Engineering department (full example)
│ ├── src/ # Source of truth — all content lives here
│ │ ├── agents/ # Agent definitions (markdown + YAML frontmatter)
│ │ ├── commands/ # Slash commands
│ │ ├── skills/ # Knowledge bases (SKILL.md per topic)
│ │ └── runbooks/ # Operational procedures
│ ├── claude/ # Claude Code plugin root (symlinks to src/)
│ │ ├── .claude-plugin/ # Plugin manifest
│ │ ├── agents/ # → src/agents/
│ │ ├── commands/ # → src/commands/
│ │ ├── skills/ # → src/skills/
│ │ └── hooks/ # Lifecycle hooks (bash scripts)
│ ├── opencode/ # opencode agents (symlinks to src/)
│ │ └── agents/
│ ├── openclaw/ # OpenClaw skills (symlinks to src/)
│ │ └── skills/
│ ├── scripts/
│ └── tests/
├── acme-people/ # People/HR department (placeholder)
│ └── claude/.claude-plugin/
├── acme-finance/ # Finance department (placeholder)
│ └── claude/.claude-plugin/
└── acme-marketing/ # Marketing department (placeholder)
└── claude/.claude-plugin/
- Content lives in
src/— agents, skills, commands, and runbooks are plain markdown files - Each platform has its own directory with symlinks pointing to
src/ - Claude Code discovers content via the marketplace (
.claude-plugin/marketplace.jsonpoints toclaude/) - opencode uses symlinks from
~/.config/opencode/agents/(created byscripts/setup-opencode-agents.sh) - OpenClaw loads skills via
extraDirsinopenclaw.json(points directly tosrc/skills/— OpenClaw doesn't resolve symlinks)
Only Claude Code has formal versioning via release-please. opencode and OpenClaw load files directly from git pull.
- Fork this repo or use it as a template
- Rename
acme-engineeringto<your-org>-engineeringeverywhere:plugins/acme-engineering/directory.claude-plugin/marketplace.jsonrelease-please-config.jsonand.release-please-manifest.jsonplugins/acme-engineering/claude/.claude-plugin/plugin.json- All hook scripts and command files that reference
acme-engineering
- Replace placeholder content:
acme-platformskill → your org's repository inventory and service mapgithub-access.mdrunbook → your actual provisioning steps- AWS profiles, team names, Jira project keys → your real values
- Add your skills — create
src/skills/<topic>/SKILL.mdand symlink inclaude/skills/ - Add your agents — create
src/agents/<role>.mdand symlink inclaude/agents/
Markdown files with YAML frontmatter that define specialized roles. Each agent has:
- A description (used for routing)
- Available commands and skills
- Core workflows
- Safety rules
Knowledge bases that agents consult. Each skill is a directory with a SKILL.md file. Skills are loaded on-demand (2% of context window), so they scale well.
Step-by-step operational procedures stored as plain markdown. Unlike skills (which are reference knowledge), runbooks are executable instructions. Agents have routing tables that map trigger keywords to runbook files.
Why not commands? Commands load their description at session start. With hundreds of runbooks, this would consume too much context budget. Runbooks are loaded on-demand when triggered.
Lifecycle scripts that run on events:
- SessionStart — welcome messages, update checks, onboarding, session rules
- PreToolUse — safety guards that intercept dangerous commands
- Stop — notifications when tasks complete
Git preserves symlinks. When Claude Code clones the repo via marketplace install, symlinks in claude/ resolve to src/ correctly. This means one source of truth, zero duplication.
Looking for a production deployment that uses this plugin system? Check out enterprise-agent-operator — an EC2-based setup with OpenClaw as AI gateway, a Jira bridge for ticket automation, an opencode bridge for safe coding delegation, and full security hardening.
See CONTRIBUTING.md.
MIT