[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6P4W431AMS641FYPDX801T2":3,"skill-same:01M6P4W431AMS641FYPDX801T2":52},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":25,"linkOnly":26,"markdownContent":27,"markdownBody":28,"frontMatter":29,"refName":30,"commitSha":31,"skillDirectory":32,"forksCount":33,"repositoryHtmlUrl":34,"repositoryHomepageUrl":6,"ownerHtmlUrl":35,"ownerBlogUrl":6,"ownerDescription":36,"updatedAt":37,"install":38,"resources":51},"01M6P4W431AMS641FYPDX801T2","command-handle-implementation",null,"Implement command handles for the current feature","maurodesouza\u002Fai-kanban-app-lab","maurodesouza","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54520907?v=4","01M6P3VA3WVQC4XZ0RQWJCDKW6","Mauro de Souza","01M6P3VA7YK770SNWT12GBEGAF",1,"MIT","https:\u002F\u002Fgithub.com\u002Fmaurodesouza\u002Fai-kanban-app-lab\u002Fblob\u002Fmain\u002Flab-10\u002F.codex\u002Fskills\u002Fcommand-handle-implementation\u002FSKILL.md",[],[19,20,21,22,23,24],"command","implementation","command handle implementation","implement","feature","for","2026-11-10 10:12:30",false,"---\nname: command-handle-implementation\ndescription: Implement command handles for the current feature\n---\n\n# Command Handle Implementation\n\n## When to use\n\nUse this skill whenever you need to create or modify a command Handle — the component responsible for registering `command.handle()` listeners.\n\nThis includes:\n\n- Creating a new Handle.\n- Adding an action to an existing Handle.\n- Refactoring an existing Handle.\n\nDo not use this skill for general command architecture questions or command dispatching. Follow the `command-bus-architecture` skill instead.\n\nIf `src\u002Flib\u002Fcommand\u002F` does not exist, invoke the `setup-command-system` skill before implementing the Handle.\n\n## Before implementation\n\n1. Identify the domain\u002Ffeature that owns the Handle.\n2. Confirm whether the action is `Action` or `ScopedAction`.\n3. Check whether the action declaration already exists.\n4. Check whether a Handle already exists for the domain.\n\nDo not change the action scope or architecture merely to simplify the implementation.\n\n## File structure\n\nShared application context:\n\n```text\nsrc\u002Fcomponents\u002Fhandles\u002F\u003Cdomain>\u002F\n├── \u003Cdomain>-actions.ts\n└── \u003Cdomain>-handle.tsx\n```\n\nFeature context:\n\n```text\nsrc\u002Ffeatures\u002F\u003Cfeature>\u002Fcomponents\u002Fhandles\u002F\u003Cdomain>\u002F\n├── \u003Cdomain>-actions.ts\n└── \u003Cdomain>-handle.tsx\n```\n\n## Action declarations\n\nIf the action is new:\n\n* Declare its type in `\u003Cdomain>-actions.ts`.\n* Extend `#\u002Flib\u002Fcommand\u002Fglobal` through module augmentation.\n* Use `Action` for global actions.\n* Use `ScopedAction` for instance-specific actions.\n* Never modify the global `Actions` interface directly.\n\nIf the action already exists, reuse its existing declaration. Do not redeclare it.\n\n## Handle implementation\n\nHandler functions MUST:\n\n* Be defined inside the component.\n* Be defined outside `useEffect`.\n* Contain the application\u002Forchestration logic.\n* Call store mutations when state needs to change.\n* Call external APIs when required.\n* Dispatch other commands when required.\n\nExample:\n\n```typescript\nexport function MyHandle() {\n  async function handleDoThing(payload: Payload) {\n    const result = await api.process(payload);\n\n    myStore.setData(result);\n  }\n\n  useEffect(() => {\n    const disposes = [\n      command.handle(\"myDomain.doThing\", handleDoThing),\n    ];\n\n    return () => {\n      for (const dispose of disposes) dispose();\n    };\n  }, []);\n\n  return null;\n}\n```\n\n## Registration\n\n`command.handle()` MUST:\n\n* Be called inside `useEffect`.\n* Receive handlers by reference.\n* Receive `{ instanceId }` when registering a `ScopedAction`.\n* Return a disposer that is cleaned up.\n\nDo not put handler logic inline:\n\n```typescript\n\u002F\u002F ❌ Wrong\ncommand.handle(\"myDomain.doThing\", async (payload) => {\n  \u002F\u002F logic\n});\n```\n\nUse a named handler instead:\n\n```typescript\n\u002F\u002F ✅ Correct\nasync function handleDoThing(payload: Payload) {\n  \u002F\u002F logic\n}\n\ncommand.handle(\"myDomain.doThing\", handleDoThing);\n```\n\n## Cleanup\n\nStore every disposer returned by `command.handle()`.\n\nDispose every handler when the Handle unmounts.\n\n```typescript\nuseEffect(() => {\n  const disposes = [\n    command.handle(\"domain.action\", handleAction),\n    command.handle(\"domain.otherAction\", handleOtherAction),\n  ];\n\n  return () => {\n    for (const dispose of disposes) dispose();\n  };\n}, []);\n```\n\n## Dependencies\n\nUse the correct `useEffect` dependencies.\n\nIf handlers close over a stable store reference and dependencies intentionally need to be omitted, use:\n\n```typescript\n\u002F\u002F biome-ignore lint\u002Fcorrectness\u002FuseExhaustiveDependencies: handlers close over the stable store reference\n```\n\nAlways provide a clear reason for the suppression.\n\n## Store and Dispatching\n\nStore rules, the Store\u002FHandle split and dispatching rules are defined in `command-bus-architecture`. In a Handle:\n\n* Change state only through store setters.\n* Read derived values from the store (`store.$value`); never compute them in the Handle.\n* Dispatch through the `actions` proxy; `command.dispatch()` only for external\u002Frealtime\u002FAI triggers.\n\n## Verification\n\nBefore finishing:\n\n* [ ] Typecheck and lint pass (repository scripts from `epic-discover-repository`).\n* [ ] Handlers are outside `useEffect`.\n* [ ] `command.handle()` receives handlers by reference.\n* [ ] All disposers are cleaned up.\n* [ ] Scoped actions receive the correct `instanceId`.\n* [ ] New actions use module augmentation.\n* [ ] Existing actions are not redeclared.\n* [ ] MobX store contains state, setters and `$` derived values only; no execution logic.\n* [ ] The Handle computes no derived values.\n* [ ] Normal dispatch uses the `actions` proxy.\n* [ ] No unnecessary `command.dispatch()` is used.\n","# Command Handle Implementation\n\n## When to use\n\nUse this skill whenever you need to create or modify a command Handle — the component responsible for registering `command.handle()` listeners.\n\nThis includes:\n\n- Creating a new Handle.\n- Adding an action to an existing Handle.\n- Refactoring an existing Handle.\n\nDo not use this skill for general command architecture questions or command dispatching. Follow the `command-bus-architecture` skill instead.\n\nIf `src\u002Flib\u002Fcommand\u002F` does not exist, invoke the `setup-command-system` skill before implementing the Handle.\n\n## Before implementation\n\n1. Identify the domain\u002Ffeature that owns the Handle.\n2. Confirm whether the action is `Action` or `ScopedAction`.\n3. Check whether the action declaration already exists.\n4. Check whether a Handle already exists for the domain.\n\nDo not change the action scope or architecture merely to simplify the implementation.\n\n## File structure\n\nShared application context:\n\n```text\nsrc\u002Fcomponents\u002Fhandles\u002F\u003Cdomain>\u002F\n├── \u003Cdomain>-actions.ts\n└── \u003Cdomain>-handle.tsx\n```\n\nFeature context:\n\n```text\nsrc\u002Ffeatures\u002F\u003Cfeature>\u002Fcomponents\u002Fhandles\u002F\u003Cdomain>\u002F\n├── \u003Cdomain>-actions.ts\n└── \u003Cdomain>-handle.tsx\n```\n\n## Action declarations\n\nIf the action is new:\n\n* Declare its type in `\u003Cdomain>-actions.ts`.\n* Extend `#\u002Flib\u002Fcommand\u002Fglobal` through module augmentation.\n* Use `Action` for global actions.\n* Use `ScopedAction` for instance-specific actions.\n* Never modify the global `Actions` interface directly.\n\nIf the action already exists, reuse its existing declaration. Do not redeclare it.\n\n## Handle implementation\n\nHandler functions MUST:\n\n* Be defined inside the component.\n* Be defined outside `useEffect`.\n* Contain the application\u002Forchestration logic.\n* Call store mutations when state needs to change.\n* Call external APIs when required.\n* Dispatch other commands when required.\n\nExample:\n\n```typescript\nexport function MyHandle() {\n  async function handleDoThing(payload: Payload) {\n    const result = await api.process(payload);\n\n    myStore.setData(result);\n  }\n\n  useEffect(() => {\n    const disposes = [\n      command.handle(\"myDomain.doThing\", handleDoThing),\n    ];\n\n    return () => {\n      for (const dispose of disposes) dispose();\n    };\n  }, []);\n\n  return null;\n}\n```\n\n## Registration\n\n`command.handle()` MUST:\n\n* Be called inside `useEffect`.\n* Receive handlers by reference.\n* Receive `{ instanceId }` when registering a `ScopedAction`.\n* Return a disposer that is cleaned up.\n\nDo not put handler logic inline:\n\n```typescript\n\u002F\u002F ❌ Wrong\ncommand.handle(\"myDomain.doThing\", async (payload) => {\n  \u002F\u002F logic\n});\n```\n\nUse a named handler instead:\n\n```typescript\n\u002F\u002F ✅ Correct\nasync function handleDoThing(payload: Payload) {\n  \u002F\u002F logic\n}\n\ncommand.handle(\"myDomain.doThing\", handleDoThing);\n```\n\n## Cleanup\n\nStore every disposer returned by `command.handle()`.\n\nDispose every handler when the Handle unmounts.\n\n```typescript\nuseEffect(() => {\n  const disposes = [\n    command.handle(\"domain.action\", handleAction),\n    command.handle(\"domain.otherAction\", handleOtherAction),\n  ];\n\n  return () => {\n    for (const dispose of disposes) dispose();\n  };\n}, []);\n```\n\n## Dependencies\n\nUse the correct `useEffect` dependencies.\n\nIf handlers close over a stable store reference and dependencies intentionally need to be omitted, use:\n\n```typescript\n\u002F\u002F biome-ignore lint\u002Fcorrectness\u002FuseExhaustiveDependencies: handlers close over the stable store reference\n```\n\nAlways provide a clear reason for the suppression.\n\n## Store and Dispatching\n\nStore rules, the Store\u002FHandle split and dispatching rules are defined in `command-bus-architecture`. In a Handle:\n\n* Change state only through store setters.\n* Read derived values from the store (`store.$value`); never compute them in the Handle.\n* Dispatch through the `actions` proxy; `command.dispatch()` only for external\u002Frealtime\u002FAI triggers.\n\n## Verification\n\nBefore finishing:\n\n* [ ] Typecheck and lint pass (repository scripts from `epic-discover-repository`).\n* [ ] Handlers are outside `useEffect`.\n* [ ] `command.handle()` receives handlers by reference.\n* [ ] All disposers are cleaned up.\n* [ ] Scoped actions receive the correct `instanceId`.\n* [ ] New actions use module augmentation.\n* [ ] Existing actions are not redeclared.\n* [ ] MobX store contains state, setters and `$` derived values only; no execution logic.\n* [ ] The Handle computes no derived values.\n* [ ] Normal dispatch uses the `actions` proxy.\n* [ ] No unnecessary `command.dispatch()` is used.\n",{"name":5,"description":7},"main","6f1867f215cf86d20099b6dfb1164c79abfb87ce","lab-10\u002F.codex\u002Fskills\u002Fcommand-handle-implementation",0,"https:\u002F\u002Fgithub.com\u002Fmaurodesouza\u002Fai-kanban-app-lab","https:\u002F\u002Fgithub.com\u002Fmaurodesouza","Software Engineer","2026-10-28 02:01:00",{"source":8,"skillName":5,"commands":39,"prompt":49,"zipAvailable":50},[40,43,46],{"tool":41,"command":42},"npx","npx skills add maurodesouza\u002Fai-kanban-app-lab --skill command-handle-implementation",{"tool":44,"command":45},"bunx","bunx skills add maurodesouza\u002Fai-kanban-app-lab --skill command-handle-implementation",{"tool":47,"command":48},"pnpm","pnpm dlx skills add maurodesouza\u002Fai-kanban-app-lab --skill command-handle-implementation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmaurodesouza\u002Fai-kanban-app-lab\u002Fblob\u002Fmain\u002Flab-10\u002F.codex\u002Fskills\u002Fcommand-handle-implementation\u002FSKILL.md",true,[],[53,77,94,118,130,141],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":25},"01M6P519M13JTBZDK3ZJP48P2C","utils-implementation","Write and organize utils (pure helpers for formatting, mapping, filtering, math, parsing, ids, storage) as one namespace object per domain with clear, readable names. Use before creating or changing any util.","https:\u002F\u002Fgithub.com\u002Fmaurodesouza\u002Fai-kanban-app-lab\u002Fblob\u002Fmain\u002Flab-10\u002F.codex\u002Fskills\u002Futils-implementation\u002FSKILL.md",[],[60,20,61,62,24,63,64,65,66,67,68,69,70,71,72,73,74,75,76],"utils implementation","utils","parsing","object","storage","ids","clear","math","write","filtering","with","use","organize","domain","mapping","formatting","as",{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":88,"publishedAt":25},"01M6P516BP8GPRJHPGVFWRF5T8","test-writer","Write tests for the current implementation","https:\u002F\u002Fgithub.com\u002Fmaurodesouza\u002Fai-kanban-app-lab\u002Fblob\u002Fmain\u002Flab-10\u002F.codex\u002Fskills\u002Ftest-writer\u002FSKILL.md",[83],{"categoryNo":84,"categoryName":85,"taxonomyType":86,"taxonomyTypeDesc":87},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[89,90,91,92,68,20,93,24],"test","test writer","writer","write tests","tests",{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":25},"01M6P50M0Z2AQH32ZTV90D5V32","tech-lead","Analyze a project, turn the user's goal into an implementation-ready GitHub Epic and Issues (following project rules, the Command Bus architecture and Fragiola UI), then start epic-implementer automatically (use the no-implement flag to stop after planning).","https:\u002F\u002Fgithub.com\u002Fmaurodesouza\u002Fai-kanban-app-lab\u002Fblob\u002Fmain\u002Flab-10\u002F.codex\u002Fskills\u002Ftech-lead\u002FSKILL.md",[],[101,102,103,104,22,105,106,107,108,109,110,111,112,113,19,114,71,115,116,117],"tech","tech lead","ready","command bus architecture","github","EPIC","architecture","planning","issues","ui","start","analyze","Rules","implementer","goal","stop","project",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":25},"01M6P50GND99S9QQY6KWPP6NW9","tech-lead-publish","Publish a final Epic and its Issues to GitHub, linked and labeled, keeping dependency and execution information. Sub-skill of tech-lead.","https:\u002F\u002Fgithub.com\u002Fmaurodesouza\u002Fai-kanban-app-lab\u002Fblob\u002Fmain\u002Flab-10\u002F.codex\u002Fskills\u002Ftech-lead-publish\u002FSKILL.md",[],[125,102,101,126,105,109,127,128,106,129],"tech lead publish","publish","execution","dependency","information",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":25},"01M6P50D4P2SQSYZM7TZMHZA0J","setup-command-system","Install the Command System architecture in the project","https:\u002F\u002Fgithub.com\u002Fmaurodesouza\u002Fai-kanban-app-lab\u002Fblob\u002Fmain\u002Flab-10\u002F.codex\u002Fskills\u002Fsetup-command-system\u002FSKILL.md",[],[137,19,138,139,107,140,117],"setup command system","system","setup","install",{"skillNo":142,"name":143,"nameZh":6,"description":144,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":25},"01M6P50A032630X9JDDZYJMNV3","reviewer","Review code changes and provide feedback","https:\u002F\u002Fgithub.com\u002Fmaurodesouza\u002Fai-kanban-app-lab\u002Fblob\u002Fmain\u002Flab-10\u002F.codex\u002Fskills\u002Freviewer\u002FSKILL.md",[],[143,148,149,150,151,152],"code","review code","feedback","changes","review"]