[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSSXVHKHXB8RAZSWFAVDXN":3,"skill-same:01M6CSSXVHKHXB8RAZSWFAVDXN":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":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":14,"repositoryHtmlUrl":49,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":52,"updatedAt":53,"install":54,"resources":67},"01M6CSSXVHKHXB8RAZSWFAVDXN","api-platform:audit",null,"Audite un projet API Platform existant et produit un rapport de bonnes pratiques, performances et sécurité","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\u002Faudit\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],"audit","api","api platform:audit","Bash","grep","read","2026-11-10 10:12:30",false,"---\nname: api-platform:audit\ndescription: Audite un projet API Platform existant et produit un rapport de bonnes pratiques, performances et sécurité\nmodel: sonnet\nallowed-tools: [Read, Grep, Glob, Bash]\nversion: 1.0.0\nlicense: MIT\n---\n\n# API Platform Audit\n\nAudite un projet API Platform existant pour vérifier les bonnes pratiques, la sécurité, les performances et la cohérence de configuration.\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n### 1. Détecter la configuration API Platform\n\n- Vérifier `composer.json` pour la version d'API Platform installée\n- Chercher la configuration dans `config\u002Fpackages\u002Fapi_platform.yaml` ou `config\u002Fpackages\u002Fapi_platform.php`\n- Identifier le format de configuration utilisé (attributs PHP, YAML, XML)\n\n### 2. Inventorier les resources API\n\n- Chercher tous les fichiers avec `#[ApiResource]` via Grep\n- Chercher les configurations YAML\u002FXML si utilisées\n- Pour chaque resource, noter :\n  - Opérations exposées\n  - Groupes de sérialisation\n  - Filtres configurés\n  - Configuration de sécurité\n  - State providers\u002Fprocessors personnalisés\n\n### 3. Audit des bonnes pratiques\n\nVérifier pour chaque resource :\n\n**Configuration :**\n- [ ] Opérations explicitement déclarées (pas les opérations par défaut implicites)\n- [ ] Groupes de sérialisation configurés (read\u002Fwrite séparés)\n- [ ] Pagination configurée (pas de pagination désactivée sans raison)\n- [ ] Format de réponse cohérent (JSON-LD, JSON:API, HAL)\n\n**Sécurité :**\n- [ ] Attribut `security` défini sur les opérations sensibles (POST, PUT, PATCH, DELETE)\n- [ ] Pas d'exposition de données sensibles (mots de passe, tokens, données internes)\n- [ ] Validation configurée sur les opérations d'écriture\n- [ ] CORS correctement configuré (`nelmio_cors`)\n- [ ] Rate limiting si exposé publiquement\n\n**Performances :**\n- [ ] HTTP caching configuré (Cache-Control, ETag, Vary)\n- [ ] Eager loading pour éviter les requêtes N+1 (forceEager, fetchEager)\n- [ ] Index Doctrine sur les colonnes filtrées\u002Ftriées\n- [ ] Pagination activée avec une taille de page raisonnable (pas de `pagination_enabled: false` sur de grandes collections)\n- [ ] Groupes de sérialisation limitant les données retournées\n\n**Architecture :**\n- [ ] DTOs utilisés quand la représentation diffère de l'entité\n- [ ] State Providers\u002FProcessors pour la logique métier complexe\n- [ ] Pas de logique métier dans les entités Doctrine\n- [ ] Extensions Doctrine pour le filtrage global (soft delete, tenant)\n\n### 4. Audit de la configuration globale\n\nVérifier dans `config\u002Fpackages\u002Fapi_platform.yaml` :\n\n```yaml\napi_platform:\n    title: 'Mon API'                    # Titre défini\n    version: '1.0.0'                    # Version définie\n    formats:                            # Formats explicites\n        jsonld: ['application\u002Fld+json']\n    defaults:\n        pagination_items_per_page: 30   # Pagination par défaut raisonnable\n        pagination_client_enabled: true # Contrôle client de la pagination\n    mapping:\n        paths: ['%kernel.project_dir%\u002Fsrc\u002FEntity']\n```\n\n### 5. Audit des tests\n\n- Chercher les tests API dans `tests\u002F` avec Grep\n- Vérifier la couverture de tests :\n  - [ ] Tests pour chaque resource exposée\n  - [ ] Tests de validation\n  - [ ] Tests de sécurité (accès non autorisé)\n  - [ ] Tests de filtres\n\n### 6. Audit des dépendances\n\n- Vérifier les versions des packages API Platform dans `composer.lock`\n- Identifier les versions obsolètes\n- Vérifier la compatibilité entre packages\n\n### 7. Produire le rapport d'audit\n\nGénérer un rapport structuré :\n\n```\n## Rapport d'audit API Platform\n\n### Résumé\n- Resources API : {nombre}\n- Opérations totales : {nombre}\n- Score global : {score}\u002F100\n\n### Resources auditées\n| Resource | Opérations | Sécurité | Sérialisation | Filtres | Tests |\n|----------|-----------|----------|---------------|---------|-------|\n| Product  | 6\u002F6       | OK       | OK            | 3       | Oui   |\n| User     | 4\u002F6       | WARN     | MISSING       | 0       | Non   |\n\n### Problèmes critiques\n1. [CRITIQUE] Resource User sans sécurité sur POST\n2. [CRITIQUE] Mot de passe exposé dans la sérialisation User\n\n### Avertissements\n1. [WARN] Pas de groupes de sérialisation sur Product\n2. [WARN] Pagination désactivée sur LargeCollection\n\n### Recommandations\n1. Ajouter security: \"is_granted('ROLE_ADMIN')\" sur User POST\n2. Ajouter #[Groups(['user:read'])] et exclure le mot de passe\n3. Configurer le HTTP caching pour les resources en lecture seule\n\n### Couverture de tests\n- Resources testées : {x}\u002F{total}\n- Tests manquants : {liste}\n\n### Versions\n- api-platform\u002Fcore: {version} (dernière: {dernière})\n- symfony\u002Fframework-bundle: {version}\n```\n\n## Critères d'audit\n\n### Score de sécurité (sur 40)\n| Critère | Points |\n|---------|--------|\n| Security sur opérations d'écriture | 15 |\n| Pas de données sensibles exposées | 10 |\n| Validation sur les inputs | 10 |\n| CORS configuré | 5 |\n\n### Score de qualité (sur 30)\n| Critère | Points |\n|---------|--------|\n| Groupes de sérialisation | 10 |\n| Opérations explicites | 10 |\n| DTOs quand nécessaire | 5 |\n| Documentation OpenAPI | 5 |\n\n### Score de performance (sur 15)\n| Critère | Points |\n|---------|--------|\n| HTTP caching | 5 |\n| Pagination configurée | 5 |\n| Pas de N+1 queries | 5 |\n\n### Score de tests (sur 15)\n| Critère | Points |\n|---------|--------|\n| Couverture des resources | 10 |\n| Tests de sécurité | 5 |\n\n## Notes\n- L'audit est en lecture seule, aucune modification n'est effectuée\n- Le rapport peut être sauvegardé dans `docs\u002Faudit\u002F` si demandé\n- Les scores sont indicatifs et basés sur les bonnes pratiques API Platform\n- Relancer l'audit après corrections pour vérifier l'amélioration\n","# API Platform Audit\n\nAudite un projet API Platform existant pour vérifier les bonnes pratiques, la sécurité, les performances et la cohérence de configuration.\n\n## Instructions à Exécuter\n\n**IMPORTANT : Exécute ce workflow étape par étape :**\n\n### 1. Détecter la configuration API Platform\n\n- Vérifier `composer.json` pour la version d'API Platform installée\n- Chercher la configuration dans `config\u002Fpackages\u002Fapi_platform.yaml` ou `config\u002Fpackages\u002Fapi_platform.php`\n- Identifier le format de configuration utilisé (attributs PHP, YAML, XML)\n\n### 2. Inventorier les resources API\n\n- Chercher tous les fichiers avec `#[ApiResource]` via Grep\n- Chercher les configurations YAML\u002FXML si utilisées\n- Pour chaque resource, noter :\n  - Opérations exposées\n  - Groupes de sérialisation\n  - Filtres configurés\n  - Configuration de sécurité\n  - State providers\u002Fprocessors personnalisés\n\n### 3. Audit des bonnes pratiques\n\nVérifier pour chaque resource :\n\n**Configuration :**\n- [ ] Opérations explicitement déclarées (pas les opérations par défaut implicites)\n- [ ] Groupes de sérialisation configurés (read\u002Fwrite séparés)\n- [ ] Pagination configurée (pas de pagination désactivée sans raison)\n- [ ] Format de réponse cohérent (JSON-LD, JSON:API, HAL)\n\n**Sécurité :**\n- [ ] Attribut `security` défini sur les opérations sensibles (POST, PUT, PATCH, DELETE)\n- [ ] Pas d'exposition de données sensibles (mots de passe, tokens, données internes)\n- [ ] Validation configurée sur les opérations d'écriture\n- [ ] CORS correctement configuré (`nelmio_cors`)\n- [ ] Rate limiting si exposé publiquement\n\n**Performances :**\n- [ ] HTTP caching configuré (Cache-Control, ETag, Vary)\n- [ ] Eager loading pour éviter les requêtes N+1 (forceEager, fetchEager)\n- [ ] Index Doctrine sur les colonnes filtrées\u002Ftriées\n- [ ] Pagination activée avec une taille de page raisonnable (pas de `pagination_enabled: false` sur de grandes collections)\n- [ ] Groupes de sérialisation limitant les données retournées\n\n**Architecture :**\n- [ ] DTOs utilisés quand la représentation diffère de l'entité\n- [ ] State Providers\u002FProcessors pour la logique métier complexe\n- [ ] Pas de logique métier dans les entités Doctrine\n- [ ] Extensions Doctrine pour le filtrage global (soft delete, tenant)\n\n### 4. Audit de la configuration globale\n\nVérifier dans `config\u002Fpackages\u002Fapi_platform.yaml` :\n\n```yaml\napi_platform:\n    title: 'Mon API'                    # Titre défini\n    version: '1.0.0'                    # Version définie\n    formats:                            # Formats explicites\n        jsonld: ['application\u002Fld+json']\n    defaults:\n        pagination_items_per_page: 30   # Pagination par défaut raisonnable\n        pagination_client_enabled: true # Contrôle client de la pagination\n    mapping:\n        paths: ['%kernel.project_dir%\u002Fsrc\u002FEntity']\n```\n\n### 5. Audit des tests\n\n- Chercher les tests API dans `tests\u002F` avec Grep\n- Vérifier la couverture de tests :\n  - [ ] Tests pour chaque resource exposée\n  - [ ] Tests de validation\n  - [ ] Tests de sécurité (accès non autorisé)\n  - [ ] Tests de filtres\n\n### 6. Audit des dépendances\n\n- Vérifier les versions des packages API Platform dans `composer.lock`\n- Identifier les versions obsolètes\n- Vérifier la compatibilité entre packages\n\n### 7. Produire le rapport d'audit\n\nGénérer un rapport structuré :\n\n```\n## Rapport d'audit API Platform\n\n### Résumé\n- Resources API : {nombre}\n- Opérations totales : {nombre}\n- Score global : {score}\u002F100\n\n### Resources auditées\n| Resource | Opérations | Sécurité | Sérialisation | Filtres | Tests |\n|----------|-----------|----------|---------------|---------|-------|\n| Product  | 6\u002F6       | OK       | OK            | 3       | Oui   |\n| User     | 4\u002F6       | WARN     | MISSING       | 0       | Non   |\n\n### Problèmes critiques\n1. [CRITIQUE] Resource User sans sécurité sur POST\n2. [CRITIQUE] Mot de passe exposé dans la sérialisation User\n\n### Avertissements\n1. [WARN] Pas de groupes de sérialisation sur Product\n2. [WARN] Pagination désactivée sur LargeCollection\n\n### Recommandations\n1. Ajouter security: \"is_granted('ROLE_ADMIN')\" sur User POST\n2. Ajouter #[Groups(['user:read'])] et exclure le mot de passe\n3. Configurer le HTTP caching pour les resources en lecture seule\n\n### Couverture de tests\n- Resources testées : {x}\u002F{total}\n- Tests manquants : {liste}\n\n### Versions\n- api-platform\u002Fcore: {version} (dernière: {dernière})\n- symfony\u002Fframework-bundle: {version}\n```\n\n## Critères d'audit\n\n### Score de sécurité (sur 40)\n| Critère | Points |\n|---------|--------|\n| Security sur opérations d'écriture | 15 |\n| Pas de données sensibles exposées | 10 |\n| Validation sur les inputs | 10 |\n| CORS configuré | 5 |\n\n### Score de qualité (sur 30)\n| Critère | Points |\n|---------|--------|\n| Groupes de sérialisation | 10 |\n| Opérations explicites | 10 |\n| DTOs quand nécessaire | 5 |\n| Documentation OpenAPI | 5 |\n\n### Score de performance (sur 15)\n| Critère | Points |\n|---------|--------|\n| HTTP caching | 5 |\n| Pagination configurée | 5 |\n| Pas de N+1 queries | 5 |\n\n### Score de tests (sur 15)\n| Critère | Points |\n|---------|--------|\n| Couverture des resources | 10 |\n| Tests de sécurité | 5 |\n\n## Notes\n- L'audit est en lecture seule, aucune modification n'est effectuée\n- Le rapport peut être sauvegardé dans `docs\u002Faudit\u002F` si demandé\n- Les scores sont indicatifs et basés sur les bonnes pratiques API Platform\n- Relancer l'audit après corrections pour vérifier l'amélioration\n",{"name":5,"model":40,"license":15,"version":41,"description":7,"allowed-tools":42},"sonnet","1.0.0",[43,44,45,32],"Read","Grep","Glob","main","bb0335112ea0991dc1dc6a29fa5a861397a5a6f6","api-platform\u002Fskills\u002Faudit","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":55,"prompt":65,"zipAvailable":66},[56,59,62],{"tool":57,"command":58},"npx","npx skills add atournayre\u002Fclaude-personas --skill \"api-platform:audit\"",{"tool":60,"command":61},"bunx","bunx skills add atournayre\u002Fclaude-personas --skill \"api-platform:audit\"",{"tool":63,"command":64},"pnpm","pnpm dlx skills add atournayre\u002Fclaude-personas --skill \"api-platform:audit\"","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fapi-platform\u002Fskills\u002Faudit\u002FSKILL.md",true,[68],{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"LICENSE.txt","LICENSE","许可证",143,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Favalonreset\u002Fseo-dungeon\u002Fskills\u002Fseo-local\u002FLICENSE.txt",[75,89,125,132,140,151],{"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":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",[],[82,83,34,84,85,86,33,87,88,32],"twig:make component","component","edit","write","ux","template","php",{"skillNo":90,"name":91,"nameZh":6,"description":92,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":93,"categories":94,"keywords":107,"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",[95,98,101,104],{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":102,"categoryName":103,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":105,"categoryName":106,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000032","设计师",[108,109,110,111,112,113,114,115,116,117,118,32,119,120,121,122,34,85,123,124],"test","ui","tester","ui test","tester:ui test","MCP","debug","create","update","validation","messages","plan","tool","page","find","javascript","chrome",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"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",[],[127,32,33,34,85,84],{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":138,"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",[],[134,139,32,33,34,85,84],"message",{"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":149,"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",[146],{"categoryNo":147,"categoryName":148,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000005","邮件与沟通",[142,84,150,32,87,33,34,85],"email",{"skillNo":152,"name":153,"nameZh":6,"description":154,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":155,"categories":156,"keywords":157,"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",[],[153,32,33,34,85,84,158,117],"options"]