[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSTA6Q0VRWX3PBJFBDH8HC":3,"skill-same:01M6CSTA6Q0VRWX3PBJFBDH8HC":155},{"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":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":14,"repositoryHtmlUrl":55,"repositoryHomepageUrl":56,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":58,"updatedAt":59,"install":60,"resources":73},"01M6CSTA6Q0VRWX3PBJFBDH8HC","api-platform:make-resource",null,"Génère une API Resource complète avec attribut","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-resource\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],"api","api platform:make resource","Bash","grep","read","write","edit","2026-11-10 10:12:30",false,"---\nname: api-platform:make-resource\ndescription: Génère une API Resource complète avec attribut #[ApiResource], opérations, groupes de sérialisation et configuration\nargument-hint: \u003Cnom-entité>\nmodel: sonnet\nallowed-tools: [AskUserQuestion, Bash, Read, Write, Edit, Grep, Glob, Skill]\nversion: 1.0.0\nlicense: MIT\n---\n\n# API Platform Make Resource\n\nGénère une API Resource complète pour API Platform : attribut `#[ApiResource]`, opérations CRUD, groupes de sérialisation, validation et configuration associée.\n\n## Variables\n- **{ResourceName}** - Nom de la resource en PascalCase (ex: Product)\n- **{resourceName}** - Nom en camelCase (ex: product)\n- **{namespace}** - Namespace du projet (défaut: App)\n- **{properties}** - Liste des propriétés avec types\n\n## Outputs\n- `src\u002FEntity\u002F{ResourceName}.php` (ou modification si existant)\n- `src\u002FApiResource\u002F{ResourceName}.php` (si DTO séparé)\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n### 1. Identifier la resource\n\n- Si `$ARGUMENTS` est fourni, utiliser comme nom de la resource\n- Sinon, utiliser AskUserQuestion :\n  ```\n  Question: \"Quel est le nom de la resource API à créer ?\"\n  Header: \"Resource\"\n  ```\n- Valider que le nom est en PascalCase\n- Stocker dans ResourceName\n\n### 2. Vérifier si l'entité existe déjà\n\n- Utiliser Glob pour chercher `src\u002FEntity\u002F{ResourceName}.php`\n- Si l'entité existe :\n  - Lire le fichier avec Read\n  - Proposer d'ajouter l'attribut `#[ApiResource]` à l'entité existante\n- Si l'entité n'existe pas :\n  - Demander les propriétés via AskUserQuestion\n\n### 3. Choisir la stratégie d'exposition\n\n- Utiliser AskUserQuestion :\n  ```\n  Question: \"Comment exposer la resource ?\"\n  Header: \"Stratégie\"\n  Options:\n    - \"Entité directe (Recommandé)\" : \"Attribut #[ApiResource] directement sur l'entité Doctrine\"\n    - \"DTO séparé\" : \"Classe DTO dédiée avec State Provider\u002FProcessor personnalisés\"\n  ```\n\n### 4. Choisir les opérations\n\n- Utiliser AskUserQuestion (multiSelect: true) :\n  ```\n  Question: \"Quelles opérations exposer ?\"\n  Header: \"Opérations\"\n  Options:\n    - \"CRUD complet\" : \"GetCollection, Get, Post, Put, Patch, Delete\"\n    - \"Lecture seule\" : \"GetCollection et Get uniquement\"\n    - \"Écriture seule\" : \"Post, Put, Patch, Delete uniquement\"\n    - \"Personnalisé\" : \"Sélection manuelle des opérations\"\n  ```\n\n### 5. Configurer les groupes de sérialisation\n\n- Définir les groupes standards :\n  - `{resourceName}:read` — Propriétés exposées en lecture (GET)\n  - `{resourceName}:write` — Propriétés acceptées en écriture (POST\u002FPUT\u002FPATCH)\n  - `{resourceName}:list` — Propriétés pour les collections (GetCollection)\n- Appliquer `#[Groups]` sur chaque propriété\n\n### 6. Détecter le namespace du projet\n\n- Lire `composer.json` avec Read\n- Extraire le namespace depuis `autoload.psr-4`\n- Si non trouvé, utiliser `App` par défaut\n\n### 7. Vérifier qu'API Platform est installé\n\n- Utiliser Grep pour chercher `api-platform` dans `composer.json`\n- Si non trouvé :\n  - Afficher : `Le package api-platform\u002Fcore ne semble pas installé.`\n  - Afficher : `Installation recommandée : composer require api-platform\u002Fapi-pack`\n  - Continuer la génération\n\n### 8. Générer la resource\n\n**Si entité directe :**\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\Entity;\n\nuse ApiPlatform\\Metadata\\ApiResource;\nuse ApiPlatform\\Metadata\\Delete;\nuse ApiPlatform\\Metadata\\Get;\nuse ApiPlatform\\Metadata\\GetCollection;\nuse ApiPlatform\\Metadata\\Patch;\nuse ApiPlatform\\Metadata\\Post;\nuse ApiPlatform\\Metadata\\Put;\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\Serializer\\Attribute\\Groups;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n#[ApiResource(\n    operations: [\n        new GetCollection(),\n        new Get(),\n        new Post(),\n        new Put(),\n        new Patch(),\n        new Delete(),\n    ],\n    normalizationContext: ['groups' => ['{resourceName}:read']],\n    denormalizationContext: ['groups' => ['{resourceName}:write']],\n)]\n#[ORM\\Entity]\nclass {ResourceName}\n{\n    #[ORM\\Id]\n    #[ORM\\GeneratedValue]\n    #[ORM\\Column]\n    #[Groups(['{resourceName}:read'])]\n    private ?int $id = null;\n\n    \u002F\u002F Propriétés avec #[Groups] et #[Assert\\...]\n}\n```\n\n**Si DTO séparé :**\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\ApiResource;\n\nuse ApiPlatform\\Metadata\\ApiResource;\nuse ApiPlatform\\Metadata\\Get;\nuse ApiPlatform\\Metadata\\GetCollection;\nuse {namespace}\\State\\{ResourceName}Provider;\nuse {namespace}\\State\\{ResourceName}Processor;\n\n#[ApiResource(\n    operations: [\n        new GetCollection(provider: {ResourceName}Provider::class),\n        new Get(provider: {ResourceName}Provider::class),\n    ],\n    provider: {ResourceName}Provider::class,\n    processor: {ResourceName}Processor::class,\n)]\nclass {ResourceName}\n{\n    public ?int $id = null;\n    \u002F\u002F Propriétés du DTO\n}\n```\n\n### 9. Ajouter la validation\n\n- Pour chaque propriété requise, ajouter `#[Assert\\NotBlank]`\n- Pour les strings avec longueur max, ajouter `#[Assert\\Length(max: N)]`\n- Pour les emails, ajouter `#[Assert\\Email]`\n- Pour les propriétés numériques, ajouter `#[Assert\\Positive]` si pertinent\n\n### 10. Afficher le résumé\n\n```\nResource API {ResourceName} générée\n\nFichiers créés\u002Fmodifiés :\n- src\u002FEntity\u002F{ResourceName}.php (ou src\u002FApiResource\u002F{ResourceName}.php)\n\nOpérations exposées :\n- GET    \u002Fapi\u002F{resource_names}      (collection)\n- GET    \u002Fapi\u002F{resource_names}\u002F{id} (item)\n- POST   \u002Fapi\u002F{resource_names}\n- PUT    \u002Fapi\u002F{resource_names}\u002F{id}\n- PATCH  \u002Fapi\u002F{resource_names}\u002F{id}\n- DELETE \u002Fapi\u002F{resource_names}\u002F{id}\n\nGroupes de sérialisation :\n- {resourceName}:read  — Lecture\n- {resourceName}:write — Écriture\n- {resourceName}:list  — Collection\n\nProchaines étapes :\n- Créer la migration : php bin\u002Fconsole make:migration\n- Ajouter des filtres : \u002Fapi-platform:make-filter {ResourceName}\n- Générer les tests : \u002Fapi-platform:make-test {ResourceName}\n- Configurer la sécurité : security: \"is_granted('ROLE_USER')\"\n```\n\n## Patterns appliqués\n\n### Resource\n- Attribut `#[ApiResource]` avec opérations explicites\n- Groupes de sérialisation read\u002Fwrite\u002Flist distincts\n- Validation Symfony intégrée\n- Opérations typées (Get, Post, etc.) au lieu du tableau operations legacy\n\n### Conventions API Platform\n- Utiliser les attributs PHP 8 (pas les annotations)\n- Préférer les opérations explicites aux opérations par défaut\n- Séparer les groupes de lecture et écriture\n- Ajouter la validation sur les opérations d'écriture\n\n## References\n\n- [API Resource](references\u002Fapi-resource.md) - Documentation détaillée des attributs ApiResource\n\n## Notes\n- Utiliser les attributs PHP 8.1+ (pas YAML ni XML)\n- Les opérations doivent être explicitement déclarées\n- Les groupes de sérialisation sont essentiels pour contrôler l'exposition des données\n- Penser à la sécurité : `security` sur les opérations sensibles\n","# API Platform Make Resource\n\nGénère une API Resource complète pour API Platform : attribut `#[ApiResource]`, opérations CRUD, groupes de sérialisation, validation et configuration associée.\n\n## Variables\n- **{ResourceName}** - Nom de la resource en PascalCase (ex: Product)\n- **{resourceName}** - Nom en camelCase (ex: product)\n- **{namespace}** - Namespace du projet (défaut: App)\n- **{properties}** - Liste des propriétés avec types\n\n## Outputs\n- `src\u002FEntity\u002F{ResourceName}.php` (ou modification si existant)\n- `src\u002FApiResource\u002F{ResourceName}.php` (si DTO séparé)\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n### 1. Identifier la resource\n\n- Si `$ARGUMENTS` est fourni, utiliser comme nom de la resource\n- Sinon, utiliser AskUserQuestion :\n  ```\n  Question: \"Quel est le nom de la resource API à créer ?\"\n  Header: \"Resource\"\n  ```\n- Valider que le nom est en PascalCase\n- Stocker dans ResourceName\n\n### 2. Vérifier si l'entité existe déjà\n\n- Utiliser Glob pour chercher `src\u002FEntity\u002F{ResourceName}.php`\n- Si l'entité existe :\n  - Lire le fichier avec Read\n  - Proposer d'ajouter l'attribut `#[ApiResource]` à l'entité existante\n- Si l'entité n'existe pas :\n  - Demander les propriétés via AskUserQuestion\n\n### 3. Choisir la stratégie d'exposition\n\n- Utiliser AskUserQuestion :\n  ```\n  Question: \"Comment exposer la resource ?\"\n  Header: \"Stratégie\"\n  Options:\n    - \"Entité directe (Recommandé)\" : \"Attribut #[ApiResource] directement sur l'entité Doctrine\"\n    - \"DTO séparé\" : \"Classe DTO dédiée avec State Provider\u002FProcessor personnalisés\"\n  ```\n\n### 4. Choisir les opérations\n\n- Utiliser AskUserQuestion (multiSelect: true) :\n  ```\n  Question: \"Quelles opérations exposer ?\"\n  Header: \"Opérations\"\n  Options:\n    - \"CRUD complet\" : \"GetCollection, Get, Post, Put, Patch, Delete\"\n    - \"Lecture seule\" : \"GetCollection et Get uniquement\"\n    - \"Écriture seule\" : \"Post, Put, Patch, Delete uniquement\"\n    - \"Personnalisé\" : \"Sélection manuelle des opérations\"\n  ```\n\n### 5. Configurer les groupes de sérialisation\n\n- Définir les groupes standards :\n  - `{resourceName}:read` — Propriétés exposées en lecture (GET)\n  - `{resourceName}:write` — Propriétés acceptées en écriture (POST\u002FPUT\u002FPATCH)\n  - `{resourceName}:list` — Propriétés pour les collections (GetCollection)\n- Appliquer `#[Groups]` sur chaque propriété\n\n### 6. Détecter le namespace du projet\n\n- Lire `composer.json` avec Read\n- Extraire le namespace depuis `autoload.psr-4`\n- Si non trouvé, utiliser `App` par défaut\n\n### 7. Vérifier qu'API Platform est installé\n\n- Utiliser Grep pour chercher `api-platform` dans `composer.json`\n- Si non trouvé :\n  - Afficher : `Le package api-platform\u002Fcore ne semble pas installé.`\n  - Afficher : `Installation recommandée : composer require api-platform\u002Fapi-pack`\n  - Continuer la génération\n\n### 8. Générer la resource\n\n**Si entité directe :**\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\Entity;\n\nuse ApiPlatform\\Metadata\\ApiResource;\nuse ApiPlatform\\Metadata\\Delete;\nuse ApiPlatform\\Metadata\\Get;\nuse ApiPlatform\\Metadata\\GetCollection;\nuse ApiPlatform\\Metadata\\Patch;\nuse ApiPlatform\\Metadata\\Post;\nuse ApiPlatform\\Metadata\\Put;\nuse Doctrine\\ORM\\Mapping as ORM;\nuse Symfony\\Component\\Serializer\\Attribute\\Groups;\nuse Symfony\\Component\\Validator\\Constraints as Assert;\n\n#[ApiResource(\n    operations: [\n        new GetCollection(),\n        new Get(),\n        new Post(),\n        new Put(),\n        new Patch(),\n        new Delete(),\n    ],\n    normalizationContext: ['groups' => ['{resourceName}:read']],\n    denormalizationContext: ['groups' => ['{resourceName}:write']],\n)]\n#[ORM\\Entity]\nclass {ResourceName}\n{\n    #[ORM\\Id]\n    #[ORM\\GeneratedValue]\n    #[ORM\\Column]\n    #[Groups(['{resourceName}:read'])]\n    private ?int $id = null;\n\n    \u002F\u002F Propriétés avec #[Groups] et #[Assert\\...]\n}\n```\n\n**Si DTO séparé :**\n\n```php\n\u003C?php\n\ndeclare(strict_types=1);\n\nnamespace {namespace}\\ApiResource;\n\nuse ApiPlatform\\Metadata\\ApiResource;\nuse ApiPlatform\\Metadata\\Get;\nuse ApiPlatform\\Metadata\\GetCollection;\nuse {namespace}\\State\\{ResourceName}Provider;\nuse {namespace}\\State\\{ResourceName}Processor;\n\n#[ApiResource(\n    operations: [\n        new GetCollection(provider: {ResourceName}Provider::class),\n        new Get(provider: {ResourceName}Provider::class),\n    ],\n    provider: {ResourceName}Provider::class,\n    processor: {ResourceName}Processor::class,\n)]\nclass {ResourceName}\n{\n    public ?int $id = null;\n    \u002F\u002F Propriétés du DTO\n}\n```\n\n### 9. Ajouter la validation\n\n- Pour chaque propriété requise, ajouter `#[Assert\\NotBlank]`\n- Pour les strings avec longueur max, ajouter `#[Assert\\Length(max: N)]`\n- Pour les emails, ajouter `#[Assert\\Email]`\n- Pour les propriétés numériques, ajouter `#[Assert\\Positive]` si pertinent\n\n### 10. Afficher le résumé\n\n```\nResource API {ResourceName} générée\n\nFichiers créés\u002Fmodifiés :\n- src\u002FEntity\u002F{ResourceName}.php (ou src\u002FApiResource\u002F{ResourceName}.php)\n\nOpérations exposées :\n- GET    \u002Fapi\u002F{resource_names}      (collection)\n- GET    \u002Fapi\u002F{resource_names}\u002F{id} (item)\n- POST   \u002Fapi\u002F{resource_names}\n- PUT    \u002Fapi\u002F{resource_names}\u002F{id}\n- PATCH  \u002Fapi\u002F{resource_names}\u002F{id}\n- DELETE \u002Fapi\u002F{resource_names}\u002F{id}\n\nGroupes de sérialisation :\n- {resourceName}:read  — Lecture\n- {resourceName}:write — Écriture\n- {resourceName}:list  — Collection\n\nProchaines étapes :\n- Créer la migration : php bin\u002Fconsole make:migration\n- Ajouter des filtres : \u002Fapi-platform:make-filter {ResourceName}\n- Générer les tests : \u002Fapi-platform:make-test {ResourceName}\n- Configurer la sécurité : security: \"is_granted('ROLE_USER')\"\n```\n\n## Patterns appliqués\n\n### Resource\n- Attribut `#[ApiResource]` avec opérations explicites\n- Groupes de sérialisation read\u002Fwrite\u002Flist distincts\n- Validation Symfony intégrée\n- Opérations typées (Get, Post, etc.) au lieu du tableau operations legacy\n\n### Conventions API Platform\n- Utiliser les attributs PHP 8 (pas les annotations)\n- Préférer les opérations explicites aux opérations par défaut\n- Séparer les groupes de lecture et écriture\n- Ajouter la validation sur les opérations d'écriture\n\n## References\n\n- [API Resource](references\u002Fapi-resource.md) - Documentation détaillée des attributs ApiResource\n\n## Notes\n- Utiliser les attributs PHP 8.1+ (pas YAML ni XML)\n- Les opérations doivent être explicitement déclarées\n- Les groupes de sérialisation sont essentiels pour contrôler l'exposition des données\n- Penser à la sécurité : `security` sur les opérations sensibles\n",{"name":5,"model":41,"license":15,"version":42,"description":7,"allowed-tools":43,"argument-hint":51},"sonnet","1.0.0",[44,31,45,46,47,48,49,50],"AskUserQuestion","Read","Write","Edit","Grep","Glob","Skill","\u003Cnom-entité>","main","bb0335112ea0991dc1dc6a29fa5a861397a5a6f6","api-platform\u002Fskills\u002Fmake-resource","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-resource\"",{"tool":66,"command":67},"bunx","bunx skills add atournayre\u002Fclaude-personas --skill \"api-platform:make-resource\"",{"tool":69,"command":70},"pnpm","pnpm dlx skills add atournayre\u002Fclaude-personas --skill \"api-platform:make-resource\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fapi-platform\u002Fskills\u002Fmake-resource\u002FSKILL.md",true,[74,79,85,89,93,97,101,105,111,115,119,123,127,131,135,139,143,147,151],{"path":75,"resourceType":75,"resourceTypeDesc":76,"sizeBytes":77,"sourceHtmlUrl":78},"LICENSE","许可证",1065,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002FLICENSE",{"path":80,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":83,"sourceHtmlUrl":84},"references\u002Fapi-resource.md","REFERENCE","参考文档",7427,"https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fapi-platform\u002Fskills\u002Fmake-resource\u002Freferences\u002Fapi-resource.md",{"path":86,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":87,"sourceHtmlUrl":88},"references\u002Fdomain-qa.md",10889,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Freferences\u002Fdomain-qa.md",{"path":90,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":91,"sourceHtmlUrl":92},"references\u002Fhtml-report.md",8119,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Freferences\u002Fhtml-report.md",{"path":94,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":95,"sourceHtmlUrl":96},"references\u002Freport-example.html",14395,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Freferences\u002Freport-example.html",{"path":98,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":99,"sourceHtmlUrl":100},"references\u002Freport-example.json",3866,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Freferences\u002Freport-example.json",{"path":102,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":103,"sourceHtmlUrl":104},"references\u002Freport-example.md",2272,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Freferences\u002Freport-example.md",{"path":106,"resourceType":107,"resourceTypeDesc":108,"sizeBytes":109,"sourceHtmlUrl":110},"scripts\u002Facquire-official-artifact.mjs","SCRIPT","脚本",7440,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Fscripts\u002Facquire-official-artifact.mjs",{"path":112,"resourceType":107,"resourceTypeDesc":108,"sizeBytes":113,"sourceHtmlUrl":114},"scripts\u002Facquire-official-artifact.test.mjs",6943,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Fscripts\u002Facquire-official-artifact.test.mjs",{"path":116,"resourceType":107,"resourceTypeDesc":108,"sizeBytes":117,"sourceHtmlUrl":118},"scripts\u002Ffinalize-qa.mjs",8946,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Fscripts\u002Ffinalize-qa.mjs",{"path":120,"resourceType":107,"resourceTypeDesc":108,"sizeBytes":121,"sourceHtmlUrl":122},"scripts\u002Ffinalize-qa.test.mjs",14255,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Fscripts\u002Ffinalize-qa.test.mjs",{"path":124,"resourceType":107,"resourceTypeDesc":108,"sizeBytes":125,"sourceHtmlUrl":126},"scripts\u002Frender-report.mjs",27511,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Fscripts\u002Frender-report.mjs",{"path":128,"resourceType":107,"resourceTypeDesc":108,"sizeBytes":129,"sourceHtmlUrl":130},"scripts\u002Frender-report.test.mjs",13159,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Fscripts\u002Frender-report.test.mjs",{"path":132,"resourceType":107,"resourceTypeDesc":108,"sizeBytes":133,"sourceHtmlUrl":134},"scripts\u002Freselect-qa.mjs",3910,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Fscripts\u002Freselect-qa.mjs",{"path":136,"resourceType":107,"resourceTypeDesc":108,"sizeBytes":137,"sourceHtmlUrl":138},"scripts\u002Fresolve-scope.mjs",13005,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Fscripts\u002Fresolve-scope.mjs",{"path":140,"resourceType":107,"resourceTypeDesc":108,"sizeBytes":141,"sourceHtmlUrl":142},"scripts\u002Fresolve-scope.test.mjs",15133,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Fscripts\u002Fresolve-scope.test.mjs",{"path":144,"resourceType":107,"resourceTypeDesc":108,"sizeBytes":145,"sourceHtmlUrl":146},"scripts\u002Fwrite-new-file.mjs",249,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002Fscripts\u002Fwrite-new-file.mjs",{"path":148,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":149,"sourceHtmlUrl":150},"SOURCE.md",358,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002FSOURCE.md",{"path":152,"resourceType":81,"resourceTypeDesc":82,"sizeBytes":153,"sourceHtmlUrl":154},"TRUST.auto.yaml",2264,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-qa\u002FTRUST.auto.yaml",[156,168,204,211,219,230],{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":162,"publishedAt":36},"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",[],[163,164,33,35,34,165,32,166,167,31],"twig:make component","component","ux","template","php",{"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":186,"publishedAt":36},"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",[174,177,180,183],{"categoryNo":175,"categoryName":176,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":178,"categoryName":179,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":181,"categoryName":182,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":184,"categoryName":185,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000032","设计师",[187,188,189,190,191,192,193,194,195,196,197,31,198,199,200,201,33,34,202,203],"test","ui","tester","ui test","tester:ui test","MCP","debug","create","update","validation","messages","plan","tool","page","find","javascript","chrome",{"skillNo":205,"name":206,"nameZh":6,"description":207,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":208,"categories":209,"keywords":210,"publishedAt":36},"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",[],[206,31,32,33,34,35],{"skillNo":212,"name":213,"nameZh":6,"description":214,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":215,"categories":216,"keywords":217,"publishedAt":36},"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",[],[213,218,31,32,33,34,35],"message",{"skillNo":220,"name":221,"nameZh":6,"description":222,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":223,"categories":224,"keywords":228,"publishedAt":36},"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",[225],{"categoryNo":226,"categoryName":227,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通",[221,35,229,31,166,32,33,34],"email",{"skillNo":231,"name":232,"nameZh":6,"description":233,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":234,"categories":235,"keywords":236,"publishedAt":36},"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",[],[232,31,32,33,34,35,237,196],"options"]