A CLI that writes commit messages, splits dirty trees into logical commits, rewrites past history, generates changelogs, opens pull requests, and resolves merge conflicts.
$ git status
M src/auth.py
M src/api.py
M tests/test_auth.py
M README.md
?? src/rate_limit.py
$ git log --oneline
a1b2c3d feat(auth): add rate limiting
e4f5g6h test(auth): cover edge cases
i7j8k9l docs: document auth flags
$ # bump every manifest by hand
$ vim package.json Cargo.toml pyproject.toml
$ # write a changelog entry
$ vim CHANGELOG.md
$ git add -A
$ git commit -m "release v0.1.0"
$ git tag v0.1.0
$ git push && git push --tags
$ # if anything failed, clean up by hand
$ imp release --minor
→ Bump: 0.0.53 → 0.1.0
→ Synced 3 manifests, wrote changelog
→ Tagged v0.1.0, pushed
# rollback on any failure is automatic
<<<<<<< HEAD
rate_limit = RateLimiter(per_ip=10, window=60)
=======
rate_limit = RateLimiter(per_user=20, window=300)
>>>>>>> feat/per-user-limits
# read both branches, decide, hand-merge, repeat per file
$ imp resolve
→ src/auth.py: combine per-IP and per-user limits
Apply? [Yes / Edit / No]
→ Done. 1 file resolved.
imp commitimp splitimp tidyimp primp releaseimp resolveimp fleet
$ imp commit -a
→ feat: add rate limiting to API endpoints
Use this message? [Yes / Edit / No]
$ imp pr
→ Title: feat: rate limit auth endpoints
→ Body: ## Summary
Adds per-IP rate limiting to /login and /register...
Create PR? [Yes / Edit / No]
$ imp release
→ Bump: patch / minor / major
→ Squashes commits, writes CHANGELOG.md, syncs package manifests, tags v0.0.1, pushes.
At release time imp scans for package files (package.json, Cargo.toml, pyproject.toml, composer.json, pubspec.yaml, *.gemspec, mix.exs, build.gradle, pom.xml, Chart.yaml, manifest.json) and asks the AI which ones belong to this project. Vendored copies, fixtures, and dynamic-versioned manifests are skipped. Picked manifests are rewritten and staged into the release commit; rollback restores them on failure. Pass --no-manifests to disable.
Pre-release versions are translated to each ecosystem's native format. v0.0.52-rc.1 becomes:
| Ecosystem | Version |
|---|---|
| npm, cargo, helm, pub, hex, gradle | 0.0.52-rc.1 |
| python (PEP 440) | 0.0.52rc1 |
| composer, maven | 0.0.52-RC1 |
| rubygems | 0.0.52.rc1 |
browser-ext manifest.json (no pre-release support) | 0.0.52 |
imp release --rc commits the manifest bump alongside the tag so the published artifact's version matches. imp changelog --apply only labels existing commits with retroactive tags, so it leaves manifests alone.
| imp | aicommits | OpenCommit | commitizen | |
|---|---|---|---|---|
| Commit message from diff | yes | yes | yes | prompts you |
| Conventional Commits | enforced | optional | optional | enforced |
| Split dirty tree into commits | yes | — | — | — |
| Rewrite past history | yes (tidy) | — | — | — |
| AI changelog | yes | — | — | template |
| AI PR title + body | yes | — | — | — |
| AI merge conflict resolution | yes | — | — | — |
| Local models (Ollama) | yes | partial | yes | n/a |
| Claude CLI | yes | — | — | n/a |
| Runtime deps | 3 | many (Node) | many (Node) | many (Python) |
aicommits and
OpenCommit
cover the commit-message step. imp covers the whole loop: dirty tree → clean commits → PR → release → changelog.
Claude Code can write commit messages too. They are different shapes for different jobs.
| imp | Claude Code | |
|---|---|---|
| Interaction | one-shot command | conversational session |
| Latency | sub-second to a few seconds | multi-turn |
| Scriptable in hooks, aliases, CI | yes | — |
| Conventional Commits | enforced | whatever you ask for that day |
| Semver from commit history | computed | manual |
| Manifest sync + atomic rollback | built in | — |
Multi-repo (imp fleet) | yes | single session |
| Local / offline / private | yes (Ollama) | — |
| Cost | free with Ollama | subscription / API |
Use Claude Code for open-ended work where you need a thinking partner. Reach for imp for the same git ritual you do twenty times a day, where you want a verb, not a chat.
They compose: imp can use the Claude CLI as its provider, so the prompts run inside your existing Claude subscription.
pip install imp-git
# or try without installing:
uvx --from imp-git imp doctor
pipx run --spec imp-git imp doctor
Configure your AI provider:
imp config
imp doctor
Works with the Claude CLI or local Ollama models. No API key required for Ollama.
Hover any token to see what it does. Type to filter.
Any AI command accepts -w / --whisper to steer the AI without overriding its rules:
imp commit -a -w "use IMP-42 as ticket"
imp review -w "focus on error handling"
imp config writes ~/.config/imp/config.json (or $XDG_CONFIG_HOME/imp/config.json).
{
"provider": "claude",
"model:fast": "haiku",
"model:smart": "sonnet"
}
Each key has a matching env var (IMP_AI_PROVIDER, IMP_AI_MODEL_FAST, IMP_AI_MODEL_SMART) that takes precedence over the file.
fix, pr, release)