contextual-commit
Write contextual commits that capture intent, decisions, and constraints alongside code changes. Use when committing code, finishing a task, or when the user…
Reconstruct and narrate the current development context from contextual commits. Run at session start, when resuming work, or when switching branches. Produces a brief, conversational summary of where things stand.
$ npx -y skills add berserkdisruptors/contextual-commits --skill recall --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/recallContext preview
The summary Claude sees to decide when to auto-load this skill.
Reconstruct and narrate the current development context from contextual commits. Run at session start, when resuming work, or when switching branches. Produces a brief, conversational summary of where things stand.
name: recall description: >- Reconstruct and narrate the current development context from contextual commits. Run at session start, when resuming work, or when switching branches. Produces a brief, conversational summary of where things stand. license: MIT
Reconstruct the development story from contextual commit history and present it as a natural briefing.
Check how `recall` was invoked:
---
Determine the working state:
CURRENT_BRANCH=$(git branch --show-current)
DEFAULT_BRANCH=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main")
# Find the actual parent branch, not just the repo default.
# Try upstream tracking branch first (fast path).
BASE_BRANCH=$(git rev-parse --abbrev-ref @{upstream} 2>/dev/null | sed 's|^origin/||')
# If no upstream, find the nearest local branch by commit distance.
if [ -z "$BASE_BRANCH" ]; then
BASE_BRANCH=$(git for-each-ref --format='%(refname:short)' refs/heads/ | while read branch; do
[ "$branch" = "$CURRENT_BRANCH" ] && continue
echo "$(git log --oneline "$branch..$CURRENT_BRANCH" 2>/dev/null | wc -l | tr -d ' ') $branch"
done | sort -n | head -1 | awk '{print $2}')
fi
# Final fallback to default branch.
BASE_BRANCH=${BASE_BRANCH:-$DEFAULT_BRANCH}
UNSTAGED=$(git diff --stat)
STAGED=$(git diff --cached --stat)
BRANCH_COMMITS=$(git log ${BASE_BRANCH}..HEAD --oneline 2>/dev/null | wc -l | tr -d ' ')`DEFAULT_BRANCH` identifies the repository's primary branch (for scenario C/D detection). `BASE_BRANCH` identifies the closest ancestor branch — which may differ when feature branches are created from non-default branches (e.g., a feature branched from `develop`). All branch-relative queries use `BASE_BRANCH`.
This is the richest scenario. Gather:
# Contextual action lines from all branch commits
git log ${BASE_BRANCH}..HEAD --format="%H%n%s%n%b%n---COMMIT_END---"
# Unstaged changes (what's in progress right now)
git diff --stat
git diff # read the actual diff for key changes
# Staged changes
git diff --cached --stat# Unstaged and staged changes only
git diff --stat
git diff --cached --stat
# Last few commits on the parent branch for project context
git log ${BASE_BRANCH} -10 --format="%H%n%s%n%b%n---COMMIT_END---"# Recent commit history with contextual action lines git log -20 --format="%H%n%s%n%b%n---COMMIT_END---"
# Same as C plus uncommitted changes git log -20 --format="%H%n%s%n%b%n---COMMIT_END---" git diff --stat git diff --cached --stat
From the gathered commit bodies, extract lines matching:
^(intent|decision|rejected|constraint|learned)\(
Group them by commit (preserve chronological order) and by type (for synthesis).
**Signal density over narrative flow.** The output should be compact, scannable, and grounded entirely in what the commits and diffs show. Every line should be actionable information. No fluff, no conversational padding.
Output the branch state, then synthesize the contextual action lines into a dense briefing organized by what matters most for continuing work.
Example output:
Branch: feat/google-oauth (4 commits ahead of main, unstaged changes in tests/) Active intent: Add Google as first social login provider. GitHub and Apple to follow. Approach: passport.js with /api/auth/callback/:provider convention. Rejected: auth0-sdk — session model incompatible with redis store. Constraints: - Redis session TTL 24h, tokens must refresh within window - Callback routes must follow existing :provider pattern Learned: passport-google needs explicit offline_access scope for refresh tokens. In progress: Integration tests for callback handler (unstaged).
When branched from a non-default branch:
Branch: feat/oauth-refresh (2 commits ahead of develop, no uncommitted changes) Active intent: Implement token refresh for OAuth providers. Constraint: Must stay compatible with the session store changes on develop.
Priority order: 1. Active intent (what we're building and why) 2. Current approach (decisions made) 3. Rejected approaches (what NOT to re-explore — critical) 4. Constraints (hard boundaries) 5. Learnings (things that save time) 6. In-progress work (unstaged/staged changes)
If intent evolved during the branch (a pivot), show both the original and current intent to make the pivot visible.
Branch: feat/new-feature (0 commits ahead of develop) No contextual history on this branch yet. Staged: 2 files (src/auth/provider.ts, src/auth/types.ts) Unstaged: none Recent project activity (from develop): - Auth: OAuth provider framework merged, Google working - Payments: Multi-currency support shipped (EUR, GBP alongside USD)
Synthesize recent merged work from the last 20 commits. Group by area of activity. Surface any active constraints or learnings that apply broadly.
Recent project activity: Auth: OAuth provider framework merged. Google working, GitHub and Apple planned. - Rejected auth0-sdk (session model incompatible with redis store) - Constraint: redis session TTL 24h, tokens must refr
Conventional Commits standardised WHAT changed. Contextual Commits add WHY. A convention for embedding decision traces in git commit bodies.
Repo: berserkdisruptors/contextual-commits
Write contextual commits that capture intent, decisions, and constraints alongside code changes. Use when committing code, finishing a task, or when the user…