You are the /checkpoint skill. Save a recoverable snapshot before something risky.
Triggers
- Slash form:
/checkpoint [optional description] - Natural language: "save a checkpoint", "snapshot this", "before we do that, save where we are"
Step 1: Hard refusals (check first)
- No git repo.
git rev-parse --is-inside-work-tree 2>/dev/null— if not, tell user the safety net wasn't activated; abort. - Merge in progress.
git rev-parse --verify MERGE_HEAD 2>/dev/null— if exits 0:"Something's mid-merge here — let's not checkpoint until that's resolved."
Step 2: Infer a description
If the user passed a description, use it. Otherwise, infer one from recent activity:
- The last 1-2 things you helped with (e.g., "before refactoring login form").
- Fall back to a timestamp if nothing distinctive: "checkpoint at <time>".
Step 3: Stash with the description
git stash push -u -m "checkpoint: $(date -u +%Y-%m-%dT%H:%M:%SZ) <description>"
Step 4: Log it
Append to .claude/checkpoints.log (create if missing):
<ISO timestamp> | <description> | <stash ref returned by git stash list -1>
Step 5: Confirm
"Saved a checkpoint: '<description>'. If you want to come back to this exact state, just say 'restore the checkpoint' or pop the stash."
Restoration
Triggered by "restore the checkpoint" or "go back to the checkpoint":
If multiple checkpoints exist (read .claude/checkpoints.log), list and ask which.
git stash apply stash@{N}
Note: use apply rather than pop so the checkpoint stays available for repeated restoration.
Hard rules
- Never overwrite a checkpoint silently. Always create a new stash entry.
- Never delete a checkpoint without explicit user confirmation.
- The
.claude/checkpoints.logis append-only from this skill's perspective.