Gentle IA — Compétence Branche & PR
Quand l'utiliser
Chargez cette compétence chaque fois que vous avez besoin de :
- Créer une branche pour une nouvelle correction ou fonctionnalité
- Ouvrir une pull request sur Gentleman-Programming/gentle-ai
- Préparer des modifications pour une revue
Règles critiques
- Chaque PR DOIT lier un issue approuvé —
Closes/Fixes/Resolves #<N>dans le corps de la PR, et cet issue DOIT avoir le labelstatus:approved. Les PR sans cela sont automatiquement rejetées par l'IC. - Catégorisation
type:*ordinaire — L'IC rejette zéro ou plusieurs labels de type. Acheminez-la via le contrat de workflow de création d'issue canonique : une instruction humaine directe en cours lie la cible/action exacte, la capacité de l'hôte cible est vérifiée, et elle utilise une mutation limitée et une relecture de l'hôte cible ; sinon, attendez sans mutation. - Étiquettes de politique protégées — L'ajout ou la suppression de
status:approvedousize:exceptionnécessite une autorité de politique vérifiée provenant d'un mainteneur du dépôt hôte cible ou d'un approbateur autorisé par le dépôt pour la cible/action exacte, ainsi qu'uneviewerPermissionMAINTAINouADMINde l'acteur authentifié sur l'hôte cible.size:exceptionnécessite en plus une justification écrite de dépassement de budget. - Budget de revue de 400 lignes — maintenez les PR dans 400 lignes modifiées (
additions + deletions) ou documentez la justification nécessaire pour un labelsize:exception. - Les vérifications automatisées doivent réussir — voir le tableau des vérifications automatisées ci-dessous.
- Pas de mentions
Co-Authored-By— n'ajoutez jamais d'attribution IA aux commits. - Pas de push forcé sur main/master — branche protégée.
Workflow
1. Confirmer que l'issue a le label status:approved
gh issue view <N> --repo Gentleman-Programming/gentle-ai
2. Créer une branche à partir de main en suivant la convention de nommage ci-dessous
3. Implémenter les modifications selon les specs et la conception
4. Exécuter les vérifications localement (format + unitaires + E2E)
5. Commiter en utilisant le format Conventional Commits
6. Ouvrir une PR en référençant l'issue
→ Déclarer EXACTEMENT UN résultat type:* dans le corps de la PR
→ Utiliser le contrat de workflow de création d'issue canonique avant toute mutation de label de PR
→ Remplir le corps de la PR en utilisant le modèle
7. Toutes les vérifications automatisées doivent réussir avant la fusion
Nommage des branches
Les noms de branche doivent correspondre à ce motif :
^(feat|fix|chore|docs|style|refactor|perf|test|build|ci|revert)\/[a-z0-9._-]+$
| Type | Exemple |
|---|---|
feat/ | feat/user-login |
fix/ | fix/duplicate-observation-insert |
docs/ | docs/api-reference-update |
refactor/ | refactor/extract-query-sanitizer |
chore/ | chore/bump-bubbletea-v0.26 |
style/ | style/fix-linter-warnings |
perf/ | perf/optimize-catalog-loading |
test/ | test/add-pipeline-coverage |
build/ | build/update-goreleaser-config |
ci/ | ci/add-e2e-docker-job |
revert/ | revert/undo-model-picker-change |
Règles :
- Uniquement en minuscules
- Utilisez des tirets, des points ou des underscores comme séparateurs (pas d'espaces, pas de majuscules)
- La description doit être courte et descriptive
Format du corps de la PR
Le corps de la PR doit suivre le modèle dans .github/PULL_REQUEST_TEMPLATE.md. Toutes les sections sont obligatoires sauf indication contraire.
## 🔗 Issue lié
Closes #<N>
## 🏷️ Type de PR
- [ ] `type:bug` — Correction de bogue (changement non cassant qui résout un problème)
- [ ] `type:feature` — Nouvelle fonctionnalité (changement non cassant qui ajoute une fonctionnalité)
- [ ] `type:docs` — Documentation uniquement
- [ ] `type:refactor` — Réusinage de code (aucun changement fonctionnel)
- [ ] `type:chore` — Modifications de build, CI ou outillage
- [ ] `type:breaking-change` — Changement cassant
## 📝 Résumé
<!-- Description claire de ce que fait cette PR et pourquoi. -->
## 📂 Modifications
| Fichier / Zone | Quoi de changé |
|-------------|-------------|
| `path/to/file` | Brève description |
## 🧪 Plan de test
**Tests unitaires**
\`\`\`bash
go test ./...
\`\`\`
**Format Go**
\`\`\`bash
go run ./internal/gofmtcheck
\`\`\`
**Tests E2E** (Docker requis)
\`\`\`bash
cd e2e && ./docker-test.sh
\`\`\`
- [ ] Tests unitaires réussissent (`go test ./...`)
- [ ] Format Go réussi (`go run ./internal/gofmtcheck`)
- [ ] Tests E2E réussissent (`cd e2e && ./docker-test.sh`)
- [ ] Testé manuellement en local
## ✅ Liste de vérification du contributeur
- [ ] La PR est liée à un issue avec `status:approved`
- [ ] La PR reste dans 400 lignes modifiées, ou la justification `size:exception` et l'autorité de politique vérifiée sont documentées
- [ ] La relecture de l'API confirme exactement un label `type:*` approprié sur cette PR
- [ ] Tests unitaires réussissent (`go test ./...`)
- [ ] Tests E2E réussissent (`cd e2e && ./docker-test.sh`)
- [ ] J'ai mis à jour la documentation si nécessaire
- [ ] Mes commits suivent le format Conventional Commits
- [ ] Mes commits n'incluent pas de mentions `Co-Authored-By`
Vérifications automatisées
Ces vérifications sont exécutées sur chaque PR et doivent toutes réussir avant la fusion :
| Vérification | Ce qu'elle vérifie | Comment corriger |
|---|---|---|
| Vérifier la charge cognitive de la PR | La PR reste dans 400 lignes modifiées (additions + deletions) ou a le label size:exception | Divisez la PR, ou documentez la justification size:exception et vérifiez l'autorité de politique avant son action de workflow canonique |
| Vérifier la référence à l'issue | Le corps de la PR contient Closes/Fixes/Resolves #N | Ajoutez Closes #<N> au corps de la PR |
Vérifier que l'issue a status:approved | L'issue lié a le label requis | Utilisez le contrat de workflow de création d'issue canonique uniquement lorsqu'une instruction directe en cours et une autorisation de capacité de l'hôte cible autorisent l'action exacte ; sinon, attendez |
Vérifier que la PR a un label type:* | Exactement un label type:* est appliqué à la PR | Utilisez le contrat de workflow de création d'issue canonique uniquement lorsqu'une instruction directe en cours et une autorisation de capacité de l'hôte cible autorisent l'action exacte ; sinon, attendez |
| Tests unitaires | go test ./... réussit | Corrigez les tests qui échouent avant le push |
| Format Go | go run ./internal/gofmtcheck réussit | Formatez les fichiers Go mal formatés avant le push |
| Tests E2E | cd e2e && ./docker-test.sh réussit | Corrigez les scénarios E2E qui échouent avant le push |
Conventional Commits
Les messages de commit doivent correspondre à ce motif :
^(build|chore|ci|docs|feat|fix|perf|refactor|revert|style|test)(\([a-z0-9\._-]+\))?!?: .+
Format
<type>(<scope optionnel>)!: <description>
[corps optionnel]
[pied de page optionnel]
Types autorisés
| Type | Objectif | Label PR |
|---|---|---|
feat | Nouvelle fonctionnalité | type:feature |
fix | Correction de bogue | type:bug |
docs | Documentation uniquement | type:docs |
refactor | Changement de code (pas de changement de comportement) | type:refactor |
chore | Maintenance, dépendances, outillage | type:chore |
style | Formatage, linting (pas de changement de logique) | type:chore |
perf | Amélioration de performance | type:feature |
test | Ajout ou mise à jour de tests | type:chore |
build | Système de build ou dépendances externes | type:chore |
ci | Configuration CI | type:chore |
revert | Annule un commit précédent | correspond au type annulé |
Changements cassants
Ajoutez ! après le type/scope :
feat(cli)!: renommer le drapeau --config en --config-file
BREAKING CHANGE: le drapeau --config a été renommé en --config-file.
Les changements cassants sont mappés au label type:breaking-change.
Exemples
feat(tui): ajouter une barre de progression aux étapes d'installation
fix(agent): corriger la détection de Claude Code sur macOS
docs: mettre à jour le guide de contribution
chore(deps): mettre à jour bubbletea à v0.26
refactor(pipeline): extraire l'exécuteur d'étape
style: corriger les avertissements du linter dans le paquet catalog
perf(system): mettre en cache le résultat de la détection OS
test(installer): ajouter une couverture pour l'exécution de l'étape catalog
build: mettre à jour la configuration goreleaser pour arm64
ci: diviser les tâches de test unitaire et E2E
revert: annuler la refonte du sélecteur de modèle
feat(cli)!: changer le chemin de configuration par défaut
Commandes
Configuration
# Confirmer que l'issue est approuvé avant de commencer
gh issue view <N> --repo Gentleman-Programming/gentle-ai
# Créer une branche
git checkout main && git pull
git checkout -b fix/<description-courte>
Tests en local
# Tests unitaires
go test ./...
# Format Go
go run ./internal/gofmtcheck
# Tests unitaires — paquet spécifique
go test ./internal/tui/...
# Tests unitaires — verbeux
go test -v ./...
# Tests E2E (Docker doit être en cours d'exécution)
cd e2e && ./docker-test.sh
Ouvrir une PR
gh pr create \
--repo Gentleman-Programming/gentle-ai \
--title "fix(agent): corriger la détection de Claude Code sur Linux" \
--body "$(cat <<'EOF'
## 🔗 Issue lié
Closes #42
## 🏷️ Type de PR
- [x] \`type:bug\` — Correction de bogue (changement non cassant qui résout un problème)
## 📝 Résumé
Corrige la détection du binaire Claude Code qui échoue sur Linux quand HOME n'est pas défini.
## 📂 Modifications
| Fichier / Zone | Quoi de changé |
|-------------|-------------|
| \`internal/agents/claude.go\` | Ajout d'un repli pour la variable d'environnement HOME |
## 🧪 Plan de test
- [x] Tests unitaires réussissent (\`go test ./...\`)
- [x] Tests E2E réussissent (\`cd e2e && ./docker-test.sh\`)
- [x] Testé manuellement en local
## ✅ Liste de vérification du contributeur
- [x] La PR est liée à un issue avec \`status:approved\`
- [x] La PR reste dans 400 lignes modifiées, ou la justification \`size:exception\` et l'autorité de politique vérifiée sont documentées
- [x] La relecture de l'API confirme exactement un label \`type:*\` approprié sur cette PR
- [x] Tests unitaires réussissent (\`go test ./...\`)
- [x] Tests E2E réussissent (\`cd e2e && ./docker-test.sh\`)
- [x] J'ai mis à jour la documentation si nécessaire
- [x] Mes commits suivent le format Conventional Commits
- [x] Mes commits n'incluent pas de mentions \`Co-Authored-By\`
EOF
)"
Vérifier l'état de la PR
gh pr checks --repo Gentleman-Programming/gentle-ai <numéro-PR>
gh pr view --repo Gentleman-Programming/gentle-ai <numéro-PR>