diff --git a/.github/workflows/cleanup-branches.yml b/.github/workflows/cleanup-branches.yml new file mode 100644 index 0000000..08a8cd5 --- /dev/null +++ b/.github/workflows/cleanup-branches.yml @@ -0,0 +1,65 @@ +name: Clean Up Stale Branches + +on: + schedule: + # Run weekly on Sundays at midnight UTC + - cron: '0 0 * * 0' + workflow_dispatch: + inputs: + dry_run: + description: 'Run in dry-run mode (preview only)' + required: false + default: 'true' + type: boolean + +jobs: + cleanup-branches: + runs-on: ubuntu-latest + permissions: + contents: write + pull-requests: read + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Configure Git + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + - name: Fetch all branches + run: git fetch --all --prune + + - name: Run branch cleanup script + run: | + chmod +x ./scripts/cleanup-branches.sh + if [[ "${{ github.event.inputs.dry_run }}" == "true" ]] || [[ "${{ github.event_name }}" == "schedule" ]]; then + echo "Running in dry-run mode..." + ./scripts/cleanup-branches.sh --dry-run + else + echo "Running actual cleanup..." + ./scripts/cleanup-branches.sh --force + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create summary + run: | + echo "## Branch Cleanup Summary" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### Remaining Branches" >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + git branch -r | sort >> $GITHUB_STEP_SUMMARY + echo "\`\`\`" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "### Branch Count" >> $GITHUB_STEP_SUMMARY + echo "Total remote branches: $(git branch -r | wc -l)" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + if [[ "${{ github.event.inputs.dry_run }}" == "true" ]] || [[ "${{ github.event_name }}" == "schedule" ]]; then + echo "โš ๏ธ **Dry Run Mode**: No branches were actually deleted" >> $GITHUB_STEP_SUMMARY + else + echo "โœ… **Cleanup Complete**: Automated branches have been removed" >> $GITHUB_STEP_SUMMARY + fi \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 269f63f..91ec91f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -567,6 +567,52 @@ We follow [Semantic Versioning](https://semver.org/): All changes are documented in [CHANGELOG.md](CHANGELOG.md) following [Keep a Changelog](https://keepachangelog.com/) format. +## Repository Maintenance + +### Branch Cleanup + +To maintain a clean repository structure, we regularly clean up automated branches created by bots and temporary processes: + +#### Automated Cleanup + +Use the provided cleanup script: + +```bash +# Preview what would be deleted +./scripts/cleanup-branches.sh --dry-run + +# Execute the cleanup +./scripts/cleanup-branches.sh --force +``` + +#### What Gets Cleaned Up + +- **Copilot fix branches**: `copilot/fix-*` +- **Dependabot branches**: `dependabot/*` +- **Merge branches**: `merge/*` +- **Other automated branches** + +#### What's Preserved + +- `main` - Production branch (protected) +- `develop` - Development branch (protected) +- `feature/*` - Feature branches following naming convention +- Any branches with recent commits or open PRs + +For detailed information, see [Branch Cleanup Documentation](docs/BRANCH_CLEANUP.md). + +### Dependency Updates + +- Dependabot automatically creates PRs for dependency updates +- Review and merge dependency updates promptly +- Test thoroughly before merging major version updates + +### Code Quality + +- Run linting and formatting regularly: `pnpm lint && pnpm format` +- Keep test coverage above 80%: `pnpm test` +- Address security vulnerabilities promptly + ## Questions? If you have questions about contributing, please: diff --git a/README.md b/README.md index 7e0e2e3..9cd7897 100644 --- a/README.md +++ b/README.md @@ -236,6 +236,20 @@ We use [Conventional Commits](https://www.conventionalcommits.org/): - `test:` Test additions/changes - `chore:` Maintenance tasks +## ๐Ÿงน Repository Maintenance + +### Branch Cleanup + +The repository includes automated tools for cleaning up temporary branches created by bots and automated processes: + +```bash +# Clean up automated branches (Copilot, Dependabot, etc.) +./scripts/cleanup-branches.sh --dry-run # Preview changes +./scripts/cleanup-branches.sh --force # Execute cleanup +``` + +See [Branch Cleanup Documentation](docs/BRANCH_CLEANUP.md) for detailed information. + ## ๐Ÿ“„ License This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. diff --git a/docs/BRANCH_CLEANUP.md b/docs/BRANCH_CLEANUP.md new file mode 100644 index 0000000..56b902c --- /dev/null +++ b/docs/BRANCH_CLEANUP.md @@ -0,0 +1,266 @@ +# Repository Branch Cleanup Documentation + +## Overview + +This document outlines the process for cleaning up automated branches in the StreamVault repository while preserving core development branches. The cleanup removes temporary branches created by automated tools like GitHub Copilot and Dependabot. + +## Current Branch Analysis + +### Branches to KEEP โœ… + +These branches are essential for the development workflow and will be preserved: + +- **`main`** - Production branch (protected) +- **`develop`** - Development integration branch (protected) +- **`feature/core-data-models`** - Feature branch following naming convention +- **`feature/user-role-subscription-management`** - Feature branch following naming convention + +### Branches to DELETE โŒ + +#### Copilot Fix Branches (7 branches) +These are temporary fix branches created by GitHub Copilot: + +- `copilot/fix-06ef2563-ce2d-4b70-b01a-d533df188be3` +- `copilot/fix-8a03ff1c-4a49-4d6f-8835-7457a87464cd` +- `copilot/fix-33` +- `copilot/fix-355d6657-5491-43dd-863f-5bee4d8f800c` +- `copilot/fix-36970bec-efc1-4b94-abe8-09848689704f` +- `copilot/fix-70076d86-ceb9-485c-afec-cc3f1b556f51` +- `copilot/fix-a39421c3-9572-4e68-a767-3c131542228e` + +#### Dependabot Branches (6 branches) +These are dependency update branches created by Dependabot: + +- `dependabot/github_actions/github-actions-a331d3ec2d` +- `dependabot/npm_and_yarn/auth-9213ea3448` +- `dependabot/npm_and_yarn/devtools-2943226e2f` +- `dependabot/npm_and_yarn/lint-staged-16.1.5` +- `dependabot/npm_and_yarn/lucide-react-0.541.0` +- `dependabot/npm_and_yarn/react-2781313775` + +#### Other Automated Branches (1 branch) +- `merge/copilot-integration` - Likely an old merge branch + +**Total branches to delete: 14** + +## Cleanup Methods + +### Method 1: Automated Script (Recommended) + +Use the provided cleanup script for safe, automated branch deletion: + +```bash +# Navigate to repository root +cd /path/to/streamvault + +# Run in dry-run mode first to see what would be deleted +./scripts/cleanup-branches.sh --dry-run + +# Review the output, then run the actual cleanup +./scripts/cleanup-branches.sh --force +``` + +#### Script Features + +- **Safety checks**: Prevents deletion of protected branches +- **Dry-run mode**: Preview changes before execution +- **Automatic switching**: Moves off branches before deletion +- **Comprehensive logging**: Detailed output for each operation +- **Error handling**: Graceful failure handling +- **Remote sync**: Fetches latest remote state before cleanup + +### Method 2: Manual Cleanup + +If you prefer manual control, follow these steps: + +#### Prerequisites +```bash +# Ensure you're on a safe branch +git checkout main +git pull origin main + +# Fetch all remote branches +git fetch --all --prune +``` + +#### Delete Remote Branches +```bash +# Copilot branches +git push origin --delete copilot/fix-06ef2563-ce2d-4b70-b01a-d533df188be3 +git push origin --delete copilot/fix-8a03ff1c-4a49-4d6f-8835-7457a87464cd +git push origin --delete copilot/fix-33 +git push origin --delete copilot/fix-355d6657-5491-43dd-863f-5bee4d8f800c +git push origin --delete copilot/fix-36970bec-efc1-4b94-abe8-09848689704f +git push origin --delete copilot/fix-70076d86-ceb9-485c-afec-cc3f1b556f51 +git push origin --delete copilot/fix-a39421c3-9572-4e68-a767-3c131542228e + +# Dependabot branches +git push origin --delete dependabot/github_actions/github-actions-a331d3ec2d +git push origin --delete dependabot/npm_and_yarn/auth-9213ea3448 +git push origin --delete dependabot/npm_and_yarn/devtools-2943226e2f +git push origin --delete dependabot/npm_and_yarn/lint-staged-16.1.5 +git push origin --delete dependabot/npm_and_yarn/lucide-react-0.541.0 +git push origin --delete dependabot/npm_and_yarn/react-2781313775 + +# Other automated branches +git push origin --delete merge/copilot-integration +``` + +#### Delete Local Branches (if they exist) +```bash +# Force delete local copies (use -D for force delete since these may have unmerged changes) +git branch -D copilot/fix-06ef2563-ce2d-4b70-b01a-d533df188be3 2>/dev/null || true +git branch -D copilot/fix-8a03ff1c-4a49-4d6f-8835-7457a87464cd 2>/dev/null || true +git branch -D copilot/fix-33 2>/dev/null || true +git branch -D copilot/fix-355d6657-5491-43dd-863f-5bee4d8f800c 2>/dev/null || true +git branch -D copilot/fix-36970bec-efc1-4b94-abe8-09848689704f 2>/dev/null || true +git branch -D copilot/fix-70076d86-ceb9-485c-afec-cc3f1b556f51 2>/dev/null || true +git branch -D copilot/fix-a39421c3-9572-4e68-a767-3c131542228e 2>/dev/null || true + +# Dependabot branches +git branch -D dependabot/github_actions/github-actions-a331d3ec2d 2>/dev/null || true +git branch -D dependabot/npm_and_yarn/auth-9213ea3448 2>/dev/null || true +git branch -D dependabot/npm_and_yarn/devtools-2943226e2f 2>/dev/null || true +git branch -D dependabot/npm_and_yarn/lint-staged-16.1.5 2>/dev/null || true +git branch -D dependabot/npm_and_yarn/lucide-react-0.541.0 2>/dev/null || true +git branch -D dependabot/npm_and_yarn/react-2781313775 2>/dev/null || true + +# Other branches +git branch -D merge/copilot-integration 2>/dev/null || true +``` + +## Verification + +After cleanup, verify the results: + +```bash +# List all remote branches +git branch -r + +# Should only show: +# origin/main +# origin/develop +# origin/feature/core-data-models +# origin/feature/user-role-subscription-management + +# List local branches +git branch + +# Clean up any remaining remote tracking references +git remote prune origin +``` + +## Safety Considerations + +### Protected Branches +The following branches have branch protection rules and cannot be accidentally deleted: +- `main` +- `develop` + +### Pre-cleanup Checklist +- [ ] Verify no important work exists in automated branches +- [ ] Confirm all necessary changes have been merged to main/develop +- [ ] Take note of any custom commits in automated branches +- [ ] Ensure you have proper repository permissions +- [ ] Run cleanup script in dry-run mode first + +### Recovery Options +If a branch is accidentally deleted: + +1. **Check GitHub's branch restore feature** (available for 30 days) +2. **Restore from commit SHA** if you have the commit hash: + ```bash + git checkout -b branch-name + git push origin branch-name + ``` + +## Post-Cleanup Actions + +### Update Branch Protection Rules +Consider updating branch protection rules to prevent future accumulation of automated branches: + +1. Configure Dependabot to create PRs instead of branches +2. Set up automatic deletion of merged branches +3. Add branch naming conventions to repository guidelines + +### Documentation Updates +Update the following documents if needed: +- `CONTRIBUTING.md` - Branch naming conventions +- `README.md` - Development workflow +- `.github/PULL_REQUEST_TEMPLATE.md` - Branch cleanup reminders + +## Monitoring + +Set up monitoring to prevent future branch accumulation: + +### GitHub Actions Workflow +Create a workflow to automatically clean up stale branches: + +```yaml +name: Cleanup Stale Branches +on: + schedule: + - cron: '0 0 * * 0' # Weekly on Sunday + workflow_dispatch: + +jobs: + cleanup: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Delete merged branches + run: | + # Add automated cleanup logic here +``` + +### Regular Audits +Schedule monthly audits to review branch structure: +- Count of branches per type +- Age of unmerged branches +- Identification of stale automated branches + +## Troubleshooting + +### Common Issues + +**Permission Denied** +```bash +# Ensure you have proper permissions +git remote -v +# Verify you're using the correct remote URL and have push access +``` + +**Branch Not Found** +```bash +# Branch may have already been deleted +git fetch --all --prune +git branch -r | grep branch-name +``` + +**Cannot Delete Current Branch** +```bash +# Switch to a different branch first +git checkout main +# Then delete the target branch +``` + +**Force Push Required** +```bash +# Some automated branches may require force deletion +git branch -D branch-name +git push origin --delete branch-name --force +``` + +## Contact + +For questions about this cleanup process: +- Review this documentation +- Check the cleanup script logs +- Consult the repository maintainers +- Create an issue in the repository + +--- + +**Last Updated**: $(date) +**Script Location**: `scripts/cleanup-branches.sh` +**Related Issue**: #33 \ No newline at end of file diff --git a/scripts/cleanup-branches.sh b/scripts/cleanup-branches.sh new file mode 100755 index 0000000..671c17a --- /dev/null +++ b/scripts/cleanup-branches.sh @@ -0,0 +1,293 @@ +#!/bin/bash + +# StreamVault Repository Branch Cleanup Script +# This script removes automated branches while preserving core development branches +# +# Usage: ./scripts/cleanup-branches.sh [--dry-run] [--force] +# --dry-run: Show what would be deleted without actually deleting +# --force: Skip confirmation prompts +# +# Author: GitHub Copilot +# Date: $(date) + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Configuration +DRY_RUN=false +FORCE=false + +# Parse command line arguments +while [[ $# -gt 0 ]]; do + case $1 in + --dry-run) + DRY_RUN=true + shift + ;; + --force) + FORCE=true + shift + ;; + -h|--help) + echo "Usage: $0 [--dry-run] [--force]" + echo " --dry-run: Show what would be deleted without actually deleting" + echo " --force: Skip confirmation prompts" + exit 0 + ;; + *) + echo "Unknown option: $1" + exit 1 + ;; + esac +done + +# Branches to keep (protected branches and important feature branches) +BRANCHES_TO_KEEP=( + "main" + "develop" + "feature/core-data-models" + "feature/user-role-subscription-management" +) + +# Automated branches to delete +COPILOT_BRANCHES=( + "copilot/fix-06ef2563-ce2d-4b70-b01a-d533df188be3" + "copilot/fix-8a03ff1c-4a49-4d6f-8835-7457a87464cd" + "copilot/fix-33" + "copilot/fix-355d6657-5491-43dd-863f-5bee4d8f800c" + "copilot/fix-36970bec-efc1-4b94-abe8-09848689704f" + "copilot/fix-70076d86-ceb9-485c-afec-cc3f1b556f51" + "copilot/fix-a39421c3-9572-4e68-a767-3c131542228e" +) + +DEPENDABOT_BRANCHES=( + "dependabot/github_actions/github-actions-a331d3ec2d" + "dependabot/npm_and_yarn/auth-9213ea3448" + "dependabot/npm_and_yarn/devtools-2943226e2f" + "dependabot/npm_and_yarn/lint-staged-16.1.5" + "dependabot/npm_and_yarn/lucide-react-0.541.0" + "dependabot/npm_and_yarn/react-2781313775" +) + +OTHER_AUTOMATED_BRANCHES=( + "merge/copilot-integration" +) + +# Combine all branches to delete +ALL_BRANCHES_TO_DELETE=("${COPILOT_BRANCHES[@]}" "${DEPENDABOT_BRANCHES[@]}" "${OTHER_AUTOMATED_BRANCHES[@]}") + +# Function to print colored output +print_status() { + local color=$1 + local message=$2 + echo -e "${color}${message}${NC}" +} + +# Function to check if a branch exists locally +branch_exists_local() { + git branch --list "$1" | grep -q "$1" +} + +# Function to check if a branch exists on remote +branch_exists_remote() { + git ls-remote --heads origin "$1" | grep -q "$1" +} + +# Function to check if branch is protected +is_protected_branch() { + local branch=$1 + for protected in "${BRANCHES_TO_KEEP[@]}"; do + if [[ "$branch" == "$protected" ]]; then + return 0 + fi + done + return 1 +} + +# Function to safely delete a branch +delete_branch() { + local branch=$1 + local branch_type=$2 + + print_status $BLUE "Processing ${branch_type}: ${branch}" + + # Check if branch is protected + if is_protected_branch "$branch"; then + print_status $RED "ERROR: Branch '${branch}' is protected and will not be deleted!" + return 1 + fi + + # Check if branch exists remotely + if branch_exists_remote "$branch"; then + if [[ "$DRY_RUN" == "true" ]]; then + print_status $YELLOW "DRY RUN: Would delete remote branch: origin/${branch}" + else + print_status $GREEN "Deleting remote branch: origin/${branch}" + if git push origin --delete "$branch"; then + print_status $GREEN "โœ“ Successfully deleted remote branch: origin/${branch}" + else + print_status $RED "โœ— Failed to delete remote branch: origin/${branch}" + return 1 + fi + fi + else + print_status $YELLOW "Remote branch origin/${branch} does not exist" + fi + + # Check if branch exists locally + if branch_exists_local "$branch"; then + if [[ "$DRY_RUN" == "true" ]]; then + print_status $YELLOW "DRY RUN: Would delete local branch: ${branch}" + else + print_status $GREEN "Deleting local branch: ${branch}" + # Force delete to avoid issues with unmerged changes in automated branches + if git branch -D "$branch"; then + print_status $GREEN "โœ“ Successfully deleted local branch: ${branch}" + else + print_status $RED "โœ— Failed to delete local branch: ${branch}" + return 1 + fi + fi + else + print_status $YELLOW "Local branch ${branch} does not exist" + fi + + return 0 +} + +# Main cleanup function +cleanup_branches() { + local category=$1 + shift + local branches=("$@") + + print_status $BLUE "\n=== Cleaning up ${category} ===" + + for branch in "${branches[@]}"; do + delete_branch "$branch" "$category" + echo # Add spacing between branches + done +} + +# Pre-flight checks +preflight_checks() { + print_status $BLUE "=== Pre-flight Checks ===" + + # Check if we're in a git repository + if ! git rev-parse --git-dir > /dev/null 2>&1; then + print_status $RED "ERROR: Not in a git repository!" + exit 1 + fi + + # Check if we have origin remote + if ! git remote get-url origin > /dev/null 2>&1; then + print_status $RED "ERROR: No 'origin' remote found!" + exit 1 + fi + + # Fetch latest remote information + print_status $BLUE "Fetching latest remote information..." + git fetch --all --prune + + # Switch to main branch if we're on a branch that will be deleted + current_branch=$(git branch --show-current) + for branch_to_delete in "${ALL_BRANCHES_TO_DELETE[@]}"; do + if [[ "$current_branch" == "$branch_to_delete" ]]; then + print_status $YELLOW "Currently on branch '${current_branch}' which will be deleted." + if [[ "$DRY_RUN" == "false" ]]; then + print_status $BLUE "Switching to 'main' branch..." + git checkout main + git pull origin main + else + print_status $YELLOW "DRY RUN: Would switch to 'main' branch" + fi + break + fi + done + + print_status $GREEN "โœ“ Pre-flight checks completed" +} + +# Summary function +show_summary() { + local total_branches=${#ALL_BRANCHES_TO_DELETE[@]} + local copilot_count=${#COPILOT_BRANCHES[@]} + local dependabot_count=${#DEPENDABOT_BRANCHES[@]} + local other_count=${#OTHER_AUTOMATED_BRANCHES[@]} + + print_status $BLUE "\n=== Cleanup Summary ===" + print_status $BLUE "Total branches to process: ${total_branches}" + print_status $BLUE " - Copilot fix branches: ${copilot_count}" + print_status $BLUE " - Dependabot branches: ${dependabot_count}" + print_status $BLUE " - Other automated branches: ${other_count}" + echo + print_status $GREEN "Branches that will be KEPT:" + for branch in "${BRANCHES_TO_KEEP[@]}"; do + print_status $GREEN " โœ“ ${branch}" + done + echo + if [[ "$DRY_RUN" == "true" ]]; then + print_status $YELLOW "DRY RUN MODE: No branches will actually be deleted" + else + print_status $RED "Branches that will be DELETED:" + for branch in "${ALL_BRANCHES_TO_DELETE[@]}"; do + print_status $RED " โœ— ${branch}" + done + fi +} + +# Confirmation function +confirm_deletion() { + if [[ "$FORCE" == "true" || "$DRY_RUN" == "true" ]]; then + return 0 + fi + + echo + print_status $YELLOW "WARNING: This will permanently delete ${#ALL_BRANCHES_TO_DELETE[@]} branches!" + read -p "Are you sure you want to continue? (type 'yes' to confirm): " confirmation + + if [[ "$confirmation" != "yes" ]]; then + print_status $YELLOW "Cleanup cancelled by user" + exit 0 + fi +} + +# Main execution +main() { + print_status $BLUE "StreamVault Repository Branch Cleanup" + print_status $BLUE "======================================" + + # Run pre-flight checks + preflight_checks + + # Show summary + show_summary + + # Confirm deletion + confirm_deletion + + # Perform cleanup + cleanup_branches "Copilot Fix Branches" "${COPILOT_BRANCHES[@]}" + cleanup_branches "Dependabot Branches" "${DEPENDABOT_BRANCHES[@]}" + cleanup_branches "Other Automated Branches" "${OTHER_AUTOMATED_BRANCHES[@]}" + + # Final summary + print_status $GREEN "\n=== Cleanup Complete ===" + if [[ "$DRY_RUN" == "true" ]]; then + print_status $YELLOW "DRY RUN: No actual changes were made" + print_status $BLUE "To perform the actual cleanup, run: $0 --force" + else + print_status $GREEN "All automated branches have been successfully cleaned up!" + print_status $BLUE "Remaining branches:" + git branch -r | grep -E "(main|develop|feature/)" | sort + fi +} + +# Run main function +main "$@" \ No newline at end of file diff --git a/scripts/manual-cleanup-commands.sh b/scripts/manual-cleanup-commands.sh new file mode 100755 index 0000000..8242c36 --- /dev/null +++ b/scripts/manual-cleanup-commands.sh @@ -0,0 +1,53 @@ +#!/bin/bash + +# One-time manual branch cleanup commands +# This script provides the exact commands needed to manually delete all automated branches +# Use this if you prefer manual control over the automated script + +echo "=== StreamVault Branch Cleanup Commands ===" +echo "Copy and paste these commands to manually clean up branches:" +echo "" + +echo "# 1. Switch to safe branch and fetch latest" +echo "git checkout main" +echo "git pull origin main" +echo "git fetch --all --prune" +echo "" + +echo "# 2. Delete Copilot fix branches" +echo "git push origin --delete copilot/fix-06ef2563-ce2d-4b70-b01a-d533df188be3" +echo "git push origin --delete copilot/fix-8a03ff1c-4a49-4d6f-8835-7457a87464cd" +echo "git push origin --delete copilot/fix-33" +echo "git push origin --delete copilot/fix-355d6657-5491-43dd-863f-5bee4d8f800c" +echo "git push origin --delete copilot/fix-36970bec-efc1-4b94-abe8-09848689704f" +echo "git push origin --delete copilot/fix-70076d86-ceb9-485c-afec-cc3f1b556f51" +echo "git push origin --delete copilot/fix-a39421c3-9572-4e68-a767-3c131542228e" +echo "" + +echo "# 3. Delete Dependabot branches" +echo "git push origin --delete dependabot/github_actions/github-actions-a331d3ec2d" +echo "git push origin --delete dependabot/npm_and_yarn/auth-9213ea3448" +echo "git push origin --delete dependabot/npm_and_yarn/devtools-2943226e2f" +echo "git push origin --delete dependabot/npm_and_yarn/lint-staged-16.1.5" +echo "git push origin --delete dependabot/npm_and_yarn/lucide-react-0.541.0" +echo "git push origin --delete dependabot/npm_and_yarn/react-2781313775" +echo "" + +echo "# 4. Delete other automated branches" +echo "git push origin --delete merge/copilot-integration" +echo "" + +echo "# 5. Clean up local tracking references" +echo "git remote prune origin" +echo "" + +echo "# 6. Verify cleanup (should only show main, develop, and feature branches)" +echo "git branch -r" +echo "" + +echo "=== Total branches to delete: 14 ===" +echo "- 7 Copilot fix branches" +echo "- 6 Dependabot branches" +echo "- 1 other automated branch" +echo "" +echo "Branches to KEEP: main, develop, feature/core-data-models, feature/user-role-subscription-management" \ No newline at end of file