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.
- package/README.md +121 -148
- package/package.json +8 -7
package/README.md
CHANGED
|
@@ -5,203 +5,176 @@
|
|
|
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 .` lists them right after its decision:
|
|
29
26
|
|
|
30
27
|
```text
|
|
31
28
|
Decision: REVIEW (Change Proof: REVIEW)
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
107
|
-
|
|
54
|
+
repopilot review . --base origin/main
|
|
55
|
+
```
|
|
108
56
|
|
|
109
|
-
|
|
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
|
-
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
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
|
|
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
|
-
|
|
128
|
-
repopilot review . --base origin/main --fail-on-review definitely
|
|
129
|
-
```
|
|
81
|
+
## Example: review an image-processing change
|
|
130
82
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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
|
-
|
|
152
|
-
project-wide, add a scoped, diffable entry to `.repopilot/overlay.toml`:
|
|
102
|
+
## Use in a team
|
|
153
103
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
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
|
-
|
|
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
|
-
|
|
169
|
-
|
|
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
|
-
#
|
|
126
|
+
# Work happens here.
|
|
174
127
|
repopilot review --since-snapshot
|
|
175
128
|
```
|
|
176
129
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
- [
|
|
198
|
-
|
|
199
|
-
- [
|
|
200
|
-
|
|
201
|
-
- [
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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.
|
|
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.
|
|
35
|
-
"@repopilot/darwin-x64": "0.
|
|
36
|
-
"@repopilot/linux-arm64-gnu": "0.
|
|
37
|
-
"@repopilot/linux-x64-gnu": "0.
|
|
38
|
-
"@repopilot/win32-x64-msvc": "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",
|