AI-powered pull request summaries and reviews.
Project description
🚢 Shippy
AI pull-request summaries and reviews, posted straight to your git provider.
shippy is a CLI reviewer for pull requests. It reads the real PR context,
splits large diffs into focused worker groups, asks the configured AI platform
for summary/review output, and publishes clean GitHub updates without comment
spam.
Use it to turn messy PRs into clear title/body updates and one sticky review comment. Today it supports Ollama + GitHub. More AI platforms and Git platforms are the next expansion path.
📌 What It Does
| Workflow | What Shippy Does |
|---|---|
| Summary | Generates a PR title and body from commits, changed files, diff stat, and grouped diff context. |
| Review | Reviews focused file groups in parallel, then merges findings into one sticky Markdown comment. |
| Context | Collects branch/base data, commits, changed files, diff stats, ignored paths, and model settings. |
| Publishing | Updates GitHub through gh; review comments use <!-- shippy-review --> so reruns update one comment. |
🧭 Why It Exists
shippy is not a replacement for human review. It catches the boring and
expensive-to-miss stuff before people spend attention on it:
- risky diffs
- unclear PR intent
- missing tests
- generated-file noise
- accidental large changes
- suspicious cleanup/refactor mistakes
Goal: make every PR easier to understand and safer to ship.
✨ Highlights
| Feature | Detail |
|---|---|
| 📝 PR summaries | Clear title/body updates from actual repository and PR context. |
| 🔍 PR reviews | Finds bugs, risks, missing tests, and concrete cleanup opportunities. |
| 📌 Sticky comments | One GitHub review comment, updated on rerun. |
| ⚡ Split workers | Large PRs are split into focused groups and processed in parallel. |
| 🧹 Ignore rules | Lockfiles, generated files, build outputs, and noisy paths can be skipped. |
| 🛠 CLI-first | Works locally, from scripts, and from release workflows. |
🤖 Supported Platforms
| Type | Supported Now | Planned |
|---|---|---|
| AI platform | Ollama | API-key providers, hosted model APIs, provider presets |
| Git platform | GitHub through gh |
GitLab, Bitbucket, and other review platforms |
🚀 Quick Start
Requirements:
- Python 3.11+
git- GitHub CLI authenticated with
gh auth login - Ollama running locally with a pulled model
ollama serve
ollama pull gemma4:e4b
pip install shippy-ai
shippy init
shippy summary
shippy review
From a local checkout:
uv run -m shippy.cli init
uv run -m shippy.cli summary
uv run -m shippy.cli review
Run Shippy from anywhere inside a Git work tree. It discovers the repository root automatically.
⚙️ Configuration
shippy init creates .shippy.toml at the Git repository root and refuses to
overwrite an existing config.
Minimal shape:
model = "gemma4:e4b"
ollama_url = "http://localhost:11434"
ignores = [
"**/go.sum",
"**/package-lock.json",
"**/dist/**",
"**/build/**",
"**/.next/**",
"**/coverage/**",
"graphify-out/**",
]
[summary]
context_window = 16384
max_group_chars = 32000
max_groups = 12
workers = 4
temperature = 0.1
timeout_seconds = 420
[review]
context_window = 16384
max_group_chars = 32000
max_groups = 12
workers = 4
temperature = 0.05
timeout_seconds = 420
[title]
update = true
enforce_prefix = true
prefixes = ["feat:", "task:", "fix:", "hotfix:", "chore:", "docs:", "refactor:"]
[prompts]
summary_split_group = ""
summary_final = ""
review_split_group = ""
review_final = ""
🧠 Context And Limits
context_windowis provider context per model call.- Shippy tries to send the whole PR to one worker first.
max_group_charsis the diff size cap before Shippy splits into groups.max_group_charsis measured in characters, not tokens.32000diff chars is roughly several thousand tokens for code.- Output caps default to
1024tokens for split-group workers and2048tokens for final synthesis.
Override output caps only when the model needs longer answers:
[review]
split_group_output_tokens = 1024
final_output_tokens = 2048
See the full editable config template here: src/shippy/templates/.shippy.toml.
🧩 Prompt Overrides
Leave prompt fields empty to use Shippy defaults. Set a field to replace that
prompt completely. Use [extra_instructions] to keep the default prompt and
append custom rules.
split_group means: prompt for one chunk of changed files.
Supported prompt tokens:
summary_split_group:{{area}},{{branch}},{{base}},{{ignored_paths}},{{files}},{{diff}}summary_final:{{branch}},{{base}},{{commits}},{{stat}},{{area_summaries}},{{title_prefixes}},{{title_update}},{{title_enforce_prefix}},{{title_shape}},{{title_rules}}review_split_group:{{area}},{{pr_title}},{{pr_url}},{{pr_body}},{{branch}},{{base}},{{commits}},{{stat}},{{files}},{{diff}},{{trim_note}}review_final:{{pr_title}},{{pr_url}},{{pr_body}},{{branch}},{{base}},{{commits}},{{stat}},{{changed_files}},{{diff}},{{area_reviews}},{{trim_note}}
🧪 Commands
shippy init
shippy summary
shippy review
shippy --pr-url "$PR_URL" summary
shippy --config ./custom.toml --pr-url "$PR_URL" review
shippy --help
🧾 Example Review Output
## AI Review
### Verdict
✅ Pass: no blocking issue visible.
### Tests
- Unit tests were not visible in PR context.
🔒 Privacy
Current Ollama + GitHub support talks to:
- your local Git repository
- GitHub through
gh - your configured Ollama server
Your prompt is sent to the AI platform endpoint you configure.
🧰 Development
For contributors cloning this repo, use the root Taskfile:
task prereq
task format
task check
task publish:check
🤝 Contributing
PRs are welcome, especially for:
- more AI platforms
- more Git platforms
- more features
- better usability
- better prompts
- cleaner Git platform comment behavior
- config improvements
- model compatibility fixes
- tests around diff collection and output formatting
Before opening a PR:
task format
task check
task publish:check
📄 License
MIT
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 shippy_ai-0.1.2.tar.gz.
File metadata
- Download URL: shippy_ai-0.1.2.tar.gz
- Upload date:
- Size: 34.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c900de89810c691523393966f8ecf2c2f08344357ef48754cf76d855f26f0f25
|
|
| MD5 |
ba2e0ff6aceb76c61b20855ef912a7a4
|
|
| BLAKE2b-256 |
d19b25c85503800d056e0382ea067c307a208e96597d0747cad0e40373705e64
|
Provenance
The following attestation bundles were made for shippy_ai-0.1.2.tar.gz:
Publisher:
publish.yml on balaganworks/shippy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shippy_ai-0.1.2.tar.gz -
Subject digest:
c900de89810c691523393966f8ecf2c2f08344357ef48754cf76d855f26f0f25 - Sigstore transparency entry: 1731274996
- Sigstore integration time:
-
Permalink:
balaganworks/shippy@29bf41239d0119f9dbfc2586b89c4e58fdb8f12d -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/balaganworks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@29bf41239d0119f9dbfc2586b89c4e58fdb8f12d -
Trigger Event:
release
-
Statement type:
File details
Details for the file shippy_ai-0.1.2-py3-none-any.whl.
File metadata
- Download URL: shippy_ai-0.1.2-py3-none-any.whl
- Upload date:
- Size: 30.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4cf19878cbaf73b102285ddd56f25fdc1843b7c76c325f833f7b729240d24f3
|
|
| MD5 |
d5aba3650c06627cea642eb2c6d24494
|
|
| BLAKE2b-256 |
7e1d1a8e34267045598ef679b1e256cd626e9da765fb78049b064a09375edc88
|
Provenance
The following attestation bundles were made for shippy_ai-0.1.2-py3-none-any.whl:
Publisher:
publish.yml on balaganworks/shippy
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shippy_ai-0.1.2-py3-none-any.whl -
Subject digest:
d4cf19878cbaf73b102285ddd56f25fdc1843b7c76c325f833f7b729240d24f3 - Sigstore transparency entry: 1731275048
- Sigstore integration time:
-
Permalink:
balaganworks/shippy@29bf41239d0119f9dbfc2586b89c4e58fdb8f12d -
Branch / Tag:
refs/tags/v0.1.2 - Owner: https://github.com/balaganworks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@29bf41239d0119f9dbfc2586b89c4e58fdb8f12d -
Trigger Event:
release
-
Statement type: