change-review
GitHub用于在代码合并前审查变更风险。通过MCP工具分析差异,评估整体缺陷风险及单文件影响,检查依赖断裂、遗漏的共变文件和测试缺口,辅助判断PR安全性与合并优先级。
Trigger Scenarios
Install
npx skills add repowise-dev/repowise --skill change-review -g -y
SKILL.md
Frontmatter
{
"name": "change-review",
"description": "Use when reviewing a set of changes before they merge in a Repowise-indexed repository, a PR, a branch diff, or the working-tree changes you just made. Activates for \"review this PR\", \"is this safe to merge\", \"what is the blast radius of these changes\", or \"did I miss anything\"."
}
Change 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) from its diff shape: a single 0-10 defect-risk score with drivers (lines added/deleted, files, directories, subsystems, change entropy, author familiarity). No LLM, no network. Prefer this in-MCP tool; it takes a revspec and diffs server-side, so you never shell out. Lead withrisk_percentile(this change ranked against sampled recent commits), summarized byreview_priorityandclassification.scoreis calibrated per single commit, so a PR-sized change reads high by construction, andfallback_bandappears only when there was no baseline to rank against. 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 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 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 directive block
Call get_risk in PR mode by passing the changed files:
get_risk(targets=<changed files>, changed_files=<same changed files>)
The response carries a directive block — 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 positive complement ofmissing_tests, the tests that exercise the changed files. Recommend running these to validate the change. Readtests_to_run_basiswith it:measuredmeans a coverage map proves those tests execute the changed files (pytest-runnable ids);inferredmeans the call graph shows those test files reaching the change, with the import graph filling in where it is silent, which needs no coverage ingest but is a candidate list, so say so rather than presenting it as proof;nonewith an empty list is "unknown", never "no tests exist".
pr_blast_radius holds the fuller dossier behind those lists (including the
per-changed-file guarding_tests breakdown behind tests_to_run).
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 /prompts:repowise-init if the repo isn't indexed.
Version History
-
3433e55
Current 2026-08-27 21:02
将 get_risk 输出中的 will_break 重命名为 may_break,以准确反映基于文件列表而非完整 diff 的分析精度限制,并更新相关文档与 CLI 文本。
-
370793f
2026-08-19 23:15
修复风险报告数值含义歧义:移除冗余概率字段,明确分数单位为单提交校准,支持对未提交工作区打分,修正合并提交处理及作者查找失败逻辑。
- b5f4753 2026-07-25 05:12


