@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.
Files changed (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +4 -0
  3. package/bin/_internal/VCRUNTIME140.dll +0 -0
  4. package/bin/_internal/_asyncio.pyd +0 -0
  5. package/bin/_internal/_bz2.pyd +0 -0
  6. package/bin/_internal/_cffi_backend.cp311-win_amd64.pyd +0 -0
  7. package/bin/_internal/_ctypes.pyd +0 -0
  8. package/bin/_internal/_decimal.pyd +0 -0
  9. package/bin/_internal/_hashlib.pyd +0 -0
  10. package/bin/_internal/_lzma.pyd +0 -0
  11. package/bin/_internal/_multiprocessing.pyd +0 -0
  12. package/bin/_internal/_overlapped.pyd +0 -0
  13. package/bin/_internal/_queue.pyd +0 -0
  14. package/bin/_internal/_socket.pyd +0 -0
  15. package/bin/_internal/_ssl.pyd +0 -0
  16. package/bin/_internal/_uuid.pyd +0 -0
  17. package/bin/_internal/api-ms-win-core-console-l1-1-0.dll +0 -0
  18. package/bin/_internal/api-ms-win-core-datetime-l1-1-0.dll +0 -0
  19. package/bin/_internal/api-ms-win-core-debug-l1-1-0.dll +0 -0
  20. package/bin/_internal/api-ms-win-core-errorhandling-l1-1-0.dll +0 -0
  21. package/bin/_internal/api-ms-win-core-fibers-l1-1-0.dll +0 -0
  22. package/bin/_internal/api-ms-win-core-fibers-l1-1-1.dll +0 -0
  23. package/bin/_internal/api-ms-win-core-file-l1-1-0.dll +0 -0
  24. package/bin/_internal/api-ms-win-core-file-l1-2-0.dll +0 -0
  25. package/bin/_internal/api-ms-win-core-file-l2-1-0.dll +0 -0
  26. package/bin/_internal/api-ms-win-core-handle-l1-1-0.dll +0 -0
  27. package/bin/_internal/api-ms-win-core-heap-l1-1-0.dll +0 -0
  28. package/bin/_internal/api-ms-win-core-interlocked-l1-1-0.dll +0 -0
  29. package/bin/_internal/api-ms-win-core-kernel32-legacy-l1-1-1.dll +0 -0
  30. package/bin/_internal/api-ms-win-core-libraryloader-l1-1-0.dll +0 -0
  31. package/bin/_internal/api-ms-win-core-localization-l1-2-0.dll +0 -0
  32. package/bin/_internal/api-ms-win-core-memory-l1-1-0.dll +0 -0
  33. package/bin/_internal/api-ms-win-core-namedpipe-l1-1-0.dll +0 -0
  34. package/bin/_internal/api-ms-win-core-processenvironment-l1-1-0.dll +0 -0
  35. package/bin/_internal/api-ms-win-core-processthreads-l1-1-0.dll +0 -0
  36. package/bin/_internal/api-ms-win-core-processthreads-l1-1-1.dll +0 -0
  37. package/bin/_internal/api-ms-win-core-profile-l1-1-0.dll +0 -0
  38. package/bin/_internal/api-ms-win-core-rtlsupport-l1-1-0.dll +0 -0
  39. package/bin/_internal/api-ms-win-core-string-l1-1-0.dll +0 -0
  40. package/bin/_internal/api-ms-win-core-synch-l1-1-0.dll +0 -0
  41. package/bin/_internal/api-ms-win-core-synch-l1-2-0.dll +0 -0
  42. package/bin/_internal/api-ms-win-core-sysinfo-l1-1-0.dll +0 -0
  43. package/bin/_internal/api-ms-win-core-sysinfo-l1-2-0.dll +0 -0
  44. package/bin/_internal/api-ms-win-core-timezone-l1-1-0.dll +0 -0
  45. package/bin/_internal/api-ms-win-core-util-l1-1-0.dll +0 -0
  46. package/bin/_internal/api-ms-win-crt-conio-l1-1-0.dll +0 -0
  47. package/bin/_internal/api-ms-win-crt-convert-l1-1-0.dll +0 -0
  48. package/bin/_internal/api-ms-win-crt-environment-l1-1-0.dll +0 -0
  49. package/bin/_internal/api-ms-win-crt-filesystem-l1-1-0.dll +0 -0
  50. package/bin/_internal/api-ms-win-crt-heap-l1-1-0.dll +0 -0
  51. package/bin/_internal/api-ms-win-crt-locale-l1-1-0.dll +0 -0
  52. package/bin/_internal/api-ms-win-crt-math-l1-1-0.dll +0 -0
  53. package/bin/_internal/api-ms-win-crt-process-l1-1-0.dll +0 -0
  54. package/bin/_internal/api-ms-win-crt-runtime-l1-1-0.dll +0 -0
  55. package/bin/_internal/api-ms-win-crt-stdio-l1-1-0.dll +0 -0
  56. package/bin/_internal/api-ms-win-crt-string-l1-1-0.dll +0 -0
  57. package/bin/_internal/api-ms-win-crt-time-l1-1-0.dll +0 -0
  58. package/bin/_internal/api-ms-win-crt-utility-l1-1-0.dll +0 -0
  59. package/bin/_internal/attrs-26.1.0.dist-info/INSTALLER +1 -0
  60. package/bin/_internal/attrs-26.1.0.dist-info/METADATA +199 -0
  61. package/bin/_internal/attrs-26.1.0.dist-info/RECORD +55 -0
  62. package/bin/_internal/attrs-26.1.0.dist-info/WHEEL +4 -0
  63. package/bin/_internal/attrs-26.1.0.dist-info/licenses/LICENSE +21 -0
  64. package/bin/_internal/base_library.zip +0 -0
  65. package/bin/_internal/cryptography/hazmat/bindings/_rust.pyd +0 -0
  66. package/bin/_internal/cryptography-50.0.1.dist-info/INSTALLER +1 -0
  67. package/bin/_internal/cryptography-50.0.1.dist-info/METADATA +110 -0
  68. package/bin/_internal/cryptography-50.0.1.dist-info/RECORD +199 -0
  69. package/bin/_internal/cryptography-50.0.1.dist-info/WHEEL +4 -0
  70. package/bin/_internal/cryptography-50.0.1.dist-info/licenses/LICENSE +3 -0
  71. package/bin/_internal/cryptography-50.0.1.dist-info/licenses/LICENSE.APACHE +202 -0
  72. package/bin/_internal/cryptography-50.0.1.dist-info/licenses/LICENSE.BSD +27 -0
  73. package/bin/_internal/cryptography-50.0.1.dist-info/sboms/cryptography-rust.cyclonedx.json +1365 -0
  74. package/bin/_internal/cryptography-50.0.1.dist-info/sboms/sbom.json +43 -0
  75. package/bin/_internal/jsonschema/benchmarks/issue232/issue.json +2653 -0
  76. package/bin/_internal/jsonschema-4.26.0.dist-info/INSTALLER +1 -0
  77. package/bin/_internal/jsonschema-4.26.0.dist-info/METADATA +170 -0
  78. package/bin/_internal/jsonschema-4.26.0.dist-info/RECORD +82 -0
  79. package/bin/_internal/jsonschema-4.26.0.dist-info/WHEEL +4 -0
  80. package/bin/_internal/jsonschema-4.26.0.dist-info/entry_points.txt +2 -0
  81. package/bin/_internal/jsonschema-4.26.0.dist-info/licenses/COPYING +19 -0
  82. package/bin/_internal/jsonschema_specifications/schemas/draft201909/metaschema.json +42 -0
  83. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/applicator +56 -0
  84. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/content +17 -0
  85. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/core +57 -0
  86. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/format +14 -0
  87. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/meta-data +37 -0
  88. package/bin/_internal/jsonschema_specifications/schemas/draft201909/vocabularies/validation +98 -0
  89. package/bin/_internal/jsonschema_specifications/schemas/draft202012/metaschema.json +58 -0
  90. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/applicator +48 -0
  91. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/content +17 -0
  92. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/core +51 -0
  93. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/format-annotation +14 -0
  94. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/format-assertion +14 -0
  95. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/meta-data +37 -0
  96. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/unevaluated +15 -0
  97. package/bin/_internal/jsonschema_specifications/schemas/draft202012/vocabularies/validation +98 -0
  98. package/bin/_internal/jsonschema_specifications/schemas/draft3/metaschema.json +172 -0
  99. package/bin/_internal/jsonschema_specifications/schemas/draft4/metaschema.json +149 -0
  100. package/bin/_internal/jsonschema_specifications/schemas/draft6/metaschema.json +153 -0
  101. package/bin/_internal/jsonschema_specifications/schemas/draft7/metaschema.json +166 -0
  102. package/bin/_internal/libcrypto-3.dll +0 -0
  103. package/bin/_internal/libffi-8.dll +0 -0
  104. package/bin/_internal/libssl-3.dll +0 -0
  105. package/bin/_internal/pyexpat.pyd +0 -0
  106. package/bin/_internal/python3.dll +0 -0
  107. package/bin/_internal/python311.dll +0 -0
  108. package/bin/_internal/review_sensei/default_categories/01-correctness.json +8 -0
  109. package/bin/_internal/review_sensei/default_categories/02-security.json +8 -0
  110. package/bin/_internal/review_sensei/default_categories/03-architecture.json +24 -0
  111. package/bin/_internal/review_sensei/default_categories/03-maintainability.json +8 -0
  112. package/bin/_internal/review_sensei/default_categories/04-tests.json +8 -0
  113. package/bin/_internal/review_sensei/default_stages/01-default-review.json +16 -0
  114. package/bin/_internal/review_sensei/schemas/concurrency-plan.schema.json +26 -0
  115. package/bin/_internal/review_sensei/schemas/conversation-reply.schema.json +16 -0
  116. package/bin/_internal/review_sensei/schemas/evaluation-corpus.schema.json +316 -0
  117. package/bin/_internal/review_sensei/schemas/evaluation-report.schema.json +371 -0
  118. package/bin/_internal/review_sensei/schemas/learning-entry.schema.json +37 -0
  119. package/bin/_internal/review_sensei/schemas/learning-proposal.schema.json +19 -0
  120. package/bin/_internal/review_sensei/schemas/review-category.schema.json +77 -0
  121. package/bin/_internal/review_sensei/schemas/review-comment.schema.json +16 -0
  122. package/bin/_internal/review_sensei/schemas/review-result.schema.json +53 -0
  123. package/bin/_internal/review_sensei/schemas/review-stage.schema.json +154 -0
  124. package/bin/_internal/review_sensei/schemas/stage.schema.json +88 -0
  125. package/bin/_internal/review_sensei-0.1.0.dist-info/INSTALLER +1 -0
  126. package/bin/_internal/review_sensei-0.1.0.dist-info/METADATA +542 -0
  127. package/bin/_internal/review_sensei-0.1.0.dist-info/RECORD +103 -0
  128. package/bin/_internal/review_sensei-0.1.0.dist-info/REQUESTED +0 -0
  129. package/bin/_internal/review_sensei-0.1.0.dist-info/WHEEL +5 -0
  130. package/bin/_internal/review_sensei-0.1.0.dist-info/direct_url.json +1 -0
  131. package/bin/_internal/review_sensei-0.1.0.dist-info/entry_points.txt +2 -0
  132. package/bin/_internal/review_sensei-0.1.0.dist-info/licenses/LICENSE +21 -0
  133. package/bin/_internal/review_sensei-0.1.0.dist-info/top_level.txt +1 -0
  134. package/bin/_internal/rpds/rpds.cp311-win_amd64.pyd +0 -0
  135. package/bin/_internal/select.pyd +0 -0
  136. package/bin/_internal/ucrtbase.dll +0 -0
  137. package/bin/_internal/unicodedata.pyd +0 -0
  138. package/bin/review-sensei.exe +0 -0
  139. 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
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (84.0.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ {"dir_info": {}, "url": "file:///D:/a/review-sensei/review-sensei"}
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ review-sensei = review_sensei.cli:main