Contextual Commit Messages
yamadashy/repomix
Writes Conventional Commits whose bodies carry action lines recording the intent, decisions and constraints behind a change, not only what changed.
Group changes into one atomic commit, draft a Conventional Commit message in COMMITAGENTMSG, put it through an independent review and the commit-msg gates, confirm it with the operator, then commit…
$ npx skills add tbhb/vale-ai-tells --skill commit -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install tbhb/vale-ai-tells commit --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/commit .claude/skills/commit && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "commit" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/commit into .claude/skills/commit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commit", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/commitType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add tbhb/vale-ai-tells --skill commit -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install tbhb/vale-ai-tells commit --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/commit .agents/skills/commit && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "commit" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/commit into .agents/skills/commit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commit", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tbhb/vale-ai-tells --skill commit -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install tbhb/vale-ai-tells commit --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/commit .cursor/skills/commit && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "commit" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/commit into .cursor/skills/commit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commit", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/tbhb/vale-ai-tells.git --path .claude/skills/commit--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add tbhb/vale-ai-tells --skill commit -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install tbhb/vale-ai-tells commit --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/commit .gemini/skills/commit && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "commit" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/commit into .gemini/skills/commit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commit", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install tbhb/vale-ai-tells commitInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add tbhb/vale-ai-tells --skill commit -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/commit .github/skills/commit && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "commit" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/commit into .github/skills/commit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commit", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add tbhb/vale-ai-tells --skill commit -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install tbhb/vale-ai-tells commit --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/tbhb/vale-ai-tells.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/commit .opencode/skills/commit && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "commit" agent skill from https://github.com/tbhb/vale-ai-tells/tree/main/.claude/skills/commit into .opencode/skills/commit/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commit", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
commitGroup changes into one atomic commit, draft a Conventional Commit message in COMMITAGENTMSG, put it through an independent review and the commit-msg gates, confirm it with the operator, then commit…
Commit is an agent skill from tbhb/vale-ai-tells. Group changes into one atomic commit, draft a Conventional Commit message in COMMITAGENTMSG, put it through an independent review and the commit-msg gates, confirm it with the operator, then commit and rebase. Use this skill whenever the user asks to commit work in a tbhb repo ("commit this," "commit the staged changes," "write a commit message") or whenever a task ends in creating a commit.
Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including scripts (for example `scripts/commit.sh`, `scripts/guard-git.sh` and `scripts/preflight.sh`).
It sits in Development, covering Commit messages. The repository describes itself as: In today's rapidly evolving landscape, vale-ai-tells is a comprehensive, cutting-edge Vale style package that empowers writers to seamlessly delve into the rich tapestry of AI…. The licence is Apache-2.0.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit a96c5fe. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 4 files in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
gitmisebashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Commit loads about 3.3k tokens when it runs. Until then it costs about 101 tokens; SKILL.md has 1,921 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from tbhb/vale-ai-tells at commit a96c5fe, republished under its Apache-2.0 licence (© tbhb). 1,921 words, ~3,295 tokens.
.claude/skills/commit/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Work the steps in order. A guard hook runs alongside them and refuses whole-tree staging along with any git commit you write out yourself. Step 8 names the one script that commits, and that script refuses an inline -m message, a --no-verify, and a draft the reviewer hasn't seen in its current form.
Those hooks stay registered for the rest of the session so they carry a scope. Preflight records the commit HEAD sits on now, and the guard refuses while HEAD is still there. Step 8 moves HEAD past that mark, and the guard refuses nothing after that. Work later in the session is none of the guard's business. A second commit means invoking this skill again rather than carrying on from here.
!bash ${CLAUDE_SKILL_DIR}/scripts/preflight.sh
Track these steps with the session's task-list tools where it carries them. Newer harnesses leave those tools out by default, and a session without them works the list in order as written. They're the checklist the rest of this document expands.
Stop before any of it if preflight reports a rebase, merge, or cherry-pick in progress, or a missing precondition. Say what's wrong and hand back.
Preflight computed this under == rebase base ==. Take its recommendation:
origin/<default> and skip the stale local copy.Record the base now. Step 9 rebases onto it without asking again. Worktrees under .claude/worktrees are the usual layout here, and each one has its own checkout of the branch.
Read the diff before deciding anything. One commit carries one logical change: the reader can state its purpose in a sentence, and reverting it undoes that purpose and nothing else.
Split when the outstanding work covers more than one of these:
A dependency doesn't force a split. Code and the test that covers it belong together, as do a change and the documentation that describes it.
When the work splits, commit the first group through this workflow, then say which groups remain and run the workflow again for each. Never bundle them because bundling is quicker.
When one file mixes two logical changes, stage the relevant hunks with git add -p, or say so and let the operator decide.
Name every path:
git add -- path/one path/twoNever git add -A, git add ., or git add --all. They sweep in whatever else is uncommitted, which is how an atomic commit stops being atomic. The guard hook refuses all three.
Confirm the result with git diff --cached --stat and git status --short. The staged set matches the group from step 2, and anything left unstaged belongs to a later commit.
Write the whole message to COMMIT_AGENTMSG at the repo root. A gitignore entry keeps it out of history, and a post-commit hook deletes it after the commit succeeds.
<type>(<scope>)?(!)?: <description>, with the type drawn from the list preflight printed. Imperative mood, present tense, lowercase after the colon, no trailing period, and the whole line inside the bounds preflight reported. Write the description as the instruction the commit carries out: explain the tools, not explains and not explained.
The body answers why this change exists. The diff already says what changed, and a reader who wants the what reads the diff.
Write:
Avoid:
Adds a helper to foo.go and calls it from bar.go is the diff, spelled out longer.Assisted-by trailer carries attribution.fixes the flake for a flake you never reproduced.robust, comprehensive, significantly, seamlessly, and their neighbors.Hard wrap the body at the width preflight reported. Wrap trailers at the footer width.
Assisted-by before Signed-off-by, matching the format and the sign-off identity preflight printed. Never credit a model through Co-authored-by.
Invoke the fix-prose skill before the review, passing the draft and the task that judges it:
Skill(fix-prose, args: "COMMIT_AGENTMSG mise run lint-commit-msg")It runs the lint rounds in a subagent, so the findings and the retries stay out of this session. The commit scope is stricter than the repository-wide one, and a message copied verbatim out of the diff still fails it, so this is rarely a no-op.
Order matters here. The review in the next step signs the exact bytes it read, and a later lint fix voids that signature and costs another review round over a comma. Running fix-prose first holds the loop to one round.
Where it returns PROSE: PARTIAL, a finding needs a decision rather than another round. Read the short list, settle it, and send the answer back in the arguments.
Invoke the review-commit-message skill, passing the repo root from preflight as its argument. It runs as an independent agent that hasn't watched you work, which is the point: it reads the draft against the staged diff with no memory of what you meant to write.
This step is mandatory, and the script in step 8 enforces it. A clean verdict signs the exact bytes of the draft, and a finding erases any earlier signature, so the commit stays blocked until a review clears the text as it stands. Editing the draft afterward voids the signature the same way.
Fix everything it returns. Push back only when it's demonstrably wrong about the diff, and say why.
mise run lint-commit-msgThat task mirrors the commit-msg hook:
ai-tells-commitsStep 5 should have left this clean. Where it hasn't, send the findings back to fix-prose rather than editing the draft here, because a hand-edit spends the context that skill exists to save.
Edited the draft to make the linters pass? Then step 6 runs again before you commit, because the gate compares bytes rather than intentions.
Whatever this task reports, .git/COMMIT_EDITMSG and its commit-msg hook stay the real gate. A clean run here only predicts that hook's verdict.
AskUserQuestion truncates its options, so the operator reads the message in your message text rather than in the widget. Print this first, verbatim:
Staged: <paths, comma separated>
<the entire COMMIT_AGENTMSG contents, verbatim>Preflight answered this under == pre-approval ==. Where it reported commit: GRANTED, the operator answered this question for the whole session in advance, through mise run preapprove. Print the preceding block so the message still reaches them, name the grant this commit goes under, and move to step 9 without calling AskUserQuestion.
The grant answers one question, commit this message, and says nothing about whether this is the right commit. Ask anyway where any of these holds:
The operator withdraws a grant with mise run revoke-preapproval. Say so where a run keeps arriving at one of those exceptions.
Where preflight reported commit: not granted, call AskUserQuestion with question set to Commit this message?, header set to Commit, multiSelect set to false, and these four options in order:
| Label | Description |
|---|---|
Commit it | The subject line, verbatim |
Revise the message | Staging stands. Redraft the message, review it again, and come back. |
Restage and redraft | The grouping is wrong. Regroup the changes and start from step 2. |
Stop here | Leave the draft, the index, and the branch untouched. |
Follow the answer. Revising or restaging sends you back through the review, because the gate compares bytes.
bash .claude/skills/commit/scripts/commit.shNothing else commits. The guard hook refuses a git commit you write out yourself whatever flags it carries, because every gate named below lives in the script and a hook on the tool call can't reach inside one.
That script checks the review signature and records what the staging area holds before it commits, then reads the commit back and compares. prek stashes and restores the worktree around the pre-commit hooks. A failed run can leave a path unstaged that you staged before the attempt, and the retry then commits part of the group without reporting it. The script prints every path it expected and didn't find and then fails. Its output is the check, so nothing needs a git show --stat after it.
The script pins commit.cleanup=whitespace for you. At the default of strip, git drops every body line opening with a number sign, and it does so after review-commit-message has hashed the file, so the bytes the reviewer cleared stop matching the bytes git records.
Only --amend passes through, which is the form fix-pr routes here for. The script refuses every other flag, because a hook reading the tool call sees bash commit.sh and none of the flags underneath it.
Then rebase onto the base from step 1, without asking:
git -c rebase.updateRefs=false -c rebase.autoSquash=false rebase --autostash <base>Same reasoning, two more knobs. rebase.updateRefs quietly moves other local branches that point into the replayed range. rebase.autoSquash collapses any fixup! commit, each of which earned its own review.
--autostash scopes the save to the rebase itself. Never a bare git stash pop: worktrees share one stash stack, so a bare pop can take another session's entry.
Where that rebase stops on a conflict, hand it to the rebase skill rather than resolving it here. That skill classifies each conflicted path before resolving it, then checks what the replay did to each commit.
Report the resulting commit, then the groups still waiting from step 2, if any.
This skill assumes the shared tbhb toolchain:
mise run lint-commit-msg taskCOMMIT_AGENTMSGreview-commit-message and fix-prose skills deployed alongside this onePreflight checks each. When one is missing, tell the operator rather than improvising a substitute.
The workflow commits the repository holding the session. review-commit-message reads its draft and its diff from that root, and step 8's script reads the draft and the signature from whichever repository it runs in. A sibling checkout has no signature of its own, so the script stops there rather than committing on a review that read another tree. To commit a different repository, open a session there.
© tbhb, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (scripts) in .claude/skills/commit of tbhb/vale-ai-tells.
Open the folder on GitHubat commit a96c5fe
Commit next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Commit this skilltbhb/vale-ai-tells | 115 | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Contextual Commit Messagesyamadashy/repomix | 29k | 1 repos | ~2.7k | Automated safety check: Pass | MIT | |
| React Router Release Notes Prepremix-run/react-router | 57k | — | ~1.1k | Automated safety check: Pass | MIT | |
| PR Finalize Reviewmicrosoft/garnet | 12k | — | ~3.1k | Automated safety check: Pass | MIT | |
| Caveman Commitvishiri/fantasia-archive | 409 | 13 repos | ~642 | Automated safety check: Pass | GPL-3.0 | |
| ToolJet Multi-Repo CommitToolJet/ToolJet | 41k | — | ~1.3k | Automated safety check: Pass | AGPL-3.0 |
yamadashy/repomix
Writes Conventional Commits whose bodies carry action lines recording the intent, decisions and constraints behind a change, not only what changed.
remix-run/react-router
Polishes pending React Router change files before the versioning scripts run, and decides whether a long-form What's Changed section is warranted.
microsoft/garnet
Checks that a pull request's title and description match its implementation and reviews the code for Garnet best practices, reporting findings without posting them.
vishiri/fantasia-archive
Ultra-compressed commit message generator. An agent skill from vishiri/fantasia-archive.
ToolJet/ToolJet
Commits changes across ToolJet's root repo and its server/ee and frontend/ee submodules, writing messages from the diffs and updating submodule pointers in order.
addyosmani/agent-skills
Sets git habits for every change: short-lived branches, atomic commits with descriptive messages, clean pull requests, plus versioning, tagging and changelogs for releases.
tbhb/vale-ai-tells
Query a Claude Code transcript without reading it into context, then write the retrospective to disk so it remains available after the session ends.
tbhb/vale-ai-tells
Query a Codex transcript without reading it into context, then write the retrospective to disk so it remains available after the session ends.
tbhb/vale-ai-tells
Diagnose failing pull request checks, reproduce them locally, make focused fixes, commit them through codex-commit, and refresh the published description when needed.
tbhb/vale-ai-tells
Squash merge a pull request. An agent skill from tbhb/vale-ai-tells.
tbhb/vale-ai-tells
Open or update a pull request for the current branch with an independently drafted and reviewed PRAGENTDESC.md.
tbhb/vale-ai-tells
Replay the current branch onto its base and establish that the result is sound.
Categories
Group changes into one atomic commit, draft a Conventional Commit message in COMMITAGENTMSG, put it through an independent review and the commit-msg gates, confirm it with the operator, then commit…. Commit is an agent skill from tbhb/vale-ai-tells. Group changes into one atomic commit, draft a Conventional Commit message in COMMITAGENTMSG, put it through an independent review and the commit-msg gates, confirm it with the operator, then commit and rebase.
Commit fits situations like: the user asks to commit work in a tbhb repo (commit this; commit the staged changes; write a commit message); whenever a task ends in creating a commit.
Run `npx skills add tbhb/vale-ai-tells --skill commit -a claude-code`. Or copy the skill folder (.claude/skills/commit in tbhb/vale-ai-tells) into .claude/skills/commit in your project. Claude Code loads it when a task matches its description.
Run `npx skills add tbhb/vale-ai-tells --skill commit -a codex`. Or copy the skill folder (.claude/skills/commit in tbhb/vale-ai-tells) into .agents/skills/commit in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tbhb/vale-ai-tells --skill commit -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/commit, .gemini/skills/commit, .github/skills/commit and .opencode/skills/commit in your project.
Going by SKILL.md and its folder, Commit needs a shell for the scripts in its folder and the command-line tools its instructions call (git, mise and bash). Our summary lists: A Bash shell.
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Commit is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.3k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Commit: Contextual Commit Messages (yamadashy/repomix, 29k stars), React Router Release Notes Prep (remix-run/react-router, 57k stars), PR Finalize Review (microsoft/garnet, 12k stars) and Caveman Commit (vishiri/fantasia-archive, 409 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
tbhb (a GitHub user) maintains it in tbhb/vale-ai-tells, which has 115 GitHub stars. The repository holds 27 skills in this directory. The repository was last updated on October 7, 2026.
Source: tbhb/vale-ai-tells on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.