[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CBWYD3TGWBQV7V35551THF":3,"skill-same:01M6CBWYD3TGWBQV7V35551THF":46},{"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":21,"linkOnly":22,"markdownContent":23,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":13,"repositoryHtmlUrl":28,"repositoryHomepageUrl":6,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":30,"updatedAt":31,"install":32,"resources":45},"01M6CBWYD3TGWBQV7V35551THF","19-page-push-send",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\u002F20-operation\u002F19-page-push-send\u002FSKILL.md",[],[18,19,20],"push","page","19 page push send","2026-11-10 10:12:30",false,"# 20-operation\u002F19-page-push-send — Push Send 탭\n\n\nStatus: ACTIVE\nAppliesTo: v10\n\n\n## UI\n\n```\nPipeline: PUSH_REMOTE.json → Firebase Function → FCM topic send\n\n┌──────────────────────────────────────────────────┐\n│  [Load Data]  ← PUSH_REMOTE.json 파일 선택       │\n│  Status: \"Loaded 4 entries (2 topics)\"           │\n├──────────────────────────────────────────────────┤\n│  Topic: [▼ event \u002F test \u002F ...]                   │\n├──────────────────────────────────────────────────┤\n│  Korean   [body 입력 텍스트]                      │\n│  English  [body 입력 텍스트]                      │\n│  Japanese [body 입력 텍스트]                      │\n├──────────────────────────────────────────────────┤\n│                                     [Send]        │\n├──────────────────────────────────────────────────┤\n│  Result:                                          │\n│    event_korean: ✓ sent                           │\n│    event_english: ✓ sent                          │\n│    event_japanese: ✗ no matching entry            │\n└──────────────────────────────────────────────────┘\n```\n\n\n## 동작 상세\n\n### [Load Data]\n\n- 파일 picker로 `PUSH_REMOTE.json` (NDJSON) 선택\n- 한 줄씩 `JSON.parse` → `PushRemoteEntry[]` 배열 구성\n- 고유 `Topic` 목록 추출 → 드롭다운 옵션 갱신\n- 상태 텍스트: 로드된 entry 수, topic 수 표시\n\n### Topic 드롭다운\n\n- Load Data 후 활성화\n- 고유 Topic 값 (예: `event`, `test`) 목록\n\n### Body 입력\n\n- Korean \u002F English \u002F Japanese 3개 텍스트 입력\n- 빈 값은 발송 시 skip\n\n### [Send]\n\n- 선택된 Topic으로 PUSH_REMOTE 행 필터링\n- 각 행의 Language와 Body 입력을 매칭:\n  - `event_korean` (PushId) → Korean body\n  - `event_english` (PushId) → English body\n- Body가 비어있는 언어는 skip\n- `httpsCallable(\"sendPushNotification\")` 호출\n- 결과를 Result 영역에 표시\n\n### Result 영역\n\n- 각 PushId별 발송 결과 (✓ sent \u002F ✗ error message \u002F skip)\n\n\n---\n\n\n## 파일 위치\n\n```\nframework-ts\u002Fapps\u002FOperation\u002Fsrc\u002Ftabs\u002Fpush-send.ts\n```\n\n\n## Related\n\n- [00-overview](..\u002F00-overview\u002FSKILL.md) — Operation 개요\n- [03-ssot](..\u002F03-ssot\u002FSKILL.md) §D — Push Send 기능 정의\n- [15-layout](..\u002F15-layout\u002FSKILL.md) — 레이아웃, 스타일 가이드\n",{},"main","8cb5bd877a3a7004867d2f55697cb9e4ff2f1734","skills\u002Fdevian\u002F80-tools\u002F20-operation\u002F19-page-push-send","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":33,"prompt":43,"zipAvailable":44},[34,37,40],{"tool":35,"command":36},"npx","npx skills add devwinsoft\u002Fdevian --skill 19-page-push-send",{"tool":38,"command":39},"bunx","bunx skills add devwinsoft\u002Fdevian --skill 19-page-push-send",{"tool":41,"command":42},"pnpm","pnpm dlx skills add devwinsoft\u002Fdevian --skill 19-page-push-send","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F19-page-push-send\u002FSKILL.md",true,[],[47,53,61,69,76,83],{"skillNo":48,"name":49,"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":50,"categories":51,"keywords":52,"publishedAt":21},"01M6CBX3K2JJV38ANHVGCAT8A0","devian","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002FSKILL.md",[],[49],{"skillNo":54,"name":55,"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":56,"categories":57,"keywords":58,"publishedAt":21},"01M6CBX210BFMM8AMN770J9WY8","90-project-archive","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F90-project-archive\u002FSKILL.md",[],[59,60],"archive","90 project archive",{"skillNo":62,"name":63,"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":64,"categories":65,"keywords":66,"publishedAt":21},"01M6CBWZSGRR9R3YJZB3177667","30-env-management","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F30-env-management\u002FSKILL.md",[],[67,68],"management","30 env management",{"skillNo":70,"name":71,"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":72,"categories":73,"keywords":74,"publishedAt":21},"01M6CBWWRQ05A7604GHJKTPJTF","18-page-savedata","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F18-page-savedata\u002FSKILL.md",[],[19,75],"18 page savedata",{"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":21},"01M6CBWVH4S2VF1V7B2GBTESCT","17-page-deobfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F17-page-deobfuscate\u002FSKILL.md",[],[19,82],"17 page deobfuscate",{"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":21},"01M6CBWSZG5BN4YTA8SRXXF8YP","16-page-obfuscate","https:\u002F\u002Fgithub.com\u002Fdevwinsoft\u002Fdevian\u002Fblob\u002Fmain\u002Fskills\u002Fdevian\u002F80-tools\u002F20-operation\u002F16-page-obfuscate\u002FSKILL.md",[],[19,89],"16 page obfuscate"]