[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBSHSAZNDME4Q96HAFSWS3":3,"skill-same:01M6CBSHSAZNDME4Q96HAFSWS3":56},{"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":21,"linkOnly":22,"markdownContent":23,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":13,"repositoryHtmlUrl":28,"repositoryHomepageUrl":6,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":30,"updatedAt":31,"install":32,"resources":45},"01M6CBSHSAZNDME4Q96HAFSWS3","06-generated-integration",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\u002F06-generated-integration\u002FSKILL.md",[],[18,19,20],"integration","generated","06 generated integration","2026-11-10 10:12:30",false,"# 06-generated-integration\n\nStatus: ACTIVE\nAppliesTo: v10\nSSOT: skills\u002Fdevian\u002F01-policy\u002FSKILL.md\n\n## Purpose\n\ngenerated 산출물을 프로젝트에 통합할 때의 **소유권\u002F폴더\u002F수정 금지 규칙**을 정의한다.\n\n이 문서는 \"generated를 어떻게 취급할지\"만 말한다.\n실제 생성 파일 목록은 **런타임\u002F제너레이터 코드**를 정답으로 본다.\n\n---\n\n## 런타임 참조 정책 (Hard Rule)\n\n**생성물이 런타임을 참조할 때는 `using Devian;`만 사용한다.**\n\n| 구분 | 생성물 namespace | 런타임 참조 |\n|------|------------------|------------|\n| Domain 모듈 | `Devian.Domain.{DomainKey}` | `using Devian;` |\n| Protocol 모듈 | `Devian.Protocol.{ProtocolGroup}` | `using Devian;` |\n\n> **금지 패턴:**\n> 생성물에서 분리된 런타임 하위 네임스페이스 참조 금지.\n> 빌더\u002F제너레이터가 런타임 참조를 생성할 때 `using Devian;`만 사용해야 한다.\n\n---\n\n## Ownership\n\n- `framework-cs\u002Fmodule\u002F**\u002F*.g.cs`, `framework-ts\u002Fmodule\u002F**\u002F*.g.ts` 는 **기계 소유**다.\n- 사람은 이 파일을 수정하지 않는다.\n- 수정이 필요하면 입력(contracts\u002Ftables\u002Fprotocols) 또는 generator 코드 변경으로 해결한다.\n\n## Commit Policy\n\n- generated는 **커밋 대상**이다.\n  - 빌드 없이도 소비자가 타입\u002Fcodec을 사용할 수 있어야 한다.\n\n## Directory Expectations\n\n정확한 출력 루트는 `{buildInputJson}`의 csConfig\u002FtsConfig가 정본이다.\n\n### 출력 경로 규칙\n\n| 타겟 | Domain 출력 경로 | Protocol 출력 경로 |\n|------|------------------|-------------------|\n| C# | `{csConfig.generateDir}\u002FDevian.Domain.{DomainKey}\u002F` | `{csConfig.generateDir}\u002FDevian.Protocol.{ProtocolGroup}\u002F` |\n| TS | `{tsConfig.generateDir}\u002Fdevian-domain-{domain}\u002F` | `{tsConfig.generateDir}\u002Fdevian-protocol-{group}\u002F` |\n| Data (ndjson) | `{tableDir}\u002Fndjson\u002F` | - |\n| Data (pb64) | `{tableDir}\u002Fpb64\u002F` (pk 옵션 테이블만) | - |\n| String Table (ndjson) | `{stringDir}\u002Fndjson\u002F{Language}\u002F` | - |\n| String Table (pb64) | `{stringDir}\u002Fpb64\u002F{Language}\u002F` | - |\n\n> **생성물 namespace 고정 (Hard Rule):**\n> C# 생성물 namespace는 `Devian.Protocol.{ProtocolGroup}`으로 고정이며, 런타임 모듈 단일화와 무관하게 변경하지 않는다.\n\n> **도메인 폴더 미사용 (Hard Rule):**\n> 최종 경로에 `{Domain}` 폴더를 생성하지 않는다. 동일 파일명 충돌 시 빌드 FAIL.\n\n### 권장 구조\n\n```\nframework-cs\u002F\n├── module\u002F\n│   ├── Devian\u002F                             # 수동 관리 (런타임 모듈)\n│   │   └── Devian.csproj\n│   ├── Devian.Domain.{DomainKey}\u002F          # 생성 산출물 (기계 소유)\n│   │   └── Generated\u002F\n│   │       └── {DomainKey}.g.cs\n│   └── Devian.Protocol.{ProtocolGroup}\u002F    # 생성 산출물 (기계 소유)\n│       ├── Devian.Protocol.{ProtocolGroup}.csproj\n│       └── {ProtocolName}.g.cs\n\nframework-ts\u002F\n├── module\u002F\n│   ├── devian\u002F                             # 수동 관리 (런타임 패키지, @devian\u002Fcore)\n│   ├── devian-domain-{domain}\u002F             # 생성 산출물 (기계 소유)\n│   │   ├── Generated\u002F\n│   │   │   └── {Domain}.g.ts\n│   │   └── index.ts\n│   └── devian-protocol-{group}\u002F            # 생성 산출물 (기계 소유)\n│       ├── {ProtocolName}.g.ts\n│       └── index.ts\n\n{tableDir}\u002F\n├── ndjson\u002F\n│   └── *.json\n└── pb64\u002F\n    └── *.asset  # pk 옵션 테이블만\n\n{stringDir}\u002F\n├── ndjson\u002F\n│   └── {Language}\u002F\n│       └── *.json\n└── pb64\u002F\n    └── {Language}\u002F\n        └── *.asset\n```\n\n> 실제 폴더명\u002F레이아웃은 프로젝트 구성에 따라 달라질 수 있으며, 코드가 정답이다.\n\n---\n\n## TypeScript Module Configuration\n\ngenerated TS 코드가 `@devian\u002Fcore` 모듈을 import하기 위해 **paths alias 설정**이 필요하다.\n\n### framework-ts\u002Ftsconfig.json (루트)\n\n```json\n{\n  \"compilerOptions\": {\n    \"baseUrl\": \".\",\n    \"paths\": {\n      \"@devian\u002Fcore\": [\".\u002Fmodule\u002Fdevian\u002Fsrc\"]\n    }\n  }\n}\n```\n\n### 번들러 설정\n\n번들러(webpack, vite, esbuild 등) 사용 시 동일한 alias 설정이 필요하다.\n\n**Vite 예시 (vite.config.ts):**\n```typescript\nexport default {\n  resolve: {\n    alias: {\n      '@devian\u002Fcore': path.resolve(__dirname, 'framework-ts\u002Fmodule\u002Fdevian\u002Fsrc')\n    }\n  }\n}\n```\n\n---\n\n## C# NuGet Dependencies\n\ngenerated C# 코드는 `netstandard2.1`을 타겟으로 하며, 일부 NuGet 패키지에 대한 명시적 참조가 필요하다.\n\n### 필수 패키지\n\n| 패키지 | 버전 | 용도 | 적용 대상 |\n|--------|------|------|-----------|\n| `Newtonsoft.Json` | 13.0.3 | JSON 직렬화\u002F역직렬화 | Protocol, Domain 모듈 |\n\n### 이유\n\nUnity는 `System.Text.Json`을 기본 제공하지 않으므로, Unity 호환성을 위해 **Newtonsoft.Json**을 사용한다.\nUnity는 `com.unity.nuget.newtonsoft-json` 패키지로 Newtonsoft.Json을 기본 제공한다.\n\n### 자동 생성 csproj 예시\n\n빌드 도구가 생성하는 Protocol 모듈의 csproj:\n\n```xml\n\u003CProject Sdk=\"Microsoft.NET.Sdk\">\n  \u003CPropertyGroup>\n    \u003CTargetFramework>netstandard2.1\u003C\u002FTargetFramework>\n    \u003CLangVersion>9.0\u003C\u002FLangVersion>\n    \u003CNullable>enable\u003C\u002FNullable>\n  \u003C\u002FPropertyGroup>\n\n  \u003CItemGroup>\n    \u003CPackageReference Include=\"Newtonsoft.Json\" Version=\"13.0.3\" \u002F>\n  \u003C\u002FItemGroup>\n\n  \u003CItemGroup>\n    \u003CProjectReference Include=\"..\\Devian\\Devian.csproj\" \u002F>\n    \u003CProjectReference Include=\"..\\Devian.Domain.Common\\Devian.Domain.Common.csproj\" \u002F>\n  \u003C\u002FItemGroup>\n\u003C\u002FProject>\n```\n\n---\n\n## Must \u002F Must Not\n\nMUST\n\n- generated를 import하는 \"수동 코드(manual)\"는 generated와 분리된 폴더에서 관리한다.\n- `{buildInputJson}`의 csConfig\u002FtsConfig + `{projectConfigJson}`의 tableConfig 설계로 산출 충돌을 방지한다.\n- TypeScript 프로젝트는 paths alias를 설정하여 @devian\u002Fcore 등을 import한다.\n\nMUST NOT\n\n- generated 파일을 직접 패치해서 '임시로' 문제를 해결하지 않는다.\n- generated 누락\u002F빌드 실패를 숨기기 위해 \"임시 stub 코드(Temp.cs 등)\"를 추가하지 않는다.\n  - 해결은 항상 입력\u002F제너레이터\u002F빌드 체인(예: lock 동기화)에서 해야 한다.\n\n---\n\n## Reference\n\n- Policy SSOT: `skills\u002Fdevian\u002F01-policy\u002FSKILL.md`\n- 동작 정본: 런타임\u002F제너레이터 코드\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian\u002F06-generated-integration","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":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add devwinsoft\u002Fdevian --skill 06-generated-integration",{"tool":38,"command":39},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 06-generated-integration",{"tool":41,"command":42},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 06-generated-integration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F06-generated-integration\u002FSKILL.md",true,[46,52],{"path":47,"resourceType":48,"resourceTypeDesc":49,"sizeBytes":50,"sourceHtmlUrl":51},"SOURCE.md","REFERENCE","参考文档",180,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fdefi\u002Fcow-swap-cow-protocol\u002FSOURCE.md",{"path":53,"resourceType":48,"resourceTypeDesc":49,"sizeBytes":54,"sourceHtmlUrl":55},"TRUST.auto.yaml",2217,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fdefi\u002Fcow-swap-cow-protocol\u002FTRUST.auto.yaml",[57,63,71,79,88,95],{"skillNo":58,"name":59,"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":60,"categories":61,"keywords":62,"publishedAt":21},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[59],{"skillNo":64,"name":65,"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":66,"categories":67,"keywords":68,"publishedAt":21},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[69,70],"archive","90 project archive",{"skillNo":72,"name":73,"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":74,"categories":75,"keywords":76,"publishedAt":21},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[77,78],"management","30 env management",{"skillNo":80,"name":81,"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":82,"categories":83,"keywords":84,"publishedAt":21},"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",[],[85,86,87],"push","page","19 page push send",{"skillNo":89,"name":90,"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":91,"categories":92,"keywords":93,"publishedAt":21},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[86,94],"18 page savedata",{"skillNo":96,"name":97,"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":98,"categories":99,"keywords":100,"publishedAt":21},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[86,101],"17 page deobfuscate"]