[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSTZ6TMWVY4CCTXT48RB1M":3,"skill-same:01M6CSTZ6TMWVY4CCTXT48RB1M":57},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":18,"linkOnly":19,"markdownContent":20,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":13,"repositoryHtmlUrl":26,"repositoryHomepageUrl":27,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6CSTZ6TMWVY4CCTXT48RB1M","commit",null,"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\u002Fdevops\u002Fskills\u002Fcommit\u002FSKILL.md",[],[5],"2026-11-10 10:12:30",false,"---\nname: devops:commit\ndescription: Créer des commits bien formatés avec format conventional et emoji\nmodel: haiku\nallowed-tools: [Bash(git add:*), Bash(git status:*), Bash(git commit:*), Bash(git diff:*), Bash(git log:*), Bash(git push:*), TaskCreate, TaskUpdate, TaskList]\nargument-hint: [message] [--verify] [--no-push]\nversion: 1.0.0\nlicense: MIT\nhooks:\n  PreToolUse:\n    - matcher: \"Bash(git status:*)\"\n      hooks:\n        - type: command\n          command: |\n            # Hook: Vérifier qu'il y a des changements à committer\n            if git diff --cached --quiet && git diff --quiet; then\n              echo \"Aucun changement détecté (stagé ou non stagé)\"\n              exit 1\n            fi\n          once: true\n    - matcher: \"Bash(git commit:*)\"\n      hooks:\n        - type: command\n          command: |\n            # Hook: Vérifier si --verify est passé en argument\n            if echo \"$ARGUMENTS\" | grep -q -- \"--verify\"; then\n              echo \"Exécution de make qa...\"\n              make qa || {\n                echo \"QA échouée. Voulez-vous continuer quand même ?\"\n                exit 1\n              }\n            fi\n          once: false\n  PostToolUse:\n    - matcher: \"Bash(git commit:*)\"\n      hooks:\n        - type: command\n          command: |\n            # Hook: Push automatique avec tracking intelligent\n            BRANCH=$(git branch --show-current)\n            echo \"Commit créé : $(git log -1 --oneline)\"\n\n            # Vérifier si --no-push est passé\n            if echo \"$ARGUMENTS\" | grep -q -- \"--no-push\"; then\n              echo \"Commit local uniquement (--no-push)\"\n              exit 0\n            fi\n\n            # Vérifier si la branche a un tracking remote\n            if ! git rev-parse --abbrev-ref --symbolic-full-name @{u} >\u002Fdev\u002Fnull 2>&1; then\n              echo \"Premier commit sur $BRANCH - configuration du tracking...\"\n              git push -u origin \"$BRANCH\"\n              echo \"Branche pushée et tracking configuré\"\n            else\n              echo \"Push vers origin\u002F$BRANCH...\"\n              git push\n              echo \"Commit pushé\"\n            fi\n          once: false\n---\n\n# Workflow Git Commit\n\nCréer un commit bien formaté avec les arguments : $ARGUMENTS\n\n## IMPORTANT : Task Management System obligatoire\n\n**RÈGLE CRITIQUE** : Chaque étape DOIT être trackée via TaskCreate\u002FTaskUpdate.\n- Créer TOUTES les tâches AVANT de commencer\n- Marquer `in_progress` au début de chaque étape\n- Marquer `completed` UNIQUEMENT quand l'étape est 100% terminée\n- NE JAMAIS sauter une étape\n\n## Instructions à Exécuter\n\n### Étape 1 : Créer TOUTES les tâches du workflow\n\n**OBLIGATOIRE** : Utilise TaskCreate pour créer ces 5 tâches dans cet ordre exact :\n\n```\nTaskCreate #1: \"Vérifier les changements disponibles\"\n  - activeForm: \"Checking available changes\"\n  - description: \"git status + git diff pour voir les fichiers modifiés\"\n\nTaskCreate #2: \"Analyser le diff des changements\"\n  - activeForm: \"Analyzing diff content\"\n  - description: \"git diff --cached pour comprendre les changements\"\n\nTaskCreate #3: \"Déterminer la stratégie de commit\"\n  - activeForm: \"Determining commit strategy\"\n  - description: \"Décider si un ou plusieurs commits sont nécessaires\"\n\nTaskCreate #4: \"Créer le(s) commit(s)\"\n  - activeForm: \"Creating commit(s)\"\n  - description: \"git commit avec message formaté emoji + conventional\"\n\nTaskCreate #5: \"Push vers remote\"\n  - activeForm: \"Pushing to remote\"\n  - description: \"git push (sauf si --no-push)\"\n```\n\n**Après création** : Affiche `TaskList` pour confirmer que les 5 tâches existent.\n\n---\n\n### Étape 2 : Vérifier les changements disponibles\n\n**TaskUpdate : Tâche #1 -> `in_progress`**\n\nExécute en parallèle :\n```bash\ngit status\ngit diff --cached --stat\n```\n\n**Traitement** :\n\n1. **SI** aucun changement (ni stagé, ni non-stagé) :\n   - Affiche \"Aucun changement à committer\"\n   - **TaskUpdate : Tâche #1 -> `completed`**\n   - **STOP** - Ne pas continuer\n\n2. **SI** des fichiers modifiés mais rien de stagé :\n   - Exécute `git add .` pour tout stager\n   - Exécute `git status` pour confirmer\n\n3. **SI** des fichiers déjà stagés :\n   - Continue avec ces fichiers uniquement\n\n**TaskUpdate : Tâche #1 -> `completed`**\n\n---\n\n### Étape 3 : Analyser le diff des changements\n\n**TaskUpdate : Tâche #2 -> `in_progress`**\n\nExécute en parallèle :\n```bash\ngit diff --cached\ngit log -5 --oneline\n```\n\n**Traitement** :\n1. Lis TOUT le diff des changements stagés\n2. Note le style des commits récents du repo\n3. Identifie les types de changements présents :\n   - feat (nouvelles fonctionnalités)\n   - fix (corrections de bugs)\n   - docs (documentation)\n   - refactor (refactorisation)\n   - test (tests)\n   - chore (configuration, maintenance)\n   - style (formatage)\n   - perf (performance)\n\n**TaskUpdate : Tâche #2 -> `completed`**\n\n---\n\n### Étape 4 : Déterminer la stratégie de commit\n\n**TaskUpdate : Tâche #3 -> `in_progress`**\n\n**Critères pour DIVISER en plusieurs commits :**\n1. Préoccupations distinctes (feat + docs + tests mélangés)\n2. Types de changements différents (fix + refactor)\n3. Fichiers non-liés modifiés ensemble\n4. Diff > 200 lignes sur sujets différents\n\n**SI plusieurs types détectés :**\n- Liste les commits à créer\n- Pour chaque commit, utilise :\n  ```bash\n  git reset HEAD \u003Cfichiers-à-exclure>\n  git commit -m \"...\"\n  git add \u003Cfichiers-suivants>\n  ```\n\n**SINON :**\n- Continue avec un seul commit\n\n**TaskUpdate : Tâche #3 -> `completed`**\n\n---\n\n### Étape 5 : Créer le(s) commit(s)\n\n**TaskUpdate : Tâche #4 -> `in_progress`**\n\n**Pour CHAQUE commit à créer :**\n\n#### 5.1 Déterminer le message\n\n1. **Type** : feat, fix, docs, refactor, test, chore, style, perf, ci, revert\n2. **Emoji** : Voir table ci-dessous\n3. **Scope** : Optionnel, entre parenthèses (auth, api, ui...)\n4. **Description** : \u003C 72 caractères, mode impératif, présent\n\n#### 5.2 Exécuter le commit\n\n**OBLIGATOIRE : Utilise TOUJOURS un HEREDOC pour le message :**\n\n```bash\ngit commit -m \"$(cat \u003C\u003C'EOF'\n\u003Cemoji> \u003Ctype>(\u003Cscope>): \u003Cdescription courte>\n\n\u003Cdétails optionnels - explique le \"pourquoi\">\nEOF\n)\"\n```\n\n**TaskUpdate : Tâche #4 -> `completed`**\n\n---\n\n### Étape 6 : Push vers remote\n\n**TaskUpdate : Tâche #5 -> `in_progress`**\n\n#### 6.1 Vérifier l'option --no-push\n\n**SI** `--no-push` présent dans $ARGUMENTS :\n- Affiche \"Commit local uniquement (--no-push)\"\n- **TaskUpdate : Tâche #5 -> `completed`**\n- **STOP** - Workflow terminé\n\n#### 6.2 Push automatique\n\nLe hook PostToolUse gère automatiquement :\n- Premier push : `git push -u origin \u003Cbranch>`\n- Push suivants : `git push`\n\n**TaskUpdate : Tâche #5 -> `completed`**\n\n---\n\n## Table des Emojis par Type\n\n| Type | Emoji | Usage |\n|------|-------|-------|\n| feat | ✨ | Nouvelle fonctionnalité |\n| fix | ? | Correction de bug |\n| docs | ? | Documentation |\n| style | ? | Formatage\u002Fstyle (pas de changement de logique) |\n| refactor | ♻️ | Refactorisation de code |\n| perf | ⚡️ | Amélioration de performance |\n| test | ✅ | Ajout\u002Fmodification de tests |\n| chore | ? | Outils, configuration, maintenance |\n| ci | ? | CI\u002FCD |\n| revert | ⏪️ | Annulation de changements |\n\n### Emojis Spécialisés\n\n| Contexte | Emoji | Description |\n|----------|-------|-------------|\n| Breaking change | ? | Changement cassant |\n| Security | ?️ | Sécurité |\n| Hotfix | ?️ | Correction critique urgente |\n| Architecture | ?️ | Changements architecturaux |\n| Dead code | ⚰️ | Suppression code mort |\n| Remove files | ? | Suppression fichiers |\n| Move\u002Frename | ? | Déplacement\u002Frenommage |\n\n## Format du Message de Commit\n\n```\n\u003Cemoji> \u003Ctype>(\u003Cscope>): \u003Cdescription impérative courte>\n\n[corps optionnel - explique le \"pourquoi\" pas le \"quoi\"]\n\n[footer optionnel - références issues, breaking changes]\n```\n\n### Règles du Message\n\n1. **Première ligne** : \u003C 72 caractères\n2. **Mode impératif** : \"ajouter\" pas \"ajouté\"\n3. **Présent** : \"corrige\" pas \"a corrigé\"\n4. **Pas de point final** sur la première ligne\n5. **Ligne vide** entre titre et corps\n6. **Corps** : explique le contexte et la raison\n\n## Options de Commande\n\n| Option | Description |\n|--------|-------------|\n| `--verify` | Exécute `make qa` avant le commit |\n| `--no-push` | Ne push pas automatiquement après le commit |\n\n**Combinaison possible :** `\u002Fdevops:commit --verify --no-push`\n\n## Directives de Division\n\nDivise les commits si tu détectes :\n1. **feat + docs** -> 2 commits séparés\n2. **fix + refactor** -> 2 commits séparés\n3. **test + implementation** -> peut être ensemble si cohérent\n4. **chore (deps) + feat** -> toujours séparés\n5. **Plusieurs features distinctes** -> 1 commit par feature\n","# Workflow Git Commit\n\nCréer un commit bien formaté avec les arguments : $ARGUMENTS\n\n## IMPORTANT : Task Management System obligatoire\n\n**RÈGLE CRITIQUE** : Chaque étape DOIT être trackée via TaskCreate\u002FTaskUpdate.\n- Créer TOUTES les tâches AVANT de commencer\n- Marquer `in_progress` au début de chaque étape\n- Marquer `completed` UNIQUEMENT quand l'étape est 100% terminée\n- NE JAMAIS sauter une étape\n\n## Instructions à Exécuter\n\n### Étape 1 : Créer TOUTES les tâches du workflow\n\n**OBLIGATOIRE** : Utilise TaskCreate pour créer ces 5 tâches dans cet ordre exact :\n\n```\nTaskCreate #1: \"Vérifier les changements disponibles\"\n  - activeForm: \"Checking available changes\"\n  - description: \"git status + git diff pour voir les fichiers modifiés\"\n\nTaskCreate #2: \"Analyser le diff des changements\"\n  - activeForm: \"Analyzing diff content\"\n  - description: \"git diff --cached pour comprendre les changements\"\n\nTaskCreate #3: \"Déterminer la stratégie de commit\"\n  - activeForm: \"Determining commit strategy\"\n  - description: \"Décider si un ou plusieurs commits sont nécessaires\"\n\nTaskCreate #4: \"Créer le(s) commit(s)\"\n  - activeForm: \"Creating commit(s)\"\n  - description: \"git commit avec message formaté emoji + conventional\"\n\nTaskCreate #5: \"Push vers remote\"\n  - activeForm: \"Pushing to remote\"\n  - description: \"git push (sauf si --no-push)\"\n```\n\n**Après création** : Affiche `TaskList` pour confirmer que les 5 tâches existent.\n\n---\n\n### Étape 2 : Vérifier les changements disponibles\n\n**TaskUpdate : Tâche #1 -> `in_progress`**\n\nExécute en parallèle :\n```bash\ngit status\ngit diff --cached --stat\n```\n\n**Traitement** :\n\n1. **SI** aucun changement (ni stagé, ni non-stagé) :\n   - Affiche \"Aucun changement à committer\"\n   - **TaskUpdate : Tâche #1 -> `completed`**\n   - **STOP** - Ne pas continuer\n\n2. **SI** des fichiers modifiés mais rien de stagé :\n   - Exécute `git add .` pour tout stager\n   - Exécute `git status` pour confirmer\n\n3. **SI** des fichiers déjà stagés :\n   - Continue avec ces fichiers uniquement\n\n**TaskUpdate : Tâche #1 -> `completed`**\n\n---\n\n### Étape 3 : Analyser le diff des changements\n\n**TaskUpdate : Tâche #2 -> `in_progress`**\n\nExécute en parallèle :\n```bash\ngit diff --cached\ngit log -5 --oneline\n```\n\n**Traitement** :\n1. Lis TOUT le diff des changements stagés\n2. Note le style des commits récents du repo\n3. Identifie les types de changements présents :\n   - feat (nouvelles fonctionnalités)\n   - fix (corrections de bugs)\n   - docs (documentation)\n   - refactor (refactorisation)\n   - test (tests)\n   - chore (configuration, maintenance)\n   - style (formatage)\n   - perf (performance)\n\n**TaskUpdate : Tâche #2 -> `completed`**\n\n---\n\n### Étape 4 : Déterminer la stratégie de commit\n\n**TaskUpdate : Tâche #3 -> `in_progress`**\n\n**Critères pour DIVISER en plusieurs commits :**\n1. Préoccupations distinctes (feat + docs + tests mélangés)\n2. Types de changements différents (fix + refactor)\n3. Fichiers non-liés modifiés ensemble\n4. Diff > 200 lignes sur sujets différents\n\n**SI plusieurs types détectés :**\n- Liste les commits à créer\n- Pour chaque commit, utilise :\n  ```bash\n  git reset HEAD \u003Cfichiers-à-exclure>\n  git commit -m \"...\"\n  git add \u003Cfichiers-suivants>\n  ```\n\n**SINON :**\n- Continue avec un seul commit\n\n**TaskUpdate : Tâche #3 -> `completed`**\n\n---\n\n### Étape 5 : Créer le(s) commit(s)\n\n**TaskUpdate : Tâche #4 -> `in_progress`**\n\n**Pour CHAQUE commit à créer :**\n\n#### 5.1 Déterminer le message\n\n1. **Type** : feat, fix, docs, refactor, test, chore, style, perf, ci, revert\n2. **Emoji** : Voir table ci-dessous\n3. **Scope** : Optionnel, entre parenthèses (auth, api, ui...)\n4. **Description** : \u003C 72 caractères, mode impératif, présent\n\n#### 5.2 Exécuter le commit\n\n**OBLIGATOIRE : Utilise TOUJOURS un HEREDOC pour le message :**\n\n```bash\ngit commit -m \"$(cat \u003C\u003C'EOF'\n\u003Cemoji> \u003Ctype>(\u003Cscope>): \u003Cdescription courte>\n\n\u003Cdétails optionnels - explique le \"pourquoi\">\nEOF\n)\"\n```\n\n**TaskUpdate : Tâche #4 -> `completed`**\n\n---\n\n### Étape 6 : Push vers remote\n\n**TaskUpdate : Tâche #5 -> `in_progress`**\n\n#### 6.1 Vérifier l'option --no-push\n\n**SI** `--no-push` présent dans $ARGUMENTS :\n- Affiche \"Commit local uniquement (--no-push)\"\n- **TaskUpdate : Tâche #5 -> `completed`**\n- **STOP** - Workflow terminé\n\n#### 6.2 Push automatique\n\nLe hook PostToolUse gère automatiquement :\n- Premier push : `git push -u origin \u003Cbranch>`\n- Push suivants : `git push`\n\n**TaskUpdate : Tâche #5 -> `completed`**\n\n---\n\n## Table des Emojis par Type\n\n| Type | Emoji | Usage |\n|------|-------|-------|\n| feat | ✨ | Nouvelle fonctionnalité |\n| fix | ? | Correction de bug |\n| docs | ? | Documentation |\n| style | ? | Formatage\u002Fstyle (pas de changement de logique) |\n| refactor | ♻️ | Refactorisation de code |\n| perf | ⚡️ | Amélioration de performance |\n| test | ✅ | Ajout\u002Fmodification de tests |\n| chore | ? | Outils, configuration, maintenance |\n| ci | ? | CI\u002FCD |\n| revert | ⏪️ | Annulation de changements |\n\n### Emojis Spécialisés\n\n| Contexte | Emoji | Description |\n|----------|-------|-------------|\n| Breaking change | ? | Changement cassant |\n| Security | ?️ | Sécurité |\n| Hotfix | ?️ | Correction critique urgente |\n| Architecture | ?️ | Changements architecturaux |\n| Dead code | ⚰️ | Suppression code mort |\n| Remove files | ? | Suppression fichiers |\n| Move\u002Frename | ? | Déplacement\u002Frenommage |\n\n## Format du Message de Commit\n\n```\n\u003Cemoji> \u003Ctype>(\u003Cscope>): \u003Cdescription impérative courte>\n\n[corps optionnel - explique le \"pourquoi\" pas le \"quoi\"]\n\n[footer optionnel - références issues, breaking changes]\n```\n\n### Règles du Message\n\n1. **Première ligne** : \u003C 72 caractères\n2. **Mode impératif** : \"ajouter\" pas \"ajouté\"\n3. **Présent** : \"corrige\" pas \"a corrigé\"\n4. **Pas de point final** sur la première ligne\n5. **Ligne vide** entre titre et corps\n6. **Corps** : explique le contexte et la raison\n\n## Options de Commande\n\n| Option | Description |\n|--------|-------------|\n| `--verify` | Exécute `make qa` avant le commit |\n| `--no-push` | Ne push pas automatiquement après le commit |\n\n**Combinaison possible :** `\u002Fdevops:commit --verify --no-push`\n\n## Directives de Division\n\nDivise les commits si tu détectes :\n1. **feat + docs** -> 2 commits séparés\n2. **fix + refactor** -> 2 commits séparés\n3. **test + implementation** -> peut être ensemble si cohérent\n4. **chore (deps) + feat** -> toujours séparés\n5. **Plusieurs features distinctes** -> 1 commit par feature\n",{},"main","bb0335112ea0991dc1dc6a29fa5a861397a5a6f6","devops\u002Fskills\u002Fcommit","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":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add atournayre\u002Fclaude-personas --skill commit",{"tool":37,"command":38},"bunx","bunx skills add atournayre\u002Fclaude-personas --skill commit",{"tool":40,"command":41},"pnpm","pnpm dlx skills add atournayre\u002Fclaude-personas --skill commit","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fdevops\u002Fskills\u002Fcommit\u002FSKILL.md",true,[45,51],{"path":46,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":49,"sourceHtmlUrl":50},"LICENSE.txt","LICENSE","许可证",143,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Favalonreset\u002Fseo-dungeon\u002Fskills\u002Fseo-schema\u002FLICENSE.txt",{"path":52,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":55,"sourceHtmlUrl":56},"references\u002Fdeprecated-types-2024-2026.md","REFERENCE","参考文档",5946,"https:\u002F\u002Fgithub.com\u002Fhashgraph-online\u002Fawesome-codex-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Favalonreset\u002Fseo-dungeon\u002Fskills\u002Fseo-schema\u002Freferences\u002Fdeprecated-types-2024-2026.md",[58,75,115,122,130,141],{"skillNo":59,"name":60,"nameZh":6,"description":61,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":64,"publishedAt":18},"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",[],[65,66,67,68,69,70,71,72,73,74],"twig:make component","component","read","edit","write","ux","grep","template","php","Bash",{"skillNo":76,"name":77,"nameZh":6,"description":78,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":79,"categories":80,"keywords":97,"publishedAt":18},"01M6CSZKCYYT4EAW4CDSTS3TSH","tester:ui-test","Teste automatiquement une interface utilisateur dans Chrome : navigation, clics, validation visuelle, tests fonctionnels, responsive, comportement et debug. Génère un rapport détaillé avec screenshots et optionnellement un GIF du parcours.","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Ftester\u002Fskills\u002Fui-test\u002FSKILL.md",[81,86,89,92],{"categoryNo":82,"categoryName":83,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":87,"categoryName":88,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":90,"categoryName":91,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":93,"categoryName":94,"taxonomyType":95,"taxonomyTypeDesc":96},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",[98,99,100,101,102,103,104,105,106,107,108,74,109,110,111,112,67,69,113,114],"test","ui","tester","ui test","tester:ui test","MCP","debug","create","update","validation","messages","plan","tool","page","find","javascript","chrome",{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":18},"01M6CSZGQ8X9XNXRBYX0AA3CYE","symfony:voter","Genere un Voter de securite Symfony pour le controle d'acces granulaire","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fvoter\u002FSKILL.md",[],[117,74,71,67,69,68],{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":128,"publishedAt":18},"01M6CSZEJ3BNHCNZT18SYFGDME","symfony:message","Genere un Message Symfony Messenger avec son Handler pour traitement asynchrone","https:\u002F\u002Fgithub.com\u002Fatournayre\u002Fclaude-personas\u002Fblob\u002Fmain\u002Fsymfony\u002Fskills\u002Fmessage\u002FSKILL.md",[],[124,129,74,71,67,69,68],"message",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":139,"publishedAt":18},"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",[136],{"categoryNo":137,"categoryName":138,"taxonomyType":84,"taxonomyTypeDesc":85},"01JBSEEDCAT000000000000005","邮件与沟通",[132,68,140,74,72,71,67,69],"email",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":18},"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",[],[143,74,71,67,69,68,148,107],"options"]