--- name: pr description: "Analyze changes, detect scope issues, and create a well-structured PR" --- # Create Pull Request Analyze changes, detect scope issues, and create a well-structured PR following project conventions. ## Process 1. **Analyze Changes**: Calculate complexity score from files, commits, and directories 2. **Detect Scope Issues**: Warn if PR is too large or mixes unrelated changes 3. **Suggest Split**: If needed, group commits by scope and propose separate PRs 4. **Collect Info**: Ask for type, target branch, draft status, labels 5. **Generate Content**: Create TLDR + description + checklist 6. **Create PR**: Execute `gh pr create` with proper formatting 7. **Remind Follow-up**: Display post-PR checklist (SonarQube, Claude Review) ## Complexity Score Calculate PR complexity to detect if split is needed: | Criterion | Weight | Description | |-----------|--------|-------------| | Code files | x2 | `*.ts, *.tsx` (excluding tests) | | Test files | x0.5 | `*.test.ts, *.spec.ts` | | Config files | x1 | `*.json, *.yml, *.md` | | Directories | x3 | Distinct `src/*` directories | | Commits | x1 | Number of commits | **Thresholds**: 0-15 ✅ Normal | 16-25 ⚠️ Large | 26+ 🔴 Split recommended ## Scope Coherence | Pattern | Verdict | |---------|---------| | Single scope | ✅ OK | | Related scopes (sessions + calendar) | ✅ OK | | Unrelated scopes (payments + auth) | 🔴 Split | | feat + fix same scope | ✅ OK | | feat + fix different scopes | 🔴 Split | ## Split Suggestion Format When split is recommended, display: ``` 🔴 Scope trop large (score: 32) Commits par scope : ├── payments (5 commits, 8 fichiers) │ ├── feat(payments): add Stripe checkout │ └── fix(payments): handle currency │ └── notifications (3 commits, 6 fichiers) └── feat(notifications): add email templates 💡 Suggestion : 1. PR #1 : feature/payments-stripe → Commits payments 2. PR #2 : feature/notifications → Commits notifications Options : [A] Continuer avec une seule PR (non recommandé) [B] Découper (semi-auto - commandes git fournies) [C] Voir détail fichiers ``` **Semi-auto split** provides copy-paste commands: ```bash git checkout develop git checkout -b feature/payments-stripe git cherry-pick abc1234 def5678 git push -u origin feature/payments-stripe ``` ## Questions to Ask 1. **Type**: feature | fix | tech | docs | security 2. **Target Branch**: Show recent branches (develop, main, others) 3. **Draft**: Yes (WIP) | No (ready for review) 4. **Labels**: Based on type + optional (breaking-change, security) ## PR Title Format ``` (): ``` Examples: - `feat(payments): add Stripe checkout integration` - `fix(sessions): resolve timezone calculation bug` ## PR Body Template ```markdown ## TLDR --- ## Type {Feature | Fix | Tech | Docs | Security} ## Description {Context and changes} ## Technical Changes {List of main modifications} ## Tests - [ ] Unit tests added/passing - [ ] Manual testing completed ## Checklist - [ ] Code follows conventions - [ ] No console.log left - [ ] Types OK (`pnpm typecheck`) --- 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude ``` ## Available Labels | Label | Color | Use When | |-------|-------|----------| | `feature` | 🟢 | New functionality | | `fix` | 🔴 | Bug fix | | `tech` | 🔵 | Refactoring, tech debt | | `docs` | 📘 | Documentation only | | `security` | 🟣 | Security fix | | `breaking-change` | ⚫ | Breaking changes | | `WIP` | 🟡 | Work in progress (draft) | ## Commands to Execute ```bash # 1. Get base branch (usually develop) BASE_BRANCH="develop" # 2. Calculate complexity score CODE=$(git diff --name-only $BASE_BRANCH..HEAD | grep -E '\.(ts|tsx)$' | grep -v test | wc -l) TESTS=$(git diff --name-only $BASE_BRANCH..HEAD | grep -E '\.test\.|\.spec\.' | wc -l) DIRS=$(git diff --name-only $BASE_BRANCH..HEAD | cut -d'/' -f1-2 | sort -u | wc -l) COMMITS=$(git rev-list --count $BASE_BRANCH..HEAD) SCORE=$((CODE * 2 + TESTS / 2 + DIRS * 3 + COMMITS)) # 3. Get scopes from commits git log --oneline $BASE_BRANCH..HEAD --format="%s" | sed -n 's/^\w*(\([^)]*\)).*/\1/p' | sort | uniq -c # 4. Recent branches for selection git branch --sort=-committerdate --format='%(refname:short)' | head -5 # 5. Create PR gh pr create \ --title "(): " \ --body "$BODY" \ --base $BASE_BRANCH \ --label "