/workflow:preflight
Pre-work validation to prevent wasted effort from stale state, redundant work, or branch conflicts.
When to Use This Skill
Use this skill when... Skip when...
Starting work on a new issue or feature Quick single-file edit
Resuming work after a break Already verified state this session
Before spawning parallel agents Working in an isolated worktree
Before creating a branch for a PR Branch already created and verified
Context
-
Repo: !git remote get-url origin
-
Current branch: !git branch --show-current
-
Remote tracking: !git branch -vv --format='%(refname:short) %(upstream:short) %(upstream:track)'
-
Uncommitted changes: !git status --porcelain
-
Stash count: !git stash list
Execution
Step 1: Fetch Latest Remote State
git fetch origin --prune 2>/dev/null
Step 2: Check for Existing Work
If an issue number was provided, check if it's already addressed:
Check if issue exists and its state
gh issue view $ISSUE --json number,title,state,labels 2>/dev/null
Check for PRs that reference this issue
gh pr list --search "fixes #$ISSUE OR closes #$ISSUE OR resolves #$ISSUE" --json number,title,state,headRefName 2>/dev/null
Check for branches that reference this issue
git branch -a --list "issue-$ISSUE" --list "fix/$ISSUE" --list "feat/$ISSUE" 2>/dev/null
If a merged PR exists: Report that the issue is already addressed. Stop. If an open PR exists: Report the PR and ask if the user wants to continue on that branch or start fresh.
Step 3: Verify Branch State
Check divergence from main/master
git log --oneline origin/main..HEAD 2>/dev/null || git log --oneline origin/master..HEAD 2>/dev/null
Check if main has moved ahead
git log --oneline HEAD..origin/main -5 2>/dev/null || git log --oneline HEAD..origin/master -5 2>/dev/null
Check for uncommitted changes
git status --porcelain=v2 --branch 2>/dev/null
Report:
-
Commits ahead/behind remote
-
Uncommitted changes that might interfere
-
Whether a rebase is needed
Step 4: Check for Conflicts
Dry-run merge to detect conflicts (without actually merging)
git merge-tree $(git merge-base HEAD origin/main) HEAD origin/main 2>/dev/null | head -20
Step 5: Summary Report
Output a structured summary:
Check Status Detail
Remote state fresh/stale Last fetch time
Existing PRs none/open/merged PR numbers if any
Branch state clean/dirty/diverged Ahead/behind counts
Conflicts none/detected Conflicting files
Stash empty/N items Stash contents
Recommendations:
-
If behind remote: "Rebase recommended before starting work"
-
If existing PR found: "PR #N already addresses this - review before duplicating"
-
If dirty state: "Commit or stash changes before branching"
-
If conflicts detected: "Resolve conflicts with main before proceeding"
-
If clean: "Ready to proceed"
Agentic Optimizations
Context Command
Quick remote sync git fetch origin --prune 2>/dev/null
Check existing PRs gh pr list --search "fixes #N" --json number,state,headRefName
Branch divergence git log --oneline origin/main..HEAD
Conflict detection git merge-tree $(git merge-base HEAD origin/main) HEAD origin/main
Compact status git status --porcelain=v2 --branch
Remote tracking git branch -vv --format='%(refname:short) %(upstream:track)'
Quick Reference
Flag Description
git fetch --prune
Fetch and remove stale remote refs
git status --porcelain=v2
Machine-parseable status
gh pr list --search
Search PRs by content
gh issue view --json
Structured issue data
git merge-tree
Dry-run merge conflict detection
git log A..B
Commits in B but not A