[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSZPR0W1K1S9BX3247CZJ1":3,"skill-same:01M6CSZPR0W1K1S9BX3247CZJ1":71},{"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":29,"linkOnly":30,"markdownContent":31,"markdownBody":32,"frontMatter":33,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":14,"repositoryHtmlUrl":46,"repositoryHomepageUrl":47,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":49,"updatedAt":50,"install":51,"resources":64},"01M6CSZPR0W1K1S9BX3247CZJ1","twig:make-component",null,"Génère un Twig Component Symfony UX (classe PHP + template Twig)","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\u002Ftwig\u002Fskills\u002Fmake-component\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28],"component","twig:make component","ux","Bash","php","template","grep","read","write","edit","2026-11-10 10:12:30",false,"---\nname: twig:make-component\ndescription: Génère un Twig Component Symfony UX (classe PHP + template Twig)\nmodel: sonnet\nallowed-tools: [AskUserQuestion, Bash, Read, Write, Edit, Grep, Glob]\nversion: 1.0.0\nlicense: MIT\n---\n\n# Twig Make Component Skill\n\nGénère un Twig Component Symfony UX complet : classe PHP avec attribut `#[AsTwigComponent]` et template Twig associé.\n\n## Variables\n- **{ComponentName}** - Nom du composant en PascalCase (ex: AlertMessage)\n- **{componentName}** - Nom du composant en snake_case pour le template (ex: alert_message)\n- **{namespace}** - Namespace du projet (défaut: App)\n- **{props}** - Liste des propriétés\u002Fprops (name:type,...)\n- **{type}** - Type de composant : standard ou anonymous\n\n## Outputs (composant standard)\n- `src\u002FTwig\u002FComponents\u002F{ComponentName}.php`\n- `templates\u002Fcomponents\u002F{ComponentName}.html.twig`\n\n## Outputs (composant anonymous)\n- `templates\u002Fcomponents\u002F{ComponentName}.html.twig`\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n### 1. Demander le nom du composant\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quel est le nom du composant Twig à créer ?\"\n  Header: \"Composant\"\n  ```\n- Valide que le nom est en PascalCase (première lettre majuscule)\n- Stocke dans ComponentName\n- Génère componentName = ComponentName converti en snake_case (ex: AlertMessage → alert_message)\n- Si le nom contient `:` (ex: `Form:Input`), il représente un sous-répertoire :\n  - Classe PHP : `src\u002FTwig\u002FComponents\u002FForm\u002FInput.php`\n  - Template : `templates\u002Fcomponents\u002FForm\u002FInput.html.twig`\n\n### 2. Demander le type de composant\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quel type de composant voulez-vous créer ?\"\n  Header: \"Type\"\n  Options:\n    - \"Standard (Recommandé)\" : \"Classe PHP + template Twig — composant complet avec logique métier\"\n    - \"Anonymous\" : \"Template Twig seul — composant purement visuel sans logique PHP\"\n  ```\n- Si anonymous : passer directement à l'étape 5 (template uniquement)\n\n### 3. Demander les props du composant\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quelles sont les props du composant ? Format: label:string,type:string,icon:?string (préfixer par ? pour nullable). Laisser vide si aucune.\"\n  Header: \"Props\"\n  ```\n- Parse la liste des propriétés\n- Pour chaque propriété, extrais :\n  - Le nom (camelCase)\n  - Le type PHP (string, int, bool, float, array, ?string pour nullable)\n  - Si nullable (préfixé par ?)\n\n### 4. Demander les options avancées\n\n- Utilise AskUserQuestion (multiSelect: true) pour demander :\n  ```\n  Question: \"Quelles options activer pour ce composant ?\"\n  Header: \"Options\"\n  Options:\n    - \"mount()\" : \"Méthode d'initialisation appelée à la création du composant\"\n    - \"Computed properties\" : \"Propriétés calculées accessibles via computed.xxx dans le template\"\n    - \"Slots (blocks)\" : \"Blocs enfants pour la composition de contenu\"\n  ```\n\n### 5. Détecter le namespace du projet\n\n- Lis `composer.json` avec Read\n- Extrais le namespace depuis `autoload.psr-4`\n- Si non trouvé, utilise `App` par défaut\n\n### 6. Vérifier que le bundle est installé\n\n- Exécute `grep -q \"ux-twig-component\" composer.json` avec Bash\n- Si non trouvé :\n  - Affiche : `⚠️  Le package symfony\u002Fux-twig-component ne semble pas installé.`\n  - Affiche : `➡️  Installation recommandée : composer require symfony\u002Fux-twig-component`\n  - Continue la génération malgré tout\n\n### 7. Générer la classe PHP (composant standard uniquement)\n\n- Créé le fichier `src\u002FTwig\u002FComponents\u002F{ComponentName}.php` avec Write\n- Structure de classe :\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\Twig\\Components;\n\nuse Symfony\\UX\\TwigComponent\\Attribute\\AsTwigComponent;\n\n#[AsTwigComponent]\nfinal class {ComponentName}\n{\n    \u002F\u002F Props publiques (données passées au composant)\n    public string $label;\n    public string $type = 'default';\n\n    \u002F\u002F Si mount() demandé :\n    public function mount(\u002F* params *\u002F): void\n    {\n        \u002F\u002F Initialisation\n    }\n\n    \u002F\u002F Si computed properties demandées :\n    public function getFormattedLabel(): string\n    {\n        return strtoupper($this->label);\n    }\n}\n```\n\n**Règles de génération de la classe :**\n- Classe `final` (pas de `readonly` — incompatible avec TwigComponent)\n- Attribut `#[AsTwigComponent]` sans argument si le nom du composant correspond au nom de la classe\n- Props déclarées comme propriétés `public`\n- Les props avec valeur par défaut doivent avoir une valeur d'initialisation\n- Les props nullable doivent être typées `?type` et initialisées à `null`\n- Ne PAS utiliser de constructeur pour les props — TwigComponent les assigne après instanciation\n- Si `mount()` est demandé : ajouter la méthode avec les paramètres qui ne correspondent pas directement à des propriétés\n- Si computed properties : ajouter des méthodes `get{PropertyName}()` avec le type de retour approprié\n- Pas de `readonly` sur les propriétés — TwigComponent doit pouvoir les modifier après instanciation\n\n### 8. Générer le template Twig\n\n- Créé le fichier `templates\u002Fcomponents\u002F{ComponentName}.html.twig` avec Write\n\n**Template pour composant standard :**\n```twig\n\u003Cdiv{{ attributes }}>\n    {# Props disponibles via this.propName #}\n    {# Computed via computed.methodName #}\n\n    {% if slots demandés %}\n    {% block content %}{% endblock %}\n    {% endif %}\n\u003C\u002Fdiv>\n```\n\n**Template pour composant anonymous :**\n```twig\n{% props label, type = 'default' %}\n\n\u003Cdiv{{ attributes }}>\n    {{ label }}\n\u003C\u002Fdiv>\n```\n\n**Règles de génération du template :**\n- Toujours inclure `{{ attributes }}` sur l'élément racine pour supporter les attributs HTML passés au composant\n- Les props du composant standard sont accessibles via `{{ this.propName }}`\n- Les computed properties sont accessibles via `{{ computed.methodName }}`\n- Pour les composants anonymous : utiliser `{% props %}` pour déclarer les props avec valeurs par défaut\n- Si slots\u002Fblocks demandés : ajouter `{% block content %}{% endblock %}` pour le contenu enfant\n- Si le composant a des props nullable : utiliser `{% if this.propName %}` pour les affichages conditionnels\n\n### 9. Afficher le résumé\n\nAffiche :\n```\n✅ Composant {ComponentName} généré avec succès\n\nFichiers créés :\n- src\u002FTwig\u002FComponents\u002F{ComponentName}.php  (si standard)\n- templates\u002Fcomponents\u002F{ComponentName}.html.twig\n\nProps :\n{liste des propriétés avec types}\n\nUtilisation dans un template Twig :\n  \u003Ctwig:{ComponentName} label=\"Mon texte\" type=\"primary\" \u002F>\n\n  Avec contenu (si slots) :\n  \u003Ctwig:{ComponentName} label=\"Mon texte\">\n      \u003Cp>Contenu enfant\u003C\u002Fp>\n  \u003C\u002Ftwig:{ComponentName}>\n\nProchaines étapes :\n- Ajouter la logique métier dans la classe PHP\n- Personnaliser le template Twig\n- Utiliser computed.xxx pour les propriétés calculées\n```\n\n## Patterns appliqués\n\n### Classe PHP\n- Classe `final` (jamais `readonly`)\n- Attribut `#[AsTwigComponent]`\n- Props publiques (pas de getters\u002Fsetters pour les props)\n- Pas de constructeur pour l'injection de props\n- `mount()` pour l'initialisation complexe\n- Méthodes `get*()` pour les computed properties\n\n### Template Twig\n- `{{ attributes }}` sur l'élément racine\n- Syntaxe HTML `\u003Ctwig:ComponentName>` pour l'utilisation\n- `{% block content %}{% endblock %}` pour les slots\n- `{{ computed.xxx }}` pour les propriétés calculées (appel unique, mis en cache)\n\n### Composant anonymous\n- Template seul, sans classe PHP\n- `{% props %}` pour déclarer les props\n- Idéal pour les composants purement visuels\n\n## References\n\n- [Twig Component](references\u002Ftwig-component.md) - Documentation détaillée Symfony UX Twig Component\n\n## Notes\n- Ne JAMAIS utiliser `readonly` sur la classe ou les propriétés du composant\n- Les props sont assignées après instanciation par TwigComponent\n- Préférer les computed properties (`computed.xxx`) aux appels multiples de méthodes dans le template\n- Un composant doit être isolé : il ne doit pas dépendre du contexte de la page\n- Les props circulent dans un seul sens : parent → enfant\n","# Twig Make Component Skill\n\nGénère un Twig Component Symfony UX complet : classe PHP avec attribut `#[AsTwigComponent]` et template Twig associé.\n\n## Variables\n- **{ComponentName}** - Nom du composant en PascalCase (ex: AlertMessage)\n- **{componentName}** - Nom du composant en snake_case pour le template (ex: alert_message)\n- **{namespace}** - Namespace du projet (défaut: App)\n- **{props}** - Liste des propriétés\u002Fprops (name:type,...)\n- **{type}** - Type de composant : standard ou anonymous\n\n## Outputs (composant standard)\n- `src\u002FTwig\u002FComponents\u002F{ComponentName}.php`\n- `templates\u002Fcomponents\u002F{ComponentName}.html.twig`\n\n## Outputs (composant anonymous)\n- `templates\u002Fcomponents\u002F{ComponentName}.html.twig`\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n### 1. Demander le nom du composant\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quel est le nom du composant Twig à créer ?\"\n  Header: \"Composant\"\n  ```\n- Valide que le nom est en PascalCase (première lettre majuscule)\n- Stocke dans ComponentName\n- Génère componentName = ComponentName converti en snake_case (ex: AlertMessage → alert_message)\n- Si le nom contient `:` (ex: `Form:Input`), il représente un sous-répertoire :\n  - Classe PHP : `src\u002FTwig\u002FComponents\u002FForm\u002FInput.php`\n  - Template : `templates\u002Fcomponents\u002FForm\u002FInput.html.twig`\n\n### 2. Demander le type de composant\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quel type de composant voulez-vous créer ?\"\n  Header: \"Type\"\n  Options:\n    - \"Standard (Recommandé)\" : \"Classe PHP + template Twig — composant complet avec logique métier\"\n    - \"Anonymous\" : \"Template Twig seul — composant purement visuel sans logique PHP\"\n  ```\n- Si anonymous : passer directement à l'étape 5 (template uniquement)\n\n### 3. Demander les props du composant\n\n- Utilise AskUserQuestion pour demander :\n  ```\n  Question: \"Quelles sont les props du composant ? Format: label:string,type:string,icon:?string (préfixer par ? pour nullable). Laisser vide si aucune.\"\n  Header: \"Props\"\n  ```\n- Parse la liste des propriétés\n- Pour chaque propriété, extrais :\n  - Le nom (camelCase)\n  - Le type PHP (string, int, bool, float, array, ?string pour nullable)\n  - Si nullable (préfixé par ?)\n\n### 4. Demander les options avancées\n\n- Utilise AskUserQuestion (multiSelect: true) pour demander :\n  ```\n  Question: \"Quelles options activer pour ce composant ?\"\n  Header: \"Options\"\n  Options:\n    - \"mount()\" : \"Méthode d'initialisation appelée à la création du composant\"\n    - \"Computed properties\" : \"Propriétés calculées accessibles via computed.xxx dans le template\"\n    - \"Slots (blocks)\" : \"Blocs enfants pour la composition de contenu\"\n  ```\n\n### 5. Détecter le namespace du projet\n\n- Lis `composer.json` avec Read\n- Extrais le namespace depuis `autoload.psr-4`\n- Si non trouvé, utilise `App` par défaut\n\n### 6. Vérifier que le bundle est installé\n\n- Exécute `grep -q \"ux-twig-component\" composer.json` avec Bash\n- Si non trouvé :\n  - Affiche : `⚠️  Le package symfony\u002Fux-twig-component ne semble pas installé.`\n  - Affiche : `➡️  Installation recommandée : composer require symfony\u002Fux-twig-component`\n  - Continue la génération malgré tout\n\n### 7. Générer la classe PHP (composant standard uniquement)\n\n- Créé le fichier `src\u002FTwig\u002FComponents\u002F{ComponentName}.php` avec Write\n- Structure de classe :\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\Twig\\Components;\n\nuse Symfony\\UX\\TwigComponent\\Attribute\\AsTwigComponent;\n\n#[AsTwigComponent]\nfinal class {ComponentName}\n{\n    \u002F\u002F Props publiques (données passées au composant)\n    public string $label;\n    public string $type = 'default';\n\n    \u002F\u002F Si mount() demandé :\n    public function mount(\u002F* params *\u002F): void\n    {\n        \u002F\u002F Initialisation\n    }\n\n    \u002F\u002F Si computed properties demandées :\n    public function getFormattedLabel(): string\n    {\n        return strtoupper($this->label);\n    }\n}\n```\n\n**Règles de génération de la classe :**\n- Classe `final` (pas de `readonly` — incompatible avec TwigComponent)\n- Attribut `#[AsTwigComponent]` sans argument si le nom du composant correspond au nom de la classe\n- Props déclarées comme propriétés `public`\n- Les props avec valeur par défaut doivent avoir une valeur d'initialisation\n- Les props nullable doivent être typées `?type` et initialisées à `null`\n- Ne PAS utiliser de constructeur pour les props — TwigComponent les assigne après instanciation\n- Si `mount()` est demandé : ajouter la méthode avec les paramètres qui ne correspondent pas directement à des propriétés\n- Si computed properties : ajouter des méthodes `get{PropertyName}()` avec le type de retour approprié\n- Pas de `readonly` sur les propriétés — TwigComponent doit pouvoir les modifier après instanciation\n\n### 8. Générer le template Twig\n\n- Créé le fichier `templates\u002Fcomponents\u002F{ComponentName}.html.twig` avec Write\n\n**Template pour composant standard :**\n```twig\n\u003Cdiv{{ attributes }}>\n    {# Props disponibles via this.propName #}\n    {# Computed via computed.methodName #}\n\n    {% if slots demandés %}\n    {% block content %}{% endblock %}\n    {% endif %}\n\u003C\u002Fdiv>\n```\n\n**Template pour composant anonymous :**\n```twig\n{% props label, type = 'default' %}\n\n\u003Cdiv{{ attributes }}>\n    {{ label }}\n\u003C\u002Fdiv>\n```\n\n**Règles de génération du template :**\n- Toujours inclure `{{ attributes }}` sur l'élément racine pour supporter les attributs HTML passés au composant\n- Les props du composant standard sont accessibles via `{{ this.propName }}`\n- Les computed properties sont accessibles via `{{ computed.methodName }}`\n- Pour les composants anonymous : utiliser `{% props %}` pour déclarer les props avec valeurs par défaut\n- Si slots\u002Fblocks demandés : ajouter `{% block content %}{% endblock %}` pour le contenu enfant\n- Si le composant a des props nullable : utiliser `{% if this.propName %}` pour les affichages conditionnels\n\n### 9. Afficher le résumé\n\nAffiche :\n```\n✅ Composant {ComponentName} généré avec succès\n\nFichiers créés :\n- src\u002FTwig\u002FComponents\u002F{ComponentName}.php  (si standard)\n- templates\u002Fcomponents\u002F{ComponentName}.html.twig\n\nProps :\n{liste des propriétés avec types}\n\nUtilisation dans un template Twig :\n  \u003Ctwig:{ComponentName} label=\"Mon texte\" type=\"primary\" \u002F>\n\n  Avec contenu (si slots) :\n  \u003Ctwig:{ComponentName} label=\"Mon texte\">\n      \u003Cp>Contenu enfant\u003C\u002Fp>\n  \u003C\u002Ftwig:{ComponentName}>\n\nProchaines étapes :\n- Ajouter la logique métier dans la classe PHP\n- Personnaliser le template Twig\n- Utiliser computed.xxx pour les propriétés calculées\n```\n\n## Patterns appliqués\n\n### Classe PHP\n- Classe `final` (jamais `readonly`)\n- Attribut `#[AsTwigComponent]`\n- Props publiques (pas de getters\u002Fsetters pour les props)\n- Pas de constructeur pour l'injection de props\n- `mount()` pour l'initialisation complexe\n- Méthodes `get*()` pour les computed properties\n\n### Template Twig\n- `{{ attributes }}` sur l'élément racine\n- Syntaxe HTML `\u003Ctwig:ComponentName>` pour l'utilisation\n- `{% block content %}{% endblock %}` pour les slots\n- `{{ computed.xxx }}` pour les propriétés calculées (appel unique, mis en cache)\n\n### Composant anonymous\n- Template seul, sans classe PHP\n- `{% props %}` pour déclarer les props\n- Idéal pour les composants purement visuels\n\n## References\n\n- [Twig Component](references\u002Ftwig-component.md) - Documentation détaillée Symfony UX Twig Component\n\n## Notes\n- Ne JAMAIS utiliser `readonly` sur la classe ou les propriétés du composant\n- Les props sont assignées après instanciation par TwigComponent\n- Préférer les computed properties (`computed.xxx`) aux appels multiples de méthodes dans le template\n- Un composant doit être isolé : il ne doit pas dépendre du contexte de la page\n- Les props circulent dans un seul sens : parent → enfant\n",{"name":5,"model":34,"license":15,"version":35,"description":7,"allowed-tools":36},"sonnet","1.0.0",[37,22,38,39,40,41,42],"AskUserQuestion","Read","Write","Edit","Grep","Glob","main","bb0335112ea0991dc1dc6a29fa5a861397a5a6f6","twig\u002Fskills\u002Fmake-component","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":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add atournayre\u002Fclaude-personas --skill \"twig:make-component\"",{"tool":57,"command":58},"bunx","bunx skills add atournayre\u002Fclaude-personas --skill \"twig:make-component\"",{"tool":60,"command":61},"pnpm","pnpm dlx skills add atournayre\u002Fclaude-personas --skill \"twig:make-component\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Ftwig\u002Fskills\u002Fmake-component\u002FSKILL.md",true,[65],{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"references\u002Ftwig-component.md","REFERENCE","参考文档",9165,"https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Ftwig\u002Fskills\u002Fmake-component\u002Freferences\u002Ftwig-component.md",[72,112,119,127,138,146],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":94,"publishedAt":29},"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",[78,83,86,89],{"categoryNo":79,"categoryName":80,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":84,"categoryName":85,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":87,"categoryName":88,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":90,"categoryName":91,"taxonomyType":92,"taxonomyTypeDesc":93},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[95,96,97,98,99,100,101,102,103,104,105,106,107,22,108,109,110,111,26,27],"tester:ui test","ui test","tester","ui","test","messages","MCP","chrome","javascript","debug","create","update","validation","plan","tool","page","find",{"skillNo":113,"name":114,"nameZh":6,"description":115,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":118,"publishedAt":29},"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",[],[114,28,27,22,25,26],{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":29},"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",[],[126,121,22,25,26,27,28],"message",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":136,"publishedAt":29},"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",[133],{"categoryNo":134,"categoryName":135,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000005","邮件与沟通",[129,137,22,24,25,26,27,28],"email",{"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":144,"publishedAt":29},"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",[],[140,107,25,28,145,26,27,22],"options",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":29},"01M6CSZ73A0RY9G0WY091HJGYV","symfony:event","Genere un Event Symfony + EventSubscriber ou EventListener","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fevent\u002FSKILL.md",[],[148,28,27,26,25,22]]