[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBPTSVRDV63B933C5ENVZK":3,"skill-same:01M6CBPTSVRDV63B933C5ENVZK":50},{"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":24,"linkOnly":25,"markdownContent":26,"markdownBody":27,"frontMatter":28,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":14,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":6,"ownerDescription":34,"updatedAt":35,"install":36,"resources":49},"01M6CBPTSVRDV63B933C5ENVZK","mission-factory",null,"Use this skill when defining or implementing MissionRuntimeFactory for mission create\u002Frestore paths with message binding.","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\u002F48-mission-system\u002F14-mission-factory\u002FSKILL.md",[],[19,20,21,22,23],"factory","mission factory","create","use","restore","2026-11-10 10:12:30",false,"---\nname: mission-factory\ndescription: Use this skill when defining or implementing MissionRuntimeFactory for mission create\u002Frestore paths with message binding.\n---\n\n# 14-mission-factory\n\nStatus: ACTIVE  \nAppliesTo: v10  \nType: Design \u002F Factory SSOT\n\n## Purpose\n\n`MissionRuntimeFactory`는 runtime create\u002Frestore 경로를 표준화한다.\n\n- `missionUid` 발급\u002F저장소 조회는 담당하지 않는다.\n- `condition_msg_id + GAME_MESSAGE(messageType\u002FsaveType\u002Fcondition_op)` 바인딩을 생성한다.\n\n---\n\n## Hard Rules\n\n- Factory는 `missionUid`를 생성하지 않는다.\n- create\u002Frestore 분기를 분리한다.\n- `saveType == NONE` row는 scheduler 단계에서 걸러진다(Factory에 전달 금지).\n- restore는 타입 fallback을 허용하지 않는다.\n\n---\n\n## Factory Shape\n\n```csharp\npublic static class MissionRuntimeFactory\n{\n    public static MissionRuntimeDaily CreateDaily(DailyMissionRuntimeCreateArgs args);\n    public static MissionRuntimeWeekly CreateWeekly(WeeklyMissionRuntimeCreateArgs args);\n    public static MissionRuntimeBase Restore(MissionRuntimeRestoreArgs args);\n}\n```\n\n---\n\n## Args (정본)\n\n`DailyMissionRuntimeCreateArgs`\n\n- `Mission_id`, `PeriodKey`, `MissionUid`, `Index`\n- `StatType`, `OpType`, `ConditionOpType`, `Condition_value`\n- `SubscribeTrigger`, `UnsubscribeTrigger`, `ReadExternalProgress`, callbacks\n\n`WeeklyMissionRuntimeCreateArgs`\n\n- daily args + `Day`, `IsWaiting`\n\n`MissionRuntimeRestoreArgs`\n\n- `MissionType` + create args + `ProgressValue`, `State`\n\n참고:\n- `Condition_msg_id`\u002F`Message_id`는 Args에 포함하지 않는다. scheduler가 테이블에서 조회하여 `Bind()` 파라미터(`StatType`, `OpType` 등)로 전달한다.\n- RestoreArgs의 `State`는 `MissionRuntimeState` enum이다(WAIT\u002FACTIVE\u002FCOMPLETED).\n\n---\n\n## Create\u002FRestore Rules\n\n- Daily create:\n  - `progressValue = 0`\n  - 기본 ACTIVE\n- Weekly create:\n  - `progressValue = 0`\n  - 기본 WAIT (`day == 1` row만 scheduler에서 즉시 ACTIVE 전환 가능)\n- Restore:\n  - 저장된 progress\u002Fstate를 그대로 사용\n\n---\n\n## Related\n\n- [03-ssot](..\u002F03-ssot\u002FSKILL.md)\n- [13-mission-runtime](..\u002F13-mission-runtime\u002FSKILL.md)\n- [15-mission-scheduler](..\u002F15-mission-scheduler\u002FSKILL.md)\n","# 14-mission-factory\n\nStatus: ACTIVE  \nAppliesTo: v10  \nType: Design \u002F Factory SSOT\n\n## Purpose\n\n`MissionRuntimeFactory`는 runtime create\u002Frestore 경로를 표준화한다.\n\n- `missionUid` 발급\u002F저장소 조회는 담당하지 않는다.\n- `condition_msg_id + GAME_MESSAGE(messageType\u002FsaveType\u002Fcondition_op)` 바인딩을 생성한다.\n\n---\n\n## Hard Rules\n\n- Factory는 `missionUid`를 생성하지 않는다.\n- create\u002Frestore 분기를 분리한다.\n- `saveType == NONE` row는 scheduler 단계에서 걸러진다(Factory에 전달 금지).\n- restore는 타입 fallback을 허용하지 않는다.\n\n---\n\n## Factory Shape\n\n```csharp\npublic static class MissionRuntimeFactory\n{\n    public static MissionRuntimeDaily CreateDaily(DailyMissionRuntimeCreateArgs args);\n    public static MissionRuntimeWeekly CreateWeekly(WeeklyMissionRuntimeCreateArgs args);\n    public static MissionRuntimeBase Restore(MissionRuntimeRestoreArgs args);\n}\n```\n\n---\n\n## Args (정본)\n\n`DailyMissionRuntimeCreateArgs`\n\n- `Mission_id`, `PeriodKey`, `MissionUid`, `Index`\n- `StatType`, `OpType`, `ConditionOpType`, `Condition_value`\n- `SubscribeTrigger`, `UnsubscribeTrigger`, `ReadExternalProgress`, callbacks\n\n`WeeklyMissionRuntimeCreateArgs`\n\n- daily args + `Day`, `IsWaiting`\n\n`MissionRuntimeRestoreArgs`\n\n- `MissionType` + create args + `ProgressValue`, `State`\n\n참고:\n- `Condition_msg_id`\u002F`Message_id`는 Args에 포함하지 않는다. scheduler가 테이블에서 조회하여 `Bind()` 파라미터(`StatType`, `OpType` 등)로 전달한다.\n- RestoreArgs의 `State`는 `MissionRuntimeState` enum이다(WAIT\u002FACTIVE\u002FCOMPLETED).\n\n---\n\n## Create\u002FRestore Rules\n\n- Daily create:\n  - `progressValue = 0`\n  - 기본 ACTIVE\n- Weekly create:\n  - `progressValue = 0`\n  - 기본 WAIT (`day == 1` row만 scheduler에서 즉시 ACTIVE 전환 가능)\n- Restore:\n  - 저장된 progress\u002Fstate를 그대로 사용\n\n---\n\n## Related\n\n- [03-ssot](..\u002F03-ssot\u002FSKILL.md)\n- [13-mission-runtime](..\u002F13-mission-runtime\u002FSKILL.md)\n- [15-mission-scheduler](..\u002F15-mission-scheduler\u002FSKILL.md)\n",{"name":5,"description":7},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian-unity\u002F50-mobile-package\u002F48-mission-system\u002F14-mission-factory","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft","Kim Hyong Joon","2026-04-12 18:44:10",{"source":8,"skillName":5,"commands":37,"prompt":47,"zipAvailable":48},[38,41,44],{"tool":39,"command":40},"npx","npx skills add devwinsoft\u002Fdevian --skill mission-factory",{"tool":42,"command":43},"bunx","bunx skills add devwinsoft\u002Fdevian --skill mission-factory",{"tool":45,"command":46},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill mission-factory","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian-unity\u002F50-mobile-package\u002F48-mission-system\u002F14-mission-factory\u002FSKILL.md",true,[],[51,57,65,73,82,89],{"skillNo":52,"name":53,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":54,"categories":55,"keywords":56,"publishedAt":24},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[53],{"skillNo":58,"name":59,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":24},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[63,64],"archive","90 project archive",{"skillNo":66,"name":67,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":24},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[71,72],"management","30 env management",{"skillNo":74,"name":75,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":24},"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",[],[79,80,81],"push","page","19 page push send",{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":24},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[80,88],"18 page savedata",{"skillNo":90,"name":91,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":24},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[80,95],"17 page deobfuscate"]