ce-commit
everyinc/compound-engineering-plugin
Create well-crafted git commits with clear, value-communicating messages.
What is ce-commit?
This skill creates local git commits from staged or unstaged changes with explicit file lists and outcome-focused messages. Use it when you need to save work with a repo-appropriate commit message—no push or PR.
- Gathers repository context (branch, recent commit style, default branch) before committing
- Creates feature branches automatically if on detached HEAD or default branch
- Matches project commit conventions or uses conventional commits (type: description)
- Splits changes into logical commits when files address distinct concerns
- Stages named files only and writes commit messages to avoid shell parsing issues
- Reports commit hashes and subjects after completion
How to install ce-commit
npx skills add https://github.com/everyinc/compound-engineering-plugin --skill ce-commitHow to use ce-commit
- 1.Run the skill when you have staged or unstaged changes to commit
- 2.The skill gathers context automatically (branch, recent commits, default branch)
- 3.Review the proposed commit message and confirm it matches your intent
- 4.The skill stages named files and creates the commit with the message
- 5.Check the reported commit hash and subject to verify success
Use cases
- Save a bug fix with a clear message explaining what was remedied
- Commit a new feature with proper conventional commit formatting
- Split related but distinct changes into separate logical commits
- Ensure commits stay off the default branch by auto-creating feature branches
- Preserve uncommitted files by excluding specific paths from the commit
- Developers working with git repositories
- Teams following conventional commit conventions
- Anyone needing consistent, well-documented commit history
ce-commit FAQ
The skill automatically creates a feature branch from your changes and commits there instead, preventing work from being left only on main/master.
Yes, use the `exclude:<paths>` option in your invocation; those files will remain uncommitted and noted in the report.
No, it only creates local commits. Use `ce-commit-push-pr` for the full workflow including push and PR creation.
It defaults to `fix:` when both fit (remedying broken or missing behavior), and reserves `feat:` for new capabilities. You can override this choice.
The skill can split them into 2–3 separate commits at the file level if the changes clearly address distinct concerns; otherwise it creates one commit.
Full instructions (SKILL.md)
Source of truth, from everyinc/compound-engineering-plugin.
name: ce-commit description: Create a git commit with a clear, value-communicating message. Use when the user asks to commit/save staged or unstaged changes with a repo-appropriate message.
Git Commit
Create well-crafted local commit(s) from the current working tree. No push, no PR — use ce-commit-push-pr for the full ship flow.
Done when: each logical change is committed with an explicit file list and a message that states the outcome, and git status is clean of those changes. Stop when: the tree is clean (nothing to commit).
Context
Gather context with each command as its own shell tool call (program + args only). Do not join with ;, &&, ||, pipes, $(...), or redirects — that syntax fails under Windows PowerShell. A non-zero exit is a normal state to interpret, not a failure to suppress.
| Command | Purpose | Non-zero / empty means |
|---|---|---|
git status | Working-tree state | Not a git repo — stop |
git diff HEAD | Uncommitted changes | Unborn repo / no commits yet |
git branch --show-current | Current branch | Empty = detached HEAD |
git log --oneline -10 | Recent message style | Unborn repo — no history |
git rev-parse --abbrev-ref origin/HEAD | Remote default branch | No origin/HEAD / bare HEAD — try gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name', else main |
Treat this as a snapshot. Re-read branch and staged set immediately before committing if anything may have changed.
Default branch name: strip a leading origin/ from origin/HEAD (so origin/trunk → trunk). Use that bare name for all “on the default branch?” checks — never compare against origin/<name>.
Workflow
-
Gather — run every Context command above (own shell call each), then continue.
-
Nothing to commit — if
git statusshows no staged, modified, or untracked files, report that and stop. Do not usegit diff HEADalone as cleanliness (it misses untracked files). -
Branch first — if detached HEAD, or on the default branch (
main/master/ the bare default name above), create a feature branch from the change content (git checkout -b <name>), then re-readgit branch --show-current. Do not ask — commit-only still must not leave work only on a detached HEAD or the default branch. If the derived name exists, pick a non-conflicting suffix. -
Convention — match project commit conventions already in context; else match the recent log pattern; else conventional commits (
type(scope): description). When using conventional commits andfix/featboth fit, default tofix:(remedying broken or missing behavior); reservefeat:for new capabilities. User override wins. -
Logical commits — if changed files clearly split into distinct concerns, make separate commits (file level only, 2–3 max, no
git add -p). If ambiguous, one commit. -
Message — subject is imperative and names the outcome (what is now possible or fixed), not the file list. Body only when motivation or trade-offs are not obvious from the subject. When a plan Implementation Unit ID is already in hand for this commit (conversation, caller, or the files belong to one unit), append that unit's U-ID in parentheses —
(U3)means unit 3. Do not hunt for a plan. Omit when the commit spans units, the unit is unclear, or no plan is in hand.- Bad:
Update checkout.rb/Add tests and fix stuff - Good:
Fix double-submit on checkout - Good:
Add per-subscription mute (U3)
- Bad:
-
Stage and commit — stage named files only (never
git add -Aorgit add .). Honorexclude:<paths>when the invocation carries it: those files stay uncommitted no matter what else changed; say in the report that they were left out. Write the full message — subject line, blank line, optional body — to a file outside the repo with your file-write tool, then stage and commit as two calls per commit group:
git add file1 file2 file3
git commit -F <message-file> -- file1 file2 file3
No shell parses the message with -F: a $, quotes, backticks, or a multi-line body pass through literally under any shell, with no quoting rules to satisfy. Git's normal whitespace cleanup still applies (trailing spaces trimmed, blank-line runs collapsed), which is fine for a commit message.
The trailing path list on git commit is required: a bare git commit takes the whole index, so anything already staged before this run (a caller's exclude: paths, or work the user staged and did not name) would ride into the commit. Naming the paths commits exactly the group and leaves other index entries alone.
- Confirm —
git status; report hash(es) and subject(s).
Related skills
More from everyinc/compound-engineering-plugin and the wider catalog.

ce-commit-push-pr
Commit, push, and open a pull request with optional PR description composition.

ce-compound
Document solved problems as durable repo learning when reasoning isn't evident in code or tests.

ce-compound-refresh
Audit and refresh captured learnings against the current codebase to eliminate drift, overlap, and staleness.

ce-debug
Diagnosis loop for bugs and failing behavior with test-first fix discipline.

ce-demo-reel
Capture visual demos (GIFs, terminal recordings, screenshots) for PR descriptions with automatic project detection and secret filtering.

ce-dhh-rails-style
Apply DHH's 37signals Rails style: vanilla Rails, fat models, REST purity, and clarity over cleverness.