[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSTR8DTN8VHDCTH6NSA7CV":3,"skill-same:01M6CSTR8DTN8VHDCTH6NSA7CV":71},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":13,"repositoryHtmlUrl":26,"repositoryHomepageUrl":27,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6CSTR8DTN8VHDCTH6NSA7CV","branch",null,"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\u002Fbranch\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"---\nname: devops:branch\ndescription: Création de branche Git avec workflow structuré\nmodel: haiku\nallowed-tools: [Bash, Read, AskUserQuestion]\nargument-hint: [source-branch] \u003Cissue-number-or-text>\nversion: 1.0.0\nlicense: MIT\nhooks:\n  PreToolUse:\n    - matcher: \"Bash(git checkout:*)\"\n      hooks:\n        - type: command\n          command: |\n            # Hook 1: Bloquer si modifications non commitées\n            if ! git diff --quiet || ! git diff --cached --quiet; then\n              echo \"ERREUR : Modifications non commitées détectées\"\n              echo \"\"\n              echo \"Fichiers modifiés :\"\n              git status --short\n              echo \"\"\n              echo \"Vous devez commit ou stash avant de créer une branche\"\n              exit 1\n            fi\n          once: true\n  PostToolUse:\n    - matcher: \"Bash(git checkout -b:*)\"\n      hooks:\n        - type: command\n          command: |\n            # Hook 2: Feedback création\n            BRANCH=$(git branch --show-current)\n            echo \"Branche créée : $BRANCH\"\n            echo \"Le tracking sera configuré automatiquement au premier commit\"\n          once: false\n---\n\n# Création de branche Git\n\nCréer une nouvelle branche Git de manière structurée avec support des issues GitHub.\n\n## Configuration\n\n```bash\nCORE_SCRIPTS=\"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\"\n```\n\n## Variables\n- SOURCE_BRANCH: Branche source (optionnel - défaut: MAIN_BRANCH de .env.claude)\n- ISSUE_OR_TEXT: Numéro d'issue GitHub ou texte descriptif\n\n## Relevant Files\n- @.git\u002Fconfig\n- @.gitignore\n- @.env.claude\n- @docs\u002FREADME.md\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n**ÉTAPE CRITIQUE : CHECKOUT VERS SOURCE D'ABORD**\n\n### 1. Lire la configuration depuis .env.claude\n\n- Lis le fichier `.env.claude` à la racine du projet courant\n- Extrais la valeur de `MAIN_BRANCH` (fallback pour SOURCE_BRANCH)\n\n### 2. Parser les arguments et résoudre SOURCE_BRANCH\n\n**Logique de désambiguisation selon le nombre d'arguments :**\n\n**2 arguments fournis :**\n- Premier argument = SOURCE_BRANCH\n- Second argument = ISSUE_OR_TEXT\n\n**1 argument fourni :**\n- Si c'est un entier -> ISSUE_OR_TEXT (numéro d'issue), SOURCE_BRANCH = `MAIN_BRANCH` de .env.claude\n- Si ça correspond à une branche locale existante (`git branch --list \"$ARG\"` non vide) -> SOURCE_BRANCH, ISSUE_OR_TEXT non fourni (sera demandé à l'utilisateur)\n- Sinon -> ISSUE_OR_TEXT (texte descriptif), SOURCE_BRANCH = `MAIN_BRANCH` de .env.claude\n\n**0 argument :**\n- SOURCE_BRANCH = `MAIN_BRANCH` de .env.claude\n- ISSUE_OR_TEXT non fourni (sera demandé à l'utilisateur)\n\n**Si SOURCE_BRANCH n'est toujours pas résolu** :\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Depuis quelle branche veux-tu créer la nouvelle branche ?\"\n  Options: [\"main\", \"master\", \"develop\", \"Autre\"]\n  ```\n\n### 3. Valider que SOURCE_BRANCH existe localement\n\n- Exécute avec Bash :\n  ```bash\n  bash \"$CORE_SCRIPTS\u002Fvalidate-source-branch.sh\" \"$SOURCE_BRANCH\"\n  ```\n- Si le script échoue (exit 1), arrête le workflow\n\n### 4. CHECKOUT VERS SOURCE_BRANCH AVANT TOUT\n\n- Exécute `git checkout $SOURCE_BRANCH` avec Bash\n- Exécute `git branch --show-current` pour vérifier\n- **CRITIQUE** : Cette étape garantit qu'on crée depuis un point propre\n\n### 5. PULL POUR METTRE À JOUR SOURCE_BRANCH\n\n- Exécute `git pull origin $SOURCE_BRANCH` avec Bash\n- **CRITIQUE** : Garantit qu'on part du dernier commit de origin\n\n### 6. Résoudre le nom de la nouvelle branche\n\n**Si ISSUE_OR_TEXT est fourni :**\n\n- Exécute avec Bash :\n  ```bash\n  eval \"$(bash \"$CORE_SCRIPTS\u002Fresolve-branch-name.sh\" \"$ISSUE_OR_TEXT\")\"\n  echo \"BRANCH_NAME=$BRANCH_NAME\"\n  echo \"PREFIX=$PREFIX\"\n  echo \"PREFIX_SOURCE=$PREFIX_SOURCE\"\n  ```\n- Si le script échoue (exit 1), arrête le workflow\n\n**Si ISSUE_OR_TEXT n'est pas fourni :**\n   - Utilise AskUserQuestion pour demander le nom de branche\n\n### 7. Vérifier que la nouvelle branche n'existe pas\n\n- Exécute avec Bash :\n  ```bash\n  bash \"$CORE_SCRIPTS\u002Fcheck-branch-exists.sh\" \"$BRANCH_NAME\"\n  ```\n- Si le script échoue (exit 1), arrête le workflow\n\n### 8. Créer et checkout la nouvelle branche\n\n- Exécute `git checkout -b $BRANCH_NAME` avec Bash\n\n### 9. Afficher le résumé\n\nAffiche :\n```\nBranche créée : $BRANCH_NAME\nPréfixe détecté : $PREFIX (source: $PREFIX_SOURCE)\nDepuis : $SOURCE_BRANCH\n{Si issue} Issue associée : #$ISSUE_NUMBER\n\nLe tracking sera configuré automatiquement au premier commit avec :\n   git push -u origin $BRANCH_NAME\n```\n\n**IMPORTANT - NE PAS configurer de tracking automatiquement :**\n- INTERDIT : `git branch --set-upstream-to=origin\u002F$SOURCE_BRANCH $BRANCH_NAME`\n- Le tracking sera configuré lors du premier push avec `-u`\n\n## Expertise\n\nConventions de nommage des branches (préfixe détecté automatiquement) :\n- `feature\u002F{numéro}-{description}` : Nouvelles fonctionnalités\n- `fix\u002F{numéro}-{description}` : Corrections de bugs\n- `hotfix\u002F{numéro}-{description}` : Corrections urgentes en production\n- `chore\u002F{numéro}-{description}` : Maintenance, refactoring\n- `docs\u002F{numéro}-{description}` : Documentation\n- `test\u002F{numéro}-{description}` : Tests\n\nDétection automatique du préfixe (par priorité) :\n1. Labels de l'issue GitHub\n2. Mots-clés dans la description de l'issue\n3. Mots-clés dans le titre de l'issue\n4. Défaut : `feature\u002F` si aucun indicateur trouvé\n\n## Désambiguisation des arguments\n\nSOURCE_BRANCH est **optionnel** et défaut à `MAIN_BRANCH` de `.env.claude`.\n\n| Argument | Type détecté | SOURCE_BRANCH | ISSUE_OR_TEXT |\n|----------|-------------|---------------|---------------|\n| `42` | Entier | MAIN_BRANCH (.env.claude) | `42` (issue) |\n| `develop` | Branche locale existante | `develop` | Non fourni (demander) |\n| `\"fix login bug\"` | Texte | MAIN_BRANCH (.env.claude) | `\"fix login bug\"` |\n\n## Examples\n\n```bash\n# Créer une branche avec issue (source = MAIN_BRANCH de .env.claude)\n\u002Fdevops:branch 123\n\n# Créer une branche avec texte descriptif (source = MAIN_BRANCH)\n\u002Fdevops:branch \"user authentication\"\n\n# Créer une branche depuis une branche source explicite avec issue\n\u002Fdevops:branch develop 123\n\n# Créer une branche fix avec texte explicite (source = MAIN_BRANCH)\n\u002Fdevops:branch \"fix login bug\"\n\n# Créer une branche depuis develop (demande issue\u002Ftexte)\n\u002Fdevops:branch develop\n```\n\n## Validation\n- SOURCE_BRANCH doit exister localement\n- SOURCE_BRANCH optionnel (défaut: MAIN_BRANCH de .env.claude)\n- CHECKOUT vers SOURCE_BRANCH AVANT création (CRITIQUE)\n- PULL pour mettre à jour SOURCE_BRANCH (CRITIQUE)\n- La nouvelle branche ne doit pas déjà exister\n- Le nom généré respecte les conventions de nommage\n","# Création de branche Git\n\nCréer une nouvelle branche Git de manière structurée avec support des issues GitHub.\n\n## Configuration\n\n```bash\nCORE_SCRIPTS=\"${CLAUDE_PLUGIN_ROOT}\u002Fscripts\"\n```\n\n## Variables\n- SOURCE_BRANCH: Branche source (optionnel - défaut: MAIN_BRANCH de .env.claude)\n- ISSUE_OR_TEXT: Numéro d'issue GitHub ou texte descriptif\n\n## Relevant Files\n- @.git\u002Fconfig\n- @.gitignore\n- @.env.claude\n- @docs\u002FREADME.md\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n**ÉTAPE CRITIQUE : CHECKOUT VERS SOURCE D'ABORD**\n\n### 1. Lire la configuration depuis .env.claude\n\n- Lis le fichier `.env.claude` à la racine du projet courant\n- Extrais la valeur de `MAIN_BRANCH` (fallback pour SOURCE_BRANCH)\n\n### 2. Parser les arguments et résoudre SOURCE_BRANCH\n\n**Logique de désambiguisation selon le nombre d'arguments :**\n\n**2 arguments fournis :**\n- Premier argument = SOURCE_BRANCH\n- Second argument = ISSUE_OR_TEXT\n\n**1 argument fourni :**\n- Si c'est un entier -> ISSUE_OR_TEXT (numéro d'issue), SOURCE_BRANCH = `MAIN_BRANCH` de .env.claude\n- Si ça correspond à une branche locale existante (`git branch --list \"$ARG\"` non vide) -> SOURCE_BRANCH, ISSUE_OR_TEXT non fourni (sera demandé à l'utilisateur)\n- Sinon -> ISSUE_OR_TEXT (texte descriptif), SOURCE_BRANCH = `MAIN_BRANCH` de .env.claude\n\n**0 argument :**\n- SOURCE_BRANCH = `MAIN_BRANCH` de .env.claude\n- ISSUE_OR_TEXT non fourni (sera demandé à l'utilisateur)\n\n**Si SOURCE_BRANCH n'est toujours pas résolu** :\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Depuis quelle branche veux-tu créer la nouvelle branche ?\"\n  Options: [\"main\", \"master\", \"develop\", \"Autre\"]\n  ```\n\n### 3. Valider que SOURCE_BRANCH existe localement\n\n- Exécute avec Bash :\n  ```bash\n  bash \"$CORE_SCRIPTS\u002Fvalidate-source-branch.sh\" \"$SOURCE_BRANCH\"\n  ```\n- Si le script échoue (exit 1), arrête le workflow\n\n### 4. CHECKOUT VERS SOURCE_BRANCH AVANT TOUT\n\n- Exécute `git checkout $SOURCE_BRANCH` avec Bash\n- Exécute `git branch --show-current` pour vérifier\n- **CRITIQUE** : Cette étape garantit qu'on crée depuis un point propre\n\n### 5. PULL POUR METTRE À JOUR SOURCE_BRANCH\n\n- Exécute `git pull origin $SOURCE_BRANCH` avec Bash\n- **CRITIQUE** : Garantit qu'on part du dernier commit de origin\n\n### 6. Résoudre le nom de la nouvelle branche\n\n**Si ISSUE_OR_TEXT est fourni :**\n\n- Exécute avec Bash :\n  ```bash\n  eval \"$(bash \"$CORE_SCRIPTS\u002Fresolve-branch-name.sh\" \"$ISSUE_OR_TEXT\")\"\n  echo \"BRANCH_NAME=$BRANCH_NAME\"\n  echo \"PREFIX=$PREFIX\"\n  echo \"PREFIX_SOURCE=$PREFIX_SOURCE\"\n  ```\n- Si le script échoue (exit 1), arrête le workflow\n\n**Si ISSUE_OR_TEXT n'est pas fourni :**\n   - Utilise AskUserQuestion pour demander le nom de branche\n\n### 7. Vérifier que la nouvelle branche n'existe pas\n\n- Exécute avec Bash :\n  ```bash\n  bash \"$CORE_SCRIPTS\u002Fcheck-branch-exists.sh\" \"$BRANCH_NAME\"\n  ```\n- Si le script échoue (exit 1), arrête le workflow\n\n### 8. Créer et checkout la nouvelle branche\n\n- Exécute `git checkout -b $BRANCH_NAME` avec Bash\n\n### 9. Afficher le résumé\n\nAffiche :\n```\nBranche créée : $BRANCH_NAME\nPréfixe détecté : $PREFIX (source: $PREFIX_SOURCE)\nDepuis : $SOURCE_BRANCH\n{Si issue} Issue associée : #$ISSUE_NUMBER\n\nLe tracking sera configuré automatiquement au premier commit avec :\n   git push -u origin $BRANCH_NAME\n```\n\n**IMPORTANT - NE PAS configurer de tracking automatiquement :**\n- INTERDIT : `git branch --set-upstream-to=origin\u002F$SOURCE_BRANCH $BRANCH_NAME`\n- Le tracking sera configuré lors du premier push avec `-u`\n\n## Expertise\n\nConventions de nommage des branches (préfixe détecté automatiquement) :\n- `feature\u002F{numéro}-{description}` : Nouvelles fonctionnalités\n- `fix\u002F{numéro}-{description}` : Corrections de bugs\n- `hotfix\u002F{numéro}-{description}` : Corrections urgentes en production\n- `chore\u002F{numéro}-{description}` : Maintenance, refactoring\n- `docs\u002F{numéro}-{description}` : Documentation\n- `test\u002F{numéro}-{description}` : Tests\n\nDétection automatique du préfixe (par priorité) :\n1. Labels de l'issue GitHub\n2. Mots-clés dans la description de l'issue\n3. Mots-clés dans le titre de l'issue\n4. Défaut : `feature\u002F` si aucun indicateur trouvé\n\n## Désambiguisation des arguments\n\nSOURCE_BRANCH est **optionnel** et défaut à `MAIN_BRANCH` de `.env.claude`.\n\n| Argument | Type détecté | SOURCE_BRANCH | ISSUE_OR_TEXT |\n|----------|-------------|---------------|---------------|\n| `42` | Entier | MAIN_BRANCH (.env.claude) | `42` (issue) |\n| `develop` | Branche locale existante | `develop` | Non fourni (demander) |\n| `\"fix login bug\"` | Texte | MAIN_BRANCH (.env.claude) | `\"fix login bug\"` |\n\n## Examples\n\n```bash\n# Créer une branche avec issue (source = MAIN_BRANCH de .env.claude)\n\u002Fdevops:branch 123\n\n# Créer une branche avec texte descriptif (source = MAIN_BRANCH)\n\u002Fdevops:branch \"user authentication\"\n\n# Créer une branche depuis une branche source explicite avec issue\n\u002Fdevops:branch develop 123\n\n# Créer une branche fix avec texte explicite (source = MAIN_BRANCH)\n\u002Fdevops:branch \"fix login bug\"\n\n# Créer une branche depuis develop (demande issue\u002Ftexte)\n\u002Fdevops:branch develop\n```\n\n## Validation\n- SOURCE_BRANCH doit exister localement\n- SOURCE_BRANCH optionnel (défaut: MAIN_BRANCH de .env.claude)\n- CHECKOUT vers SOURCE_BRANCH AVANT création (CRITIQUE)\n- PULL pour mettre à jour SOURCE_BRANCH (CRITIQUE)\n- La nouvelle branche ne doit pas déjà exister\n- Le nom généré respecte les conventions de nommage\n",{},"main","bb0335112ea0991dc1dc6a29fa5a861397a5a6f6","devops\u002Fskills\u002Fbranch","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":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add atournayre\u002Fclaude-personas --skill branch",{"tool":37,"command":38},"bunx","bunx skills add atournayre\u002Fclaude-personas --skill branch",{"tool":40,"command":41},"pnpm","pnpm dlx skills add atournayre\u002Fclaude-personas --skill branch","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fdevops\u002Fskills\u002Fbranch\u002FSKILL.md",true,[45,51,55,59,63,67],{"path":46,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":49,"sourceHtmlUrl":50},"evals\u002Fevals.json","REFERENCE","参考文档",633,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fquality-tools\u002Fevals\u002Fevals.json",{"path":52,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":53,"sourceHtmlUrl":54},"evals\u002Ftriggers.json",2833,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fquality-tools\u002Fevals\u002Ftriggers.json",{"path":56,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":57,"sourceHtmlUrl":58},"references\u002Fgo-tools.md",3598,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fquality-tools\u002Freferences\u002Fgo-tools.md",{"path":60,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":61,"sourceHtmlUrl":62},"references\u002Fjs-ts-tools.md",3414,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fquality-tools\u002Freferences\u002Fjs-ts-tools.md",{"path":64,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":65,"sourceHtmlUrl":66},"references\u002Fphp-tools.md",8920,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fquality-tools\u002Freferences\u002Fphp-tools.md",{"path":68,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":69,"sourceHtmlUrl":70},"references\u002Fpython-tools.md",4798,"https:\u002F\u002Fgithub.com\u002Fevent4u-app\u002Fagent-config\u002Fblob\u002Fmain\u002Fsrc\u002Fskills\u002Fquality-tools\u002Freferences\u002Fpython-tools.md",[72,89,129,136,144,155],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":18},"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",[],[79,80,81,82,83,84,85,86,87,88],"twig:make component","component","read","edit","write","ux","grep","template","php","Bash",{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":111,"publishedAt":18},"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",[95,100,103,106],{"categoryNo":96,"categoryName":97,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":101,"categoryName":102,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":104,"categoryName":105,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":107,"categoryName":108,"taxonomyType":109,"taxonomyTypeDesc":110},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[112,113,114,115,116,117,118,119,120,121,122,88,123,124,125,126,81,83,127,128],"test","ui","tester","ui test","tester:ui test","MCP","debug","create","update","validation","messages","plan","tool","page","find","javascript","chrome",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":18},"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",[],[131,88,85,81,83,82],{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":142,"publishedAt":18},"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",[],[138,143,88,85,81,83,82],"message",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":153,"publishedAt":18},"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",[150],{"categoryNo":151,"categoryName":152,"taxonomyType":98,"taxonomyTypeDesc":99},"01JBSEEDCAT000000000000005","邮件与沟通",[146,82,154,88,86,85,81,83],"email",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":18},"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",[],[157,88,85,81,83,82,162,121],"options"]