Skip to main content

Generate a well-structured commit message based on staged changes

Project description

🧠 The Problem: The Empty Commit Syndrome

empty commit

You just wrapped up an intense dev session. You proudly run:

git add .
git commit ""

And then… nothing.

The cursor blinks. The quotes are empty. No idea what to write.
How do you summarize what you just did? How do you follow commit conventions? Should you mention the ticket? Where? How?

That’s where Commitly comes in.


🚀 What is Commitly?

Commitly is a Python library that uses AI to automatically generate smart commit messages from your staged Git changes (git diff --cached).

No more writer’s block. Commitly gives you clear, structured, multilingual messages — even splits large diffs into logical commits if needed.


📦 Installation

Install Commitly via PyPI:

pip install commitly

Make sure Git is installed and properly configured on your system.


⚙️ Main Features

🔹 __init__(model=gpt_4o_mini, file_temp="commit.txt", lang="en")

Creates a Commitly instance:

  • model: AI model to use (default is gpt_4o_mini via g4f).
  • file_temp: temporary file name to save the commit message.
  • lang: output language (en or fr).

🔹 add(file: str) -> bool

Adds a file to the Git staging area.

commitly.add("app/models/user.py")

🔹 generate_commit_message(...) -> dict | List[dict]

Generates one or more commit messages from the current staged diff.

Parameters:

  • style_commit, format_commit, recommandation_commit: customize commit style and instructions.
  • ticket: ticket ID to include in the footer of the commit.
  • fact (bool): enables smart factorization to split the diff into multiple coherent commits.

⚠️ Raises a DiffEmptyException if no changes are detected in staging.


🔹 save_message_to_file(message: str) -> bool

Saves a generated commit message to the temporary file.


🔹 commit() -> bool

Performs a Git commit using the message saved in the temp file and deletes it afterward.


🔹 push()

Pushes your changes to the remote repository.


🔹 unstage(file: str)

Removes a file from the staging area (git reset <file>).


🔹 file_stage() -> List[str]

Returns a list of currently staged files (git diff --cached --name-only).


🔹 _run_cmd(cmd: str, return_code: bool = False)

Internal method to execute shell commands.


🧪 Full Example

from commitly.commitly import Commitly

commitly = Commitly()

# Stage a file
commitly.add("main.py")

# Generate a message with a ticket
message = commitly.generate_commit_message(ticket="#42")

# Save it and commit
commitly.save_message_to_file(message)
commitly.commit()
commitly.push()

🧠 Example with smart factorization

messages = commitly.generate_commit_message(ticket="#42", fact=True)
for item in messages:
    print(item["commit"], ":", item["files"])

Example output:

[
    {
        "commit": "feat[core]: add role management to authentication",
        "files": ["auth/roles.py", "auth/utils.py"]
    },
    {
        "commit": "docs: update setup guide",
        "files": ["docs/setup.md"]
    }
]

🧩 About the Commit Format

Generated messages follow a conventional structure:

<type>[optional scope]: <description>

[optional body]

[optional footer] ← ticket goes here (#1234)

Common types:

  • feat: a new feature
  • fix: a bug fix
  • docs: documentation-only changes
  • refactor: code changes that neither fix a bug nor add a feature
  • chore: other routine tasks like config or CI changes

💡 Why use Commitly?

✅ Say goodbye to “wip” commits
✅ Enforce a consistent commit standard across your team
✅ Generate logical, factorized commits from complex diffs
✅ Multilingual support (EN/FR)
✅ Easy integration into any Git workflow


📋 License

MIT © 2025 Kouya Chance Boman Tosten


Stop staring at your empty commit. Let Commitly tell the story of your code — one commit at a time.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

commitly-2.0.5.tar.gz (11.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

commitly-2.0.5-py3-none-any.whl (9.7 kB view details)

Uploaded Python 3

File details

Details for the file commitly-2.0.5.tar.gz.

File metadata

  • Download URL: commitly-2.0.5.tar.gz
  • Upload date:
  • Size: 11.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.2

File hashes

Hashes for commitly-2.0.5.tar.gz
Algorithm Hash digest
SHA256 530ddf8cdef2a3b1d0bd96c2fcfa10ba03b99f99812dbf7be09a71306b1f68f8
MD5 d7866b8ba7ea940e1724b3f0ca4e39b8
BLAKE2b-256 0ee692ad41c27746af47b206398003e821aeadcda1c1f03224d8b17915620a4b

See more details on using hashes here.

File details

Details for the file commitly-2.0.5-py3-none-any.whl.

File metadata

  • Download URL: commitly-2.0.5-py3-none-any.whl
  • Upload date:
  • Size: 9.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.12.2

File hashes

Hashes for commitly-2.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 2a1990e76265eb548459ffe01b103154aa21925ffc3ff0ea1674d0f3e772c5ab
MD5 e6b1040d8c8904bdb21ac449a9d810c4
BLAKE2b-256 d8464d6f27143ae447cb62db051eca1153b1f39a91e59979ada2c55df61e0de0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page