repopilot 0.23.0 → 0.24.0-rc.1

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 +111 -149
  2. package/package.json +7 -7
package/README.md CHANGED
@@ -5,203 +5,165 @@
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 .` reports each of these with its file and line:
29
26
 
30
27
  ```text
31
- 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.
28
+ Review signals [preview]:
29
+ Definitely sensitive:
30
+ ⚑ deploy surface changed — .github/workflows/ci.yml
31
+ Maybe sensitive:
32
+ ⚑ check gate relaxed — .github/workflows/ci.yml:10 check step `npm test` in job `test` now has `continue-on-error: true`
33
+ ⚑ assertions removed — src/pricing.test.ts:5 "applyDiscount > takes a percentage off the total": assertions 2 → 1
34
+ ⚑ test skipped — src/pricing.test.ts:9 `it.skip` added on "rejects a discount above 100%"; its result no longer fails the run
45
35
  ```
46
36
 
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:
37
+ This is an excerpt. The full output starts with a `REVIEW` decision and its
38
+ reasons ([recording](docs/demos/06-weakened-tests.gif)). Replay it with
39
+ `scripts/demo-weakened-tests.sh <empty-dir>`, then run `repopilot review <empty-dir>`.
40
+
41
+ ## Install and review
50
42
 
51
43
  ```bash
52
- python3 scripts/zoo.py clone --only wagtail
53
- scripts/demo-agent-edit.sh .zoo/wagtail
54
- repopilot review .zoo/wagtail
44
+ cargo install repopilot
45
+ # or
46
+ npm install -g repopilot
47
+
48
+ repopilot review . --base origin/main
55
49
  ```
56
50
 
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.
51
+ For uncommitted work, run `repopilot review .`. The first screen gives one
52
+ `PASS`, `REVIEW`, `BLOCK`, or `NOT ASSESSED` decision, its reasons, coverage
53
+ limits, and a next action.
54
+
55
+ A review can surface:
60
56
 
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.
57
+ - changes to authentication, request trust, deployment, dependencies, or secret
58
+ configuration;
59
+ - added or removed behavior such as network calls, subprocesses, filesystem
60
+ writes, SQL, or error handling;
61
+ - changed input-to-sink paths, algorithmic structure, or local import/export
62
+ contracts;
63
+ - tests the change stopped running or weakened: committed focus markers such as
64
+ `it.only`, newly skipped tests (`it.skip`, `@pytest.mark.skip`, `t.Skip`,
65
+ `#[ignore]`), removed or substituted test cases, tests that lost assertions,
66
+ new lint, type, or coverage suppressions, and relaxed CI or tool gates
67
+ (`continue-on-error`, `|| true`, lowered coverage thresholds, strict mode
68
+ off), so a green run cannot hide them;
69
+ - direct dependents and the wider impact of changed files.
64
70
 
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.
71
+ Signals are advisory evidence. For example, a taint-lite signal shows that a
72
+ recognized input can reach a recognized sink in the changed source. Confirm the
73
+ impact in the context of the application and its configured checks.
69
74
 
70
- ## Catch broken code, not just risky code
75
+ ## Example: review an image-processing change
71
76
 
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.
77
+ The Wagtail example removes an authorization check and passes request data to a
78
+ subprocess in a one-file change. RepoPilot reports both the boundary change and
79
+ the input-to-process flow.
75
80
 
76
81
  <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">
82
+ <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">
78
83
  </p>
79
84
 
80
- ```bash
81
- scripts/demo-broken-code-review.sh
82
- ```
83
-
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."
94
-
95
- LLM reviewers are useful; a deterministic layer under them is what makes
96
- their output checkable.
97
-
98
- ## Install
85
+ Replay the example on the pinned test repository:
99
86
 
100
87
  ```bash
101
- cargo install repopilot
102
- # or
103
- npm install -g repopilot
88
+ python3 scripts/zoo.py clone --only wagtail
89
+ scripts/demo-agent-edit.sh .zoo/wagtail
90
+ repopilot review .zoo/wagtail
104
91
  ```
105
92
 
106
- Homebrew, GitHub Releases, and source builds:
107
- [Installation](https://github.com/MykytaStel/repopilot/blob/main/docs/install.md).
108
-
109
- ## Review a change
93
+ > A reported flow is a path to investigate. RepoPilot does not prove that it is
94
+ > exploitable or that the application is safe.
110
95
 
111
- ```bash
112
- repopilot review . # working tree vs HEAD
113
- repopilot review . --base origin/main # branch vs main
114
- ```
115
-
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).
96
+ ## Use in a team
124
97
 
125
- Signals are advisory by default. Gate CI on the high-confidence tier:
98
+ Gate a branch review on high-confidence signals:
126
99
 
127
100
  ```bash
128
101
  repopilot review . --base origin/main --fail-on-review definitely
129
102
  ```
130
103
 
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.
137
-
138
- ## Compare risk across runs
139
-
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:
104
+ A review is `VERIFIED` only when checks configured for the repository are
105
+ explicitly selected with `--verify` and pass on the reviewed revision. Generate
106
+ suggestions for a first setup with
107
+ `repopilot init --suggestions-output repopilot-suggestions.toml`; the file is
108
+ separate from active configuration. See [configuration](docs/configuration.md).
143
109
 
144
- ```bash
145
- repopilot review . --record-history
146
- repopilot scan . --record-history
147
- ```
110
+ For a broader repository view, run `repopilot scan .`. Use
111
+ `repopilot baseline create .` to adopt existing findings before gating new work.
148
112
 
149
- Receipts live under `.repopilot/history/`.
113
+ ## Agent and CI integrations
150
114
 
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`:
115
+ The same review can check work from a human or a coding agent. Record a starting
116
+ point and review the changes made since it:
153
117
 
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"
118
+ ```bash
119
+ repopilot snapshot
120
+ # Work happens here.
121
+ repopilot review --since-snapshot
160
122
  ```
161
123
 
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).
124
+ When the working tree is already dirty, the marker also records a baseline
125
+ commit of those uncommitted files, so the later review covers only what changed
126
+ after the snapshot. It shows what changed, not who changed it.
127
+ See [common workflows](docs/commands.md#review-work-since-a-marker).
165
128
 
166
- ## Guard an agent run
129
+ In Claude Code, the RepoPilot plugin runs that loop for every session and
130
+ stops Claude from finishing while a test it skipped, focused, removed, or
131
+ weakened is unexplained:
167
132
 
168
- Take a snapshot before the agent starts, review everything it did — commits
169
- and uncommitted edits — when it stops:
170
-
171
- ```bash
172
- repopilot snapshot
173
- # ... agent session ...
174
- repopilot review --since-snapshot
133
+ ```text
134
+ /plugin marketplace add MykytaStel/repopilot
135
+ /plugin install repopilot@repopilot
175
136
  ```
176
137
 
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).
138
+ In Cursor, two project hooks run the same loop and send the agent one
139
+ follow-up message listing what it weakened. See
140
+ [Guard your agent runs](docs/agent-guardrail.md).
181
141
 
182
- ## Beyond the diff
142
+ RepoPilot also provides a local stdio MCP server and a GitHub Action. The MCP
143
+ server gives an agent access to the local scan and review tools. The Action runs
144
+ RepoPilot on the Actions runner and can publish SARIF or a pull request summary.
145
+ See [Guard your agent runs](docs/agent-guardrail.md), [MCP server](docs/mcp.md),
146
+ and [GitHub integration](docs/integrations/github-code-scanning.md).
183
147
 
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.
148
+ ## More capabilities
192
149
 
193
- Details: [Common workflows](https://github.com/MykytaStel/repopilot/blob/main/docs/commands.md).
150
+ - `repopilot ai context .` creates a local handoff with repository facts,
151
+ findings, and a prioritized plan. It makes no model calls.
152
+ - `repopilot init` creates configuration or integration files for review.
153
+ - Reports are available as console, Markdown, JSON, HTML, and SARIF.
194
154
 
195
155
  ## Documentation
196
156
 
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)
157
+ - [Install](docs/install.md) · [Common workflows](docs/commands.md) ·
158
+ [CLI reference](docs/cli.md)
159
+ - [Current architecture](docs/architecture.md) ·
160
+ [Reports and schemas](docs/reports.md) · [Security model](docs/security.md)
161
+ - [Language support](docs/language-support.md) ·
162
+ [Rules reference](docs/rules-reference.md) · [Roadmap](docs/roadmap.md)
163
+ - [Latest release notes](docs/releases/v0.23.0.md) ·
164
+ [Maintainer documentation](docs/engineering/README.md)
203
165
 
204
- Contributing and development commands: [CONTRIBUTING.md](CONTRIBUTING.md).
166
+ Contributing and development setup: [CONTRIBUTING.md](CONTRIBUTING.md).
205
167
 
206
168
  ## License
207
169
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "repopilot",
3
- "version": "0.23.0",
3
+ "version": "0.24.0-rc.1",
4
4
  "description": "Local-first CLI for reviewing Git changes, security boundaries, and blast radius before merge.",
5
5
  "license": "MIT OR Apache-2.0",
6
6
  "repository": {
@@ -21,7 +21,7 @@
21
21
  "product:smoke": "bash scripts/smoke-product.sh",
22
22
  "release:contract": "python3 scripts/release-contract.py check",
23
23
  "test:release-contract": "python3 -m unittest discover -s scripts/tests -p 'test_*.py'",
24
- "review:performance": "node scripts/check-review-performance.js",
24
+ "review:performance": "node --test scripts/review-performance-large-diff.test.js && node scripts/check-review-performance.js",
25
25
  "scan:performance": "node scripts/check-scan-performance.js",
26
26
  "scan:resource": "python3 scripts/scan_resource_matrix.py"
27
27
  },
@@ -31,11 +31,11 @@
31
31
  "LICENSE"
32
32
  ],
33
33
  "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"
34
+ "@repopilot/darwin-arm64": "0.24.0-rc.1",
35
+ "@repopilot/darwin-x64": "0.24.0-rc.1",
36
+ "@repopilot/linux-arm64-gnu": "0.24.0-rc.1",
37
+ "@repopilot/linux-x64-gnu": "0.24.0-rc.1",
38
+ "@repopilot/win32-x64-msvc": "0.24.0-rc.1"
39
39
  },
40
40
  "keywords": [
41
41
  "cli",