repopilot 0.23.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +121 -148
  2. package/package.json +8 -7
package/README.md CHANGED
@@ -5,203 +5,176 @@
5
5
  [![CI](https://github.com/MykytaStel/repopilot/actions/workflows/ci.yaml/badge.svg)](https://github.com/MykytaStel/repopilot/actions)
6
6
  [![License](https://img.shields.io/crates/l/repopilot.svg)](LICENSE)
7
7
 
8
- **Deterministic review for code you didn't write.**
8
+ **Local, deterministic review for Git changes.**
9
9
 
10
- Coding agents and busy teams produce more diffs than anyone can carefully
11
- read. RepoPilot is a local Rust CLI that inspects a Git change and reports,
12
- with structural evidence, where it crosses security boundaries, changes
13
- behavior, and how far it reaches through the import graph. There is no LLM
14
- inside and nothing leaves your machine: the same diff always produces the
15
- same answer, so you can gate CI on it.
10
+ RepoPilot helps developers and teams inspect a change before merge. It reports
11
+ structural evidence about security boundaries, behavior, local imports and
12
+ exports, and the files affected through the dependency graph. The same review
13
+ can run from a terminal, in CI, or through an agent integration.
16
14
 
17
- ## Sixty seconds: an agent "optimizes" image uploads
15
+ The analysis runs on the machine or CI runner that invokes it. It does not send
16
+ source to a hosted service or call an embedded language model. Findings point to
17
+ code and explain what to check; reviewers still decide whether a change is safe
18
+ for their application.
18
19
 
19
- An agent is asked to shell out to `mogrify` after image edits in a Django
20
- app (Wagtail). The diff is one file, +12 −6, and it works. It also quietly
21
- drops a permission check and pipes request input into a shell.
20
+ ## Example: a change that weakens its own tests
22
21
 
23
- <p align="center">
24
- <img src="https://raw.githubusercontent.com/MykytaStel/repopilot/main/docs/demos/03-agent-review.gif" alt="repopilot review flagging a removed auth check and a request-to-shell taint flow in a one-file diff" width="800">
25
- </p>
26
-
27
- One command, `repopilot review .`, and the diff answers for itself — one
28
- verdict, the reasons behind it, and one next action, then the evidence:
22
+ This change drops a range check from `applyDiscount`. The same change skips the
23
+ test that would now fail, removes an assertion from another test, and lets the
24
+ CI test step fail without failing the job. Every check that still runs passes.
25
+ `repopilot review .` lists them right after its decision:
29
26
 
30
27
  ```text
31
28
  Decision: REVIEW (Change Proof: REVIEW)
32
- Reasons:
33
- - Definitely-sensitive review signal(s) require confirmation.
34
- - A changed boundary has no corresponding test change.
35
- …
36
- Next action: Resolve or confirm the high-priority findings and sensitive signals listed below before merge.
37
-
38
- ⚑ access control changed — wagtail/images/views/images.py
39
- ⚑ auth check removed — wagtail/images/views/images.py:264
40
- Authentication/authorization check removed (auth calls: 1 -> 0)
41
- ⚑ subprocess/exec added — wagtail/images/views/images.py:270
42
- ⚑ untrusted input reaches subprocess/exec — wagtail/images/views/images.py:270
43
- HTTP request input reaches subprocess/exec: subprocess.run("mogrify -quality " + quality + ...
44
- ⚠ A code boundary changed but no test did — confirm it's still covered.
29
+ ...
30
+ Checks this change weakened (details under Review signals):
31
+ ⚑ check gate relaxed — .github/workflows/ci.yml:10
32
+ ⚑ assertions removed — src/pricing.test.ts:5
33
+ ⚑ test skipped — src/pricing.test.ts:9
45
34
  ```
46
35
 
47
- The edit is scripted so you can replay it on the pinned Wagtail checkout
48
- RepoPilot uses for regression testing — but it is the kind of diff agents
49
- ship every day:
50
-
51
- ```bash
52
- python3 scripts/zoo.py clone --only wagtail
53
- scripts/demo-agent-edit.sh .zoo/wagtail
54
- repopilot review .zoo/wagtail
55
- ```
56
-
57
- The same review works across languages — the identical flow in a Spring
58
- controller (`scripts/demo-java-agent-edit.sh` on the pinned PetClinic
59
- checkout) is caught the same way.
60
-
61
- > RepoPilot reports structural evidence, not a security verdict. A flagged
62
- > flow is a path to verify, not a confirmed vulnerability. Use it beside
63
- > tests, linters, and dedicated security tools.
36
+ Further down, each signal explains itself:
64
37
 
65
- `VERIFIED` is only awarded when checks you configure and select with
66
- `--verify` pass on the reviewed revision; `repopilot init --suggestions-output
67
- repopilot-suggestions.toml` proposes them for your stack without applying
68
- anything. Add `--detail full` for provenance, legacy readiness, and ownership.
69
-
70
- ## Catch broken code, not just risky code
71
-
72
- A tidy-looking rename and file move — nothing a diff review would flag on its
73
- own — quietly breaks two callers that still expect the old names. No compiler
74
- runs; both are AST-plus-resolver proofs.
75
-
76
- <p align="center">
77
- <img src="https://raw.githubusercontent.com/MykytaStel/repopilot/main/docs/demos/05-broken-code.gif" alt="repopilot review catching a removed export still imported and an unresolved local import in a tidy-looking rename" width="800">
78
- </p>
79
-
80
- ```bash
81
- scripts/demo-broken-code-review.sh
38
+ ```text
39
+ ⚑ check gate relaxed — .github/workflows/ci.yml:10 check step `npm test` in job `test` now has `continue-on-error: true`
40
+ ⚑ assertions removed — src/pricing.test.ts:5 "applyDiscount > takes a percentage off the total": assertions 2 → 1
41
+ ⚑ test skipped — src/pricing.test.ts:9 `it.skip` added on "rejects a discount above 100%"; its result no longer fails the run
82
42
  ```
83
43
 
84
- ## Why not an LLM reviewer?
85
-
86
- - **Deterministic.** Same diff in, same signals out. You can gate a pipeline
87
- on it and reproduce any result; there is no prompt to drift and no model
88
- to update under you.
89
- - **Local.** No source upload, no API key, no per-review cost, no telemetry.
90
- It runs offline, including the MCP server.
91
- - **Evidence, not opinions.** Every signal points at a line and states the
92
- structural fact behind it — an auth call count that went down, a request
93
- value reaching `subprocess.run`. Nothing "looks fine."
44
+ These are excerpts of one run ([recording](docs/demos/06-weakened-tests.gif)). Replay it with
45
+ `scripts/demo-weakened-tests.sh <empty-dir>`, then run `repopilot review <empty-dir>`.
94
46
 
95
- LLM reviewers are useful; a deterministic layer under them is what makes
96
- their output checkable.
97
-
98
- ## Install
47
+ ## Install and review
99
48
 
100
49
  ```bash
101
50
  cargo install repopilot
102
51
  # or
103
52
  npm install -g repopilot
104
- ```
105
53
 
106
- Homebrew, GitHub Releases, and source builds:
107
- [Installation](https://github.com/MykytaStel/repopilot/blob/main/docs/install.md).
54
+ repopilot review . --base origin/main
55
+ ```
108
56
 
109
- ## Review a change
57
+ For uncommitted work, run `repopilot review .`. The first screen gives one
58
+ `PASS`, `REVIEW`, `BLOCK`, or `NOT ASSESSED` decision, its reasons, coverage
59
+ limits, and a next action.
110
60
 
111
- ```bash
112
- repopilot review . # working tree vs HEAD
113
- repopilot review . --base origin/main # branch vs main
114
- ```
61
+ A review can surface:
115
62
 
116
- Review groups evidence into tiers: security boundaries (access control,
117
- request trust, deploy surface, supply chain, secrets), behavioral changes
118
- (network, subprocess, filesystem, SQL, removed error handling or auth),
119
- algorithmic shifts, taint-lite flows (changed request/process input reaching
120
- SQL, exec, filesystem-write, or network sinks), broken local imports and
121
- exports (a deleted or renamed file still imported, a removed export still
122
- called under its old name — no compiler required), and blast radius (files
123
- that import what changed).
63
+ - changes to authentication, request trust, deployment, dependencies, or secret
64
+ configuration;
65
+ - added or removed behavior such as network calls, subprocesses, filesystem
66
+ writes, SQL, or error handling;
67
+ - changed input-to-sink paths, algorithmic structure, or local import/export
68
+ contracts;
69
+ - tests the change stopped running or weakened: committed focus markers such as
70
+ `it.only`, newly skipped tests (`it.skip`, `@pytest.mark.skip`, `t.Skip`,
71
+ `#[ignore]`), removed or substituted test cases, tests that lost assertions,
72
+ new lint, type, or coverage suppressions, and relaxed CI or tool gates
73
+ (`continue-on-error`, `|| true`, lowered coverage thresholds, strict mode
74
+ off), so a green run cannot hide them;
75
+ - direct dependents and the wider impact of changed files.
124
76
 
125
- Signals are advisory by default. Gate CI on the high-confidence tier:
77
+ Signals are advisory evidence. For example, a taint-lite signal shows that a
78
+ recognized input can reach a recognized sink in the changed source. Confirm the
79
+ impact in the context of the application and its configured checks.
126
80
 
127
- ```bash
128
- repopilot review . --base origin/main --fail-on-review definitely
129
- ```
81
+ ## Example: review an image-processing change
130
82
 
131
- Every review also resolves to one merge-readiness verdict — `ready`,
132
- `review`, or `blocked` — built from findings, review signals, CODEOWNERS,
133
- and blast radius, with deterministic reason codes and suggested owners.
134
- Console, Markdown, JSON, MCP, and the GitHub Action summary all read the same
135
- ChangeProof and evidence records; machine projections keep the legacy fields
136
- for compatibility.
83
+ The Wagtail example removes an authorization check and passes request data to a
84
+ subprocess in a one-file change. RepoPilot reports both the boundary change and
85
+ the input-to-process flow.
137
86
 
138
- ## Compare risk across runs
87
+ <p align="center">
88
+ <img src="https://raw.githubusercontent.com/MykytaStel/repopilot/main/docs/demos/03-agent-review.gif" alt="RepoPilot review showing a removed authorization check and request input reaching a subprocess" width="800">
89
+ </p>
139
90
 
140
- History is local, bounded, and off by default. Record two compatible
141
- analyses to see what's new, persisting, resolved, or changed severity —
142
- nothing leaves your machine:
91
+ Replay the example on the pinned test repository:
143
92
 
144
93
  ```bash
145
- repopilot review . --record-history
146
- repopilot scan . --record-history
94
+ python3 scripts/zoo.py clone --only wagtail
95
+ scripts/demo-agent-edit.sh .zoo/wagtail
96
+ repopilot review .zoo/wagtail
147
97
  ```
148
98
 
149
- Receipts live under `.repopilot/history/`.
99
+ > A reported flow is a path to investigate. RepoPilot does not prove that it is
100
+ > exploitable or that the application is safe.
150
101
 
151
- To calibrate a known rule to your repository instead of silencing it
152
- project-wide, add a scoped, diffable entry to `.repopilot/overlay.toml`:
102
+ ## Use in a team
153
103
 
154
- ```toml
155
- [[overlay]]
156
- rule = "behavioral.panic-risk"
157
- path = "src/cli/**"
158
- severity = "low"
159
- reason = "CLI handlers can terminate on unrecoverable input"
104
+ Gate a branch review on high-confidence signals:
105
+
106
+ ```bash
107
+ repopilot review . --base origin/main --fail-on-review definitely
160
108
  ```
161
109
 
162
- Overlay decisions stay visible in `--profile strict` and the decision
163
- trace — never a silent post-scan filter. Details:
164
- [Configuration](https://github.com/MykytaStel/repopilot/blob/main/docs/configuration.md).
110
+ A review is `VERIFIED` only when checks configured for the repository are
111
+ explicitly selected with `--verify` and pass on the reviewed revision. Generate
112
+ suggestions for a first setup with
113
+ `repopilot init --suggestions-output repopilot-suggestions.toml`; the file is
114
+ separate from active configuration. See [configuration](docs/configuration.md).
165
115
 
166
- ## Guard an agent run
116
+ For a broader repository view, run `repopilot scan .`. Use
117
+ `repopilot baseline create .` to adopt existing findings before gating new work.
167
118
 
168
- Take a snapshot before the agent starts, review everything it did — commits
169
- and uncommitted edits — when it stops:
119
+ ## Agent and CI integrations
120
+
121
+ The same review can check work from a human or a coding agent. Record a starting
122
+ point and review the changes made since it:
170
123
 
171
124
  ```bash
172
125
  repopilot snapshot
173
- # ... agent session ...
126
+ # Work happens here.
174
127
  repopilot review --since-snapshot
175
128
  ```
176
129
 
177
- To wire this in permanently — a Claude Code hook that reviews every agent
178
- session, an MCP server the agent can query mid-task (`repopilot init
179
- --mcp-client claude|cursor|generic`), or a PR gate via the GitHub Action —
180
- see [Guard your agent runs](https://github.com/MykytaStel/repopilot/blob/main/docs/agent-guardrail.md).
130
+ When the working tree is already dirty, the marker also records a baseline
131
+ commit of those uncommitted files, so the later review covers only what changed
132
+ after the snapshot. It shows what changed, not who changed it.
133
+ See [common workflows](docs/commands.md#review-work-since-a-marker).
134
+
135
+ In Claude Code, the RepoPilot plugin runs that loop for every session and
136
+ stops Claude from finishing while a test it skipped, focused, removed, or
137
+ weakened is unexplained:
138
+
139
+ ```text
140
+ /plugin marketplace add MykytaStel/repopilot
141
+ /plugin install repopilot@repopilot
142
+ ```
143
+
144
+ Codex installs the same plugin (`codex plugin marketplace add
145
+ MykytaStel/repopilot`, then `codex plugin add repopilot@repopilot`). Gemini CLI installs it as an
146
+ extension (`gemini extensions install https://github.com/MykytaStel/repopilot`),
147
+ and Cursor runs it through project hooks. For GitHub Copilot's coding
148
+ agent and other agents, RepoPilot provides setup steps, an MCP entry, and an
149
+ `AGENTS.md` snippet. See [Guard your agent runs](docs/agent-guardrail.md#pick-your-agent).
181
150
 
182
- ## Beyond the diff
151
+ RepoPilot also provides a local stdio MCP server and a GitHub Action. The MCP
152
+ server gives an agent access to the local scan and review tools. The Action runs
153
+ RepoPilot on the Actions runner and can publish SARIF or a pull request summary.
154
+ See [Guard your agent runs](docs/agent-guardrail.md), [MCP server](docs/mcp.md),
155
+ and [GitHub integration](docs/integrations/github-code-scanning.md). MCP Registry
156
+ name: `mcp-name: io.github.MykytaStel/repopilot`.
183
157
 
184
- - `repopilot scan .` — full-repository audit (architecture, coupling,
185
- framework, testing). `repopilot baseline create .` adopts existing debt so
186
- only new findings gate.
187
- - `repopilot ai context .` — one compact Markdown handoff of repository
188
- facts, findings, and a prioritized fix plan for an external assistant.
189
- Local, no LLM calls.
190
- - `repopilot mcp --root .` — the same analysis over stdio for coding agents:
191
- synchronous, root-confined, offline.
158
+ ## More capabilities
192
159
 
193
- Details: [Common workflows](https://github.com/MykytaStel/repopilot/blob/main/docs/commands.md).
160
+ - `repopilot ai context .` creates a local handoff with repository facts,
161
+ findings, and a prioritized plan. It makes no model calls.
162
+ - `repopilot init` creates configuration or integration files for review.
163
+ - Reports are available as console, Markdown, JSON, HTML, and SARIF.
194
164
 
195
165
  ## Documentation
196
166
 
197
- - [Documentation index](https://github.com/MykytaStel/repopilot/blob/main/docs/README.md)
198
- - [Guard your agent runs](https://github.com/MykytaStel/repopilot/blob/main/docs/agent-guardrail.md)
199
- - [CLI reference](https://github.com/MykytaStel/repopilot/blob/main/docs/cli.md)
200
- - [Configuration](https://github.com/MykytaStel/repopilot/blob/main/docs/configuration.md)
201
- - [Reports and schemas](https://github.com/MykytaStel/repopilot/blob/main/docs/reports.md)
202
- - [GitHub pull request integration](https://github.com/MykytaStel/repopilot/blob/main/docs/integrations/github-code-scanning.md)
203
-
204
- Contributing and development commands: [CONTRIBUTING.md](CONTRIBUTING.md).
167
+ - [Install](docs/install.md) · [Common workflows](docs/commands.md) ·
168
+ [CLI reference](docs/cli.md)
169
+ - [Current architecture](docs/architecture.md) ·
170
+ [Reports and schemas](docs/reports.md) · [Security model](docs/security.md)
171
+ - [Language support](docs/language-support.md) ·
172
+ [Rules reference](docs/rules-reference.md) · [Roadmap](docs/roadmap.md)
173
+ - [Latest stable release notes](docs/releases/v0.23.0.md) ·
174
+ [Prepared 0.24 release notes](docs/releases/v0.24.0.md) ·
175
+ [Maintainer documentation](docs/engineering/README.md)
176
+
177
+ Contributing and development setup: [CONTRIBUTING.md](CONTRIBUTING.md).
205
178
 
206
179
  ## License
207
180
 
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "repopilot",
3
- "version": "0.23.0",
3
+ "version": "0.24.0",
4
+ "mcpName": "io.github.MykytaStel/repopilot",
4
5
  "description": "Local-first CLI for reviewing Git changes, security boundaries, and blast radius before merge.",
5
6
  "license": "MIT OR Apache-2.0",
6
7
  "repository": {
@@ -21,7 +22,7 @@
21
22
  "product:smoke": "bash scripts/smoke-product.sh",
22
23
  "release:contract": "python3 scripts/release-contract.py check",
23
24
  "test:release-contract": "python3 -m unittest discover -s scripts/tests -p 'test_*.py'",
24
- "review:performance": "node scripts/check-review-performance.js",
25
+ "review:performance": "node --test scripts/review-performance-large-diff.test.js && node scripts/check-review-performance.js",
25
26
  "scan:performance": "node scripts/check-scan-performance.js",
26
27
  "scan:resource": "python3 scripts/scan_resource_matrix.py"
27
28
  },
@@ -31,11 +32,11 @@
31
32
  "LICENSE"
32
33
  ],
33
34
  "optionalDependencies": {
34
- "@repopilot/darwin-arm64": "0.23.0",
35
- "@repopilot/darwin-x64": "0.23.0",
36
- "@repopilot/linux-arm64-gnu": "0.23.0",
37
- "@repopilot/linux-x64-gnu": "0.23.0",
38
- "@repopilot/win32-x64-msvc": "0.23.0"
35
+ "@repopilot/darwin-arm64": "0.24.0",
36
+ "@repopilot/darwin-x64": "0.24.0",
37
+ "@repopilot/linux-arm64-gnu": "0.24.0",
38
+ "@repopilot/linux-x64-gnu": "0.24.0",
39
+ "@repopilot/win32-x64-msvc": "0.24.0"
39
40
  },
40
41
  "keywords": [
41
42
  "cli",