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 = 8192
max_group_chars = 16000
max_groups = 12
workers = 4
temperature = 0.1
timeout_seconds = 420
[review]
context_window = 8192
max_group_chars = 16000
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.max_group_charsis a diff safety cap for each split-group worker.max_group_charsis measured in characters, not tokens.16000diff chars is roughly a few 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
🧩 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 local 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}}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.
### Summary
- Adds PR review through the configured AI platform.
- Splits changed files into focused review groups.
- Publishes one sticky Markdown comment on GitHub.
### Findings
- No blocking issues found in the visible diff.
### Tests
- Unit tests were not visible in PR context.
### Reviewer Notes
- Diff was complete.
🔒 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.0.tar.gz.
File metadata
- Download URL: shippy_ai-0.1.0.tar.gz
- Upload date:
- Size: 28.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86ee33800d19fbc7a6847648d43924a141fb7e768bb6edbec51829a9807ba680
|
|
| MD5 |
fd96a31728c1c7a6db2ea4e72693ff6d
|
|
| BLAKE2b-256 |
3ed8fe6d1d6f5cba366f9209413db90557d7f852d6e58723a70c858631002780
|
Provenance
The following attestation bundles were made for shippy_ai-0.1.0.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.0.tar.gz -
Subject digest:
86ee33800d19fbc7a6847648d43924a141fb7e768bb6edbec51829a9807ba680 - Sigstore transparency entry: 1708603406
- Sigstore integration time:
-
Permalink:
balaganworks/shippy@0eb300ff434c15389ebf8375136bf58a48a69195 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/balaganworks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0eb300ff434c15389ebf8375136bf58a48a69195 -
Trigger Event:
release
-
Statement type:
File details
Details for the file shippy_ai-0.1.0-py3-none-any.whl.
File metadata
- Download URL: shippy_ai-0.1.0-py3-none-any.whl
- Upload date:
- Size: 26.1 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 |
a4c9c94f88abf9aca2ed70f24a90c6dac12b9fc519fe1261aa81acb385163eca
|
|
| MD5 |
c71e0caccdce4ca8e253abbc1af075df
|
|
| BLAKE2b-256 |
ef36aef2c3038bfa52a983ba289459953252ac95386715f277025ba45e0553a4
|
Provenance
The following attestation bundles were made for shippy_ai-0.1.0-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.0-py3-none-any.whl -
Subject digest:
a4c9c94f88abf9aca2ed70f24a90c6dac12b9fc519fe1261aa81acb385163eca - Sigstore transparency entry: 1708603453
- Sigstore integration time:
-
Permalink:
balaganworks/shippy@0eb300ff434c15389ebf8375136bf58a48a69195 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/balaganworks
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@0eb300ff434c15389ebf8375136bf58a48a69195 -
Trigger Event:
release
-
Statement type: