[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBW70AG194SXZXQCSMKVVG":3,"skill-same:01M6CBW70AG194SXZXQCSMKVVG":55},{"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":22,"publishedAt":24,"linkOnly":25,"markdownContent":26,"markdownBody":26,"frontMatter":27,"refName":28,"commitSha":29,"skillDirectory":30,"forksCount":13,"repositoryHtmlUrl":31,"repositoryHomepageUrl":6,"ownerHtmlUrl":32,"ownerBlogUrl":6,"ownerDescription":33,"updatedAt":34,"install":35,"resources":48},"01M6CBW70AG194SXZXQCSMKVVG","50-contract-codegen",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\u002F80-tools\u002F11-builder\u002F50-contract-codegen\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[23],"50 contract codegen","2026-11-10 10:12:30",false,"# 50-contract-codegen\n\nStatus: ACTIVE  \nAppliesTo: v10  \nSSOT: skills\u002Fdevian\u002F10-module\u002F03-ssot\u002FSKILL.md\n\n## Purpose\n\nDATA(DomainType=DATA)에서 사용하는 **contracts JSON 입력 규약**을 정의한다.\n\n이 문서는 “contracts 입력 포맷과 경로”만 규정한다.\n생성 코드의 네임스페이스\u002F타입\u002F시그니처는 **런타임\u002F제너레이터 코드**를 정답으로 본다.\n\n---\n\n## Inputs\n\n입력은 `{buildInputJson}`의 `domains` 섹션이 정본이다.\n\n- `domains[{DomainKey}].contractDir`\n- `domains[{DomainKey}].contractFiles` (예: `[\"*.json\"]`)\n\n---\n\n## Contract Spec JSON\n\nContract spec는 `enums`와 `classes`로 구성된다.\n\n### Enum\n\n```json\n{\n  \"name\": \"USER_TYPE\",\n  \"doc\": \"optional doc\",\n  \"values\": [\n    { \"name\": \"GUEST\", \"value\": 0 },\n    { \"name\": \"MEMBER\", \"value\": 1 }\n  ]\n}\n```\n\n### Class\n\n```json\n{\n  \"name\": \"UserProfile\",\n  \"doc\": \"optional doc\",\n  \"fields\": [\n    { \"name\": \"id\", \"type\": \"int\" },\n    { \"name\": \"name\", \"type\": \"string\" },\n    { \"name\": \"userType\", \"type\": \"enum:USER_TYPE\" }\n  ]\n}\n```\n\n### Root\n\n```json\n{\n  \"enums\": [ \u002F* ... *\u002F ],\n  \"classes\": [ \u002F* ... *\u002F ]\n}\n```\n\n> 지원 타입 문자열(예: `int64`, `string`, 배열 등)과 타입 매핑의 정답은 Reference를 따른다.\n\n---\n\n## Outputs & Paths\n\n경로 규약은 SSOT를 따른다.\n\nContract는 Domain 단위로 Table과 함께 **단일 파일에 통합** 생성된다.\n\n- staging: `{tempDir}\u002F{DomainKey}\u002Fcs\u002FGenerated\u002F{DomainKey}.g.cs`, `{tempDir}\u002F{DomainKey}\u002Fts\u002FGenerated\u002F{DomainKey}.g.ts`\n- final: `{csConfig.generateDir}\u002FDevian.Domain.{DomainKey}\u002FGenerated\u002F{DomainKey}.g.cs`, `{tsConfig.generateDir}\u002Fdevian-domain-{domainkey}\u002FGenerated\u002F{DomainKey}.g.ts`\n\n---\n\n## Domain 모듈 의존성 (Hard Rule)\n\n**C# DATA Domain 모듈 의존성:**\n- `Devian.Domain.{DomainKey}.csproj`는 `..\\Devian\\Devian.csproj`만 ProjectReference 한다.\n- Common 모듈을 포함한 모든 Domain 모듈이 동일한 규칙을 따른다.\n\n**TS DATA Domain 패키지 의존성:**\n- `@devian\u002Fmodule-{domainkey}`는 `@devian\u002Fcore`만 의존한다.\n\n---\n\n## Failure Rules (MUST)\n\n- JSON 파싱 실패 → 빌드 실패\n- enum\u002Fclass 이름 중복 등 명백한 충돌 → 빌드 실패\n\n## Naming Rules (Hard Rule)\n\n### Enum Naming\n- enum 타입명은 **대문자 SNAKE_CASE**를 사용한다.\n- enum 멤버명도 **대문자 SNAKE_CASE**를 사용한다.\n- 예:\n  - Good: `MISSION_TYPE`, `USER_TYPE`, `APP_OPEN`\n  - Bad: `MissionType`, `UserType`, `AppOpen`\n\n### Field Naming (Hard Rule)\n**Contract JSON의 field name을 C#\u002FTS 프로퍼티 이름으로 그대로 사용한다. 변환하지 않는다.**\n\n| 위치 | 이름 | 예시 |\n|------|------|------|\n| Contract JSON field name | 그대로 | `id`, `userType` |\n| C# 프로퍼티 | 그대로 | `id`, `userType` |\n| TS 프로퍼티 | 그대로 | `id`, `userType` |\n\n---\n\n## Reference\n\n- Policy SSOT: `skills\u002Fdevian\u002F10-module\u002F03-ssot\u002FSKILL.md`\n- 동작 정본: 런타임\u002F제너레이터 코드\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian\u002F80-tools\u002F11-builder\u002F50-contract-codegen","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":36,"prompt":46,"zipAvailable":47},[37,40,43],{"tool":38,"command":39},"npx","npx skills add devwinsoft\u002Fdevian --skill 50-contract-codegen",{"tool":41,"command":42},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 50-contract-codegen",{"tool":44,"command":45},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 50-contract-codegen","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F11-builder\u002F50-contract-codegen\u002FSKILL.md",true,[49],{"path":50,"resourceType":51,"resourceTypeDesc":52,"sizeBytes":53,"sourceHtmlUrl":54},"agents\u002Fopenai.yaml","REFERENCE","参考文档",152,"https:\u002F\u002Fgithub.com\u002Ffernando-delosrios-sp\u002Fsailpoint-utils\u002Fblob\u002Fmain\u002FEntro\u002Fentro-connect\u002F.agents\u002Fskills\u002Fgrill-me\u002Fagents\u002Fopenai.yaml",[56,62,70,78,87,94],{"skillNo":57,"name":58,"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":59,"categories":60,"keywords":61,"publishedAt":24},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[58],{"skillNo":63,"name":64,"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":65,"categories":66,"keywords":67,"publishedAt":24},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[68,69],"archive","90 project archive",{"skillNo":71,"name":72,"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":73,"categories":74,"keywords":75,"publishedAt":24},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[76,77],"management","30 env management",{"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":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",[],[84,85,86],"push","page","19 page push send",{"skillNo":88,"name":89,"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":90,"categories":91,"keywords":92,"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",[],[85,93],"18 page savedata",{"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":24},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[85,100],"17 page deobfuscate"]