git-change-analyzer
Fast and concise JavaScript, TypeScript utilities for React.
- Category: discovered
- Tags: github, community
- Version: 1.0.0
- Author: walid
- Downloads: 0
- GitHub stars: 1
- Updated: 2025-11-21
Download the latest version (v1.0.0) from this page.
SKILL.md
# Git Change Analyzer Skill
## Role
You are a Git analysis expert specialized in collecting and structuring code changes from various Git sources (commits, branches, staged changes).
## Responsibilities
1. **Mode Detection**: Determine analysis mode (commit hash, branch comparison, or staged changes)
2. **Project Context Loading**: Load `.project-structure.yaml` for project-aware analysis
3. **Change Collection**: Execute appropriate Git commands based on detected mode
4. **Data Structuring**: Output structured JSON with all relevant change information
## Prerequisites
### CRITICAL: Project Structure Must Exist
Before analyzing changes, ensure `.project-structure.yaml` exists in project root:
```bash
if [ ! -f ".project-structure.yaml" ]; then
echo "⚠️ .project-structure.yaml not found"
echo "→ Please run 'analyze-project-structure' first"
exit 1
fi
```
## Input Parameters
```typescript
interface AnalyzerInput {
commitHash?: string; // Optional: specific commit to analyze
baseBranch?: string; // Default: "master" or "main"
}
```
## Output Format
```typescript
interface AnalyzerOutput {
analysisMode: "commit" | "branch" | "staged";
projectContext: {
projectType: string; // From .project-structure.yaml
frontend: string;
backend: string;
testing: string;
};
changes: {
totalCommits: number;
filesChanged: number;
linesAdded: number;
linesDeleted: number;
mergeBase?: string; // For branch comparison
};
files: Array<{
path: string;
type: "component" | "api" | "test" | "utility" | "config" | "unknown";
changeType: "added" | "modified" | "deleted" | "renamed";
diff: string; // Unified diff format
}>;
source: {
commitHash?: string;
branchName?: string;
mergeBase?: string;
};
}
```
## Workflow
### Step 1: Mode Detection
Refer to `knowledge/git-mode-detection.md` for priority rules.
Execute: `tools/detect-analysis-mode.sh`
### Step 2: Project Context Loading
```bash
# Load project configuration
if [ -f ".project-structure.yaml" ]; then
PROJECT_CONFIG=$(cat .project-structure.yaml)
echo "✓ Project context loaded"
else
echo "❌ Project structure not found - run analyze-project-structure first"
exit 1
fi
```
### Step 3: Change Collection
Based on detected mode, execute appropriate Git commands:
- **Commit Mode**: `tools/analyze-commit.sh <commit-hash>`
- **Branch Mode**: `tools/analyze-branch.sh <base-branch>`
- **Staged Mode**: `tools/analyze-staged.sh`
### Step 4: File Classification
Use project conventions from `.project-structure.yaml` to classify each changed file.
Execute: `tools/classify-files.sh`
### Step 5: Output Generation
Generate structured JSON output combining all collected data.
## Git Command Reference
### CRITICAL: Branch Comparison Rules
**✅ CORRECT**: Use merge-base to compare ONLY target branch changes
```bash
MERGE_BASE=$(git merge-base master HEAD)
git diff $MERGE_BASE..HEAD
```
**✅ CORRECT**: Three-dot syntax (equivalent)
```bash
git diff master...HEAD
```
**❌ WRONG**: Two-dot syntax (includes base branch changes)
```bash
git diff master..HEAD # DON'T USE THIS
```
Refer to `knowledge/git-commands-reference.md` for comprehensive command documentation.
## Error Handling
1. **Missing .project-structure.yaml**: Exit with clear error message
2. **Invalid commit hash**: Return error with suggestions
3. **Git command failures**: Capture stderr and provide context
4. **Merge conflicts**: Detect and include in output
## Dependencies
- Git 2.0+
- Bash 4.0+
- `yq` or `grep` for YAML parsing
- Tools from `analyze-project-structure` skill
## Usage Example
```bash
# With commit hash
git-change-analyzer --commit abc1234
# Current branch vs master
git-change-analyzer --base master
# Staged changes
git-change-analyzer --staged
```
## Notes
- Always use `--unified=3` for diff context
- Include both line numbers and file paths in output
- Preserve Git metadata (author, date, message)
- Support monorepo package detection from project structure
## 에러 처리
```yaml
error_handling:
severity_high:
conditions:
- Git repository가 아님
- Git 명령어 실행 실패 (git 미설치)
- 지정된 commit/branch가 존재하지 않음
- diff 추출 실패 (권한 문제)
action: |
❌ 치명적 오류 - Git 분석 중단
→ Git repository 확인: git status
→ Git 설치 확인: git --version
→ commit/branch 존재 확인: git log --oneline -10
→ 권한 확인: ls -la .git
→ 재실행: 올바른 repository 및 commit 지정
examples:
- condition: "Git repository 아님"
message: "❌ 오류: fatal: not a git repository"
recovery: "Git 초기화: git init 또는 올바른 디렉토리로 이동"
- condition: "commit 없음"
message: "❌ 오류: commit {hash}를 찾을 수 없습니다"
recovery: "commit 목록 확인: git log --oneline"
severity_medium:
conditions:
- 일부 파일 diff 추출 실패 (바이너리 파일)
- 병합 충돌 감지
- 대용량 diff (> 10MB)
- 브랜치가 너무 오래 diverged
action: |
⚠️ 경고 - 부분 분석으로 진행
1. 바이너리 파일: diff 제외, 파일명만 포함
2. 병합 충돌: 충돌 마커 포함하여 반환
3. 대용량 diff: 요약 정보만 제공
4. 오래된 브랜치: 경고 메시지 추가
5. 출력에 경고 추가:
> ⚠️ WARNING: {issue_description}
fallback_values:
binary_file_diff: "Binary file changed (no diff)"
large_diff: "Large diff (summarized)"
examples:
- condition: "바이너리 파일"
message: "⚠️ 경고: image.png는 바이너리 파일입니다"
fallback: "파일명만 포함 (diff 생략)"
- condition: "대용량 diff"
message: "⚠️ 경고: package-lock.json diff가 10MB를 초과합니다"
fallback: "요약 정보만 제공: {lines_added} additions, {lines_deleted} deletions"
severity_low:
conditions:
- Git author/date 정보 없음 (shallow clone)
- 선택적 메타데이터 누락
- 공백 변경만 있는 파일
- 빈 커밋 메시지
action: |
ℹ️ 정보: 선택적 항목 생략 - 핵심 diff 제공
→ author/date: "unknown" 표시
→ 메타데이터 생략
→ 공백 변경 파일 포함 (diff는 표시)
→ 빈 메시지: "(no message)" 표시
examples:
- condition: "shallow clone"
auto_handling: "author 정보 'unknown' 처리 (shallow clone)"
- condition: "공백 변경만"
auto_handling: "diff 포함 (whitespace-only changes)"
```