[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBGXHDP2E4TKGFVMNG1G0X":3,"skill-same:01M6CBGXHDP2E4TKGFVMNG1G0X":44},{"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":19,"linkOnly":20,"markdownContent":21,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":13,"repositoryHtmlUrl":26,"repositoryHomepageUrl":6,"ownerHtmlUrl":27,"ownerBlogUrl":6,"ownerDescription":28,"updatedAt":29,"install":30,"resources":43},"01M6CBGXHDP2E4TKGFVMNG1G0X","33-account-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\u002F50-mobile-package\u002F20-account-system\u002F33-account-manager\u002FSKILL.md",[],[18],"33 account manager","2026-11-10 10:12:30",false,"# 33-account-manager — Account Manager\n\nStatus: ACTIVE\nAppliesTo: v10\n\n## Singleton\n- `AccountManager`는 `CompoSingleton\u003CAccountManager>` 기반이다.\n- 샘플 씬(또는 초기화 루틴)에서 컴포넌트로 배치되어 lifecycle을 가진다.\n\n## Scope\n포함:\n- Firebase Auth 기반 인증 처리\n- EDITOR\u002FGUEST anonymous 로그인\n- GOOGLE(Android) 인증 (GPGS server auth code -> Firebase credential)\n- APPLE(iOS) 인증 (caller 제공 credential -> Firebase credential)\n- Anonymous -> Social link 처리 (`LinkWithCredentialAsync`)\n- 로그인 타입\u002F계정 메타(`AccountStorage`) 보관\n- 런타임 인증 세션 복구 (`EnsureRuntimeAuthSessionAsync`)\n\n제외:\n- SaveData sync\u002F초기화\n- 구매 진입 인증 게이트 오케스트레이션\n- Scene\u002FUI 제어\n\n## Login Type (Platform)\n- `NONE` (0): 초기\u002F로그아웃 상태\n- `EDITOR` (1): Firebase anonymous\n- `GUEST` (2): Firebase anonymous\n- `GOOGLE` (3): Android + GPGS + Firebase credential\n- `APPLE` (4): iOS + Apple credential + Firebase credential\n\n## Public API\n- `LoginAsync(LoginType, CancellationToken) : Task\u003CCommonResult>`\n- `LoginAsync(LoginType, LoginCredential, CancellationToken) : Task\u003CCommonResult>`\n- `EnsureRuntimeAuthSessionAsync(CancellationToken) : Task\u003CCommonResult\u003Cbool>>`\n  - `true`: 인증 세션 존재\u002F복구 성공\n  - `false`: 복구 대상 없음 또는 silent 복구 불가\n- `TryRestoreGoogleAuthAsync(CancellationToken) : Task\u003CCommonResult\u003Cbool>>`\n- `Logout() : void`\n- `ApplyStorage(AccountStorage)`\n\n## Hard Rules\n- AccountManager는 인증\u002F계정 메타만 책임진다.\n- 저장 동기화\u002F세션 데이터 초기화는 `LoginManager` 책임이다.\n- 구매 인증 readiness 오케스트레이션은 `LoginManager` 책임이다.\n- 다른 시스템은 로그인 여부 판정을 위해 FirebaseAuth를 직접 사용하지 않는다.\n\n## Storage Ownership\n- `AccountManager`는 `AccountStorage`를 직접 소유한다.\n- 상위 시스템은 `AccountManager.Instance.Storage`를 저장\u002F복원 대상으로 사용한다.\n- JSON 직렬화 규약은 `21-savedata-system\u002F43-savedata-json-codec`를 따른다.\n\n## Location (3-path mirror)\n- UPM: `framework-cs\u002Fupm\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FAccount\u002FAccountManager.cs`\n- Packages: `framework-cs\u002Fapps\u002FUnityExample\u002FPackages\u002Fcom.devian.foundation\u002FSamples~\u002FMobilePackage\u002FRuntime\u002FAccount\u002FAccountManager.cs`\n- Assets\u002FSamples: `framework-cs\u002Fapps\u002FUnityExample\u002FAssets\u002FSamples\u002FDevian Samples\u002F{version}\u002FMobilePackage\u002FRuntime\u002FAccount\u002FAccountManager.cs`\n\n## Related\n(upstream dependencies only — consumers reference this skill from their own Related sections)\n\n## Out of Scope\n- Apple Sign-in UI\u002F네이티브 토큰 획득\n- SaveData sync 오케스트레이션\n- 구매\u002F원격 데이터 초기화 오케스트레이션\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian-unity\u002F50-mobile-package\u002F20-account-system\u002F33-account-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":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add devwinsoft\u002Fdevian --skill 33-account-manager",{"tool":36,"command":37},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 33-account-manager",{"tool":39,"command":40},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 33-account-manager","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F50-mobile-package\u002F20-account-system\u002F33-account-manager\u002FSKILL.md",true,[],[45,51,59,67,76,83],{"skillNo":46,"name":47,"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":48,"categories":49,"keywords":50,"publishedAt":19},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[47],{"skillNo":52,"name":53,"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":54,"categories":55,"keywords":56,"publishedAt":19},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[57,58],"archive","90 project archive",{"skillNo":60,"name":61,"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":62,"categories":63,"keywords":64,"publishedAt":19},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[65,66],"management","30 env management",{"skillNo":68,"name":69,"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":70,"categories":71,"keywords":72,"publishedAt":19},"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",[],[73,74,75],"push","page","19 page push send",{"skillNo":77,"name":78,"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":79,"categories":80,"keywords":81,"publishedAt":19},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[74,82],"18 page savedata",{"skillNo":84,"name":85,"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":86,"categories":87,"keywords":88,"publishedAt":19},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[74,89],"17 page deobfuscate"]