[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSV99ET2Z9W4W4DAK4CMQP":3,"skill-same:01M6CSV99ET2Z9W4W4DAK4CMQP":114},{"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":23,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":79,"commitSha":80,"skillDirectory":81,"forksCount":14,"repositoryHtmlUrl":82,"repositoryHomepageUrl":6,"ownerHtmlUrl":83,"ownerBlogUrl":6,"ownerDescription":84,"updatedAt":85,"install":86,"resources":99},"01M6CSV99ET2Z9W4W4DAK4CMQP","volontariapp-meta-scripts",null,"Utiliser et faire evoluer la CLI Node de meta (setup, doctor, migrate, certs, repos, bump) et le manifeste repos.json, source unique des repos et unites du workspace.","Volontariapp\u002Fmeta","Volontariapp","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F263673138?v=4","01M6CSQNQ3J4SKRWA512JQF5K7","VolontariApp","01M6CSQNV8T2M4PR5A22DKHY5T",0,"MIT","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-meta-scripts\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"volontariapp meta scripts","Meta","code","migrate","claude-code","setup","meta-scripts","repos","install","node","workspace","shell","json","bump","cli","doctor","draft","2026-11-10 10:12:30",false,"---\nname: volontariapp-meta-scripts\ndescription: \"Utiliser et faire evoluer la CLI Node de meta (setup, doctor, migrate, certs, repos, bump) et le manifeste repos.json, source unique des repos et unites du workspace.\"\ntype: Agent Skill\ntitle: Scripts et CLI du workspace meta\ntags: [meta-scripts]\nstatus: draft\npaths:\n  - \"scripts\u002Fcli\u002F**\"\n  - repos.json\n  - root.sh\n  - setup.sh\n  - setup.ps1\n  - scripts\u002Finstall_apps.sh\n  - scripts\u002Finstall_shell.sh\nmesh_keys:\n  - meta-cli\n  - repos.json\ngenerated:\n  by: claude-code\u002Fagent\n  at: \"2026-10-28T22:38:27Z\"\nverified:\n  - by: claude-code\u002Fagent\n    at: \"2026-10-28T23:02:11Z\"\n    digest: 7ccf4a975dbb6730\n  - by: claude-code\u002Fagent\n    at: \"2026-10-28T23:02:36Z\"\n    digest: 8344fa15702535bd\n  - by: claude-code\u002Fagent\n    at: \"2026-10-28T23:22:35Z\"\n    digest: 36024be2906c9d79\n  - by: claude-code\u002Fagent\n    at: \"2026-10-28T23:28:57Z\"\n    digest: e69071f06e250c57\n  - by: claude-code\u002Fagent\n    at: \"2026-11-08T12:02:25Z\"\n    digest: ea72b1f09c875324\nsources: []\n---\n\n# Scripts et CLI du workspace meta\n\n## Quand utiliser cette skill\n\nUtiliser et faire evoluer la CLI Node de meta (setup, doctor, migrate, certs, repos, bump) et le manifeste `repos.json`, source unique des repos et unites du workspace. Entree : `yarn meta \u003Ccommande>` ou `.\u002Froot.sh \u003Ccommande>` (lanceur, sans menu).\n\n## Règles\n\n- `repos.json` est la seule liste de repos, d'unites demarrables, de profils, d'environnements et d'infra Docker. Ne jamais recopier une liste de repos dans un script : lire `loadManifest()` (`scripts\u002Fcli\u002Flib\u002Fmanifest.mjs`). `yarn meta manifest` verifie la coherence avec `.gitignore`.\n- Ajouter un microservice : declarer le repo et l'unite dans `repos.json` (`migrations`, `certs`, `order`), puis `yarn meta manifest` et `yarn test:cli`.\n- La CLI n'a aucune dependance npm : Node >= `.node-version`, modules ESM `.mjs` annotes en JSDoc (pas de `any`), tests `node:test` dans `scripts\u002Fcli\u002Ftest\u002F` (`yarn test:cli`, glob obligatoire sous Node 24.2).\n- Bootstrap : `setup.sh` (macOS, Linux, WSL2) et `setup.ps1` (Windows 11, winget) garantissent Node et Yarn puis lancent `meta setup`. Toute la logique vit dans la CLI, pas dans les bootstraps.\n- `setup` est idempotent et s'arrete a la premiere erreur reelle (code retour non nul, aucun `|| true`). Etapes : apps et shell (terminal interactif seulement, `--no-apps`, `--no-shell`, ou `--yes` les retire), prerequis, clone HTTPS via `gh auth setup-git` (`--ssh` pour SSH), dependances, certificats, infra Docker avec attente des health-checks, migrations, verification.\n- Certificats : `certs` n'ecrase jamais des cles existantes sans `--force` (les paires doivent rester coherentes entre services). Generation par `node:crypto`, pas d'openssl.\n- Infra locale : `up` demarre uniquement les services de `infra.services` (jamais les images GHCR des ms du compose de `ci-tools`).\n- `sync-migrations` copie `ms-X\u002Fsrc\u002Fmigrations` vers `npm-packages\u002Fpackages\u002Fdomain-X\u002Fsrc\u002Ftest\u002Fmigrations` (miroir avec suppression). Toujours `--dry-run` d'abord. `--pr` cree branche, changeset, build, test, PR dans `npm-packages`, puis s'arrete : regle STOP, aucun consommateur n'est touche avant la publication CI.\n- `bump` (apres publication CI uniquement) ouvre une PR par consommateur ; il ne pousse jamais sur `main`. `notify-pr \u003Crepo> \u003Cn>` n'envoie le webhook Discord que si la PR est fusionnable et tous les checks verts, une seule fois par PR (`logs\u002Fdiscord-notified.log`).\n- `trace-flow` genere une page HTML Sankey (SVG statique) des flux entre services : un lien relie le service d'un span parent a celui de son enfant, valeur = traces distinctes, rouge si un span enfant est en erreur (`scripts\u002Fcli\u002Flib\u002Ftrace-flow.mjs`). Deux phases : (1) chercher les spans de saut asynchrone `operation_name:(Consumer OR Producer)` et ne garder que les traces ou l'un d'eux a un parent (les taches planifiees comme `job ranking.compute_user_ranking` sont des racines isolees), (2) recuperer tous les spans de ces traces par lots (`trace_id:(a OR b)`). Lecture par `POST https:\u002F\u002Fapi.\u003Csite>\u002Fapi\u002Fv2\u002Fspans\u002Fevents\u002Fsearch`, limite reelle mesuree : 5 requetes par minute (en-tetes `x-ratelimit-*`, la doc annoncait 300 par heure), geree par attente et nouvelle tentative ; `--max-traces 100 --chunk 10` coute 11 requetes. Ne pas exclure `operation_name:Internal` : certains parents de sauts en font partie. Mode hors ligne : `--input`. Identifiants lus dans l'environnement du terminal, jamais ecrits : `DD_TOKEN` (Bearer), sinon `DD_API_KEY` + `DD_APP_KEY`, ou une `DD_API_KEY` de prefixe `ddpa` utilisee en Bearer ; le secret `datadog-keys` du cluster ne contient que l'`api-key`.\n- `repos sync` ne fait jamais de stash silencieux : un repo sale est ignore (ou `--autostash`), `pull --ff-only` seulement. `repos rebase` abandonne proprement en cas de conflit.\n- Zero emoji et zero tiret cadratin dans le code, les logs et les messages de commit.\n\n## Pièges verifies\n\n- Les `@volontariapp\u002F*` sont publics sur npm (`access: public` dans `npm-packages\u002F.changeset\u002Fconfig.json`) : aucune authentification de registre n'est requise au setup.\n- La route de sante de l'api-gateway est `\u002Fapi\u002Fv1\u002Fhealth` (verifie : 200 apres `start backend-core`), pas `\u002Fhealth`.\n- Node \u003C `.node-version` fait echouer `doctor` et donc `setup` (cas constate sur une machine en 24.2.0).\n- `clamd` n'a pas d'image arm64 (Apple Silicon) : `up` echoue en bloc s'il est dans la liste principale. Il est donc dans `infra.optional` de `repos.json`, demarre en emulation amd64 (`DOCKER_DEFAULT_PLATFORM`) et son echec n'arrete pas le setup.\n- Ne jamais sauter `yarn install` sous pretexte que `node_modules` existe : celui de `ms-ranking` etait incomplet (`@volontariapp\u002Fdomain-ranking` absent), Node remontait vers un `node_modules` perime a la racine de `meta`. `setup` lance donc toujours `yarn install` (no-op si a jour).\n- Arreter `start` : `child.kill()` ne tue pas les petits-enfants (yarn, nest, node) et laisse les ports occupes. Les unites sont lancees dans leur groupe de processus (`spawnGroup`) et arretees par `killTree`.\n- Une migration renommee apres application (meme timestamp, autre nom) fait echouer `migrate` sur une base de dev existante (`type ... already exists`, cas `ms-event` : `AddSagaStatus1780932284627` en base, `AddSagaStatusToEvent1780932284627` dans le code). Une base vierge n'est pas concernee : les 7 services migrent proprement (verifie sur un Postgres jetable). Ne pas vider la base d'un developpeur pour contourner.\n- Les ports et conteneurs du compose sont fixes (`container_name`) : une seule instance de l'infra par machine.\n\n## Références\n\n- [Leçons apprises](\u002Fvolontariapp-meta-scripts\u002Freferences\u002Flessons.md)\n\n## Scripts\n\n- `yarn test:cli` : tests unitaires de la CLI.\n- `yarn meta manifest` : valide `repos.json` et `.gitignore`.\n- `yarn meta doctor` : prerequis de la machine.\n","# Scripts et CLI du workspace meta\n\n## Quand utiliser cette skill\n\nUtiliser et faire evoluer la CLI Node de meta (setup, doctor, migrate, certs, repos, bump) et le manifeste `repos.json`, source unique des repos et unites du workspace. Entree : `yarn meta \u003Ccommande>` ou `.\u002Froot.sh \u003Ccommande>` (lanceur, sans menu).\n\n## Règles\n\n- `repos.json` est la seule liste de repos, d'unites demarrables, de profils, d'environnements et d'infra Docker. Ne jamais recopier une liste de repos dans un script : lire `loadManifest()` (`scripts\u002Fcli\u002Flib\u002Fmanifest.mjs`). `yarn meta manifest` verifie la coherence avec `.gitignore`.\n- Ajouter un microservice : declarer le repo et l'unite dans `repos.json` (`migrations`, `certs`, `order`), puis `yarn meta manifest` et `yarn test:cli`.\n- La CLI n'a aucune dependance npm : Node >= `.node-version`, modules ESM `.mjs` annotes en JSDoc (pas de `any`), tests `node:test` dans `scripts\u002Fcli\u002Ftest\u002F` (`yarn test:cli`, glob obligatoire sous Node 24.2).\n- Bootstrap : `setup.sh` (macOS, Linux, WSL2) et `setup.ps1` (Windows 11, winget) garantissent Node et Yarn puis lancent `meta setup`. Toute la logique vit dans la CLI, pas dans les bootstraps.\n- `setup` est idempotent et s'arrete a la premiere erreur reelle (code retour non nul, aucun `|| true`). Etapes : apps et shell (terminal interactif seulement, `--no-apps`, `--no-shell`, ou `--yes` les retire), prerequis, clone HTTPS via `gh auth setup-git` (`--ssh` pour SSH), dependances, certificats, infra Docker avec attente des health-checks, migrations, verification.\n- Certificats : `certs` n'ecrase jamais des cles existantes sans `--force` (les paires doivent rester coherentes entre services). Generation par `node:crypto`, pas d'openssl.\n- Infra locale : `up` demarre uniquement les services de `infra.services` (jamais les images GHCR des ms du compose de `ci-tools`).\n- `sync-migrations` copie `ms-X\u002Fsrc\u002Fmigrations` vers `npm-packages\u002Fpackages\u002Fdomain-X\u002Fsrc\u002Ftest\u002Fmigrations` (miroir avec suppression). Toujours `--dry-run` d'abord. `--pr` cree branche, changeset, build, test, PR dans `npm-packages`, puis s'arrete : regle STOP, aucun consommateur n'est touche avant la publication CI.\n- `bump` (apres publication CI uniquement) ouvre une PR par consommateur ; il ne pousse jamais sur `main`. `notify-pr \u003Crepo> \u003Cn>` n'envoie le webhook Discord que si la PR est fusionnable et tous les checks verts, une seule fois par PR (`logs\u002Fdiscord-notified.log`).\n- `trace-flow` genere une page HTML Sankey (SVG statique) des flux entre services : un lien relie le service d'un span parent a celui de son enfant, valeur = traces distinctes, rouge si un span enfant est en erreur (`scripts\u002Fcli\u002Flib\u002Ftrace-flow.mjs`). Deux phases : (1) chercher les spans de saut asynchrone `operation_name:(Consumer OR Producer)` et ne garder que les traces ou l'un d'eux a un parent (les taches planifiees comme `job ranking.compute_user_ranking` sont des racines isolees), (2) recuperer tous les spans de ces traces par lots (`trace_id:(a OR b)`). Lecture par `POST https:\u002F\u002Fapi.\u003Csite>\u002Fapi\u002Fv2\u002Fspans\u002Fevents\u002Fsearch`, limite reelle mesuree : 5 requetes par minute (en-tetes `x-ratelimit-*`, la doc annoncait 300 par heure), geree par attente et nouvelle tentative ; `--max-traces 100 --chunk 10` coute 11 requetes. Ne pas exclure `operation_name:Internal` : certains parents de sauts en font partie. Mode hors ligne : `--input`. Identifiants lus dans l'environnement du terminal, jamais ecrits : `DD_TOKEN` (Bearer), sinon `DD_API_KEY` + `DD_APP_KEY`, ou une `DD_API_KEY` de prefixe `ddpa` utilisee en Bearer ; le secret `datadog-keys` du cluster ne contient que l'`api-key`.\n- `repos sync` ne fait jamais de stash silencieux : un repo sale est ignore (ou `--autostash`), `pull --ff-only` seulement. `repos rebase` abandonne proprement en cas de conflit.\n- Zero emoji et zero tiret cadratin dans le code, les logs et les messages de commit.\n\n## Pièges verifies\n\n- Les `@volontariapp\u002F*` sont publics sur npm (`access: public` dans `npm-packages\u002F.changeset\u002Fconfig.json`) : aucune authentification de registre n'est requise au setup.\n- La route de sante de l'api-gateway est `\u002Fapi\u002Fv1\u002Fhealth` (verifie : 200 apres `start backend-core`), pas `\u002Fhealth`.\n- Node \u003C `.node-version` fait echouer `doctor` et donc `setup` (cas constate sur une machine en 24.2.0).\n- `clamd` n'a pas d'image arm64 (Apple Silicon) : `up` echoue en bloc s'il est dans la liste principale. Il est donc dans `infra.optional` de `repos.json`, demarre en emulation amd64 (`DOCKER_DEFAULT_PLATFORM`) et son echec n'arrete pas le setup.\n- Ne jamais sauter `yarn install` sous pretexte que `node_modules` existe : celui de `ms-ranking` etait incomplet (`@volontariapp\u002Fdomain-ranking` absent), Node remontait vers un `node_modules` perime a la racine de `meta`. `setup` lance donc toujours `yarn install` (no-op si a jour).\n- Arreter `start` : `child.kill()` ne tue pas les petits-enfants (yarn, nest, node) et laisse les ports occupes. Les unites sont lancees dans leur groupe de processus (`spawnGroup`) et arretees par `killTree`.\n- Une migration renommee apres application (meme timestamp, autre nom) fait echouer `migrate` sur une base de dev existante (`type ... already exists`, cas `ms-event` : `AddSagaStatus1780932284627` en base, `AddSagaStatusToEvent1780932284627` dans le code). Une base vierge n'est pas concernee : les 7 services migrent proprement (verifie sur un Postgres jetable). Ne pas vider la base d'un developpeur pour contourner.\n- Les ports et conteneurs du compose sont fixes (`container_name`) : une seule instance de l'infra par machine.\n\n## Références\n\n- [Leçons apprises](\u002Fvolontariapp-meta-scripts\u002Freferences\u002Flessons.md)\n\n## Scripts\n\n- `yarn test:cli` : tests unitaires de la CLI.\n- `yarn meta manifest` : valide `repos.json` et `.gitignore`.\n- `yarn meta doctor` : prerequis de la machine.\n",{"name":5,"tags":46,"type":47,"paths":48,"title":56,"status":40,"sources":57,"verified":58,"generated":75,"mesh_keys":77,"description":7},[30],"Agent Skill",[49,50,51,52,53,54,55],"scripts\u002Fcli\u002F**","repos.json","root.sh","setup.sh","setup.ps1","scripts\u002Finstall_apps.sh","scripts\u002Finstall_shell.sh","Scripts et CLI du workspace meta",[],[59,63,66,69,72],{"at":60,"by":61,"digest":62},"2026-10-28T23:02:11Z","claude-code\u002Fagent","7ccf4a975dbb6730",{"at":64,"by":61,"digest":65},"2026-10-28T23:02:36Z","8344fa15702535bd",{"at":67,"by":61,"digest":68},"2026-10-28T23:22:35Z","36024be2906c9d79",{"at":70,"by":61,"digest":71},"2026-10-28T23:28:57Z","e69071f06e250c57",{"at":73,"by":61,"digest":74},"2026-11-08T12:02:25Z","ea72b1f09c875324",{"at":76,"by":61},"2026-10-28T22:38:27Z",[78,50],"meta-cli","main","6b8f03b57018fa66da4666071dc17c1577ff45e8",".agents\u002Fskills\u002Fvolontariapp-meta-scripts","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta","https:\u002F\u002Fgithub.com\u002FVolontariapp","Volontariapp — Application Web\u002FMobile scalabelle construite sur une architecture microservices événementielle (Event-Driven Architecture), implémentant le Trans","2026-11-10 23:40:22",{"source":8,"skillName":5,"commands":87,"prompt":97,"zipAvailable":98},[88,91,94],{"tool":89,"command":90},"npx","npx skills add Volontariapp\u002Fmeta --skill volontariapp-meta-scripts",{"tool":92,"command":93},"bunx","bunx skills add Volontariapp\u002Fmeta --skill volontariapp-meta-scripts",{"tool":95,"command":96},"pnpm","pnpm dlx skills add Volontariapp\u002Fmeta --skill volontariapp-meta-scripts","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-meta-scripts\u002FSKILL.md",true,[100,106,110],{"path":101,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":104,"sourceHtmlUrl":105},"index.md","REFERENCE","参考文档",537,"https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-meta-scripts\u002Findex.md",{"path":107,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":108,"sourceHtmlUrl":109},"log.md",1123,"https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-meta-scripts\u002Flog.md",{"path":111,"resourceType":102,"resourceTypeDesc":103,"sizeBytes":112,"sourceHtmlUrl":113},"references\u002Flessons.md",480,"https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-meta-scripts\u002Freferences\u002Flessons.md",[115,139,168,193,213,231],{"skillNo":116,"name":117,"nameZh":6,"description":118,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":119,"categories":120,"keywords":121,"publishedAt":41},"01M6CSW3Y5ZHVBF5BX7S5BAVS0","volontariapp-user-account-deletion","Suppression de compte en deux temps (PENDING_DELETION): requestDeletionWithUserDeleted, finalizeDeletion, fan-out de user.deleted vers les domaines et gather ws. A utiliser pour tout changement de domain-user touchant la suppression, le statut ou le cycle de vie d'un user.","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-user-account-deletion\u002FSKILL.md",[],[122,123,124,125,126,127,128,129,130,26,28,131,132,133,134,135,136,137,138],"user","volontariapp user account deletion","account deletion","deletion","en","gather","sonnet","pending","de","reference","npm","user-account-deletion","src","cycle","domain","npm-packages","packages",{"skillNo":140,"name":141,"nameZh":6,"description":142,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":143,"categories":144,"keywords":150,"publishedAt":41},"01M6CSVC1ZW30DDFZ8VMEYAAK6","volontariapp-proto-contract-evolution","Modifier un contrat Protobuf de proto-registry (champ, message, enum, RPC) sans casser la compatibilité wire, puis suivre la cascade proto-registry, PR automatique dans npm-packages, publication, consommateurs. À utiliser avant toute édition d'un .proto.","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-proto-contract-evolution\u002FSKILL.md",[145],{"categoryNo":146,"categoryName":147,"taxonomyType":148,"taxonomyTypeDesc":149},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[151,152,153,154,155,138,156,26,157,158,159,160,161,162,163,132,164,165,166,167],"volontariapp proto contract evolution","evolution","rpc","analyze","lint","message","workflows","sync","ci","pr","grpc","protobuf","github","registry","sans","yaml","playbook",{"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":177,"publishedAt":41},"01M6CSTPHNTGE0WF5CPE8W7ZYQ","volontariapp-implement-async-event-flow","Guide pas-à-pas pour concevoir et implémenter un flux asynchrone complet (messaging -> outbox -> post-processors -> ws-service -> client).","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fvolontariapp-implement-async-event-flow\u002FSKILL.md",[174],{"categoryNo":175,"categoryName":176,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[178,179,180,181,182,183,184,137,185,134,186,187,188,189,138,190,191,26,192,164],"volontariapp implement async event flow","flow","implement","async","event","mapping","flux","messaging","streams","flows","shared","outbox","processor","architecture","runner",{"skillNo":194,"name":195,"nameZh":6,"description":196,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":197,"categories":198,"keywords":202,"publishedAt":41},"01M6CSRQHS0T9955M8CTA5BYJQ","research","Investigate a question against high-trust primary sources and capture the findings as a Markdown file in the repo. Use when the user wants a topic researched, docs or API facts gathered, or reading legwork delegated to a background agent.","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fplugins\u002Fmatt-pocock\u002Fskills\u002Fresearch\u002FSKILL.md",[199],{"categoryNo":200,"categoryName":201,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",[195,203,204,205,122,206,207,208,209,210,211,212],"investigate","trust","api","file","repo","markdown","docs","capture","use","question",{"skillNo":214,"name":215,"nameZh":6,"description":216,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":217,"categories":218,"keywords":222,"publishedAt":41},"01M6CSRMZ82M1YK96Z4SW1STTD","prototype","Build a throwaway prototype to answer a design question. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like.","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fplugins\u002Fmatt-pocock\u002Fskills\u002Fprototype\u002FSKILL.md",[219],{"categoryNo":220,"categoryName":221,"taxonomyType":148,"taxonomyTypeDesc":149},"01JBSEEDCAT000000000000032","设计师",[215,223,224,122,225,211,226,212,227,228,229,230],"build","check","ui","look","design","explore","model","state",{"skillNo":232,"name":233,"nameZh":6,"description":234,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":235,"categories":236,"keywords":237,"publishedAt":41},"01M6CSRAZC0EJAK565DMY17TC7","grilling","Grill the user relentlessly about a plan, decision, or idea. Use when the user wants to stress-test their thinking, or uses any 'grill' trigger phrases.","https:\u002F\u002Fgithub.com\u002FVolontariapp\u002Fmeta\u002Fblob\u002Fmain\u002F.agents\u002Fplugins\u002Fmatt-pocock\u002Fskills\u002Fgrilling\u002FSKILL.md",[],[233,238,239,122,211,240,241,242,243],"decision","idea","grill","plan","thinking","test"]