AI-powered git commit message generator
Project description
cmtr
cmtr writes your git commit messages for you. It uses the OpenAI API (gpt-5.2), the staged diff, and recent commit history to match the repository's style.
Quick start (recommended)
- Install uv (if needed), then run:
uvx cmtr@latest
- Optional: add a shell alias:
alias cmtr="uvx cmtr@latest"
- Export your API key:
export OPENAI_API_KEY=...
- Stage changes and run:
git add -Acmtr
Or install the git hook:
cmtr --hook- Installs a
prepare-commit-msghook that automatically generates a commit message right before the commit editor opens. If there is already a message or you're in a rebase/fixup/squash flow, it skips.
- Installs a
Usage
cmtr- Behaves like
git commit -v, but injects a generated commit message.
- Behaves like
cmtr --dry-run- Print the generated message without committing.
cmtr --no-edit- Skip opening the editor after generating the message.
cmtr --hook- Install the
prepare-commit-msghook to auto-generate messages on every commit.
- Install the
cmtr --uninstall-hook- Remove the hook.
Extra git commit flags can be passed directly (for example, --no-verify). Avoid -m/-F/-C/-c because cmtr supplies the message.
How it builds context
- Uses staged files (
git diff --cached) for the actual changes. - Finds shared paths and samples recent
git logmessages on those paths to learn the repo's style.
Configuration
Configuration is loaded in this order (later overrides earlier):
- XDG config file (
~/.config/cmtr/config.tomlor$XDG_CONFIG_HOME/cmtr/config.toml) cmtr.tomlin the repo root (optional repo-specific overrides)- Environment variables
- CLI flags
Manage global config with:
cmtr config pathcmtr config listcmtr config get modelcmtr config set model gpt-5.2cmtr config unset model
Example config file:
model = "gpt-5.2"
max_diff_bytes = 12000
max_patch_lines = 400
max_log_entries = 20
max_log_paths = 4
max_log_body_lines = 6
timeout_seconds = 60
reasoning_effort = "none"
text_verbosity = "low"
base_url = "https://api.openai.com/v1"
organization = "org_..."
Environment variables:
OPENAI_API_KEYOPENAI_BASE_URLOPENAI_ORGCMTR_MODELCMTR_MAX_DIFF_BYTESCMTR_MAX_PATCH_LINESCMTR_MAX_LOG_ENTRIESCMTR_MAX_LOG_PATHSCMTR_MAX_LOG_BODY_LINESCMTR_TIMEOUT_SECONDSCMTR_REASONING_EFFORTCMTR_TEXT_VERBOSITY
Development
Local development:
mise installmise run installmise run run
Type checking:
mise run typecheckuv run ty check
If you are installing manually, run uv sync --group dev first to install the ty tool.
Troubleshooting
- No staged changes: run
git addbefore cmtr. - Missing API key: set
OPENAI_API_KEYin your environment. - Hook failures: a
# cmtr failed: ...comment is appended to the commit message template.
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 cmtr-0.1.0.tar.gz.
File metadata
- Download URL: cmtr-0.1.0.tar.gz
- Upload date:
- Size: 12.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e49080035d48b094f4094a3807e996cc4733f1d5847a8be39fddb3c818ffaeb9
|
|
| MD5 |
1aec0b99c4fe0ee404c57c89daac9a67
|
|
| BLAKE2b-256 |
9d6917b3a24bd72a970daf10a49415d974fa21e240a8699d5da5718e83daa3d0
|
Provenance
The following attestation bundles were made for cmtr-0.1.0.tar.gz:
Publisher:
publish.yml on shayne/cmtr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cmtr-0.1.0.tar.gz -
Subject digest:
e49080035d48b094f4094a3807e996cc4733f1d5847a8be39fddb3c818ffaeb9 - Sigstore transparency entry: 779205693
- Sigstore integration time:
-
Permalink:
shayne/cmtr@2421aa0acbc558437afcbf4d6a72b4d4d3b8c6b9 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/shayne
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2421aa0acbc558437afcbf4d6a72b4d4d3b8c6b9 -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file cmtr-0.1.0-py3-none-any.whl.
File metadata
- Download URL: cmtr-0.1.0-py3-none-any.whl
- Upload date:
- Size: 16.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f87c38c4e5e26892a308ace2b7195bd7e35f56b3f434c7dfcf8c8ad42929f83
|
|
| MD5 |
242659b750b95efb95d199fd861a2638
|
|
| BLAKE2b-256 |
733554706a375eac714828fc924b1769aca5d326772bae5c8f6a374242ecc64f
|
Provenance
The following attestation bundles were made for cmtr-0.1.0-py3-none-any.whl:
Publisher:
publish.yml on shayne/cmtr
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cmtr-0.1.0-py3-none-any.whl -
Subject digest:
1f87c38c4e5e26892a308ace2b7195bd7e35f56b3f434c7dfcf8c8ad42929f83 - Sigstore transparency entry: 779205694
- Sigstore integration time:
-
Permalink:
shayne/cmtr@2421aa0acbc558437afcbf4d6a72b4d4d3b8c6b9 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/shayne
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2421aa0acbc558437afcbf4d6a72b4d4d3b8c6b9 -
Trigger Event:
workflow_dispatch
-
Statement type: