[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBTYXCH138DX03K6HE4YK9":3,"skill-same:01M6CBTYXCH138DX03K6HE4YK9":63},{"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},"01M6CBTYXCH138DX03K6HE4YK9","02-module-policy",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\u002F20-domain-common\u002F02-module-policy\u002FSKILL.md",[],[18,19],"policy","02 module policy","2026-11-10 10:12:30",false,"# Devian v10 — Common Module Policy\n\nStatus: ACTIVE  \nAppliesTo: v10  \nSSOT: skills\u002Fdevian\u002F10-module\u002F03-ssot\u002FSKILL.md\n\n## Purpose\n\nCommon 모듈(C# 프로젝트명: `Devian.Domain.Common`, TS `@devian\u002Fmodule-common`)의 구조와 정책을 정의한다.\n\n이 문서는 \"Common = Domain + Module\" 혼용을 인정하되, **생성물\u002F수동 코드 경계**와 **features 구조**를 정책으로 분리한다.\n\n---\n\n## Hard Rules (MUST)\n\n### 1. Common 필수\n\nDevian v10 프로젝트는 DATA DomainKey로 `Common`을 **반드시** 포함한다.\n\n- `{buildInputJson}` (예: `input\u002Fbuild_input.json`)에서 `domains.Common`은 필수 항목이다.\n- `configPath`는 `{projectConfigJson}` (예: `input\u002Fbuild_config.json`)을 가리켜야 한다.\n- 결과로 Common 모듈(C#\u002FTS)은 항상 생성\u002F유지된다:\n  - C#: `Devian.Domain.Common` (프로젝트명)\n  - TS: `@devian\u002Fmodule-common` (폴더명: `devian-domain-common`)\n\n### 1.1 모듈 의존성 (Hard Rule)\n\n**C# DATA Domain 모듈 의존성:**\n- `Devian.Domain.{DomainKey}.csproj`는 `..\\Devian\\Devian.csproj`만 ProjectReference 한다.\n- Common 모듈을 포함한 모든 Domain 모듈이 동일한 규칙을 따른다.\n\n**C# PROTOCOL 모듈 의존성:**\n- `Devian.Protocol.{ProtocolGroup}.csproj`는 다음을 ProjectReference 한다:\n  - `..\\Devian\\Devian.csproj`\n  - `..\\Devian.Domain.Common\\Devian.Domain.Common.csproj`\n\n**TS DATA Domain 패키지 의존성:**\n- `@devian\u002Fmodule-{domainkey}`는 `@devian\u002Fcore`만 의존한다.\n\n**TS PROTOCOL 패키지 의존성:**\n- `@devian\u002Fprotocol-{protocolgroup}`는 `@devian\u002Fcore` + `@devian\u002Fmodule-common`을 의존한다.\n\n참조 방식(정책):\n\n- C# Domain: `.csproj`에 `Devian.csproj` ProjectReference 포함\n- C# Protocol: `.csproj`에 `Devian.csproj` + `Devian.Domain.Common.csproj` ProjectReference 포함\n- C# 생성물(`*.g.cs`): `using Devian;` 포함 (namespace는 Devian 단일)\n- TS Domain: `package.json` `dependencies`에 `@devian\u002Fcore` 포함\n- TS Protocol: `package.json` `dependencies`에 `@devian\u002Fcore` + `@devian\u002Fmodule-common` 포함\n\n### 2. 생성물\u002F수동 코드 경계\n\n| 영역 | 소유자 | 설명 |\n|------|--------|------|\n| `Generated\u002F` | 빌더 | 항상 clean+copy 대상. 수동 편집 금지. |\n| `features\u002F` | 개발자 | 공용 기능(crypto 등) 수동 코드 영역. |\n\n**경로:**\n\n- C#: `Devian.Domain.Common\u002Ffeatures\u002F**`\n- TS: `devian-domain-common\u002Ffeatures\u002F**`\n\n### 2.1 C# Namespace 규칙 (Hard Rule)\n\nCommon 모듈의 C# 코드는 **반드시** 단일 네임스페이스를 사용한다.\n\n- 모듈 루트: `namespace Devian`\n- features 코드도 동일: `namespace Devian`\n\n> `features\u002F` 폴더는 **물리적 정리용 폴더**일 뿐이며, **namespace 분리 근거가 아니다**.\n> 프로젝트 이름(`Devian.Domain.Common`)과 namespace(`Devian`)는 별개다.\n\n**금지 (MUST NOT):**\n- ❌ `namespace Devian` + `.\u003CX>` (X ≠ Domain, Protocol) - 어떤 하위 네임스페이스도 금지\n- ❌ `using Devian` + `.\u003CX>.*;` (X ≠ Domain, Protocol)\n\n**허용 (예외):**\n- ✅ `namespace Devian.Domain.{DomainKey}` (Domain 생성물)\n- ✅ `namespace Devian.Protocol.{ProtocolGroup}` (Protocol 생성물)\n\n**재발 방지:**\n- C# 코드에서 `namespace Devian` + `.\u003CX>` (X ≠ Domain, Protocol) 문자열이 발견되면 **빌드 실패**\n- 빌더(`build.js`)에서 검사하여 발견 시 즉시 throw\n\n> Common(DATA) 생성물(`Generated\u002FCommon.g.cs`)은 `namespace Devian.Domain.Common` 아래에 생성된다.\n\n### 2.2 .NET 타겟 버전 (Hard Rule)\n\n| 타겟 | 버전 | 비고 |\n|------|------|------|\n| Unity | .NET Standard 2.1 | Unity 2021.3+ 기본값 |\n| 서버\u002FCLI | .NET 8 | LTS |\n\n- Unity 타겟 코드(UPM 패키지)는 **.NET Standard 2.1** 호환 API만 사용\n- .NET Standard 2.1에 없는 API 사용 시 Unity에서 컴파일 에러 발생\n- 컴파일 에러 발생 시 해당 API의 대안을 찾아 수정\n\n### 3. TS index 자동 관리 (Marker 방식)\n\nTS `devian-domain-*\u002Findex.ts`는 빌더가 관리한다.\n\n**통째 덮어쓰기 금지** — marker 구간만 갱신한다.\n\n#### Marker 규격\n\n```typescript\n\u002F\u002F \u003Cdevian:domain-exports>\n\u002F\u002F ... 빌더가 자동 생성 ...\n\u002F\u002F \u003C\u002Fdevian:domain-exports>\n\n\u002F\u002F \u003Cdevian:feature-exports>\n\u002F\u002F ... 빌더가 자동 생성 ...\n\u002F\u002F \u003C\u002Fdevian:feature-exports>\n```\n\n#### 규칙\n\n- 빌더는 marker 구간만 교체하며, 나머지 영역은 보존한다.\n- 개발자는 marker 안을 **절대 수정하지 않는다**.\n- marker 밖도 수정할 필요 없음 — 기능 추가는 `features\u002F`에만 한다.\n\n### 4. features\u002Findex.ts 자동 관리\n\n`features\u002Findex.ts`도 빌더가 marker 구간을 자동 갱신한다.\n\n#### 스캔 규칙\n\n빌더는 `features\u002F` 직하의 항목만 스캔한다.\n\n**제외:**\n- `index.ts`\n- `*.test.ts`, `*.spec.ts`\n- `.d.ts`\n- 숨김 파일 (`.`로 시작)\n- `Generated` 폴더\n\n**포함:**\n- `*.ts` 파일 → `export * from '.\u002F{basename}';`\n- 디렉토리 → `export * from '.\u002F{dir}';` (해당 디렉토리의 index.ts가 책임)\n\n**정렬:**\n- 항목명을 `localeCompare`로 정렬 (결정적)\n\n---\n\n## Soft Rules (SHOULD)\n\n### features 네이밍 규칙\n\n- 파일: `{feature}.ts` (예: `crypto.ts`, `time.ts`)\n- 폴더: `{feature}\u002Findex.ts` (예: `crypto\u002Findex.ts`)\n- 스캔 가능하고 결정적이어야 함\n\n### \"Common Dumping Ground\" 방지 기준\n\nCommon에 기능을 추가할 때 다음을 만족해야 한다:\n\n1. **범용성**: 여러 모듈에서 재사용되는가?\n2. **결합도**: 다른 모듈과의 결합도를 증가시키지 않는가?\n3. **테스트 용이성**: 테스트 가능하고 교체 가능한가?\n4. **비종속성**: 특정 서비스\u002F도메인에 종속되지 않는가?\n\n위 기준을 만족하지 않으면 Common이 아닌 해당 도메인\u002F모듈에 둔다.\n\n---\n\n## Directory Structure\n\n### C#\n\n```\n# 프로젝트 디렉토리: Devian.Domain.Common\n├── Generated\u002F\n│   └── Common.g.cs      # 빌더 소유 (수정 금지)\n└── features\u002F\n    └── Crypto.cs        # 개발자 소유 (수동 코드)\n```\n\n### TypeScript\n\n```\ndevian-domain-common\u002F\n├── Generated\u002F\n│   └── Common.g.ts      # 빌더 소유 (수정 금지)\n├── features\u002F\n│   ├── index.ts         # 빌더 관리 (marker 갱신)\n│   └── crypto.ts        # 개발자 소유 (수동 코드)\n├── index.ts             # 빌더 관리 (marker 갱신)\n├── package.json\n└── tsconfig.json\n```\n\n---\n\n## Reference\n\n- Policy SSOT: `skills\u002Fdevian\u002F10-module\u002F03-ssot\u002FSKILL.md`\n- Domain Policy: `skills\u002Fdevian\u002F20-domain-common\u002F01-policy\u002FSKILL.md`\n- Core Features: `skills\u002Fdevian\u002F10-module\u002F20-core\u002F00-overview\u002FSKILL.md`\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian\u002F20-domain-common\u002F02-module-policy","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 02-module-policy",{"tool":37,"command":38},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 02-module-policy",{"tool":40,"command":41},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 02-module-policy","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F20-domain-common\u002F02-module-policy\u002FSKILL.md",true,[45,51,55,59],{"path":46,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":49,"sourceHtmlUrl":50},"agents\u002Fopenai.yaml","REFERENCE","参考文档",144,"https:\u002F\u002Fgithub.com\u002Ffernando-delosrios-sp\u002Fsailpoint-utils\u002Fblob\u002Fmain\u002FEntro\u002Fentro-connect\u002F.agents\u002Fskills\u002Fc4-diagram\u002Fagents\u002Fopenai.yaml",{"path":52,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":53,"sourceHtmlUrl":54},"references\u002Fdrawio-template.md",2651,"https:\u002F\u002Fgithub.com\u002Ffernando-delosrios-sp\u002Fsailpoint-utils\u002Fblob\u002Fmain\u002FEntro\u002Fentro-connect\u002F.agents\u002Fskills\u002Fc4-diagram\u002Freferences\u002Fdrawio-template.md",{"path":56,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":57,"sourceHtmlUrl":58},"references\u002Felement-templates.md",6098,"https:\u002F\u002Fgithub.com\u002Ffernando-delosrios-sp\u002Fsailpoint-utils\u002Fblob\u002Fmain\u002FEntro\u002Fentro-connect\u002F.agents\u002Fskills\u002Fc4-diagram\u002Freferences\u002Felement-templates.md",{"path":60,"resourceType":47,"resourceTypeDesc":48,"sizeBytes":61,"sourceHtmlUrl":62},"references\u002Flegend-template.md",3950,"https:\u002F\u002Fgithub.com\u002Ffernando-delosrios-sp\u002Fsailpoint-utils\u002Fblob\u002Fmain\u002FEntro\u002Fentro-connect\u002F.agents\u002Fskills\u002Fc4-diagram\u002Freferences\u002Flegend-template.md",[64,70,78,86,95,102],{"skillNo":65,"name":66,"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":67,"categories":68,"keywords":69,"publishedAt":20},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[66],{"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":20},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[76,77],"archive","90 project archive",{"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},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[84,85],"management","30 env management",{"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},"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",[],[92,93,94],"push","page","19 page push send",{"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":20},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[93,101],"18 page savedata",{"skillNo":103,"name":104,"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":105,"categories":106,"keywords":107,"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",[],[93,108],"17 page deobfuscate"]