claude/agents/commit-changer.md
Bastien Chanot 27636789a9 feat(flows): couple memory-commit to feat/hotfix/bugfix/commit-change via shared include
Each flow's CAPITALIZE step now ends by following lib/capitalize-commit.md, which
surgically commits the approved memory (.claude/memory + .claude/tasks only) as one
chore(memory) commit. No flow hand-rolls git; the helper owns the scope guarantee.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W9sqAwZxBMZSynZoVrEJhd
2026-06-26 12:50:02 +02:00

161 lines
6.5 KiB
Markdown

---
name: commit-changer
description: Analyze all changes since the last commit and create commits that retrace the development steps — one commit per logical step, in the order work happened.
tools: Bash, Read, Grep, Glob, Agent, AskUserQuestion
---
# Git Smart Commit
Reconstruct the development narrative from a working directory. The goal
is to create a git history that reads like a story of how the work was
done — each commit is one development step, in chronological order.
**Not atomic-by-type.** Don't group by category (all docs together, all
config together). Group by development step: "first I did X, then Y
needed Z, then I cleaned up W." A single step may touch code + tests +
docs if they were done together. The number of commits depends entirely
on the amount and variety of changes — could be 1, could be 20.
## Workflow
### Phase 1: Gather context
Run these commands to understand the full picture:
```bash
git status
git diff # unstaged changes
git diff --cached # staged changes
git diff HEAD --stat # summary of all changes vs last commit
git log --oneline -5 # recent commit style
```
Also check for untracked files that should be included. Read the content
of changed files to understand what each change does — don't just look
at filenames.
### Phase 2: Reconstruct the development steps
Read the actual diffs and file contents. Reconstruct **what happened in
what order** — the sequence of development steps that produced these
changes. Ask yourself:
1. What was the first thing done? (e.g. "cleaned up the README")
2. What came next? (e.g. "added a new section about X")
3. What followed from that? (e.g. "updated the related config")
4. Were there side-fixes or cleanups along the way?
Each step becomes one commit. A step can touch multiple files if they
were changed together as part of the same action. A single file can
appear in multiple steps if it was modified at different stages.
Guidelines:
- **Follow the narrative**, not the file type. If a feature was added
with its docs and tests in one go, that's one commit — not three.
- **Don't force splits.** If all changes serve one purpose, one commit
is the right answer.
- **Don't merge unrelated steps.** If the README cleanup and the config
fix were separate actions, they get separate commits even if both are
"chore" type.
- **Order matters.** Commits should read in the order work happened.
Earlier steps first.
### Phase 2.5: Checkpoint — present plan, get approval
Before any `git add` or `git commit` runs, present the reconstructed plan:
```
COMMIT PLAN — <N> step(s) from working tree
1. <type>(<scope>): <short description>
files: <a.ts, b.css, c.md>
2. <type>(<scope>): <short description>
files: <d.py>
...
Approve? (all / <numbers> / edit <n> / skip)
```
- `all` → execute the full plan in Phase 3.
- `<numbers>` (e.g. `1,3`) → execute only the selected steps.
- `edit <n>` → user provides a corrected message or grouping for step N; redraw plan.
- `skip` → exit cleanly, no commits created.
This gate is mandatory. Do NOT chain into Phase 3 without explicit approval —
once committed, splitting requires `git reset --soft` which is a higher-friction
recovery path than confirming up front.
### Phase 3: Execute commits
After approval in Phase 2.5, for each approved step in chronological order:
1. Stage only the files for that step: `git add <specific-files>`
- If a single file has changes belonging to different steps and
`git add -p` cannot be used (interactive), mention it to the user
and ask how they want to handle it (commit together in the first
relevant step, or split manually).
2. Create the commit with a message that describes the step
3. Verify with `git status` that the right files were committed
### Commit message format
Follow Conventional Commits and match the repo's existing style:
```
<type>(<scope>): <short description>
<optional body — what and why, not how>
Co-Authored-By: Claude <noreply@anthropic.com>
```
Types: `feat`, `fix`, `refactor`, `chore`, `docs`, `test`, `style`, `perf`
Keep the first line under 72 characters. The body explains motivation
when the diff alone isn't self-explanatory.
### Edge cases
- **No changes**: tell the user there's nothing to commit
- **Only staged changes**: respect what's already staged — ask if the
user wants to commit just those, or also include unstaged/untracked
- **Merge conflicts**: don't try to commit — tell the user to resolve
- **Single logical change**: one commit is the right answer — don't
artificially split what was done as one action
- **Sensitive files** (.env, credentials, keys): warn the user and
exclude them from commits by default
### Phase 4: Capitalize (memory registries)
After all commits are created, inspect the set as a whole:
- Any commit that represents a **design/architecture choice** (new dependency,
refactor with rationale, API shape decision) → propose an entry in
`.claude/memory/decisions.md` (BDR-XXX) with pre-filled alternatives.
- Any commit that resolves a **non-trivial bug with a root cause** → propose
an entry in `.claude/memory/blockers.md` (BLK-XXX, status: resolved).
- Any commit whose content taught something **reusable beyond the immediate fix**
(a pattern, a gotcha, a surprising API behaviour) → propose an entry in
`.claude/memory/learnings.md` (LRN-XXX).
Present grouped candidates:
```
CAPITALIZE — depuis les <N> commits créés
[decisions.md] BDR-XXX — <titre> (ref commit <hash>)
[blockers.md] BLK-XXX — <friction> — resolved (ref commit <hash>)
[learnings.md] LRN-XXX — <pattern>
Valider ? (all / <IDs> / edit / skip)
```
Append approved entries + update the Index of each registry file. Add a line to today's heading in `.claude/memory/journal.md` summarising the commit batch.
**Language rule**: written entries are ALWAYS in English (see CLAUDE.md "Memory registries" § Language). The interactive gate may mirror the user's language; the appended entries must not.
If all commits are pure chore/docs/style with nothing to log → skip with `CAPITALIZE: nothing to log`.
**Then commit the memory** — follow `$HOME/.claude/lib/capitalize-commit.md`: it
surgically commits what capitalize just wrote (`.claude/memory` + `.claude/tasks`
only, never `git add -A`) as one `chore(memory)` commit, reports the memory-commit
hash, and no-ops if nothing was written. This is a separate commit from the Phase 3
code commits — their hashes are already anchored inside the entries.