Complete contribution workflow using git-town. Create branch → commit → PR → ship. Preflight at every step. TRIGGERS - contribute, feature branch, create PR, submit PR, git-town contribute.
From git-town-workflownpx claudepluginhub terrylica/cc-skills --plugin git-town-workflowThis skill is limited to using the following tools:
references/evolution-log.mdSearches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Guides idea refinement into designs: explores context, asks questions one-by-one, proposes approaches, presents sections for approval, writes/review specs before coding.
This workflow guides you through a complete contribution cycle using git-town.
Self-Evolving Skill: This skill improves through use. If instructions are wrong, parameters drifted, or a workaround was needed — fix this file immediately, don't defer. Only update for real, reproducible issues.
YOU MUST USE GIT-TOWN COMMANDS. RAW GIT BRANCH COMMANDS ARE FORBIDDEN.
| Step | ✅ Correct | ❌ Forbidden |
|---|---|---|
| Create branch | git town hack | git checkout -b |
| Update branch | git town sync | git pull, git fetch, git merge |
| Create PR | git town propose | Manual GitHub UI |
| Merge PR | git town ship | git merge + git push |
TodoWrite with todos:
- "[Contribute] Phase 0: Verify fork workflow is configured" | in_progress
- "[Contribute] Phase 0: Check workspace is clean" | pending
- "[Contribute] Phase 0: Sync with upstream" | pending
- "[Contribute] Phase 1: GATE - Confirm feature branch creation" | pending
- "[Contribute] Phase 1: Create feature branch with git town hack" | pending
- "[Contribute] Phase 2: Implement changes" | pending
- "[Contribute] Phase 2: Commit changes (raw git allowed here)" | pending
- "[Contribute] Phase 2: Sync branch before PR" | pending
- "[Contribute] Phase 3: GATE - Confirm PR creation" | pending
- "[Contribute] Phase 3: Create PR with git town propose" | pending
- "[Contribute] Phase 4: (Optional) Ship PR with git town ship" | pending
/usr/bin/env bash << 'VERIFY_FORK_EOF'
echo "=== FORK WORKFLOW VERIFICATION ==="
# Check remotes
ORIGIN=$(git remote get-url origin 2>/dev/null)
UPSTREAM=$(git remote get-url upstream 2>/dev/null)
if [[ -z "$UPSTREAM" ]]; then
echo "❌ FATAL: upstream remote not configured"
echo "Run: /git-town-workflow:fork to configure"
exit 1
fi
echo "✅ origin: $ORIGIN"
echo "✅ upstream: $UPSTREAM"
# Check git-town config
SYNC_UPSTREAM=$(git config git-town.sync-upstream 2>/dev/null)
if [[ "$SYNC_UPSTREAM" != "true" ]]; then
echo "⚠️ WARNING: git-town.sync-upstream is not true"
echo "Run: git config git-town.sync-upstream true"
fi
# Check current branch
CURRENT_BRANCH=$(git branch --show-current)
echo "Current branch: $CURRENT_BRANCH"
VERIFY_FORK_EOF
If verification fails:
AskUserQuestion with questions:
- question: "Fork workflow is not configured. Run fork setup first?"
header: "Setup Required"
options:
- label: "Yes, run /git-town-workflow:fork now"
description: "Configure fork workflow first"
- label: "No, abort"
description: "Cannot proceed without fork setup"
multiSelect: false
/usr/bin/env bash -c 'git status --porcelain'
If workspace has changes:
AskUserQuestion with questions:
- question: "Workspace has uncommitted changes. How to proceed?"
header: "Dirty Workspace"
options:
- label: "Stash changes (Recommended)"
description: "git stash, create branch, git stash pop"
- label: "Commit changes first"
description: "Create commit before new branch"
- label: "Discard changes"
description: "WARNING: Loses uncommitted work"
- label: "Abort"
description: "Handle manually"
multiSelect: false
ALWAYS sync before creating feature branch:
git town sync
If conflicts occur:
git town continueAskUserQuestion with questions:
- question: "What is the feature branch name?"
header: "Branch Name"
options:
- label: "feat/{feature-name}"
description: "Standard feature branch"
- label: "fix/{bug-name}"
description: "Bug fix branch"
- label: "docs/{doc-name}"
description: "Documentation branch"
- label: "Enter custom name"
description: "I'll provide the full branch name"
multiSelect: false
⛔ NEVER use git checkout -b. ALWAYS use:
git town hack {branch-name}
This command:
/usr/bin/env bash << 'VERIFY_BRANCH_EOF'
BRANCH=$(git branch --show-current)
echo "Current branch: $BRANCH"
# Verify parent is main
git town branch
VERIFY_BRANCH_EOF
User implements their changes here.
(This phase is handled by the user or other skills)
Raw git IS allowed for commits:
git add .
git commit -m "feat: description of change"
Commit message format:
feat: - New featurefix: - Bug fixdocs: - Documentationrefactor: - Code refactoringtest: - Testschore: - Maintenance⛔ NEVER use git pull or git push. ALWAYS use:
git town sync
This:
If conflicts:
AskUserQuestion with questions:
- question: "Sync encountered conflicts. What next?"
header: "Conflicts"
options:
- label: "I'll resolve conflicts manually"
description: "Fix conflicts, then run: git town continue"
- label: "Skip conflicting changes"
description: "Run: git town skip (may lose changes)"
- label: "Abort sync"
description: "Run: git town undo"
multiSelect: false
AskUserQuestion with questions:
- question: "Ready to create a pull request to upstream?"
header: "Create PR"
options:
- label: "Yes, create PR to upstream"
description: "Run: git town propose"
- label: "No, keep working"
description: "Continue development, create PR later"
- label: "Create draft PR"
description: "Create PR but mark as draft"
multiSelect: false
⛔ NEVER create PR manually. ALWAYS use:
git town propose
This:
For draft PR:
git town propose --draft
/usr/bin/env bash -c 'gh pr view --json url,state,title'
AskUserQuestion with questions:
- question: "Has your PR been approved and ready to merge?"
header: "Ship PR"
options:
- label: "Yes, ship it (merge to main)"
description: "Run: git town ship"
- label: "Not yet, PR is pending review"
description: "Wait for approval"
- label: "PR was merged via GitHub UI"
description: "Just cleanup local branches"
multiSelect: false
⛔ NEVER merge manually. ALWAYS use:
git town ship
This:
/usr/bin/env bash << 'CLEANUP_EOF'
echo "=== POST-SHIP STATUS ==="
# Show current branch
git branch --show-current
# Show recent commits on main
git log --oneline -5
# Verify feature branch deleted
git branch -a | grep -v "^*" | head -10
echo "✅ Ship complete"
CLEANUP_EOF
If your feature needs to be split into smaller PRs:
# On feature branch, create child
git town append child-feature
# Creates stack:
# main
# └── feature
# └── child-feature
git town up # Go to parent branch
git town down # Go to child branch
git town branch # Show full stack hierarchy
Ship from bottom up:
git town ship feature # Ships feature first
git town ship child-feature # Then ship child
git town undo
git town continue
git town skip
git town status
┌─────────────────────────────────────────────────────────┐
│ GIT-TOWN CONTRIBUTION FLOW │
├─────────────────────────────────────────────────────────┤
│ │
│ 1. SYNC git town sync │
│ ↓ │
│ 2. BRANCH git town hack feature-name │
│ ↓ │
│ 3. COMMIT git add . && git commit -m "..." │
│ ↓ │
│ 4. SYNC git town sync │
│ ↓ │
│ 5. PR git town propose │
│ ↓ │
│ 6. SHIP git town ship (after approval) │
│ │
├─────────────────────────────────────────────────────────┤
│ ⚠️ FORBIDDEN: git checkout -b, git pull, git merge │
│ ✅ ALLOWED: git add, git commit, git log, git diff │
└─────────────────────────────────────────────────────────┘
[feature-name] - Optional: Branch name for new feature--pr - Skip to PR creation (branch already exists)--ship - Skip to ship (PR already approved)# Start new contribution
/git-town-workflow:contribute feat/add-dark-mode
# Create PR for existing branch
/git-town-workflow:contribute --pr
# Ship after PR approved
/git-town-workflow:contribute --ship
| Issue | Cause | Solution |
|---|---|---|
| Sync failed | Merge conflicts | Resolve conflicts, then git town sync |
| Branch parent wrong | git-town config mismatch | git town branch to view/fix hierarchy |
| Propose failed | No remote tracking branch | git town sync first to push |
| Ship blocked | Branch not on main | Merge PR first, or use --ignore-parent |
| "Cannot ship" | Uncommitted changes | Commit or stash changes first |
| PR already exists | Re-running propose | Use --pr flag to view existing PR |
After this skill completes, reflect before closing the task:
Do NOT defer. The next invocation inherits whatever you leave behind.