6.1 KiB
6.1 KiB
Plugin Systems Comparison: Ours vs Claude vs emes
Date: 2026-01-09 Status: Living document Related: ADR-005
Overview
Three plugin/skill systems for AI coding agents:
| System | Origin | Focus |
|---|---|---|
| Ours | This repo | Cross-agent portability |
| Claude Plugins | Anthropic (Oct 2025) | Claude Code extensibility |
| emes | evil-mind-evil-sword | Mechanical quality enforcement |
Feature Comparison
| Aspect | Our System | Claude Plugins | emes |
|---|---|---|---|
| Primary file | SKILL.md |
plugin.json + skills/*.md |
plugin.json + tools |
| Distribution | Nix + deploy-skill.sh |
/plugin install + marketplace |
/plugin install @emes |
| Discovery | Symlink to ~/.claude/skills/ |
Auto-discovery from skills/ |
Auto-discovery |
| Multi-agent | ✅ Gemini, OpenCode, Claude | ❌ Claude only | ❌ Claude only |
| Hooks | ❌ None | ✅ 9 lifecycle events | ✅ Uses hooks heavily |
| Issue tracking | beads | N/A | tissue (their own) |
| Quality gates | ❌ Manual | ✅ Hooks possible | ✅ idle (blocks exit) |
| Messaging | N/A | N/A | jwz (async, identity-aware) |
Architectural Principles
| Principle | Ours | Claude | emes |
|---|---|---|---|
| Context injection | Push (SKILL.md loaded upfront) | Push (skill loaded upfront) | Pull on-demand |
| Enforcement | Prompt-based ("please do X") | Hooks available but optional | Mechanical (hooks required) |
| Content style | Inline markdown | Inline markdown | References to files |
| Interface | Human-readable | Human-readable | Machine-first (JSON) |
Unique Strengths
What We Have (that others don't)
- Cross-agent support - Works with Gemini, OpenCode, not just Claude
- Nix deployment - Declarative, reproducible, system-level
- Lenses pattern - Multi-pass focused review (bloat, security, coupling, etc.)
- beads integration - Issue tracking across sessions
What Claude Has (that others don't)
- Official support - Anthropic-maintained, documented
- Marketplace ecosystem - Community plugins, discovery
- Scope control - user/project/local installation
- 9 lifecycle hooks - SessionStart, PostToolUse, PreCompact, etc.
What emes Has (that others don't)
- idle - Quality gate that mechanically blocks exit until reviewer approves
- tissue - Issue tracker designed for agents (JSON, non-interactive)
- jwz - Async messaging with git context and identity
- alice - Adversarial reviewer agent (Opus-based)
- Mechanical enforcement - Hooks enforce policy, not prompts
emes Tool Details
| Tool | Purpose | Language |
|---|---|---|
| idle | Quality gate - blocks exit until alice reviews | Shell + hooks |
| tissue | Git-native issue tracking, machine-first | Zig |
| jwz | Async messaging with identity/git context | Zig |
| marketplace | Plugin distribution registry | JSON |
| alice | Read-only Opus reviewer, creates issues | Agent |
emes Key Principles
From their architecture:
- Pull context on-demand - Don't inject large prompts upfront
- Mechanical enforcement - Use hooks to enforce, not prompt instructions
- References over inline - Point to files, don't embed content
- Machine-first interfaces - JSON output, non-interactive CLIs
Philosophical Stances
| System | Core Belief |
|---|---|
| Ours | "Skills should work everywhere" - agent-agnostic |
| Claude | "Plugins extend Claude Code" - platform-specific |
| emes | "Enforce quality mechanically" - trust hooks, not prompts |
Integration Points
We Could Adopt from emes
- idle pattern - Quality gate for code-review skill (skills-9jk)
- tissue - Alternative to beads? (probably not, beads is good)
- Pull on-demand - Reduce upfront context injection
- Machine-first - JSON output modes for scripts
We Could Adopt from Claude
- plugin.json - Already doing via dual-publish
- marketplace.json - Already created
- Hooks - Add to skills that need lifecycle events
- Scope control - Let users choose install scope
Current Strategy: Dual-Publish
We maintain both systems:
skills/my-skill/
├── .claude-plugin/
│ └── plugin.json # Claude plugin system
├── skills/
│ └── my-skill.md # Claude auto-discovery
├── SKILL.md # Nix deployment (cross-agent)
└── README.md
Rationale: Cross-agent support is important. Gemini can't use Claude plugins (skills-bo8).
Deployment Strategy
Current state:
| Environment | Issue Tracker | Plugins |
|---|---|---|
| Local (skills, dotfiles) | beads | Our dual-publish |
| Remote (ops-jrz1 VPS) | tissue | emes ecosystem |
Goal: Deploy our cross-agent skills to ops-jrz1.
| Environment | Issue Tracker | Plugins | Agents |
|---|---|---|---|
| Local | beads | Our dual-publish | Claude, Gemini, OpenCode |
| Remote (ops-jrz1) | tissue | Our dual-publish | Claude, Gemini, OpenCode |
The VPS should support "skills for all agents" - same cross-agent portability we have locally. tissue handles issue tracking there, but skills are ours.
Open Questions
Should we adopt tissue or stick with beads?→ Both, by environment- How much of emes philosophy (mechanical enforcement) should we adopt?
- Can we make lenses work as Claude plugin hooks?
- Should skills output JSON for machine consumption?
- How do beads and tissue sync/interop? (or do they?)