feat: Pluggable Reviewer Personas — separate reviewer profiles from plugin machinery#500
feat: Pluggable Reviewer Personas — separate reviewer profiles from plugin machinery#500jcasimir wants to merge 5 commits intoEveryInc:mainfrom
Conversation
Reviewer .md files no longer ship with the plugin. Instead, they live in external Git repos and are synced on demand via /ce:refresh. This lets users customize their review team — add custom reviewers, exclude ones they don't need, or mix reviewers from multiple repos — without forking the plugin. What changed: - Removed 28 built-in reviewer .md files from agents/review/ - Added .gitignore so synced reviewers aren't committed to the plugin - Added _template-reviewer.md as a starting point for custom reviewers - Added reviewer-registry.yaml with source configuration (which repos to sync from, with except lists and conflict resolution) - Refactored persona-catalog.md to explain the system rather than enumerate reviewers - Updated tests to check registry structure and skip gracefully when reviewer files aren't present (pre-refresh) Each reviewer's selection metadata (category, select_when) lives in its own frontmatter, so adding a reviewer is a single file in a single repo — no registry entry needed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
A new skill and bash script that fetches reviewer .md files from configured Git repos into the plugin's agents/review/ directory. Features: - User config at ~/.config/compound-engineering/reviewer-sources.yaml (auto-created on first run with sensible defaults) - Interactive menu: sync, edit config, or type natural language changes - Multiple sources with priority ordering (first listed wins) - Per-source except lists to skip specific reviewers - gh CLI with git clone fallback - Detailed per-source summary written to a file for verbatim display - Compatible with macOS bash 3 (no associative arrays) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Root README: add /ce:refresh as a post-install step - Plugin README: replace hardcoded reviewer list with docs for the pluggable system (setup, source configuration, custom reviewers, categories, conflict resolution) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 70ddd607dc
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
|
|
||
| ```bash | ||
| bash "$PLUGIN_DIR/skills/refresh/sync-reviewers.sh" \ | ||
| "$PLUGIN_DIR/skills/ce-review/references/reviewer-registry.yaml" \ |
There was a problem hiding this comment.
Keep refresh skill references within its own directory
This command passes "$PLUGIN_DIR/skills/ce-review/references/reviewer-registry.yaml" as an input file, which reaches into a sibling skill. plugins/compound-engineering/AGENTS.md explicitly says a SKILL.md must only reference files inside its own skill directory because converted targets may copy skills in isolation; in that layout this path is missing and sync-reviewers.sh fails before any sync can happen. Store the default registry under skills/refresh/ (or another in-scope path) and reference it from there.
Useful? React with 👍 / 👎.
| if [ ! -f "${staging}/${filename}" ]; then | ||
| echo " Orphan: ${filename} (not in any configured source)" | ||
| fi |
There was a problem hiding this comment.
Remove orphaned reviewer files when sources change
When a reviewer is removed from all configured sources (or excluded via except), the script only prints an Orphan: message and leaves the old .md file in agents/review. That means source edits do not actually take effect for previously synced reviewers, and stale personas can still be picked up by /ce:review. The sync step should delete or otherwise deactivate files not present in staging so the local reviewer set matches the configured sources.
Useful? React with 👍 / 👎.
|
|
||
| # Fetch files | ||
| src_tmp=$(mktemp -d) | ||
| fetched_files=$(fetch_files "$repo" "$branch" "$path" "$src_tmp" 2>&1) || { |
There was a problem hiding this comment.
Keep fetch stderr out of the reviewer filename stream
Capturing fetch_files with 2>&1 mixes warning/error text into fetched_files, and the subsequent for filename in $fetched_files loop treats those tokens as filenames. In partial-failure cases (for example, one file download warning), this produces bogus include/conflict entries and noisy copy failures instead of a cleanly reported fetch result. Capture only stdout for filenames and handle stderr separately.
Useful? React with 👍 / 👎.
The ce-reviewers repo now stores reviewer files under reviewers/ instead of at the root. Update the default source path to match. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The commented-out example in the sync script's first-run template showed path: . which was inconsistent with the actual default source using path: reviewers. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Thank @jcasimir, this aligns how we've been talking about optional reviewers just takes it one step further. I want to put a pause on this one for now until we do a bit of work related to (a) renaming all the commands and (b) move our settings out of the repo like you're relying on here. This will ensure things land better. |
|
Sounds good -- let me know if I can help. I'm feeling pretty excited about the reviewer and orchestrator pattern extraction and hope they can make it into main. |
Why
I've been using the Compound Engineering workflow for a while and really enjoy the theory behind it. After installing the plugin, one of the first things I did was refactor the reviewers to my own tastes and preferences. To be honest, I find it entertaining to create reviewer personas named after my friends and colleagues — a Sandi Metz OO reviewer, a Jason Fried scope-cutter, that kind of thing.
But doing that meant forking the entire plugin and mixing my personal reviewer files with the plugin machinery. Every time I wanted to pull in upstream improvements, I had to work around my custom reviewers. And I realized other users probably face the same friction — the reviewer personas are really user data, not plugin infrastructure.
The Abstraction
This PR separates reviewer personas from the plugin workflow. Reviewer
.mdfiles no longer ship with the plugin. Instead, they live in external Git repos that users configure and sync on demand via/ce:refresh.An individual or a company might have one or more repos of reviewers, or even branches within a single repo — multiple sources that people can configure. They use the main plugin from this primary repo but pull in reviewers from wherever they want.
Each reviewer file is fully self-contained: its
categoryandselect_whencriteria live in frontmatter, so the orchestrator discovers reviewers dynamically. Adding a reviewer means creating one file in their repo — no fork or plugin edits needed.What it enables
exceptlists let you skip specific reviewers from a source_template-reviewer.mdships with the plugin as a starting pointHow it works
/ce:refresh~/.config/compound-engineering/reviewer-sources.yamlwith a default sourcesync-reviewers.sh) fetches.mdfiles from configured repos viagh(withgit clonefallback)Default reviewer source
I setup the existing 28 reviewers are at JumpstartLab/ce-reviewers with
categoryandselect_whenadded to each file's frontmatter. This is configured as the default source in the registry.I assume you'd want to host this repo under EveryInc — please fork/recreate that repo under your org, then I can update this PR with your replacement.
Breaking change
Reviewer
.mdfiles no longer ship with the plugin. After installing or updating, users must run/ce:refreshto sync reviewers. The root README has been updated with this post-install step.Changes
Three commits:
.gitignoreand_template-reviewer.md, addreviewer-registry.yamlwith source config, refactorpersona-catalog.md, update tests/ce:refresh— new skill withsync-reviewers.shscript, user config at~/.config/compound-engineering/, interactive menu,exceptfilter, conflict resolution, macOS bash 3 compatible