rocket-review 0.1.1__tar.gz
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.
- rocket_review-0.1.1/LICENSE +201 -0
- rocket_review-0.1.1/PKG-INFO +289 -0
- rocket_review-0.1.1/README.md +260 -0
- rocket_review-0.1.1/pyproject.toml +41 -0
- rocket_review-0.1.1/rocket_review/__init__.py +0 -0
- rocket_review-0.1.1/rocket_review/__main__.py +3 -0
- rocket_review-0.1.1/rocket_review/backends/__init__.py +13 -0
- rocket_review-0.1.1/rocket_review/backends/api.py +187 -0
- rocket_review-0.1.1/rocket_review/backends/base.py +151 -0
- rocket_review-0.1.1/rocket_review/backends/claude.py +64 -0
- rocket_review-0.1.1/rocket_review/backends/codex.py +44 -0
- rocket_review-0.1.1/rocket_review/backends/opencode.py +28 -0
- rocket_review-0.1.1/rocket_review/cli.py +617 -0
- rocket_review-0.1.1/rocket_review/models.py +156 -0
- rocket_review-0.1.1/rocket_review/prompts.py +238 -0
- rocket_review-0.1.1/rocket_review.egg-info/PKG-INFO +289 -0
- rocket_review-0.1.1/rocket_review.egg-info/SOURCES.txt +24 -0
- rocket_review-0.1.1/rocket_review.egg-info/dependency_links.txt +1 -0
- rocket_review-0.1.1/rocket_review.egg-info/entry_points.txt +2 -0
- rocket_review-0.1.1/rocket_review.egg-info/requires.txt +10 -0
- rocket_review-0.1.1/rocket_review.egg-info/top_level.txt +1 -0
- rocket_review-0.1.1/setup.cfg +4 -0
- rocket_review-0.1.1/tests/test_backends.py +715 -0
- rocket_review-0.1.1/tests/test_cli.py +551 -0
- rocket_review-0.1.1/tests/test_docs.py +83 -0
- rocket_review-0.1.1/tests/test_models.py +210 -0
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Copyright 2026 LedgerRocket
|
|
190
|
+
|
|
191
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
|
+
you may not use this file except in compliance with the License.
|
|
193
|
+
You may obtain a copy of the License at
|
|
194
|
+
|
|
195
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
196
|
+
|
|
197
|
+
Unless required by applicable law or agreed to in writing, software
|
|
198
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
199
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
200
|
+
See the License for the specific language governing permissions and
|
|
201
|
+
limitations under the License.
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: rocket-review
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Second-opinion code and plan reviews from Codex, Claude Code, opencode, or the OpenAI API — one CLI
|
|
5
|
+
License-Expression: Apache-2.0
|
|
6
|
+
Project-URL: Repository, https://github.com/ledger-rocket/rocket-review
|
|
7
|
+
Project-URL: Issues, https://github.com/ledger-rocket/rocket-review/issues
|
|
8
|
+
Keywords: code-review,llm,ai,cli,developer-tools
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Operating System :: POSIX
|
|
13
|
+
Classifier: Operating System :: MacOS
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
17
|
+
Requires-Python: >=3.13
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Provides-Extra: api
|
|
21
|
+
Requires-Dist: openai>=1.68; extra == "api"
|
|
22
|
+
Provides-Extra: dev
|
|
23
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
24
|
+
Requires-Dist: ruff>=0.6; extra == "dev"
|
|
25
|
+
Requires-Dist: mypy>=1.18; extra == "dev"
|
|
26
|
+
Requires-Dist: yamllint>=1.37; extra == "dev"
|
|
27
|
+
Requires-Dist: rocket-review[api]; extra == "dev"
|
|
28
|
+
Dynamic: license-file
|
|
29
|
+
|
|
30
|
+
# rocket-review
|
|
31
|
+
|
|
32
|
+
[](https://github.com/ledger-rocket/rocket-review/actions/workflows/ci.yml)
|
|
33
|
+
[](https://opensource.org/licenses/Apache-2.0)
|
|
34
|
+
[](https://www.python.org/downloads/)
|
|
35
|
+
[](https://pypi.org/project/rocket-review/)
|
|
36
|
+
|
|
37
|
+
**`rr` — a second opinion on your code, from a model that didn't write it.**
|
|
38
|
+
|
|
39
|
+
> **v0.1 — experimental.** Interfaces and flags may change. Read
|
|
40
|
+
> [Security & data flow](#security--data-flow) before pointing it at anything sensitive.
|
|
41
|
+
|
|
42
|
+
One small CLI that sends your plan, diff, commit, or PR to an agentic reviewer
|
|
43
|
+
(Codex CLI, Claude Code, or opencode) that explores your project before judging —
|
|
44
|
+
then gives you prose or structured JSON you can gate CI on.
|
|
45
|
+
|
|
46
|
+
Single-model local review is built into the vendor CLIs now (`codex review`,
|
|
47
|
+
Claude Code's `/code-review`) — `rr` exists for what a single vendor can't give
|
|
48
|
+
you: a second opinion from a *different* vendor's model, in one command, from any
|
|
49
|
+
shell, editor, agent, or CI.
|
|
50
|
+
|
|
51
|
+
`rr` is deliberately **not a PR bot**. It reviews before you push — the point is
|
|
52
|
+
that the issues get fixed before a PR exists. It posts nothing anywhere; if you
|
|
53
|
+
want PR comments, pipe the `--json` envelope into whatever posts them.
|
|
54
|
+
|
|
55
|
+
## What a review looks like
|
|
56
|
+
|
|
57
|
+
Reviewing an uncommitted diff that quietly breaks a billing invariant
|
|
58
|
+
(`rr --diff`, abridged):
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
[HIGH] billing.py — `split_evenly` no longer preserves the input total
|
|
62
|
+
> The documented contract says the returned list "always sums to exactly
|
|
63
|
+
> `total_cents`," but the new implementation rounds one share and repeats it.
|
|
64
|
+
> For inputs like `split_evenly(100, 3)` it returns `[33, 33, 33]`, summing to 99.
|
|
65
|
+
> Suggested fix:
|
|
66
|
+
base = total_cents // n
|
|
67
|
+
parts = [base] * n
|
|
68
|
+
for i in range(total_cents - base * n):
|
|
69
|
+
parts[i] += 1
|
|
70
|
+
return parts
|
|
71
|
+
|
|
72
|
+
- Change Assessment: Do not merge
|
|
73
|
+
- Top Issues: The changed implementation loses cents and breaks the documented
|
|
74
|
+
remainder allocation contract.
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The reviewer read the function's docstring and reasoned about its contract before
|
|
78
|
+
flagging the regression — not a pattern match on the diff.
|
|
79
|
+
|
|
80
|
+
## Why
|
|
81
|
+
|
|
82
|
+
- **Cross-vendor review** — the model that wrote the code shouldn't be the only one
|
|
83
|
+
grading it: a model reviewing its own output inherits its own blind spots, and a
|
|
84
|
+
vendor's built-in reviewer is always the same family that wrote the code. Implement
|
|
85
|
+
with Claude, review with GPT; implement with Codex, review with Claude; or
|
|
86
|
+
`--backend codex,claude` fans out to both and shows you where they disagree.
|
|
87
|
+
- **Plans are reviewable too** — `rr plan.md` stress-tests a design doc *before*
|
|
88
|
+
you build it. Most review tools only understand diffs.
|
|
89
|
+
- **Standards-aware** — `--docs` auto-discovers `llms.txt`, `AGENTS.md`, or
|
|
90
|
+
`CLAUDE.md` (or takes explicit paths) and the reviewer flags deviations from
|
|
91
|
+
*your* documented rules, not generic style opinions.
|
|
92
|
+
- **CI-gateable** — `--json --fail-on high` exits 2 when a high-severity finding
|
|
93
|
+
lands. Pipe the envelope to `jq` or your bot of choice.
|
|
94
|
+
|
|
95
|
+
## Install
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
pipx install rocket-review
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Or the latest from source:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
pipx install git+https://github.com/ledger-rocket/rocket-review.git
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Requires Python 3.13+ and at least one backend:
|
|
108
|
+
|
|
109
|
+
- [Codex CLI](https://github.com/openai/codex) (default backend)
|
|
110
|
+
- [Claude Code](https://claude.com/claude-code) (`--backend claude`)
|
|
111
|
+
- [opencode](https://opencode.ai) (`--backend opencode` — any provider, including local models; **experimental**, see below)
|
|
112
|
+
- or none of the above: `--backend api` (or the `--api` shorthand) calls the OpenAI API directly — set `OPENAI_API_KEY` and install the SDK extra: `pipx install 'rocket-review[api]'` (or `pipx inject rocket-review openai` into an existing install)
|
|
113
|
+
|
|
114
|
+
`--pr` also needs the [gh CLI](https://cli.github.com).
|
|
115
|
+
|
|
116
|
+
## Usage
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
rr plan.md # stress-test a plan before building
|
|
120
|
+
rr --diff # review uncommitted changes
|
|
121
|
+
rr --staged # review staged changes only
|
|
122
|
+
rr --commit abc1234 # review a commit
|
|
123
|
+
rr --pr 123 # review a GitHub PR (number, URL, or branch)
|
|
124
|
+
rr --pr 123 --repo acme/api-server # ...from outside that repo's checkout
|
|
125
|
+
git diff HEAD~3 | rr # pipe anything
|
|
126
|
+
rr src/auth.py --docs # review files against your documented standards
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### Pick your reviewer
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
rr --diff --backend claude # Claude reviews (read-only sandbox)
|
|
133
|
+
rr --diff --backend opencode:ollama/qwen3 # fully local (opencode → Ollama)
|
|
134
|
+
rr --diff --backend codex,claude # both, side by side
|
|
135
|
+
rr --diff --backend codex:gpt-5.6-sol,claude:claude-opus-4-8
|
|
136
|
+
rr --diff --effort high # more reasoning effort (per-backend flag)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Model names: the codex backend passes no `-m`, so it honors your codex default
|
|
140
|
+
(set `model` in `~/.codex/config.toml`). On ChatGPT plans use `gpt-5.6-sol`, the
|
|
141
|
+
ChatGPT-account-accessible 5.6 variant — codex signed into a ChatGPT account rejects
|
|
142
|
+
the bare `gpt-5.6` alias and `gpt-5.6-codex`. The `--backend api` path (API-key auth)
|
|
143
|
+
defaults to `gpt-5.6-terra` — balanced cost/quality. Use `--model gpt-5.6-sol` for
|
|
144
|
+
max quality (flagship pricing) or `gpt-5.6-luna` for the cheapest tier. rr always
|
|
145
|
+
uses explicit, suffixed model names and never relies on the bare `gpt-5.6` alias,
|
|
146
|
+
which points at the flagship today but can be remapped by OpenAI.
|
|
147
|
+
Use `--effort` to set reasoning effort; values differ per backend (codex/api accept
|
|
148
|
+
e.g. `minimal|low|medium|high`, claude `low|medium|high|xhigh|max`) and an unsupported
|
|
149
|
+
value fails loudly at the backend. opencode has no effort flag, so `--effort` errors
|
|
150
|
+
if opencode is among the selected backends. Heavy `--effort high` reviews — especially
|
|
151
|
+
on reasoning models — can outrun the default 900s (15 min) subprocess timeout; raise it
|
|
152
|
+
with `--timeout 1800`.
|
|
153
|
+
|
|
154
|
+
The Codex and Claude backends run agentically in read-only mode: they navigate your
|
|
155
|
+
project — imports, tests, related files — before judging. That context is what makes the
|
|
156
|
+
review worth reading. The `api` backend is the exception — it calls the OpenAI API
|
|
157
|
+
directly on the supplied content plus any files it references, without navigating your
|
|
158
|
+
project.
|
|
159
|
+
|
|
160
|
+
> **opencode is experimental.** The integration works, but end-to-end review
|
|
161
|
+
> reliability depends on the provider you have configured, and non-interactive
|
|
162
|
+
> `opencode run` can restrict the read-only `plan` agent's tools. `rr` materializes the
|
|
163
|
+
> diff and feeds the prompt to opencode on stdin so it always reviews the real change,
|
|
164
|
+
> but for a gated CI check prefer `codex` or `claude`. The local-model value prop stands
|
|
165
|
+
> — point opencode at Ollama to keep everything on your machine — just verify its output
|
|
166
|
+
> before trusting it as a gate.
|
|
167
|
+
|
|
168
|
+
### Structured output
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
rr --diff --json | jq '.findings[] | {severity, title, backend}'
|
|
172
|
+
rr --staged --json --fail-on high && git commit # block the commit on high+ findings
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
Every finding carries `severity, title, file, line, why, fix, backend, model`.
|
|
176
|
+
The envelope leads with a `summary` block — `findings_total`, per-severity counts
|
|
177
|
+
(explicit zeros for absent severities), `worst_severity`, per-backend verdicts, and
|
|
178
|
+
the `gate` result when `--fail-on` is set — so an agent gets the counts and the
|
|
179
|
+
gate answer without parsing the findings array. Backend output over 4000 chars is
|
|
180
|
+
truncated inline — `raw` keeps the head plus a marker naming the full length — so the
|
|
181
|
+
envelope stays bounded and no review text (which may quote proprietary code) is written
|
|
182
|
+
to disk; pass `--full` to inline the untruncated output instead. Parse failures and
|
|
183
|
+
backend errors fail the gate closed.
|
|
184
|
+
|
|
185
|
+
## Review modes
|
|
186
|
+
|
|
187
|
+
- `plan` — auto-detected for `.md`/`.txt`/`.plan` files: completeness, ordering, risks, over-engineering.
|
|
188
|
+
- `code` — source files: correctness, security, performance, maintainability.
|
|
189
|
+
- `diff` — for `--diff`/`--staged`/`--commit`/`--pr`/stdin: bugs introduced, missing changes, contract breaks.
|
|
190
|
+
|
|
191
|
+
Override with `--mode`, add focus with `--prompt "check the locking"`.
|
|
192
|
+
|
|
193
|
+
## Project standards (`--docs`)
|
|
194
|
+
|
|
195
|
+
Point the reviewer at your project's standards docs — it flags deviations from
|
|
196
|
+
*your* documented rules:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
rr src/auth.py --docs # auto-discovers llms.txt / AGENTS.md / CLAUDE.md
|
|
200
|
+
rr src/auth.py --docs docs/standards.md docs/smells.md
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Relative markdown links inside the docs are followed one level, so an index file
|
|
204
|
+
(like `llms.txt`) pulls in everything it references. Bare `--docs` errors if none of
|
|
205
|
+
`llms.txt` / `AGENTS.md` / `CLAUDE.md` exist in the current directory — pass explicit
|
|
206
|
+
paths when your standards live elsewhere. `--llms [PATH]` is kept as a compatibility
|
|
207
|
+
alias for `--docs [PATH]`, defaulting to `llms.txt`.
|
|
208
|
+
|
|
209
|
+
## How it works
|
|
210
|
+
|
|
211
|
+
`rr` assembles a review prompt — a mode-specific rubric, your standards docs, and
|
|
212
|
+
the plan or diff under review — and hands it to an agentic CLI (Codex, Claude Code,
|
|
213
|
+
or opencode) running read-only inside your project. Because the reviewer runs
|
|
214
|
+
*in* your checkout, it can open imports, tests, and related files to understand
|
|
215
|
+
context before it judges, rather than reasoning from the diff alone. It then
|
|
216
|
+
returns either prose or a parsed findings envelope (`--json`). There is no
|
|
217
|
+
rocket-review server in the loop: the only thing that leaves your machine is the
|
|
218
|
+
review request — the diff or plan, your standards docs, and any files the reviewer
|
|
219
|
+
opens — sent to whichever backend and provider you chose. Point `rr` at a local
|
|
220
|
+
opencode/Ollama model to keep everything on your machine.
|
|
221
|
+
|
|
222
|
+
## Security & data flow
|
|
223
|
+
|
|
224
|
+
`rr` runs the reviewer in a **read-only sandbox** (no writes to your files), but
|
|
225
|
+
read-only is not the same as safe:
|
|
226
|
+
|
|
227
|
+
- Your code leaves your machine. Each review sends the diff/plan, your standards
|
|
228
|
+
docs, and any files the reviewer opens to **that backend's provider** — codex/api →
|
|
229
|
+
OpenAI, claude → Anthropic, opencode → whichever provider you configured (point it
|
|
230
|
+
at a local Ollama model to keep everything on your machine).
|
|
231
|
+
- Read-only stops *writes*, not *reads*. An agent can still read any secret your shell
|
|
232
|
+
can (`.env`, `~/.aws`, tokens) and send it upstream.
|
|
233
|
+
- Untrusted input can prompt-inject the reviewer — a hostile PR body, diff, comment,
|
|
234
|
+
or `AGENTS.md` can try to steer an agentic backend. Be especially careful with `--pr`
|
|
235
|
+
on a dev machine.
|
|
236
|
+
|
|
237
|
+
**Don't run agentic backends against untrusted repos or PRs on a machine where readable
|
|
238
|
+
secrets exist.** See [SECURITY.md](SECURITY.md) for the full threat model and how to
|
|
239
|
+
report a vulnerability.
|
|
240
|
+
|
|
241
|
+
## Requirements
|
|
242
|
+
|
|
243
|
+
- **Python** ≥ 3.13
|
|
244
|
+
- **OS** — macOS or Linux
|
|
245
|
+
- **A backend CLI**, installed and authenticated — you only need the one(s) you use:
|
|
246
|
+
- `codex` — [Codex CLI](https://github.com/openai/codex), signed in with your ChatGPT/OpenAI account
|
|
247
|
+
- `claude` — [Claude Code](https://claude.com/claude-code), on a Claude subscription or API key. Needs a version supporting `--permission-mode manual` (Claude Code 2.1.x+); older CLIs fail the review closed with a usage error. Check with `claude --help | grep -A3 permission-mode`.
|
|
248
|
+
- `opencode` — [opencode](https://opencode.ai), configured for any provider (including a local Ollama model)
|
|
249
|
+
- `api` — no CLI, but needs the OpenAI SDK (`pipx install 'rocket-review[api]'`, or `pipx inject rocket-review openai`); set `OPENAI_API_KEY` and `rr` calls the OpenAI API directly
|
|
250
|
+
- `gh` CLI, authenticated, for `--pr`
|
|
251
|
+
|
|
252
|
+
## Agent integration
|
|
253
|
+
|
|
254
|
+
Drop into your `CLAUDE.md` / `AGENTS.md`:
|
|
255
|
+
|
|
256
|
+
```markdown
|
|
257
|
+
Before pushing non-trivial changes, run `rr --diff --docs` and address the findings.
|
|
258
|
+
For plans, run `rr plan.md --docs` before implementing. Use a 900000ms timeout.
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Notes
|
|
262
|
+
|
|
263
|
+
- Every backend runs in a read-only sandbox on your project — **no writes**: Codex
|
|
264
|
+
runs with `-s read-only`, Claude Code with a read-only tool allowlist under
|
|
265
|
+
`--permission-mode manual`, and opencode with its built-in read-only `plan` agent
|
|
266
|
+
(edit/write denied at the tool level). Read-only stops writes; it does not stop the
|
|
267
|
+
agent *reading* readable secrets and sending them to the backend's provider — see
|
|
268
|
+
[Security & data flow](#security--data-flow).
|
|
269
|
+
- `--fail-on` requires `--json`.
|
|
270
|
+
- Exit codes: 0 no gate tripped · 1 operational error (or every backend failed) · 2 findings at/above `--fail-on`. A partial backend failure warns on stderr but still exits 0 — gate CI with `--json --fail-on` to fail closed.
|
|
271
|
+
|
|
272
|
+
## Contributing
|
|
273
|
+
|
|
274
|
+
Issues and PRs are welcome. To set up a dev environment:
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
python3 -m venv .venv
|
|
278
|
+
.venv/bin/pip install -e ".[dev]"
|
|
279
|
+
.venv/bin/pytest -q # run the tests
|
|
280
|
+
.venv/bin/ruff check . # lint
|
|
281
|
+
.venv/bin/mypy rocket_review/ # type-check
|
|
282
|
+
.venv/bin/yamllint . # yaml lint
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
CI gates all four plus a package build — run them before opening a PR.
|
|
286
|
+
|
|
287
|
+
## License
|
|
288
|
+
|
|
289
|
+
Apache-2.0 licensed. See [LICENSE](LICENSE).
|