[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBCH06BQJX4MWASHHRCG05":3,"skill-same:01M6CBCH06BQJX4MWASHHRCG05":71},{"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":20,"linkOnly":21,"markdownContent":22,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":13,"repositoryHtmlUrl":27,"repositoryHomepageUrl":6,"ownerHtmlUrl":28,"ownerBlogUrl":6,"ownerDescription":29,"updatedAt":30,"install":31,"resources":44},"01M6CBCH06BQJX4MWASHHRCG05","10-red-dot-manager",null,"devwinsoft\u002Fdevian","devwinsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F22570160?v=4","01M6C6RR8W05NH8NPKQNCE3Q72","maoshy","01M6C6RRDJ5TJJCZXRTY801YDH",0,"MIT","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F21-game-package\u002F14-red-dot-system\u002F10-red-dot-manager\u002FSKILL.md",[],[18,19],"dot","10 red dot manager","2026-11-10 10:12:30",false,"# 10-red-dot-manager\n\nStatus: ACTIVE\nAppliesTo: v10\n\nGamePackage `RedDotManager` 설계 문서다.\n\n---\n\n## Implementation Location (target 3-path mirror)\n\n- UPM (정본):\n  `framework-cs\u002Fupm\u002Fcom.devian.foundation\u002FSamples~\u002FGamePackage\u002FRuntime\u002FRedDot\u002FRedDotManager.cs`\n- Packages (sync):\n  `framework-cs\u002Fapps\u002FUnityExample\u002FPackages\u002Fcom.devian.foundation\u002FSamples~\u002FGamePackage\u002FRuntime\u002FRedDot\u002FRedDotManager.cs`\n- Assets\u002FSamples (import):\n  `framework-cs\u002Fapps\u002FUnityExample\u002FAssets\u002FSamples\u002FDevian Foundation\u002F{foundationVersion}\u002FGamePackage\u002FRuntime\u002FRedDot\u002FRedDotManager.cs`\n\n---\n\n## Target Class Design\n\n```csharp\npublic sealed class RedDotManager : CompoSingleton\u003CRedDotManager>\n{\n    public void Set(string key, bool value);\n    public void Clear(string key);\n    public void ClearAll();\n\n    public bool IsOn(string key);\n    public bool Contains(string key);\n    public bool HasActiveChild(string key);\n    public bool TryGetState(string key, out RedDotStateView state);\n\n    public void Subcribe(EntityId ownerKey, string key, Action\u003CRedDotChanged> handler);\n    public void UnSubcribe(EntityId ownerKey);\n}\n```\n\n---\n\n## Responsibilities\n\n- `CompoSingleton\u003CRedDotManager>`로 상태 정본 1개를 유지\n- key별 `RedDotNode` 저장\n- parent chain 자동 생성\n- `SelfOn` 변경 처리\n- `ActiveChildCount` propagation\n- 집계 상태 조회\n- `RedDotChanged` 이벤트 발행\n\n비책임:\n- UI component 갱신\n- 애니메이션\n- 조건 계산\n- 영속 저장\n- 외부 시스템 life-cycle 관리\n\n---\n\n## Internal Data Model\n\n`RedDotNode`\n- `Key`\n- `ParentKey`\n- `SelfOn`\n- `ActiveChildCount`\n- `IsOn`\n- `HasActiveChild`\n\n설계 포인트:\n- parent는 child 전체를 순회하지 않고 `ActiveChildCount`만으로 집계를 판단한다.\n- child on\u002Foff 전환 시 parent chain은 `+1 \u002F -1` delta만 전파한다.\n- `Set(\"group.item001\", true)` 이후 `group`은 `HasActiveChild == true`로 조회 가능하다.\n\n---\n\n## Event Delivery\n\n- 내부 trigger는 `RedDotMessageTrigger`가 소유한다.\n- trigger msg key는 `RED_DOT_MESSAGE_TYPE.STATE_CHANGED` 1개다.\n- `Subcribe(ownerKey, key, handler)`는 trigger를 직접 노출하지 않고 exact key filter를 걸어 전달한다.\n- ownerKey는 `UnityEngine.EntityId`를 사용한다.\n- `ClearAll()`은 구독자를 유지한 채, 실제로 on 상태였던 key들에 false payload를 발행한다.\n\n## Runtime Wiring\n\n- GamePackage 런타임은 `MobileApplication` 의존을 두지 않는다.\n- 샘플 앱 프리팹은 `RedDotManager`를 실제 컴포넌트로 포함해야 한다.\n- 런타임 사용 진입점은 `RedDotManager.Instance`다.\n\n---\n\n## Notes\n\n- `Set(key, false)`는 unknown key에 대해 no-op이다.\n- `IsOn`만으로 원인을 알 수 없으므로 UI\u002F로직에서 원인 분기가 필요하면 `TryGetState`를 사용한다.\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian-unity\u002F21-game-package\u002F14-red-dot-system\u002F10-red-dot-manager","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft","Kim Hyong Joon","2026-04-12 18:44:10",{"source":7,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add devwinsoft\u002Fdevian --skill 10-red-dot-manager",{"tool":37,"command":38},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 10-red-dot-manager",{"tool":40,"command":41},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 10-red-dot-manager","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F21-game-package\u002F14-red-dot-system\u002F10-red-dot-manager\u002FSKILL.md",true,[45,51,55,59,63,67],{"path":46,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":49,"sourceHtmlUrl":50},"delegation.md","REFERENCE","参考文档",5229,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-agent-wallets\u002Fdelegation.md",{"path":52,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":53,"sourceHtmlUrl":54},"evals\u002Fevals.json",5225,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-agent-wallets\u002Fevals\u002Fevals.json",{"path":56,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":57,"sourceHtmlUrl":58},"policy.md",5289,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-agent-wallets\u002Fpolicy.md",{"path":60,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":61,"sourceHtmlUrl":62},"setup.md",6697,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-agent-wallets\u002Fsetup.md",{"path":64,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":65,"sourceHtmlUrl":66},"SOURCE.md",353,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-agent-wallets\u002FSOURCE.md",{"path":68,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":69,"sourceHtmlUrl":70},"TRUST.auto.yaml",2182,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fchains\u002Fmystenlabs-sui-agent-wallets\u002FTRUST.auto.yaml",[72,78,86,94,103,110],{"skillNo":73,"name":74,"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":75,"categories":76,"keywords":77,"publishedAt":20},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[74],{"skillNo":79,"name":80,"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":81,"categories":82,"keywords":83,"publishedAt":20},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[84,85],"archive","90 project archive",{"skillNo":87,"name":88,"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":89,"categories":90,"keywords":91,"publishedAt":20},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[92,93],"management","30 env management",{"skillNo":95,"name":96,"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":97,"categories":98,"keywords":99,"publishedAt":20},"01M6CBWYD3TGWBQV7V35551THF","19-page-push-send","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F19-page-push-send\u002FSKILL.md",[],[100,101,102],"push","page","19 page push send",{"skillNo":104,"name":105,"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":106,"categories":107,"keywords":108,"publishedAt":20},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[101,109],"18 page savedata",{"skillNo":111,"name":112,"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":113,"categories":114,"keywords":115,"publishedAt":20},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[101,116],"17 page deobfuscate"]