@nomadamas/k-skill 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/bin/k-skill.js +60 -0
  2. package/package.json +37 -0
  3. package/skills/assembly-bill-vote-search/instruction.md +111 -0
  4. package/skills/assembly-bill-vote-search/skill.json +10 -0
  5. package/skills/biz-health-check/instruction.md +69 -0
  6. package/skills/biz-health-check/scripts/biz_health_check.py +163 -0
  7. package/skills/biz-health-check/skill.json +10 -0
  8. package/skills/bok-ecos-stats/instruction.md +95 -0
  9. package/skills/bok-ecos-stats/scripts/bok_ecos.py +302 -0
  10. package/skills/bok-ecos-stats/skill.json +10 -0
  11. package/skills/building-register-search/instruction.md +69 -0
  12. package/skills/building-register-search/scripts/building_register.py +309 -0
  13. package/skills/building-register-search/scripts/building_register_xml.py +32 -0
  14. package/skills/building-register-search/skill.json +9 -0
  15. package/skills/bunjang-search/instruction.md +154 -0
  16. package/skills/bunjang-search/skill.json +10 -0
  17. package/skills/catchtable-sniper/instruction.md +270 -0
  18. package/skills/catchtable-sniper/skill.json +9 -0
  19. package/skills/cheap-gas-nearby/instruction.md +107 -0
  20. package/skills/cheap-gas-nearby/skill.json +10 -0
  21. package/skills/corporate-registration-consulting/instruction.md +117 -0
  22. package/skills/corporate-registration-consulting/scripts/fill_official_hwp.py +106 -0
  23. package/skills/corporate-registration-consulting/skill.json +8 -0
  24. package/skills/coupang-product-search/instruction.md +219 -0
  25. package/skills/coupang-product-search/scripts/coupang_partners_mcp.py +146 -0
  26. package/skills/coupang-product-search/skill.json +10 -0
  27. package/skills/court-auction-notice-search/instruction.md +201 -0
  28. package/skills/court-auction-notice-search/skill.json +9 -0
  29. package/skills/court-payment-order-assistant/instruction.md +120 -0
  30. package/skills/court-payment-order-assistant/skill.json +10 -0
  31. package/skills/d2b-notice-search/instruction.md +117 -0
  32. package/skills/d2b-notice-search/skill.json +10 -0
  33. package/skills/daangn-cars-search/instruction.md +91 -0
  34. package/skills/daangn-cars-search/scripts/daangn_cars.py +72 -0
  35. package/skills/daangn-cars-search/skill.json +9 -0
  36. package/skills/daangn-jobs-search/instruction.md +90 -0
  37. package/skills/daangn-jobs-search/scripts/daangn_jobs.py +98 -0
  38. package/skills/daangn-jobs-search/skill.json +9 -0
  39. package/skills/daangn-realty-search/instruction.md +114 -0
  40. package/skills/daangn-realty-search/scripts/daangn_detail_ld.py +76 -0
  41. package/skills/daangn-realty-search/scripts/daangn_realty.py +216 -0
  42. package/skills/daangn-realty-search/scripts/daangn_relay_store.py +174 -0
  43. package/skills/daangn-realty-search/skill.json +8 -0
  44. package/skills/daangn-used-goods-search/instruction.md +90 -0
  45. package/skills/daangn-used-goods-search/scripts/daangn_used_goods.py +80 -0
  46. package/skills/daangn-used-goods-search/skill.json +9 -0
  47. package/skills/daishin-report-search/instruction.md +138 -0
  48. package/skills/daishin-report-search/skill.json +10 -0
  49. package/skills/daiso-product-search/instruction.md +172 -0
  50. package/skills/daiso-product-search/skill.json +8 -0
  51. package/skills/danawa-price-search/instruction.md +183 -0
  52. package/skills/danawa-price-search/scripts/danawa_search.py +354 -0
  53. package/skills/danawa-price-search/skill.json +8 -0
  54. package/skills/delivery-tracking/instruction.md +358 -0
  55. package/skills/delivery-tracking/skill.json +8 -0
  56. package/skills/donation-place-search/instruction.md +129 -0
  57. package/skills/donation-place-search/skill.json +9 -0
  58. package/skills/emergency-room-beds/instruction.md +82 -0
  59. package/skills/emergency-room-beds/skill.json +8 -0
  60. package/skills/ev-charger-nearby/instruction.md +80 -0
  61. package/skills/ev-charger-nearby/scripts/ev_charger.py +222 -0
  62. package/skills/ev-charger-nearby/skill.json +10 -0
  63. package/skills/ev-subsidy-status/instruction.md +165 -0
  64. package/skills/ev-subsidy-status/skill.json +10 -0
  65. package/skills/express-bus-booking/instruction.md +207 -0
  66. package/skills/express-bus-booking/references/kobus-http-flow.md +159 -0
  67. package/skills/express-bus-booking/scripts/kobus_express_booking.py +243 -0
  68. package/skills/express-bus-booking/skill.json +8 -0
  69. package/skills/fine-dust-location/instruction.md +89 -0
  70. package/skills/fine-dust-location/skill.json +9 -0
  71. package/skills/flight-ticket-search/instruction.md +237 -0
  72. package/skills/flight-ticket-search/scripts/flight_ticket_search.py +501 -0
  73. package/skills/flight-ticket-search/skill.json +9 -0
  74. package/skills/foresttrip-vacancy/instruction.md +167 -0
  75. package/skills/foresttrip-vacancy/scripts/run_foresttrip_vacancy.py +549 -0
  76. package/skills/foresttrip-vacancy/skill.json +10 -0
  77. package/skills/fsc-corporate-info/instruction.md +57 -0
  78. package/skills/fsc-corporate-info/scripts/fsc_corporate_info.py +113 -0
  79. package/skills/fsc-corporate-info/skill.json +10 -0
  80. package/skills/g2b-order-plan-search/instruction.md +131 -0
  81. package/skills/g2b-order-plan-search/scripts/g2b_order_plan.py +158 -0
  82. package/skills/g2b-order-plan-search/skill.json +10 -0
  83. package/skills/g2b-sanctioned-supplier/instruction.md +61 -0
  84. package/skills/g2b-sanctioned-supplier/scripts/g2b_sanctioned_supplier.py +114 -0
  85. package/skills/g2b-sanctioned-supplier/skill.json +10 -0
  86. package/skills/gangnamunni-clinic-search/instruction.md +113 -0
  87. package/skills/gangnamunni-clinic-search/skill.json +9 -0
  88. package/skills/geeknews-search/instruction.md +69 -0
  89. package/skills/geeknews-search/scripts/geeknews_search.py +296 -0
  90. package/skills/geeknews-search/skill.json +8 -0
  91. package/skills/gongsijiga-search/instruction.md +128 -0
  92. package/skills/gongsijiga-search/skill.json +9 -0
  93. package/skills/gov-overseas-trip-report/instruction.md +488 -0
  94. package/skills/gov-overseas-trip-report/scripts/gov_overseas_trip_report.py +1206 -0
  95. package/skills/gov-overseas-trip-report/skill.json +9 -0
  96. package/skills/han-river-water-level/instruction.md +83 -0
  97. package/skills/han-river-water-level/skill.json +10 -0
  98. package/skills/highway-traffic-status/instruction.md +88 -0
  99. package/skills/highway-traffic-status/scripts/highway_traffic.py +315 -0
  100. package/skills/highway-traffic-status/skill.json +11 -0
  101. package/skills/hipass-receipt/instruction.md +97 -0
  102. package/skills/hipass-receipt/skill.json +10 -0
  103. package/skills/hola-poke-yeoksam/instruction.md +247 -0
  104. package/skills/hola-poke-yeoksam/skill.json +8 -0
  105. package/skills/household-waste-info/instruction.md +117 -0
  106. package/skills/household-waste-info/skill.json +10 -0
  107. package/skills/housing-official-price/instruction.md +177 -0
  108. package/skills/housing-official-price/skill.json +10 -0
  109. package/skills/hwp/instruction.md +206 -0
  110. package/skills/hwp/skill.json +8 -0
  111. package/skills/intercity-bus-booking/instruction.md +189 -0
  112. package/skills/intercity-bus-booking/references/tmoney-intercity-http-flow.md +126 -0
  113. package/skills/intercity-bus-booking/scripts/intercity_bus_search.py +381 -0
  114. package/skills/intercity-bus-booking/skill.json +8 -0
  115. package/skills/iros-registry-automation/instruction.md +229 -0
  116. package/skills/iros-registry-automation/scripts/iros_pdf_summary.py +249 -0
  117. package/skills/iros-registry-automation/scripts/upstream.pin +1 -0
  118. package/skills/iros-registry-automation/skill.json +9 -0
  119. package/skills/job-posting-match/instruction.md +130 -0
  120. package/skills/job-posting-match/scripts/job_posting_match.py +396 -0
  121. package/skills/job-posting-match/scripts/test_job_posting_match.py +54 -0
  122. package/skills/job-posting-match/skill.json +8 -0
  123. package/skills/jobkorea-talent-search/instruction.md +118 -0
  124. package/skills/jobkorea-talent-search/scripts/jobkorea_talent_models.py +27 -0
  125. package/skills/jobkorea-talent-search/scripts/jobkorea_talent_parse.py +186 -0
  126. package/skills/jobkorea-talent-search/scripts/jobkorea_talent_search.py +94 -0
  127. package/skills/jobkorea-talent-search/scripts/jobkorea_talent_search_condition.py +136 -0
  128. package/skills/jobkorea-talent-search/scripts/test_jobkorea_talent_search.py +76 -0
  129. package/skills/jobkorea-talent-search/skill.json +9 -0
  130. package/skills/joseon-sillok-search/instruction.md +76 -0
  131. package/skills/joseon-sillok-search/scripts/sillok_search.py +552 -0
  132. package/skills/joseon-sillok-search/skill.json +8 -0
  133. package/skills/k-dart/instruction.md +406 -0
  134. package/skills/k-dart/skill.json +8 -0
  135. package/skills/k-schoollunch-menu/instruction.md +109 -0
  136. package/skills/k-schoollunch-menu/skill.json +9 -0
  137. package/skills/k-skill-cleaner/instruction.md +80 -0
  138. package/skills/k-skill-cleaner/scripts/k_skill_cleaner.py +410 -0
  139. package/skills/k-skill-cleaner/skill.json +8 -0
  140. package/skills/k-skill-setup/instruction.md +253 -0
  141. package/skills/k-skill-setup/skill.json +11 -0
  142. package/skills/kakao-bar-nearby/instruction.md +76 -0
  143. package/skills/kakao-bar-nearby/skill.json +8 -0
  144. package/skills/kakao-map/instruction.md +176 -0
  145. package/skills/kakao-map/skill.json +10 -0
  146. package/skills/kakaotalk-mac/instruction.md +189 -0
  147. package/skills/kakaotalk-mac/skill.json +8 -0
  148. package/skills/kbl-results/instruction.md +89 -0
  149. package/skills/kbl-results/skill.json +9 -0
  150. package/skills/kbo-results/instruction.md +82 -0
  151. package/skills/kbo-results/skill.json +8 -0
  152. package/skills/keris-academic-search/instruction.md +81 -0
  153. package/skills/keris-academic-search/scripts/keris_academic.py +210 -0
  154. package/skills/keris-academic-search/skill.json +10 -0
  155. package/skills/kleague-results/instruction.md +92 -0
  156. package/skills/kleague-results/skill.json +8 -0
  157. package/skills/kopis-performance-search/instruction.md +109 -0
  158. package/skills/kopis-performance-search/skill.json +10 -0
  159. package/skills/korea-weather/instruction.md +93 -0
  160. package/skills/korea-weather/skill.json +10 -0
  161. package/skills/korean-character-count/instruction.md +87 -0
  162. package/skills/korean-character-count/scripts/korean_character_count.js +268 -0
  163. package/skills/korean-character-count/skill.json +8 -0
  164. package/skills/korean-cinema-search/instruction.md +177 -0
  165. package/skills/korean-cinema-search/skill.json +8 -0
  166. package/skills/korean-heritage-search/instruction.md +106 -0
  167. package/skills/korean-heritage-search/scripts/korean_heritage_search.py +321 -0
  168. package/skills/korean-heritage-search/skill.json +8 -0
  169. package/skills/korean-holiday-calendar/instruction.md +97 -0
  170. package/skills/korean-holiday-calendar/skill.json +9 -0
  171. package/skills/korean-humanizer/instruction.md +389 -0
  172. package/skills/korean-humanizer/references/ai-tell-taxonomy.md +147 -0
  173. package/skills/korean-humanizer/skill.json +8 -0
  174. package/skills/korean-jangbu-for/instruction.md +133 -0
  175. package/skills/korean-jangbu-for/scripts/install.sh +237 -0
  176. package/skills/korean-jangbu-for/scripts/upstream.pin +1 -0
  177. package/skills/korean-jangbu-for/skill.json +8 -0
  178. package/skills/korean-law-search/instruction.md +126 -0
  179. package/skills/korean-law-search/skill.json +10 -0
  180. package/skills/korean-marathon-schedule/instruction.md +111 -0
  181. package/skills/korean-marathon-schedule/skill.json +9 -0
  182. package/skills/korean-middle-korean/instruction.md +79 -0
  183. package/skills/korean-middle-korean/scripts/korean_middle_korean.js +214 -0
  184. package/skills/korean-middle-korean/skill.json +8 -0
  185. package/skills/korean-patent-search/instruction.md +79 -0
  186. package/skills/korean-patent-search/scripts/patent_search.py +409 -0
  187. package/skills/korean-patent-search/skill.json +9 -0
  188. package/skills/korean-privacy-terms/instruction.md +128 -0
  189. package/skills/korean-privacy-terms/scripts/install.sh +108 -0
  190. package/skills/korean-privacy-terms/scripts/upstream.pin +1 -0
  191. package/skills/korean-privacy-terms/skill.json +8 -0
  192. package/skills/korean-scholarship-search/instruction.md +317 -0
  193. package/skills/korean-scholarship-search/references/report-format.md +40 -0
  194. package/skills/korean-scholarship-search/references/school-discovery.md +61 -0
  195. package/skills/korean-scholarship-search/references/search-clues.md +58 -0
  196. package/skills/korean-scholarship-search/references/source-patterns.md +67 -0
  197. package/skills/korean-scholarship-search/scripts/scholarship_filter.py +811 -0
  198. package/skills/korean-scholarship-search/scripts/test_scholarship_filter.py +224 -0
  199. package/skills/korean-scholarship-search/scripts/university_search_plan.py +148 -0
  200. package/skills/korean-scholarship-search/skill.json +8 -0
  201. package/skills/korean-slang-writing/instruction.md +181 -0
  202. package/skills/korean-slang-writing/scripts/_slang_http.py +91 -0
  203. package/skills/korean-slang-writing/scripts/slang_lookup.py +291 -0
  204. package/skills/korean-slang-writing/scripts/slang_search.py +284 -0
  205. package/skills/korean-slang-writing/skill.json +8 -0
  206. package/skills/korean-spell-check/instruction.md +105 -0
  207. package/skills/korean-spell-check/scripts/korean_spell_check.py +523 -0
  208. package/skills/korean-spell-check/skill.json +9 -0
  209. package/skills/korean-stock-search/instruction.md +194 -0
  210. package/skills/korean-stock-search/skill.json +10 -0
  211. package/skills/korean-transit-route/instruction.md +113 -0
  212. package/skills/korean-transit-route/skill.json +10 -0
  213. package/skills/kosis-stats/instruction.md +232 -0
  214. package/skills/kosis-stats/references/kosis-openapi-guide.md +171 -0
  215. package/skills/kosis-stats/scripts/run_kosis_stats.py +896 -0
  216. package/skills/kosis-stats/skill.json +9 -0
  217. package/skills/kr-whois-lookup/instruction.md +107 -0
  218. package/skills/kr-whois-lookup/skill.json +10 -0
  219. package/skills/kstartup-search/instruction.md +186 -0
  220. package/skills/kstartup-search/scripts/run_kstartup.py +424 -0
  221. package/skills/kstartup-search/skill.json +11 -0
  222. package/skills/ktx-booking/instruction.md +244 -0
  223. package/skills/ktx-booking/skill.json +10 -0
  224. package/skills/lck-analytics/instruction.md +192 -0
  225. package/skills/lck-analytics/scripts/_lib.js +103 -0
  226. package/skills/lck-analytics/scripts/analyze-live-game.js +52 -0
  227. package/skills/lck-analytics/scripts/build-match-report.js +44 -0
  228. package/skills/lck-analytics/scripts/sync-oracle.js +50 -0
  229. package/skills/lck-analytics/skill.json +9 -0
  230. package/skills/lh-notice-search/instruction.md +206 -0
  231. package/skills/lh-notice-search/skill.json +10 -0
  232. package/skills/library-book-search/instruction.md +139 -0
  233. package/skills/library-book-search/skill.json +9 -0
  234. package/skills/local-election-candidate-search/instruction.md +77 -0
  235. package/skills/local-election-candidate-search/skill.json +8 -0
  236. package/skills/localdata-business-status/instruction.md +64 -0
  237. package/skills/localdata-business-status/scripts/localdata_business_status.py +206 -0
  238. package/skills/localdata-business-status/skill.json +8 -0
  239. package/skills/lotto-results/instruction.md +80 -0
  240. package/skills/lotto-results/skill.json +8 -0
  241. package/skills/lovebug-report/instruction.md +185 -0
  242. package/skills/lovebug-report/skill.json +9 -0
  243. package/skills/market-kurly-search/instruction.md +125 -0
  244. package/skills/market-kurly-search/skill.json +8 -0
  245. package/skills/mfds-drug-safety/instruction.md +86 -0
  246. package/skills/mfds-drug-safety/scripts/mfds_drug_safety.py +184 -0
  247. package/skills/mfds-drug-safety/skill.json +10 -0
  248. package/skills/mfds-food-safety/instruction.md +126 -0
  249. package/skills/mfds-food-safety/scripts/mfds_food_safety.py +281 -0
  250. package/skills/mfds-food-safety/skill.json +10 -0
  251. package/skills/myrealtrip-search/instruction.md +239 -0
  252. package/skills/myrealtrip-search/scripts/myrealtrip_mcp.py +194 -0
  253. package/skills/myrealtrip-search/scripts/test_myrealtrip_mcp.py +99 -0
  254. package/skills/myrealtrip-search/skill.json +9 -0
  255. package/skills/naming-house/instruction.md +146 -0
  256. package/skills/naming-house/skill.json +8 -0
  257. package/skills/national-pension-workplace/instruction.md +64 -0
  258. package/skills/national-pension-workplace/scripts/national_pension_workplace.py +113 -0
  259. package/skills/national-pension-workplace/skill.json +10 -0
  260. package/skills/naver-ad-performance/instruction.md +108 -0
  261. package/skills/naver-ad-performance/scripts/naver_ad_performance.py +240 -0
  262. package/skills/naver-ad-performance/skill.json +9 -0
  263. package/skills/naver-blog-research/instruction.md +128 -0
  264. package/skills/naver-blog-research/scripts/_naver_http.py +58 -0
  265. package/skills/naver-blog-research/scripts/naver_download_images.py +233 -0
  266. package/skills/naver-blog-research/scripts/naver_read.py +256 -0
  267. package/skills/naver-blog-research/scripts/naver_search.py +192 -0
  268. package/skills/naver-blog-research/skill.json +8 -0
  269. package/skills/naver-news-search/instruction.md +103 -0
  270. package/skills/naver-news-search/skill.json +10 -0
  271. package/skills/naver-shopping-search/instruction.md +94 -0
  272. package/skills/naver-shopping-search/skill.json +11 -0
  273. package/skills/nhis-care-checkup-search/instruction.md +116 -0
  274. package/skills/nhis-care-checkup-search/skill.json +10 -0
  275. package/skills/nts-business-registration/instruction.md +115 -0
  276. package/skills/nts-business-registration/scripts/nts_business_registration.py +215 -0
  277. package/skills/nts-business-registration/skill.json +10 -0
  278. package/skills/nts-tax-delinquency/instruction.md +54 -0
  279. package/skills/nts-tax-delinquency/scripts/nts_tax_delinquency.py +150 -0
  280. package/skills/nts-tax-delinquency/skill.json +8 -0
  281. package/skills/ohou-today-deal/instruction.md +182 -0
  282. package/skills/ohou-today-deal/scripts/ohou_today_deal.py +369 -0
  283. package/skills/ohou-today-deal/skill.json +9 -0
  284. package/skills/olive-young-search/instruction.md +154 -0
  285. package/skills/olive-young-search/skill.json +8 -0
  286. package/skills/parking-lot-search/instruction.md +96 -0
  287. package/skills/parking-lot-search/skill.json +9 -0
  288. package/skills/popbill/instruction.md +146 -0
  289. package/skills/popbill/scripts/popbill_cli.py +284 -0
  290. package/skills/popbill/scripts/popbill_registry.py +54 -0
  291. package/skills/popbill/scripts/popbill_safety.py +37 -0
  292. package/skills/popbill/scripts/popbill_templates.py +71 -0
  293. package/skills/popbill/skill.json +9 -0
  294. package/skills/public-restroom-nearby/instruction.md +89 -0
  295. package/skills/public-restroom-nearby/skill.json +9 -0
  296. package/skills/real-estate-search/instruction.md +172 -0
  297. package/skills/real-estate-search/skill.json +10 -0
  298. package/skills/rhwp-advanced/instruction.md +145 -0
  299. package/skills/rhwp-advanced/skill.json +8 -0
  300. package/skills/rhwp-edit/instruction.md +153 -0
  301. package/skills/rhwp-edit/skill.json +8 -0
  302. package/skills/s2b-notice-search/instruction.md +66 -0
  303. package/skills/s2b-notice-search/skill.json +9 -0
  304. package/skills/saju-fortune/instruction.md +177 -0
  305. package/skills/saju-fortune/skill.json +8 -0
  306. package/skills/saramin-talent-search/instruction.md +119 -0
  307. package/skills/saramin-talent-search/skill.json +9 -0
  308. package/skills/seoul-bike/instruction.md +83 -0
  309. package/skills/seoul-bike/scripts/seoul_bike.py +247 -0
  310. package/skills/seoul-bike/skill.json +10 -0
  311. package/skills/seoul-density/instruction.md +109 -0
  312. package/skills/seoul-density/scripts/seoul_density.py +271 -0
  313. package/skills/seoul-density/skill.json +10 -0
  314. package/skills/seoul-subway-arrival/instruction.md +85 -0
  315. package/skills/seoul-subway-arrival/skill.json +9 -0
  316. package/skills/sh-notice-search/instruction.md +150 -0
  317. package/skills/sh-notice-search/skill.json +9 -0
  318. package/skills/srt-booking/instruction.md +181 -0
  319. package/skills/srt-booking/scripts/srt_booking.py +272 -0
  320. package/skills/srt-booking/scripts/srt_seats.py +156 -0
  321. package/skills/srt-booking/skill.json +20 -0
  322. package/skills/subway-lost-property/instruction.md +93 -0
  323. package/skills/subway-lost-property/scripts/subway_lost_property.py +244 -0
  324. package/skills/subway-lost-property/skill.json +8 -0
  325. package/skills/ticket-availability/instruction.md +175 -0
  326. package/skills/ticket-availability/scripts/ticket_availability.py +430 -0
  327. package/skills/ticket-availability/skill.json +9 -0
  328. package/skills/toss-securities/instruction.md +116 -0
  329. package/skills/toss-securities/skill.json +9 -0
  330. package/skills/used-car-price-search/instruction.md +109 -0
  331. package/skills/used-car-price-search/skill.json +8 -0
  332. package/skills/yebigun-training/instruction.md +177 -0
  333. package/skills/yebigun-training/skill.json +9 -0
  334. package/skills/zipcode-search/instruction.md +159 -0
  335. package/skills/zipcode-search/scripts/zipcode_search.py +150 -0
  336. package/skills/zipcode-search/skill.json +8 -0
  337. package/src/assemble.js +134 -0
  338. package/src/detect.js +18 -0
  339. package/templates/action-account.md +4 -0
  340. package/templates/action-booking.md +5 -0
  341. package/templates/action-commerce.md +5 -0
  342. package/templates/action-communication.md +5 -0
  343. package/templates/action-submission.md +5 -0
  344. package/templates/browser.md +4 -0
  345. package/templates/core.md +5 -0
  346. package/templates/hard-boundary.md +3 -0
  347. package/templates/local.md +2 -0
  348. package/templates/lookup.md +2 -0
  349. package/templates/proxy.md +2 -0
  350. package/templates/vault.md +4 -0
@@ -0,0 +1,89 @@
1
+ # Public Restroom Nearby
2
+
3
+ ## What this skill does
4
+
5
+ 유저가 알려준 현재 위치를 기준으로 **근처 공중화장실 / 개방화장실** 을 찾는다.
6
+
7
+ - 위치는 자동으로 추정하지 않는다.
8
+ - **반드시 먼저 현재 위치를 질문**한다.
9
+ - 화장실 데이터는 공식 `공중화장실정보` 표준데이터를 기본으로 사용한다.
10
+ - `KAKAO_REST_API_KEY` 또는 `kakaoRestApiKey` 옵션이 있으면 Kakao Local REST API로 `공중화장실`, `개방화장실`, `OL7` 주유소를 추가 조회해 병합한다.
11
+ - 위치 문자열은 Kakao Map anchor 검색으로 좌표를 잡고, 가능한 경우 해당 시도 데이터만 좁혀서 조회한다.
12
+ - 좌표를 직접 받으면 바로 nearby 계산으로 들어간다.
13
+
14
+ ## When to use
15
+
16
+ - "근처 화장실 찾아줘"
17
+ - "서울역 근처 공중화장실 있어?"
18
+ - "광화문 주변 개방화장실 몇 군데만 보여줘"
19
+ - "지금 여기서 가까운 화장실 지도 링크 줘"
20
+
21
+ ## Mandatory first question
22
+
23
+ 위치 정보 없이 바로 검색하지 말고 반드시 먼저 물어본다.
24
+
25
+ - 권장 질문: `현재 위치를 알려주세요. 동네/역명/랜드마크/위도·경도 중 편한 형식으로 보내주시면 근처 공중화장실을 찾아볼게요.`
26
+ - 위치가 애매하면: `가까운 역명이나 동 이름으로 한 번만 더 알려주세요.`
27
+
28
+ ## Official surfaces
29
+
30
+ - 공공데이터포털 공중화장실 표준데이터 안내: `https://www.data.go.kr/data/15012892/standard.do`
31
+ - 전국 CSV: `https://file.localdata.go.kr/file/download/public_restroom_info/info`
32
+ - 지역별 CSV: `https://file.localdata.go.kr/file/download/public_restroom_info/info?orgCode=<시도코드>`
33
+ - 파일 소개 페이지: `https://file.localdata.go.kr/file/public_restroom_info/info`
34
+ - Kakao Map 모바일 검색: `https://m.map.kakao.com/actions/searchView?q=<query>`
35
+ - Kakao Map 장소 패널 JSON: `https://place-api.map.kakao.com/places/panel3/<confirmId>`
36
+
37
+ ## Workflow
38
+
39
+ 1. 유저에게 반드시 현재 위치를 묻는다.
40
+ 2. 위치 문자열을 받으면 Kakao Map으로 anchor 후보를 고르고 좌표를 확보한다.
41
+ 3. anchor 주소에서 시도(서울/경기/부산 등)를 추론할 수 있으면 해당 지역 CSV로 좁힌다.
42
+ 4. 공식 `공중화장실정보` CSV를 내려받고, Kakao REST API 키가 있으면 `keyword.json?query=공중화장실`, `keyword.json?query=개방화장실`, `category.json?category_group_code=OL7` 결과를 추가한다.
43
+ 5. Kakao `distance` 필드는 버리고 모든 결과를 위·경도 haversine 거리로 직접 재계산한다.
44
+ 6. 좌표 50m 이내 중복은 동일 시설로 보고 CSV 결과를 우선 보존한다.
45
+ 7. 보통 3~5개만 짧게 정리하고, 필요하면 URL 인코딩된 지도 링크(`map.kakao.com/link/map/...`)를 같이 준다.
46
+
47
+ ## Responding
48
+
49
+ 결과는 보통 아래 필드를 포함해 짧게 정리한다.
50
+
51
+ - 화장실명
52
+ - 구분명(공중화장실 / 개방화장실)
53
+ - 거리
54
+ - 주소
55
+ - 개방시간/상세
56
+ - 지도 링크
57
+
58
+ ## Node.js example
59
+
60
+ ```js
61
+ const { searchNearbyPublicRestroomsByLocationQuery } = require("public-restroom-nearby");
62
+
63
+ async function main() {
64
+ const result = await searchNearbyPublicRestroomsByLocationQuery("광화문", {
65
+ limit: 3
66
+ });
67
+
68
+ console.log(result.anchor);
69
+ console.log(result.items);
70
+ }
71
+
72
+ main().catch((error) => {
73
+ console.error(error);
74
+ process.exitCode = 1;
75
+ });
76
+ ```
77
+
78
+ ## Done when
79
+
80
+ - 유저의 현재 위치를 먼저 확인했다.
81
+ - 공식 데이터 기반으로 최소 1개 이상 nearby restroom 을 찾았거나, 못 찾은 이유와 다음 질문을 제시했다.
82
+ - 가장 가까운 결과를 3~5개 이내로 정리했다.
83
+
84
+ ## Failure modes
85
+
86
+ - Kakao REST API 키가 없으면 CSV 단일 소스로 동작하므로 누락 POI가 있을 수 있다.
87
+ - Kakao Map anchor 가 애매하면 위치 기준점이 흔들릴 수 있다.
88
+ - 공개 표준데이터는 실시간 점유/잠금 상태를 주지 않으므로 개방시간 중심으로만 안내해야 한다.
89
+ - CSV 인코딩/컬럼 구조가 바뀌면 정규화 로직을 다시 확인해야 한다.
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "public-restroom-nearby",
3
+ "description": "Use when the user asks for nearby public/open restrooms or 근처 화장실. Always ask the user's current location first, then use the official nationwide public-restroom standard dataset plus Kakao anchor resolution.",
4
+ "profiles": [
5
+ "vault",
6
+ "lookup"
7
+ ],
8
+ "frontmatter": "name: public-restroom-nearby\ndescription: Use when the user asks for nearby public/open restrooms or 근처 화장실. Always ask the user's current location first, then use the official nationwide public-restroom standard dataset plus Kakao anchor resolution.\nlicense: MIT\nmetadata:\n category: convenience\n locale: ko-KR\n phase: v1"
9
+ }
@@ -0,0 +1,172 @@
1
+ # Korean Real Estate Search
2
+
3
+ ## What this skill does
4
+
5
+ 기본적으로 `https://k-skill-proxy.nomadamas.org/v1/real-estate/...` 로 요청해서 한국 부동산 실거래가/전월세 데이터를 조회한다. 국토교통부(MOLIT) 실거래가 신고 데이터를 기반으로 한다.
6
+
7
+ ## When to use
8
+
9
+ - "잠실 리센츠 2024년 매매 실거래가 찾아줘"
10
+ - "마포구 아파트 전세 실거래가 보여줘"
11
+ - "성수동 오피스텔 월세 실거래 데이터 볼래"
12
+ - "강남구 연립다세대 매매 실거래가"
13
+ - "용산구 상업업무용 건물 거래 내역"
14
+
15
+ ## When not to use
16
+
17
+ - 해외 부동산 시세/거래 조회
18
+ - 실거래가가 아닌 민간 호가/매물 비교만 필요한 경우
19
+ - 세금/등기/중개 법률자문처럼 판단이 필요한 경우
20
+ - 청약홈 분양/당첨 조회 (아직 미지원)
21
+
22
+ ## Inputs
23
+
24
+ - `q`: 지역명 (region-code endpoint, 예: `"서울 강남구"`, `"마포구"`)
25
+ - `lawd_cd`: 5자리 법정동 코드 (transaction endpoint, 예: `"11680"`)
26
+ - `deal_ymd`: 6자리 거래년월 YYYYMM (예: `"202403"`)
27
+ - `num_of_rows`: 조회 건수 (기본 100, 최대 1000)
28
+
29
+ ## Prerequisites
30
+
31
+ 없음. 사용자는 별도 API key를 준비할 필요가 없다. upstream key는 proxy 서버에서만 주입한다.
32
+
33
+ ## Default path
34
+
35
+ 추가 client API 레이어는 불필요하다. 그냥 프록시 서버에 HTTP 요청만 넣으면 된다.
36
+
37
+ `KSKILL_PROXY_BASE_URL` 환경변수가 있으면 그 값을 사용하고, 없으면 기본 경로 `https://k-skill-proxy.nomadamas.org` 를 사용한다.
38
+
39
+ ## Supported endpoints
40
+
41
+ ### 지역코드 조회
42
+
43
+ ```
44
+ GET /v1/real-estate/region-code?q={지역명}
45
+ ```
46
+
47
+ ### 실거래가/전월세 조회
48
+
49
+ ```
50
+ GET /v1/real-estate/:assetType/:dealType?lawd_cd={코드}&deal_ymd={년월}
51
+ ```
52
+
53
+ | assetType | dealType | 설명 |
54
+ |---|---|---|
55
+ | `apartment` | `trade` | 아파트 매매 |
56
+ | `apartment` | `rent` | 아파트 전월세 |
57
+ | `officetel` | `trade` | 오피스텔 매매 |
58
+ | `officetel` | `rent` | 오피스텔 전월세 |
59
+ | `villa` | `trade` | 연립다세대 매매 |
60
+ | `villa` | `rent` | 연립다세대 전월세 |
61
+ | `single-house` | `trade` | 단독/다가구 매매 |
62
+ | `single-house` | `rent` | 단독/다가구 전월세 |
63
+ | `commercial` | `trade` | 상업업무용 매매 |
64
+
65
+ `commercial/rent`는 지원하지 않는다.
66
+
67
+ ## Example requests
68
+
69
+ 지역코드 조회:
70
+
71
+ ```bash
72
+ curl -fsS --get 'https://k-skill-proxy.nomadamas.org/v1/real-estate/region-code' \
73
+ --data-urlencode 'q=강남구'
74
+ ```
75
+
76
+ 아파트 매매 실거래가 조회:
77
+
78
+ ```bash
79
+ curl -fsS --get 'https://k-skill-proxy.nomadamas.org/v1/real-estate/apartment/trade' \
80
+ --data-urlencode 'lawd_cd=11680' \
81
+ --data-urlencode 'deal_ymd=202403'
82
+ ```
83
+
84
+ 오피스텔 전월세 조회:
85
+
86
+ ```bash
87
+ curl -fsS --get 'https://k-skill-proxy.nomadamas.org/v1/real-estate/officetel/rent' \
88
+ --data-urlencode 'lawd_cd=11680' \
89
+ --data-urlencode 'deal_ymd=202403'
90
+ ```
91
+
92
+ ## Response shape
93
+
94
+ ### 지역코드 응답
95
+
96
+ ```json
97
+ {
98
+ "results": [
99
+ { "lawd_cd": "11680", "name": "서울특별시 강남구" }
100
+ ],
101
+ "query": "강남구",
102
+ "proxy": { "name": "k-skill-proxy", "cache": { "hit": false, "ttl_ms": 300000 } }
103
+ }
104
+ ```
105
+
106
+ ### 매매 실거래가 응답
107
+
108
+ ```json
109
+ {
110
+ "items": [
111
+ {
112
+ "name": "래미안 퍼스티지",
113
+ "district": "반포동",
114
+ "area_m2": 84.99,
115
+ "floor": 12,
116
+ "price_10k": 245000,
117
+ "deal_date": "2024-03-15",
118
+ "build_year": 2009,
119
+ "deal_type": "중개거래"
120
+ }
121
+ ],
122
+ "summary": {
123
+ "median_price_10k": 230000,
124
+ "min_price_10k": 180000,
125
+ "max_price_10k": 310000,
126
+ "sample_count": 42
127
+ },
128
+ "query": { "asset_type": "apartment", "deal_type": "trade", "lawd_cd": "11680", "deal_ymd": "202403" },
129
+ "proxy": { "name": "k-skill-proxy", "cache": { "hit": false, "ttl_ms": 300000 } }
130
+ }
131
+ ```
132
+
133
+ ### 전월세 응답
134
+
135
+ 매매와 동일 구조이나 아이템에 `deposit_10k`, `monthly_rent_10k`, `contract_type` 이 포함되고, summary에 `median_deposit_10k`, `monthly_rent_avg_10k` 등이 들어간다.
136
+
137
+ ## Response policy
138
+
139
+ - 실거래가/전월세 요청이면 `region-code` endpoint로 행정구역 코드를 먼저 확인한 뒤 자산 타입별 endpoint로 조회한다.
140
+ - 아파트 매매는 `apartment/trade`, 아파트 전월세는 `apartment/rent` 를 우선 사용한다.
141
+ - 오피스텔/빌라/단독주택/상업업무용은 자산 타입에 맞는 endpoint로 라우팅한다.
142
+ - 사용자가 동/건물명/연월을 덜 줬으면 지역, 단지명, 기준 월을 먼저 보강한다.
143
+ - 실거래가와 호가를 섞어 말하지 않는다. 이 스킬은 국토교통부 기반 실거래/전월세 신고 데이터를 다룬다.
144
+
145
+ ## Keep the answer compact
146
+
147
+ - 지역명 + 자산 타입 + 거래년월
148
+ - 거래 건수 (summary.sample_count)
149
+ - 가격 요약: 중위값, 최소, 최대
150
+ - 상위 3-5건 대표 거래 (이름, 면적, 층, 가격, 날짜)
151
+ - 전월세면 보증금 + 월세 요약도 포함
152
+
153
+ ## Failure modes
154
+
155
+ - `lawd_cd` 또는 `deal_ymd` 형식이 잘못되면 400 응답
156
+ - 프록시 서버에 `DATA_GO_KR_API_KEY` 가 없으면 503 응답
157
+ - upstream MOLIT API 오류면 502 + `molit_api_XXX` 에러 코드
158
+ - 해당 지역/기간에 데이터가 없으면 빈 `items` 배열 반환
159
+
160
+ ## Done when
161
+
162
+ - 요청 자산 타입에 맞는 endpoint를 선택했다.
163
+ - 필요한 경우 `region-code` 로 지역코드를 먼저 확인했다.
164
+ - 실거래가/전월세 결과를 조회하고 요약했다.
165
+ - 원본 데이터 출처(국토교통부 실거래가 신고)를 함께 남겼다.
166
+
167
+ ## Notes
168
+
169
+ - 원본 참고: `https://github.com/tae0y/real-estate-mcp/tree/main`
170
+ - 공식 데이터 출처: 공공데이터포털 (`https://www.data.go.kr`)
171
+ - 가격 단위: `price_10k`, `deposit_10k` = 만원 단위 (예: 245000 = 24억 5천만원)
172
+ - 취소된 거래는 서버에서 자동 필터링된다.
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "real-estate-search",
3
+ "description": "Korean apartment/officetel/villa/single-house real transaction price and rent lookups via k-skill-proxy. Based on tae0y's real-estate-mcp and MOLIT public data APIs.",
4
+ "profiles": [
5
+ "proxy",
6
+ "vault",
7
+ "lookup"
8
+ ],
9
+ "frontmatter": "name: real-estate-search\ndescription: Korean apartment/officetel/villa/single-house real transaction price and rent lookups via k-skill-proxy. Based on tae0y's real-estate-mcp and MOLIT public data APIs.\nlicense: MIT\nmetadata:\n category: real-estate\n locale: ko-KR\n phase: v1"
10
+ }
@@ -0,0 +1,145 @@
1
+ # rhwp-advanced
2
+
3
+ ## What this skill does
4
+
5
+ **업스트림 `rhwp` CLI**(Rust 네이티브 바이너리)를 써서 HWP 파일의 **레이아웃 디버깅·IR 구조 검사·버전 비교·썸네일 추출·배포용 문서 잠금 해제** 를 수행한다.
6
+ `k-skill-rhwp`(Node 편집 CLI)가 다루지 못하는 구조 분석·렌더 문제 진단용이다.
7
+
8
+ 이 스킬은 **편집을 하지 않는다**. 편집은 [`rhwp-edit`](../rhwp-edit/SKILL.md) 스킬, 문서 → Markdown/JSON 변환은 [`hwp`](../hwp/SKILL.md) 스킬(kordoc) 을 쓴다.
9
+
10
+ ## When to use
11
+
12
+ - "표/셀이 이상하게 잘려. 어디서 깨지는지 IR 덤프를 보고 싶어"
13
+ - "두 HWP 파일 구조 차이를 줄 단위로 보고 싶어"
14
+ - "SVG 렌더가 이상해. 문단/표 경계선을 시각적으로 확인하고 싶어"
15
+ - "페이지가 몇 개이고 어느 문단이 몇 페이지에 걸쳐 있는지 보고 싶어"
16
+ - "배포용(읽기전용) HWP 파일 잠금을 풀고 싶어"
17
+ - "HWP 파일에서 PrvImage 썸네일을 꺼내고 싶어"
18
+
19
+ ## When not to use
20
+
21
+ - **텍스트/표 편집** → `rhwp-edit` 스킬 (`k-skill-rhwp` CLI)
22
+ - **HWP → Markdown/JSON/양식필드 변환** → `hwp` 스킬 (`kordoc`)
23
+ - **GUI 자동화, 한컴 보안모듈 우회, Windows 레지스트리 제어** → 범위 밖이다.
24
+ - **Node 코드에서 라이브러리 API 로 편집** → `k-skill-rhwp` 를 Node API 로 쓴다.
25
+
26
+ ## Prerequisites
27
+
28
+ - **rhwp CLI 바이너리**. 다음 중 하나:
29
+ - `cargo install rhwp` (Rust toolchain 필요. Rust 1.75+. 네이티브 빌드이므로 PDF export 포함 전체 서브커맨드 가능)
30
+ - 또는 업스트림 릴리스 페이지 https://github.com/edwardkim/rhwp/releases 에서 플랫폼별 사전 빌드 바이너리 다운로드(있는 플랫폼 한정)
31
+ - PATH 에 `rhwp` 실행 파일이 있는지 `rhwp --help` 로 먼저 확인한다.
32
+ - 출력 파일 쓰기 권한.
33
+ - 선택: PDF export 를 쓸 거면 업스트림 문서에서 해당 서브커맨드의 추가 요구사항 확인.
34
+
35
+ ## Inputs
36
+
37
+ - 입력 HWP/HWPX 파일 경로
38
+ - 서브커맨드별 좌표(구역/문단 index) 또는 페이지 번호
39
+ - 출력 경로(일부 서브커맨드)
40
+
41
+ ## Routing policy
42
+
43
+ | 목적 | 서브커맨드 | 대표 예시 |
44
+ | --- | --- | --- |
45
+ | 기본 메타(페이지/폰트/섹션 통계) | `rhwp info` | `rhwp info sample.hwp` |
46
+ | 페이지를 SVG 로 렌더 | `rhwp export-svg` | `rhwp export-svg sample.hwp -o out/ -p 0 --debug-overlay` |
47
+ | 페이지를 PDF 로 렌더(네이티브 빌드 한정) | `rhwp export-pdf` | `rhwp export-pdf sample.hwp -o out.pdf` |
48
+ | 문서 IR 구조 덤프 | `rhwp dump` | `rhwp dump sample.hwp -s 0 -p 3` |
49
+ | 페이지네이션 결과 덤프 | `rhwp dump-pages` | `rhwp dump-pages sample.hwp -p 2` |
50
+ | 원시 레코드 덤프 | `rhwp dump-records` | `rhwp dump-records sample.hwp` |
51
+ | 번호/글머리표/개요 진단 | `rhwp diag` | `rhwp diag sample.hwp` |
52
+ | 두 파일 IR 비교 | `rhwp ir-diff` | `rhwp ir-diff a.hwpx b.hwp` |
53
+ | PrvImage 썸네일 추출 | `rhwp thumbnail` | `rhwp thumbnail sample.hwp -o thumb.png` |
54
+ | 배포용(읽기전용) → 편집 가능 변환 | `rhwp convert` | `rhwp convert locked.hwp unlocked.hwp` |
55
+ | 빈 표 포함 문서 템플릿 생성 | `rhwp gen-table` | `rhwp gen-table out.hwp` |
56
+
57
+ > `rhwp` v0.7.3 CLI 에는 **편집(edit/insert-text/save) 서브커맨드가 없다.** 편집은 `rhwp-edit` 스킬 (`k-skill-rhwp` CLI) 을 쓴다.
58
+
59
+ ## Workflow
60
+
61
+ 1. **설치 확인**: `rhwp --help` 실행. 서브커맨드 리스트가 나오지 않으면 설치부터.
62
+
63
+ ```bash
64
+ command -v rhwp || cargo install rhwp
65
+ rhwp --help | head
66
+ ```
67
+
68
+ 2. **메타 조회로 좌표 범위 확인**: 먼저 `rhwp info` 로 페이지 수, 섹션 수, 사용 폰트, 표/이미지 통계를 얻는다.
69
+
70
+ ```bash
71
+ rhwp info sample.hwp
72
+ ```
73
+
74
+ 3. **목적별 플로우**:
75
+
76
+ - **SVG 렌더가 이상할 때** — 디버그 오버레이 포함 SVG 를 뽑는다.
77
+
78
+ ```bash
79
+ mkdir -p out
80
+ rhwp export-svg sample.hwp -o out/ -p 0 --debug-overlay
81
+ open out/page-0.svg # 문단/표 경계선과 `s{sec}:pi={idx} y={y}` 라벨이 시각화됨
82
+ ```
83
+
84
+ - **특정 페이지 레이아웃을 더 자세히 보고 싶을 때** — 페이지네이션 덤프.
85
+
86
+ ```bash
87
+ rhwp dump-pages sample.hwp -p 2
88
+ ```
89
+
90
+ - **표가 깨져 보일 때** — IR 덤프에서 셀 구조·ParaShape·LINE_SEG 를 본다.
91
+
92
+ ```bash
93
+ rhwp dump sample.hwp -s 0 -p 3
94
+ ```
95
+
96
+ - **두 버전 비교** — IR diff 로 구조 변경만 추린다.
97
+
98
+ ```bash
99
+ rhwp ir-diff draft-v1.hwp draft-v2.hwp > ir-diff.txt
100
+ ```
101
+
102
+ - **썸네일 추출**:
103
+
104
+ ```bash
105
+ rhwp thumbnail sample.hwp -o cover.png
106
+ # 또는 data URI 가 필요하면: --data-uri
107
+ ```
108
+
109
+ - **배포용(읽기전용) 문서 잠금 해제**:
110
+
111
+ ```bash
112
+ rhwp convert locked.hwp unlocked.hwp
113
+ # 이후 편집은 rhwp-edit 스킬의 k-skill-rhwp CLI 로 수행
114
+ ```
115
+
116
+ 4. **결과를 PR/보고서에 붙일 때**: SVG/PDF/썸네일은 파일 자체를 첨부하고, 덤프 출력은 너무 길면 상위 200~500 줄만 인용하고 전체는 파일로 첨부한다. 개인정보가 포함된 문서의 본문 텍스트는 마스킹한다.
117
+
118
+ ## Verify outputs
119
+
120
+ - `export-svg`: 지정한 `-o` 경로에 `page-N.svg` 파일이 생겼고, 열었을 때 텍스트/도형이 보이며 `--debug-overlay` 사용 시 빨강/파랑 가이드선이 나타난다.
121
+ - `dump` / `dump-pages` / `dump-records`: stdout 에 JSON/텍스트 구조가 최소 수십 줄 이상 나온다.
122
+ - `ir-diff`: 두 파일이 구조적으로 같으면 거의 비어 있고, 다르면 줄 단위 delta 가 보인다.
123
+ - `thumbnail`: 지정한 출력 경로의 PNG 가 실제 이미지 뷰어에서 열린다.
124
+ - `convert`: 출력 파일을 다시 `rhwp info` 로 열었을 때 read-only 플래그가 내려가 있다.
125
+
126
+ ## Done when
127
+
128
+ - 디버깅/검사 목적이라면: 사용자가 원한 구조/렌더 정보가 찍혀 있고 어느 서브커맨드 어떤 플래그로 뽑았는지 명시돼 있다.
129
+ - `convert` 같은 one-shot 변환이라면: 산출 파일이 생성되었고 `rhwp info` 로 재확인 가능.
130
+
131
+ ## Failure modes
132
+
133
+ - **`rhwp: command not found`** → `cargo install rhwp` 혹은 릴리스 바이너리 설치부터.
134
+ - **`export-pdf` 실패** → PDF 는 네이티브 빌드에서만 보장. `@rhwp/core` WASM 경로에서는 불가. 네이티브 `cargo install` 바이너리로 실행 중인지 확인.
135
+ - **HWPX 저장 경로 비활성화(rhwp #196)** → `rhwp` CLI 자체가 HWPX 를 다시 HWPX 로 내보내지 않도록 막아둔 상태. 저장이 필요한 작업은 HWP 5.x 로만 수행한다.
136
+ - **편집 서브커맨드 부재** → v0.7.3 기준 `rhwp` CLI 는 편집 명령을 제공하지 않는다. 편집은 `rhwp-edit` 스킬.
137
+ - **Windows 보안모듈/한컴 GUI 자동화** → 본 스킬 범위 밖. `rhwp` 는 파일 포맷 엔진이다.
138
+ - **버전 드리프트** → rhwp 는 활발히 개발 중이다. 서브커맨드 플래그가 바뀌거나 추가될 수 있으니 `rhwp <subcommand> --help` 를 먼저 확인한다.
139
+
140
+ ## Notes
141
+
142
+ - 업스트림: https://github.com/edwardkim/rhwp
143
+ - 편집 경로(이 repo): [`rhwp-edit`](../rhwp-edit/SKILL.md)
144
+ - 조회/변환 경로(이 repo): [`hwp`](../hwp/SKILL.md)
145
+ - 이 스킬은 **설치 안내 + 실행 레시피**에 가까운 안내형 스킬이다. 프로그램적 제어가 필요하면 `rhwp-edit` 의 Node API(`k-skill-rhwp`)를 쓰고, 여기서는 빠른 디버깅용으로만 사용한다.
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "rhwp-advanced",
3
+ "description": "Debug HWP layout, dump document IR, compare versions, extract thumbnails, and unlock read-only HWPs with the upstream rhwp Rust CLI (export-svg/dump/dump-pages/ir-diff/thumbnail/convert).",
4
+ "profiles": [
5
+ "local"
6
+ ],
7
+ "frontmatter": "name: rhwp-advanced\ndescription: Debug HWP layout, dump document IR, compare versions, extract thumbnails, and unlock read-only HWPs with the upstream rhwp Rust CLI (export-svg/dump/dump-pages/ir-diff/thumbnail/convert).\nlicense: MIT\nmetadata:\n category: documents\n locale: ko-KR\n phase: v1.5"
8
+ }
@@ -0,0 +1,153 @@
1
+ # rhwp-edit
2
+
3
+ ## What this skill does
4
+
5
+ `k-skill-rhwp` CLI로 `.hwp` 문서의 **본문 텍스트**, **표 구조**, **셀 내용**을 round-trip 안전하게 수정한다.
6
+ CLI는 `@rhwp/core`(Rust + WebAssembly) 위에 얇은 Node 래퍼를 씌워 `insertText`, `deleteText`, `replaceAll`,
7
+ `createTable`, `setCellText` 같은 편집 동작을 서브커맨드로 노출한다. 결과는 항상 새 파일로 저장한다.
8
+
9
+ 이 스킬은 **편집 전용**이다. 문서를 Markdown/JSON으로 변환하거나 필드만 추출하려면 [`hwp`](../hwp/SKILL.md) 스킬을 사용한다.
10
+ 페이지 렌더링 디버깅이나 IR 비교가 필요하면 [`rhwp-advanced`](../rhwp-advanced/SKILL.md) 스킬을 사용한다.
11
+
12
+ ## When to use
13
+
14
+ - "HWP 본문에 한 줄 추가해줘"
15
+ - "서식은 유지한 채로 2025를 2026으로 일괄 치환해줘"
16
+ - "3행 4열짜리 표를 HWP에 넣어줘"
17
+ - "표의 특정 셀 내용을 바꿔줘"
18
+ - "빈 HWP 새 파일을 만들어줘"
19
+
20
+ ## When not to use
21
+
22
+ - **HWP → Markdown / JSON 변환** → `hwp` 스킬(kordoc)을 쓴다. rhwp-edit은 바이너리 편집 전용이다.
23
+ - **HWPX 원본을 다시 HWPX로 저장** → rhwp v0.7.3 기준 업스트림이 `#196`으로 HWPX 저장 경로를 막아둔 상태다.
24
+ HWPX를 입력으로 주면 내부적으로 HWP IR로 올라온 뒤 **HWP 5.x 바이너리로만** 저장된다. HWPX 출력이 꼭 필요하면 kordoc `markdownToHwpx`를 쓴다.
25
+ - **레이아웃(페이지네이션·SVG 렌더) 디버깅** → `rhwp-advanced` 스킬로 업스트림 `rhwp` CLI(`export-svg --debug-overlay`, `dump-pages`, `ir-diff`)를 사용한다.
26
+ - **배포용(읽기전용) 잠금 해제 · IR 구조 덤프 · 썸네일 추출 등 고급 검사 명령** → `rhwp-advanced` 스킬 참조.
27
+ - **한컴 오피스 GUI 자동화, 보안모듈 통과, Windows 전용 서식** → 범위 밖이다. `rhwp`는 파일 포맷 엔진이지 GUI 제어가 아니다.
28
+
29
+ ## Prerequisites
30
+
31
+ - Node.js 18+
32
+ - 쓰기 권한이 있는 출력 경로
33
+ - `k-skill-rhwp` 설치(셋 중 하나):
34
+ - 일회성: `npx --yes k-skill-rhwp --help`
35
+ - 전역: `npm install -g k-skill-rhwp`
36
+ - 로컬: `npm install k-skill-rhwp`
37
+ - `k-skill-rhwp`는 `@rhwp/core@^0.7.3`을 peer 없이 dependency로 끌어온다. 별도 설치 불필요.
38
+ - Rust/Cargo toolchain 불필요. 업스트림 `rhwp` CLI를 같이 쓰고 싶으면 `rhwp-advanced` 스킬로.
39
+
40
+ ## Inputs
41
+
42
+ - 입력 HWP / HWPX 경로 (절대 또는 상대)
43
+ - 출력 HWP 경로 (항상 별도 파일. 원본을 덮어쓰지 않는다.)
44
+ - 편집 좌표: `--section N --paragraph N --offset N`
45
+ - 표 좌표: `--section N --parent-paragraph N --control N --cell N [--cell-paragraph N]`
46
+ - 텍스트/쿼리: `--text "..."`, `--query "..."`, `--replacement "..."`
47
+ - `create-table`: `--rows N --cols N`
48
+ - 선택 플래그: `--case-sensitive`, `--no-replace` (`set-cell-text` 에서 기존 셀 내용 보존), `--format svg|html` (`render`)
49
+
50
+ ## Routing policy
51
+
52
+ | 작업 | 기본 경로 |
53
+ | --- | --- |
54
+ | 본문 문단에 텍스트 삽입 | `k-skill-rhwp insert-text` |
55
+ | 본문 문단에서 텍스트 삭제 | `k-skill-rhwp delete-text` |
56
+ | 단순 전체 치환(같은 서식 유지, **본문 문단만**) | `k-skill-rhwp replace-all --query ... --replacement ...` |
57
+ | 치환 대상 위치 사전 조회(**본문 문단만**) | `k-skill-rhwp search --query ... --from-section N --from-paragraph N` |
58
+ | 표 셀 안의 텍스트 확인 | `k-skill-rhwp list-paragraphs` + 셀 좌표 확인 후 `k-skill-rhwp set-cell-text` 로 직접 쓰기 |
59
+ | 빈 표 삽입 | `k-skill-rhwp create-table --rows N --cols N` |
60
+ | 표 셀 내용 교체/채우기 | `k-skill-rhwp set-cell-text --control N --cell N --text "..."` |
61
+ | 빈 HWP 생성 | `k-skill-rhwp create-blank <output.hwp>` |
62
+ | 구조 파악(섹션/문단 수·길이) | `k-skill-rhwp info <file>` / `list-paragraphs` |
63
+ | 페이지 SVG/HTML 미리보기 | `k-skill-rhwp render <file> --page N --format svg` |
64
+
65
+ 모든 편집 서브커맨드는 결과를 JSON 한 줄(CLI에서는 pretty-print)로 돌려준다. `ok: true`, 새 커서 위치(`charOffset`, `paraIdx`, `controlIdx`),
66
+ 저장된 바이트 수(`bytesWritten`), 출력 경로(`outputPath`) 를 포함한다.
67
+
68
+ ## Workflow
69
+
70
+ 1. **입력 점검**: `k-skill-rhwp info <input>` 로 `sourceFormat`(hwp/hwpx), `sectionCount`, 섹션별 `paragraphCount`, 문단별 `length` 를 먼저 확인한다. 편집 좌표는 이 결과에서 뽑는다.
71
+ 2. **검색이 필요한 경우**: `k-skill-rhwp search <input> --query "2025"` 로 섹션/문단/문자 오프셋을 먼저 얻고, 편집 명령에 그대로 넣는다.
72
+ 3. **편집**: 아래 예시 중 해당하는 서브커맨드 하나로 실행한다. `--output` 은 항상 원본과 다른 경로를 지정한다.
73
+
74
+ ```bash
75
+ # 빈 문서 만들기
76
+ npx k-skill-rhwp create-blank ./out/blank.hwp
77
+
78
+ # 본문 첫 문단 앞에 제목 삽입
79
+ npx k-skill-rhwp insert-text ./in.hwp ./out/with-title.hwp \
80
+ --section 0 --paragraph 0 --offset 0 \
81
+ --text "2026년 오픈소스 AI·SW 지원사업 신청서"
82
+
83
+ # 2025 → 2026 일괄 치환
84
+ npx k-skill-rhwp replace-all ./in.hwp ./out/2026.hwp \
85
+ --query 2025 --replacement 2026
86
+
87
+ # 3행 4열 표 삽입(본문 2번째 문단 끝)
88
+ npx k-skill-rhwp create-table ./in.hwp ./out/with-table.hwp \
89
+ --section 0 --paragraph 1 --offset 0 --rows 3 --cols 4
90
+
91
+ # 방금 만든 표의 (0,0) 셀에 "합계" 삽입
92
+ # - create-table 결과의 paraIdx / controlIdx 를 그대로 재사용
93
+ npx k-skill-rhwp set-cell-text ./out/with-table.hwp ./out/with-cell.hwp \
94
+ --section 0 --parent-paragraph <paraIdx> --control <controlIdx> \
95
+ --cell 0 --text "합계"
96
+ ```
97
+
98
+ 4. **round-trip 검증**: 편집 직후 `k-skill-rhwp info <output>` 를 다시 호출하고, 기대한 `paragraphs[].length` 또는 `paragraphCount` 변화를 직접 눈으로 확인한다.
99
+ 필요하면 `k-skill-rhwp render <output> --page 0 --format html` 로 첫 페이지 렌더 문자열이 생성되는지 sanity check 한다.
100
+ 5. **민감 원본 보호**: 편집 대상이 개인정보/사업 신청서 등 비공개 문서라면 생성 파일을 레포에 커밋하지 않고, 로그에 남길 때도 본문을 요약·마스킹한다.
101
+
102
+ ## Node API (선택)
103
+
104
+ CLI가 아니라 Node 코드에서 직접 편집하고 싶으면 같은 패키지를 라이브러리로 쓴다.
105
+
106
+ ```js
107
+ const { insertText, getDocumentInfo } = require("k-skill-rhwp");
108
+
109
+ await insertText({
110
+ input: "./in.hwp",
111
+ output: "./out.hwp",
112
+ section: 0,
113
+ paragraph: 0,
114
+ offset: 0,
115
+ text: "안녕하세요"
116
+ });
117
+ console.log(await getDocumentInfo("./out.hwp"));
118
+ ```
119
+
120
+ Node 18+, `@rhwp/core` WASM 은 첫 호출 시 한 번만 초기화된다. WASM 이 요구하는 `globalThis.measureTextWidth` 콜백은 자동 shim 되므로 별도 설정 없이 돌아간다(정밀 레이아웃이 필요하면 `node-canvas` 기반 shim을 먼저 주입한다).
121
+
122
+ ## Verify outputs after every run
123
+
124
+ - `ok === true`, `bytesWritten` 가 수 KB 이상.
125
+ - `info` 재호출 결과에서 섹션/문단 수·길이 변화가 의도와 일치.
126
+ - 표 삽입의 경우 `paraIdx`/`controlIdx` 가 다음 `set-cell-text` 호출에 그대로 들어간다.
127
+ - 출력 파일이 원본과 다른 경로이며 원본은 그대로다.
128
+
129
+ ## Done when
130
+
131
+ - 사용자가 요청한 편집이 HWP 바이너리에 반영되어 새 파일로 저장됐다.
132
+ - `k-skill-rhwp info <output>` 가 같은 혹은 늘어난 `sectionCount`/`paragraphCount` 와 기대 `length` 를 돌려준다.
133
+ - 원본 파일은 건드리지 않았다.
134
+
135
+ ## Failure modes
136
+
137
+ - **HWPX 원본 저장 불가(rhwp #196)**: HWPX → HWPX round-trip 은 upstream에서 비활성화 상태다. HWPX 입력이라도 출력은 HWP로만 저장된다. 원본 확장자에 의존하지 말고 항상 `.hwp` 로 저장한다.
138
+ - **좌표 범위 초과**: `section/paragraph/offset` 이 실제 문서 범위를 벗어나면 WASM에서 `렌더링 오류: 구역 인덱스 0 범위 초과` 같은 에러를 던지고 CLI는 exit code 1 + stderr 에 메시지를 찍는다. 편집 전에 `info` 로 좌표를 확인한다.
139
+ - **복잡한 표·이미지·양식 필드 round-trip**: 현재 업스트림 rhwp v0.7.x 는 베타다. 복잡한 표·이미지·차트·양식필드가 많은 실제 사업 신청서를 HWP round-trip 할 경우 드물게 형식 손실이 발생할 수 있다. round-trip 이 끝나면 `k-skill-rhwp render <output>` + 육안 확인을 권장한다.
140
+ - **배포용(읽기전용) 문서**: rhwp 자체는 `convertToEditable` 로 잠금 해제를 지원하지만 `k-skill-rhwp` CLI 서브커맨드는 아직 노출하지 않는다. 필요하면 `rhwp-advanced` 스킬의 업스트림 `rhwp convert` 경로를 쓴다.
141
+ - **WASM 초기화**: `@rhwp/core` 번들 WASM(~4 MB) 은 최초 호출 시 한 번 파싱한다. 첫 호출은 수십 ms~수백 ms 지연될 수 있다.
142
+ - **파일 인코딩**: 한국어 텍스트는 UTF-8 로 그대로 CLI 에 넘기면 된다. 셸에서 인용부호가 깨질 경우 `--text=$'...'` 같은 형식을 쓴다.
143
+ - **`search` / `replace-all` 은 본문 문단만 스캔한다**: 업스트림 `searchText` 가 본문(body) 범위로 제한되어 있고, `k-skill-rhwp replace-all` 도 같은 스코프를 그대로 따른다. **표(cell) 안의 텍스트, 머리말/꼬리말, 각주 본문**에서는 `search` 가 `found:false` 를 돌려주고 `replace-all` 도 해당 위치를 건드리지 않는다. 셀 내용이 대상이라면 `list-paragraphs` 또는 `info` 로 표 좌표를 잡고 `set-cell-text` 로 직접 쓴다.
144
+ - **문단 경계 / 개행 치환 금지**: `replace-all` 은 한 문단 안에서의 치환만 보장한다. `--replacement` 에 개행(`\n`, `\r`, U+2028, U+2029) 이 들어오면 CLI 는 exit code 1 과 "replacement must not contain newline or paragraph-break characters" 메시지를 돌려준다. 여러 문단을 만들고 싶으면 `insert-text` 를 여러 번 호출한다.
145
+ - **치환은 원본 매칭 기준 non-overlapping**: 예를 들어 query `a` / replacement `aa` / 원본 `aaa` 는 원본의 각 `a` 를 한 번씩 교체해 `aaaaaa` 가 된다. 치환으로 새로 들어온 문자열은 다시 매칭하지 않는다.
146
+ - **대소문자 무시 매칭은 UTF-16 길이가 보존되는 문자에만 안전하다**: 기본값인 대소문자 무시(`--case-sensitive` 없이) 모드는 `String.prototype.toLowerCase()` 가 UTF-16 길이를 그대로 유지한다는 전제 위에서 오프셋을 계산한다. 터키어 `İ`(U+0130) 처럼 소문자화 시 `i` + 결합 점(U+0307) 로 길이가 늘어나는 문자가 본문 또는 쿼리에 포함되면, 조용한 문서 손상을 방지하기 위해 `replace-all` 이 exit code 1 과 함께 `case-insensitive matching is unsafe because case folding changes the UTF-16 length` 메시지를 돌려준다. 이런 문서에는 `--case-sensitive` 로 다시 실행하거나, 입력을 미리 정규화한다. 한글·ASCII 본문에는 해당하지 않으며, `2025 → 2026` 같은 실제 사업 신청서 워크플로우는 아무 영향을 받지 않는다.
147
+
148
+ ## Notes
149
+
150
+ - 업스트림 rhwp: https://github.com/edwardkim/rhwp
151
+ - 업스트림 `@rhwp/core` npm: https://www.npmjs.com/package/@rhwp/core
152
+ - 업스트림은 활발히 개발 중이다(v0.7.3 2026-04-19 기준). breaking change 가능성을 고려해 `k-skill-rhwp` dependency 는 semver caret 으로 고정한다.
153
+ - 이 스킬은 **편집 전용** 스킬이다. 조회/변환은 `hwp`, 고급 디버깅은 `rhwp-advanced` 가 담당한다.
@@ -0,0 +1,8 @@
1
+ {
2
+ "name": "rhwp-edit",
3
+ "description": "Edit HWP documents — insert/delete text, replace-all, create tables, set cell text — with the k-skill-rhwp CLI that wraps the @rhwp/core WASM engine (rhwp by Edward Kim).",
4
+ "profiles": [
5
+ "local"
6
+ ],
7
+ "frontmatter": "name: rhwp-edit\ndescription: Edit HWP documents — insert/delete text, replace-all, create tables, set cell text — with the k-skill-rhwp CLI that wraps the @rhwp/core WASM engine (rhwp by Edward Kim).\nlicense: MIT\nmetadata:\n category: documents\n locale: ko-KR\n phase: v1.5"
8
+ }