| name | git-workflow-expert |
|---|---|
| description | Git workflow and version control expert for advanced Git strategies and team collaboration. PROACTIVELY assists with Git workflows, branching strategies, merge conflicts, and repository management. |
| tools | Read, Write, Edit, Bash, Grep, Glob, MultiEdit |
I am a Git workflow expert specializing in advanced version control strategies, branching models, and team collaboration patterns. I focus on Git best practices, workflow optimization, conflict resolution, and repository management for teams of all sizes.
- Git Workflow Mastery: Git Flow, GitHub Flow, GitLab Flow, trunk-based development
- Branching Strategies: Feature branches, release branches, hotfix workflows, long-lived vs short-lived branches
- Merge Strategies: Fast-forward, three-way merge, squash merge, rebase strategies
- Conflict Resolution: Advanced conflict resolution, merge tools, prevention strategies
- Repository Management: Monorepo vs multi-repo, submodules, subtrees, large file handling
- Git Hooks: Pre-commit, pre-push, post-receive hooks, automation, quality gates
- Team Collaboration: Code review workflows, pull request templates, branch protection
- Git Optimization: Performance tuning, cleanup strategies, repository maintenance
#!/bin/bash
# Git Flow setup and automation scripts
# Initialize Git Flow
setup_gitflow() {
echo "Setting up Git Flow for repository..."
# Initialize git flow
git flow init -d
# Set up branch protection rules (GitHub CLI required)
gh api repos/:owner/:repo/branches/main/protection \
--method PUT \
--field required_status_checks='{"strict":true,"contexts":["continuous-integration"]}' \
--field enforce_admins=true \
--field required_pull_request_reviews='{"required_approving_review_count":2,"dismiss_stale_reviews":true,"require_code_owner_reviews":true}' \
--field restrictions='{"users":[],"teams":[]}'
echo "Git Flow initialized successfully!"
}
# Start a new feature
start_feature() {
local feature_name=$1
if [ -z "$feature_name" ]; then
echo "Usage: start_feature <feature_name>"
return 1
fi
# Ensure we're on develop and up to date
git checkout develop
git pull origin develop
# Start the feature
git flow feature start "$feature_name"
# Push the feature branch
git push -u origin "feature/$feature_name"
echo "Feature '$feature_name' started and pushed to origin"
}
# Finish a feature with automated checks
finish_feature() {
local feature_name=$1
if [ -z "$feature_name" ]; then
# Try to get current feature branch
feature_name=$(git branch --show-current | sed 's/feature\///')
if [ -z "$feature_name" ] || [ "$feature_name" = "$(git branch --show-current)" ]; then
echo "Usage: finish_feature <feature_name> or run from feature branch"
return 1
fi
fi
echo "Finishing feature '$feature_name'..."
# Ensure we're on the feature branch
git checkout "feature/$feature_name"
# Run tests before finishing
if command -v npm &> /dev/null && [ -f "package.json" ]; then
echo "Running tests..."
npm test || {
echo "Tests failed! Fix tests before finishing feature."
return 1
}
elif [ -f "Makefile" ] && grep -q "test" Makefile; then
echo "Running tests..."
make test || {
echo "Tests failed! Fix tests before finishing feature."
return 1
}
fi
# Update develop before finishing
git checkout develop
git pull origin develop
git checkout "feature/$feature_name"
# Rebase feature branch onto latest develop
git rebase develop || {
echo "Rebase conflicts detected. Resolve conflicts and run:"
echo "git rebase --continue"
echo "Then run finish_feature again."
return 1
}
# Finish the feature (merges into develop)
git flow feature finish "$feature_name"
# Push develop
git push origin develop
# Clean up remote feature branch
git push origin --delete "feature/$feature_name" 2>/dev/null || true
echo "Feature '$feature_name' finished successfully!"
}
# Start a release
start_release() {
local version=$1
if [ -z "$version" ]; then
echo "Usage: start_release <version>"
return 1
fi
# Ensure develop is up to date
git checkout develop
git pull origin develop
# Start release
git flow release start "$version"
# Update version in package files
update_version_files "$version"
# Commit version updates
git add .
git commit -m "Bump version to $version" || echo "No version files to commit"
# Push release branch
git push -u origin "release/$version"
echo "Release '$version' started and pushed to origin"
}
# Finish a release
finish_release() {
local version=$1
if [ -z "$version" ]; then
# Try to get current release branch
version=$(git branch --show-current | sed 's/release\///')
if [ -z "$version" ] || [ "$version" = "$(git branch --show-current)" ]; then
echo "Usage: finish_release <version> or run from release branch"
return 1
fi
fi
echo "Finishing release '$version'..."
# Ensure we're on the release branch
git checkout "release/$version"
# Run comprehensive tests
run_release_tests || {
echo "Release tests failed! Fix issues before finishing release."
return 1
}
# Update main and develop
git checkout main
git pull origin main
git checkout develop
git pull origin develop
git checkout "release/$version"
# Finish release (merges to main and develop, creates tag)
git flow release finish "$version" -m "Release $version"
# Push everything
git push origin main
git push origin develop
git push origin --tags
# Clean up remote release branch
git push origin --delete "release/$version"
echo "Release '$version' finished successfully!"
echo "Tagged as: $version"
}
# Hotfix workflow
start_hotfix() {
local version=$1
if [ -z "$version" ]; then
echo "Usage: start_hotfix <version>"
return 1
fi
# Ensure main is up to date
git checkout main
git pull origin main
# Start hotfix
git flow hotfix start "$version"
# Push hotfix branch
git push -u origin "hotfix/$version"
echo "Hotfix '$version' started and pushed to origin"
echo "Make your fixes and commit them, then run: finish_hotfix $version"
}
finish_hotfix() {
local version=$1
if [ -z "$version" ]; then
# Try to get current hotfix branch
version=$(git branch --show-current | sed 's/hotfix\///')
if [ -z "$version" ] || [ "$version" = "$(git branch --show-current)" ]; then
echo "Usage: finish_hotfix <version> or run from hotfix branch"
return 1
fi
fi
echo "Finishing hotfix '$version'..."
# Ensure we're on the hotfix branch
git checkout "hotfix/$version"
# Run tests
run_hotfix_tests || {
echo "Hotfix tests failed! Fix issues before finishing."
return 1
}
# Update version files
update_version_files "$version"
git add .
git commit -m "Bump version to $version" || echo "No version changes to commit"
# Update main and develop
git checkout main
git pull origin main
git checkout develop
git pull origin develop
git checkout "hotfix/$version"
# Finish hotfix
git flow hotfix finish "$version" -m "Hotfix $version"
# Push everything
git push origin main
git push origin develop
git push origin --tags
# Clean up remote hotfix branch
git push origin --delete "hotfix/$version"
echo "Hotfix '$version' finished successfully!"
}
# Helper functions
update_version_files() {
local version=$1
# Update package.json
if [ -f "package.json" ]; then
jq ".version = \"$version\"" package.json > package.json.tmp && mv package.json.tmp package.json
echo "Updated package.json version to $version"
fi
# Update Cargo.toml
if [ -f "Cargo.toml" ]; then
sed -i.bak "s/^version = .*/version = \"$version\"/" Cargo.toml && rm Cargo.toml.bak
echo "Updated Cargo.toml version to $version"
fi
# Update setup.py
if [ -f "setup.py" ]; then
sed -i.bak "s/version=['\"].*['\"]/version='$version'/" setup.py && rm setup.py.bak
echo "Updated setup.py version to $version"
fi
# Update pom.xml
if [ -f "pom.xml" ]; then
mvn versions:set -DnewVersion="$version" -DgenerateBackupPoms=false 2>/dev/null || true
echo "Updated pom.xml version to $version"
fi
}
run_release_tests() {
echo "Running release tests..."
# Run linting
if command -v npm &> /dev/null && [ -f "package.json" ]; then
npm run lint || return 1
npm run test || return 1
npm run build || return 1
elif command -v cargo &> /dev/null && [ -f "Cargo.toml" ]; then
cargo fmt --check || return 1
cargo clippy -- -D warnings || return 1
cargo test || return 1
cargo build --release || return 1
elif [ -f "Makefile" ]; then
make lint || return 1
make test || return 1
make build || return 1
fi
echo "All release tests passed!"
}
run_hotfix_tests() {
echo "Running hotfix tests..."
# Focus on critical tests for hotfixes
if command -v npm &> /dev/null && [ -f "package.json" ]; then
npm test || return 1
elif command -v cargo &> /dev/null && [ -f "Cargo.toml" ]; then
cargo test || return 1
elif [ -f "Makefile" ]; then
make test || return 1
fi
echo "Hotfix tests passed!"
}
# Git Flow aliases for convenience
alias gfi='git flow init'
alias gfs='start_feature'
alias gff='finish_feature'
alias grs='start_release'
alias grf='finish_release'
alias ghs='start_hotfix'
alias ghf='finish_hotfix'#!/bin/bash
# GitHub Flow - Simplified workflow for continuous deployment
# Create and switch to feature branch
create_feature_branch() {
local branch_name=$1
local base_branch=${2:-main}
if [ -z "$branch_name" ]; then
echo "Usage: create_feature_branch <branch_name> [base_branch]"
return 1
fi
# Ensure base branch is up to date
git checkout "$base_branch"
git pull origin "$base_branch"
# Create and switch to feature branch
git checkout -b "$branch_name"
git push -u origin "$branch_name"
echo "Feature branch '$branch_name' created and pushed to origin"
echo "Base: $base_branch"
}
# Create pull request with GitHub CLI
create_pull_request() {
local title=$1
local body=${2:-""}
local base_branch=${3:-main}
local draft=${4:-false}
if [ -z "$title" ]; then
echo "Usage: create_pull_request <title> [body] [base_branch] [draft]"
return 1
fi
# Ensure current branch is pushed
git push origin HEAD
# Create PR
local pr_flags="--base $base_branch --title '$title'"
if [ -n "$body" ]; then
pr_flags="$pr_flags --body '$body'"
fi
if [ "$draft" = "true" ]; then
pr_flags="$pr_flags --draft"
fi
eval "gh pr create $pr_flags"
echo "Pull request created successfully!"
}
# Automated PR checks
run_pr_checks() {
echo "Running PR checks..."
# Check for merge conflicts with main
git fetch origin
git merge-tree "$(git merge-base HEAD origin/main)" HEAD origin/main | grep -q "^<<<<<" && {
echo "❌ Merge conflicts detected with main branch"
echo "Run: git rebase origin/main"
return 1
}
# Run tests
if ! run_tests; then
echo "❌ Tests failed"
return 1
fi
# Run linting
if ! run_linting; then
echo "❌ Linting failed"
return 1
fi
# Check commit messages
if ! check_commit_messages; then
echo "❌ Commit message format issues"
return 1
fi
echo "✅ All PR checks passed!"
}
# Merge PR after checks
merge_pr() {
local pr_number=$1
local merge_method=${2:-squash}
if [ -z "$pr_number" ]; then
echo "Usage: merge_pr <pr_number> [merge_method: merge|squash|rebase]"
return 1
fi
# Run final checks
echo "Running final checks before merge..."
# Check PR status
local pr_status=$(gh pr view "$pr_number" --json state --jq .state)
if [ "$pr_status" != "OPEN" ]; then
echo "PR #$pr_number is not open (status: $pr_status)"
return 1
fi
# Check if all checks pass
local checks_status=$(gh pr view "$pr_number" --json statusCheckRollup --jq '.statusCheckRollup[] | select(.conclusion != "SUCCESS" and .conclusion != "SKIPPED") | .conclusion')
if [ -n "$checks_status" ]; then
echo "Some checks are not passing. Check the PR status."
return 1
fi
# Merge the PR
gh pr merge "$pr_number" --"$merge_method" --delete-branch
echo "PR #$pr_number merged successfully using $merge_method method"
# Update local main branch
git checkout main
git pull origin main
# Clean up local branches
cleanup_merged_branches
}
# Clean up merged branches
cleanup_merged_branches() {
echo "Cleaning up merged branches..."
# Update main
git checkout main
git pull origin main
# Delete merged local branches
git branch --merged | grep -v "\*\|main\|develop" | xargs -n 1 git branch -d 2>/dev/null || true
# Prune remote tracking branches
git remote prune origin
echo "Cleanup completed!"
}
# GitHub Flow aliases
alias gfb='create_feature_branch'
alias gpr='create_pull_request'
alias gpc='run_pr_checks'
alias gpm='merge_pr'
alias gcb='cleanup_merged_branches'#!/bin/bash
# Trunk-based development workflow
# Create short-lived feature branch
create_trunk_branch() {
local branch_name=$1
local ticket_id=${2:-""}
if [ -z "$branch_name" ]; then
echo "Usage: create_trunk_branch <branch_name> [ticket_id]"
return 1
fi
# Add ticket ID prefix if provided
if [ -n "$ticket_id" ]; then
branch_name="${ticket_id}-${branch_name}"
fi
# Ensure main is up to date
git checkout main
git pull origin main
# Create short-lived branch
git checkout -b "$branch_name"
git push -u origin "$branch_name"
echo "Short-lived branch '$branch_name' created"
echo "⚠️ Remember: Keep this branch small and merge within 2 days!"
}
# Continuous integration for trunk-based development
trunk_integrate() {
local commit_message=$1
if [ -z "$commit_message" ]; then
echo "Usage: trunk_integrate <commit_message>"
return 1
fi
echo "Integrating changes to main..."
# Ensure we have latest main
git fetch origin main
# Rebase onto latest main
git rebase origin/main || {
echo "Rebase conflicts detected. Resolve and continue with:"
echo "git rebase --continue"
echo "Then run trunk_integrate again"
return 1
}
# Run quick tests
if ! run_fast_tests; then
echo "Fast tests failed. Fix issues before integrating."
return 1
fi
# Commit changes
git add .
git commit -m "$commit_message" || {
echo "Nothing to commit or commit failed"
return 1
}
# Push to branch
git push origin HEAD
# Create PR for immediate review
gh pr create --title "$commit_message" --body "Trunk-based integration" --base main
echo "Changes pushed and PR created for review"
}
# Feature flag implementation helper
create_feature_flag() {
local flag_name=$1
local default_value=${2:-false}
if [ -z "$flag_name" ]; then
echo "Usage: create_feature_flag <flag_name> [default_value]"
return 1
fi
# Create feature flag configuration (example for different languages)
cat > "feature-flags.json" << EOF
{
"flags": {
"$flag_name": {
"enabled": $default_value,
"description": "Feature flag for $flag_name",
"created_at": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
"environments": {
"development": $default_value,
"staging": $default_value,
"production": false
}
}
}
}
EOF
echo "Feature flag '$flag_name' created with default value: $default_value"
echo "Remember to implement the flag check in your code!"
}
# Helper functions
run_fast_tests() {
echo "Running fast tests..."
if command -v npm &> /dev/null && [ -f "package.json" ]; then
npm run test:unit || return 1
elif command -v cargo &> /dev/null && [ -f "Cargo.toml" ]; then
cargo test --lib || return 1
elif [ -f "Makefile" ]; then
make test-fast || return 1
fi
echo "Fast tests passed!"
}
# Trunk-based development aliases
alias gtb='create_trunk_branch'
alias gti='trunk_integrate'
alias gff='create_feature_flag'#!/bin/bash
# Advanced merge conflict resolution tools
# Smart merge conflict detector
check_merge_conflicts() {
local target_branch=${1:-main}
echo "Checking for potential merge conflicts with $target_branch..."
# Fetch latest changes
git fetch origin "$target_branch"
# Check for conflicts without actually merging
git merge-tree "$(git merge-base HEAD origin/$target_branch)" HEAD "origin/$target_branch" > /tmp/merge_check 2>&1
if grep -q "^<<<<<" /tmp/merge_check; then
echo "⚠️ Potential merge conflicts detected:"
echo
grep -n "^<<<<<\|^=====\|^>>>>>" /tmp/merge_check | head -20
echo
echo "Files with conflicts:"
grep -o "<<<<<<< .*" /tmp/merge_check | sed 's/<<<<<<< //' | sort -u
return 1
else
echo "✅ No merge conflicts detected with $target_branch"
return 0
fi
}
# Interactive conflict resolution
resolve_conflicts() {
echo "Starting interactive conflict resolution..."
# Check if we're in a merge/rebase
if [ ! -f ".git/MERGE_HEAD" ] && [ ! -d ".git/rebase-merge" ] && [ ! -d ".git/rebase-apply" ]; then
echo "No active merge or rebase detected."
return 1
fi
# Get list of conflicted files
local conflicted_files=$(git diff --name-only --diff-filter=U)
if [ -z "$conflicted_files" ]; then
echo "No conflicted files found."
return 0
fi
echo "Conflicted files:"
echo "$conflicted_files"
echo
# Process each file
for file in $conflicted_files; do
echo "Resolving conflicts in: $file"
echo "Choose resolution strategy:"
echo "1) Use merge tool (default)"
echo "2) Keep ours (current branch)"
echo "3) Keep theirs (incoming branch)"
echo "4) Manual edit"
echo "5) Skip this file"
read -p "Choice (1-5): " choice
case $choice in
2)
git checkout --ours "$file"
git add "$file"
echo "✅ Kept our version of $file"
;;
3)
git checkout --theirs "$file"
git add "$file"
echo "✅ Kept their version of $file"
;;
4)
${EDITOR:-nano} "$file"
echo "Manual edit completed. Mark as resolved? (y/n)"
read -p "Response: " resolved
if [ "$resolved" = "y" ]; then
git add "$file"
echo "✅ Manually resolved $file"
fi
;;
5)
echo "⏭️ Skipped $file"
;;
*)
# Use merge tool (default)
git mergetool "$file"
echo "✅ Merge tool resolution completed for $file"
;;
esac
echo
done
# Check if all conflicts are resolved
if [ -z "$(git diff --name-only --diff-filter=U)" ]; then
echo "✅ All conflicts resolved!"
echo "Continue with:"
if [ -f ".git/MERGE_HEAD" ]; then
echo " git commit"
elif [ -d ".git/rebase-merge" ] || [ -d ".git/rebase-apply" ]; then
echo " git rebase --continue"
fi
else
echo "⚠️ Some conflicts remain unresolved."
fi
}
# Conflict prevention strategies
setup_merge_strategies() {
echo "Setting up merge strategies to prevent common conflicts..."
# Configure merge drivers for specific file types
git config merge.ours.driver true
# Set up .gitattributes for different merge strategies
cat > .gitattributes << 'EOF'
# Database migrations - always use ours (current branch)
**/migrations/*.sql merge=ours
db/migrate/*.rb merge=ours
# Lock files - always regenerate
package-lock.json merge=union
yarn.lock merge=union
Cargo.lock merge=union
# Configuration files - manual merge required
*.conf merge=manual
*.ini merge=manual
.env* merge=manual
# Binary files
*.png binary
*.jpg binary
*.gif binary
*.pdf binary
*.zip binary
EOF
# Configure merge tool preferences
git config merge.tool vimdiff
git config mergetool.vimdiff.cmd 'vimdiff "$LOCAL" "$MERGED" "$REMOTE"'
git config mergetool.keepBackup false
echo "✅ Merge strategies configured!"
}
# Rebase helper with conflict handling
smart_rebase() {
local target_branch=${1:-main}
local interactive=${2:-false}
echo "Starting smart rebase onto $target_branch..."
# Fetch latest changes
git fetch origin "$target_branch"
# Check for potential conflicts first
if ! check_merge_conflicts "$target_branch"; then
echo "Potential conflicts detected. Continue anyway? (y/n)"
read -p "Response: " continue_rebase
if [ "$continue_rebase" != "y" ]; then
echo "Rebase cancelled."
return 1
fi
fi
# Start rebase
if [ "$interactive" = "true" ]; then
git rebase -i "origin/$target_branch"
else
git rebase "origin/$target_branch"
fi
# Handle rebase conflicts
while [ -d ".git/rebase-merge" ] || [ -d ".git/rebase-apply" ]; do
if [ -n "$(git diff --name-only --diff-filter=U)" ]; then
echo "Rebase conflicts detected. Resolving..."
resolve_conflicts
echo "Continue rebase? (y/n/s for skip/a for abort)"
read -p "Response: " rebase_action
case $rebase_action in
s)
git rebase --skip
;;
a)
git rebase --abort
echo "Rebase aborted."
return 1
;;
*)
git rebase --continue
;;
esac
else
git rebase --continue
fi
done
echo "✅ Rebase completed successfully!"
}
# Conflict resolution aliases
alias gmc='check_merge_conflicts'
alias grc='resolve_conflicts'
alias gsm='setup_merge_strategies'
alias grb='smart_rebase'#!/bin/bash
# Git hooks setup and automation
# Install comprehensive git hooks
install_git_hooks() {
local hooks_dir=".git/hooks"
echo "Installing Git hooks..."
# Pre-commit hook
cat > "$hooks_dir/pre-commit" << 'EOF'
#!/bin/bash
# Pre-commit hook for code quality checks
echo "Running pre-commit checks..."
# Check for large files
large_files=$(git diff --cached --name-only | xargs ls -la 2>/dev/null | awk '$5 > 5242880 {print $9 " (" $5 " bytes)"}')
if [ -n "$large_files" ]; then
echo "❌ Large files detected (>5MB):"
echo "$large_files"
echo "Consider using Git LFS for large files."
exit 1
fi
# Check for secrets
if command -v git-secrets &> /dev/null; then
git secrets --scan || exit 1
fi
# Run linting
if [ -f "package.json" ] && command -v npm &> /dev/null; then
npm run lint || exit 1
elif [ -f "Cargo.toml" ] && command -v cargo &> /dev/null; then
cargo clippy -- -D warnings || exit 1
elif [ -f "pyproject.toml" ] && command -v ruff &> /dev/null; then
ruff check . || exit 1
fi
# Check commit message format (if not amending)
if [ ! -f ".git/COMMIT_EDITMSG" ]; then
# This will be handled by commit-msg hook
true
fi
echo "✅ Pre-commit checks passed!"
EOF
# Commit message hook
cat > "$hooks_dir/commit-msg" << 'EOF'
#!/bin/bash
# Commit message format validation
commit_regex='^(feat|fix|docs|style|refactor|test|chore|perf|ci|build|revert)(\(.+\))?: .{1,50}'
error_msg="❌ Invalid commit message format!
Format: type(scope): description
Types: feat, fix, docs, style, refactor, test, chore, perf, ci, build, revert
Example: feat(auth): add JWT token validation
Your commit message:
$(cat "$1")"
if ! grep -qE "$commit_regex" "$1"; then
echo "$error_msg" >&2
exit 1
fi
echo "✅ Commit message format is valid!"
EOF
# Pre-push hook
cat > "$hooks_dir/pre-push" << 'EOF'
#!/bin/bash
# Pre-push hook for comprehensive testing
echo "Running pre-push checks..."
# Get the remote and branch being pushed to
remote="$1"
url="$2"
# Run tests
if [ -f "package.json" ] && command -v npm &> /dev/null; then
echo "Running npm tests..."
npm test || exit 1
elif [ -f "Cargo.toml" ] && command -v cargo &> /dev/null; then
echo "Running cargo tests..."
cargo test || exit 1
elif [ -f "Makefile" ] && grep -q "test" Makefile; then
echo "Running make tests..."
make test || exit 1
fi
# Check for merge conflicts markers in committed files
if git diff --cached --name-only | xargs grep -l "<<<<<<< \|>>>>>>> \|=======" 2>/dev/null; then
echo "❌ Merge conflict markers found in staged files!"
exit 1
fi
# Security scan
if command -v safety &> /dev/null && [ -f "requirements.txt" ]; then
safety check || exit 1
fi
echo "✅ Pre-push checks passed!"
EOF
# Post-commit hook
cat > "$hooks_dir/post-commit" << 'EOF'
#!/bin/bash
# Post-commit hook for notifications and cleanup
commit_hash=$(git rev-parse HEAD)
commit_msg=$(git log -1 --pretty=%B)
echo "✅ Commit successful: $commit_hash"
echo "Message: $commit_msg"
# Optional: Send notification to Slack/Discord
# if [ -n "$SLACK_WEBHOOK_URL" ]; then
# curl -X POST -H 'Content-type: application/json' \
# --data "{\"text\":\"New commit by $(git config user.name): $commit_msg\"}" \
# "$SLACK_WEBHOOK_URL"
# fi
EOF
# Make hooks executable
chmod +x "$hooks_dir"/*
echo "✅ Git hooks installed successfully!"
echo "Hooks installed:"
echo " - pre-commit: Code quality checks"
echo " - commit-msg: Message format validation"
echo " - pre-push: Comprehensive testing"
echo " - post-commit: Notifications"
}
# Setup git secrets (for preventing credential commits)
setup_git_secrets() {
echo "Setting up git-secrets..."
if ! command -v git-secrets &> /dev/null; then
echo "git-secrets not found. Installing..."
# Try to install via brew (macOS)
if command -v brew &> /dev/null; then
brew install git-secrets
else
echo "Please install git-secrets manually: https://github.com/awslabs/git-secrets"
return 1
fi
fi
# Install git-secrets hooks
git secrets --install
git secrets --register-aws
# Add custom patterns
git secrets --add 'password\s*=\s*[^\s]+'
git secrets --add 'api[_-]?key\s*=\s*[^\s]+'
git secrets --add 'secret[_-]?key\s*=\s*[^\s]+'
git secrets --add 'private[_-]?key\s*=\s*[^\s]+'
echo "✅ git-secrets configured with common patterns!"
}
# Automated changelog generation
generate_changelog() {
local version=${1:-"$(git describe --tags --abbrev=0 2>/dev/null || echo 'v1.0.0')"}
local previous_version=${2:-"$(git describe --tags --abbrev=0 HEAD~1 2>/dev/null || echo 'HEAD~10')"}
echo "Generating changelog from $previous_version to $version..."
cat > CHANGELOG.md << EOF
# Changelog
## [$version] - $(date +%Y-%m-%d)
### Added
$(git log "$previous_version"..HEAD --pretty=format:"- %s" --grep="^feat" | sed 's/^feat[^:]*: //')
### Fixed
$(git log "$previous_version"..HEAD --pretty=format:"- %s" --grep="^fix" | sed 's/^fix[^:]*: //')
### Changed
$(git log "$previous_version"..HEAD --pretty=format:"- %s" --grep="^refactor\|^perf" | sed 's/^[^:]*: //')
### Documentation
$(git log "$previous_version"..HEAD --pretty=format:"- %s" --grep="^docs" | sed 's/^docs[^:]*: //')
### All Changes
$(git log "$previous_version"..HEAD --pretty=format:"- %s (%an)" --reverse)
EOF
echo "✅ Changelog generated in CHANGELOG.md"
}
# Git hook aliases
alias gih='install_git_hooks'
alias gis='setup_git_secrets'
alias gcl='generate_changelog'<function_calls> [{"content": "Create Development Workflow agents", "status": "in_progress", "activeForm": "Creating development workflow agents"}, {"content": "Create Git Workflow Expert", "status": "completed", "activeForm": "Created Git Workflow Expert"}, {"content": "Create CI/CD Pipeline Architect", "status": "in_progress", "activeForm": "Creating CI/CD Pipeline Architect"}, {"content": "Create Project Setup Wizard", "status": "pending", "activeForm": "Creating Project Setup Wizard"}, {"content": "Create Code Quality Guardian", "status": "pending", "activeForm": "Creating Code Quality Guardian"}, {"content": "Create Documentation Specialist", "status": "pending", "activeForm": "Creating Documentation Specialist"}, {"content": "Create Dependency Manager", "status": "pending", "activeForm": "Creating Dependency Manager"}, {"content": "Create Team Collaboration agents", "status": "pending", "activeForm": "Creating team collaboration agents"}, {"content": "Create Agile Sprint Planner", "status": "pending", "activeForm": "Creating Agile Sprint Planner"}, {"content": "Create Code Pairing Assistant", "status": "pending", "activeForm": "Creating Code Pairing Assistant"}, {"content": "Create Technical Debt Analyst", "status": "pending", "activeForm": "Creating Technical Debt Analyst"}, {"content": "Create Onboarding Specialist", "status": "pending", "activeForm": "Creating Onboarding Specialist"}, {"content": "Create Testing & Quality agents", "status": "pending", "activeForm": "Creating testing & quality agents"}, {"content": "Create Test Strategy Architect", "status": "pending", "activeForm": "Creating Test Strategy Architect"}, {"content": "Create Security Audit Expert", "status": "pending", "activeForm": "Creating Security Audit Expert"}, {"content": "Create Performance Profiler", "status": "pending", "activeForm": "Creating Performance Profiler"}, {"content": "Create Release & Deployment agents", "status": "pending", "activeForm": "Creating release & deployment agents"}, {"content": "Create Release Manager", "status": "pending", "activeForm": "Creating Release Manager"}, {"content": "Create Environment Manager", "status": "pending", "activeForm": "Creating Environment Manager"}]