[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSVB1NHGN4G8Z51FW73J71":3,"skill-same:01M6CSVB1NHGN4G8Z51FW73J71":84},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":27,"linkOnly":28,"markdownContent":29,"markdownBody":30,"frontMatter":31,"refName":25,"commitSha":45,"skillDirectory":46,"forksCount":14,"repositoryHtmlUrl":47,"repositoryHomepageUrl":48,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":50,"updatedAt":51,"install":52,"resources":64},"01M6CSVB1NHGN4G8Z51FW73J71","devops:release-report",null,"Génère un rapport HTML d'analyse d'impact entre deux branches","atournayre\u002Fclaude-personas","atournayre","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F4262077?v=4","01M6CSSGYW0E0D0M3E2T6J9X2Z","Aurélien Tournayre","01M6CSSH3DENJF2XWZ41H0F43K",0,"MIT","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fdevops\u002Fskills\u002Frelease-report\u002FSKILL.md",[],[19,20,21,22,23,24,25,26],"report","release","devops","devops:release report","develop","html","main","branches","2026-11-10 10:12:30",false,"---\nname: devops:release-report\ndescription: Génère un rapport HTML d'analyse d'impact entre deux branches\nargument-hint: \u003Cbranche-source> \u003Cbranche-cible> [nom-release]\nversion: 1.0.0\nlicense: MIT\narguments:\n  - name: branche-source\n    description: Branche source à analyser (ex release\u002Fv27.0.0)\n    required: true\n  - name: branche-cible\n    description: Branche de référence (ex main ou develop)\n    required: true\n  - name: nom-release\n    description: Nom de la release pour le fichier (optionnel)\n    required: false\n---\n\n# Générer rapport d'analyse de release\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\nGénère un rapport HTML détaillé comparant deux branches pour analyser l'impact d'une release.\n\n## Usage\n\n```bash\n\u002Fdevops:release-report \u003Cbranche-source> \u003Cbranche-cible> [nom-release]\n```\n\n**Exemples :**\n- `\u002Fdevops:release-report release\u002Fv27.0.0 main`\n- `\u002Fdevops:release-report release\u002Fv27.0.0 develop v27.0.0`\n- `\u002Fdevops:release-report feature\u002Fnew-module main \"Module XYZ\"`\n\n## Description\n\nCette commande génère un rapport HTML orienté Product Owner qui analyse :\n\n1. **Statistiques globales** : fichiers modifiés, lignes ajoutées\u002Fsupprimées, commits\n2. **Répartition par type de fichier** : PHP, Twig, JS, etc.\n3. **Fonctionnalités principales** : extraction depuis les commits\n4. **Impact métier** : par domaine fonctionnel\n5. **Qualité & maintenabilité** : évolution du code\n\nLe rapport est généré dans `REPORT_PATH\u002Fimpact_\u003Cnom-release>.html`\n\n## Variables\n\nREPORT_PATH: `.claude\u002Freports`\n\nVariables à extraire des arguments :\n\n- `$BRANCH_SOURCE` : Branche source à analyser (ex: release\u002Fv27.0.0)\n- `$BRANCH_TARGET` : Branche de référence (ex: main ou develop)\n- `$RELEASE_NAME` : Nom de la release pour le fichier (ex: v27.0.0)\n\nSi `$RELEASE_NAME` n'est pas fourni, utiliser le nom de `$BRANCH_SOURCE` en retirant le préfixe \"release\u002F\"\n\n## Workflow\n\n### 0. Vérification des arguments obligatoires\n\n**AVANT TOUTE EXÉCUTION**, vérifier que les arguments obligatoires sont fournis :\n\n1. Si `$BRANCH_SOURCE` est manquant :\n   - Utiliser `AskUserQuestion` pour demander la branche source\n\n2. Si `$BRANCH_TARGET` est manquant :\n   - Utiliser `AskUserQuestion` pour demander la branche cible\n   - Options suggérées : `main`, `develop`, `master`\n\n### 1. Validation des paramètres\n\n```bash\n# Vérifier que les branches existent\ngit rev-parse --verify $BRANCH_SOURCE\ngit rev-parse --verify $BRANCH_TARGET\n\n# Vérifier qu'il y a des différences\nDIFF_COUNT=$(git rev-list --count $BRANCH_TARGET..$BRANCH_SOURCE)\nif [ $DIFF_COUNT -eq 0 ]; then\n    echo \"Aucune différence entre les branches\"\n    exit 1\nfi\n```\n\n### 2. Collecte des statistiques git\n\nExécuter en parallèle :\n\n```bash\n# Statistiques globales\ngit diff --stat $BRANCH_TARGET..$BRANCH_SOURCE | tail -1\n\n# Nombre total de fichiers modifiés et détails lignes\ngit diff --numstat $BRANCH_TARGET..$BRANCH_SOURCE | \\\n  awk '{files++; added+=$1; deleted+=$2} END {print files, added, deleted}'\n\n# Répartition par type de fichier\ngit diff --numstat $BRANCH_TARGET..$BRANCH_SOURCE | python3 -c \"\nimport sys\nfrom collections import defaultdict\nstats = defaultdict(lambda: {'count': 0, 'added': 0, 'deleted': 0})\nfor line in sys.stdin:\n    parts = line.strip().split('\\t')\n    if len(parts) \u003C 3:\n        continue\n    added = int(parts[0]) if parts[0] != '-' else 0\n    deleted = int(parts[1]) if parts[1] != '-' else 0\n    path = parts[2]\n    ext = 'autre'\n    if path.endswith('.php'): ext = 'php'\n    elif path.endswith('.twig'): ext = 'twig'\n    elif path.endswith(('.yml', '.yaml')): ext = 'yaml'\n    elif path.endswith('.js'): ext = 'js'\n    elif path.endswith('.scss'): ext = 'scss'\n    elif path.endswith('.md'): ext = 'md'\n    elif path.endswith('.json'): ext = 'json'\n    elif path.endswith('.sh'): ext = 'sh'\n    stats[ext]['count'] += 1\n    stats[ext]['added'] += added\n    stats[ext]['deleted'] += deleted\n    stats[ext]['total'] = stats[ext]['added'] + stats[ext]['deleted']\nfor ext in sorted(stats.items(), key=lambda x: x[1]['total'], reverse=True):\n    name = ext[0]\n    data = ext[1]\n    print(f'{name}|{data[\\\"count\\\"]}|{data[\\\"added\\\"]}|{data[\\\"deleted\\\"]}|{data[\\\"total\\\"]}')\n\"\n\n# Types de modifications (A\u002FM\u002FD\u002FR)\ngit diff --name-status $BRANCH_TARGET..$BRANCH_SOURCE | cut -f1 | sort | uniq -c\n\n# Nombre de commits\ngit rev-list --count $BRANCH_TARGET..$BRANCH_SOURCE\n\n# Top commits avec features\u002Ffixes\ngit log $BRANCH_TARGET..$BRANCH_SOURCE --oneline --no-merges | \\\n  grep -E \"(feat|feature|fix|refactor)\" | head -50\n```\n\n### 3. Analyse des domaines fonctionnels\n\nAnalyser les commits pour identifier les domaines principaux impactés :\n\n- Grouper par préfixe de commit\n- Identifier les patterns récurrents\n- Extraire les fonctionnalités majeures avec leur impact\n\n### 4. Génération du rapport HTML\n\n**Structure du rapport :**\n\n1. **Header** avec executive summary\n   - Nom de la release, résumé en 2-3 phrases, chiffres clés\n\n2. **KPI Grid** (4 indicateurs visuels)\n   - % du code modifié, nombre de commits, variation nette, domaine principal\n\n3. **Fonctionnalités principales** (cards avec impact)\n   - Impact Très élevé (rouge), Élevé (orange), Moyen (jaune), Faible (vert)\n\n4. **Corrections majeures** - Liste des bugs corrigés\n\n5. **Qualité & Maintenabilité** - Code simplifié, documentation, refactoring\n\n6. **Vue d'ensemble technique** - Chart bars par type de fichier\n\n7. **Impact business** - Gestion administrative, communication, performance, sécurité\n\n**Style CSS :**\n- Gradient violet (#667eea -> #764ba2)\n- Cards avec border-left coloré selon impact\n- Progress bars animées\n- Design responsive\n\n### 5. Sauvegarde du fichier\n\n```bash\nOUTPUT_FILE=\"REPORT_PATH\u002Fimpact_${RELEASE_NAME}.html\"\nmkdir -p REPORT_PATH\necho \"Rapport généré : $OUTPUT_FILE\"\n```\n\n## Format de sortie\n\nLe rapport doit être :\n- **Orienté Product Owner** : focus sur l'impact métier\n- **Visuel** : KPI, charts, couleurs par niveau d'impact\n- **Actionnable** : lister features, bugs corrigés, améliorations\n- **Comparable** : même structure pour toutes les releases\n\n## Règles importantes\n\n1. **NE PAS** utiliser de termes techniques obscurs\n2. **TOUJOURS** expliquer l'impact utilisateur\n3. **GROUPER** les changements par domaine fonctionnel\n4. **QUANTIFIER** l'impact (%, nombre, ratio)\n5. **PRIORISER** par impact métier (Très élevé -> Faible)\n\n## Notes\n\n- Le rapport est auto-suffisant (HTML avec CSS inline)\n- Compatible tous navigateurs modernes\n- Peut être imprimé ou converti en PDF\n","# Générer rapport d'analyse de release\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\nGénère un rapport HTML détaillé comparant deux branches pour analyser l'impact d'une release.\n\n## Usage\n\n```bash\n\u002Fdevops:release-report \u003Cbranche-source> \u003Cbranche-cible> [nom-release]\n```\n\n**Exemples :**\n- `\u002Fdevops:release-report release\u002Fv27.0.0 main`\n- `\u002Fdevops:release-report release\u002Fv27.0.0 develop v27.0.0`\n- `\u002Fdevops:release-report feature\u002Fnew-module main \"Module XYZ\"`\n\n## Description\n\nCette commande génère un rapport HTML orienté Product Owner qui analyse :\n\n1. **Statistiques globales** : fichiers modifiés, lignes ajoutées\u002Fsupprimées, commits\n2. **Répartition par type de fichier** : PHP, Twig, JS, etc.\n3. **Fonctionnalités principales** : extraction depuis les commits\n4. **Impact métier** : par domaine fonctionnel\n5. **Qualité & maintenabilité** : évolution du code\n\nLe rapport est généré dans `REPORT_PATH\u002Fimpact_\u003Cnom-release>.html`\n\n## Variables\n\nREPORT_PATH: `.claude\u002Freports`\n\nVariables à extraire des arguments :\n\n- `$BRANCH_SOURCE` : Branche source à analyser (ex: release\u002Fv27.0.0)\n- `$BRANCH_TARGET` : Branche de référence (ex: main ou develop)\n- `$RELEASE_NAME` : Nom de la release pour le fichier (ex: v27.0.0)\n\nSi `$RELEASE_NAME` n'est pas fourni, utiliser le nom de `$BRANCH_SOURCE` en retirant le préfixe \"release\u002F\"\n\n## Workflow\n\n### 0. Vérification des arguments obligatoires\n\n**AVANT TOUTE EXÉCUTION**, vérifier que les arguments obligatoires sont fournis :\n\n1. Si `$BRANCH_SOURCE` est manquant :\n   - Utiliser `AskUserQuestion` pour demander la branche source\n\n2. Si `$BRANCH_TARGET` est manquant :\n   - Utiliser `AskUserQuestion` pour demander la branche cible\n   - Options suggérées : `main`, `develop`, `master`\n\n### 1. Validation des paramètres\n\n```bash\n# Vérifier que les branches existent\ngit rev-parse --verify $BRANCH_SOURCE\ngit rev-parse --verify $BRANCH_TARGET\n\n# Vérifier qu'il y a des différences\nDIFF_COUNT=$(git rev-list --count $BRANCH_TARGET..$BRANCH_SOURCE)\nif [ $DIFF_COUNT -eq 0 ]; then\n    echo \"Aucune différence entre les branches\"\n    exit 1\nfi\n```\n\n### 2. Collecte des statistiques git\n\nExécuter en parallèle :\n\n```bash\n# Statistiques globales\ngit diff --stat $BRANCH_TARGET..$BRANCH_SOURCE | tail -1\n\n# Nombre total de fichiers modifiés et détails lignes\ngit diff --numstat $BRANCH_TARGET..$BRANCH_SOURCE | \\\n  awk '{files++; added+=$1; deleted+=$2} END {print files, added, deleted}'\n\n# Répartition par type de fichier\ngit diff --numstat $BRANCH_TARGET..$BRANCH_SOURCE | python3 -c \"\nimport sys\nfrom collections import defaultdict\nstats = defaultdict(lambda: {'count': 0, 'added': 0, 'deleted': 0})\nfor line in sys.stdin:\n    parts = line.strip().split('\\t')\n    if len(parts) \u003C 3:\n        continue\n    added = int(parts[0]) if parts[0] != '-' else 0\n    deleted = int(parts[1]) if parts[1] != '-' else 0\n    path = parts[2]\n    ext = 'autre'\n    if path.endswith('.php'): ext = 'php'\n    elif path.endswith('.twig'): ext = 'twig'\n    elif path.endswith(('.yml', '.yaml')): ext = 'yaml'\n    elif path.endswith('.js'): ext = 'js'\n    elif path.endswith('.scss'): ext = 'scss'\n    elif path.endswith('.md'): ext = 'md'\n    elif path.endswith('.json'): ext = 'json'\n    elif path.endswith('.sh'): ext = 'sh'\n    stats[ext]['count'] += 1\n    stats[ext]['added'] += added\n    stats[ext]['deleted'] += deleted\n    stats[ext]['total'] = stats[ext]['added'] + stats[ext]['deleted']\nfor ext in sorted(stats.items(), key=lambda x: x[1]['total'], reverse=True):\n    name = ext[0]\n    data = ext[1]\n    print(f'{name}|{data[\\\"count\\\"]}|{data[\\\"added\\\"]}|{data[\\\"deleted\\\"]}|{data[\\\"total\\\"]}')\n\"\n\n# Types de modifications (A\u002FM\u002FD\u002FR)\ngit diff --name-status $BRANCH_TARGET..$BRANCH_SOURCE | cut -f1 | sort | uniq -c\n\n# Nombre de commits\ngit rev-list --count $BRANCH_TARGET..$BRANCH_SOURCE\n\n# Top commits avec features\u002Ffixes\ngit log $BRANCH_TARGET..$BRANCH_SOURCE --oneline --no-merges | \\\n  grep -E \"(feat|feature|fix|refactor)\" | head -50\n```\n\n### 3. Analyse des domaines fonctionnels\n\nAnalyser les commits pour identifier les domaines principaux impactés :\n\n- Grouper par préfixe de commit\n- Identifier les patterns récurrents\n- Extraire les fonctionnalités majeures avec leur impact\n\n### 4. Génération du rapport HTML\n\n**Structure du rapport :**\n\n1. **Header** avec executive summary\n   - Nom de la release, résumé en 2-3 phrases, chiffres clés\n\n2. **KPI Grid** (4 indicateurs visuels)\n   - % du code modifié, nombre de commits, variation nette, domaine principal\n\n3. **Fonctionnalités principales** (cards avec impact)\n   - Impact Très élevé (rouge), Élevé (orange), Moyen (jaune), Faible (vert)\n\n4. **Corrections majeures** - Liste des bugs corrigés\n\n5. **Qualité & Maintenabilité** - Code simplifié, documentation, refactoring\n\n6. **Vue d'ensemble technique** - Chart bars par type de fichier\n\n7. **Impact business** - Gestion administrative, communication, performance, sécurité\n\n**Style CSS :**\n- Gradient violet (#667eea -> #764ba2)\n- Cards avec border-left coloré selon impact\n- Progress bars animées\n- Design responsive\n\n### 5. Sauvegarde du fichier\n\n```bash\nOUTPUT_FILE=\"REPORT_PATH\u002Fimpact_${RELEASE_NAME}.html\"\nmkdir -p REPORT_PATH\necho \"Rapport généré : $OUTPUT_FILE\"\n```\n\n## Format de sortie\n\nLe rapport doit être :\n- **Orienté Product Owner** : focus sur l'impact métier\n- **Visuel** : KPI, charts, couleurs par niveau d'impact\n- **Actionnable** : lister features, bugs corrigés, améliorations\n- **Comparable** : même structure pour toutes les releases\n\n## Règles importantes\n\n1. **NE PAS** utiliser de termes techniques obscurs\n2. **TOUJOURS** expliquer l'impact utilisateur\n3. **GROUPER** les changements par domaine fonctionnel\n4. **QUANTIFIER** l'impact (%, nombre, ratio)\n5. **PRIORISER** par impact métier (Très élevé -> Faible)\n\n## Notes\n\n- Le rapport est auto-suffisant (HTML avec CSS inline)\n- Compatible tous navigateurs modernes\n- Peut être imprimé ou converti en PDF\n",{"name":5,"license":15,"version":32,"arguments":33,"description":7,"argument-hint":44},"1.0.0",[34,38,41],{"name":35,"required":36,"description":37},"branche-source",true,"Branche source à analyser (ex release\u002Fv27.0.0)",{"name":39,"required":36,"description":40},"branche-cible","Branche de référence (ex main ou develop)",{"name":42,"required":28,"description":43},"nom-release","Nom de la release pour le fichier (optionnel)","\u003Cbranche-source> \u003Cbranche-cible> [nom-release]","bb0335112ea0991dc1dc6a29fa5a861397a5a6f6","devops\u002Fskills\u002Frelease-report","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas","https:\u002F\u002Fatournayre.github.io\u002Fclaude-personas\u002F","https:\u002F\u002Fgithub.com\u002Fatournayre","🔵, Back End Developer, @symfony  :heart:, @rectorphp :heart:,  \r\n:bug: fixer (creator sometimes 🤫), member of @afup","2026-03-02 23:42:20",{"source":8,"skillName":5,"commands":53,"prompt":63,"zipAvailable":36},[54,57,60],{"tool":55,"command":56},"npx","npx skills add atournayre\u002Fclaude-personas --skill \"devops:release-report\"",{"tool":58,"command":59},"bunx","bunx skills add atournayre\u002Fclaude-personas --skill \"devops:release-report\"",{"tool":61,"command":62},"pnpm","pnpm dlx skills add atournayre\u002Fclaude-personas --skill \"devops:release-report\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fdevops\u002Fskills\u002Frelease-report\u002FSKILL.md",[65,70,76,80],{"path":66,"resourceType":66,"resourceTypeDesc":67,"sizeBytes":68,"sourceHtmlUrl":69},"LICENSE","许可证",1065,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-sentry-quota\u002FLICENSE",{"path":71,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":74,"sourceHtmlUrl":75},"repos\u002Fmetamask-extension.md","REFERENCE","参考文档",3484,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-sentry-quota\u002Frepos\u002Fmetamask-extension.md",{"path":77,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":78,"sourceHtmlUrl":79},"SOURCE.md",369,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-sentry-quota\u002FSOURCE.md",{"path":81,"resourceType":72,"resourceTypeDesc":73,"sizeBytes":82,"sourceHtmlUrl":83},"TRUST.auto.yaml",2197,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-sentry-quota\u002FTRUST.auto.yaml",[85,102,142,149,157,168],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":27},"01M6CSZPR0W1K1S9BX3247CZJ1","twig:make-component","Génère un Twig Component Symfony UX (classe PHP + template Twig)","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Ftwig\u002Fskills\u002Fmake-component\u002FSKILL.md",[],[92,93,94,95,96,97,98,99,100,101],"twig:make component","component","read","edit","write","ux","grep","template","php","Bash",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":124,"publishedAt":27},"01M6CSZKCYYT4EAW4CDSTS3TSH","tester:ui-test","Teste automatiquement une interface utilisateur dans Chrome : navigation, clics, validation visuelle, tests fonctionnels, responsive, comportement et debug. Génère un rapport détaillé avec screenshots et optionnellement un GIF du parcours.","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Ftester\u002Fskills\u002Fui-test\u002FSKILL.md",[108,113,116,119],{"categoryNo":109,"categoryName":110,"taxonomyType":111,"taxonomyTypeDesc":112},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":114,"categoryName":115,"taxonomyType":111,"taxonomyTypeDesc":112},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":117,"categoryName":118,"taxonomyType":111,"taxonomyTypeDesc":112},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":120,"categoryName":121,"taxonomyType":122,"taxonomyTypeDesc":123},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[125,126,127,128,129,130,131,132,133,134,135,101,136,137,138,139,94,96,140,141],"test","ui","tester","ui test","tester:ui test","MCP","debug","create","update","validation","messages","plan","tool","page","find","javascript","chrome",{"skillNo":143,"name":144,"nameZh":6,"description":145,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":146,"categories":147,"keywords":148,"publishedAt":27},"01M6CSZGQ8X9XNXRBYX0AA3CYE","symfony:voter","Genere un Voter de securite Symfony pour le controle d'acces granulaire","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fvoter\u002FSKILL.md",[],[144,101,98,94,96,95],{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":27},"01M6CSZEJ3BNHCNZT18SYFGDME","symfony:message","Genere un Message Symfony Messenger avec son Handler pour traitement asynchrone","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fmessage\u002FSKILL.md",[],[151,156,101,98,94,96,95],"message",{"skillNo":158,"name":159,"nameZh":6,"description":160,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":161,"categories":162,"keywords":166,"publishedAt":27},"01M6CSZBWSK9M6YMJX886BVWYF","symfony:mailer","Genere un email Symfony (TemplatedEmail ou Notification) avec template Twig","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fmailer\u002FSKILL.md",[163],{"categoryNo":164,"categoryName":165,"taxonomyType":111,"taxonomyTypeDesc":112},"01JBSEEDCAT000000000000005","邮件与沟通",[159,95,167,101,99,98,94,96],"email",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":174,"publishedAt":27},"01M6CSZ9DXMYZ9HTRE8A324AWG","symfony:form","Genere un FormType Symfony avec contraintes de validation et options","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fform\u002FSKILL.md",[],[170,101,98,94,96,95,175,134],"options"]