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.
- package/README.md +112 -136
- package/package.json +9 -8
package/README.md
CHANGED
|
@@ -5,189 +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:
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
⚑
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
-
|
|
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
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
```bash
|
|
44
|
+
cargo install repopilot
|
|
45
|
+
# or
|
|
46
|
+
npm install -g repopilot
|
|
52
47
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
> tests, linters, and dedicated security tools.
|
|
48
|
+
repopilot review . --base origin/main
|
|
49
|
+
```
|
|
56
50
|
|
|
57
|
-
|
|
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
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
-
##
|
|
75
|
+
## Example: review an image-processing change
|
|
72
76
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
83
|
-
|
|
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
|
-
|
|
85
|
+
Replay the example on the pinned test repository:
|
|
86
86
|
|
|
87
87
|
```bash
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
131
|
-
repopilot
|
|
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
|
-
|
|
113
|
+
## Agent and CI integrations
|
|
136
114
|
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
```
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
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
|
-
|
|
155
|
-
|
|
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
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
- [
|
|
184
|
-
|
|
185
|
-
- [
|
|
186
|
-
|
|
187
|
-
- [
|
|
188
|
-
|
|
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
|
|
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.
|
|
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.
|
|
34
|
-
"@repopilot/darwin-x64": "0.
|
|
35
|
-
"@repopilot/linux-arm64-gnu": "0.
|
|
36
|
-
"@repopilot/linux-x64-gnu": "0.
|
|
37
|
-
"@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"
|
|
38
39
|
},
|
|
39
40
|
"keywords": [
|
|
40
41
|
"cli",
|