skills/git-visual-commits/SKILL.md
Structured git commit workflow with emoji-first subjects and identity-aware modes: `git bot commit`, regular `git commit`, and `git our commit`. Use this skill whenever the user asks to commit changes, stage files, write a commit message, or review what should be committed. Also use it when the user says "commit this", "make a commit", "commit your changes", "commit what you just did", "what should my commit message be", "stage and commit", "git bot commit", "git our commit", or combines a commit request with "yolo" or "auto". Treat commit wording as an automatic trigger for this skill, not as a casual hint. Supports auto-approval mode, defaults to no prefix after the emoji, allows an emoji plus conventional-commit prefix combo only when the user explicitly asks for it, keeps subjects under 70 chars, validates commit-language choices against the inspected reference, and verifies author/body after commit.
npx skillsauth add codebeltnet/agentic git-visual-commitsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.

This skill drives the entire git commit workflow — reviewing changes, grouping them logically, composing messages with the right emoji, and only adding a conventional prefix when the user explicitly asks for that combo. It supports three identity modes: bot-attributed (git bot commit), human-attributed (git commit), and collaborative (git our commit).
git bot commit, you must use git bot commit.git commit, you must use git commit.git our commit, follow the attribution workflow and then use the matching command per group.git bot commit to git commit.git bot alias is unavailable, halt and report that exact blocker instead of falling back to human identity.git bot commit.yolo / auto skips user confirmation only. It never skips:
If the user did not say yolo or auto, and session-level auto mode is not already enabled, do not run any commit command yet. You must stop after Step 4, present the plan, and wait for approval.
If the user says git bot commit, git commit, or git our commit without narrowing language, treat the request as covering the full current worktree.
yolo keeps this same full-worktree default. It removes the approval wait; it does not narrow scope.Narrow scope only when the user explicitly does one of these:
just, only, for this, for X, commit the README changes, or equivalent limiting languageIf the user did not narrow scope, do not invent a narrower scope on their behalf.
git status, git diff, git diff --staged, and when relevant git reflog.git stash when you need to preserve work before changing tactics.references/commit-language.md in the current session before choosing any emoji or prefix.references/ directory or installed skill folder first. Do not reinterpret it as a repo-root references/commit-language.md path unless the user explicitly points you there.references/commit-language.md file but the bundled skill reference is available, that is not a blocker. Read the bundled skill resource and continue.<emoji> <short description>. Do not add a prefix after the emoji unless the user explicitly asked for a combo with conventional commits or conventional prefixes.💬 intent by default. Do not collapse that category back into generic 📝 or 📚 docs wording when the main audience is humans reading repo health or release status.After every commit, run:
git log -1 --format="%an <%ae>"
Confirm that the author matches the requested identity mode. If the author is wrong, treat the commit as invalid and repair it before reporting success.
Then verify the stored commit message body too:
git log -1 --format=%B
If the body contains literal escape sequences such as \n instead of real line breaks, treat the commit message as invalid and repair it before reporting success.
Also reject a stored short prose body when it was split across lines only to chase a 72-column habit. If a non-empty body line ends mid-sentence and the next non-empty line simply continues that same sentence, treat the commit message as invalid and repair it before reporting success. A single short paragraph should usually stay as one natural prose line; add manual line breaks only for real paragraphing, lists, quotes, or readability-driven separation.
Reject a single umbrella commit when the diff spans multiple intents such as:
SKILL.md, FORMS.md, references/, evals/)assets/, scaffold helper scripts)scripts/, repo validators)README.md, AGENTS.md, CONTRIBUTING.md)yolo, small file count, or "the changes are related" are not valid reasons to collapse these into one commit.
The git bot commit command requires a one-time alias setup in your global git config. Run this once per machine:
git config --global alias.bot '!git -c user.name="<bot-name>" -c user.email="<bot-email>"'
Replace <bot-name> and <bot-email> with the identity you want AI-authored commits to appear under.
Verify it works:
git bot commit --allow-empty -m "test bot identity"
git log -1 --format="%an <%ae>" # should show bot name and email
git reset HEAD~1 # undo the test commit
If git config --global --get alias.bot returns nothing when the user asked for git bot commit, stop and report that the bot alias is missing. Do not proceed with git commit as a fallback.
git bot commit vs git commit vs git our commitIn all cases, the AI does all the work — reviewing changes, grouping them logically, composing the message, staging files, and running the command. The only difference is which identity the commit is attributed to.
| | git bot commit | git commit | git our commit |
|---|---|---|---|
| When | User asks the AI to commit (e.g. "commit your changes", "do a git bot commit") | User asks to commit under their own identity (e.g. "please do a git commit") | User says "our commit" or the work was collaborative (both human and agent edited files) |
| Who gets credit | Bot alias (e.g. aicia[bot]) | Human's default git profile | Agent analyzes authorship, human picks attribution |
| Command | git bot commit -m "..." | git commit -m "..." | Either, based on human's choice |
git our commit worksWhen the user says "our commit" (or similar), the agent attributes each commit to whoever authored the files in it:
🤖 Agent-authored: src/UserService.cs, src/UserController.cs
👤 Human-authored: README.md, appsettings.json
🤝 Mixed/unclear: src/Startup.cs
git bot commitgit commit1. 🙈 add gitignore (👤 you)
Files: .gitignore
2. 🦾 add agent agreements (🤖 bot)
Files: AGENTS.md
3. 🍱 add photo and hero image assets (👤 you)
Files: assets/dj-photo.jpg, assets/hero.png
The user confirms or adjusts the plan — they can override any attribution.Co-authored-by trailer (GitHub's PR flow already tracks collaboration)The commit message format, emoji conventions, grouping strategy, and everything else is identical for both. The profile is the only thing that changes.
Never add or modify git remotes. Never set git user.name or git user.email locally.
Default format:
<emoji> <short description>
<body>
Only when the user explicitly asks for an emoji plus conventional-commit combo:
<emoji> <prefix>: <short description>
<body>
references/commit-language.mdreferences/commit-language.md) — never use feat:no-body (see below).Read references/commit-language.md before choosing a prefix or emoji. It contains the allowed prefixes, the gitmoji-first table, and the extended emoji fallback guidance shared with git-visual-squash-summary. Keep that duplicated reference byte-for-byte aligned with the git-visual-squash-summary copy; the validator and CI both enforce that sync contract.
Treat references/commit-language.md as a bundled skill resource path, not as a repository-relative path. If a tool reports that the current repo lacks a top-level references/ folder, re-check the skill resource location before declaring a blocker.
That reference now defines prefixes as opt-in. Unless the user explicitly asked for an emoji plus conventional-commit combo, keep subjects in the default <emoji> <short description> form. For community health, changelog, and release-status communication, prefer 💬 from that same reference rather than generic docs emoji.
By default, the agent presents a commit plan and waits for user confirmation before staging and committing (Step 4). Auto-approval mode skips this wait — the plan is still displayed for transparency, but the agent proceeds immediately.
What auto-approval skips: user confirmation only. What auto-approval never skips: classification (Step 2), grouping validation (Step 3), and the mixed-scope guard. These self-checks run unconditionally — they exist to catch bad groupings before they become commits, regardless of whether a human is reviewing the plan.
Include the word "yolo" or "auto" anywhere in your request:
The agent will show a one-line commit plan summary and proceed without waiting. Example:
Auto-committing: 🔧 build/toolchain → 🚚 moved types → 💥 breaking shim removal → 💬 release notes
Say "enable yolo mode" or "enable auto mode" to activate auto-approval for the rest of the session. All subsequent commits skip the approval gate until the user says "disable yolo mode" or "disable auto mode".
Note: Auto-approval applies to all three identity modes (
git commit,git bot commit,git our commit). Forgit our commit, the agent still presents the authorship breakdown and attribution — but proceeds with its best-guess attribution without waiting for confirmation. The user can always say "undo" or "reset" if the result isn't right.
By default, every commit includes a body paragraph explaining why the change was made. This can be suppressed when only a subject line is desired.
Include "no-body" or "tmi" anywhere in your request:
Say "enable no-body mode" or "enable tmi mode" to suppress commit bodies for the rest of the session. All subsequent commits will be subject-only until the user says "disable no-body mode" or "disable tmi mode".
Note: No-body mode suppresses the body paragraph only. The subject line, emoji, prefix, classification, and grouping rules all still apply.
Run git status and git diff (and git diff --staged if there are staged changes) to understand what has changed.
Unless the user explicitly narrowed scope, inspect the entire current worktree and build the commit plan from that full set of changes. Do not default to the last task only.
Don't commit blindly — understand what each file is doing before grouping.
Before planning commits for git bot commit or other identity-sensitive flows, also verify the execution path itself: confirm the alias exists, confirm the chosen tool can execute it faithfully, and prefer a direct shell or terminal path when there is any doubt.
Read references/commit-language.md before drafting subject lines. If you cannot inspect that file in the current session, stop and report the blocker instead of guessing.
When resolving that reference, prefer the bundled skill path first instead of treating repo-root references/ absence as a failure.
Before composing any commit message, bucket every changed file by its semantic intent — not just its file type. Read the actual diff for each file and ask: "What is this change trying to accomplish?" Two files of the same type (e.g. two test files) may have completely different intents and belong in separate commits.
Use the inspected commit-language reference as the meaning source, not your gut. For example, restructuring an existing skill's SKILL.md, FORMS.md, references/, or evals/ is normally refactor intent and should map to ♻️; configuration-file changes map to 🔧; truly new repo or application capabilities map to ✨.
Derive categories from the actual diff — don't assume a fixed set. Common categories include:
💬These categories are examples, not a fixed taxonomy. Reuse the rationale behind them even when another repo uses different filenames or technologies.
Critical distinction: "Environment/configuration" and "Test logic" are separate categories even when both live under a test project. A test environment config file (testenvironments.json, appsettings.test.json) describes how tests run. A test assertion file describes what tests verify. These are different intents.
Repo-skill distinction: Adding a brand-new skill folder is a new repo capability. Extracting shared wording, tightening an existing skill, or adding validator coverage for that skill is a different intent. Even when all of that work is related, do not collapse "new skill introduced" and "existing skill refactored" into one commit.
This classification drives grouping in Step 3. Files with different semantic intents almost never belong in the same commit.
Group changes by semantic intent, not just by file type or directory. Ask yourself: "Could I explain each commit in one sentence without using the word 'and'?" If you need "and" to describe what a commit does, it's likely two commits.
Temporal proximity is not a grouping signal. Changes made in the same round, same editor session, or same PR are still separate commits when their rationale, audience, or lifecycle role differs.
For every proposed commit, verify that all files share the same rationale. Prefer multiple commits when:
When only two files changed but their rationales differ, explicitly state that two commits are warranted in the commit plan. Small file count does not justify bundling.
Unless no-body mode is active, every commit includes a body explaining the why:
Common groupings:
When in doubt, one commit per "thing that changes" is better than one big commit.
After grouping, validate each proposed commit. If a single commit contains files from three or more different categories from Step 2 (e.g. docs + package props + solution files + API removals), force a split. A commit that touches documentation, build configuration, and source code at the same time is almost always an umbrella commit that should be broken apart.
This guard runs unconditionally — including in auto-approval mode.
Documentation files (CHANGELOG.md, AGENTS.md, README.md, CONTRIBUTING.md, release notes) are separate-by-default. They only belong in the same commit as non-doc files when the commit is explicitly documentation-focused (e.g. 📝 add api usage guide where the docs are the point, not a side effect).
Do not treat "all of this supports the release" as one commit. Release-adjacent work often spans different audiences and lifecycle roles that deserve separate history:
.nuget/*/PackageReleaseNotes.txt, and publish targets; this bucket normally maps to 📦These buckets are examples, not a fixed file map. The rule is the abstraction: split by purpose and audience, not by the fact that the changes landed together.
Concrete example: if one diff updates Directory.Build.targets, Directory.Packages.props, or testenvironments.json, another diff updates CI scripts or workflow files such as bump-nuget.py or .github/workflows/*.yml, and another diff updates CHANGELOG.md plus .nuget/*/PackageReleaseNotes.txt, that is at least three intents:
Do not collapse those into one commit, even if they were edited in the same round and all support the same release. Keep .nuget/*/PackageReleaseNotes.txt with the 📦 package/publish commit, not with the 💬 community-health commit.
When a repo like this one mixes skill changes, scaffold assets, validators, and repo docs, split them by intent:
skills/<name>/ folder and its local evals/ or references/SKILL.md, FORMS.md, references/, evals/assets/, scaffold helper scriptsREADME.md, AGENTS.md, CONTRIBUTING.mdDo not merge these into one commit unless the diff is truly single-purpose and the explanation still fits one sentence without using "and".
If a commit both introduces a brand-new skill and refactors an existing skill to support it, prefer separate commits. "Related" is not enough — the repo history should make it obvious which commit added the capability and which commit reorganized existing behavior around it.
Treat renamed/moved source files and removed type-forwarding or compatibility metadata as different signals — never group them together:
using updated) → move/refactor commit (🚚 or ♻️)[TypeForwardedTo], removed public-API compatibility shims, dropped re-exports) → breaking-change commit (💥)Even when renames and removals happen in the same PR, they represent different intents and must be separate commits.
Before staging or committing anything, present the full commit plan to the user. For each proposed commit, show:
1. 🚚 rename auth module to identity
Files: src/Auth/ → src/Identity/, README.md
2. ✅ add integration tests for identity module
Files: tests/Identity.Tests/
Before you render that plan, validate every proposed emoji and every proposed prefix against the inspected references/commit-language.md. Fix mismatches before the user sees them. If the user did not explicitly ask for a conventional-commit combo, strip prefixes from the proposed subjects before presenting the plan.
If auto-approval is not active, Step 4 is a hard stop. Do not stage, do not commit, and do not treat silence or momentum as approval.
If auto-approval is active (via "yolo"/"auto" keyword or session-level setting), display a one-line summary and proceed immediately to Step 5:
Auto-committing: 🔧 build config → 🚚 rename auth to identity → ✅ identity tests → 💬 update changelog
Even in auto-approval mode, surface the commit buckets explicitly before committing. Auto-approval removes the wait, not the planning step.
If the user did not narrow scope, the plan you surface must account for the full worktree rather than an arbitrarily chosen subset.
Otherwise, wait for the user to confirm or adjust. They may say things like:
Only proceed to Step 5 after the user approves the plan.
If the user's response is ambiguous, such as "4 is wrong now" or "that was fine before", do not guess whether the issue is the emoji, prefix, message body, grouping, or the underlying code change. Ask a short clarification question first and keep the worktree unchanged until they answer.
Before committing, validate each message against its file list:
For each group:
git add <specific files> — be precise, don't use git add . unless everything belongs in one commitgit bot commit -m "<subject>" — if the user asked the AI to commit (bot identity)git commit -m "<subject>" — if the user asked to commit under their own identitygit our commit — use whichever command matches the attribution the human chose-m "<subject>" -m "<body>" to add the optional description paragraphFor git bot commit, use an execution path that can run the alias directly and transparently. If a wrapper tool cannot prove it will actually execute git bot commit, switch to direct shell or terminal execution before committing.
When a commit body spans multiple lines, use real multiline input such as multiple -m arguments or a shell construct that preserves actual line breaks. Do not pass literal \n escape sequences and assume the shell will rewrite them. Prefer grammatical sentence and paragraph breaks over column-based hard wrapping.
When the body is just one short explanatory paragraph, prefer a single natural prose line in the stored commit message. Do not press Enter mid-sentence to satisfy an arbitrary width target.
After committing, run git log --oneline -5 to confirm the commit looks right. Then always run git log -1 --format="%an <%ae>" and verify that the author matches the requested identity mode before reporting success. Also run git log -1 --format=%B and verify the stored body contains readable prose with real line breaks, not literal escape sequences such as \n, and is not hard-wrapped mid-sentence just to satisfy a column limit. If that verification fails, amend the commit immediately instead of merely warning about it.
If verification fails because the commit path used the wrong author or ignored the requested alias, stop treating it as a message-tweaking problem. Correct the tool path first, preserve the worktree safely, and only then repair the commit.
Subject-only (when the change is self-explanatory):
🎉 begin api project
✨ add submission endpoint module
🐛 handle null optional fields in dto
➕ add validation library
With body (when context adds value):
🚚 rename templates/ to assets/ per Anthropic skill conventions
Align with the official skill directory structure: SKILL.md, scripts/, references/, and assets/. Updates all path references in SKILL.md, reference docs, and AGENTS.md for both app and library skills.
♻️ streamline app skill with FORMS.md wizard
Replace inline parameter table with structured FORMS.md form definition.
Step 1 now references FORMS.md instead of listing 12 fields inline.
When the user explicitly asked for the emoji plus conventional-commit combo:
🐛 fix: handle null optional fields in dto
♻️ refactor: streamline app skill with FORMS.md wizard
With body repair after a bad first attempt:
💬 add git release-note guidance
Clarify when the repo should keep release-note docs separate from code changes so commit history stays easier to scan and review.
feat: add submission endpoint ← "feat:" is not an allowed prefix
✨ Feat: Add Submission Module ← uppercase, "Feat:" not allowed
🎉 initial commit with all files ← vague, bundles everything
⚙️ config: setup api ← "config:" is not an allowed prefix
♻️ refactor: reorganize skill wording ← bad default if the user did not ask for the combo
💬 add git release-note guidance
Clarify when the repo should keep release-note docs separate
from code changes so commit history stays easier to scan and review.
← bad wrap: short prose split mid-sentence for width only
Branch format: [version]/[description]
Examples:
v1.0.0/mvp — initial MVPv1.1.0/validation — adding validationv1.2.0/admin-dashboard — adding a new feature areaDon't create, rename, or delete branches unless the user explicitly asks.
testing
Generate GitHub release notes by summarizing all commits and pull requests between two Git tags, branches, or the current branch and the upstream default branch. Use when the user asks to write release notes, generate release notes, draft a GitHub release, create release notes from tags, summarize changes between versions, summarize the current branch, or provides a GitHub compare URL. Trigger phrases: "release notes", "generate release notes", "what changed between", "summarize changes from v1 to v2", "GitHub release", "summarize this branch", compare URLs like "github.com/owner/repo/compare/v1...v2". When no explicit input is given, detects the current branch and compares against the upstream default branch automatically.
development
Classifies .NET library or NuGet package changes and recommends the correct release bump: Major, Minor, or Patch. Applies both Semantic Versioning (MAJOR.MINOR.PATCH) and .NET assembly/file versioning (Major.Minor.Build.Revision), grounded in Microsoft’s official .NET library compatibility rules. Use when evaluating the current branch, breaking changes, API diffs, public API changes, dependency updates, TFM/platform support, interface or enum changes, overloads, analyzers, source generators, or binary/source/behavioral/design-time/backwards compatibility. When no explicit change details or compare range are provided, inspects the current Git branch and compares it against the upstream default branch automatically. Always returns structured compatibility reasoning with the recommendation.
documentation
Generate source-grounded repository digest markdown from deterministic local evidence bundles. Use when the user asks to create, refresh, or complete repo/package digests, family or project overview pages, .bot/digests output, digest workspace workflows, or result/Index.md plus result/{PackageName}.md files for any repository URL. The skill runs its bundled .NET file-based evidence generator over a git clone, separates authoritative XML evidence from Markdown prompts and reading aids, writes package digests first, then writes the overview from completed package digests, and enforces complete-read grounding and no-invention rules even when file output is capped.
testing
Turn many commits into a curated grouped squash summary compatible with the opinionated wording style of git-visual-commits. Use when the user asks to squash a branch into a concise summary, write a squash-and-merge summary, summarize this branch, summarize a commit range or PR as grouped lines, clean up noisy commit history, or asks for a curated summary without committing. For normal squash-and-merge requests, default to the full current feature branch from merge-base to HEAD against the base branch instead of a same-named tracking remote, include commits from all authors unless the user explicitly narrows by author, and do not ask for yolo because the skill is read-only. Returns grouped lines only, preserves identifiers, merges overlap, drops noise, and avoids changelog wording.