skills/local-branches-status/SKILL.md
Reports the status of all local git branches with remote sync state, main branch diff, worktree path, last activity date, and content description. Use when user mentions branch status, branch overview, local branches, branch report, or branch summary. Helps understand the state of all branches at a glance.
npx skillsauth add rlespinasse/agent-skills local-branches-statusInstall 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.
You are helping the user get a comprehensive overview of all local git branches in their repository. The report shows each branch's sync state, divergence from main, worktree usage, last activity, and a brief description of what the branch contains.
Collect all branch information in a single shell invocation using the batch loop in Step 3. Do not make N separate tool calls per branch — one loop gathers every column for every branch.
Data collected per branch:
Identify the main branch automatically:
git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@'
If that fails, fall back to checking for main or master.
Gather all per-branch data in a single shell loop rather than making separate tool calls for each branch and column. This is critical for efficiency — one invocation collects everything:
main_branch=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@' || echo "main")
current_branch=$(git symbolic-ref --short HEAD 2>/dev/null || echo "")
worktree_list=$(git worktree list)
for branch in $(git for-each-ref --format='%(refname:short)' refs/heads/); do
# Remote sync state
upstream=$(git for-each-ref --format='%(upstream:short)' "refs/heads/$branch")
if [ -n "$upstream" ] && git rev-parse --verify "refs/remotes/$upstream" &>/dev/null; then
counts=$(git rev-list --left-right --count "$upstream...$branch" 2>/dev/null || echo "0 0")
else
upstream=""
counts="no_upstream"
fi
# Main branch diff
if [ "$branch" = "$main_branch" ]; then
main_diff="—"
else
main_diff=$(git rev-list --left-right --count "$main_branch...$branch" 2>/dev/null || echo "0 0")
fi
# Last activity
last_activity=$(git log -1 --format='%cr' "$branch" 2>/dev/null || echo "unknown")
# Worktree path
wt_path=$(echo "$worktree_list" | grep "\[$branch\]" | awk '{print $1}')
# Unique commits summary
unique=$(git log "$main_branch..$branch" --oneline 2>/dev/null)
echo "BRANCH:$branch|UPSTREAM:$upstream|COUNTS:$counts|MAIN_DIFF:$main_diff|LAST:$last_activity|WT:$wt_path|CURRENT:$([ "$branch" = "$current_branch" ] && echo yes || echo no)"
echo "COMMITS:$unique"
echo "---"
done
Use the raw data from Step 3 to format each column:
| Condition | Display |
| --- | --- |
| No upstream configured | no upstream |
| 0 ahead, 0 behind | synced |
| N ahead, 0 behind | +N ahead |
| 0 ahead, N behind | -N behind |
| N ahead, M behind | +N ahead, -M behind |
If an upstream is configured, include the upstream name (e.g., synced with origin/feature-x).
| Condition | Display |
| --- | --- |
| Current branch is main | — |
| 0 ahead, N behind | 0 ahead, -N behind (fully merged, stale) |
| N ahead, 0 behind | +N ahead |
| N ahead, M behind | +N ahead, -M behind |
| Condition | Display |
| --- | --- |
| Branch checked out in main repo | main repo |
| Branch checked out in a worktree | worktree path (last 2 segments, e.g., …/proj-feat-x) |
| Branch not checked out anywhere | no worktree |
When a branch has a dedicated worktree, show the truncated path (last 2 path segments)
so users can navigate directly. For example, /home/user/projects/proj-feat-x becomes
…/projects/proj-feat-x.
Show the relative date of the most recent commit on the branch (e.g., 2 days ago,
3 weeks ago). This helps users prioritize branches by recency, not just divergence counts.
Mark the branch where HEAD currently points with * prefix or (current) suffix in the
Branch column, so the user knows which branch is checked out.
Derive from the unique commits on the branch (commits not on main):
Present results in a summary table:
| Branch | Remote | Main diff | Worktree | Last activity | Description |
| --- | --- | --- | --- | --- | --- |
After the table, add a Notes section highlighting:
Only include notes that are relevant — skip empty categories.
| Branch | Remote | Main diff | Worktree | Last activity | Description |
| --- | --- | --- | --- | --- | --- |
| **main** * | synced | — | main repo | 1 day ago | Current working branch |
| **feature/auth-oauth2** | synced with `origin/feature/auth-oauth2` | +3 ahead, -1 behind | …/wt/auth-oauth2 | 2 days ago | Add OAuth2 authentication flow with token refresh |
| **feature/api-pagination** | no upstream | +2 ahead, -5 behind | …/wt/api-pagination | 5 days ago | Implement cursor-based pagination on REST endpoints |
| **fix/memory-leak** | +1 ahead `origin/fix/memory-leak` | +1 ahead, -3 behind | no worktree | 1 week ago | Fix connection pool memory leak on idle timeout |
| **refactor/db-layer** | no upstream | +6 ahead, -12 behind | …/wt/db-layer | 3 weeks ago | Extract repository pattern from service layer |
| **docs/api-reference** | no upstream | +1 ahead, -2 behind | no worktree | 4 days ago | Update OpenAPI spec with new pagination parameters |
| **spike/grpc-migration** | no upstream | +8 ahead, -20 behind | …/wt/grpc-migration | 2 months ago | Prototype gRPC transport layer, very stale |
| **old/legacy-import** | no upstream | 0 ahead, -15 behind | no worktree | 3 months ago | Fully merged into main, can be deleted |
**Notes:**
- **old/legacy-import** has no unique commits — safe to delete
- **spike/grpc-migration** is stale (20 commits behind main, last activity 2 months ago) — likely obsolete
- **refactor/db-layer** is stale (12 commits behind main, last activity 3 weeks ago) — consider rebase or deletion
- **feature/api-pagination**, **refactor/db-layer**, **docs/api-reference** have no upstream — unpushed
.git/config that no longer
exists on the remote (e.g., after git fetch --prune). Always verify the upstream ref exists
before using it — treat branches with stale upstream refs as having no upstream| Anti-pattern | Why it is wrong | Better alternative |
| --- | --- | --- |
| Listing commits instead of summarizing | Too verbose, defeats the purpose of a summary | Summarize branch intent in one phrase |
| Showing only branch names | Not actionable without context | Include all six columns |
| Skipping stale branch warnings | User may not notice cleanup opportunities | Always flag deletable and stale branches |
| Running git fetch without asking | Modifies state, may be unwanted | Only suggest fetching if data seems stale |
| Guessing branch purpose from name | Branch names can be misleading | Always read the actual commits |
| Making N separate tool calls per branch | Slow and wasteful | Use the batch script to collect all data in one pass |
git fetch without user approval — report on local state onlydevelopment
Ensures all project content is written in proper French with correct accents, grammar, and typography. Use when user mentions french, français, langue française, accents, orthographe, typographie, or when working on a project that requires French language content. Also use when generating any text-based file (SVG, Mermaid, PlantUML, Draw.io, HTML, CSV, JSON, YAML, etc.) in a French-language project. Helps enforce French writing conventions across all file types.
development
Verifies that features listed in a README (or similar documentation) are actually implemented in the codebase. Use when user mentions verify features, check feature list, confirm README, validate documentation claims, or audit feature accuracy. Helps catch stale, missing, or inaccurate feature descriptions.
development
Checks GitHub Actions CI logs on a pull request, diagnoses failures, and guides the agent to implement fixes. Use when user mentions CI failing, check PR logs, fix pipeline, GitHub Actions errors, workflow failures, build broken, tests failing on PR, or debug CI. Focuses on PR-scoped CI analysis only.
testing
Migrates GitHub Actions workflows to use pinned commit SHAs instead of tags, resolves the latest release versions, flags major version jumps, and configures Dependabot with grouped updates. Use when user mentions pin actions, pinned versions, SHA pinning, GitHub Actions security, dependabot setup, or supply-chain security.