Sync Plugins to OpenCode
Convert Claude Code plugins from multiple source repos to OpenCode format.
Source of truth:
- •
references/CONVERSION_GUIDE.md- ALL conversion rules - •
references/NOTES.md- Lessons learned and special patterns (MUST READ)
Source Repos Configuration
Read references/REPOS.md for the list of source repos and their plugins.
Arguments
- •
$ARGUMENTS: Space-separated list ofrepo:pluginpairs, plugin names (searches all repos), or flags.- •
vibe-workflow→ finds in any repo - •
claude-code-plugins:vibe-workflow→ explicit repo - •
manifest-dev:manifest-dev→ explicit repo - •No args → sync all plugins from all repos
- •
Flags
- •
--all: Sync all plugins from all configured repos - •
--full: Force full resync (skip changelog, do everything from scratch) - •
--repo=NAME: Only sync from specified repo
Reasoning Effort (This Repo's Default)
When syncing plugins for this repo, always convert model: opus agents to:
yaml
model: openai/gpt-5.2 reasoningEffort: xhigh
This applies to all plugins synced here (vibe-workflow, vibe-extras, manifest-dev, consultant, prompt-engineering, solo-dev, etc.). The xhigh reasoning effort matches the intent of using a high-capability model like opus.
Workflow
1. Load Repo Config
- •Read
references/REPOS.md - •Parse the table to get repo configs
- •Filter by
--repoflag if specified
2. For Each Repo
bash
# Find or clone repo
REPO=""
for dir in <local-paths>; do
[ -d "$dir" ] && cd "$dir" && git pull origin main && REPO="$dir" && break
done
if [ -z "$REPO" ]; then
if [ -d "/tmp/<repo-name>" ]; then
cd /tmp/<repo-name> && git pull origin main
else
git clone <git-url> /tmp/<repo-name>
fi
REPO=/tmp/<repo-name>
fi
3. Identify Plugins to Sync
- •If specific plugins requested: filter to those
- •If
--allor no args: sync all plugins listed for this repo - •Check changelog for incremental sync (unless
--full)
4. For Each Plugin
- •Read source files from
$REPO/<plugins-dir>/<plugin>/ - •Apply conversions per CONVERSION_GUIDE.md:
- •Remove
name:from commands/agents (keep for skills) - •Remove
user-invocable:field - •Convert
model: opus→model: openai/gpt-5.2+reasoningEffort: xhigh - •Convert
model: sonnet→model: anthropic/claude-sonnet-4-5-20250929 - •Convert
model: haiku→model: anthropic/claude-haiku-4-5-20251001 - •Convert
tools:comma list to boolean object - •Add
mode: subagentto agents - •Replace
CLAUDE.md→AGENTS.md - •Replace
AskUserQuestion→question tool - •Replace
Skill("plugin:name")→/name(commands) orskill({ name: "name" })(skills)
- •Remove
- •Write to
<plugin>/in this repo
5. Report Changes
code
Synced from <repo>: <plugin-name>: - <file>: <brief description of change> Skipped (OpenCode limitations): - <description of hook changes that can't be ported>
OpenCode Limitations
Document but don't attempt to sync:
- •Stop hook blocking: OpenCode
session.idlecannot prevent stops - •PreToolUse blocking: OpenCode
tool.execute.beforecannot abort execution - •SubagentStop hooks: No equivalent event in OpenCode
- •additionalContext returns: Hooks cannot inject context mid-conversation
Output Structure
code
<plugin>/ ├── package.json ├── README.md ├── command/*.md ├── agent/*.md ├── skill/*/SKILL.md └── plugin/hooks.ts