/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 -v - 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
Run the preflight check, then apply judgment to its results.
Step 1: Gather preflight state
Invoke the gatherer. Pass --issue <n> or --branch <name> when the argument
is a GitHub issue number or branch:
bash "${CLAUDE_SKILL_DIR}/scripts/preflight.sh" --project-dir "$(pwd)" [--issue N] [--branch NAME]
The script fetches origin --prune, resolves the base ref (origin/main →
origin/master → main → master), and emits a structured KEY=VALUE block:
AHEAD / BEHIND divergence, UNCOMMITTED / STASH_COUNT, CONFLICTS
(+ CONFLICT_FILES), existing-work lookups (ISSUE_STATE, EXISTING_PRS,
BRANCH_MATCHES), and a fixed RECOMMENDATION. It degrades gracefully when
gh is unavailable (GH_AVAILABLE=false) and never fails on network errors.
Pass --base <ref> to override the comparison ref, --no-fetch to skip the
network round-trip.
Step 2: Act on existing work (judgment)
Read EXISTING_PRS (#N:STATE:headRef entries) and RECOMMENDATION:
RECOMMENDATION=already-addressed(a:MERGED:PR exists): report that the issue is already addressed and stop — do not duplicate the work.RECOMMENDATION=existing-pr(an:OPEN:PR exists): report the PR and ask the user whether to continue on that branch or start fresh (AskUserQuestion). Do not pick for them.- Otherwise continue to the summary.
Step 3: Summary report
Translate the KEY=VALUE block into a summary the user can act on:
| Check | Source key | Detail |
|-------|-----------|--------|
| Remote state | FETCH | ok / skipped / no-remote |
| Existing PRs | EXISTING_PRS | PR numbers + state, if any |
| Branch state | AHEAD / BEHIND / UNCOMMITTED | ahead/behind counts, dirty tree |
| Conflicts | CONFLICTS / CONFLICT_FILES | conflicting files |
| Stash | STASH_COUNT | number of stash entries |
Lead with the headline RECOMMENDATION, then surface every relevant note —
the recommendation is a single first-match headline, but multiple conditions
can be worth mentioning:
| RECOMMENDATION | Tell the user |
|------------------|---------------|
| resolve-conflicts | Resolve conflicts with the base ref before proceeding |
| commit-or-stash | Commit or stash changes before branching |
| rebase | Rebase on the base ref before starting work |
| existing-pr | A PR already addresses this — review before duplicating |
| already-addressed | A merged PR already addresses this — stop |
| ready | Ready to proceed |
Agentic Optimizations
| Context | Command |
|---------|---------|
| Full preflight (default) | bash "${CLAUDE_SKILL_DIR}/scripts/preflight.sh" --project-dir "$(pwd)" |
| Preflight for an issue | bash "${CLAUDE_SKILL_DIR}/scripts/preflight.sh" --issue N |
| Offline / no network | bash "${CLAUDE_SKILL_DIR}/scripts/preflight.sh" --no-fetch |
| Override base ref | bash "${CLAUDE_SKILL_DIR}/scripts/preflight.sh" --base origin/develop |
The script wraps git fetch --prune, git rev-list --left-right --count,
git merge-tree --write-tree, git stash list, and the gh existing-work
lookups behind one structured-output call. See
scripts/preflight.sh.
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 |