repopilot 0.22.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 +112 -136
  2. package/package.json +9 -8
package/README.md CHANGED
@@ -5,189 +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:
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:
28
26
 
29
27
  ```text
30
- ⚑ access control changed — wagtail/images/views/images.py
31
- ⚑ auth check removed — wagtail/images/views/images.py:264
32
- Authentication/authorization check removed (auth calls: 1 -> 0)
33
- ⚑ subprocess/exec added — wagtail/images/views/images.py:270
34
- ⚑ untrusted input reaches subprocess/exec — wagtail/images/views/images.py:270
35
- HTTP request input reaches subprocess/exec: subprocess.run("mogrify -quality " + quality + ...
36
- ⚠ 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
37
35
  ```
38
36
 
39
- The edit is scripted so you can replay it on the pinned Wagtail checkout
40
- RepoPilot uses for regression testing — but it is the kind of diff agents
41
- 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>`.
42
40
 
43
- ```bash
44
- python3 scripts/zoo.py clone --only wagtail
45
- scripts/demo-agent-edit.sh .zoo/wagtail
46
- repopilot review .zoo/wagtail
47
- ```
41
+ ## Install and review
48
42
 
49
- The same review works across languages — the identical flow in a Spring
50
- controller (`scripts/demo-java-agent-edit.sh` on the pinned PetClinic
51
- checkout) is caught the same way.
43
+ ```bash
44
+ cargo install repopilot
45
+ # or
46
+ npm install -g repopilot
52
47
 
53
- > RepoPilot reports structural evidence, not a security verdict. A flagged
54
- > flow is a path to verify, not a confirmed vulnerability. Use it beside
55
- > tests, linters, and dedicated security tools.
48
+ repopilot review . --base origin/main
49
+ ```
56
50
 
57
- ## Catch broken code, not just risky code
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.
58
54
 
59
- A tidy-looking rename and file move — nothing a diff review would flag on its
60
- own — quietly breaks two callers that still expect the old names. No compiler
61
- runs; both are AST-plus-resolver proofs.
55
+ A review can surface:
62
56
 
63
- <p align="center">
64
- <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">
65
- </p>
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.
66
70
 
67
- ```bash
68
- scripts/demo-broken-code-review.sh
69
- ```
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.
70
74
 
71
- ## Why not an LLM reviewer?
75
+ ## Example: review an image-processing change
72
76
 
73
- - **Deterministic.** Same diff in, same signals out. You can gate a pipeline
74
- on it and reproduce any result; there is no prompt to drift and no model
75
- to update under you.
76
- - **Local.** No source upload, no API key, no per-review cost, no telemetry.
77
- It runs offline, including the MCP server.
78
- - **Evidence, not opinions.** Every signal points at a line and states the
79
- structural fact behind it — an auth call count that went down, a request
80
- value reaching `subprocess.run`. Nothing "looks fine."
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.
81
80
 
82
- LLM reviewers are useful; a deterministic layer under them is what makes
83
- their output checkable.
81
+ <p align="center">
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">
83
+ </p>
84
84
 
85
- ## Install
85
+ Replay the example on the pinned test repository:
86
86
 
87
87
  ```bash
88
- cargo install repopilot
89
- # or
90
- 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
91
91
  ```
92
92
 
93
- Homebrew, GitHub Releases, and source builds:
94
- [Installation](https://github.com/MykytaStel/repopilot/blob/main/docs/install.md).
95
-
96
- ## 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.
97
95
 
98
- ```bash
99
- repopilot review . # working tree vs HEAD
100
- repopilot review . --base origin/main # branch vs main
101
- ```
102
-
103
- Review groups evidence into tiers: security boundaries (access control,
104
- request trust, deploy surface, supply chain, secrets), behavioral changes
105
- (network, subprocess, filesystem, SQL, removed error handling or auth),
106
- algorithmic shifts, taint-lite flows (changed request/process input reaching
107
- SQL, exec, filesystem-write, or network sinks), broken local imports and
108
- exports (a deleted or renamed file still imported, a removed export still
109
- called under its old name — no compiler required), and blast radius (files
110
- that import what changed).
96
+ ## Use in a team
111
97
 
112
- Signals are advisory by default. Gate CI on the high-confidence tier:
98
+ Gate a branch review on high-confidence signals:
113
99
 
114
100
  ```bash
115
101
  repopilot review . --base origin/main --fail-on-review definitely
116
102
  ```
117
103
 
118
- Every review also resolves to one merge-readiness verdict — `ready`,
119
- `review`, or `blocked` — built from findings, review signals, CODEOWNERS,
120
- and blast radius, with deterministic reason codes and suggested owners.
121
- Console, Markdown, JSON, MCP, and the GitHub Action summary all read the
122
- same record.
123
-
124
- ## Compare risk across runs
125
-
126
- History is local, bounded, and off by default. Record two compatible
127
- analyses to see what's new, persisting, resolved, or changed severity —
128
- 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).
129
109
 
130
- ```bash
131
- repopilot review . --record-history
132
- repopilot scan . --record-history
133
- ```
110
+ For a broader repository view, run `repopilot scan .`. Use
111
+ `repopilot baseline create .` to adopt existing findings before gating new work.
134
112
 
135
- Receipts live under `.repopilot/history/`.
113
+ ## Agent and CI integrations
136
114
 
137
- To calibrate a known rule to your repository instead of silencing it
138
- 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:
139
117
 
140
- ```toml
141
- [[overlay]]
142
- rule = "behavioral.panic-risk"
143
- path = "src/cli/**"
144
- severity = "low"
145
- reason = "CLI handlers can terminate on unrecoverable input"
118
+ ```bash
119
+ repopilot snapshot
120
+ # Work happens here.
121
+ repopilot review --since-snapshot
146
122
  ```
147
123
 
148
- Overlay decisions stay visible in `--profile strict` and the decision
149
- trace — never a silent post-scan filter. Details:
150
- [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).
151
128
 
152
- ## 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:
153
132
 
154
- Take a snapshot before the agent starts, review everything it did — commits
155
- and uncommitted edits — when it stops:
156
-
157
- ```bash
158
- repopilot snapshot
159
- # ... agent session ...
160
- repopilot review --since-snapshot
133
+ ```text
134
+ /plugin marketplace add MykytaStel/repopilot
135
+ /plugin install repopilot@repopilot
161
136
  ```
162
137
 
163
- To wire this in permanently — a Claude Code hook that reviews every agent
164
- session, an MCP server the agent can query mid-task (`repopilot init
165
- --mcp-client claude|cursor|generic`), or a PR gate via the GitHub Action —
166
- 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).
167
141
 
168
- ## 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).
169
147
 
170
- - `repopilot scan .` — full-repository audit (architecture, coupling,
171
- framework, testing). `repopilot baseline create .` adopts existing debt so
172
- only new findings gate.
173
- - `repopilot ai context .` — one compact Markdown handoff of repository
174
- facts, findings, and a prioritized fix plan for an external assistant.
175
- Local, no LLM calls.
176
- - `repopilot mcp --root .` — the same analysis over stdio for coding agents:
177
- synchronous, root-confined, offline.
148
+ ## More capabilities
178
149
 
179
- 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.
180
154
 
181
155
  ## Documentation
182
156
 
183
- - [Documentation index](https://github.com/MykytaStel/repopilot/blob/main/docs/README.md)
184
- - [Guard your agent runs](https://github.com/MykytaStel/repopilot/blob/main/docs/agent-guardrail.md)
185
- - [CLI reference](https://github.com/MykytaStel/repopilot/blob/main/docs/cli.md)
186
- - [Configuration](https://github.com/MykytaStel/repopilot/blob/main/docs/configuration.md)
187
- - [Reports and schemas](https://github.com/MykytaStel/repopilot/blob/main/docs/reports.md)
188
- - [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)
189
165
 
190
- Contributing and development commands: [CONTRIBUTING.md](CONTRIBUTING.md).
166
+ Contributing and development setup: [CONTRIBUTING.md](CONTRIBUTING.md).
191
167
 
192
168
  ## License
193
169
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "repopilot",
3
- "version": "0.22.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,8 +21,9 @@
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",
25
- "scan:performance": "node scripts/check-scan-performance.js"
24
+ "review:performance": "node --test scripts/review-performance-large-diff.test.js && node scripts/check-review-performance.js",
25
+ "scan:performance": "node scripts/check-scan-performance.js",
26
+ "scan:resource": "python3 scripts/scan_resource_matrix.py"
26
27
  },
27
28
  "files": [
28
29
  "bin",
@@ -30,11 +31,11 @@
30
31
  "LICENSE"
31
32
  ],
32
33
  "optionalDependencies": {
33
- "@repopilot/darwin-arm64": "0.22.0",
34
- "@repopilot/darwin-x64": "0.22.0",
35
- "@repopilot/linux-arm64-gnu": "0.22.0",
36
- "@repopilot/linux-x64-gnu": "0.22.0",
37
- "@repopilot/win32-x64-msvc": "0.22.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"
38
39
  },
39
40
  "keywords": [
40
41
  "cli",