@reviewsensei/cli-win32-x64 0.1.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/LICENSE +21 -0
- package/README.md +4 -0
- package/bin/_internal/VCRUNTIME140.dll +0 -0
- package/bin/_internal/_asyncio.pyd +0 -0
- package/bin/_internal/_bz2.pyd +0 -0
- package/bin/_internal/_cffi_backend.cp311-win_amd64.pyd +0 -0
- package/bin/_internal/_ctypes.pyd +0 -0
- package/bin/_internal/_decimal.pyd +0 -0
- package/bin/_internal/_hashlib.pyd +0 -0
- package/bin/_internal/_lzma.pyd +0 -0
- package/bin/_internal/_multiprocessing.pyd +0 -0
- package/bin/_internal/_overlapped.pyd +0 -0
- package/bin/_internal/_queue.pyd +0 -0
- package/bin/_internal/_socket.pyd +0 -0
- package/bin/_internal/_ssl.pyd +0 -0
- package/bin/_internal/_uuid.pyd +0 -0
- package/bin/_internal/api-ms-win-core-console-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-datetime-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-debug-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-errorhandling-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-fibers-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-fibers-l1-1-1.dll +0 -0
- package/bin/_internal/api-ms-win-core-file-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-file-l1-2-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-file-l2-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-handle-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-heap-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-interlocked-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-kernel32-legacy-l1-1-1.dll +0 -0
- package/bin/_internal/api-ms-win-core-libraryloader-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-localization-l1-2-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-memory-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-namedpipe-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-processenvironment-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-processthreads-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-processthreads-l1-1-1.dll +0 -0
- package/bin/_internal/api-ms-win-core-profile-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-rtlsupport-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-string-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-synch-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-synch-l1-2-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-sysinfo-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-sysinfo-l1-2-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-timezone-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-core-util-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-conio-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-convert-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-environment-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-filesystem-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-heap-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-locale-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-math-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-process-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-runtime-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-stdio-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-string-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-time-l1-1-0.dll +0 -0
- package/bin/_internal/api-ms-win-crt-utility-l1-1-0.dll +0 -0
- package/bin/_internal/attrs-26.1.0.dist-info/INSTALLER +1 -0
- package/bin/_internal/attrs-26.1.0.dist-info/METADATA +199 -0
- package/bin/_internal/attrs-26.1.0.dist-info/RECORD +55 -0
- package/bin/_internal/attrs-26.1.0.dist-info/WHEEL +4 -0
- package/bin/_internal/attrs-26.1.0.dist-info/licenses/LICENSE +21 -0
- package/bin/_internal/base_library.zip +0 -0
- package/bin/_internal/cryptography/hazmat/bindings/_rust.pyd +0 -0
- package/bin/_internal/cryptography-50.0.1.dist-info/INSTALLER +1 -0
- package/bin/_internal/cryptography-50.0.1.dist-info/METADATA +110 -0
- package/bin/_internal/cryptography-50.0.1.dist-info/RECORD +199 -0
- package/bin/_internal/cryptography-50.0.1.dist-info/WHEEL +4 -0
- package/bin/_internal/cryptography-50.0.1.dist-info/licenses/LICENSE +3 -0
- package/bin/_internal/cryptography-50.0.1.dist-info/licenses/LICENSE.APACHE +202 -0
- package/bin/_internal/cryptography-50.0.1.dist-info/licenses/LICENSE.BSD +27 -0
- package/bin/_internal/cryptography-50.0.1.dist-info/sboms/cryptography-rust.cyclonedx.json +1365 -0
- package/bin/_internal/cryptography-50.0.1.dist-info/sboms/sbom.json +43 -0
- package/bin/_internal/jsonschema/benchmarks/issue232/issue.json +2653 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/INSTALLER +1 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/METADATA +170 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/RECORD +82 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/WHEEL +4 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/entry_points.txt +2 -0
- package/bin/_internal/jsonschema-4.26.0.dist-info/licenses/COPYING +19 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/metaschema.json +42 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/applicator +56 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/content +17 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/core +57 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/format +14 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/meta-data +37 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/validation +98 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/metaschema.json +58 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/applicator +48 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/content +17 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/core +51 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/format-annotation +14 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/format-assertion +14 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/meta-data +37 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/unevaluated +15 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/validation +98 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft3/metaschema.json +172 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft4/metaschema.json +149 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft6/metaschema.json +153 -0
- package/bin/_internal/jsonschema_specifications/schemas/draft7/metaschema.json +166 -0
- package/bin/_internal/libcrypto-3.dll +0 -0
- package/bin/_internal/libffi-8.dll +0 -0
- package/bin/_internal/libssl-3.dll +0 -0
- package/bin/_internal/pyexpat.pyd +0 -0
- package/bin/_internal/python3.dll +0 -0
- package/bin/_internal/python311.dll +0 -0
- package/bin/_internal/review_sensei/default_categories/01-correctness.json +8 -0
- package/bin/_internal/review_sensei/default_categories/02-security.json +8 -0
- package/bin/_internal/review_sensei/default_categories/03-architecture.json +24 -0
- package/bin/_internal/review_sensei/default_categories/03-maintainability.json +8 -0
- package/bin/_internal/review_sensei/default_categories/04-tests.json +8 -0
- package/bin/_internal/review_sensei/default_stages/01-default-review.json +16 -0
- package/bin/_internal/review_sensei/schemas/concurrency-plan.schema.json +26 -0
- package/bin/_internal/review_sensei/schemas/conversation-reply.schema.json +16 -0
- package/bin/_internal/review_sensei/schemas/evaluation-corpus.schema.json +316 -0
- package/bin/_internal/review_sensei/schemas/evaluation-report.schema.json +371 -0
- package/bin/_internal/review_sensei/schemas/learning-entry.schema.json +37 -0
- package/bin/_internal/review_sensei/schemas/learning-proposal.schema.json +19 -0
- package/bin/_internal/review_sensei/schemas/review-category.schema.json +77 -0
- package/bin/_internal/review_sensei/schemas/review-comment.schema.json +16 -0
- package/bin/_internal/review_sensei/schemas/review-result.schema.json +53 -0
- package/bin/_internal/review_sensei/schemas/review-stage.schema.json +154 -0
- package/bin/_internal/review_sensei/schemas/stage.schema.json +88 -0
- package/bin/_internal/review_sensei-0.1.0.dist-info/INSTALLER +1 -0
- package/bin/_internal/review_sensei-0.1.0.dist-info/METADATA +542 -0
- package/bin/_internal/review_sensei-0.1.0.dist-info/RECORD +103 -0
- package/bin/_internal/review_sensei-0.1.0.dist-info/REQUESTED +0 -0
- package/bin/_internal/review_sensei-0.1.0.dist-info/WHEEL +5 -0
- package/bin/_internal/review_sensei-0.1.0.dist-info/direct_url.json +1 -0
- package/bin/_internal/review_sensei-0.1.0.dist-info/entry_points.txt +2 -0
- package/bin/_internal/review_sensei-0.1.0.dist-info/licenses/LICENSE +21 -0
- package/bin/_internal/review_sensei-0.1.0.dist-info/top_level.txt +1 -0
- package/bin/_internal/rpds/rpds.cp311-win_amd64.pyd +0 -0
- package/bin/_internal/select.pyd +0 -0
- package/bin/_internal/ucrtbase.dll +0 -0
- package/bin/_internal/unicodedata.pyd +0 -0
- package/bin/review-sensei.exe +0 -0
- package/package.json +13 -0
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: review-sensei
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Provider-neutral AI code review engine with an Ollama adapter.
|
|
5
|
+
Author: Mohamad Alsabbagh
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/malsabbagh/review-sensei
|
|
8
|
+
Project-URL: Source, https://github.com/malsabbagh/review-sensei
|
|
9
|
+
Project-URL: Issues, https://github.com/malsabbagh/review-sensei/issues
|
|
10
|
+
Project-URL: Documentation, https://github.com/malsabbagh/review-sensei/tree/main/docs
|
|
11
|
+
Project-URL: Changelog, https://github.com/malsabbagh/review-sensei/blob/main/CHANGELOG.md
|
|
12
|
+
Project-URL: Security, https://github.com/malsabbagh/review-sensei/blob/main/SECURITY.md
|
|
13
|
+
Keywords: code-review,github,ollama,ai,developer-tools
|
|
14
|
+
Classifier: Development Status :: 3 - Alpha
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
22
|
+
Requires-Python: >=3.11
|
|
23
|
+
Description-Content-Type: text/markdown
|
|
24
|
+
License-File: LICENSE
|
|
25
|
+
Requires-Dist: cryptography<51,>=44
|
|
26
|
+
Requires-Dist: jsonschema<5,>=4.18
|
|
27
|
+
Dynamic: license-file
|
|
28
|
+
|
|
29
|
+
# ReviewSensei
|
|
30
|
+
|
|
31
|
+
ReviewSensei is an open-source, provider-neutral AI code review engine. It turns
|
|
32
|
+
unified pull-request diffs into validated summaries and inline findings. Ollama
|
|
33
|
+
is the first supported model provider, with a small adapter seam for additional
|
|
34
|
+
providers later.
|
|
35
|
+
|
|
36
|
+
> Alpha: this repository provides an open-source review engine and CLI. The
|
|
37
|
+
> primary usage path is running ReviewSensei in your own GitHub Actions
|
|
38
|
+
> workflow. Setup-v4 callers follow the operator-managed public `v4` tag; the
|
|
39
|
+
> Worker validates that tag before creating the setup PR and the broker resolves
|
|
40
|
+
> it again when issuing a capability. The example workflow installs the
|
|
41
|
+
> requested exact package from PyPI first and falls back to its executing commit
|
|
42
|
+
> only when the distribution is unavailable. It
|
|
43
|
+
> defaults to a local Ollama endpoint and does not require a hosted backend.
|
|
44
|
+
|
|
45
|
+
## What it does
|
|
46
|
+
|
|
47
|
+
- Keeps review business logic independent of GitHub and model vendors.
|
|
48
|
+
- Sends a structured prompt to a replaceable provider adapter.
|
|
49
|
+
- Requires provider output to be valid JSON.
|
|
50
|
+
- Rejects inline comments that target files or lines outside the supplied diff.
|
|
51
|
+
- Supports local Ollama servers and Ollama Cloud through the same adapter.
|
|
52
|
+
- Loads approved repository-local learnings and returns validated learning proposals.
|
|
53
|
+
- Supports ordered review stages with structured categories and explicit focus
|
|
54
|
+
items.
|
|
55
|
+
- Selects lenses by changed path and can attach bounded, lens-specific
|
|
56
|
+
learnings and architecture documents from a trusted target checkout.
|
|
57
|
+
- Exposes a host-independent concurrency plan with latest-wins pull-request
|
|
58
|
+
runs and one provider slot per pull request.
|
|
59
|
+
- Publishes versioned JSON Schemas for review results, learnings, categories,
|
|
60
|
+
stages, and concurrency plans.
|
|
61
|
+
- Provides a narrow GitHub App JWT and installation-token auth adapter for
|
|
62
|
+
optional App-identity comments or reviews.
|
|
63
|
+
- Avoids retaining raw prompts and provider responses in the engine.
|
|
64
|
+
|
|
65
|
+
## Quick start
|
|
66
|
+
|
|
67
|
+
ReviewSensei supports Python 3.11, 3.12, 3.13, and 3.14:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
python3 -m venv .venv
|
|
71
|
+
source .venv/bin/activate
|
|
72
|
+
python -m pip install .
|
|
73
|
+
review-sensei --version
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
The default is a local Ollama server using Qwen3.5 4B. Leave the API key empty
|
|
77
|
+
and select the local mode:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
export REVIEWSENSEI_PROVIDER_MODE="local"
|
|
81
|
+
export REVIEWSENSEI_LOCAL_MODEL="qwen3.5:4b"
|
|
82
|
+
unset OLLAMA_API_KEY
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Ollama Cloud is explicit opt-in:
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
export OLLAMA_API_KEY="your-key"
|
|
89
|
+
export REVIEWSENSEI_PROVIDER_MODE="cloud"
|
|
90
|
+
export REVIEWSENSEI_CLOUD_MODEL="deepseek-v4-flash:cloud"
|
|
91
|
+
unset OLLAMA_BASE_URL OLLAMA_MODEL
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Run through npx
|
|
95
|
+
|
|
96
|
+
Node.js 22 or newer can invoke the same Python review engine through the
|
|
97
|
+
provider-neutral `@reviewsensei/cli` launcher:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
npx --yes @reviewsensei/cli@0.1.0 --version
|
|
101
|
+
npx --yes @reviewsensei/cli@0.1.0 --help
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
The launcher selects one of the five native packages (macOS arm64/x64,
|
|
105
|
+
glibc Linux arm64/x64, or Windows x64), forwards arguments unchanged, and
|
|
106
|
+
does not contain a JavaScript review engine. It has no install/download hook;
|
|
107
|
+
`prepare-diff` still requires an external `git` executable. Provider and
|
|
108
|
+
configuration flags are identical to the Python CLI above. Linux musl and
|
|
109
|
+
other architectures receive a bounded unsupported-target error.
|
|
110
|
+
|
|
111
|
+
The package version is intentionally identical to the Python project and
|
|
112
|
+
release tag. See [`docs/installation.md`](docs/installation.md),
|
|
113
|
+
[`docs/releasing.md`](docs/releasing.md), and [ADR 0031](docs/adr/0031-npm-launcher-and-standalone-platform-packages.md)
|
|
114
|
+
for prerequisites, release ordering, provenance, and version-forward rollback
|
|
115
|
+
guidance (internal tracking issue #103).
|
|
116
|
+
|
|
117
|
+
Generate a bounded diff and run a review:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
review-sensei prepare-diff \
|
|
121
|
+
--repository . \
|
|
122
|
+
--base-ref main \
|
|
123
|
+
--head-ref feature \
|
|
124
|
+
--output pr.patch
|
|
125
|
+
review-sensei \
|
|
126
|
+
--diff pr.patch \
|
|
127
|
+
--repository owner/repository \
|
|
128
|
+
--pull-request 42 \
|
|
129
|
+
--title "Reviewable change" \
|
|
130
|
+
--learning-root /path/to/target-branch-checkout \
|
|
131
|
+
--context-root /path/to/target-branch-checkout \
|
|
132
|
+
--output review.json
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
The output is a validated JSON document containing `summary`, `comments`,
|
|
136
|
+
`provider`, `model`, and `learning_proposals`. Learning proposals are not
|
|
137
|
+
stored or used automatically.
|
|
138
|
+
|
|
139
|
+
The published schema files live under `src/review_sensei/schemas/` and are
|
|
140
|
+
included in the installed package. Public compatibility rules, CLI flags, error
|
|
141
|
+
categories, and provider protocol expectations are documented in
|
|
142
|
+
[`docs/public-contracts.md`](docs/public-contracts.md).
|
|
143
|
+
|
|
144
|
+
The package also includes the repository contract schemas
|
|
145
|
+
[`review-category.schema.json`](src/review_sensei/schemas/review-category.schema.json),
|
|
146
|
+
[`review-stage.schema.json`](src/review_sensei/schemas/review-stage.schema.json),
|
|
147
|
+
and [`learning-entry.schema.json`](src/review_sensei/schemas/learning-entry.schema.json)
|
|
148
|
+
used by the repository contract validator. Runtime loaders remain the semantic
|
|
149
|
+
authority after structural validation.
|
|
150
|
+
|
|
151
|
+
## GitHub App identity
|
|
152
|
+
|
|
153
|
+
Optional App-identity publication is documented in
|
|
154
|
+
[`docs/github-app-auth.md`](docs/github-app-auth.md). It is a narrow
|
|
155
|
+
authentication adapter for GitHub App JWTs and installation access tokens; it
|
|
156
|
+
is not a hosted review service, webhook receiver, or durable delivery store.
|
|
157
|
+
|
|
158
|
+
### GitHub App setup-v4 integration
|
|
159
|
+
|
|
160
|
+
The optional setup-v4 integration adds a reviewable, generated caller by using
|
|
161
|
+
the operator-managed `v4` git tag as the only update channel:
|
|
162
|
+
`malsabbagh/review-sensei/.github/workflows/review-sensei-run.yml@v4`.
|
|
163
|
+
The Worker validates the tag before writing the caller, and the Cloudflare
|
|
164
|
+
broker resolves the same tag at capability exchange time and checks the
|
|
165
|
+
executing workflow SHA. Moving `v4` is therefore the public cutoff action.
|
|
166
|
+
The selected provider mode applies consistently to automatic pull-request
|
|
167
|
+
reviews, manual reviews, learning proposals, artifacts, and authorized
|
|
168
|
+
`@sensei` conversations. Cloud runs use GitHub-hosted compute; local runs use
|
|
169
|
+
the operator-controlled labeled self-hosted runner. Every generated write
|
|
170
|
+
switch defaults to `false`.
|
|
171
|
+
|
|
172
|
+
Cloud mode may pass the existing customer-owned `OLLAMA_API_KEY` secret by
|
|
173
|
+
name (`secrets.OLLAMA_API_KEY`) to the public reusable workflow. The App
|
|
174
|
+
does not create, read, persist, log, or reveal that secret value. The Worker
|
|
175
|
+
broker only issues one capability-scoped installation token after verifying
|
|
176
|
+
the signed Actions OIDC identity, exact v4 workflow ref and runtime SHA,
|
|
177
|
+
repository identity, fork status, installation, replay state, and rate limit.
|
|
178
|
+
|
|
179
|
+
Installation, reinstall, permission-acceptance, and repository-added events
|
|
180
|
+
reconcile absent or older generated clients through at most one setup-v4 PR.
|
|
181
|
+
Current v4 is a no-op; managed v3 and older generated clients are migrated
|
|
182
|
+
through a setup PR, while custom, malformed, and future setup files are no-write
|
|
183
|
+
cases. See [`docs/installation.md`](docs/installation.md),
|
|
184
|
+
[`docs/github-app-registration.md`](docs/github-app-registration.md), and the
|
|
185
|
+
proposed [`docs/adr/0025-cloud-local-feature-parity-and-conversation-reactions.md`](docs/adr/0025-cloud-local-feature-parity-and-conversation-reactions.md).
|
|
186
|
+
The optional OIDC broker documented there is a hosted issuance-only backend
|
|
187
|
+
that never distributes the App private key.
|
|
188
|
+
|
|
189
|
+
## Offline evaluation
|
|
190
|
+
|
|
191
|
+
Issue #9 includes a synthetic, CC0-1.0 corpus that runs without network access
|
|
192
|
+
or provider credentials:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
python scripts/validate_evaluation_corpus.py
|
|
196
|
+
review-sensei evaluate --mode fixture --corpus evaluation/v1/corpus.json \
|
|
197
|
+
--output evaluation-report.json
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
Fixture evaluation is a deterministic regression signal, not a broad model
|
|
201
|
+
benchmark. See [`docs/evaluation.md`](docs/evaluation.md) for live-provider
|
|
202
|
+
acknowledgements, privacy limits, metrics, and approval policy.
|
|
203
|
+
|
|
204
|
+
The corpus also documents an exact standalone fixture-provider check. Use the
|
|
205
|
+
pinned `fixture-v1` model when comparing the output to the off-by-one oracle;
|
|
206
|
+
the normal CLI default is `qwen3.5:4b` in local mode.
|
|
207
|
+
|
|
208
|
+
## Bounded review contract
|
|
209
|
+
|
|
210
|
+
All diff text, paths, source comments, repository context, model output, and
|
|
211
|
+
configured metadata are untrusted. The provider-neutral core validates them
|
|
212
|
+
before a provider call and validates the complete result before a publisher can
|
|
213
|
+
consume it. The public defaults are a hard ceiling; an embedding application
|
|
214
|
+
may only tighten them:
|
|
215
|
+
|
|
216
|
+
```python
|
|
217
|
+
from review_sensei import ReviewLimits, ReviewRequest
|
|
218
|
+
|
|
219
|
+
limits = ReviewLimits(max_diff_bytes=256_000, max_comments=40)
|
|
220
|
+
request = ReviewRequest(diff=diff_text, limits=limits)
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
The default profile is: diff 1,048,576 bytes, 50,000 lines, 500 files, and
|
|
224
|
+
5,000 hunks; repository metadata 512 bytes; title 4,096 bytes; instructions
|
|
225
|
+
65,536 bytes; 64 metadata pairs with 128-byte keys and 4,096-byte values;
|
|
226
|
+
model identifiers 256 bytes; 100 learning entries; 64 active categories; 64
|
|
227
|
+
lens contexts; rendered prompts 4,194,304 bytes; provider response envelopes
|
|
228
|
+
1,048,576 bytes; summary 32,768 bytes; 250 comments with 16,384-byte bodies;
|
|
229
|
+
100 learning proposals with 16,384 bytes per serialized proposal and 262,144
|
|
230
|
+
bytes for the compact UTF-8 serialization of the complete proposal array
|
|
231
|
+
(including brackets and separators); 2,097,152 bytes per publisher-facing
|
|
232
|
+
result; and line numbers up to 2,147,483,647. These are byte limits unless a
|
|
233
|
+
unit is stated otherwise.
|
|
234
|
+
|
|
235
|
+
Repository paths are strict canonical NFC UTF-8, `/`-separated, relative paths:
|
|
236
|
+
no empty, dot, parent, absolute, drive/UNC, backslash, surrounding whitespace,
|
|
237
|
+
control/format/surrogate, or silently normalized forms are accepted. Glob
|
|
238
|
+
tokens are allowed only in pattern fields; real Git paths may contain literal
|
|
239
|
+
glob characters and are preserved without being interpreted. Git C-quoted
|
|
240
|
+
paths are decoded as strict bytes before the same path checks. Exact duplicate
|
|
241
|
+
comments identified by `(path, line, body)` use stable first-wins ordering;
|
|
242
|
+
comments that differ in body remain distinct. Expected failures are sanitized
|
|
243
|
+
and never include a prompt, diff, provider body, credential, or supplied secret
|
|
244
|
+
marker. Invalid structured provider output receives one fresh, sanitized
|
|
245
|
+
correction attempt per stage; the rejected attempt is discarded completely and
|
|
246
|
+
a second invalid response fails closed. Transport and resource-limit failures
|
|
247
|
+
are not retried by this policy.
|
|
248
|
+
|
|
249
|
+
Migration is code-free: canonicalize paths before constructing requests, replace
|
|
250
|
+
context-source `path: "."` with explicit root-level files/directories, and split
|
|
251
|
+
inputs that exceed a hard ceiling. Rollback is also code-only: revert the
|
|
252
|
+
limits/validation integration and restore the prior parser, constructors, and
|
|
253
|
+
provider read boundary; no stored data migration is required.
|
|
254
|
+
|
|
255
|
+
## Structured review stages
|
|
256
|
+
|
|
257
|
+
Pass `--stages-dir` to replace the packaged default stage with an ordered set of
|
|
258
|
+
JSON stage files. Reusable review categories—also called lenses—can live in a
|
|
259
|
+
separate directory with one JSON file per category:
|
|
260
|
+
|
|
261
|
+
```json
|
|
262
|
+
{
|
|
263
|
+
"id": "correctness",
|
|
264
|
+
"title": "Correctness",
|
|
265
|
+
"focus": [
|
|
266
|
+
"Incorrect behavior and invalid assumptions",
|
|
267
|
+
"Boundary conditions and error handling"
|
|
268
|
+
],
|
|
269
|
+
"applies_to": ["src/**", "tests/**"]
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
Stages reference the stable category ids:
|
|
274
|
+
|
|
275
|
+
```json
|
|
276
|
+
{
|
|
277
|
+
"name": "Correctness and security",
|
|
278
|
+
"outputs": ["comments"],
|
|
279
|
+
"category_ids": ["correctness", "security"],
|
|
280
|
+
"prompt_template": "Examine every focus item below. Use only its id as a comment category.\n<review-categories>\n{review_categories}\n</review-categories>\n<pull-request-diff>\n{diff}\n</pull-request-diff>"
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
Run it with:
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
review-sensei --diff pr.patch --stages-dir examples/stages \
|
|
288
|
+
--categories-dir examples/categories \
|
|
289
|
+
--context-root /path/to/target-branch-checkout
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
`--categories-dir` requires `--stages-dir`. Category files are loaded into a
|
|
293
|
+
validated catalog, and each stage's `category_ids` are resolved in the declared
|
|
294
|
+
order. An unknown or duplicate id fails before any provider call. For a small,
|
|
295
|
+
self-contained stage, the original inline `categories` array remains supported;
|
|
296
|
+
a stage cannot use inline categories and `category_ids` together.
|
|
297
|
+
|
|
298
|
+
Supported outputs are `summary`, `comments`, and `learning_proposals`.
|
|
299
|
+
Available placeholders are `{diff}`, `{repository}`, `{pull_request}`, `{title}`,
|
|
300
|
+
`{instructions}`, `{learnings}`, `{context_text}`, `{proposal_instruction}`,
|
|
301
|
+
`{review_categories}`, and `{review_context}`. A stage that declares categories
|
|
302
|
+
must include `{review_categories}`. If any of its categories declares context,
|
|
303
|
+
the stage must also include `{review_context}`. If the provider assigns a
|
|
304
|
+
category to a comment, it must use one of the active stage ids; classification
|
|
305
|
+
is optional for compatibility. If multiple stages reuse an id, the entire lens
|
|
306
|
+
definition must be identical.
|
|
307
|
+
|
|
308
|
+
Inline findings may also carry independent `severity` (`critical`, `high`,
|
|
309
|
+
`medium`, or `low`) and `fix_effort` (`trivial`, `small`, `moderate`, `large`,
|
|
310
|
+
or `unknown`) labels. Severity describes likely impact, while fix effort
|
|
311
|
+
describes remediation scope rather than a time estimate. The existing
|
|
312
|
+
`category` id is the lens source and is shown as a human-readable lens label;
|
|
313
|
+
no composite priority score or second `lens` field is emitted. These fields are
|
|
314
|
+
optional so legacy provider results remain valid. When present, the same labels
|
|
315
|
+
appear on inline GitHub comments and deterministic severity/lens/quick-win
|
|
316
|
+
counts appear in the review summary. Labels are validated as printable,
|
|
317
|
+
bounded provider text and Markdown-escaped before publication so untrusted
|
|
318
|
+
output cannot inject structure or exceed the configured comment-body limit.
|
|
319
|
+
The formatted summary is checked against `max_summary_bytes`, and the complete
|
|
320
|
+
framed GitHub review body is bounded to 65,536 bytes before publication.
|
|
321
|
+
|
|
322
|
+
Stage files are trusted operator configuration because they control the model's
|
|
323
|
+
instructions. Category files have the same trust boundary. Load both from a
|
|
324
|
+
reviewed target-branch checkout or deployment bundle, never from an untrusted
|
|
325
|
+
pull-request head. Empty directories, duplicate ids or stage names, symlinked
|
|
326
|
+
files, oversized configurations, malformed categories, unknown fields or
|
|
327
|
+
references, and unknown placeholders fail before a provider is called. See
|
|
328
|
+
[`examples/categories`](examples/categories) and
|
|
329
|
+
[`examples/stages`](examples/stages) for a reusable catalog and three-stage
|
|
330
|
+
pipeline.
|
|
331
|
+
|
|
332
|
+
### Lens applicability and context
|
|
333
|
+
|
|
334
|
+
Each lens applies to the whole diff by default. Set `applies_to` to activate it
|
|
335
|
+
only when at least one changed repository path matches. `*` matches within one
|
|
336
|
+
path segment and `**` matches zero or more complete segments, so `src/**`
|
|
337
|
+
includes arbitrarily nested source files. Deleted paths and both sides of a
|
|
338
|
+
rename participate in lens selection. A lens can also select approved learning
|
|
339
|
+
categories and explicit document sources:
|
|
340
|
+
|
|
341
|
+
```json
|
|
342
|
+
{
|
|
343
|
+
"id": "architecture",
|
|
344
|
+
"title": "Architecture",
|
|
345
|
+
"focus": [
|
|
346
|
+
"Layer boundaries and dependency direction",
|
|
347
|
+
"Consistency with architecture documents and decision records"
|
|
348
|
+
],
|
|
349
|
+
"applies_to": ["**"],
|
|
350
|
+
"context": {
|
|
351
|
+
"learnings": {
|
|
352
|
+
"categories": ["architecture"],
|
|
353
|
+
"include_uncategorized": true
|
|
354
|
+
},
|
|
355
|
+
"documents": [
|
|
356
|
+
{"path": "AGENTS.md"},
|
|
357
|
+
{"path": "docs/architecture.md"},
|
|
358
|
+
{"path": "docs/architecture", "include": ["**/*.md"]},
|
|
359
|
+
{"path": "docs/adr", "include": ["**/*.md"], "exclude": ["drafts/**"]}
|
|
360
|
+
]
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
`--context-root` identifies the trusted target-branch checkout. When omitted it
|
|
366
|
+
falls back to `--learning-root`; when neither is supplied, optional document
|
|
367
|
+
sources are skipped and required ones fail. ReviewSensei never scans the current
|
|
368
|
+
working directory implicitly. To intentionally select root-level Markdown files,
|
|
369
|
+
declare each root-level file or an explicit canonical directory (for example
|
|
370
|
+
`"path": "docs"`) with an `include` pattern. The root shorthand `"path": "."`
|
|
371
|
+
is intentionally rejected.
|
|
372
|
+
|
|
373
|
+
Document selection is deterministic and rejects traversal, symlinks, secret-like
|
|
374
|
+
filenames, unsupported formats, unreadable text, and oversized context. Each
|
|
375
|
+
document is sent with its repository-relative path and SHA-256 digest. The
|
|
376
|
+
packaged default pipeline includes an architecture lens whose optional sources
|
|
377
|
+
are `AGENTS.md`, `docs/architecture.md`, `docs/architecture/**/*.md`, and
|
|
378
|
+
`docs/adr/**/*.md`.
|
|
379
|
+
|
|
380
|
+
## Repository-local learnings
|
|
381
|
+
|
|
382
|
+
Durable repository knowledge lives in the reviewed repository under
|
|
383
|
+
`.github/review-sensei/learnings/`, with one JSON object per file. These files are
|
|
384
|
+
normal repository content, so their history, review, merge, and rollback are
|
|
385
|
+
visible to maintainers.
|
|
386
|
+
|
|
387
|
+
```json
|
|
388
|
+
{
|
|
389
|
+
"id": "provider-boundary",
|
|
390
|
+
"title": "Keep provider calls behind adapters",
|
|
391
|
+
"rule": "Review business logic must not import provider SDKs.",
|
|
392
|
+
"scope": ["src/**"],
|
|
393
|
+
"rationale": "Provider changes should not alter review behavior.",
|
|
394
|
+
"category": "architecture",
|
|
395
|
+
"source": "https://github.com/owner/repository/pull/123"
|
|
396
|
+
}
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
Only `active` entries are loaded. Scope patterns are matched against changed
|
|
400
|
+
repository paths; use `["*"]` for a repository-wide rule. The learning root
|
|
401
|
+
must be a checkout of the target branch or target commit, not the untrusted
|
|
402
|
+
head checkout. This prevents a pull request from changing its own review
|
|
403
|
+
context before it is merged.
|
|
404
|
+
|
|
405
|
+
## Local Ollama
|
|
406
|
+
|
|
407
|
+
```bash
|
|
408
|
+
export REVIEWSENSEI_PROVIDER_MODE="local"
|
|
409
|
+
export REVIEWSENSEI_LOCAL_MODEL="qwen3.5:4b"
|
|
410
|
+
unset OLLAMA_API_KEY
|
|
411
|
+
review-sensei --diff pr.patch
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
## Providers
|
|
415
|
+
|
|
416
|
+
The core depends on this small interface:
|
|
417
|
+
|
|
418
|
+
```python
|
|
419
|
+
class ReviewProvider(Protocol):
|
|
420
|
+
name: str
|
|
421
|
+
model: str | None
|
|
422
|
+
|
|
423
|
+
def complete(self, request: ProviderRequest) -> ProviderResponse: ...
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
Registering another provider means translating `ProviderRequest` into that
|
|
427
|
+
provider's API and returning `ProviderResponse`. The review service, diff
|
|
428
|
+
validation, output schema, and GitHub-independent behavior remain unchanged.
|
|
429
|
+
See [the architecture guide](docs/architecture.md).
|
|
430
|
+
|
|
431
|
+
## GitHub integration
|
|
432
|
+
|
|
433
|
+
The GitHub App opens a setup-v4 PR containing a thin caller pinned to the full
|
|
434
|
+
SHA resolved from the operator-managed `v4` public git tag at installation
|
|
435
|
+
time. The reusable workflow prefers the requested exact package from PyPI and,
|
|
436
|
+
only when that package/version is unavailable, installs the executing workflow
|
|
437
|
+
commit directly from the public GitHub source. Unrelated PyPI installation
|
|
438
|
+
failures remain fatal. All nine
|
|
439
|
+
`REVIEWSENSEI_*` repository variables are created with safe defaults: automatic
|
|
440
|
+
review, GitHub writes, learning PRs, mention replies, and artifact upload are
|
|
441
|
+
off. The App never creates the customer-owned
|
|
442
|
+
`OLLAMA_API_KEY` secret.
|
|
443
|
+
The five feature switches are all disabled by default.
|
|
444
|
+
|
|
445
|
+
When explicitly enabled, same-repository pull requests can run automatic review
|
|
446
|
+
with either provider mode: cloud on a GitHub-hosted runner or local Ollama on
|
|
447
|
+
the labelled self-hosted runner. ReviewSensei checks out only trusted base
|
|
448
|
+
content, constructs a bounded diff without executing head code, validates the
|
|
449
|
+
model result, and publishes one exact-head App-authored review containing its
|
|
450
|
+
summary and valid inline changed-line comments. Learning proposals are separate
|
|
451
|
+
draft PRs. Their historical candidate discovery retains the 1,000-PR bound but
|
|
452
|
+
starts with 20-item pages and retries the same item offset with 10, 5, then 1
|
|
453
|
+
item only when the transport reports an oversized response. The 512 KiB
|
|
454
|
+
transport ceiling remains unchanged. Fork pull requests fail closed before
|
|
455
|
+
provider or broker access.
|
|
456
|
+
|
|
457
|
+
When automatic review and GitHub writes are enabled, ReviewSensei selects
|
|
458
|
+
`APPROVE` for a validated exact-head result only when it has no inline findings
|
|
459
|
+
and a final bounded GitHub thread sweep confirms that every existing review
|
|
460
|
+
thread is resolved. Any open finding or thread, draft/closed/fork/stale PR,
|
|
461
|
+
App-authored PR, or incomplete thread lookup keeps the event as `COMMENT` or
|
|
462
|
+
fails closed; `@sensei` replies are always ordinary comments. Existing review
|
|
463
|
+
markers still deduplicate one publication per head, so resolving a thread does
|
|
464
|
+
not retroactively approve an already-published review.
|
|
465
|
+
|
|
466
|
+
The approval policy is deliberately conservative: severity, fix effort, lens,
|
|
467
|
+
and model confidence help triage findings but never override an unresolved
|
|
468
|
+
thread. A later head must receive a fresh clean review after the final
|
|
469
|
+
resolution sweep. See [ADR 0030](docs/adr/0030-gate-app-approvals-on-resolved-review-threads-and-exact-head-review-safety.md)
|
|
470
|
+
for the criteria and rollback path.
|
|
471
|
+
|
|
472
|
+
Manual review and authorized `@sensei` replies use the same selected provider
|
|
473
|
+
mode. Each authorized mention receives a temporary 👀 reaction while the reply
|
|
474
|
+
is generated; ReviewSensei removes it after the reply or another terminal
|
|
475
|
+
outcome. Follow-up mentions in the same inline or PR conversation include the
|
|
476
|
+
bounded prior thread, diff context, findings, and trusted-base learnings. Cloud
|
|
477
|
+
mode sends that bounded conversation context to Ollama Cloud; local mode keeps
|
|
478
|
+
it on the configured local service. Published review summaries and inline
|
|
479
|
+
findings also tell readers to reply with @sensei followed by their question.
|
|
480
|
+
`review.json` is uploaded only when
|
|
481
|
+
`REVIEWSENSEI_UPLOAD_ARTIFACTS=true`; setup-v4 does not create a separate
|
|
482
|
+
version artifact. See [installation and migration](docs/installation.md) and
|
|
483
|
+
the reviewable
|
|
484
|
+
[`setup-v4 example`](examples/github-actions/review-sensei-review.yml).
|
|
485
|
+
|
|
486
|
+
## Concurrency policy
|
|
487
|
+
|
|
488
|
+
Hosts that run more than one review worker can reuse the same deterministic
|
|
489
|
+
policy:
|
|
490
|
+
|
|
491
|
+
```python
|
|
492
|
+
from review_sensei import ReviewConcurrencyPlan, ReviewService
|
|
493
|
+
|
|
494
|
+
plan = ReviewService(provider).concurrency_plan(request)
|
|
495
|
+
# Enforce plan.workflow in the run scheduler.
|
|
496
|
+
# Enforce plan.provider in the provider-stage scheduler.
|
|
497
|
+
```
|
|
498
|
+
|
|
499
|
+
The workflow group is keyed by repository and pull request and is latest-wins.
|
|
500
|
+
The provider group uses the same pull-request identity, admits one active
|
|
501
|
+
provider stage, and does not cancel the active stage. Different pull requests
|
|
502
|
+
therefore remain independent. `ReviewConcurrencyPlan.for_non_review_trigger()`
|
|
503
|
+
creates an isolated workflow group with no provider slot for triggers that do
|
|
504
|
+
not request a review. ReviewSensei returns this policy but does not own durable
|
|
505
|
+
queue state or cross-process cancellation.
|
|
506
|
+
|
|
507
|
+
## Data handling
|
|
508
|
+
|
|
509
|
+
ReviewSensei sends the prompt and full diff to the selected provider. With the
|
|
510
|
+
workflow's default local base URL, those values stay on the configured local
|
|
511
|
+
Ollama service; with a cloud base URL, the diff and selected context are sent to
|
|
512
|
+
that provider explicitly. The engine does not promise provider retention,
|
|
513
|
+
training, or deletion behavior. Read the provider's current terms before
|
|
514
|
+
sending private or regulated source code.
|
|
515
|
+
|
|
516
|
+
See [data handling](docs/data-handling.md) for the complete contract.
|
|
517
|
+
|
|
518
|
+
## Development
|
|
519
|
+
|
|
520
|
+
```bash
|
|
521
|
+
python -m pip install -r requirements/ci.txt
|
|
522
|
+
python -m pip install -e .
|
|
523
|
+
python scripts/check_action_pins.py
|
|
524
|
+
python scripts/validate_json_contracts.py
|
|
525
|
+
python -m ruff format --check setup.py src tests scripts
|
|
526
|
+
python -m ruff check setup.py src tests scripts
|
|
527
|
+
python -m mypy src
|
|
528
|
+
python -m compileall -q src
|
|
529
|
+
python -m coverage run --source=review_sensei --branch -m unittest discover -s tests -v
|
|
530
|
+
python -m coverage report --precision=2 --show-missing --fail-under=80
|
|
531
|
+
python -m unittest discover -s tests -v
|
|
532
|
+
python -m build
|
|
533
|
+
git diff --check
|
|
534
|
+
review-sensei --help
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md), [SECURITY.md](SECURITY.md), and
|
|
538
|
+
[SUPPORT.md](SUPPORT.md) before opening an issue or pull request.
|
|
539
|
+
|
|
540
|
+
## License
|
|
541
|
+
|
|
542
|
+
ReviewSensei is released under the [MIT License](LICENSE).
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
../../Scripts/review-sensei.exe,sha256=L423J5_oI2PFjXn3UuPE-J0hq8CcyxKPUBOjBYabSbA,108355
|
|
2
|
+
review_sensei-0.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
|
|
3
|
+
review_sensei-0.1.0.dist-info/METADATA,sha256=VrbrN2WY_qx9njR7EBXgrl6TYr-CpgfFkA2mHuE4JKc,25227
|
|
4
|
+
review_sensei-0.1.0.dist-info/RECORD,,
|
|
5
|
+
review_sensei-0.1.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
+
review_sensei-0.1.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
7
|
+
review_sensei-0.1.0.dist-info/direct_url.json,sha256=EDhpXdSFq1qZfl2FCT07Hg2gleInjGFaAwkFy0selqU,67
|
|
8
|
+
review_sensei-0.1.0.dist-info/entry_points.txt,sha256=Eki1ToC6hiOv8PMEAd2Cnbh5WWstVzzzf0XmHBHzpMQ,57
|
|
9
|
+
review_sensei-0.1.0.dist-info/licenses/LICENSE,sha256=-eVBqOV92YK1K76UIcK5MrgUh0EiQMe8xNhSysQE68s,1095
|
|
10
|
+
review_sensei-0.1.0.dist-info/top_level.txt,sha256=VCF4gJIJPP3MPJntoITDjMhJ8MUZfVLj-z3-VUQ9XDY,14
|
|
11
|
+
review_sensei/__init__.py,sha256=IscQDESrMeyAT6R9Eh_qXyynJjdEFT143JiMEt51tqc,1784
|
|
12
|
+
review_sensei/__main__.py,sha256=0iDYjdmiXNBinFF23WUyotsdpA6wFKjoB5aw3esTSRg,83
|
|
13
|
+
review_sensei/__pycache__/__init__.cpython-311.pyc,,
|
|
14
|
+
review_sensei/__pycache__/__main__.cpython-311.pyc,,
|
|
15
|
+
review_sensei/__pycache__/cli.cpython-311.pyc,,
|
|
16
|
+
review_sensei/__pycache__/concurrency.cpython-311.pyc,,
|
|
17
|
+
review_sensei/__pycache__/context.cpython-311.pyc,,
|
|
18
|
+
review_sensei/__pycache__/conversation.cpython-311.pyc,,
|
|
19
|
+
review_sensei/__pycache__/diff.cpython-311.pyc,,
|
|
20
|
+
review_sensei/__pycache__/errors.cpython-311.pyc,,
|
|
21
|
+
review_sensei/__pycache__/evaluation.cpython-311.pyc,,
|
|
22
|
+
review_sensei/__pycache__/learnings.cpython-311.pyc,,
|
|
23
|
+
review_sensei/__pycache__/models.cpython-311.pyc,,
|
|
24
|
+
review_sensei/__pycache__/presentation.cpython-311.pyc,,
|
|
25
|
+
review_sensei/__pycache__/schemas.cpython-311.pyc,,
|
|
26
|
+
review_sensei/__pycache__/service.cpython-311.pyc,,
|
|
27
|
+
review_sensei/__pycache__/stages.cpython-311.pyc,,
|
|
28
|
+
review_sensei/__pycache__/validation.cpython-311.pyc,,
|
|
29
|
+
review_sensei/__pycache__/workflow.cpython-311.pyc,,
|
|
30
|
+
review_sensei/cli.py,sha256=FLubo1VkboFMEN0AS7cXtYFRMJOGcTxQQCyDNCGF7xQ,23513
|
|
31
|
+
review_sensei/concurrency.py,sha256=iy6_gtBgm6z_cjug42Ppm14KSrQsCt0JGr9WJu46ZX8,8110
|
|
32
|
+
review_sensei/context.py,sha256=TRY4s5aYkSJSbCBpoZSPR10XOcUELMLpYSdpC6Thg8Q,11776
|
|
33
|
+
review_sensei/conversation.py,sha256=Qdl5qSFMsRRbu7dtsl1RPy1h_syqqTxXKry-jesUFe4,5202
|
|
34
|
+
review_sensei/default_categories/01-correctness.json,sha256=ZeTTvEavHU6_ih7JKhv8a6gH-4wRJGv0abckRWNWTfs,211
|
|
35
|
+
review_sensei/default_categories/02-security.json,sha256=6mz8Hlteb9q1PouLDmDoR-1wxrN31XR2X5I9yoYiG-E,231
|
|
36
|
+
review_sensei/default_categories/03-architecture.json,sha256=Fg3VsUCzl9trCpSnoOgwTqfNHbB7a4znEfrw2apqjXA,806
|
|
37
|
+
review_sensei/default_categories/03-maintainability.json,sha256=eyF9_slQ50LwEqSSet63jthfNp9ZOTnwiDVtVYjVv1A,229
|
|
38
|
+
review_sensei/default_categories/04-tests.json,sha256=UHhvH79bae9FmLJT_MYNvki4Y9xhJDLpDuLdgp2npe0,208
|
|
39
|
+
review_sensei/default_stages/01-default-review.json,sha256=UKqLyIv85O41ruX1rsWIbaXUsyfs-8JDwp2zBvc7KmE,3175
|
|
40
|
+
review_sensei/diff.py,sha256=ED5kqwdAf8oVt10sIpJ1vgFGmpE5ZSk05JhTIG6pnVk,21027
|
|
41
|
+
review_sensei/errors.py,sha256=dr_hhXId1dDjD3xpskys8FPAANbn9Zw4Lz1KJEYP_vk,1088
|
|
42
|
+
review_sensei/evaluation.py,sha256=mGkJghN3LqXFUwbSEAb9i1_8clgkaXXBUAO0kORrwSQ,25338
|
|
43
|
+
review_sensei/hosting/__init__.py,sha256=zqIukHwfUzai3x7dJS2nFNlVhP7EQWQ47-4pGCi2Sz0,84
|
|
44
|
+
review_sensei/hosting/__pycache__/__init__.cpython-311.pyc,,
|
|
45
|
+
review_sensei/hosting/github/__init__.py,sha256=jxmANmeJzOc8iYhZBN7iloD3FjrWUkoNr9xMoCePV0o,5275
|
|
46
|
+
review_sensei/hosting/github/__pycache__/__init__.cpython-311.pyc,,
|
|
47
|
+
review_sensei/hosting/github/__pycache__/application.cpython-311.pyc,,
|
|
48
|
+
review_sensei/hosting/github/__pycache__/approval.cpython-311.pyc,,
|
|
49
|
+
review_sensei/hosting/github/__pycache__/auth.cpython-311.pyc,,
|
|
50
|
+
review_sensei/hosting/github/__pycache__/broker.cpython-311.pyc,,
|
|
51
|
+
review_sensei/hosting/github/__pycache__/broker_client.cpython-311.pyc,,
|
|
52
|
+
review_sensei/hosting/github/__pycache__/conversation.cpython-311.pyc,,
|
|
53
|
+
review_sensei/hosting/github/__pycache__/errors.cpython-311.pyc,,
|
|
54
|
+
review_sensei/hosting/github/__pycache__/http.cpython-311.pyc,,
|
|
55
|
+
review_sensei/hosting/github/__pycache__/jwt.cpython-311.pyc,,
|
|
56
|
+
review_sensei/hosting/github/__pycache__/learning_pr.cpython-311.pyc,,
|
|
57
|
+
review_sensei/hosting/github/__pycache__/oidc.cpython-311.pyc,,
|
|
58
|
+
review_sensei/hosting/github/__pycache__/publication.cpython-311.pyc,,
|
|
59
|
+
review_sensei/hosting/github/__pycache__/setup.cpython-311.pyc,,
|
|
60
|
+
review_sensei/hosting/github/__pycache__/webhooks.cpython-311.pyc,,
|
|
61
|
+
review_sensei/hosting/github/application.py,sha256=GGVHQNe5GS4cOfWtk8b_CYKZuxrdU7794rkz_OKCjJw,8707
|
|
62
|
+
review_sensei/hosting/github/approval.py,sha256=VGZ5XvMB0MmnW9sgK4P_nkByTEhdZeHRfNOFkL-oN7Q,1369
|
|
63
|
+
review_sensei/hosting/github/auth.py,sha256=koITagUX9piVboGJ_smEhPsCf4rOQkOqqSKeLKvFRbc,19055
|
|
64
|
+
review_sensei/hosting/github/broker.py,sha256=FFC7DsFhzy1tENXTCmLNuYzX2cHaYsgMkDGwXEcJaTU,18014
|
|
65
|
+
review_sensei/hosting/github/broker_client.py,sha256=FNBHGWH-I3mPM_XlYz8gJVokQonMXDnB2KaD2lV0x7k,5306
|
|
66
|
+
review_sensei/hosting/github/conversation.py,sha256=r1K8t5qq9bXM3eFzUOsS7mE0aABRIVxB8NgLpZ2RB7o,38400
|
|
67
|
+
review_sensei/hosting/github/errors.py,sha256=QxndyYxP2hAr-imZyeUu76tPkPSBehsX361F4aaeVKc,5157
|
|
68
|
+
review_sensei/hosting/github/http.py,sha256=Xa8WAmLNp8lvrzBxFGGwp6QJQUPZ1ZJciB7SislKNzI,6957
|
|
69
|
+
review_sensei/hosting/github/jwt.py,sha256=mTakXBxU-GR-hBnIZE-FryfFXwpS9hJ7qb3X7P0FBMo,4582
|
|
70
|
+
review_sensei/hosting/github/learning_pr.py,sha256=hT7FmmpWCnUO5WCQEmP9XioQiceNALxuJCtcZXAQxSU,112424
|
|
71
|
+
review_sensei/hosting/github/oidc.py,sha256=h3UVcBYQIKy-xQS7Ixv3_fy670mmuBoNKSYurPZWZ60,13310
|
|
72
|
+
review_sensei/hosting/github/publication.py,sha256=PJClEB2ajxFscwh6jXTYY0I0r36MmDA80J8vl_Ayu6o,22007
|
|
73
|
+
review_sensei/hosting/github/setup.py,sha256=8Atgg27bmytPt8t1VxaacjY54DcXUFy1FLr8E1MEe1E,71186
|
|
74
|
+
review_sensei/hosting/github/webhooks.py,sha256=7hh_YlF7riV6wov7A_27aOb5g6-Ivob1PBWR4m5bF3I,13662
|
|
75
|
+
review_sensei/learnings.py,sha256=3c_HYmSaq3pznRPbePSHbCHp_8_O90wZSJgsKo7PATE,4450
|
|
76
|
+
review_sensei/models.py,sha256=CdyxKoG1wzj54W4lzvHaCTEQkR9IAZm-zhceNz_3nis,43337
|
|
77
|
+
review_sensei/presentation.py,sha256=3MNpUKfo6sbsx8a5aU-f3oFnDFBWkVdRevvR4ZngvAs,4208
|
|
78
|
+
review_sensei/providers/__init__.py,sha256=r9RCFnNXwrHY1HxhyLVhXPT2mS6gxfpoAMo22e-ndvg,347
|
|
79
|
+
review_sensei/providers/__pycache__/__init__.cpython-311.pyc,,
|
|
80
|
+
review_sensei/providers/__pycache__/base.cpython-311.pyc,,
|
|
81
|
+
review_sensei/providers/__pycache__/fixture.cpython-311.pyc,,
|
|
82
|
+
review_sensei/providers/__pycache__/ollama.cpython-311.pyc,,
|
|
83
|
+
review_sensei/providers/__pycache__/registry.cpython-311.pyc,,
|
|
84
|
+
review_sensei/providers/base.py,sha256=NPGpFoo0qRJFJp2j3mFn4vM0Eb3MSWtAxKz1kb2Xj0s,401
|
|
85
|
+
review_sensei/providers/fixture.py,sha256=-HXetG6cXpWd5NlF1-RMA3aqyr88YHwYpiyz0Bc6BO8,1554
|
|
86
|
+
review_sensei/providers/ollama.py,sha256=V6megK0aECd1N-WwNSrUQi-tWjsPDvc2txsJ370LhG4,5181
|
|
87
|
+
review_sensei/providers/registry.py,sha256=NSB1fkozVCPCsvJn6wW67d5-Z5A7jG4IijkhxhXdbr4,2389
|
|
88
|
+
review_sensei/schemas.py,sha256=Txz6PbKWFUpqsuIHp6CcyhjUTLYkywNx5W5xnh5M_uk,1981
|
|
89
|
+
review_sensei/schemas/concurrency-plan.schema.json,sha256=YtHPlfShzFPLE4sQMEn7TogW3souwiKC6d4yd-kgFRY,830
|
|
90
|
+
review_sensei/schemas/conversation-reply.schema.json,sha256=3NihWNn5K1DvtQP0dr0RTf0QlJCFVq-TuYz30Ohjji8,465
|
|
91
|
+
review_sensei/schemas/evaluation-corpus.schema.json,sha256=0W3-zgmVFa5AjDSs385szKNt4DX_D_ZdrE9ur3Nrnz0,7905
|
|
92
|
+
review_sensei/schemas/evaluation-report.schema.json,sha256=BmTJW7RYQTx3taFJoYfmKujJLWnLLTynv5D3e-CVyKE,9269
|
|
93
|
+
review_sensei/schemas/learning-entry.schema.json,sha256=5Xj9ovfB-OjzZShHiv9mHxMIZWVQfEyz-N2Odv8zfHM,1273
|
|
94
|
+
review_sensei/schemas/learning-proposal.schema.json,sha256=FVYG4sFWGil_66-6NlliFCk2LpiCfJn-yTrY4dN-b0E,644
|
|
95
|
+
review_sensei/schemas/review-category.schema.json,sha256=Rni93qGN2LyJSrHRF-GcgVdAjqXGnDU5yjIjG2wn7pI,2189
|
|
96
|
+
review_sensei/schemas/review-comment.schema.json,sha256=j_5mZC66e_5HZJ2jDjjNAIVhQ7eOO2S6QabuZQ2RFnc,616
|
|
97
|
+
review_sensei/schemas/review-result.schema.json,sha256=dQRL4-0lXYqJdm7yJ5FQhQAkPIQZyAAHzuhS2CTiQ18,1735
|
|
98
|
+
review_sensei/schemas/review-stage.schema.json,sha256=6HrPqijpMFgYy7F1dnUwL2kt_Du1HpIIaZbOWxROJe0,4180
|
|
99
|
+
review_sensei/schemas/stage.schema.json,sha256=Fsho33NPMXDSfX9Nv9RqmcF3H_9bOoSHHjxoWvm9ifk,2728
|
|
100
|
+
review_sensei/service.py,sha256=XlRjmNUZdc14PjpeGY7hh1YrMffOaS6Y5Yn5CDhjhTQ,19252
|
|
101
|
+
review_sensei/stages.py,sha256=kA2LOLx0C89lUmlauBKx5JJcdx4mDZKoXviMG2Z33sI,22376
|
|
102
|
+
review_sensei/validation.py,sha256=6ak6ElAFIJiGj53nz4wiUW8X234ESMRtMWut0TMMFAw,10403
|
|
103
|
+
review_sensei/workflow.py,sha256=V8WoiVg5CHMPHPqef85tBRCHd6oJBIxh4c5EJ5BlUoU,16082
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"dir_info": {}, "url": "file:///D:/a/review-sensei/review-sensei"}
|