AI-powered code review CLI for GitLab MRs — learns your style, reviews like you.
Project description
Sensei
AI-powered code review CLI for GitLab Merge Requests. Sensei learns your review style from past comments and applies it consistently to new MRs using Claude as the review engine.
What it does
- Learns your style — Scrapes your past GitLab review comments, analyzes tone/priorities/patterns, and builds a reusable style profile.
- Reviews MRs — Fetches diffs, reads full file context, and generates review comments that match your voice.
- Posts intelligently — Must-fix issues go inline on the exact line. Nits get grouped into one summary comment. Test coverage gaps get a single consolidated table.
Prerequisites
- Python 3.9+
- Claude Code CLI installed and authenticated
- A GitLab personal access token with
apiscope
Install
From PyPI:
pip install sensei-review
Or from source:
git clone https://github.com/pulkit004/sensei.git && cd sensei
python -m venv .venv && source .venv/bin/activate
pip install -e .
Setup
# Initialize with your GitLab credentials
sensei init --pat <your-gitlab-pat>
# Learn your review style (scrapes last 365 days of comments)
sensei learn
Config is stored at ~/.sensei/ with restricted permissions (0600).
Usage
# Review an MR
sensei review https://gitlab.com/org/project/-/merge_requests/123
# Dry run (preview without posting)
sensei review https://gitlab.com/org/project/-/merge_requests/123 --dry-run
After review, you're prompted to approve (post to GitLab), edit (save to file for manual editing), or discard.
Comment types
| Type | Confidence | How it's posted |
|---|---|---|
| Must-fix | >= 90% | Inline on the exact diff line |
| Nit | 80-89% | Grouped into one summary comment |
| Test gap | any | Consolidated into a single test coverage table |
Comments below 80% confidence are dropped.
Project rules
Sensei loads rules from multiple sources (in order):
~/.sensei/rules/{org_project}.md— Per-project rules you writeCLAUDE.md— From the repo being reviewed.claude/rules.md— From the repoCODING_PRINCIPLES.md— From the repo
How the review works
Each file is reviewed in two phases:
- Code review — Bugs, type safety, naming, architecture, security
- Silent failure hunting — Only runs if the diff has error handling patterns (try/catch, optional chaining, etc.)
Files are reviewed in parallel (up to 8 concurrent workers, configurable batch size).
Development
source .venv/bin/activate
pip install -e ".[dev]"
pytest tests/ -v # Run tests
pytest tests/ -v -x # Stop on first failure
Project structure
src/sensei/
cli.py # Click CLI commands
config.py # ~/.sensei config management
gitlab_client.py # GitLab API (diffs, file content, posting comments)
reviewer.py # Review prompts, parsing, consolidation
learner.py # Style profile learning from past comments
formatter.py # Comment formatting for terminal and GitLab
tests/ # Unit and integration tests
License
MIT — see LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sensei_review-0.1.0.tar.gz.
File metadata
- Download URL: sensei_review-0.1.0.tar.gz
- Upload date:
- Size: 20.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c007a9fdc961c05c1e817095fea6e0d2780e626a51c5c0a56a328042bcf69502
|
|
| MD5 |
461c37181bc5e7c5fb5d2009a7e4082b
|
|
| BLAKE2b-256 |
80f6e3ce10dfe5cad63368a78795254216dc1f139940c775cc43d20f05e392fb
|
File details
Details for the file sensei_review-0.1.0-py3-none-any.whl.
File metadata
- Download URL: sensei_review-0.1.0-py3-none-any.whl
- Upload date:
- Size: 17.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
92a3b46b6edc8b48c9288a46a2d7b84213416f49874bf19c52f91dcbfe1b9310
|
|
| MD5 |
46ada0082081d397c9783a8f3035ef69
|
|
| BLAKE2b-256 |
d0bd3db98ce65338fe9e9b24ccac61bd58319d5d11943986e86bb6e123433752
|