Review and Release
Synchronize README.md with the current set of agents and skills, validate files follow plugin conventions, sync the Codex plugin directory, bump the patch version in both plugin manifests, and create a release commit.
Step 1: Inventory Agents and Skills
Scan the filesystem to build the current state.
Agents:
ls agents/*.md
For each .md file, read the YAML frontmatter and extract name and description. Condense each description into a short README-style summary (under ~90 characters), matching the style of existing entries.
Skills:
ls skills/*/SKILL.md
For each SKILL.md, read the YAML frontmatter and extract name and description. Condense each description into a short README-style summary.
Store both inventories for use in subsequent steps.
Step 2: Diff Against README
Read README.md and parse its three inline lists (backtick-separated names, alphabetical):
## Agents—`name` · `name` · …## Skills— same format## Commands—`/ai-kit:name` · …(one entry percommands/*.mdfile)
Compare the filesystem inventory against README and classify:
- Added — in filesystem but not in the README list
- Removed — in the README list but not in filesystem
- Unchanged — matches
If zero differences across agents and skills, report "README is already in sync" and skip to Step 3.
Step 3: Validate Plugin Conventions
Check all agent and skill files against these rules:
Agent files (agents/*.md)
- Frontmatter present — starts with
---and has closing--- - Required fields —
name,description,tools,modelall present - Name matches filename —
namefield equals filename without.md - Model value — one of:
haiku,sonnet,opus,inherit - Description is non-empty
- Meaningful markdown body after frontmatter
Codex agent manifests (agents/*.toml)
Codex discovers subagents from .toml files, so every Claude Code agent must have a matching Codex manifest.
- Pairing — every
agents/*.mdhas a siblingagents/*.toml(same basename), and everyagents/*.tomlhas a siblingagents/*.md. Report any unpaired file. - Valid TOML — parses without error.
- Required fields —
name,description,sandbox_mode,developer_instructionsall present and non-empty. - Name matches —
nameequals the filename without.tomland equals thenamein the paired.md. sandbox_modevalue — one of:read-only,workspace-write. Useread-onlywhen the paired.mdtoolscontain noWrite/Edit/Bash, otherwiseworkspace-write.developer_instructionsmatches the paired.mdmarkdown body (the prompt after frontmatter).
Skill files (skills/*/SKILL.md)
- Frontmatter present — starts with
---and has closing--- - Required fields —
nameanddescriptionpresent. Eithermodelordisable-model-invocation: truemust exist. - Name matches directory —
namefield equals parent directory name - Model value (if present) — one of:
haiku,sonnet,opus - Description is non-empty
- Meaningful markdown body after frontmatter
Plugin manifests
Validate both .claude-plugin/plugin.json and .codex-plugin/plugin.json:
- Valid JSON
- Required fields —
name,description,versionpresent - Version matches semver
X.Y.Z - Both manifests have the same
versionvalue
Codex interface
Validate agents/openai.yaml:
- File exists
interface.display_nameis present and non-empty
If any issues found, present them as a numbered list with file paths and stop. Do not proceed until issues are fixed.
Step 4: Apply README Updates
If Step 2 found differences, update README.md using the Edit tool: rebuild each affected inline list (## Agents, ## Skills, ## Commands) sorted alphabetically, keeping the existing `name` · `name` format.
Step 5: Bump Version
Increment the patch version (e.g., 2.0.4 → 2.0.5) in both manifests so Claude Code and Codex stay aligned:
.claude-plugin/plugin.json.codex-plugin/plugin.json
Use the Edit tool on each file.
Step 6: Sync Codex Plugin Directory
The Codex marketplace manifest (.agents/plugins/marketplace.json) points at plugins/ai-kit/, not the repo root — Codex users get ONLY what is inside that directory. It must mirror the root on every release:
rsync -a --delete skills/ plugins/ai-kit/skills/
rsync -a --delete agents/ plugins/ai-kit/agents/
cp .codex-plugin/plugin.json plugins/ai-kit/.codex-plugin/plugin.json
Verify the sync:
diff -rq skills plugins/ai-kit/skills && diff -rq agents plugins/ai-kit/agents
Both diffs must be empty. Commands are intentionally not synced — the Codex plugin manifest declares only skills and mcpServers; commands/ is Claude-only.
Step 7: Present Summary
Before committing, show a clear summary:
## Release Summary
**Version:** X.Y.Z → X.Y.Z+1
**README changes:**
- Added agents: ...
- Removed agents: ...
- Added skills: ...
- Removed skills: ...
- Added commands: ...
**Codex sync:** plugins/ai-kit updated (N files changed) / already in sync.
**Validation:** All agents and skills pass convention checks.
**Files to commit:**
- README.md
- .claude-plugin/plugin.json
- .codex-plugin/plugin.json
- plugins/ai-kit/** (if the sync changed anything)
Only show sections with actual changes.
Step 8: Commit
Stage and commit only the modified files:
git add README.md .claude-plugin/plugin.json .codex-plugin/plugin.json plugins/ai-kit
Commit with message format:
release: vX.Y.Z
- Updated README (added N agents, removed M agents, ...)
- Bumped Claude and Codex plugin versions to X.Y.Z
Do NOT use git add -A or git add .. After committing, run git status to confirm clean state and report the commit hash.