From echoreview
Review a GitHub PR and post a PENDING review with inline comments. Applies a universal best-practices floor and, if present in the target repo, team-mined patterns from .echoreview/patterns.md. Use when the user types /echo-review <pr> or asks you to review a PR for them.
How this skill is triggered — by the user, by Claude, or both
Slash command
/echoreview:reviewThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Review a single GitHub PR and post a **PENDING** review back to GitHub. The human always clicks Submit — never finalize a review automatically.
Review a single GitHub PR and post a PENDING review back to GitHub. The human always clicks Submit — never finalize a review automatically.
This skill walks four phases with two user checkpoints (after Phase 1 and before Phase 4 submission). Skip neither.
/echo-review <pr> where <pr> is one of:
https://github.com/OWNER/REPO/pull/NOWNER/REPO#N referenceN (only valid when the current working directory is a clone of the target repo)If the user gave no argument, ask for one. Don't guess.
OWNER, REPO, NUMBER:
OWNER, REPO, N from the URL path.OWNER/REPO#N form: split on / and #.gh repo view --json owner,name --jq '"\(.owner.login)/\(.name)"' from the current working directory to fill in OWNER/REPO; if that fails (not in a repo), tell the user and stop.gh auth status succeeds. If not, instruct the user to run gh auth login and stop.WORK_DIR=/tmp/echoreview-${NUMBER} and mkdir -p it.Run the two extract scripts in parallel from ${CLAUDE_PLUGIN_ROOT}/skills/review/scripts/:
extract-context.sh "$OWNER" "$REPO" "$NUMBER" — writes metadata.json, diff.patch, files.txt, file-types.json to $WORK_DIR.fetch-comments.sh "$OWNER" "$REPO" "$NUMBER" — writes existing-comments.json, existing-reviews.json, review-iteration.txt, previous-comments.md to $WORK_DIR.After both complete:
metadata.json for the PR title, author, base/head refs, and stats.file-types.json and tally counts per type field.review-iteration.txt. If 2, this is a re-review — load references/re-review.md and read previous-comments.md.Print a summary to the user that looks like:
PR #<N>: <title>
Author: @<login>
Base ← Head: <base> ← <head>
Files changed: <count> (<type breakdown>)
Prior comments: <count> (<iteration label: first review | re-review>)
Continue with the review? (y/N)
Pause and wait for the user's explicit y/N. If anything other than y / yes / Y, stop and report no review was created.
references/universal-best-practices.md..echoreview/patterns.md exists. If so, load it. If not, proceed with the universal floor only — this is the expected v0.1 path until echo-extract ships.$WORK_DIR/diff.patch.file (post-rename, new-side path)line (new-side line number)severity per universal-best-practices.md (or the rule's declared severity from patterns.md)source — one of universal, patternspattern_id — only set for patterns-driven findings (e.g. ECHO-ARC-001); used as metadata, never printed in the commentcomment — drafted per references/comment-template.md. For findings tied to a patterns.md rule, the rule's verbatim evidence quotes are the voice guide for this comment — match their register, length, vocabulary, emoji usage, code-block usage, capitalization, punctuation, and phrasing patterns. Do not impose a house style on top of them.$WORK_DIR/findings.json as a JSON array.Check the skip conditions from references/reasoning-pass.md. If any matches, skip this phase entirely — do not surface any reasoning-pass findings and do not penalize the PR for being lockfile-only / docs-only / generated / a pure version bump.
Otherwise:
references/reasoning-pass.md and references/reasoning-examples.md.$WORK_DIR/diff.patch.confidence (0–100). Drop any finding below 80. Drop any finding whose severity would be suggestion or note — Phase 3 is BLOCKER/WARNING only.$WORK_DIR/findings.json with source: "reasoning".Before running build-diff-map.sh, compute inline_findings_count:
$WORK_DIR/findings.json (each one becomes an inline comment if it maps to the diff).review-iteration.txt == 2), the count of prior items classified as NOT_FIXED or PARTIALLY_FIXED — these become fresh inline comments per references/re-review.md.FIXED and WONTFIX_ACKNOWLEDGED items do not count — they only ever appear in the resolution table, never as inline comments.
If inline_findings_count == 0:
build-diff-map.sh.submit-review.sh.references/re-review.md (different shape for first-review vs re-review). The resolution table, if any, prints to chat — not to the PR.Posting a "nothing to add" PENDING review is exactly the noise the "no PR summary comment" rule in DESIGN.md forbids.
${CLAUDE_PLUGIN_ROOT}/skills/review/scripts/build-diff-map.sh "$OWNER" "$REPO" "$NUMBER" to produce $WORK_DIR/diff-map.json.$WORK_DIR/findings.json:
"<file>:<line>" in diff-map.json.path, position, body.## Additional findings (outside diff range):.blocker → warning → suggestion → note), then by file:line ascending. No count cap.review-iteration.txt is 2, prepend the resolution table from references/re-review.md to the review body. (The resolution table only contextualizes re-flagged items; it never appears on its own — that case is handled by the skip gate above.)$WORK_DIR/review-comments.json (the in-diff comment array) and $WORK_DIR/submission-payload.json with this shape:{
"body": "<resolution table + out-of-diff findings, or empty string>",
"comments": [
{ "path": "<file>", "position": <int>, "body": "<comment body>" }
]
}
Do not include an event field. On GitHub's API, omitting event produces a PENDING review; setting it to APPROVE / REQUEST_CHANGES / COMMENT submits the review immediately. submit-review.sh refuses to POST any payload that has an event field set.
Print to the user:
<severity> <file>:<line> <comment> (truncate the comment to one line for the summary).<N> inline, <M> in body (out-of-diff).Submit PENDING review on PR #<N>? (y/N)Pause and wait for the user's explicit y/N. Anything other than y / yes / Y stops the run; tell the user the payload is on disk at $WORK_DIR/submission-payload.json if they want to inspect.
On y:
${CLAUDE_PLUGIN_ROOT}/skills/review/scripts/submit-review.sh "$OWNER" "$REPO" "$NUMBER". It POSTs the payload.metadata.json .html_url) so the user can click through and Submit on GitHub.Short — three lines:
Posted PENDING review on PR #<N>: <html_url>
<inline_count> inline comments, <body_count> in body.
Click "Submit review" on GitHub when you're ready.
Do not write a celebration, a next-steps list, or a summary of what the PR was about.
All intermediates live in /tmp/echoreview-${NUMBER}/. Never write inside the user's repo. The user owns cleanup — don't auto-delete.
event to COMMENT, APPROVE, or REQUEST_CHANGES. PENDING only.references/reasoning-pass.md.references/comment-template.md for the three guardrails).Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub abdu4188/echoreview --plugin echoreview