/sync-tools — distribution sync
Every host reads the same skill files. The Claude Code plugins under claude-plugins/ are the source; OpenCode (dist/opencode/plugin/index.js) and Pi (repo-root package.json, pi.skills) point straight at claude-plugins/*/skills. Only Codex needs a copy, because it installs a plugin into its own cache, and that copy is generated:
python3 scripts/sync_dist.py # regenerate dist/codex/plugins/*/skills byte-identically from source
python3 scripts/sync_dist.py --check # exit 1 on any drift (tests/test_dist_skill_references.py runs this)
Run the first command after any change under claude-plugins/*/skills, then commit the regenerated tree with the change. There is no per-host rewrite: shipped skill text names no host primitive (tests/test_skill_frontmatter.py enforces that), so a copy is a copy.
Hand-maintained packaging files
These are not generated. Edit them when what they describe changes:
| File | What it carries |
|---|---|
dist/codex/plugins/manifest-dev/.codex-plugin/plugin.json, dist/codex/plugins/manifest-dev-tools/.codex-plugin/plugin.json |
Codex plugin manifests; version must equal the source plugin's .claude-plugin/plugin.json version |
.agents/plugins/marketplace.json |
Codex marketplace registry pointing at the two plugin directories |
dist/opencode/plugin/index.js, dist/opencode/plugin/package.json |
OpenCode plugin entry (registers the source skill dirs and slash-command wrappers); version tracks manifest-dev's |
dist/opencode/AGENTS.md |
OpenCode instructions file the plugin registers |
dist/pi/prompts/*.md |
Pi prompt-template aliases (/do, /auto, /babysit-pr) |
dist/codex/README.md, dist/opencode/README.md, dist/pi/README.md |
Per-host install and update instructions |
Version bumps follow the repo's Versioning rules; this skill does not bump anything.