Creates feature branches with optimized short naming, auto-incrementing, and commit type detection (feat/fix/refactor). Supports manual descriptions and auto-generation from uncommitted git changes. Use when user requests to create branch, start new branch, make branch, checkout new branch, switch branch, new task, start working on, begin work on feature, begin feature, create feature branch, run /create-branch command, or mentions "branch", "feature", "new feature", "feat", "fix", or "checkout".
Inherits all available tools
Additional assets for this skill
This skill inherits all available tools. When active, it can use any tool Claude has access to.
EXAMPLES.mdTROUBLESHOOTING.mdWORKFLOW.mdExecute feature branch creation with intelligent naming, automatic type detection, and sequential numbering.
This skill is invoked when:
/create-branch or /git:create-branch commandThe command takes a description and automatically detects the commit type.
Format: /create-branch <description>
Examples:
/create-branch add user authentication
→ Creates: feat/001-user-authentication
/create-branch fix login bug
→ Creates: fix/002-login-bug
/create-branch refactor auth service
→ Creates: refactor/003-auth-service
/create-branch remove deprecated code
→ Creates: chore/004-remove-deprecated
/create-branch document api endpoints
→ Creates: docs/005-document-api
When no arguments provided, analyze uncommitted changes to generate branch name automatically.
Format: /create-branch (no arguments)
Process:
Examples:
# After modifying authentication files
/create-branch
→ Auto-detected from changes: feat/006-authentication-system
→ (based on: login.py, auth_service.ts, user_model.py)
# After fixing payment bug
/create-branch
→ Auto-detected from changes: fix/007-payment-processing
→ (based on: payment.js, checkout.py)
The workflow automatically detects commit types from keywords in the description:
| Type | Keywords |
|---|---|
| feat | add, create, implement, new, update, improve |
| fix | fix, bug, resolve, correct, repair |
| refactor | refactor, rename, reorganize |
| chore | remove, delete, clean, cleanup |
| docs | docs, document, documentation |
If no keyword is detected, defaults to feat.
Pattern: {type}/{number}-{keyword1}-{keyword2}
Components:
Examples:
Input: "add user authentication system"
Output: feat/001-user-authentication
Input: "fix null pointer in login"
Output: fix/002-null-pointer
Check if user provided a description:
# If user provided description
if [ -n "$DESCRIPTION" ]; then
MODE="manual"
# Proceed to Step 3 (type detection)
else
MODE="auto-generate"
# Proceed to Step 2 (analyze changes)
fi
If no description provided, analyze uncommitted changes:
# Check for uncommitted changes
UNSTAGED=$(git diff --name-status)
STAGED=$(git diff --cached --name-status)
UNTRACKED=$(git ls-files --others --exclude-standard)
# Combine all changes
ALL_CHANGES=$(echo -e "$UNSTAGED\n$STAGED\n$UNTRACKED" | grep -v '^$')
if [ -z "$ALL_CHANGES" ]; then
# No changes detected
echo "❌ Error: No uncommitted changes detected." >&2
echo "" >&2
echo "To create a branch, either:" >&2
echo "1. Make some changes first, then run /create-branch" >&2
echo "2. Provide a description: /create-branch <description>" >&2
echo "" >&2
echo "Examples:" >&2
echo " /create-branch add user authentication" >&2
echo " /create-branch fix payment bug" >&2
echo "" >&2
exit 1
fi
# Analyze changes to generate description
# You should intelligently analyze the file paths and change types
# to determine the purpose and commit type
# Example analysis logic:
# - If mostly new files (A status): feat
# - If modifying error handling files: fix
# - If in docs/ or README: docs
# - Extract common theme from file paths (e.g., "auth", "payment", "api")
# For demonstration, here's a simple template:
# You should replace this with intelligent analysis based on actual files
# Extract first few changed files for display
SAMPLE_FILES=$(echo "$ALL_CHANGES" | head -5 | awk '{print $NF}' | tr '\n' ', ' | sed 's/,$//')
# Generate description based on analysis
# This should be intelligent - for now using placeholder
DESCRIPTION="add feature based on changes" # Replace with actual analysis
echo "ℹ️ Auto-detected description: $DESCRIPTION"
echo "ℹ️ Based on changes in: $SAMPLE_FILES"
Detect commit type from keywords:
# Convert description to lowercase for matching
DESC_LOWER=$(echo "$DESCRIPTION" | tr '[:upper:]' '[:lower:]')
# Detect type from first word or keywords
if echo "$DESC_LOWER" | grep -qE '^(add|create|implement|new|update|improve)'; then
COMMIT_TYPE="feat"
elif echo "$DESC_LOWER" | grep -qE '^(fix|bug|resolve|correct|repair)'; then
COMMIT_TYPE="fix"
elif echo "$DESC_LOWER" | grep -qE '^(refactor|rename|reorganize)'; then
COMMIT_TYPE="refactor"
elif echo "$DESC_LOWER" | grep -qE '^(remove|delete|clean)'; then
COMMIT_TYPE="chore"
elif echo "$DESC_LOWER" | grep -qE '^(docs?|document)'; then
COMMIT_TYPE="docs"
elif echo "$DESC_LOWER" | grep -qE '^(test)'; then
COMMIT_TYPE="test"
elif echo "$DESC_LOWER" | grep -qE '^(perf|performance|optimize)'; then
COMMIT_TYPE="perf"
elif echo "$DESC_LOWER" | grep -qE '^(build|ci)'; then
COMMIT_TYPE="build"
else
# Default to feat
COMMIT_TYPE="feat"
fi
echo "ℹ️ Detected type: $COMMIT_TYPE"
Remove type keyword and extract meaningful words:
# Remove type keywords from description
CLEANED_DESC=$(echo "$DESC_LOWER" | sed -E 's/^(add|create|implement|new|update|improve|fix|bug|resolve|correct|repair|refactor|rename|reorganize|remove|delete|clean|docs?|document|test|perf|performance|optimize|build|ci)\s*//')
# Remove common filler words
FILTERED=$(echo "$CLEANED_DESC" | sed -E 's/\b(the|a|an|for|to|in|on|at|with|from|of|and|or)\b//g')
# Extract first 2-3 meaningful words
KEYWORDS=$(echo "$FILTERED" | tr -s ' ' | awk '{for(i=1; i<=3 && i<=NF; i++) printf "%s%s", $i, (i<3 && i<NF ? "-" : "")}')
# Sanitize: lowercase, replace spaces with hyphens, remove special chars
BRANCH_SUFFIX=$(echo "$KEYWORDS" | tr ' ' '-' | tr -cd '[:alnum:]-' | tr '[:upper:]' '[:lower:]')
echo "ℹ️ Keywords: $BRANCH_SUFFIX"
Scan existing branches to find next available number:
# Get all branches matching the commit type pattern
EXISTING_BRANCHES=$(git branch --list "$COMMIT_TYPE/*" | sed 's/^[* ]*//')
# Extract numbers from branch names
NUMBERS=$(echo "$EXISTING_BRANCHES" | grep -oE "$COMMIT_TYPE/[0-9]+" | grep -oE '[0-9]+' | sort -n)
# Find highest number
if [ -z "$NUMBERS" ]; then
# No existing branches of this type
NEXT_NUMBER=1
else
HIGHEST=$(echo "$NUMBERS" | tail -1)
NEXT_NUMBER=$((HIGHEST + 1))
fi
# Format as 3-digit number
BRANCH_NUMBER=$(printf "%03d" "$NEXT_NUMBER")
echo "ℹ️ Next number: $BRANCH_NUMBER"
Combine type, number, and keywords:
# Build branch name
BRANCH_NAME="$COMMIT_TYPE/$BRANCH_NUMBER-$BRANCH_SUFFIX"
echo ""
echo "Branch name: $BRANCH_NAME"
echo ""
Create and checkout the new branch:
# Create and checkout branch
git checkout -b "$BRANCH_NAME" || {
echo "❌ Failed to create branch" >&2
exit 1
}
echo "✅ Created and checked out branch: $BRANCH_NAME"
If spec-kit is installed (.specify/ directory exists), create feature directory:
# Check if .specify/ directory exists (spec-kit indicator)
REPO_ROOT=$(git rev-parse --show-toplevel)
if [ -d "$REPO_ROOT/.specify" ]; then
# spec-kit is installed - create feature directory
FEATURE_DIR="$REPO_ROOT/.specify/features/$BRANCH_NAME"
mkdir -p "$FEATURE_DIR"
echo "ℹ️ Created feature directory: .specify/features/$BRANCH_NAME"
echo ""
echo "You can now add:"
echo " - spec.md (feature specification)"
echo " - plan.md (implementation plan)"
echo " - notes.md (development notes)"
else
echo "ℹ️ Skipping feature directory (spec-kit not installed)"
fi
Show final summary:
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "✅ Branch created successfully!"
echo ""
echo "Branch: $BRANCH_NAME"
echo "Type: $COMMIT_TYPE"
if [ "$MODE" = "auto-generate" ]; then
echo "Auto-detected from: $SAMPLE_FILES"
fi
echo ""
echo "Next steps:"
echo " - Make your changes"
echo " - Commit with: /commit"
echo " - Create PR with: /create-pr"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
Common filler words are automatically removed:
| Filtered Words |
|---|
| the, a, an |
| for, to, in, on, at |
| with, from, of |
| and, or, but |
| is, are, was, were |
| this, that, these, those |
| Existing Branches | Type | Next Number |
|---|---|---|
| None | feat | 001 |
| feat/001-auth | feat | 002 |
| feat/001-auth, feat/002-api | feat | 003 |
| fix/001-bug | fix | 001 (different type) |
| feat/005-feature | feat | 006 (continues from highest) |
Sequential Numbering: Automatically finds next available number by scanning existing branches of the same type
Keyword Extraction: Filters out common words and keeps only meaningful terms
Short Names: Uses first 2-3 meaningful words only (avoids long branch names)
Lowercase Convention: All branch names are lowercase with hyphens
Conventional Commits: Aligns with conventional commit types for consistency
No Duplicates: Increments number automatically
Works Anywhere: Executes from any directory in the project
Monorepo Support: Works in both root repository and submodules
Spec-Kit Integration: Optionally creates feature directories when spec-kit is detected
For detailed information, see: