[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBSVTBMQM782VT69T2QZTQ":3,"skill-same:01M6CBSVTBMQM782VT69T2QZTQ":44},{"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":19,"linkOnly":20,"markdownContent":21,"markdownBody":21,"frontMatter":22,"refName":23,"commitSha":24,"skillDirectory":25,"forksCount":13,"repositoryHtmlUrl":26,"repositoryHomepageUrl":6,"ownerHtmlUrl":27,"ownerBlogUrl":6,"ownerDescription":28,"updatedAt":29,"install":30,"resources":43},"01M6CBSVTBMQM782VT69T2QZTQ","12-logger",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\u002F10-module\u002F20-core\u002F12-logger\u002FSKILL.md",[],[18],"12 logger","2026-11-10 10:12:30",false,"# Devian v10 — Common Feature: Log\n\nStatus: ACTIVE  \nAppliesTo: v10  \nSSOT: skills\u002Fdevian\u002F10-module\u002F03-ssot\u002FSKILL.md\n\n## Overview\n\nDevian core의 표준 로깅 기능을 정의한다.\n\n목표:\n- 서버(C#) \u002F 클라이언트(TS)에서 동일한 개념(레벨, 메시지)을 제공한다.\n- 기본 구현은 콘솔 출력이지만, Sink 교체로 출력 대상을 바꿀 수 있어야 한다.\n\n---\n\n## Responsibilities\n\n- 4단계 로그 레벨 제공: Debug \u002F Info \u002F Warn \u002F Error\n- 전역(정적) 진입점 제공 (사용처에서 DI 강제하지 않음)\n- 레벨 필터링 제공\n- 출력 대상(Sink) 교체 가능\n\n---\n\n## Non-goals\n\n- 구조화 로깅(JSON), 트레이싱, 분산 추적\n- 외부 로깅 프레임워크(Serilog\u002FWinston 등) 강제\n- 파일 로깅\u002F롤링\u002F원격 전송 같은 고급 Sink 제공 (앱 책임)\n\n---\n\n## Hard Rules (MUST)\n\n1. 로깅 호출부는 `Console.WriteLine` \u002F `console.*`를 직접 사용하지 않는다.  \n   - 직접 호출은 **Sink 내부에서만 허용**한다.\n2. 기본 Sink는 존재해야 하며(기본 동작 보장), Sink 교체도 가능해야 한다.\n3. 로그 레벨은 정확히 4단계만 제공한다: Debug \u002F Info \u002F Warn \u002F Error\n4. **모든 출력 API는 message 파라미터 1개만 받는다.** (tag, ex 파라미터 금지)\n\n---\n\n## Public API\n\n### C#\n\n```csharp\nnamespace Devian\n{\n    public enum LogLevel\n    {\n        Debug = 10,\n        Info = 20,\n        Warn = 30,\n        Error = 40,\n    }\n\n    public interface ILogSink\n    {\n        void Write(LogLevel level, string message);\n    }\n\n    public static class Log\n    {\n        \u002F\u002F 설정\n        public static void SetLevel(LogLevel level);\n        public static LogLevel GetLevel();\n\n        public static void SetSink(ILogSink sink);\n        public static ILogSink GetSink();\n\n        \u002F\u002F 출력 (message 1개만)\n        public static void Debug(string message);\n        public static void Info(string message);\n        public static void Warn(string message);\n        public static void Error(string message);\n    }\n}\n```\n\n필수 기본 구현:\n- `ConsoleLogSink : ILogSink` (기본 Sink)\n- 기본 포맷: `[{LEVEL}] {message}`\n\n### TypeScript (`devian-domain-common\u002Ffeatures`)\n\n```typescript\n\u002F\u002F features\u002Flogger.ts\n\nexport enum LogLevel {\n  Debug = 10,\n  Info = 20,\n  Warn = 30,\n  Error = 40,\n}\n\nexport interface LogSink {\n  write(level: LogLevel, message: string): void;\n}\n\nexport function setLevel(level: LogLevel): void;\nexport function getLevel(): LogLevel;\n\nexport function setSink(sink: LogSink): void;\nexport function getSink(): LogSink;\n\n\u002F\u002F output (message 1개만)\nexport function debug(message: string): void;\nexport function info(message: string): void;\nexport function warn(message: string): void;\nexport function error(message: string): void;\n```\n\n필수 기본 구현:\n- `ConsoleLogSink` (기본 Sink)\n- Sink 내부에서만 `console.debug\u002Finfo\u002Fwarn\u002Ferror` 사용\n\n---\n\n## Examples\n\n### C#\n\n```csharp\nusing Devian;\n\nLog.SetLevel(LogLevel.Info);\n\nLog.Debug(\"this will be filtered out\");\nLog.Info(\"connected\");\nLog.Warn(\"token expired soon\");\nLog.Error($\"query failed: {ex}\");\n```\n\n### TypeScript\n\n```typescript\nimport { setLevel, LogLevel, info, warn, error } from \"@devian\u002Fcore\";\n\nsetLevel(LogLevel.Info);\n\ninfo(\"connected\");\nwarn(\"token expired soon\");\nerror(`query failed: ${err}`);\n```\n\n---\n\n## DoD (Definition of Done)\n\n- [x] C# Log 구현 + 기본 Sink 구현\n- [x] TS logger.ts 구현 + 기본 Sink 구현\n- [ ] 레벨 필터링 동작 확인\n- [ ] Sink 교체 동작 확인\n- [ ] (TS) features\u002Findex.ts export가 빌더에 의해 자동 반영됨을 확인\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian\u002F10-module\u002F20-core\u002F12-logger","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":31,"prompt":41,"zipAvailable":42},[32,35,38],{"tool":33,"command":34},"npx","npx skills add devwinsoft\u002Fdevian --skill 12-logger",{"tool":36,"command":37},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 12-logger",{"tool":39,"command":40},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 12-logger","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F10-module\u002F20-core\u002F12-logger\u002FSKILL.md",true,[],[45,51,59,67,76,83],{"skillNo":46,"name":47,"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":48,"categories":49,"keywords":50,"publishedAt":19},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[47],{"skillNo":52,"name":53,"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":54,"categories":55,"keywords":56,"publishedAt":19},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[57,58],"archive","90 project archive",{"skillNo":60,"name":61,"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":62,"categories":63,"keywords":64,"publishedAt":19},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[65,66],"management","30 env management",{"skillNo":68,"name":69,"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":70,"categories":71,"keywords":72,"publishedAt":19},"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",[],[73,74,75],"push","page","19 page push send",{"skillNo":77,"name":78,"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":79,"categories":80,"keywords":81,"publishedAt":19},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[74,82],"18 page savedata",{"skillNo":84,"name":85,"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":86,"categories":87,"keywords":88,"publishedAt":19},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[74,89],"17 page deobfuscate"]