[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBWDGJBSD3R338DTHDQYJ5":3,"skill-same:01M6CBWDGJBSD3R338DTHDQYJ5":50},{"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":25,"linkOnly":26,"markdownContent":27,"markdownBody":27,"frontMatter":28,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":13,"repositoryHtmlUrl":32,"repositoryHomepageUrl":6,"ownerHtmlUrl":33,"ownerBlogUrl":6,"ownerDescription":34,"updatedAt":35,"install":36,"resources":49},"01M6CBWDGJBSD3R338DTHDQYJ5","53-data-ndjson",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\u002F53-data-ndjson\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[23,24],"data","53 data ndjson","2026-11-10 10:12:30",false,"# 53-data-ndjson\n\nStatus: ACTIVE  \nAppliesTo: v10\n\n## SSOT\n\n이 문서는 **NDJSON 저장 포맷**의 정본이다.\n\n---\n\n## 목적\u002F범위\n\n**NDJSON(Line-delimited JSON) 파일의 저장 포맷(내용\u002F확장자)을 정의한다.**\n\n이 스킬은 \"저장 포맷\"만 정의한다. 구체적인 폴더 경로\u002F라우팅은 각 도메인 스킬에서 정한다:\n- String Table: `skills\u002Fdevian-unity\u002F20-common-package\u002F30-string-table\u002FSKILL.md` → `...\u002Fstring\u002Fndjson\u002F...`\n- 일반 Table: `skills\u002Fdevian\u002F80-tools\u002F11-builder\u002F31-table-row-format\u002FSKILL.md` → `...\u002Fndjson\u002F...`\n\n---\n\n## NDJSON 포맷 규칙 (Hard Rules)\n\n### 파일 인코딩\n\n**UTF-8 텍스트**\n\n### 내용 형식\n\n**NDJSON (Line-delimited JSON)**\n\n- 한 줄 = JSON object 1개\n- 빈 줄 금지\n- JSON array (`[]`) 금지\n\n```\n{\"id\":\"item1\",\"value\":100}\n{\"id\":\"item2\",\"value\":200}\n{\"id\":\"item3\",\"value\":300}\n```\n\n### 확장자 규칙 (중요)\n\n**파일 확장자는 `.json`이다.**\n\n- 내용이 NDJSON이라도 확장자는 `.json` 사용\n- 소비 측(Unity\u002F툴링) 요구로 `.json` 고정\n- `.ndjson` 확장자 금지\n\n### 결정성 (Deterministic)\n\n**같은 입력이면 항상 같은 출력이 나와야 한다.**\n\n- 라인 순서: 입력 데이터 순서 유지\n- JSON stringify: 컴팩트 포맷 (들여쓰기 없음)\n- 필드 순서: 각 도메인 스킬에서 정의\n\n---\n\n## 빌더 API\n\n### 소스 경로\n\n```\nframework-ts\u002Ftools\u002Fbuilder\u002Fgenerators\u002Fdata-ndjson-storage.js\n```\n\n### Export 함수\n\n```javascript\n\u002F**\n * Object 배열을 NDJSON 문자열로 변환\n * @param {Array\u003Cobject>} objects - JSON object 배열\n * @returns {string} NDJSON 문자열\n *\u002F\nexport function encodeNdjsonFromObjects(objects);\n\n\u002F**\n * JSON 문자열 배열을 NDJSON 문자열로 변환\n * @param {Array\u003Cstring>} lines - 이미 JSON.stringify된 라인 배열\n * @returns {string} NDJSON 문자열\n *\u002F\nexport function encodeNdjsonFromLines(lines);\n```\n\n### 동작 규칙\n\n- `encodeNdjsonFromObjects`: `objects.map(o => JSON.stringify(o)).join('\\n')`\n- `encodeNdjsonFromLines`: `lines.join('\\n')`\n- 빈 배열이면 `''` 반환 (기존 동작과 호환)\n\n---\n\n## 금지 행동\n\n- NDJSON 내용을 JSON array(`[]`)로 바꾸기 금지\n- 확장자를 `.ndjson`로 바꾸기 금지 (`.json` 유지)\n- 라인 끝에 trailing comma 추가 금지\n\n---\n\n## DoD (검증 가능)\n\n### PASS 조건\n\n- [ ] NDJSON 파일 확장자가 `.json`임\n- [ ] 파일 내용이 한 줄당 JSON object 1개\n- [ ] JSON array가 아님\n- [ ] 빈 줄 없음\n- [ ] 같은 입력이면 같은 출력 (결정성)\n\n### FAIL 조건\n\n- 파일 확장자가 `.ndjson`\n- 내용이 JSON array\n- 빈 줄 포함\n- 비결정적 출력\n\n---\n\n## Reference\n\n(upstream dependencies only — consumers reference this skill from their own Related sections)\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian\u002F80-tools\u002F11-builder\u002F53-data-ndjson","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":37,"prompt":47,"zipAvailable":48},[38,41,44],{"tool":39,"command":40},"npx","npx skills add devwinsoft\u002Fdevian --skill 53-data-ndjson",{"tool":42,"command":43},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 53-data-ndjson",{"tool":45,"command":46},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 53-data-ndjson","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F11-builder\u002F53-data-ndjson\u002FSKILL.md",true,[],[51,57,65,73,82,89],{"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":25},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[53],{"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":25},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[63,64],"archive","90 project archive",{"skillNo":66,"name":67,"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":68,"categories":69,"keywords":70,"publishedAt":25},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[71,72],"management","30 env management",{"skillNo":74,"name":75,"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":76,"categories":77,"keywords":78,"publishedAt":25},"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",[],[79,80,81],"push","page","19 page push send",{"skillNo":83,"name":84,"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":85,"categories":86,"keywords":87,"publishedAt":25},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[80,88],"18 page savedata",{"skillNo":90,"name":91,"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":92,"categories":93,"keywords":94,"publishedAt":25},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[80,95],"17 page deobfuscate"]