From aa9c67f533a4cfe4b305160f69be26bd5bb35f91 Mon Sep 17 00:00:00 2001 From: Zhongwei Li Date: Sat, 29 Nov 2025 17:58:57 +0800 Subject: [PATCH] Initial commit --- .claude-plugin/plugin.json | 15 ++ README.md | 3 + commands/fix.md | 98 ++++++++ commands/impact.md | 6 + plugin.lock.json | 57 +++++ skills/github-impact/README.md | 50 ++++ skills/github-impact/SKILL.md | 443 +++++++++++++++++++++++++++++++++ 7 files changed, 672 insertions(+) create mode 100644 .claude-plugin/plugin.json create mode 100644 README.md create mode 100644 commands/fix.md create mode 100644 commands/impact.md create mode 100644 plugin.lock.json create mode 100644 skills/github-impact/README.md create mode 100644 skills/github-impact/SKILL.md diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json new file mode 100644 index 0000000..1a1ba17 --- /dev/null +++ b/.claude-plugin/plugin.json @@ -0,0 +1,15 @@ +{ + "name": "github", + "description": "Gestion GitHub : issues, PR, analyse d'impact avec skills spécialisés", + "version": "1.1.0", + "author": { + "name": "Aurélien Tournayre", + "email": "aurelien.tournayre@gmail.com" + }, + "skills": [ + "./skills" + ], + "commands": [ + "./commands" + ] +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..8ca1150 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# github + +Gestion GitHub : issues, PR, analyse d'impact avec skills spécialisés diff --git a/commands/fix.md b/commands/fix.md new file mode 100644 index 0000000..1a60bba --- /dev/null +++ b/commands/fix.md @@ -0,0 +1,98 @@ +--- +model: claude-sonnet-4-5-20250929 +allowed-tools: [Bash, Read, Write, Edit, Grep, Glob, Task] +description: "Corriger une issue GitHub avec workflow simplifié et efficace" +argument-hint: "[issue-number]" +--- + +# Correction d'Issue GitHub + +## Purpose +Corriger une issue GitHub de manière structurée et efficace, en se concentrant sur l'essentiel. + +## Variables +ISSUE_NUMBER: $1 (obligatoire) + +## Instructions +- Utilise les outils Bash pour les opérations Git et GitHub CLI +- Focus sur la résolution rapide et efficace du problème +- Applique les standards du projet NEO + +## Relevant Files +- Issues GitHub du repository +- Code source pertinent selon l'issue +- Documentation technique si nécessaire + +## Workflow + +### 1. Analyse de l'issue +- Récupérer les détails de l'issue via `gh issue view $ISSUE_NUMBER` +- Analyser le problème : type (bug, feature, enhancement), priorité, description +- Identifier les fichiers/modules concernés +- Vérifier les éventuels liens Sentry pour plus de contexte + +### 2. Préparation de l'environnement +- Vérifier le statut git actuel +- S'assurer d'être sur la bonne branche de base (develop/main) +- Créer une branche de travail : `issue/$ISSUE_NUMBER-{description-courte}` +- Exemple : `issue/966-stockage-epuration-historique` + +### 3. Investigation du code +- Localiser les fichiers concernés par l'issue +- Comprendre le code existant et identifier la cause du problème +- Analyser l'impact de la modification sur les autres parties du système +- Identifier les dépendances et side-effects potentiels + +### 4. Implémentation de la solution +- Implémenter la correction en respectant : + - Standards PHP 8.2+ avec typage strict + - Conditions Yoda (`null === $value`) + - Documentation des exceptions avec `@throws` + - Conventions de nommage françaises +- Éviter les changements inutiles ou trop larges +- Maintenir la cohérence avec l'architecture existante + +### 5. Validation et tests +- Exécuter les tests existants : `make run-unit-php` +- Ajouter des tests si nécessaire pour couvrir le nouveau code +- Vérifier avec PHPStan : ZÉRO erreur acceptée +- Tester la solution manuellement si applicable + +### 6. Finalisation +- Informer l'utilisateur +- Ne pas faire de commit + +## Report +- Issue analysée avec titre et type +- Branche créée avec nom approprié +- Fichiers modifiés avec résumé des changements +- Tests exécutés avec résultats + +## Validation +- ✅ `ISSUE_NUMBER` doit être fourni et exister sur GitHub +- ✅ Branche de travail créée avec convention de nommage +- ✅ Solution implémentée respectant les standards +- ✅ PHPStan passe sans erreur (CRITIQUE) +- ✅ Tests unitaires passent + +## Expertise +Standards de qualité NEO : +- PHP 8.2+ avec typage strict obligatoire +- Conditions Yoda pour toutes les comparaisons +- Exceptions documentées avec `@throws` +- Nommage en français pour les concepts métier +- PHPStan niveau 9 sans erreur +- Tests unitaires pour nouveau code + +## Examples +```bash +# Correction d'un bug +/github:fix 966 + +# Résultat attendu : +# 1. Analyse issue #966 "STOCKAGE - Épuration historique" +# 2. Création branche : issue/966-stockage-epuration-historique +# 3. Investigation du code de gestion des devis/alertes +# 4. Implémentation de l'épuration automatique +# 5. Tests et validation PHPStan +``` diff --git a/commands/impact.md b/commands/impact.md new file mode 100644 index 0000000..d160345 --- /dev/null +++ b/commands/impact.md @@ -0,0 +1,6 @@ +--- +description: Analyses le détail des modifications git. Fournis 2 rapports d'impact - un rapport métier et un rapport technique. Ajoutes ce rapport à la description de la PR. +argument-hint: +--- + +You must use the Skill tool to invoke the "github-impact" skill with the following arguments. diff --git a/plugin.lock.json b/plugin.lock.json new file mode 100644 index 0000000..906d1c2 --- /dev/null +++ b/plugin.lock.json @@ -0,0 +1,57 @@ +{ + "$schema": "internal://schemas/plugin.lock.v1.json", + "pluginId": "gh:atournayre/claude-marketplace:github", + "normalized": { + "repo": null, + "ref": "refs/tags/v20251128.0", + "commit": "16f6c7c57563658e5638bb836807b6c9332b5538", + "treeHash": "0e55622b41e944063011166167336b27bf8f55a7e8a0c882e4dbabaa5581039e", + "generatedAt": "2025-11-28T10:13:59.988471Z", + "toolVersion": "publish_plugins.py@0.2.0" + }, + "origin": { + "remote": "git@github.com:zhongweili/42plugin-data.git", + "branch": "master", + "commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390", + "repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data" + }, + "manifest": { + "name": "github", + "description": "Gestion GitHub : issues, PR, analyse d'impact avec skills spécialisés", + "version": "1.1.0" + }, + "content": { + "files": [ + { + "path": "README.md", + "sha256": "6957f587f81b1909d110917b387442f1294ef7a0231d895699be4c649e37bdb0" + }, + { + "path": ".claude-plugin/plugin.json", + "sha256": "9f1ca9f04843ecfd8901a30c432e6487d529f2c154a3e47dd47136da963b5924" + }, + { + "path": "commands/fix.md", + "sha256": "ff1004a5ac9681416a48af03a3c616c2a4e57eb54ca510fe3ffa3136594c7145" + }, + { + "path": "commands/impact.md", + "sha256": "4644d3dd63e7c46af7eb0b77960501266de2bb2400027602ed95398dd1d3ff97" + }, + { + "path": "skills/github-impact/README.md", + "sha256": "ec5e61bf492f86fe24a4ba94807ecb526c60bbe61f09ef63574b025bf2dc0885" + }, + { + "path": "skills/github-impact/SKILL.md", + "sha256": "606d49c8cfbca3d6de77377efc3775eb4e8a34758c52afaee18537deb2e281d8" + } + ], + "dirSha256": "0e55622b41e944063011166167336b27bf8f55a7e8a0c882e4dbabaa5581039e" + }, + "security": { + "scannedAt": null, + "scannerVersion": null, + "flags": [] + } +} \ No newline at end of file diff --git a/skills/github-impact/README.md b/skills/github-impact/README.md new file mode 100644 index 0000000..99bc510 --- /dev/null +++ b/skills/github-impact/README.md @@ -0,0 +1,50 @@ +# GitHub Impact Analysis Skill + +Génère automatiquement deux rapports d'impact (métier et technique) pour une PR GitHub et les intègre dans la description. + +## Fonctionnalités + +- Analyse complète des modifications PR +- Détection automatique des dépendances (PHP, JS, templates) +- Analyse de couverture de tests +- Génération de 2 rapports distincts (métier + technique) +- Intégration automatique dans la description PR +- Sauvegarde locale pour référence + +## Usage + +Via la commande délégante : +```bash +/github:impact +``` + +Ou directement via le skill : +```bash +# Utiliser l'outil Task avec le skill github-impact +``` + +## Rapports générés + +### Rapport Métier +- Vue d'ensemble des changements fonctionnels +- Impact utilisateur +- Risques identifiés +- Recommandations déploiement + +### Rapport Technique +- Métriques détaillées (fichiers, lignes, commits) +- Analyse par type de fichier +- Changements architecturaux +- Analyse de sécurité +- Couverture de tests + +## Fichiers générés + +- `.analysis-reports/impact_pr_.md` - Rapports combinés +- Description PR mise à jour avec marqueurs `` + +## Dépendances + +- `gh` CLI configuré et authentifié +- Accès en lecture à la PR +- Accès en écriture pour mise à jour description diff --git a/skills/github-impact/SKILL.md b/skills/github-impact/SKILL.md new file mode 100644 index 0000000..5e09b0b --- /dev/null +++ b/skills/github-impact/SKILL.md @@ -0,0 +1,443 @@ +--- +name: github-impact +description: > + Génère automatiquement deux rapports d'impact (métier et technique) pour une PR GitHub + et les intègre dans la description. Analyse les modifications, dépendances, tests, + sécurité et performance. +allowed-tools: [Bash, Read, Write, TodoWrite, Grep, Glob] +model: claude-opus-4-1-20250805 +--- + +# GitHub PR Impact Analysis Skill + +## Variables + +```bash +ARGUMENTS="$ARGUMENTS" # Numéro de PR passé en argument +PR_NUMBER="" +CURRENT_BRANCH="" +BASE_BRANCH="" +MODIFIED_FILES="" +COMMIT_COUNT="" +``` + +## Workflow + +### Étape 0: Timing +```bash +START_TIME=$(date +%s) +date +``` + +### Étape 1: Parsing Arguments + +```bash +PR_NUMBER="$ARGUMENTS" + +# Validation +if [ -z "$PR_NUMBER" ]; then + echo "❌ ERREUR: Numéro de PR requis" + echo "Usage: /github:impact " + exit 1 +fi +``` + +### Étape 2: TodoWrite Initialisation + +```yaml +todos: + - content: "Récupérer informations PR" + status: "pending" + activeForm: "Récupération des informations PR" + - content: "Identifier fichiers modifiés" + status: "pending" + activeForm: "Identification des fichiers modifiés" + - content: "Analyser dépendances et templates" + status: "pending" + activeForm: "Analyse des dépendances et templates" + - content: "Analyser tests" + status: "pending" + activeForm: "Analyse des tests" + - content: "Générer rapport métier" + status: "pending" + activeForm: "Génération du rapport métier" + - content: "Générer rapport technique" + status: "pending" + activeForm: "Génération du rapport technique" + - content: "Ajouter rapports à la PR" + status: "pending" + activeForm: "Ajout des rapports à la PR" + - content: "Sauvegarder localement" + status: "pending" + activeForm: "Sauvegarde locale" +``` + +### Étape 3: Récupération Informations PR + +Marquer todo #1 `in_progress`. + +```bash +# Récupérer infos PR +gh pr view $PR_NUMBER --json number,headRefName,baseRefName,state,title + +# Extraire branches +CURRENT_BRANCH=$(gh pr view $PR_NUMBER --json headRefName -q .headRefName) +BASE_BRANCH=$(gh pr view $PR_NUMBER --json baseRefName -q .baseRefName) + +# Vérifier existence +if [ -z "$CURRENT_BRANCH" ]; then + echo "❌ ERREUR: PR #$PR_NUMBER introuvable" + exit 1 +fi + +echo "✅ Analyse de la PR #$PR_NUMBER" +echo " Branche: $CURRENT_BRANCH → $BASE_BRANCH" +``` + +Marquer todo #1 `completed`. + +### Étape 4: Identification Modifications + +Marquer todo #2 `in_progress`. + +```bash +# Récupérer diff PR +gh pr diff $PR_NUMBER --name-status +gh pr diff $PR_NUMBER --stat + +# Liste fichiers modifiés +MODIFIED_FILES=$(gh pr diff $PR_NUMBER --name-only) + +# Compter commits +COMMIT_COUNT=$(gh pr view $PR_NUMBER --json commits -q '.commits | length') + +echo "📊 Statistiques PR #$PR_NUMBER:" +echo " - Fichiers modifiés: $(echo "$MODIFIED_FILES" | wc -l)" +echo " - Commits: $COMMIT_COUNT" +``` + +Marquer todo #2 `completed`. + +### Étape 5: Analyse Dépendances et Templates + +Marquer todo #3 `in_progress`. + +```bash +FILES=$(gh pr diff $PR_NUMBER --name-only) + +# PHP dependencies +echo "$FILES" | grep "\.php$" | while read file; do + grep "use.*;" "$file" 2>/dev/null || true +done + +# JS/TS dependencies +echo "$FILES" | grep -E "\.(js|ts|jsx|tsx)$" | while read file; do + grep -E "import|require" "$file" 2>/dev/null || true +done + +# Templates (Twig, Blade, Vue, etc.) +TEMPLATE_FILES=$(echo "$FILES" | grep -E "\.(twig|blade\.php|vue|svelte|hbs|handlebars|mustache|ejs|pug|jade)$") +if [ -n "$TEMPLATE_FILES" ]; then + echo "📄 Templates modifiés:" + echo "$TEMPLATE_FILES" | while read file; do + echo " - $file" + case "$file" in + *.twig) + grep -E "\{\{|\{%" "$file" 2>/dev/null | head -10 || true + ;; + *.blade.php) + grep -E "@[a-zA-Z]+|\{\{" "$file" 2>/dev/null | head -10 || true + ;; + *.vue) + grep -E "v-|@|:\w+" "$file" 2>/dev/null | head -10 || true + ;; + esac + done +fi + +# Styles +STYLE_FILES=$(echo "$FILES" | grep -E "\.(css|scss|sass|less|styl)$") +if [ -n "$STYLE_FILES" ]; then + echo "🎨 Fichiers styles modifiés:" + echo "$STYLE_FILES" +fi + +# Config +CONFIG_FILES=$(echo "$FILES" | grep -E "\.(json|yaml|yml|env|ini|conf|xml|toml)$") +if [ -n "$CONFIG_FILES" ]; then + echo "⚙️ Fichiers config modifiés:" + echo "$CONFIG_FILES" +fi + +# Assets +ASSET_FILES=$(echo "$FILES" | grep -E "\.(png|jpg|jpeg|gif|svg|ico|woff|woff2|ttf|eot)$") +if [ -n "$ASSET_FILES" ]; then + echo "🖼️ Assets modifiés:" + echo "$ASSET_FILES" +fi +``` + +Marquer todo #3 `completed`. + +### Étape 6: Analyse Tests + +Marquer todo #4 `in_progress`. + +```bash +# Vérifier tests ajoutés/modifiés +gh pr diff $PR_NUMBER --name-only | grep -E "(test|spec)\.(php|js|ts)$" + +# Vérifier couverture +for file in $(gh pr diff $PR_NUMBER --name-only | grep -E "\.(php|js|ts)$"); do + basename=$(basename "$file" | sed 's/\.[^.]*$//') + find tests/ -name "*${basename}*Test*" 2>/dev/null || echo "⚠️ Pas de test pour $file" +done +``` + +Marquer todo #4 `completed`. + +### Étape 7: Génération Rapport Métier + +Marquer todo #5 `in_progress`. + +Créer fichier `/tmp/impact_business_report.md` avec: + +```markdown +## 📊 Rapport d'Impact Métier + +### Vue d'Ensemble +- **Portée**: [N] fichiers sur [N] commits +- **Domaines impactés**: [Liste] +- **Risque estimé**: 🟢/🟡/🔴 + +### Changements Fonctionnels + +#### Nouvelles Fonctionnalités +- [Liste] + +#### Améliorations Interface Utilisateur +- **Templates**: [Pages/composants] +- **Styles**: [Changements visuels] +- **Assets**: [Nouvelles images/icônes] + +#### Améliorations Fonctionnelles +- [Liste] + +#### Corrections +- **Bugs interface**: [Liste] +- **Bugs fonctionnels**: [Liste] + +### Impact Utilisateur +- **UX**: [Changements visibles] +- **Performance**: [Améliorations/dégradations] +- **Compatibilité**: [Breaking changes] + +### Risques Identifiés +1. [Risque + mitigation] +2. [Risque + mitigation] + +### Recommandations +- **Tests recommandés**: [Scénarios] +- **Communication**: [Points à communiquer] +- **Déploiement**: [Stratégie] +``` + +Marquer todo #5 `completed`. + +### Étape 8: Génération Rapport Technique + +Marquer todo #6 `in_progress`. + +Créer fichier `/tmp/impact_technical_report.md` avec: + +```markdown +## 🔧 Rapport d'Impact Technique + +### Métriques +- Fichiers: [N] +- Ajouts: +[N] +- Suppressions: -[N] +- Commits: [N] + +### Analyse par Type + +| Type | Fichiers | Ajouts | Suppressions | Impact Métier | Impact Technique | +|-----------|----------|--------|--------------|---------------|------------------| +| PHP | [N] | +[N] | -[N] | Backend | [Score] | +| JS/TS | [N] | +[N] | -[N] | Interface | [Score] | +| Templates | [N] | +[N] | -[N] | Interface/UX | Moyen | +| CSS/SCSS | [N] | +[N] | -[N] | Apparence | Faible | +| Config | [N] | +[N] | -[N] | Infra | Critique | +| Assets | [N] | +[N] | -[N] | Visuel | Faible | + +### Changements Architecturaux + +#### Classes/Modules Modifiés +- `[Class]`: [Description] + +#### Dépendances +##### Ajoutées +- [Package]: [Version] - [Raison] + +##### Modifiées +- [Package]: [Old] → [New] + +##### Supprimées +- [Package]: [Raison] + +### Analyse Sécurité +- **Vulnérabilités corrigées**: [Liste] +- **Nouveaux vecteurs**: [Analyse] +- **Validations ajoutées**: [Liste] + +### Couverture Tests +- Tests ajoutés: [N] +- Tests modifiés: [N] +- Couverture estimée: [%]% +- Fichiers non testés: [Liste] + +### Points d'Attention + +1. **Performance**: + - [Impact requêtes DB] + - [Impact mémoire] + - [Impact temps réponse] + +2. **Compatibilité**: + - [Breaking changes APIs] + - [Changements schéma DB] + - [Modifications config] + +3. **Dette Technique**: + - [Dette ajoutée] + - [Dette remboursée] + - [Refactoring nécessaire] + +### Checklist Revue +- [ ] Tous fichiers ont tests +- [ ] Standards de code respectés +- [ ] Documentation à jour +- [ ] Migrations DB réversibles +- [ ] Variables env documentées +- [ ] Logs appropriés +- [ ] Gestion erreur complète +``` + +Marquer todo #6 `completed`. + +### Étape 9: Ajout Rapports à PR + +Marquer todo #7 `in_progress`. + +```bash +echo "Mise à jour PR #$PR_NUMBER..." + +# Récupérer description actuelle +gh pr view $PR_NUMBER --json body -q .body > /tmp/pr_current_body.md + +# Vérifier si rapports existent déjà +if grep -q "📊 Rapport d'Impact Métier" /tmp/pr_current_body.md; then + echo "⚠️ Rapports existent, mise à jour..." + sed -i '//,//d' /tmp/pr_current_body.md +fi + +# Créer nouveau contenu +cat /tmp/pr_current_body.md > /tmp/pr_new_body.md +echo "" >> /tmp/pr_new_body.md +echo "" >> /tmp/pr_new_body.md +echo "---" >> /tmp/pr_new_body.md +echo "" >> /tmp/pr_new_body.md +cat /tmp/impact_business_report.md >> /tmp/pr_new_body.md +echo "" >> /tmp/pr_new_body.md +cat /tmp/impact_technical_report.md >> /tmp/pr_new_body.md +echo "" >> /tmp/pr_new_body.md +echo "" >> /tmp/pr_new_body.md + +# Mettre à jour PR +gh pr edit $PR_NUMBER --body-file /tmp/pr_new_body.md + +echo "✅ Rapports ajoutés à PR #$PR_NUMBER" +``` + +Marquer todo #7 `completed`. + +### Étape 10: Sauvegarde Locale + +Marquer todo #8 `in_progress`. + +```bash +mkdir -p .analysis-reports + +# Combiner rapports +cat /tmp/impact_business_report.md > ".analysis-reports/impact_pr_${PR_NUMBER}.md" +echo "" >> ".analysis-reports/impact_pr_${PR_NUMBER}.md" +cat /tmp/impact_technical_report.md >> ".analysis-reports/impact_pr_${PR_NUMBER}.md" + +# Timestamp +echo "" >> ".analysis-reports/impact_pr_${PR_NUMBER}.md" +echo "---" >> ".analysis-reports/impact_pr_${PR_NUMBER}.md" +echo "*Analyse générée le $(date '+%Y-%m-%d à %H:%M:%S')*" >> ".analysis-reports/impact_pr_${PR_NUMBER}.md" + +echo "📁 Rapport sauvegardé: .analysis-reports/impact_pr_${PR_NUMBER}.md" +``` + +Marquer todo #8 `completed`. + +### Étape 11: Rapport Final + +```bash +END_TIME=$(date +%s) +DURATION=$((END_TIME - START_TIME)) + +if [ $DURATION -lt 60 ]; then + DURATION_STR="${DURATION}s" +elif [ $DURATION -lt 3600 ]; then + MINUTES=$((DURATION / 60)) + SECONDS=$((DURATION % 60)) + DURATION_STR="${MINUTES}m ${SECONDS}s" +else + HOURS=$((DURATION / 3600)) + MINUTES=$(((DURATION % 3600) / 60)) + SECONDS=$((DURATION % 60)) + DURATION_STR="${HOURS}h ${MINUTES}m ${SECONDS}s" +fi + +echo "⏱️ Durée: $DURATION_STR" +``` + +```yaml +analysis_completed: true +reports_generated: + - type: "business" + risk_level: "[low|medium|high]" + functional_impacts: [count] + - type: "technical" + files_modified: [count] + lines_changed: [total] + test_coverage: "[%]%" + +pr_update: + status: "success" + pr_number: $PR_NUMBER + +local_save: + path: ".analysis-reports/impact_pr_${PR_NUMBER}.md" + +recommendations: + - category: "testing" + priority: "[high|medium|low]" + - category: "deployment" + strategy: "[description]" +``` + +## Error Handling + +- Template PR absent → ARRÊT (exit 1) +- PR introuvable → ARRÊT (exit 1) +- Échec mise à jour PR → WARNING (non bloquant) + +## Notes + +- Utilise `gh` CLI pour GitHub +- Parser JSON via `jq` ou équivalent +- Marquer CHAQUE todo completed immédiatement après succès