[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CST2MNE3DMWK66FEWJ1ZP5":3,"skill-same:01M6CST2MNE3DMWK66FEWJ1ZP5":74},{"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":28,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":14,"repositoryHtmlUrl":55,"repositoryHomepageUrl":56,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6CST2MNE3DMWK66FEWJ1ZP5","api-platform:make-filter",null,"Génère des filtres API Platform (search, date, range, order, boolean, exists, custom)","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\u002Fapi-platform\u002Fskills\u002Fmake-filter\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36],"api","api platform:make filter","search","Bash","grep","read","write","edit","2026-11-10 10:12:30",false,"---\nname: api-platform:make-filter\ndescription: Génère des filtres API Platform (search, date, range, order, boolean, exists, custom)\nargument-hint: \u003Cnom-resource>\nmodel: sonnet\nallowed-tools: [AskUserQuestion, Bash, Read, Write, Edit, Grep, Glob]\nversion: 1.0.0\nlicense: MIT\n---\n\n# API Platform Make Filter\n\nGénère des filtres pour une resource API Platform : filtres Doctrine intégrés (SearchFilter, DateFilter, RangeFilter, etc.) ou filtres personnalisés.\n\n## Variables\n- **{ResourceName}** - Nom de la resource en PascalCase\n- **{properties}** - Propriétés à filtrer\n- **{filterType}** - Type de filtre (search, date, range, order, boolean, exists, custom)\n\n## Outputs\n- Modification de `src\u002FEntity\u002F{ResourceName}.php` (ajout des attributs de filtre)\n- `src\u002FFilter\u002F{FilterName}Filter.php` (si filtre custom)\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n### 1. Identifier la resource cible\n\n- Si `$ARGUMENTS` est fourni, utiliser comme nom de la resource\n- Sinon, utiliser AskUserQuestion :\n  ```\n  Question: \"Sur quelle resource ajouter des filtres ?\"\n  Header: \"Resource\"\n  ```\n- Vérifier que le fichier `src\u002FEntity\u002F{ResourceName}.php` existe avec Glob\n- Lire le fichier avec Read pour comprendre les propriétés disponibles\n\n### 2. Analyser les propriétés de la resource\n\n- Parser les propriétés de la classe (nom, type PHP, type Doctrine)\n- Identifier les propriétés candidates pour chaque type de filtre :\n  - **string** → SearchFilter (partial, exact, start, end, word_start)\n  - **\\DateTimeInterface** → DateFilter (before, after, strictly_before, strictly_after)\n  - **int, float** → RangeFilter (between, gt, gte, lt, lte)\n  - **bool** → BooleanFilter\n  - **nullable** → ExistsFilter\n  - **relations** → SearchFilter sur les propriétés liées\n\n### 3. Choisir les filtres à ajouter\n\n- Utiliser AskUserQuestion (multiSelect: true) :\n  ```\n  Question: \"Quels types de filtres ajouter ?\"\n  Header: \"Filtres\"\n  Options:\n    - \"SearchFilter\" : \"Recherche textuelle (partial, exact, start, end, word_start)\"\n    - \"OrderFilter\" : \"Tri sur les propriétés (ASC\u002FDESC)\"\n    - \"DateFilter \u002F RangeFilter \u002F BooleanFilter \u002F ExistsFilter\" : \"Filtres typés selon les propriétés\"\n    - \"Filtre personnalisé\" : \"Classe de filtre custom avec logique métier\"\n  ```\n\n### 4. Configurer chaque filtre\n\n**Pour SearchFilter :**\n- Demander la stratégie pour chaque propriété string :\n  - `partial` — Recherche contenant (LIKE %value%)\n  - `exact` — Correspondance exacte\n  - `start` — Commence par (LIKE value%)\n  - `end` — Finit par (LIKE %value)\n  - `word_start` — Mot commençant par\n  - `ipartial` — Recherche partielle insensible à la casse\n\n**Pour OrderFilter :**\n- Lister les propriétés triables\n- Définir l'ordre par défaut (ASC\u002FDESC)\n\n**Pour DateFilter :**\n- Appliquer automatiquement sur les propriétés DateTime\n\n**Pour RangeFilter :**\n- Appliquer automatiquement sur les propriétés numériques\n\n### 5. Générer les attributs de filtre\n\nAjouter les attributs sur la classe de la resource :\n\n```php\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\SearchFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\OrderFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\DateFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\RangeFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\BooleanFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\ExistsFilter;\nuse ApiPlatform\\Metadata\\ApiFilter;\n\n#[ApiFilter(SearchFilter::class, properties: [\n    'name' => 'partial',\n    'email' => 'exact',\n])]\n#[ApiFilter(OrderFilter::class, properties: ['id', 'name', 'createdAt'])]\n#[ApiFilter(DateFilter::class, properties: ['createdAt', 'updatedAt'])]\n#[ApiFilter(RangeFilter::class, properties: ['price', 'quantity'])]\n#[ApiFilter(BooleanFilter::class, properties: ['active'])]\n#[ApiFilter(ExistsFilter::class, properties: ['deletedAt'])]\n```\n\n### 6. Générer un filtre personnalisé (si demandé)\n\nCréer `src\u002FFilter\u002F{FilterName}Filter.php` :\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\Filter;\n\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\AbstractFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Util\\QueryNameGeneratorInterface;\nuse ApiPlatform\\Metadata\\Operation;\nuse Doctrine\\ORM\\QueryBuilder;\n\nfinal class {FilterName}Filter extends AbstractFilter\n{\n    protected function filterProperty(\n        string $property,\n        mixed $value,\n        QueryBuilder $queryBuilder,\n        QueryNameGeneratorInterface $queryNameGenerator,\n        string $resourceClass,\n        ?Operation $operation = null,\n        array $context = [],\n    ): void {\n        if ('customProperty' !== $property) {\n            return;\n        }\n\n        $parameterName = $queryNameGenerator->generateParameterName($property);\n        $queryBuilder\n            ->andWhere(sprintf('o.%s = :%s', $property, $parameterName))\n            ->setParameter($parameterName, $value);\n    }\n\n    public function getDescription(string $resourceClass): array\n    {\n        return [\n            'customProperty' => [\n                'property' => 'customProperty',\n                'type' => 'string',\n                'required' => false,\n                'description' => 'Description du filtre personnalisé',\n                'openapi' => [\n                    'description' => 'Description pour OpenAPI',\n                ],\n            ],\n        ];\n    }\n}\n```\n\n### 7. Afficher le résumé\n\n```\nFiltres ajoutés à {ResourceName}\n\nFiltres configurés :\n- SearchFilter : name (partial), email (exact)\n- OrderFilter : id, name, createdAt\n- DateFilter : createdAt, updatedAt\n\nExemples de requêtes :\n- GET \u002Fapi\u002F{resources}?name=foo         (recherche partielle)\n- GET \u002Fapi\u002F{resources}?order[name]=asc  (tri)\n- GET \u002Fapi\u002F{resources}?createdAt[after]=2024-01-01 (date)\n\nDocumentation automatique :\n- Les filtres apparaissent dans OpenAPI\u002FSwagger\n- Les filtres sont documentés dans les réponses Hydra\n\nProchaines étapes :\n- Tester les filtres : \u002Fapi-platform:make-test {ResourceName}\n- Ajouter des filtres personnalisés : \u002Fapi-platform:make-filter {ResourceName}\n```\n\n## Filtres disponibles\n\n### Filtres Doctrine ORM intégrés\n| Filtre | Usage | Paramètres |\n|--------|-------|------------|\n| SearchFilter | Recherche textuelle | exact, partial, start, end, word_start, ipartial |\n| OrderFilter | Tri | ASC, DESC |\n| DateFilter | Dates | before, after, strictly_before, strictly_after |\n| RangeFilter | Intervalles numériques | between, gt, gte, lt, lte |\n| BooleanFilter | Booléens | true, false, 1, 0 |\n| ExistsFilter | Nullabilité | true, false |\n| NumericFilter | Valeurs numériques exactes | valeur exacte |\n\n### QueryParameter (API Platform 3.3+)\n- Alternative moderne aux filtres via `#[QueryParameter]`\n- Plus flexible, supporte les expressions de sécurité\n- Utilisable avec ou sans Doctrine\n\n## Notes\n- Les filtres Doctrine ne fonctionnent qu'avec le state provider Doctrine\n- Pour les DTOs avec providers personnalisés, implémenter le filtrage dans le provider\n- Penser à indexer les colonnes filtrées en base de données\n- Les filtres sont automatiquement documentés dans OpenAPI\n","# API Platform Make Filter\n\nGénère des filtres pour une resource API Platform : filtres Doctrine intégrés (SearchFilter, DateFilter, RangeFilter, etc.) ou filtres personnalisés.\n\n## Variables\n- **{ResourceName}** - Nom de la resource en PascalCase\n- **{properties}** - Propriétés à filtrer\n- **{filterType}** - Type de filtre (search, date, range, order, boolean, exists, custom)\n\n## Outputs\n- Modification de `src\u002FEntity\u002F{ResourceName}.php` (ajout des attributs de filtre)\n- `src\u002FFilter\u002F{FilterName}Filter.php` (si filtre custom)\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n### 1. Identifier la resource cible\n\n- Si `$ARGUMENTS` est fourni, utiliser comme nom de la resource\n- Sinon, utiliser AskUserQuestion :\n  ```\n  Question: \"Sur quelle resource ajouter des filtres ?\"\n  Header: \"Resource\"\n  ```\n- Vérifier que le fichier `src\u002FEntity\u002F{ResourceName}.php` existe avec Glob\n- Lire le fichier avec Read pour comprendre les propriétés disponibles\n\n### 2. Analyser les propriétés de la resource\n\n- Parser les propriétés de la classe (nom, type PHP, type Doctrine)\n- Identifier les propriétés candidates pour chaque type de filtre :\n  - **string** → SearchFilter (partial, exact, start, end, word_start)\n  - **\\DateTimeInterface** → DateFilter (before, after, strictly_before, strictly_after)\n  - **int, float** → RangeFilter (between, gt, gte, lt, lte)\n  - **bool** → BooleanFilter\n  - **nullable** → ExistsFilter\n  - **relations** → SearchFilter sur les propriétés liées\n\n### 3. Choisir les filtres à ajouter\n\n- Utiliser AskUserQuestion (multiSelect: true) :\n  ```\n  Question: \"Quels types de filtres ajouter ?\"\n  Header: \"Filtres\"\n  Options:\n    - \"SearchFilter\" : \"Recherche textuelle (partial, exact, start, end, word_start)\"\n    - \"OrderFilter\" : \"Tri sur les propriétés (ASC\u002FDESC)\"\n    - \"DateFilter \u002F RangeFilter \u002F BooleanFilter \u002F ExistsFilter\" : \"Filtres typés selon les propriétés\"\n    - \"Filtre personnalisé\" : \"Classe de filtre custom avec logique métier\"\n  ```\n\n### 4. Configurer chaque filtre\n\n**Pour SearchFilter :**\n- Demander la stratégie pour chaque propriété string :\n  - `partial` — Recherche contenant (LIKE %value%)\n  - `exact` — Correspondance exacte\n  - `start` — Commence par (LIKE value%)\n  - `end` — Finit par (LIKE %value)\n  - `word_start` — Mot commençant par\n  - `ipartial` — Recherche partielle insensible à la casse\n\n**Pour OrderFilter :**\n- Lister les propriétés triables\n- Définir l'ordre par défaut (ASC\u002FDESC)\n\n**Pour DateFilter :**\n- Appliquer automatiquement sur les propriétés DateTime\n\n**Pour RangeFilter :**\n- Appliquer automatiquement sur les propriétés numériques\n\n### 5. Générer les attributs de filtre\n\nAjouter les attributs sur la classe de la resource :\n\n```php\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\SearchFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\OrderFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\DateFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\RangeFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\BooleanFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\ExistsFilter;\nuse ApiPlatform\\Metadata\\ApiFilter;\n\n#[ApiFilter(SearchFilter::class, properties: [\n    'name' => 'partial',\n    'email' => 'exact',\n])]\n#[ApiFilter(OrderFilter::class, properties: ['id', 'name', 'createdAt'])]\n#[ApiFilter(DateFilter::class, properties: ['createdAt', 'updatedAt'])]\n#[ApiFilter(RangeFilter::class, properties: ['price', 'quantity'])]\n#[ApiFilter(BooleanFilter::class, properties: ['active'])]\n#[ApiFilter(ExistsFilter::class, properties: ['deletedAt'])]\n```\n\n### 6. Générer un filtre personnalisé (si demandé)\n\nCréer `src\u002FFilter\u002F{FilterName}Filter.php` :\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\Filter;\n\nuse ApiPlatform\\Doctrine\\Orm\\Filter\\AbstractFilter;\nuse ApiPlatform\\Doctrine\\Orm\\Util\\QueryNameGeneratorInterface;\nuse ApiPlatform\\Metadata\\Operation;\nuse Doctrine\\ORM\\QueryBuilder;\n\nfinal class {FilterName}Filter extends AbstractFilter\n{\n    protected function filterProperty(\n        string $property,\n        mixed $value,\n        QueryBuilder $queryBuilder,\n        QueryNameGeneratorInterface $queryNameGenerator,\n        string $resourceClass,\n        ?Operation $operation = null,\n        array $context = [],\n    ): void {\n        if ('customProperty' !== $property) {\n            return;\n        }\n\n        $parameterName = $queryNameGenerator->generateParameterName($property);\n        $queryBuilder\n            ->andWhere(sprintf('o.%s = :%s', $property, $parameterName))\n            ->setParameter($parameterName, $value);\n    }\n\n    public function getDescription(string $resourceClass): array\n    {\n        return [\n            'customProperty' => [\n                'property' => 'customProperty',\n                'type' => 'string',\n                'required' => false,\n                'description' => 'Description du filtre personnalisé',\n                'openapi' => [\n                    'description' => 'Description pour OpenAPI',\n                ],\n            ],\n        ];\n    }\n}\n```\n\n### 7. Afficher le résumé\n\n```\nFiltres ajoutés à {ResourceName}\n\nFiltres configurés :\n- SearchFilter : name (partial), email (exact)\n- OrderFilter : id, name, createdAt\n- DateFilter : createdAt, updatedAt\n\nExemples de requêtes :\n- GET \u002Fapi\u002F{resources}?name=foo         (recherche partielle)\n- GET \u002Fapi\u002F{resources}?order[name]=asc  (tri)\n- GET \u002Fapi\u002F{resources}?createdAt[after]=2024-01-01 (date)\n\nDocumentation automatique :\n- Les filtres apparaissent dans OpenAPI\u002FSwagger\n- Les filtres sont documentés dans les réponses Hydra\n\nProchaines étapes :\n- Tester les filtres : \u002Fapi-platform:make-test {ResourceName}\n- Ajouter des filtres personnalisés : \u002Fapi-platform:make-filter {ResourceName}\n```\n\n## Filtres disponibles\n\n### Filtres Doctrine ORM intégrés\n| Filtre | Usage | Paramètres |\n|--------|-------|------------|\n| SearchFilter | Recherche textuelle | exact, partial, start, end, word_start, ipartial |\n| OrderFilter | Tri | ASC, DESC |\n| DateFilter | Dates | before, after, strictly_before, strictly_after |\n| RangeFilter | Intervalles numériques | between, gt, gte, lt, lte |\n| BooleanFilter | Booléens | true, false, 1, 0 |\n| ExistsFilter | Nullabilité | true, false |\n| NumericFilter | Valeurs numériques exactes | valeur exacte |\n\n### QueryParameter (API Platform 3.3+)\n- Alternative moderne aux filtres via `#[QueryParameter]`\n- Plus flexible, supporte les expressions de sécurité\n- Utilisable avec ou sans Doctrine\n\n## Notes\n- Les filtres Doctrine ne fonctionnent qu'avec le state provider Doctrine\n- Pour les DTOs avec providers personnalisés, implémenter le filtrage dans le provider\n- Penser à indexer les colonnes filtrées en base de données\n- Les filtres sont automatiquement documentés dans OpenAPI\n",{"name":5,"model":42,"license":15,"version":43,"description":7,"allowed-tools":44,"argument-hint":51},"sonnet","1.0.0",[45,32,46,47,48,49,50],"AskUserQuestion","Read","Write","Edit","Grep","Glob","\u003Cnom-resource>","main","bb0335112ea0991dc1dc6a29fa5a861397a5a6f6","api-platform\u002Fskills\u002Fmake-filter","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":61,"prompt":71,"zipAvailable":72},[62,65,68],{"tool":63,"command":64},"npx","npx skills add atournayre\u002Fclaude-personas --skill \"api-platform:make-filter\"",{"tool":66,"command":67},"bunx","bunx skills add atournayre\u002Fclaude-personas --skill \"api-platform:make-filter\"",{"tool":69,"command":70},"pnpm","pnpm dlx skills add atournayre\u002Fclaude-personas --skill \"api-platform:make-filter\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fapi-platform\u002Fskills\u002Fmake-filter\u002FSKILL.md",true,[],[75,87,123,130,138,149],{"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":81,"publishedAt":37},"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",[],[82,83,34,36,35,84,33,85,86,32],"twig:make component","component","ux","template","php",{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":105,"publishedAt":37},"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",[93,96,99,102],{"categoryNo":94,"categoryName":95,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":97,"categoryName":98,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":100,"categoryName":101,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":103,"categoryName":104,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000032","设计师",[106,107,108,109,110,111,112,113,114,115,116,32,117,118,119,120,34,35,121,122],"test","ui","tester","ui test","tester:ui test","MCP","debug","create","update","validation","messages","plan","tool","page","find","javascript","chrome",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":129,"publishedAt":37},"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",[],[125,32,33,34,35,36],{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":37},"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",[],[132,137,32,33,34,35,36],"message",{"skillNo":139,"name":140,"nameZh":6,"description":141,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":142,"categories":143,"keywords":147,"publishedAt":37},"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",[144],{"categoryNo":145,"categoryName":146,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通",[140,36,148,32,85,33,34,35],"email",{"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":37},"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",[],[151,32,33,34,35,36,156,115],"options"]