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.
- package/README.md +111 -149
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -5,203 +5,165 @@
|
|
|
5
5
|
[](https://github.com/MykytaStel/repopilot/actions)
|
|
6
6
|
[](LICENSE)
|
|
7
7
|
|
|
8
|
-
**
|
|
8
|
+
**Local, deterministic review for Git changes.**
|
|
9
9
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
44
|
+
cargo install repopilot
|
|
45
|
+
# or
|
|
46
|
+
npm install -g repopilot
|
|
47
|
+
|
|
48
|
+
repopilot review . --base origin/main
|
|
55
49
|
```
|
|
56
50
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
##
|
|
75
|
+
## Example: review an image-processing change
|
|
71
76
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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/
|
|
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
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
-
|
|
107
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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
|
-
|
|
145
|
-
repopilot
|
|
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
|
-
|
|
113
|
+
## Agent and CI integrations
|
|
150
114
|
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
```
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
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
|
-
|
|
169
|
-
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
- [
|
|
198
|
-
|
|
199
|
-
- [
|
|
200
|
-
|
|
201
|
-
- [
|
|
202
|
-
|
|
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
|
|
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.
|
|
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.
|
|
35
|
-
"@repopilot/darwin-x64": "0.
|
|
36
|
-
"@repopilot/linux-arm64-gnu": "0.
|
|
37
|
-
"@repopilot/linux-x64-gnu": "0.
|
|
38
|
-
"@repopilot/win32-x64-msvc": "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",
|