UNPKG

@cloudkinetix/bmad-enhanced

Version:

Cloud-Kinetix enhanced fork of BMAD-METHOD - Breakthrough Method of Agile AI-driven Development with robust versioning and unified validation.

584 lines (450 loc) 16.9 kB
# git-analysis Comprehensive git repository analysis utilities for extracting development insights, correlating code changes with BMAD stories and JIRA issues, and supporting intelligent sync operations. ## Core Analysis Functions ### Git History Analysis **Commit Activity Extraction:** ```bash # Yesterday's team activity git log --since="yesterday" --oneline --stat --all --no-merges # Individual developer analysis git log --since="yesterday" --author="developer@email.com" --oneline --stat # Detailed commit information with file changes git log --since="yesterday" --name-status --pretty=format:"%h|%an|%ae|%ad|%s" --date=iso # Branch activity and merge patterns git log --graph --oneline --since="yesterday" --all --decorate ``` **File Change Analysis:** ```bash # Files modified with change statistics git diff --name-status HEAD~1 HEAD git diff --stat HEAD~1 HEAD # Line-by-line changes for specific files git diff HEAD~1 HEAD -- src/specific/file.js # Directory-level change summary git diff --dirstat HEAD~1 HEAD ``` **Developer Activity Patterns:** ```bash # Commit frequency by developer git shortlog -sn --since="1 week ago" # Developer activity timeline git log --since="1 week ago" --pretty=format:"%an %ad %s" --date=short | sort # Code ownership analysis git log --pretty=format:"%an" -- path/to/component | sort | uniq -c | sort -nr ``` ### Code Quality Analysis **Test Coverage Detection:** ```bash # Test file changes git log --since="yesterday" --name-only | grep -E "\.(test|spec)\.(js|ts|py|rb)$" # Test line additions git log --since="yesterday" --numstat | grep -E "\.(test|spec)\." | awk '{sum+=$1} END {print sum}' # Test coverage trend git log --since="1 week ago" --pretty=format:"%ad" --date=short --name-only | \ grep -E "\.(test|spec)\." | sort | uniq -c ``` **Refactoring Detection:** ```bash # Refactoring commits (high line changes, same functionality) git log --since="yesterday" --pretty=format:"%h %s" --stat | \ awk '/files? changed/ && $(NF-3) > 50 {print prev} {prev=$0}' # Code complexity indicators git log --since="yesterday" --numstat | \ awk '{files++; added+=$1; deleted+=$2} END {print "Files:", files, "Added:", added, "Deleted:", deleted}' # Documentation changes git log --since="yesterday" --name-only | grep -E "\.(md|rst|txt|doc)$" ``` **Bug Fix Detection:** ```bash # Bug fix commits git log --since="yesterday" --grep="fix\|bug\|issue" --oneline # Emergency fixes (commits outside normal hours) git log --since="yesterday" --pretty=format:"%ad %h %s" --date=format:"%H" | \ awk '$1 < 8 || $1 > 18 {print}' # Hotfix branch activity git log --since="yesterday" --all --grep="hotfix\|urgent" --oneline ``` ### Collaboration Analysis **Code Review Activity:** ```bash # Pull request related commits git log --since="yesterday" --grep="merge\|pull\|review" --oneline # Collaborative commits (multiple authors) git log --since="yesterday" --pretty=format:"%an %cn %s" | \ awk '$1 != $2 {print "Collaborative:", $0}' # Review comments and feedback git log --since="yesterday" --grep="review\|feedback\|address" --oneline ``` **Knowledge Sharing Patterns:** ```bash # Cross-component work (developers working outside their usual areas) git log --since="1 week ago" --name-only --pretty=format:"%an" | \ grep -v "^$" | awk 'NR%2==1{dev=$0} NR%2==0{print dev, $0}' | \ sort | uniq -c | sort -nr # Pair programming detection git log --since="yesterday" --pretty=format:"%s" | grep -i "pair\|mob\|together" ``` ## BMAD Correlation Intelligence ### Story-to-Code Mapping **File Path Correlation:** ```bash # Map file changes to story components analyze_story_correlation() { local story_file="$1" local component_paths=$(grep -E "Component|Module|File" "$story_file" | \ grep -oE "src/[a-zA-Z0-9/_-]+") for path in $component_paths; do git log --since="yesterday" --name-only | grep -E "^$path" | \ while read file; do echo "Story: $story_file, File: $file" done done } # Example: analyze_story_correlation "authentication.storyimpl.md" ``` **Commit Message Analysis:** ```bash # Extract story references from commit messages extract_story_references() { git log --since="yesterday" --pretty=format:"%h|%s" | \ grep -iE "(story|bmad|feature)" | \ grep -oE "([a-zA-Z0-9-]+\.story\.md|BMAD-[0-9]+|story[:#]\s*[a-zA-Z0-9-]+)" } # Find commits mentioning specific stories find_story_commits() { local story_name="$1" git log --since="yesterday" --grep="$story_name" --oneline } ``` **Component Change Detection:** ```bash # Identify which story components were modified detect_component_changes() { local components=("auth" "user" "payment" "search" "admin") for component in "${components[@]}"; do local changes=$(git log --since="yesterday" --name-only | \ grep -E "src.*$component" | wc -l) if [ "$changes" -gt 0 ]; then echo "$component: $changes files changed" fi done } ``` ### Progress Estimation **Completion Analysis:** ```bash # Estimate story completion based on file changes estimate_story_progress() { local story_file="$1" local total_components=$(grep -c "Component\|Module" "$story_file") local modified_components=0 # Count components with recent changes grep -E "Component|Module" "$story_file" | \ while read component_line; do local component=$(echo "$component_line" | grep -oE "src/[a-zA-Z0-9/_-]+") local changes=$(git log --since="1 week ago" --name-only | \ grep -E "^$component" | wc -l) if [ "$changes" -gt 0 ]; then ((modified_components++)) fi done local completion_percentage=$((modified_components * 100 / total_components)) echo "Story: $story_file, Progress: $completion_percentage%" } ``` **Acceptance Criteria Mapping:** ```bash # Map commits to acceptance criteria map_commits_to_criteria() { local story_file="$1" # Extract acceptance criteria from story grep -E "^-.*\[.*\]|^[0-9]+\." "$story_file" | \ while read criteria; do # Look for commits that might address this criteria local keywords=$(echo "$criteria" | \ grep -oE "[a-zA-Z]{3,}" | tr '\n' '|' | sed 's/|$//') if [ -n "$keywords" ]; then echo "Criteria: $criteria" git log --since="1 week ago" --grep="$keywords" --oneline | \ sed 's/^/ Commit: /' fi done } ``` ## JIRA Integration Analysis ### Issue Correlation **Commit-to-Issue Matching:** ```bash # Extract JIRA issue references from commits extract_jira_references() { git log --since="yesterday" --pretty=format:"%h|%s" | \ grep -oE "[A-Z]+-[0-9]+" | sort | uniq } # Find commits for specific JIRA issue find_issue_commits() { local issue_key="$1" git log --since="1 month ago" --grep="$issue_key" --oneline } # Analyze commit patterns for JIRA issues analyze_jira_commit_patterns() { local issue_key="$1" git log --grep="$issue_key" --name-only --pretty=format:"" | \ grep -v "^$" | sort | uniq -c | sort -nr | head -10 } ``` **Status Correlation:** ```bash # Detect development activity for JIRA issues detect_jira_activity() { local since_date="${1:-yesterday}" extract_jira_references | while read issue; do local commit_count=$(git log --since="$since_date" --grep="$issue" --oneline | wc -l) local files_changed=$(git log --since="$since_date" --grep="$issue" --name-only | \ grep -v "^$" | sort | uniq | wc -l) if [ "$commit_count" -gt 0 ]; then echo "Issue: $issue, Commits: $commit_count, Files: $files_changed" fi done } ``` ### Time Estimation **Commit-Based Time Analysis:** ```bash # Estimate time spent based on commit patterns estimate_development_time() { local author="$1" local since_date="${2:-yesterday}" # Get commit timestamps for the author git log --author="$author" --since="$since_date" \ --pretty=format:"%ad" --date=format:"%Y-%m-%d %H:%M" | \ sort | while read timestamp; do echo "$timestamp" done | \ awk ' { if (prev != "") { diff = strftime("%s", mktime(gensub(/-|:/, " ", "g", $0))) - strftime("%s", mktime(gensub(/-|:/, " ", "g", prev))) if (diff < 7200) total_time += diff # Only count if < 2 hours apart } prev = $0 } END { print "Estimated time: " total_time/3600 " hours" } ' } # Analyze development session patterns analyze_development_sessions() { local author="$1" git log --author="$author" --since="1 week ago" \ --pretty=format:"%ad" --date=format:"%H" | \ sort | uniq -c | \ awk '{print "Hour " $2 ": " $1 " commits"}' } ``` ## Sync Intelligence Support ### Divergence Detection **Status Lag Detection:** ```bash # Find commits without corresponding JIRA activity detect_silent_development() { local since_date="${1:-yesterday}" # Get all commits since date git log --since="$since_date" --pretty=format:"%h|%s" | \ while IFS='|' read hash message; do # Check if commit mentions JIRA issue if ! echo "$message" | grep -qE "[A-Z]+-[0-9]+"; then echo "Silent commit: $hash - $message" fi done } # Find JIRA issues marked done without recent commits detect_phantom_progress() { # This would integrate with JIRA API to compare status vs git activity echo "Requires JIRA API integration for full implementation" } ``` **Documentation Drift Detection:** ```bash # Find BMAD stories that might be outdated detect_documentation_drift() { local stories_dir="${1:-.}" find "$stories_dir" -name "*.storyimpl.md" | while read story; do local story_date=$(stat -f "%m" "$story" 2>/dev/null || stat -c "%Y" "$story" 2>/dev/null) local last_commit_date=$(git log -1 --format="%ct" 2>/dev/null || echo "0") if [ "$last_commit_date" -gt "$story_date" ]; then local component=$(basename "$story" .storyimpl.md) local recent_commits=$(git log --since="@$story_date" --grep="$component" --oneline | wc -l) if [ "$recent_commits" -gt 0 ]; then echo "Outdated story: $story ($recent_commits commits since last update)" fi fi done } ``` ### Quality Metrics **Code Quality Indicators:** ```bash # Calculate code quality metrics calculate_quality_metrics() { local since_date="${1:-yesterday}" # Test coverage change local test_files=$(git log --since="$since_date" --name-only | \ grep -E "\.(test|spec)\." | wc -l) local total_files=$(git log --since="$since_date" --name-only | \ grep -v "^$" | sort | uniq | wc -l) # Documentation changes local doc_files=$(git log --since="$since_date" --name-only | \ grep -E "\.(md|rst|txt)$" | wc -l) # Refactoring indicators local refactor_commits=$(git log --since="$since_date" --grep="refactor\|cleanup\|improve" --oneline | wc -l) echo "Quality Metrics for $since_date:" echo " Test files modified: $test_files" echo " Total files modified: $total_files" echo " Documentation updates: $doc_files" echo " Refactoring commits: $refactor_commits" } # Team collaboration score calculate_collaboration_score() { local since_date="${1:-1 week ago}" # Cross-developer file modifications local shared_files=$(git log --since="$since_date" --name-only | \ sort | uniq -c | awk '$1 > 1 {count++} END {print count+0}') # Code review activity local review_commits=$(git log --since="$since_date" --grep="review\|merge\|pull" --oneline | wc -l) # Pair programming indicators local pair_commits=$(git log --since="$since_date" --grep="pair\|mob" --oneline | wc -l) echo "Collaboration Metrics:" echo " Shared files: $shared_files" echo " Review activity: $review_commits" echo " Pair programming: $pair_commits" } ``` ## Advanced Analysis Features ### Predictive Analytics **Development Velocity Trends:** ```bash # Calculate weekly development velocity calculate_velocity_trend() { for week in {0..4}; do local start_date=$(date -d "$week weeks ago" +%Y-%m-%d 2>/dev/null || \ date -v-${week}w +%Y-%m-%d 2>/dev/null) local end_date=$(date -d "$((week-1)) weeks ago" +%Y-%m-%d 2>/dev/null || \ date -v-$((week-1))w +%Y-%m-%d 2>/dev/null) local commits=$(git log --since="$start_date" --until="$end_date" --oneline | wc -l) local files=$(git log --since="$start_date" --until="$end_date" --name-only | \ grep -v "^$" | sort | uniq | wc -l) echo "Week $week ago: $commits commits, $files files" done } # Predict completion based on current velocity predict_completion() { local total_stories="$1" local completed_stories="$2" local weeks_elapsed="$3" local velocity=$(echo "scale=2; $completed_stories / $weeks_elapsed" | bc) local remaining_stories=$((total_stories - completed_stories)) local estimated_weeks=$(echo "scale=2; $remaining_stories / $velocity" | bc) echo "Current velocity: $velocity stories/week" echo "Estimated completion: $estimated_weeks weeks" } ``` ### Risk Analysis **Code Risk Indicators:** ```bash # Identify high-risk areas identify_risk_areas() { local since_date="${1:-1 month ago}" # Files with high change frequency echo "High-change files (potential instability):" git log --since="$since_date" --name-only | \ grep -v "^$" | sort | uniq -c | sort -nr | head -10 # Large commits (potential complexity) echo -e "\nLarge commits (potential complexity):" git log --since="$since_date" --numstat | \ awk '{lines=$1+$2; if(lines>100) print $3, lines}' | sort -nr | head -10 # Commits without tests echo -e "\nRecent commits potentially missing tests:" git log --since="yesterday" --name-only --pretty=format:"%h %s" | \ awk '/^[a-f0-9]/ {commit=$0; files=""} !/^[a-f0-9]/ && !/test|spec/ {files=files $0 " "} /^$/ && files {print commit ": " files; files=""}' } # Bus factor analysis analyze_bus_factor() { echo "Code ownership concentration:" git log --since="3 months ago" --pretty=format:"%an" | \ sort | uniq -c | sort -nr | \ awk 'BEGIN{total=0} {total+=$1; authors[NR]=$2; commits[NR]=$1} END{ for(i=1; i<=NR; i++) { percent=commits[i]*100/total printf "%-20s %3d commits (%2.0f%%)\n", authors[i], commits[i], percent } }' } ``` ## Integration Helpers ### Data Export Functions **JSON Export for External Tools:** ```bash # Export git analysis as JSON export_git_analysis_json() { local since_date="${1:-yesterday}" local output_file="${2:-git_analysis.json}" cat > "$output_file" << EOF { "analysis_date": "$(date -Iseconds)", "period": "$since_date", "commits": [ $(git log --since="$since_date" --pretty=format:' {"hash":"%h","author":"%an","date":"%ad","message":"%s"},' --date=iso | sed '$s/,$//') ], "files_changed": [ $(git log --since="$since_date" --name-only --pretty=format:'' | grep -v '^$' | sort | uniq | sed 's/.*/"&",/' | sed '$s/,$//') ], "statistics": { "total_commits": $(git log --since="$since_date" --oneline | wc -l), "files_modified": $(git log --since="$since_date" --name-only | grep -v '^$' | sort | uniq | wc -l), "authors": $(git log --since="$since_date" --pretty=format:"%an" | sort | uniq | wc -l) } } EOF } # Export BMAD correlation data export_bmad_correlation_json() { local stories_dir="${1:-.}" local output_file="${2:-bmad_correlation.json}" echo '{"story_correlations": [' > "$output_file" find "$stories_dir" -name "*.storyimpl.md" | while read story; do local story_name=$(basename "$story" .storyimpl.md) local commits=$(git log --since="1 week ago" --grep="$story_name" --oneline | wc -l) echo " {" >> "$output_file" echo " \"story\": \"$story\"," >> "$output_file" echo " \"recent_commits\": $commits," >> "$output_file" echo " \"last_modified\": \"$(stat -f "%m" "$story" 2>/dev/null || stat -c "%Y" "$story")\"" >> "$output_file" echo " }," >> "$output_file" done # Remove last comma and close JSON sed -i '' '$s/,$//' "$output_file" 2>/dev/null || sed -i '$s/,$//' "$output_file" echo ']}' >> "$output_file" } ``` ## Usage Examples ### Daily Standup Preparation ```bash # Comprehensive daily analysis ./git-analysis.sh daily-standup # Individual developer analysis ./git-analysis.sh developer-activity "john.doe@company.com" # Story correlation analysis ./git-analysis.sh story-correlation "authentication.storyimpl.md" ``` ### Sync Operation Support ```bash # Detect sync issues ./git-analysis.sh detect-divergence # Generate sync recommendations ./git-analysis.sh sync-recommendations # Validate sync completion ./git-analysis.sh validate-sync ``` This comprehensive git analysis toolkit provides the foundation for intelligent standup preparation, sync operation support, and continuous development insight generation that bridges code reality with project planning and tracking systems.