@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.
- package/bin/k-skill.js +60 -0
- package/package.json +37 -0
- package/skills/assembly-bill-vote-search/instruction.md +111 -0
- package/skills/assembly-bill-vote-search/skill.json +10 -0
- package/skills/biz-health-check/instruction.md +69 -0
- package/skills/biz-health-check/scripts/biz_health_check.py +163 -0
- package/skills/biz-health-check/skill.json +10 -0
- package/skills/bok-ecos-stats/instruction.md +95 -0
- package/skills/bok-ecos-stats/scripts/bok_ecos.py +302 -0
- package/skills/bok-ecos-stats/skill.json +10 -0
- package/skills/building-register-search/instruction.md +69 -0
- package/skills/building-register-search/scripts/building_register.py +309 -0
- package/skills/building-register-search/scripts/building_register_xml.py +32 -0
- package/skills/building-register-search/skill.json +9 -0
- package/skills/bunjang-search/instruction.md +154 -0
- package/skills/bunjang-search/skill.json +10 -0
- package/skills/catchtable-sniper/instruction.md +270 -0
- package/skills/catchtable-sniper/skill.json +9 -0
- package/skills/cheap-gas-nearby/instruction.md +107 -0
- package/skills/cheap-gas-nearby/skill.json +10 -0
- package/skills/corporate-registration-consulting/instruction.md +117 -0
- package/skills/corporate-registration-consulting/scripts/fill_official_hwp.py +106 -0
- package/skills/corporate-registration-consulting/skill.json +8 -0
- package/skills/coupang-product-search/instruction.md +219 -0
- package/skills/coupang-product-search/scripts/coupang_partners_mcp.py +146 -0
- package/skills/coupang-product-search/skill.json +10 -0
- package/skills/court-auction-notice-search/instruction.md +201 -0
- package/skills/court-auction-notice-search/skill.json +9 -0
- package/skills/court-payment-order-assistant/instruction.md +120 -0
- package/skills/court-payment-order-assistant/skill.json +10 -0
- package/skills/d2b-notice-search/instruction.md +117 -0
- package/skills/d2b-notice-search/skill.json +10 -0
- package/skills/daangn-cars-search/instruction.md +91 -0
- package/skills/daangn-cars-search/scripts/daangn_cars.py +72 -0
- package/skills/daangn-cars-search/skill.json +9 -0
- package/skills/daangn-jobs-search/instruction.md +90 -0
- package/skills/daangn-jobs-search/scripts/daangn_jobs.py +98 -0
- package/skills/daangn-jobs-search/skill.json +9 -0
- package/skills/daangn-realty-search/instruction.md +114 -0
- package/skills/daangn-realty-search/scripts/daangn_detail_ld.py +76 -0
- package/skills/daangn-realty-search/scripts/daangn_realty.py +216 -0
- package/skills/daangn-realty-search/scripts/daangn_relay_store.py +174 -0
- package/skills/daangn-realty-search/skill.json +8 -0
- package/skills/daangn-used-goods-search/instruction.md +90 -0
- package/skills/daangn-used-goods-search/scripts/daangn_used_goods.py +80 -0
- package/skills/daangn-used-goods-search/skill.json +9 -0
- package/skills/daishin-report-search/instruction.md +138 -0
- package/skills/daishin-report-search/skill.json +10 -0
- package/skills/daiso-product-search/instruction.md +172 -0
- package/skills/daiso-product-search/skill.json +8 -0
- package/skills/danawa-price-search/instruction.md +183 -0
- package/skills/danawa-price-search/scripts/danawa_search.py +354 -0
- package/skills/danawa-price-search/skill.json +8 -0
- package/skills/delivery-tracking/instruction.md +358 -0
- package/skills/delivery-tracking/skill.json +8 -0
- package/skills/donation-place-search/instruction.md +129 -0
- package/skills/donation-place-search/skill.json +9 -0
- package/skills/emergency-room-beds/instruction.md +82 -0
- package/skills/emergency-room-beds/skill.json +8 -0
- package/skills/ev-charger-nearby/instruction.md +80 -0
- package/skills/ev-charger-nearby/scripts/ev_charger.py +222 -0
- package/skills/ev-charger-nearby/skill.json +10 -0
- package/skills/ev-subsidy-status/instruction.md +165 -0
- package/skills/ev-subsidy-status/skill.json +10 -0
- package/skills/express-bus-booking/instruction.md +207 -0
- package/skills/express-bus-booking/references/kobus-http-flow.md +159 -0
- package/skills/express-bus-booking/scripts/kobus_express_booking.py +243 -0
- package/skills/express-bus-booking/skill.json +8 -0
- package/skills/fine-dust-location/instruction.md +89 -0
- package/skills/fine-dust-location/skill.json +9 -0
- package/skills/flight-ticket-search/instruction.md +237 -0
- package/skills/flight-ticket-search/scripts/flight_ticket_search.py +501 -0
- package/skills/flight-ticket-search/skill.json +9 -0
- package/skills/foresttrip-vacancy/instruction.md +167 -0
- package/skills/foresttrip-vacancy/scripts/run_foresttrip_vacancy.py +549 -0
- package/skills/foresttrip-vacancy/skill.json +10 -0
- package/skills/fsc-corporate-info/instruction.md +57 -0
- package/skills/fsc-corporate-info/scripts/fsc_corporate_info.py +113 -0
- package/skills/fsc-corporate-info/skill.json +10 -0
- package/skills/g2b-order-plan-search/instruction.md +131 -0
- package/skills/g2b-order-plan-search/scripts/g2b_order_plan.py +158 -0
- package/skills/g2b-order-plan-search/skill.json +10 -0
- package/skills/g2b-sanctioned-supplier/instruction.md +61 -0
- package/skills/g2b-sanctioned-supplier/scripts/g2b_sanctioned_supplier.py +114 -0
- package/skills/g2b-sanctioned-supplier/skill.json +10 -0
- package/skills/gangnamunni-clinic-search/instruction.md +113 -0
- package/skills/gangnamunni-clinic-search/skill.json +9 -0
- package/skills/geeknews-search/instruction.md +69 -0
- package/skills/geeknews-search/scripts/geeknews_search.py +296 -0
- package/skills/geeknews-search/skill.json +8 -0
- package/skills/gongsijiga-search/instruction.md +128 -0
- package/skills/gongsijiga-search/skill.json +9 -0
- package/skills/gov-overseas-trip-report/instruction.md +488 -0
- package/skills/gov-overseas-trip-report/scripts/gov_overseas_trip_report.py +1206 -0
- package/skills/gov-overseas-trip-report/skill.json +9 -0
- package/skills/han-river-water-level/instruction.md +83 -0
- package/skills/han-river-water-level/skill.json +10 -0
- package/skills/highway-traffic-status/instruction.md +88 -0
- package/skills/highway-traffic-status/scripts/highway_traffic.py +315 -0
- package/skills/highway-traffic-status/skill.json +11 -0
- package/skills/hipass-receipt/instruction.md +97 -0
- package/skills/hipass-receipt/skill.json +10 -0
- package/skills/hola-poke-yeoksam/instruction.md +247 -0
- package/skills/hola-poke-yeoksam/skill.json +8 -0
- package/skills/household-waste-info/instruction.md +117 -0
- package/skills/household-waste-info/skill.json +10 -0
- package/skills/housing-official-price/instruction.md +177 -0
- package/skills/housing-official-price/skill.json +10 -0
- package/skills/hwp/instruction.md +206 -0
- package/skills/hwp/skill.json +8 -0
- package/skills/intercity-bus-booking/instruction.md +189 -0
- package/skills/intercity-bus-booking/references/tmoney-intercity-http-flow.md +126 -0
- package/skills/intercity-bus-booking/scripts/intercity_bus_search.py +381 -0
- package/skills/intercity-bus-booking/skill.json +8 -0
- package/skills/iros-registry-automation/instruction.md +229 -0
- package/skills/iros-registry-automation/scripts/iros_pdf_summary.py +249 -0
- package/skills/iros-registry-automation/scripts/upstream.pin +1 -0
- package/skills/iros-registry-automation/skill.json +9 -0
- package/skills/job-posting-match/instruction.md +130 -0
- package/skills/job-posting-match/scripts/job_posting_match.py +396 -0
- package/skills/job-posting-match/scripts/test_job_posting_match.py +54 -0
- package/skills/job-posting-match/skill.json +8 -0
- package/skills/jobkorea-talent-search/instruction.md +118 -0
- package/skills/jobkorea-talent-search/scripts/jobkorea_talent_models.py +27 -0
- package/skills/jobkorea-talent-search/scripts/jobkorea_talent_parse.py +186 -0
- package/skills/jobkorea-talent-search/scripts/jobkorea_talent_search.py +94 -0
- package/skills/jobkorea-talent-search/scripts/jobkorea_talent_search_condition.py +136 -0
- package/skills/jobkorea-talent-search/scripts/test_jobkorea_talent_search.py +76 -0
- package/skills/jobkorea-talent-search/skill.json +9 -0
- package/skills/joseon-sillok-search/instruction.md +76 -0
- package/skills/joseon-sillok-search/scripts/sillok_search.py +552 -0
- package/skills/joseon-sillok-search/skill.json +8 -0
- package/skills/k-dart/instruction.md +406 -0
- package/skills/k-dart/skill.json +8 -0
- package/skills/k-schoollunch-menu/instruction.md +109 -0
- package/skills/k-schoollunch-menu/skill.json +9 -0
- package/skills/k-skill-cleaner/instruction.md +80 -0
- package/skills/k-skill-cleaner/scripts/k_skill_cleaner.py +410 -0
- package/skills/k-skill-cleaner/skill.json +8 -0
- package/skills/k-skill-setup/instruction.md +253 -0
- package/skills/k-skill-setup/skill.json +11 -0
- package/skills/kakao-bar-nearby/instruction.md +76 -0
- package/skills/kakao-bar-nearby/skill.json +8 -0
- package/skills/kakao-map/instruction.md +176 -0
- package/skills/kakao-map/skill.json +10 -0
- package/skills/kakaotalk-mac/instruction.md +189 -0
- package/skills/kakaotalk-mac/skill.json +8 -0
- package/skills/kbl-results/instruction.md +89 -0
- package/skills/kbl-results/skill.json +9 -0
- package/skills/kbo-results/instruction.md +82 -0
- package/skills/kbo-results/skill.json +8 -0
- package/skills/keris-academic-search/instruction.md +81 -0
- package/skills/keris-academic-search/scripts/keris_academic.py +210 -0
- package/skills/keris-academic-search/skill.json +10 -0
- package/skills/kleague-results/instruction.md +92 -0
- package/skills/kleague-results/skill.json +8 -0
- package/skills/kopis-performance-search/instruction.md +109 -0
- package/skills/kopis-performance-search/skill.json +10 -0
- package/skills/korea-weather/instruction.md +93 -0
- package/skills/korea-weather/skill.json +10 -0
- package/skills/korean-character-count/instruction.md +87 -0
- package/skills/korean-character-count/scripts/korean_character_count.js +268 -0
- package/skills/korean-character-count/skill.json +8 -0
- package/skills/korean-cinema-search/instruction.md +177 -0
- package/skills/korean-cinema-search/skill.json +8 -0
- package/skills/korean-heritage-search/instruction.md +106 -0
- package/skills/korean-heritage-search/scripts/korean_heritage_search.py +321 -0
- package/skills/korean-heritage-search/skill.json +8 -0
- package/skills/korean-holiday-calendar/instruction.md +97 -0
- package/skills/korean-holiday-calendar/skill.json +9 -0
- package/skills/korean-humanizer/instruction.md +389 -0
- package/skills/korean-humanizer/references/ai-tell-taxonomy.md +147 -0
- package/skills/korean-humanizer/skill.json +8 -0
- package/skills/korean-jangbu-for/instruction.md +133 -0
- package/skills/korean-jangbu-for/scripts/install.sh +237 -0
- package/skills/korean-jangbu-for/scripts/upstream.pin +1 -0
- package/skills/korean-jangbu-for/skill.json +8 -0
- package/skills/korean-law-search/instruction.md +126 -0
- package/skills/korean-law-search/skill.json +10 -0
- package/skills/korean-marathon-schedule/instruction.md +111 -0
- package/skills/korean-marathon-schedule/skill.json +9 -0
- package/skills/korean-middle-korean/instruction.md +79 -0
- package/skills/korean-middle-korean/scripts/korean_middle_korean.js +214 -0
- package/skills/korean-middle-korean/skill.json +8 -0
- package/skills/korean-patent-search/instruction.md +79 -0
- package/skills/korean-patent-search/scripts/patent_search.py +409 -0
- package/skills/korean-patent-search/skill.json +9 -0
- package/skills/korean-privacy-terms/instruction.md +128 -0
- package/skills/korean-privacy-terms/scripts/install.sh +108 -0
- package/skills/korean-privacy-terms/scripts/upstream.pin +1 -0
- package/skills/korean-privacy-terms/skill.json +8 -0
- package/skills/korean-scholarship-search/instruction.md +317 -0
- package/skills/korean-scholarship-search/references/report-format.md +40 -0
- package/skills/korean-scholarship-search/references/school-discovery.md +61 -0
- package/skills/korean-scholarship-search/references/search-clues.md +58 -0
- package/skills/korean-scholarship-search/references/source-patterns.md +67 -0
- package/skills/korean-scholarship-search/scripts/scholarship_filter.py +811 -0
- package/skills/korean-scholarship-search/scripts/test_scholarship_filter.py +224 -0
- package/skills/korean-scholarship-search/scripts/university_search_plan.py +148 -0
- package/skills/korean-scholarship-search/skill.json +8 -0
- package/skills/korean-slang-writing/instruction.md +181 -0
- package/skills/korean-slang-writing/scripts/_slang_http.py +91 -0
- package/skills/korean-slang-writing/scripts/slang_lookup.py +291 -0
- package/skills/korean-slang-writing/scripts/slang_search.py +284 -0
- package/skills/korean-slang-writing/skill.json +8 -0
- package/skills/korean-spell-check/instruction.md +105 -0
- package/skills/korean-spell-check/scripts/korean_spell_check.py +523 -0
- package/skills/korean-spell-check/skill.json +9 -0
- package/skills/korean-stock-search/instruction.md +194 -0
- package/skills/korean-stock-search/skill.json +10 -0
- package/skills/korean-transit-route/instruction.md +113 -0
- package/skills/korean-transit-route/skill.json +10 -0
- package/skills/kosis-stats/instruction.md +232 -0
- package/skills/kosis-stats/references/kosis-openapi-guide.md +171 -0
- package/skills/kosis-stats/scripts/run_kosis_stats.py +896 -0
- package/skills/kosis-stats/skill.json +9 -0
- package/skills/kr-whois-lookup/instruction.md +107 -0
- package/skills/kr-whois-lookup/skill.json +10 -0
- package/skills/kstartup-search/instruction.md +186 -0
- package/skills/kstartup-search/scripts/run_kstartup.py +424 -0
- package/skills/kstartup-search/skill.json +11 -0
- package/skills/ktx-booking/instruction.md +244 -0
- package/skills/ktx-booking/skill.json +10 -0
- package/skills/lck-analytics/instruction.md +192 -0
- package/skills/lck-analytics/scripts/_lib.js +103 -0
- package/skills/lck-analytics/scripts/analyze-live-game.js +52 -0
- package/skills/lck-analytics/scripts/build-match-report.js +44 -0
- package/skills/lck-analytics/scripts/sync-oracle.js +50 -0
- package/skills/lck-analytics/skill.json +9 -0
- package/skills/lh-notice-search/instruction.md +206 -0
- package/skills/lh-notice-search/skill.json +10 -0
- package/skills/library-book-search/instruction.md +139 -0
- package/skills/library-book-search/skill.json +9 -0
- package/skills/local-election-candidate-search/instruction.md +77 -0
- package/skills/local-election-candidate-search/skill.json +8 -0
- package/skills/localdata-business-status/instruction.md +64 -0
- package/skills/localdata-business-status/scripts/localdata_business_status.py +206 -0
- package/skills/localdata-business-status/skill.json +8 -0
- package/skills/lotto-results/instruction.md +80 -0
- package/skills/lotto-results/skill.json +8 -0
- package/skills/lovebug-report/instruction.md +185 -0
- package/skills/lovebug-report/skill.json +9 -0
- package/skills/market-kurly-search/instruction.md +125 -0
- package/skills/market-kurly-search/skill.json +8 -0
- package/skills/mfds-drug-safety/instruction.md +86 -0
- package/skills/mfds-drug-safety/scripts/mfds_drug_safety.py +184 -0
- package/skills/mfds-drug-safety/skill.json +10 -0
- package/skills/mfds-food-safety/instruction.md +126 -0
- package/skills/mfds-food-safety/scripts/mfds_food_safety.py +281 -0
- package/skills/mfds-food-safety/skill.json +10 -0
- package/skills/myrealtrip-search/instruction.md +239 -0
- package/skills/myrealtrip-search/scripts/myrealtrip_mcp.py +194 -0
- package/skills/myrealtrip-search/scripts/test_myrealtrip_mcp.py +99 -0
- package/skills/myrealtrip-search/skill.json +9 -0
- package/skills/naming-house/instruction.md +146 -0
- package/skills/naming-house/skill.json +8 -0
- package/skills/national-pension-workplace/instruction.md +64 -0
- package/skills/national-pension-workplace/scripts/national_pension_workplace.py +113 -0
- package/skills/national-pension-workplace/skill.json +10 -0
- package/skills/naver-ad-performance/instruction.md +108 -0
- package/skills/naver-ad-performance/scripts/naver_ad_performance.py +240 -0
- package/skills/naver-ad-performance/skill.json +9 -0
- package/skills/naver-blog-research/instruction.md +128 -0
- package/skills/naver-blog-research/scripts/_naver_http.py +58 -0
- package/skills/naver-blog-research/scripts/naver_download_images.py +233 -0
- package/skills/naver-blog-research/scripts/naver_read.py +256 -0
- package/skills/naver-blog-research/scripts/naver_search.py +192 -0
- package/skills/naver-blog-research/skill.json +8 -0
- package/skills/naver-news-search/instruction.md +103 -0
- package/skills/naver-news-search/skill.json +10 -0
- package/skills/naver-shopping-search/instruction.md +94 -0
- package/skills/naver-shopping-search/skill.json +11 -0
- package/skills/nhis-care-checkup-search/instruction.md +116 -0
- package/skills/nhis-care-checkup-search/skill.json +10 -0
- package/skills/nts-business-registration/instruction.md +115 -0
- package/skills/nts-business-registration/scripts/nts_business_registration.py +215 -0
- package/skills/nts-business-registration/skill.json +10 -0
- package/skills/nts-tax-delinquency/instruction.md +54 -0
- package/skills/nts-tax-delinquency/scripts/nts_tax_delinquency.py +150 -0
- package/skills/nts-tax-delinquency/skill.json +8 -0
- package/skills/ohou-today-deal/instruction.md +182 -0
- package/skills/ohou-today-deal/scripts/ohou_today_deal.py +369 -0
- package/skills/ohou-today-deal/skill.json +9 -0
- package/skills/olive-young-search/instruction.md +154 -0
- package/skills/olive-young-search/skill.json +8 -0
- package/skills/parking-lot-search/instruction.md +96 -0
- package/skills/parking-lot-search/skill.json +9 -0
- package/skills/popbill/instruction.md +146 -0
- package/skills/popbill/scripts/popbill_cli.py +284 -0
- package/skills/popbill/scripts/popbill_registry.py +54 -0
- package/skills/popbill/scripts/popbill_safety.py +37 -0
- package/skills/popbill/scripts/popbill_templates.py +71 -0
- package/skills/popbill/skill.json +9 -0
- package/skills/public-restroom-nearby/instruction.md +89 -0
- package/skills/public-restroom-nearby/skill.json +9 -0
- package/skills/real-estate-search/instruction.md +172 -0
- package/skills/real-estate-search/skill.json +10 -0
- package/skills/rhwp-advanced/instruction.md +145 -0
- package/skills/rhwp-advanced/skill.json +8 -0
- package/skills/rhwp-edit/instruction.md +153 -0
- package/skills/rhwp-edit/skill.json +8 -0
- package/skills/s2b-notice-search/instruction.md +66 -0
- package/skills/s2b-notice-search/skill.json +9 -0
- package/skills/saju-fortune/instruction.md +177 -0
- package/skills/saju-fortune/skill.json +8 -0
- package/skills/saramin-talent-search/instruction.md +119 -0
- package/skills/saramin-talent-search/skill.json +9 -0
- package/skills/seoul-bike/instruction.md +83 -0
- package/skills/seoul-bike/scripts/seoul_bike.py +247 -0
- package/skills/seoul-bike/skill.json +10 -0
- package/skills/seoul-density/instruction.md +109 -0
- package/skills/seoul-density/scripts/seoul_density.py +271 -0
- package/skills/seoul-density/skill.json +10 -0
- package/skills/seoul-subway-arrival/instruction.md +85 -0
- package/skills/seoul-subway-arrival/skill.json +9 -0
- package/skills/sh-notice-search/instruction.md +150 -0
- package/skills/sh-notice-search/skill.json +9 -0
- package/skills/srt-booking/instruction.md +181 -0
- package/skills/srt-booking/scripts/srt_booking.py +272 -0
- package/skills/srt-booking/scripts/srt_seats.py +156 -0
- package/skills/srt-booking/skill.json +20 -0
- package/skills/subway-lost-property/instruction.md +93 -0
- package/skills/subway-lost-property/scripts/subway_lost_property.py +244 -0
- package/skills/subway-lost-property/skill.json +8 -0
- package/skills/ticket-availability/instruction.md +175 -0
- package/skills/ticket-availability/scripts/ticket_availability.py +430 -0
- package/skills/ticket-availability/skill.json +9 -0
- package/skills/toss-securities/instruction.md +116 -0
- package/skills/toss-securities/skill.json +9 -0
- package/skills/used-car-price-search/instruction.md +109 -0
- package/skills/used-car-price-search/skill.json +8 -0
- package/skills/yebigun-training/instruction.md +177 -0
- package/skills/yebigun-training/skill.json +9 -0
- package/skills/zipcode-search/instruction.md +159 -0
- package/skills/zipcode-search/scripts/zipcode_search.py +150 -0
- package/skills/zipcode-search/skill.json +8 -0
- package/src/assemble.js +134 -0
- package/src/detect.js +18 -0
- package/templates/action-account.md +4 -0
- package/templates/action-booking.md +5 -0
- package/templates/action-commerce.md +5 -0
- package/templates/action-communication.md +5 -0
- package/templates/action-submission.md +5 -0
- package/templates/browser.md +4 -0
- package/templates/core.md +5 -0
- package/templates/hard-boundary.md +3 -0
- package/templates/local.md +2 -0
- package/templates/lookup.md +2 -0
- package/templates/proxy.md +2 -0
- package/templates/vault.md +4 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Korean Middle Korean Style Converter
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
사용자가 한국어 문장을 "한국 중세 국어처럼", "훈민정음/중세국어 느낌으로", "옛 국어 밈체로" 바꾸어 달라고 할 때, 입력문을 **결정론적 Middle Korean-style 문체**로 바꾼다.
|
|
6
|
+
|
|
7
|
+
이 스킬은 학술적 복원이 아니라 창작용 스타일 변환이다.
|
|
8
|
+
|
|
9
|
+
- 현대 한국어 조사 일부를 `ᄋᆞᆫ`, `ᄋᆞᆯ`, `애` 같은 중세국어풍 표기로 바꾼다.
|
|
10
|
+
- `했다`, `하는`, `말하는` 같은 현대 어미를 `ᄒᆞ엿다〮`, `ᄒᆞᄂᆞᆫ`, `ᄆᆞᆯᄒᆞᄂᆞᆫ`처럼 바꾼다.
|
|
11
|
+
- 날짜 단위는 `年`, `月`, `日`로 바꾼다.
|
|
12
|
+
- 일부 한자어/밈 예시는 `熱愛說`, `俳優`, `學校`처럼 Hanja 힌트를 섞는다.
|
|
13
|
+
- URL, 이메일, Markdown 링크, inline/fenced code span은 구조 토큰으로 보고 변환하지 않는다.
|
|
14
|
+
- 인명·숫자·고유명사는 완전 보존이 아니라, 규칙이 맞지 않을 때 원문을 남기는 best-effort 방식으로 처리한다.
|
|
15
|
+
- 한자어 힌트는 넓은 전역 치환으로 적용되므로 합성어·고유명사처럼 보이는 문자열 안에서도 바뀔 수 있다.
|
|
16
|
+
|
|
17
|
+
## When to use
|
|
18
|
+
|
|
19
|
+
- "이 문장을 한국 중세 국어로 바꿔줘"
|
|
20
|
+
- "훈민정음 느낌 나는 밈 문장으로 변환해줘"
|
|
21
|
+
- "중세국어풍으로 농담을 써줘"
|
|
22
|
+
- "아래 글을 옛 국어 말투로 바꿔줘"
|
|
23
|
+
|
|
24
|
+
## When NOT to use
|
|
25
|
+
|
|
26
|
+
- 학술 논문, 고문헌 번역, 훈민정음 해례본식 엄밀 표기가 필요한 작업
|
|
27
|
+
- 법률·의학·계약 문서처럼 의미 오해가 위험한 문서
|
|
28
|
+
- 혐오·괴롭힘·명예훼손 목적의 조롱성 변환
|
|
29
|
+
|
|
30
|
+
## Prerequisites
|
|
31
|
+
|
|
32
|
+
- `node` 18+
|
|
33
|
+
- 설치된 `korean-middle-korean` skill 디렉터리 안에 `scripts/korean_middle_korean.js` helper 포함
|
|
34
|
+
- 별도 API 키 없음
|
|
35
|
+
|
|
36
|
+
## Workflow
|
|
37
|
+
|
|
38
|
+
1. 변환할 한국어 텍스트를 받는다.
|
|
39
|
+
2. 설치된 `korean-middle-korean` skill 디렉터리를 기준으로 `node scripts/korean_middle_korean.js` 를 실행한다.
|
|
40
|
+
- URL, 이메일, Markdown 링크, inline/fenced code span은 보호되어 원문 그대로 복원된다.
|
|
41
|
+
3. 기본 JSON 출력에서 `output`을 사용자에게 반환한다.
|
|
42
|
+
4. 사용자가 근거를 원하면 `replacements` 배열의 규칙 적용 내역을 요약한다.
|
|
43
|
+
5. 학술적 정확성이 필요하다고 보이면 이 스킬은 창작용 스타일 변환임을 먼저 밝힌다.
|
|
44
|
+
|
|
45
|
+
## CLI examples
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
node scripts/korean_middle_korean.js --text "민수는 3월 5일 학교에서 공부했다."
|
|
49
|
+
node scripts/korean_middle_korean.js --text "열애설을 인정했다." --format text
|
|
50
|
+
cat input.txt | node scripts/korean_middle_korean.js --stdin --format json
|
|
51
|
+
node scripts/korean_middle_korean.js --file ./input.txt --format text
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Response policy
|
|
55
|
+
|
|
56
|
+
- `output`을 중심으로 답한다.
|
|
57
|
+
- "정확한 중세국어 번역"이라고 단정하지 말고, "중세국어풍/창작용 변환"이라고 설명한다.
|
|
58
|
+
- 사용자가 원문 의미 보존을 중요하게 말하면, 변환문 뒤에 "의미 보존 확인"을 짧게 덧붙인다.
|
|
59
|
+
|
|
60
|
+
## Output schema
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"profile": "middle-korean-style-v1",
|
|
65
|
+
"input": "열애설을 인정했다.",
|
|
66
|
+
"output": "熱愛說ᄋᆞᆯ 인졍ᄒᆞ엿다〮.",
|
|
67
|
+
"replacements": [
|
|
68
|
+
{ "kind": "lexicon", "from": "열애설", "to": "熱愛說", "count": 1 }
|
|
69
|
+
],
|
|
70
|
+
"contract": "Deterministic Korean Middle Korean-style rewrite..."
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Done when
|
|
75
|
+
|
|
76
|
+
- `node scripts/korean_middle_korean.js --help` 가 동작한다.
|
|
77
|
+
- `--text`, `--file`, `--stdin` 입력이 모두 동작한다.
|
|
78
|
+
- JSON과 text 출력이 모두 동작한다.
|
|
79
|
+
- 이슈 #270의 예시처럼 날짜/Hanja/중세국어풍 조사·어미·성조점이 나타난다.
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
const fs = require("node:fs");
|
|
5
|
+
|
|
6
|
+
const PROFILE = "middle-korean-style-v1";
|
|
7
|
+
const CONTRACT =
|
|
8
|
+
"Deterministic Korean Middle Korean-style rewrite: public-domain orthographic flavor rules, fixed broad lexicon replacements, archaic particles/endings, Sino-Korean Hanja hints, protected URL/email/Markdown-code spans, and best-effort preservation for names/numbers when no rule matches.";
|
|
9
|
+
|
|
10
|
+
const LEXICON = [
|
|
11
|
+
["야 이", "이"],
|
|
12
|
+
["맛국노야", "맛國노〮야"],
|
|
13
|
+
["설마", "쇼ᄆᆞ"],
|
|
14
|
+
["새벽", "샛ᄇᆡ긔〮"],
|
|
15
|
+
["배우", "俳優"],
|
|
16
|
+
["구자욱이랑", "구자욱과"],
|
|
17
|
+
["거리", "街里"],
|
|
18
|
+
["손잡고", "손ᄋᆞᆯ 자ᇙ고"],
|
|
19
|
+
["걸어다니는", "거러다니ᄂᆞᆫ"],
|
|
20
|
+
["모습", "모ᄉᆡᆸ〮"],
|
|
21
|
+
["찍혀", "찍히야"],
|
|
22
|
+
["열애설", "熱愛說"],
|
|
23
|
+
["터지고", "터ᄂᆞᆺ고"],
|
|
24
|
+
["인정했지만", "인졍ᄒᆞ엿거ᄂᆞᆫ"],
|
|
25
|
+
["인정했다", "인졍ᄒᆞ엿다〮"],
|
|
26
|
+
["인정", "인졍"],
|
|
27
|
+
["맛보기한", "맛보기〮ᄒᆞᆫ"],
|
|
28
|
+
["느낌이랄까", "닏믁이ᄅᆞᆯ가〯"],
|
|
29
|
+
["기분이구나", "기븐〮이로다"],
|
|
30
|
+
["말해", "ᄆᆞᆯᄒᆞ야"],
|
|
31
|
+
["사건", "일"],
|
|
32
|
+
["학교", "學校"],
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
function record(replacements, kind, from, to, count) {
|
|
36
|
+
if (count > 0) {
|
|
37
|
+
replacements.push({ kind, from, to, count });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function replaceLiteral(text, from, to, replacements) {
|
|
42
|
+
const count = text.split(from).length - 1;
|
|
43
|
+
if (count === 0) return text;
|
|
44
|
+
record(replacements, "lexicon", from, to, count);
|
|
45
|
+
return text.split(from).join(to);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function replaceRegex(text, pattern, to, replacements, kind, label) {
|
|
49
|
+
const matches = text.match(pattern);
|
|
50
|
+
const count = matches ? matches.length : 0;
|
|
51
|
+
const next = text.replace(pattern, to);
|
|
52
|
+
record(replacements, kind, label ?? String(pattern), typeof to === "string" ? to : "<rule>", count);
|
|
53
|
+
return next;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function protectSpans(input) {
|
|
57
|
+
const protectedSpans = [];
|
|
58
|
+
let text = input;
|
|
59
|
+
|
|
60
|
+
function protect(pattern) {
|
|
61
|
+
text = text.replace(pattern, (match) => {
|
|
62
|
+
const token = `\uE000${protectedSpans.length}\uE001`;
|
|
63
|
+
protectedSpans.push(match);
|
|
64
|
+
return token;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
protect(/```[\s\S]*?```/g);
|
|
69
|
+
protect(/`[^`\n]*`/g);
|
|
70
|
+
protect(/\[[^\]\n]*\]\([^\s)]+(?:\s+"[^"]*")?\)/g);
|
|
71
|
+
protect(/\bhttps?:\/\/[A-Za-z0-9._~:/?#[\]@!$&'()*+,;=%-]+/g);
|
|
72
|
+
protect(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g);
|
|
73
|
+
|
|
74
|
+
return { text, protectedSpans };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function restoreSpans(text, protectedSpans) {
|
|
78
|
+
let output = text;
|
|
79
|
+
protectedSpans.forEach((span, index) => {
|
|
80
|
+
output = output.replaceAll(`\uE000${index}\uE001`, span);
|
|
81
|
+
});
|
|
82
|
+
return output;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function convertToMiddleKoreanStyle(input) {
|
|
86
|
+
return createReport(input).output;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function createReport(input) {
|
|
90
|
+
if (typeof input !== "string") {
|
|
91
|
+
throw new TypeError("input must be a string");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const replacements = [];
|
|
95
|
+
const protectedInput = protectSpans(input);
|
|
96
|
+
let output = protectedInput.text;
|
|
97
|
+
|
|
98
|
+
output = replaceRegex(output, /(\d+)년/g, "$1年", replacements, "date", "년→年");
|
|
99
|
+
output = replaceRegex(output, /(\d+)월/g, "$1月", replacements, "date", "월→月");
|
|
100
|
+
output = replaceRegex(output, /(\d+)일/g, "$1日", replacements, "date", "일→日");
|
|
101
|
+
|
|
102
|
+
for (const [from, to] of LEXICON) {
|
|
103
|
+
output = replaceLiteral(output, from, to, replacements);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
output = replaceRegex(output, /말하는/g, "ᄆᆞᆯᄒᆞᄂᆞᆫ", replacements, "ending", "말하는→ᄆᆞᆯᄒᆞᄂᆞᆫ");
|
|
107
|
+
output = replaceRegex(output, /공부했다〮?/g, "공부ᄒᆞ엿다〮", replacements, "ending", "공부했다→공부ᄒᆞ엿다〮");
|
|
108
|
+
output = replaceRegex(output, /했다〮?/g, "ᄒᆞ엿다〮", replacements, "ending", "했다→ᄒᆞ엿다〮");
|
|
109
|
+
output = replaceRegex(output, /하는(?=\s|[",.?!]|$)/g, "ᄒᆞᄂᆞᆫ", replacements, "ending", "하는→ᄒᆞᄂᆞᆫ");
|
|
110
|
+
output = replaceRegex(output, /된(?=\s|[",.?!]|$)/g, "ᄃᆞᆫ", replacements, "ending", "된→ᄃᆞᆫ");
|
|
111
|
+
output = replaceRegex(output, /것이냐(?=[.?!。]|$)/g, "것이냐〮", replacements, "ending", "것이냐→것이냐〮");
|
|
112
|
+
|
|
113
|
+
output = replaceRegex(output, /([가-힣ᄀ-ᇿA-Za-z0-9一-龥]+)(은|는)(?=\s|[",.?!]|$)/g, "$1ᄋᆞᆫ", replacements, "particle", "은/는→ᄋᆞᆫ");
|
|
114
|
+
output = replaceRegex(output, /([가-힣ᄀ-ᇿA-Za-z0-9一-龥]+)(을|를)(?=\s|[",.?!]|$)/g, "$1ᄋᆞᆯ", replacements, "particle", "을/를→ᄋᆞᆯ");
|
|
115
|
+
output = replaceRegex(output, /([가-힣ᄀ-ᇿA-Za-z0-9一-龥]+)에서(?=\s|[",.?!]|$)/g, "$1애", replacements, "particle", "에서→애");
|
|
116
|
+
output = replaceRegex(output, /([가-힣ᄀ-ᇿA-Za-z0-9一-龥]+)와(?=\s|[",.?!]|$)/g, "$1와", replacements, "particle", "와 보존");
|
|
117
|
+
|
|
118
|
+
output = output.replace(/\s+([,.;:?!])/g, "$1");
|
|
119
|
+
output = restoreSpans(output, protectedInput.protectedSpans);
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
profile: PROFILE,
|
|
123
|
+
input,
|
|
124
|
+
output,
|
|
125
|
+
replacements,
|
|
126
|
+
contract: CONTRACT,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function parseArgs(argv) {
|
|
131
|
+
const parsed = {
|
|
132
|
+
format: "json",
|
|
133
|
+
inputMode: null,
|
|
134
|
+
text: undefined,
|
|
135
|
+
};
|
|
136
|
+
let sourceCount = 0;
|
|
137
|
+
|
|
138
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
139
|
+
const arg = argv[index];
|
|
140
|
+
if (arg === "--text") {
|
|
141
|
+
sourceCount += 1;
|
|
142
|
+
parsed.inputMode = "text";
|
|
143
|
+
parsed.text = argv[++index];
|
|
144
|
+
if (parsed.text === undefined) throw new Error("--text requires a value");
|
|
145
|
+
} else if (arg === "--file") {
|
|
146
|
+
sourceCount += 1;
|
|
147
|
+
parsed.inputMode = "file";
|
|
148
|
+
parsed.file = argv[++index];
|
|
149
|
+
if (!parsed.file) throw new Error("--file requires a path");
|
|
150
|
+
} else if (arg === "--stdin") {
|
|
151
|
+
sourceCount += 1;
|
|
152
|
+
parsed.inputMode = "stdin";
|
|
153
|
+
} else if (arg === "--format") {
|
|
154
|
+
parsed.format = argv[++index];
|
|
155
|
+
if (!parsed.format) throw new Error("--format requires a value");
|
|
156
|
+
} else if (arg === "--help" || arg === "-h") {
|
|
157
|
+
parsed.help = true;
|
|
158
|
+
} else {
|
|
159
|
+
throw new Error(`unknown argument: ${arg}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
if (!parsed.help && sourceCount !== 1) {
|
|
164
|
+
throw new Error("provide exactly one input source: --text, --file, or --stdin");
|
|
165
|
+
}
|
|
166
|
+
if (!["json", "text"].includes(parsed.format)) {
|
|
167
|
+
throw new Error(`unknown format: ${parsed.format}`);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return parsed;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function readInput(options) {
|
|
174
|
+
if (options.inputMode === "text") return options.text;
|
|
175
|
+
if (options.inputMode === "file") return fs.readFileSync(options.file, "utf8");
|
|
176
|
+
if (options.inputMode === "stdin") return fs.readFileSync(0, "utf8");
|
|
177
|
+
throw new Error("missing input source");
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function helpText() {
|
|
181
|
+
return `Usage: node scripts/korean_middle_korean.js (--text TEXT | --file PATH | --stdin) [--format json|text]\n\nConverts Korean input into a deterministic Korean Middle Korean-style rewrite.\n`;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function main(argv = process.argv.slice(2)) {
|
|
185
|
+
const options = parseArgs(argv);
|
|
186
|
+
if (options.help) {
|
|
187
|
+
process.stdout.write(helpText());
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const report = createReport(readInput(options));
|
|
191
|
+
if (options.format === "text") {
|
|
192
|
+
process.stdout.write(`${report.output}\n`);
|
|
193
|
+
} else {
|
|
194
|
+
process.stdout.write(`${JSON.stringify(report, null, 2)}\n`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
if (require.main === module) {
|
|
199
|
+
try {
|
|
200
|
+
main();
|
|
201
|
+
} catch (error) {
|
|
202
|
+
console.error(error.message);
|
|
203
|
+
process.exitCode = 1;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
module.exports = {
|
|
208
|
+
CONTRACT,
|
|
209
|
+
PROFILE,
|
|
210
|
+
convertToMiddleKoreanStyle,
|
|
211
|
+
createReport,
|
|
212
|
+
parseArgs,
|
|
213
|
+
main,
|
|
214
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "korean-middle-korean",
|
|
3
|
+
"description": "Convert incoming Korean text into a deterministic Korean Middle Korean-style rewrite with archaic particles, endings, Hanja hints, and tone-mark flavor.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"local"
|
|
6
|
+
],
|
|
7
|
+
"frontmatter": "name: korean-middle-korean\ndescription: Convert incoming Korean text into a deterministic Korean Middle Korean-style rewrite with archaic particles, endings, Hanja hints, and tone-mark flavor.\nlicense: MIT\nmetadata:\n category: writing\n locale: ko-KR\n phase: v1"
|
|
8
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# 한국 특허 정보 검색
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
KIPRIS Plus(키프리스 플러스) 공식 Open API로 한국 특허/실용신안 공개·공고 데이터를 검색한다.
|
|
6
|
+
|
|
7
|
+
v1 범위:
|
|
8
|
+
|
|
9
|
+
- 키워드 검색 (`getWordSearch`)
|
|
10
|
+
- 출원번호 기준 서지 상세 조회 (`getBibliographyDetailInfoSearch`)
|
|
11
|
+
- 구조화된 JSON 출력
|
|
12
|
+
- 표준 `python3` helper 동봉
|
|
13
|
+
|
|
14
|
+
## When to use
|
|
15
|
+
|
|
16
|
+
- "배터리 관련 한국 특허 찾아줘"
|
|
17
|
+
- "출원번호 1020240001234 특허 요약 보여줘"
|
|
18
|
+
- "KIPRIS API로 특허 검색 결과를 JSON으로 받고 싶어"
|
|
19
|
+
- "출원인/IPC/초록까지 포함한 한국 특허 검색 결과가 필요해"
|
|
20
|
+
|
|
21
|
+
## Prerequisites
|
|
22
|
+
|
|
23
|
+
- 인터넷 연결
|
|
24
|
+
- `python3`
|
|
25
|
+
- KIPRIS Plus에서 발급받은 API 키
|
|
26
|
+
- helper 환경변수: `KIPRIS_PLUS_API_KEY`
|
|
27
|
+
- 실제 요청 쿼리 파라미터명: `ServiceKey`
|
|
28
|
+
- 설치된 skill payload 안에 `scripts/patent_search.py` helper 포함
|
|
29
|
+
|
|
30
|
+
## Inputs
|
|
31
|
+
|
|
32
|
+
- 키워드 검색
|
|
33
|
+
- 필수: `--query`
|
|
34
|
+
- 선택: `--year`
|
|
35
|
+
- 선택: `--page-no`
|
|
36
|
+
- 선택: `--num-rows`
|
|
37
|
+
- 선택: `--exclude-patent`
|
|
38
|
+
- 선택: `--exclude-utility`
|
|
39
|
+
- 상세 조회
|
|
40
|
+
- 필수: `--application-number`
|
|
41
|
+
|
|
42
|
+
## Workflow
|
|
43
|
+
|
|
44
|
+
1. `KIPRIS_PLUS_API_KEY` 또는 `--service-key` 로 ServiceKey를 확보한다. 공공데이터포털에서 복사한 percent-encoded 값도 helper가 한 번 정규화해서 그대로 받을 수 있다.
|
|
45
|
+
2. 키워드 검색이면 `getWordSearch` endpoint를 호출한다.
|
|
46
|
+
3. 출원번호 상세 조회면 `getBibliographyDetailInfoSearch` endpoint를 호출한다.
|
|
47
|
+
4. XML 응답의 header/body/items 구조를 파싱한다.
|
|
48
|
+
5. 출원번호, 발명의명칭, 출원인, 초록, 공개/공고/등록 메타데이터를 JSON으로 정리한다.
|
|
49
|
+
|
|
50
|
+
## CLI examples
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
export KIPRIS_PLUS_API_KEY=your-service-key
|
|
54
|
+
python3 scripts/patent_search.py --query "배터리"
|
|
55
|
+
python3 scripts/patent_search.py --query "배터리" --year 2024 --num-rows 5
|
|
56
|
+
python3 scripts/patent_search.py --application-number 1020240001234
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Response policy
|
|
60
|
+
|
|
61
|
+
- 공식 KIPRIS Plus Open API 응답만 사용한다.
|
|
62
|
+
- 키가 없으면 `KIPRIS_PLUS_API_KEY` 또는 `--service-key` 를 정확히 안내한다.
|
|
63
|
+
- 검색 결과는 최소한 출원번호, 발명의명칭, 출원일자, 출원인, 초록을 포함해 정리한다.
|
|
64
|
+
- 상세 조회는 `getBibliographyDetailInfoSearch` 기준으로 공개/공고/등록 메타데이터를 함께 정리한다.
|
|
65
|
+
- API 에러 코드는 숨기지 말고 그대로 surfaced 한다.
|
|
66
|
+
|
|
67
|
+
## Done when
|
|
68
|
+
|
|
69
|
+
- 유효한 ServiceKey로 `getWordSearch` 또는 `getBibliographyDetailInfoSearch` 호출이 가능하다.
|
|
70
|
+
- helper가 JSON을 출력한다.
|
|
71
|
+
- 에러 시 `KIPRIS_PLUS_API_KEY` / `ServiceKey` 관련 안내가 분명하다.
|
|
72
|
+
- 응답에 출원번호와 발명의명칭이 포함된다.
|
|
73
|
+
|
|
74
|
+
## Notes
|
|
75
|
+
|
|
76
|
+
- KIPRIS Plus 포털: `https://plus.kipris.or.kr/portal/data/service/List.do?subTab=SC001&entYn=N&menuNo=200100`
|
|
77
|
+
- 공공데이터포털 문서: `https://www.data.go.kr/data/15058788/openapi.do`
|
|
78
|
+
- v1 helper는 `getWordSearch`, `getBibliographyDetailInfoSearch` 두 operation에 집중한다.
|
|
79
|
+
- 공공데이터포털 안내 기준으로 개발계정은 자동승인, 운영계정은 별도 심의 대상이다.
|