[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBSFT044ZBYFD33MA3M7BZ":3,"skill-same:01M6CBSFT044ZBYFD33MA3M7BZ":45},{"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},"01M6CBSFT044ZBYFD33MA3M7BZ","05-workspace",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\u002F05-workspace\u002FSKILL.md",[],[18,19],"workspace","05 workspace","2026-11-10 10:12:30",false,"# Devian v10 — Workspace\n\nStatus: ACTIVE\nAppliesTo: v10\nSSOT: skills\u002Fdevian\u002F10-module\u002F03-ssot\u002FSKILL.md\n\n## Purpose\n\nDevian TypeScript 프로젝트의 단일 workspace 구조와 npm 정책을 정의한다.\n\n---\n\n## Hard Rules (MUST)\n\n### 1. 단일 Workspace Root\n\n- **Root**: `framework-ts\u002Fpackage.json`만 workspace root\n- **Lockfile**: `framework-ts\u002Fpackage-lock.json`만 유효\n- **node_modules**: `framework-ts\u002Fnode_modules`만 존재\n\n### 2. 하위 폴더 Install 금지\n\n하위 폴더(module\u002F*, apps\u002F*, tools\u002F*)에서 직접 `npm install` 금지.\n반드시 `framework-ts\u002F`에서 실행한다.\n\n### 3. 하위 node_modules 금지\n\n하위 폴더에 `node_modules\u002F`가 존재하면 정책 위반이다.\n\n- Vite 등 빌드 도구가 기본값으로 로컬 `node_modules\u002F.vite\u002F`에 캐시를 생성할 수 있다.\n- 반드시 `cacheDir`를 `framework-ts\u002Fnode_modules\u002F.vite\u002F\u003Capp>`으로 지정하여 방지한다.\n- 예: `apps\u002FOperation\u002Fvite.config.ts` → `cacheDir: path.resolve(__dirname, '..\u002F..\u002Fnode_modules\u002F.vite\u002Foperation')`\n\nRecovery (하위 node_modules 발견 시):\n\n```bash\n# 1. 하위 node_modules 삭제\nrm -rf framework-ts\u002Fapps\u002F\u003Capp>\u002Fnode_modules\n\n# 2. 해당 앱의 vite.config.ts에서 cacheDir가 올바른지 확인\n# cacheDir → framework-ts\u002Fnode_modules\u002F.vite\u002F\u003Capp>\n\n# 3. root에서 재설치\ncd framework-ts\nnpm ci\n```\n\n---\n\n## Root package.json\n\n파일: `framework-ts\u002Fpackage.json`\n\n```json\n{\n  \"name\": \"devian-framework-ts\",\n  \"version\": \"10.0.0\",\n  \"type\": \"module\",\n  \"private\": true,\n  \"workspaces\": [\n    \"module\u002F*\",\n    \"apps\u002F*\",\n    \"tools\u002F*\"\n  ],\n  \"scripts\": {\n    \"builder\": \"npm -w builder run build --\",\n    \"archive\": \"npm -w archive run archive --\",\n    \"dev:client\": \"npm -w game-client run dev\",\n    \"start:server\": \"npm -w game-server run start\"\n  }\n}\n```\n\n### Scripts 사용법\n\n| 명령어 | 설명 |\n|--------|------|\n| `npm run builder -- ..\u002F{buildInputJson}` | 빌드 실행 (예: `npm run builder -- ..\u002Finput\u002Fbuild_input.json`) |\n| `npm run archive -- \u003Cargs>` | 프로젝트 아카이브 |\n| `npm run dev:client` | 클라이언트 개발 서버 |\n| `npm run start:server` | 게임 서버 시작 |\n\n---\n\n## tsconfig.json\n\n파일: `framework-ts\u002Ftsconfig.json`\n\n| 키 | 값 |\n|----|-----|\n| `target` | `ES2020` |\n| `module` | `ESNext` |\n| `moduleResolution` | `node` |\n| `baseUrl` | `.` |\n| `paths.@devian\u002Fcore` | `[\".\u002Fmodule\u002Fdevian\u002Fsrc\"]` |\n\n---\n\n## npm ci Contract\n\nCI\u002FCD 환경에서는 `npm ci`를 사용한다.\n\n```bash\ncd framework-ts\nnpm ci\n```\n\n### Recovery (lockfile 손상 시)\n\n```bash\ncd framework-ts\nrm -rf node_modules package-lock.json\nnpm install\n```\n\n---\n\n## See Also\n\n- Archive: `skills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md`\n- SSOT: `skills\u002Fdevian\u002F10-module\u002F03-ssot\u002FSKILL.md`\n- Build: `skills\u002Fdevian\u002F80-tools\u002F11-builder\u002F20-build-pipeline\u002FSKILL.md`\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian\u002F05-workspace","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 05-workspace",{"tool":37,"command":38},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 05-workspace",{"tool":40,"command":41},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 05-workspace","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F05-workspace\u002FSKILL.md",true,[],[46,52,60,68,77,84],{"skillNo":47,"name":48,"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":49,"categories":50,"keywords":51,"publishedAt":20},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[48],{"skillNo":53,"name":54,"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":55,"categories":56,"keywords":57,"publishedAt":20},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[58,59],"archive","90 project archive",{"skillNo":61,"name":62,"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":63,"categories":64,"keywords":65,"publishedAt":20},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[66,67],"management","30 env management",{"skillNo":69,"name":70,"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":71,"categories":72,"keywords":73,"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",[],[74,75,76],"push","page","19 page push send",{"skillNo":78,"name":79,"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":80,"categories":81,"keywords":82,"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",[],[75,83],"18 page savedata",{"skillNo":85,"name":86,"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":87,"categories":88,"keywords":89,"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",[],[75,90],"17 page deobfuscate"]