AI Can Write the Commit Subject. It Cannot Approve the Commit.

A good commit message is small, which is why it is so easy to postpone until the exact moment your brain is tired of the diff.
AI can summarize that diff. The dangerous part is everything around the summary: which files are sent, whether unstaged work gets mixed in, whether a lockfile consumes the entire context, where the API key lives, and whether a generated sentence becomes a commit before you read it.
Commit Quill puts one rule around that workflow: generation is not approval.
Start from the staged boundary
Run Commit Quill: Generate Commit from the Command Palette or the Source Control title bar.
When staged changes exist, the extension sends the selected provider only:
- the staged diff;
- the staged file list; and
- recent commit subjects used to detect a stable local convention.
It writes the generated subject into VS Code's Source Control input box. You review it beside the diff and commit with the button you already use.
The extension supports your own OpenAI, Anthropic, or Gemini API key. Keys are stored separately by provider in VS Code Secret Storage, not workspace settings. Model names live in global settings so a repository does not acquire someone else's provider configuration by accident.
Yes, there is an optional direct-commit mode. It still asks for confirmation first. Convenience gets a shorter path, not ownership of the decision (the quill may write; it does not get voting rights).
Keep generated noise from hiding the source change
Large diffs create a simple failure mode: the model sees the beginning and misses the reason for the commit.
Commit Quill collapses configured lockfiles and generated project files to a line count before applying its character limit.
In one measurement recorded by the project, a regenerated package-lock.json occupied 86% of the diff and pushed the first source file from character 4,890 to 140,972.
Without collapsing, the model would have received lockfile noise instead of the implementation.
Diffs are capped, and oversized or binary untracked files are named rather than read. The extension tells you when content was withheld or truncated.
That disclosure matters. A commit subject generated from a partial diff can still be useful; a subject pretending the partial diff was complete is not.
An unstaged tree is a different problem
When nothing is staged but the working tree has changes, the extension can propose independent file groups.
It shows the grouping before it stages or commits anything. Each group is then processed only after approval. Existing staged changes always take precedence, and split groups may reference only paths Git actually reported.
Grouping is harder than summarizing one staged diff. The project documents that distinction and lets you configure a stronger model only for the split step. You do not need to pay for that model on every ordinary commit.
If you do not want automatic splitting at all, disable it. Commit Quill will produce one message for the working tree, write it into the input box, and leave every file unstaged.
Failure should end before mutation
A malformed provider response, missing model or key, cancellation, or Git failure stops the workflow without creating a new commit. Each provider request has a cancellable progress notification, and cancellation aborts the in-flight request.
When the tree is clean, the command exits before it reads an API key or calls a provider. There is nothing to summarize, so nothing leaves the machine.
This is not the most magical possible behavior. It is the behavior I want near version control.
Let AI draft inside a human workflow
Commit Quill does one job: it writes commit messages. It does not replace review, choose what deserves to be committed, or turn a language model response into authority.
Commit Quill is for the staged diff waiting on one last sentence.
Let the model hold the pen.
Keep your hand on the commit button.
Get the next post.
If you made it to the end, meet the next post in your inbox or RSS reader.