[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSYEPCDM4E9AZ5ZCCCX2NS":3,"skill-same:01M6CSYEPCDM4E9AZ5ZCCCX2NS":63},{"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":28,"linkOnly":29,"markdownContent":30,"markdownBody":31,"frontMatter":32,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":14,"repositoryHtmlUrl":44,"repositoryHomepageUrl":45,"ownerHtmlUrl":46,"ownerBlogUrl":6,"ownerDescription":47,"updatedAt":48,"install":49,"resources":62},"01M6CSYEPCDM4E9AZ5ZCCCX2NS","php:make-urls",null,"Génère classe Urls + Message CQRS + Handler","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\u002Fphp\u002Fskills\u002Fmake-urls\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27],"php","php:make urls","Bash","grep","read","write","edit","message","cqrs","2026-11-10 10:12:30",false,"---\nname: php:make-urls\ndescription: Génère classe Urls + Message CQRS + Handler\nmodel: sonnet\nallowed-tools: [Bash, Read, Write, Edit, Grep, Glob]\nversion: 1.0.0\nlicense: MIT\n---\n\n# PHP Make Urls Skill\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n\n## Description\nGénère une classe Urls pour la génération d'URLs d'une entité avec pattern CQRS (Message + Handler).\n\n## Usage\n```\nUse skill php:make-urls\n```\n\n## Variables requises\n- **{EntityName}** - Nom de l'entité en PascalCase (ex: Product)\n- **{entityName}** - Nom de l'entité en camelCase (ex: product)\n- **{namespace}** - Namespace du projet (défaut: App)\n\n## Dépendances\n- Entité dans `src\u002FEntity\u002F{EntityName}.php`\n- Repository dans `src\u002FRepository\u002F{EntityName}Repository.php`\n- Interface repository dans `src\u002FRepository\u002F{EntityName}RepositoryInterface.php`\n\n## Outputs\n- `src\u002FUrls\u002F{EntityName}Urls.php`\n- `src\u002FMessageHandler\u002F{EntityName}UrlsMessage.php`\n- `src\u002FMessageHandler\u002F{EntityName}UrlsMessageHandler.php`\n\n## Workflow\n\n1. Demander le nom de l'entité (EntityName)\n2. Vérifier que l'entité et le repository existent\n3. Générer les 3 classes depuis les templates `templates\u002F`\n4. Afficher les fichiers créés\n\n## Patterns appliqués\n\n### Classe Urls\n- `final readonly`, constructeur privé, factory `new()`\n- Propriétés : UrlGeneratorInterface + entité\n\n### Message CQRS\n- Extends AbstractQueryEvent, Implements QueryInterface\n- `final`, constructeur privé, factory `new()`\n\n### MessageHandler\n- `final readonly`, attribut #[AsMessageHandler]\n- Injection : repository + UrlGeneratorInterface\n\n## References\n\n- [Usage](references\u002Fusage.md) - Architecture CQRS et exemples d'enrichissement\n\n## Notes\n- Pattern CQRS : séparation query (Message) \u002F handler\n- Classe Urls enrichissable avec méthodes spécifiques (show, edit, delete)\n- Immutabilité (readonly)\n","# PHP Make Urls Skill\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n\n## Description\nGénère une classe Urls pour la génération d'URLs d'une entité avec pattern CQRS (Message + Handler).\n\n## Usage\n```\nUse skill php:make-urls\n```\n\n## Variables requises\n- **{EntityName}** - Nom de l'entité en PascalCase (ex: Product)\n- **{entityName}** - Nom de l'entité en camelCase (ex: product)\n- **{namespace}** - Namespace du projet (défaut: App)\n\n## Dépendances\n- Entité dans `src\u002FEntity\u002F{EntityName}.php`\n- Repository dans `src\u002FRepository\u002F{EntityName}Repository.php`\n- Interface repository dans `src\u002FRepository\u002F{EntityName}RepositoryInterface.php`\n\n## Outputs\n- `src\u002FUrls\u002F{EntityName}Urls.php`\n- `src\u002FMessageHandler\u002F{EntityName}UrlsMessage.php`\n- `src\u002FMessageHandler\u002F{EntityName}UrlsMessageHandler.php`\n\n## Workflow\n\n1. Demander le nom de l'entité (EntityName)\n2. Vérifier que l'entité et le repository existent\n3. Générer les 3 classes depuis les templates `templates\u002F`\n4. Afficher les fichiers créés\n\n## Patterns appliqués\n\n### Classe Urls\n- `final readonly`, constructeur privé, factory `new()`\n- Propriétés : UrlGeneratorInterface + entité\n\n### Message CQRS\n- Extends AbstractQueryEvent, Implements QueryInterface\n- `final`, constructeur privé, factory `new()`\n\n### MessageHandler\n- `final readonly`, attribut #[AsMessageHandler]\n- Injection : repository + UrlGeneratorInterface\n\n## References\n\n- [Usage](references\u002Fusage.md) - Architecture CQRS et exemples d'enrichissement\n\n## Notes\n- Pattern CQRS : séparation query (Message) \u002F handler\n- Classe Urls enrichissable avec méthodes spécifiques (show, edit, delete)\n- Immutabilité (readonly)\n",{"name":5,"model":33,"license":15,"version":34,"description":7,"allowed-tools":35},"sonnet","1.0.0",[21,36,37,38,39,40],"Read","Write","Edit","Grep","Glob","main","bb0335112ea0991dc1dc6a29fa5a861397a5a6f6","php\u002Fskills\u002Fmake-urls","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":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add atournayre\u002Fclaude-personas --skill \"php:make-urls\"",{"tool":55,"command":56},"bunx","bunx skills add atournayre\u002Fclaude-personas --skill \"php:make-urls\"",{"tool":58,"command":59},"pnpm","pnpm dlx skills add atournayre\u002Fclaude-personas --skill \"php:make-urls\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fphp\u002Fskills\u002Fmake-urls\u002FSKILL.md",true,[],[64,75,115,122,129,140],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":28},"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",[],[71,72,23,25,24,73,22,74,19,21],"twig:make component","component","ux","template",{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":97,"publishedAt":28},"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",[81,86,89,92],{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":87,"categoryName":88,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":90,"categoryName":91,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[98,99,100,101,102,103,104,105,106,107,108,21,109,110,111,112,23,24,113,114],"test","ui","tester","ui test","tester:ui test","MCP","debug","create","update","validation","messages","plan","tool","page","find","javascript","chrome",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":28},"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",[],[117,21,22,23,24,25],{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":28},"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",[],[124,26,21,22,23,24,25],{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":138,"publishedAt":28},"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",[135],{"categoryNo":136,"categoryName":137,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000005","邮件与沟通",[131,25,139,21,74,22,23,24],"email",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":146,"publishedAt":28},"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",[],[142,21,22,23,24,25,147,107],"options"]