[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSWH1YS4TFDB3HJMW5VKE2":3,"skill-same:01M6CSWH1YS4TFDB3HJMW5VKE2":103},{"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":23,"publishedAt":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":14,"repositoryHtmlUrl":56,"repositoryHomepageUrl":57,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6CSWH1YS4TFDB3HJMW5VKE2","implementer:refactor",null,"Refactoring autonome piloté par les tests — boucle refactor\u002Ftest\u002Fajust","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\u002Fimplementer\u002Fskills\u002Frefactor\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",[24,25,5,26,27,28,29,30,31,32,33,34],"refactor","implementer","test","Bash","refactoring","grep","read","write","edit","dossier","task","2026-11-10 10:12:30",false,"---\nname: implementer:refactor\ndescription: Refactoring autonome piloté par les tests — boucle refactor\u002Ftest\u002Fajust\nargument-hint: \u003Cfichier-ou-dossier> [description-refactoring]\nmodel: opus\nallowed-tools: [Task, Bash, Read, Write, Edit, Grep, Glob, TaskCreate, TaskUpdate, TaskList]\nversion: 1.0.0\nlicense: MIT\n---\n\n# Refactoring Piloté par les Tests\n\nRefactoring autonome en boucle piloté par les tests. Les tests DOIVENT rester verts à chaque itération.\n\n## Cible\n\n$ARGUMENTS\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n## 1. Snapshot : établir la baseline\n\nLancer tests + linting pour établir une baseline verte :\n\n```bash\n# Lancer les tests\nvendor\u002Fbin\u002Fphpunit 2>&1 || true\n\n# Lancer PHPStan\nvendor\u002Fbin\u002Fphpstan analyse --no-progress 2>&1 || true\n\n# Lancer CS-Fixer en mode dry-run\nvendor\u002Fbin\u002Fphp-cs-fixer fix --dry-run 2>&1 || true\n```\n\n**Si la baseline n'est PAS verte :**\n- Logger les erreurs existantes\n- Continuer le refactoring MAIS ne pas aggraver la situation\n- Le refactoring ne doit pas introduire de NOUVELLES erreurs\n\nStocker les résultats :\n```\nbaseline_test_failures: X\nbaseline_phpstan_errors: Y\nbaseline_cs_errors: Z\n```\n\n## 2. Plan : identifier les transformations\n\nLire les fichiers cibles et identifier les transformations à appliquer :\n- Extractions de méthodes\n- Renommages\n- Simplifications de conditions\n- Extraction de classes\n- Suppression de code mort\n- Amélioration de typage\n\nCréer une tâche par transformation :\n\n```\nTaskCreate : \"Extraire méthode calculateTotal depuis OrderService\"\nTaskCreate : \"Renommer $tmp en $formattedDate dans DateHelper\"\nTaskCreate : \"Simplifier condition imbriquée dans UserValidator\"\n```\n\n## 3. Boucle de refactoring (max 5 itérations par fichier)\n\nPour chaque transformation :\n\n### a. Appliquer la transformation\n\n`TaskUpdate` → tâche en `in_progress`\n\nEffectuer la modification via Edit.\n\n### b. Lancer les vérifications\n\n```bash\n# Tests\nvendor\u002Fbin\u002Fphpunit 2>&1\n\n# PHPStan\nvendor\u002Fbin\u002Fphpstan analyse --no-progress 2>&1\n```\n\n### c. Évaluer le résultat\n\n- **Tests verts + PHPStan OK** : `TaskUpdate` → tâche en `completed`, passer au suivant\n- **Tests cassés** : analyser l'échec\n  - Si corrigeable rapidement : ajuster la correction\n  - Sinon : `git checkout -- \u003Cfichier>` (revert) et passer au fichier suivant\n- **Nouvelles erreurs PHPStan** : corriger ou revert\n\n**Règle absolue :** les tests DOIVENT rester verts après chaque itération.\n\n## 4. Rapport final\n\n```\nRefactoring terminé\n\n  Transformations appliquées : X\u002FY\n  Tests : verts (avant et après)\n  PHPStan : Z erreurs avant -> W erreurs après\n\n  Transformations réussies :\n  - Extraction méthode calculateTotal (OrderService.php)\n  - Renommage $tmp -> $formattedDate (DateHelper.php)\n\n  Transformations revertées :\n  - Simplification condition (UserValidator.php) : test UserValidatorTest::testEdgeCase cassé\n\n  Fichiers modifiés :\n  - src\u002FService\u002FOrderService.php\n  - src\u002FHelper\u002FDateHelper.php\n```\n\n## Règles\n\n- **Tests VERTS obligatoires** à chaque itération\n- **Max 5 itérations** par fichier\n- **Revert** si tests cassés et non corrigeables\n- **Pas de `@phpstan-ignore*`** dans les corrections\n- **Rapport avant\u002Faprès** obligatoire\n- **Restriction** : ne JAMAIS créer de commits Git\n","# Refactoring Piloté par les Tests\n\nRefactoring autonome en boucle piloté par les tests. Les tests DOIVENT rester verts à chaque itération.\n\n## Cible\n\n$ARGUMENTS\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n## 1. Snapshot : établir la baseline\n\nLancer tests + linting pour établir une baseline verte :\n\n```bash\n# Lancer les tests\nvendor\u002Fbin\u002Fphpunit 2>&1 || true\n\n# Lancer PHPStan\nvendor\u002Fbin\u002Fphpstan analyse --no-progress 2>&1 || true\n\n# Lancer CS-Fixer en mode dry-run\nvendor\u002Fbin\u002Fphp-cs-fixer fix --dry-run 2>&1 || true\n```\n\n**Si la baseline n'est PAS verte :**\n- Logger les erreurs existantes\n- Continuer le refactoring MAIS ne pas aggraver la situation\n- Le refactoring ne doit pas introduire de NOUVELLES erreurs\n\nStocker les résultats :\n```\nbaseline_test_failures: X\nbaseline_phpstan_errors: Y\nbaseline_cs_errors: Z\n```\n\n## 2. Plan : identifier les transformations\n\nLire les fichiers cibles et identifier les transformations à appliquer :\n- Extractions de méthodes\n- Renommages\n- Simplifications de conditions\n- Extraction de classes\n- Suppression de code mort\n- Amélioration de typage\n\nCréer une tâche par transformation :\n\n```\nTaskCreate : \"Extraire méthode calculateTotal depuis OrderService\"\nTaskCreate : \"Renommer $tmp en $formattedDate dans DateHelper\"\nTaskCreate : \"Simplifier condition imbriquée dans UserValidator\"\n```\n\n## 3. Boucle de refactoring (max 5 itérations par fichier)\n\nPour chaque transformation :\n\n### a. Appliquer la transformation\n\n`TaskUpdate` → tâche en `in_progress`\n\nEffectuer la modification via Edit.\n\n### b. Lancer les vérifications\n\n```bash\n# Tests\nvendor\u002Fbin\u002Fphpunit 2>&1\n\n# PHPStan\nvendor\u002Fbin\u002Fphpstan analyse --no-progress 2>&1\n```\n\n### c. Évaluer le résultat\n\n- **Tests verts + PHPStan OK** : `TaskUpdate` → tâche en `completed`, passer au suivant\n- **Tests cassés** : analyser l'échec\n  - Si corrigeable rapidement : ajuster la correction\n  - Sinon : `git checkout -- \u003Cfichier>` (revert) et passer au fichier suivant\n- **Nouvelles erreurs PHPStan** : corriger ou revert\n\n**Règle absolue :** les tests DOIVENT rester verts après chaque itération.\n\n## 4. Rapport final\n\n```\nRefactoring terminé\n\n  Transformations appliquées : X\u002FY\n  Tests : verts (avant et après)\n  PHPStan : Z erreurs avant -> W erreurs après\n\n  Transformations réussies :\n  - Extraction méthode calculateTotal (OrderService.php)\n  - Renommage $tmp -> $formattedDate (DateHelper.php)\n\n  Transformations revertées :\n  - Simplification condition (UserValidator.php) : test UserValidatorTest::testEdgeCase cassé\n\n  Fichiers modifiés :\n  - src\u002FService\u002FOrderService.php\n  - src\u002FHelper\u002FDateHelper.php\n```\n\n## Règles\n\n- **Tests VERTS obligatoires** à chaque itération\n- **Max 5 itérations** par fichier\n- **Revert** si tests cassés et non corrigeables\n- **Pas de `@phpstan-ignore*`** dans les corrections\n- **Rapport avant\u002Faprès** obligatoire\n- **Restriction** : ne JAMAIS créer de commits Git\n",{"name":5,"model":40,"license":15,"version":41,"description":7,"allowed-tools":42,"argument-hint":52},"opus","1.0.0",[43,27,44,45,46,47,48,49,50,51],"Task","Read","Write","Edit","Grep","Glob","TaskCreate","TaskUpdate","TaskList","\u003Cfichier-ou-dossier> [description-refactoring]","main","bb0335112ea0991dc1dc6a29fa5a861397a5a6f6","implementer\u002Fskills\u002Frefactor","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":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add atournayre\u002Fclaude-personas --skill \"implementer:refactor\"",{"tool":67,"command":68},"bunx","bunx skills add atournayre\u002Fclaude-personas --skill \"implementer:refactor\"",{"tool":70,"command":71},"pnpm","pnpm dlx skills add atournayre\u002Fclaude-personas --skill \"implementer:refactor\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fimplementer\u002Fskills\u002Frefactor\u002FSKILL.md",true,[75,81,87,91,95,99],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"assets\u002Ftemplate.html","ASSET","资产文件",12906,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fopen-design-ib-pitch-book\u002Fassets\u002Ftemplate.html",{"path":82,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":85,"sourceHtmlUrl":86},"example.html","REFERENCE","参考文档",69668,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fopen-design-ib-pitch-book\u002Fexample.html",{"path":88,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":89,"sourceHtmlUrl":90},"references\u002Fattribution.md",1489,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fopen-design-ib-pitch-book\u002Freferences\u002Fattribution.md",{"path":92,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":93,"sourceHtmlUrl":94},"references\u002Fchecklist.md",2076,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fopen-design-ib-pitch-book\u002Freferences\u002Fchecklist.md",{"path":96,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":97,"sourceHtmlUrl":98},"references\u002Fcompliance.md",3025,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fopen-design-ib-pitch-book\u002Freferences\u002Fcompliance.md",{"path":100,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":101,"sourceHtmlUrl":102},"references\u002Fconventions.md",1264,"https:\u002F\u002Fgithub.com\u002Fendman100\u002Fskill-router-nexus\u002Fblob\u002Fmain\u002FPPT-Design\u002Fopen-design-ib-pitch-book\u002Freferences\u002Fconventions.md",[104,116,153,160,168,179],{"skillNo":105,"name":106,"nameZh":6,"description":107,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":108,"categories":109,"keywords":110,"publishedAt":35},"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",[],[111,112,30,32,31,113,29,114,115,27],"twig:make component","component","ux","template","php",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":136,"publishedAt":35},"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",[122,125,128,131],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":126,"categoryName":127,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":129,"categoryName":130,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":132,"categoryName":133,"taxonomyType":134,"taxonomyTypeDesc":135},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[26,137,138,139,140,141,142,143,144,145,146,27,147,148,149,150,30,31,151,152],"ui","tester","ui test","tester:ui test","MCP","debug","create","update","validation","messages","plan","tool","page","find","javascript","chrome",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":159,"publishedAt":35},"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",[],[155,27,29,30,31,32],{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":166,"publishedAt":35},"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",[],[162,167,27,29,30,31,32],"message",{"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":177,"publishedAt":35},"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",[174],{"categoryNo":175,"categoryName":176,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通",[170,32,178,27,114,29,30,31],"email",{"skillNo":180,"name":181,"nameZh":6,"description":182,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":183,"categories":184,"keywords":185,"publishedAt":35},"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",[],[181,27,29,30,31,32,186,145],"options"]