About change-review
change-review is a Repowise skill for developers assessing code changes. It combines change-level scoring with per-file guidance, test gaps, and architectural context to keep reviews evidence-based.
Key features
- 01Score overall change risk
- 02Inspect per-file risk guidance
- 03Find dependents and missing co-changes
- 04Identify test gaps and select tests
- 05Check architecture decisions and health signals
Use cases
- 01Review a pre-merge commit or branch
- 02Find files potentially affected by a change
- 03Identify tests to add or run
- 04Check whether a change conflicts with architecture
MCP support
It uses Repowise MCP tools get_change_risk and get_risk to assess whole changes and specified files, with get_why and get_health for further investigation.
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ repowise-dev/ repowise --skill change-reviewAfter installing, type/change-reviewin Claude Code to confirm it loaded.
Details
From the project READMEChange Review with Repowise
When a diff is on the table, Repowise turns "what files changed" into "what does this change put at risk" — fusing git history (churn, ownership, co-change) with graph topology (dependents, impact surface), test gaps, security signals, and the architectural decisions that govern the touched code.
Two complementary risk signals, use both:
get_change_risk(revspec=…)(MCP) scores the whole change as one unit (a commit or abase..headrange). No LLM, no network. Prefer this in-MCP tool; it takes a revspec and diffs server-side, so you never shell out. Lead withdirectiveandhealth_delta— what the change actually made worse. Findings the change wrote sort above pre-existing ones it only touched. Thenrisk_percentile(this change ranked against sampled recent commits by diff size and spread, not a bug predictor), stated in one line bydiff_shape;include=["scales"]adds itsreview_prioritytercile andclassificationlabel. The raw 0-10scoreranks 0.99 against lines added, so it sits behindinclude=["diagnostics"]rather than on the wire. Omitrevspecto score uncommitted work. This is the pre-merge gate: "how risky is this change overall?" Therepowise risk <revspec>CLI is the identical scorer for when you are already in a terminal.get_risk(changed_files=…)(MCP) works per file and returns thedirectiveblock, the specific things to check inside the diff.
Score the whole change first
get_change_risk(revspec="main..HEAD") # HEAD, a commit SHA, or base..head
Read directive first: status, a headline naming what got worse, the
reasons behind it and next_actions to run. health_delta carries the
findings the change introduced or resolved. Then risk_percentile and the top
drivers: a high score from large diffusion (many dirs/subsystems) or low author
familiarity tells you where to look hardest. extensions=[".py", ".ts"] counts
only certain file types; exclude_patterns=["tests/"] omits paths. A warning
field, or a directive.status of unknown, means the revspec or filters
matched no files, so an all-zero score there is not a clean bill of health. The
equivalent from a terminal is repowise risk <revspec> (add --ext .py,.ts or
--format json).
Then drill into the per-file directive
Call get_risk in PR mode by passing the changed files:
get_risk(targets=<changed files>, changed_files=<same changed files>)
The response carries its own directive block, per file rather than per change
(distinct from get_change_risk's) — read it first, it's a few short lists:
may_break— files/symbols that import their way to what changed but are not in the diff. Reachability, not a diff: it says these depend on the changed files, not that the thing they use changed. Check each one.missing_cochanges— files that historically change together with the changed files but were left untouched. Often a forgotten update.missing_tests— changed code with a test gap. Flag for new/updated tests.tests_to_run: the tests the change needs, from the same selectionrepowise impacted-testsmakes, withtests_to_run_whygiving each one's reason (the changed file and its evidence, or "runs with every subset"). Checktests_run_allfirst: when it is true no smaller set can be vouched for,tests_run_all_reasonssays why, and the list is only what to run first; recommend the whole suite. When it is false the list is the set to run.tests_to_run_basisismeasuredwhen stored per-test coverage decided a changed file andinferredwhen only the dependency graph or a rule did; say which.tests_statusappears only when no selection could be made (timeout,config_invalid,unknown, ...), and then every test must run.
get_change_risk carries the same answer as impacted_tests: status
(selected or run_all, or why nothing was selected), run_all, reasons,
tests_to_run and why. include=["blast"] on get_risk adds
pr_blast_radius, the fuller dossier behind the directive's lists.
For the line-precise version from a terminal, repowise impacted-tests <revspec>
maps each changed line to the tests whose recorded coverage touches it, then
prints the ids (--format list | xargs pytest runs exactly them). It is honest
about gaps: a changed file with no coverage rows is a labelled filename guess,
and a brand-new file is "unknown, run the full suite", never "no tests needed".
Then go deeper where it matters
- Why does this code exist? For any non-trivial changed file, call
get_why(query="<file>")— don't let a change silently contradict a recorded architectural decision. Surfaceconflicts_with/supersedeshits. - Did the change make health worse?
get_health(targets=<changed files>, include=["biomarkers"])— call out new complexity, deep nesting, or duplication the diff introduced. - Who should review?
get_riskownership + co-change signals suggest the people with the most context on the touched code.
Getting the diff
- A GitHub PR:
gh pr diff <number>(orgh pr view <number> --json files). - A branch:
git diff --name-only main...HEAD. - Working tree:
git status --porcelain. - CLI shortcut for a range:
repowise risk main..HEADscores a branch/PR range for defect risk directly.
Write the review around evidence
Lead with a risk level and the directive findings, each tied to a concrete
file. Distinguish "may break" (a dependent outside the diff) from "worth a
look" (a co-change or health regression). Don't pad with findings the tools
didn't support.
Error handling
If get_risk errors or returns nothing, the MCP server may be down or the repo
unindexed — say so and review from the raw diff, noting that Repowise context was
unavailable. Suggest /repowise:init if the repo isn't indexed.