@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,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "k-skill-setup",
|
|
3
|
+
"description": "After installing the full k-skill bundle, configure and verify the shared cross-platform setup, then optionally wire update checks and GitHub starring with explicit user consent.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"proxy",
|
|
6
|
+
"vault",
|
|
7
|
+
"browser",
|
|
8
|
+
"local"
|
|
9
|
+
],
|
|
10
|
+
"frontmatter": "name: k-skill-setup\ndescription: After installing the full k-skill bundle, configure and verify the shared cross-platform setup, then optionally wire update checks and GitHub starring with explicit user consent.\nlicense: MIT\nmetadata:\n category: setup\n locale: ko-KR\n phase: v1"
|
|
11
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Kakao Bar Nearby
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
유저가 알려준 현재 위치를 기준으로 **카카오맵 기준 근처 술집**을 찾아준다.
|
|
6
|
+
|
|
7
|
+
- 위치는 자동으로 추정하지 않는다.
|
|
8
|
+
- **반드시 먼저 현재 위치를 질문**한다.
|
|
9
|
+
- `서울역`, `강남`, `사당`, `신논현`, `논현` 같은 역명/동네/랜드마크 질의를 그대로 받을 수 있다.
|
|
10
|
+
- 결과에는 현재 영업 상태, 대표 메뉴, 좌석 옵션(단체석/바테이블 등), 전화번호를 포함한다.
|
|
11
|
+
|
|
12
|
+
## When to use
|
|
13
|
+
|
|
14
|
+
- "서울역 근처 술집 찾아줘"
|
|
15
|
+
- "강남에서 지금 영업중인 와인바 뭐 있어?"
|
|
16
|
+
- "논현 근처 4명 갈만한 술집 알려줘"
|
|
17
|
+
- "사당에서 전화번호 있는 이자카야 몇 군데만 보여줘"
|
|
18
|
+
|
|
19
|
+
## Mandatory first question
|
|
20
|
+
|
|
21
|
+
위치 정보 없이 바로 검색하지 말고 반드시 먼저 물어본다.
|
|
22
|
+
|
|
23
|
+
- 권장 질문: `현재 위치를 알려주세요. 서울역/강남/사당 같은 역명이나 동네명으로 보내주시면 카카오맵 기준 근처 술집을 찾아볼게요.`
|
|
24
|
+
- 위치가 애매하면: `가까운 역명이나 동 이름으로 한 번만 더 알려주세요.`
|
|
25
|
+
|
|
26
|
+
## Official Kakao Map surfaces
|
|
27
|
+
|
|
28
|
+
- 모바일 검색: `https://m.map.kakao.com/actions/searchView?q=<query>`
|
|
29
|
+
- 장소 패널 JSON: `https://place-api.map.kakao.com/places/panel3/<confirmId>`
|
|
30
|
+
- 장소 상세 페이지: `https://place.map.kakao.com/<confirmId>`
|
|
31
|
+
|
|
32
|
+
## Workflow
|
|
33
|
+
|
|
34
|
+
1. 유저에게 반드시 현재 위치를 묻는다.
|
|
35
|
+
2. 받은 위치 문자열을 카카오맵 검색으로 anchor 후보(역/랜드마크)로 해석한다.
|
|
36
|
+
3. 같은 위치 문자열에 `술집` 키워드를 붙여 nearby 술집 검색 결과를 가져온다.
|
|
37
|
+
4. 상위 후보의 panel3 JSON 을 조회해 현재 영업 상태, 메뉴, 좌석 옵션, 전화번호를 정규화한다.
|
|
38
|
+
5. **영업 중인 술집을 먼저** 보여주고, 필요하면 곧 열 곳도 함께 보여준다.
|
|
39
|
+
|
|
40
|
+
## Responding
|
|
41
|
+
|
|
42
|
+
보통 3~5개만 짧게 정리한다.
|
|
43
|
+
|
|
44
|
+
- 술집명
|
|
45
|
+
- 카테고리
|
|
46
|
+
- 영업 상태 (`영업 중`, `영업 전`, `휴무일` 등)
|
|
47
|
+
- 대표 메뉴 2~3개
|
|
48
|
+
- 좌석/인원 수용 힌트 (`단체석`, `바테이블` 등)
|
|
49
|
+
- 전화번호
|
|
50
|
+
- 거리(가능하면)
|
|
51
|
+
|
|
52
|
+
## Node.js example
|
|
53
|
+
|
|
54
|
+
```js
|
|
55
|
+
const { searchNearbyBarsByLocationQuery } = require("kakao-bar-nearby");
|
|
56
|
+
|
|
57
|
+
async function main() {
|
|
58
|
+
const result = await searchNearbyBarsByLocationQuery("서울역", {
|
|
59
|
+
limit: 5
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
console.log(result.anchor);
|
|
63
|
+
console.log(result.items);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
main().catch((error) => {
|
|
67
|
+
console.error(error);
|
|
68
|
+
process.exitCode = 1;
|
|
69
|
+
});
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
## Done when
|
|
73
|
+
|
|
74
|
+
- 유저의 현재 위치를 먼저 확인했다.
|
|
75
|
+
- 카카오맵 기준 술집 결과를 최소 1개 이상 찾았거나, 찾지 못한 이유와 다음 질문을 제시했다.
|
|
76
|
+
- 영업 상태/메뉴/좌석 옵션/전화번호가 포함된 요약을 보여줬다.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kakao-bar-nearby",
|
|
3
|
+
"description": "Use when the user asks for nearby bars or 근처 술집. Always ask the user's current location first, then use Kakao Map search + place detail panels to find open-now bars with menu, seating, and phone hints. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"action:booking"
|
|
6
|
+
],
|
|
7
|
+
"frontmatter": "name: kakao-bar-nearby\ndescription: Use when the user asks for nearby bars or 근처 술집. Always ask the user's current location first, then use Kakao Map search + place detail panels to find open-now bars with menu, seating, and phone hints. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.\nlicense: MIT\nmetadata:\n category: food\n locale: ko-KR\n phase: v1"
|
|
8
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Kakao Map
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
Kakao Developers의 두 API를 `k-skill-proxy` 경유로 묶어 다음 두 종류 질문에 답한다:
|
|
6
|
+
|
|
7
|
+
1. **장소 검색** — 키워드/카테고리/좌표 기준으로 가게·시설·랜드마크를 찾고, 좌표↔주소·행정구역을 변환한다 (Kakao Local REST API).
|
|
8
|
+
2. **자동차 길찾기** — 출발지·목적지 좌표를 받아 거리·소요시간·통행료·예상 택시 요금을 조회한다 (Kakao Mobility Directions API).
|
|
9
|
+
|
|
10
|
+
- 운영자 `KAKAO_REST_API_KEY` 를 proxy 서버에만 보관한다. 사용자는 키 발급 필요 없음.
|
|
11
|
+
- 두 API 모두 같은 Kakao REST API key (KakaoAK 헤더) 로 인증한다.
|
|
12
|
+
- 본 스킬은 **조회 전용**이다. 예약·결제·운전 자동화는 하지 않는다.
|
|
13
|
+
|
|
14
|
+
## When to use
|
|
15
|
+
|
|
16
|
+
- "강남역 근처 스타벅스 찾아줘" → keyword 검색 (x,y 중심)
|
|
17
|
+
- "역삼동 카페 카테고리로 보여줘" → category 검색 (FD6/CE7 등)
|
|
18
|
+
- "이 좌표가 어느 동/도로명 주소야?" → coord2address / coord2region
|
|
19
|
+
- "강남역에서 시청까지 자동차로 얼마나 걸려?" → Kakao Mobility directions
|
|
20
|
+
- "통행료 회피 경로로 알려줘" → avoid=toll (필요 시 priority=DISTANCE 병행)
|
|
21
|
+
|
|
22
|
+
## When NOT to use
|
|
23
|
+
|
|
24
|
+
- 대중교통(지하철·버스) 경로 → Kakao Mobility는 **자동차 전용**. 대중교통은 `korean-transit-route`(ODsay) 사용
|
|
25
|
+
- 도보·자전거 경로 (Kakao Mobility에 정식 API 없음)
|
|
26
|
+
- 실시간 교통 상황을 1분 단위로 추적 (proxy cache 가 있음)
|
|
27
|
+
- 카카오맵 외부 임베드/렌더링 (본 스킬은 데이터 조회만 함)
|
|
28
|
+
- 대량 인덱싱/스크래핑 (Kakao 약관 위반 + 일일 quota 초과 위험)
|
|
29
|
+
|
|
30
|
+
## Prerequisites
|
|
31
|
+
|
|
32
|
+
- Python 3 표준 라이브러리만 사용 가능. JS/curl 호출도 동일하게 지원.
|
|
33
|
+
- optional: `KSKILL_PROXY_BASE_URL` (self-host·별도 프록시 사용 시. 비우면 hosted `https://k-skill-proxy.nomadamas.org` 기본).
|
|
34
|
+
|
|
35
|
+
## Required environment variables
|
|
36
|
+
|
|
37
|
+
사용자 머신에는 **필요 없다.** 운영자 proxy 서버에 다음을 둔다:
|
|
38
|
+
|
|
39
|
+
- `KAKAO_REST_API_KEY` — Kakao Developers REST API 키 (Local + Mobility 공용)
|
|
40
|
+
|
|
41
|
+
키가 없으면 모든 `/v1/kakao-map/*` 및 `/v1/kakao-mobility/*` 라우트가 `503 upstream_not_configured` 를 돌려준다.
|
|
42
|
+
|
|
43
|
+
## Proxy routes
|
|
44
|
+
|
|
45
|
+
| endpoint | 용도 | 주요 입력 |
|
|
46
|
+
|---|---|---|
|
|
47
|
+
| `GET /v1/kakao-map/search/keyword` | 키워드 장소 검색 | `q`, optional `x`,`y`(중심좌표), `radius`(0~20000m), `category_group_code`, `sort`(accuracy\|distance), `page`(1~45), `size`(1~15) |
|
|
48
|
+
| `GET /v1/kakao-map/search/category` | 카테고리 장소 검색 (좌표 중심 필수) | `category_group_code`(예: FD6 음식점, CE7 카페), `x`, `y`, `radius`(기본 500), `sort`, `page`, `size` |
|
|
49
|
+
| `GET /v1/kakao-map/coord2address` | 좌표 → 도로명/지번 주소 | `x`, `y`, optional `input_coord`(WGS84 기본) |
|
|
50
|
+
| `GET /v1/kakao-map/coord2region` | 좌표 → 행정구역(시/도/시군구/동) | `x`, `y`, optional `input_coord` |
|
|
51
|
+
| `GET /v1/kakao-mobility/directions` | 자동차 길찾기 | `origin=x,y`, `destination=x,y`, optional `waypoints`(최대 5, `\|` 구분), `priority`(RECOMMEND\|TIME\|DISTANCE), `car_fuel`(GASOLINE\|DIESEL\|LPG), `car_hipass`(true\|false), `alternatives`(true\|false), `avoid`(ferries\|toll\|motorway\|schoolzone\|uturn; `\|` 구분) |
|
|
52
|
+
|
|
53
|
+
**Kakao 카테고리 그룹 코드** (자주 쓰는 것):
|
|
54
|
+
|
|
55
|
+
| 코드 | 의미 |
|
|
56
|
+
|---|---|
|
|
57
|
+
| MT1 | 대형마트 |
|
|
58
|
+
| CS2 | 편의점 |
|
|
59
|
+
| PK6 | 주차장 |
|
|
60
|
+
| OL7 | 주유소/충전소 |
|
|
61
|
+
| SW8 | 지하철역 |
|
|
62
|
+
| BK9 | 은행 |
|
|
63
|
+
| CT1 | 문화시설 |
|
|
64
|
+
| AT4 | 관광명소 |
|
|
65
|
+
| AD5 | 숙박 |
|
|
66
|
+
| FD6 | 음식점 |
|
|
67
|
+
| CE7 | 카페 |
|
|
68
|
+
| HP8 | 병원 |
|
|
69
|
+
| PM9 | 약국 |
|
|
70
|
+
|
|
71
|
+
## Workflow
|
|
72
|
+
|
|
73
|
+
### 1. 키워드 검색
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
BASE="${KSKILL_PROXY_BASE_URL:-https://k-skill-proxy.nomadamas.org}"
|
|
77
|
+
curl -fsS --get "${BASE}/v1/kakao-map/search/keyword" \
|
|
78
|
+
--data-urlencode 'q=스타벅스' \
|
|
79
|
+
--data-urlencode 'x=127.0276' \
|
|
80
|
+
--data-urlencode 'y=37.4979' \
|
|
81
|
+
--data-urlencode 'radius=500' \
|
|
82
|
+
--data-urlencode 'sort=distance'
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
응답의 `documents[]` 에서 `place_name`, `road_address_name`, `phone`, `place_url`, `distance` 를 추출해 사용자에게 보여준다.
|
|
86
|
+
|
|
87
|
+
### 2. 카테고리 검색
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
curl -fsS --get "${BASE}/v1/kakao-map/search/category" \
|
|
91
|
+
--data-urlencode 'category_group_code=FD6' \
|
|
92
|
+
--data-urlencode 'x=127.0276' \
|
|
93
|
+
--data-urlencode 'y=37.4979' \
|
|
94
|
+
--data-urlencode 'radius=300'
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### 3. 좌표 → 주소
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
curl -fsS --get "${BASE}/v1/kakao-map/coord2address" \
|
|
101
|
+
--data-urlencode 'x=127.0276' \
|
|
102
|
+
--data-urlencode 'y=37.4979'
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
`documents[0].road_address.address_name`, `documents[0].address.address_name` 사용.
|
|
106
|
+
|
|
107
|
+
### 4. 좌표 → 행정구역
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
curl -fsS --get "${BASE}/v1/kakao-map/coord2region" \
|
|
111
|
+
--data-urlencode 'x=127.0276' \
|
|
112
|
+
--data-urlencode 'y=37.4979'
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
응답에 `region_type`(B=법정동, H=행정동) 별 결과가 들어있다.
|
|
116
|
+
|
|
117
|
+
### 5. 자동차 길찾기
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
curl -fsS --get "${BASE}/v1/kakao-mobility/directions" \
|
|
121
|
+
--data-urlencode 'origin=126.9706,37.5559' \
|
|
122
|
+
--data-urlencode 'destination=127.0276,37.4979' \
|
|
123
|
+
--data-urlencode 'priority=RECOMMEND' \
|
|
124
|
+
--data-urlencode 'avoid=toll'
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
응답에서 `routes[0].summary` 를 읽는다:
|
|
128
|
+
|
|
129
|
+
- `distance` (meter) → km 환산
|
|
130
|
+
- `duration` (second) → 분 환산
|
|
131
|
+
- `fare.taxi`, `fare.toll` → 원
|
|
132
|
+
- `priority` (요청한 값 echo)
|
|
133
|
+
- `avoid` 요청 시 `toll` 등 회피 옵션 적용
|
|
134
|
+
|
|
135
|
+
### 6. 출력 포맷
|
|
136
|
+
|
|
137
|
+
장소 검색:
|
|
138
|
+
|
|
139
|
+
```text
|
|
140
|
+
강남역 근처 스타벅스 5곳 (반경 500m, 가까운 순)
|
|
141
|
+
1) 스타벅스 강남R점 — 강남구 테헤란로 ... (120m, 02-...)
|
|
142
|
+
2) ...
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
자동차 길찾기:
|
|
146
|
+
|
|
147
|
+
```text
|
|
148
|
+
자동차 경로: (126.9706,37.5559) → (127.0276,37.4979)
|
|
149
|
+
- 거리: 12.3km / 예상 소요시간: 25분
|
|
150
|
+
- 통행료: 1,200원 / 예상 택시요금: 18,500원
|
|
151
|
+
- 옵션: RECOMMEND, avoid=toll
|
|
152
|
+
- 조회 시각: 2026-05-23T14:00:00.000Z
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Failure modes
|
|
156
|
+
|
|
157
|
+
- `KAKAO_REST_API_KEY` 미설정 → `503 upstream_not_configured`
|
|
158
|
+
- Kakao 인증 실패(401/403) → proxy가 `503` 으로 변환 (key revoke / 쿼터 초과 신호)
|
|
159
|
+
- 좌표/파라미터 형식 오류 → `400 bad_request`
|
|
160
|
+
- 출발지=도착지가 너무 가까움 (`result_code=104` 등) → `502 upstream_semantic_error` + `result_msg`
|
|
161
|
+
- Kakao 일일 쿼터 초과 → `502` 또는 `503` (proxy cache 가 있는 만큼 호출 빈도를 줄임)
|
|
162
|
+
- 네트워크 실패 → `502 upstream_error`
|
|
163
|
+
|
|
164
|
+
## Done when
|
|
165
|
+
|
|
166
|
+
- 사용자 질문에 맞는 endpoint 1~2개를 선택해 호출했고, 응답을 사람-읽기 좋게 정리했다.
|
|
167
|
+
- 좌표나 주소는 출처 endpoint를 함께 명시한다 (Kakao Local vs Kakao Mobility).
|
|
168
|
+
- secret/token/.env 원문은 노출되지 않았다.
|
|
169
|
+
- 자동차 외 이동 수단을 요청받으면 본 스킬의 범위 외임을 명시하고 `korean-transit-route` 등 대체 안내.
|
|
170
|
+
|
|
171
|
+
## Notes
|
|
172
|
+
|
|
173
|
+
- Kakao Mobility는 **자동차 전용** API다. 대중교통 길찾기는 별도 ODsay 기반 `korean-transit-route` 스킬을 쓴다.
|
|
174
|
+
- 무료 일일 쿼터(2026년 기준 Local 300,000건 / Mobility 1,000건) 안에서 proxy cache(기본 TTL 5분) + rate-limit(기본 60req/분) 으로 보호한다.
|
|
175
|
+
- proxy 운영/환경변수는 [k-skill 프록시 서버 가이드](../docs/features/k-skill-proxy.md) 참고.
|
|
176
|
+
- `/v1/kakao-local/geocode` (기존)도 같은 키를 쓰며 여전히 사용 가능하다 (address → keyword 자동 fallback). 본 스킬은 그 위에 keyword/category/coord 계열을 명시적으로 노출한다.
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kakao-map",
|
|
3
|
+
"description": "Kakao Local (장소 검색·주소-좌표 변환) + Kakao Mobility (자동차 길찾기) 를 k-skill-proxy 경유로 조회한다. 사용자 키 불필요. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"proxy",
|
|
6
|
+
"vault",
|
|
7
|
+
"action:booking"
|
|
8
|
+
],
|
|
9
|
+
"frontmatter": "name: kakao-map\ndescription: Kakao Local (장소 검색·주소-좌표 변환) + Kakao Mobility (자동차 길찾기) 를 k-skill-proxy 경유로 조회한다. 사용자 키 불필요. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.\nlicense: MIT\nmetadata:\n category: transit\n locale: ko-KR\n phase: v1"
|
|
10
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# KakaoTalk katok Search
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
`katok` CLI를 유일한 실행 표면으로 사용해 macOS 카카오톡 대화를 로컬 아카이브와 검색 인덱스로 동기화하고, keyword/BM25/semantic 검색과 chunk 조회를 수행한다.
|
|
6
|
+
|
|
7
|
+
이 스킬은 기존 `kakaotalk-mac` 설치 경로를 유지하지만 내부 동작은 `katok` 기반이다. 메시지 전송, 삭제, UI 자동화, 직접 DB 읽기, 인증 캐시 처리, 복호화 material 처리는 이 스킬의 범위가 아니다.
|
|
8
|
+
|
|
9
|
+
## Privacy Rules
|
|
10
|
+
|
|
11
|
+
- Do not inspect local database internals from this skill.
|
|
12
|
+
- Do not directly read KakaoTalk DB files.
|
|
13
|
+
- Do not handle auth caches or decryption material.
|
|
14
|
+
- Use `katok sync --source macos --json` for live macOS KakaoTalk ingestion.
|
|
15
|
+
- Search commands should return snippets and chunk ids first.
|
|
16
|
+
- Retrieve full chunk content only when the user explicitly asks to open a result or provides a chunk id.
|
|
17
|
+
|
|
18
|
+
## When to use
|
|
19
|
+
|
|
20
|
+
- "카카오톡에서 특정 키워드 검색해줘"
|
|
21
|
+
- "카톡에서 지난 회의/계약/약속 이야기 찾아줘"
|
|
22
|
+
- "이 검색 결과 chunk를 열어줘"
|
|
23
|
+
- "최근 대화가 반영됐는지 확인하고 검색해줘"
|
|
24
|
+
|
|
25
|
+
## When not to use
|
|
26
|
+
|
|
27
|
+
- macOS가 아닌 환경
|
|
28
|
+
- Intel Mac에서 로컬 EmbeddingGemma semantic index가 필요한 경우
|
|
29
|
+
- 카카오톡 메시지를 보내거나 삭제해야 하는 경우
|
|
30
|
+
- 카카오톡 DB 파일, 인증 캐시, 복호화 material을 직접 다루라는 요청
|
|
31
|
+
- 서버-투-서버 공식 Kakao API 연동 요청
|
|
32
|
+
|
|
33
|
+
## Prerequisites
|
|
34
|
+
|
|
35
|
+
- Apple Silicon macOS
|
|
36
|
+
- KakaoTalk for Mac 설치
|
|
37
|
+
- Homebrew 또는 Cargo
|
|
38
|
+
- `katok` CLI 설치
|
|
39
|
+
- 현재 터미널 앱에 Full Disk Access 권한
|
|
40
|
+
|
|
41
|
+
## Install katok
|
|
42
|
+
|
|
43
|
+
Homebrew:
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
brew tap NomaDamas/katok https://github.com/NomaDamas/katok.git
|
|
47
|
+
brew install katok
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Cargo:
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
cargo install katok
|
|
54
|
+
export PATH="$HOME/.cargo/bin:$PATH"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
설치 후 CLI가 보이는지 확인한다.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
katok --help
|
|
61
|
+
katok doctor --json
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Workflow
|
|
65
|
+
|
|
66
|
+
### 1. Check readiness without prompting for app data
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
katok doctor --json
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`doctor --json`의 `freshness` 섹션에서 마지막 sync/index 상태를 확인한다. 이 기본 doctor는 macOS app-data probe를 실행하지 않으므로 권한 prompt를 띄우지 않는 준비 상태 점검에 적합하다.
|
|
73
|
+
|
|
74
|
+
### 2. Open macOS permission settings when needed
|
|
75
|
+
|
|
76
|
+
Full Disk Access 설정이 필요하면 사용자가 직접 허용할 수 있도록 설정 화면을 연다.
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
katok permissions macos
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
KakaoTalk UI 자동화는 이 스킬 범위가 아니지만, upstream 진단을 위해 Accessibility 설정 화면까지 열어야 하는 경우에만 다음 명령을 쓴다.
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
katok permissions macos --accessibility
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### 3. Run explicit macOS setup diagnostics only when needed
|
|
89
|
+
|
|
90
|
+
카카오톡 앱 설치, container, DB 파일 접근 같은 macOS source adapter 상태를 확인해야 할 때만 probe를 실행한다. 이 명령은 macOS가 app-data 접근 prompt를 띄울 수 있다.
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
katok doctor --macos-probe --json
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### 4. Sync local KakaoTalk archives
|
|
97
|
+
|
|
98
|
+
최신 대화가 중요하거나 `freshness.recommendation.sync_before_search`가 true이면 검색 전에 sync한다.
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
katok sync --source macos --json
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
설정 파일의 기본 source adapter를 쓰는 경우:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
katok sync --json
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### 5. Build or refresh the semantic index
|
|
111
|
+
|
|
112
|
+
semantic search 전 `freshness.recommendation.index_before_semantic_search`가 true이거나 방금 sync한 내용을 semantic 검색에 반영해야 하면 index를 만든다.
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
katok index --json
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`katok index`는 기본적으로 로컬 `embeddinggemma-300m-q4` embedder를 사용한다. Python, Jina, TEI, 별도 HTTP embedding server를 요구하지 않는다.
|
|
119
|
+
|
|
120
|
+
### 6. Search with the narrowest useful mode
|
|
121
|
+
|
|
122
|
+
정확한 문자열, 이름, 계좌번호, 고유명사는 keyword search를 먼저 쓴다.
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
katok search keyword "검색어" --json
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
여러 단어가 섞인 일반 질의는 BM25를 쓴다.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
katok search bm25 "지난주 미팅 자료" --json
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
표현이 정확히 기억나지 않는 의미 기반 질의는 semantic search를 쓴다.
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
katok search semantic "최근에 논의한 세금 신고 일정" --json
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### 7. Retrieve explicit chunks only when needed
|
|
141
|
+
|
|
142
|
+
검색 결과는 먼저 snippet과 chunk id 중심으로 요약한다. 사용자가 특정 결과를 열어 달라고 하거나 chunk id를 제공했을 때만 원문 chunk를 조회한다.
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
katok chunk get <chunk-id> --json
|
|
146
|
+
katok chunk context <chunk-id> --json
|
|
147
|
+
katok chunk parent <chunk-id> --json
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
- `katok chunk get <chunk-id> --json`: 해당 chunk 원문 조회
|
|
151
|
+
- `katok chunk context <chunk-id> --json`: 같은 채팅방의 직전/직후 micro chunk 조회
|
|
152
|
+
- `katok chunk parent <chunk-id> --json`: semantic search parent window 조회
|
|
153
|
+
|
|
154
|
+
## Synthetic QA only
|
|
155
|
+
|
|
156
|
+
실제 카카오톡 설치 없이 upstream fixture로 테스트할 때만 fixture source와 deterministic embedder를 사용한다.
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
katok sync --source fixture tests/fixtures/kakao/replies.jsonl --json
|
|
160
|
+
KATOK_EMBEDDER=local-test katok index --json
|
|
161
|
+
KATOK_EMBEDDER=mock katok index --json
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
실사용 경로에서는 fixture, mock embedder, 원격 embedding endpoint를 사용하지 않는다.
|
|
165
|
+
|
|
166
|
+
## Done when
|
|
167
|
+
|
|
168
|
+
- readiness 요청이면 `katok doctor --json` 결과와 freshness 권장사항을 요약했다.
|
|
169
|
+
- 최신 검색 요청이면 필요한 경우 `katok sync --source macos --json`과 `katok index --json` 실행 여부를 명확히 했다.
|
|
170
|
+
- 검색 요청이면 keyword/BM25/semantic 중 선택한 이유와 JSON 검색 결과 요약을 제공했다.
|
|
171
|
+
- chunk 조회 요청이면 사용자가 지정한 chunk id에 대해서만 `katok chunk get/context/parent` 결과를 요약했다.
|
|
172
|
+
|
|
173
|
+
## Failure modes
|
|
174
|
+
|
|
175
|
+
- `katok` 미설치 또는 Cargo binary PATH 누락
|
|
176
|
+
- Apple Silicon macOS가 아님
|
|
177
|
+
- KakaoTalk for Mac 미설치
|
|
178
|
+
- Full Disk Access 미부여
|
|
179
|
+
- `katok doctor --macos-probe --json`에서 container 또는 DB 파일 접근 실패
|
|
180
|
+
- sync 전이라 local archive가 비어 있음
|
|
181
|
+
- semantic index가 오래되었거나 아직 생성되지 않음
|
|
182
|
+
- 검색 결과가 snippet/chunk id만으로 충분하지 않아 명시적 chunk 조회가 필요함
|
|
183
|
+
|
|
184
|
+
## Notes
|
|
185
|
+
|
|
186
|
+
- 이 스킬은 read/search/retrieve 전용이다.
|
|
187
|
+
- 메시지 전송과 삭제는 지원하지 않는다.
|
|
188
|
+
- DB 내부 구조, auth cache, decryption material은 직접 다루지 않는다.
|
|
189
|
+
- 기존 설치 이름은 `kakaotalk-mac`이지만 실행 표면은 `katok`이다.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kakaotalk-mac",
|
|
3
|
+
"description": "Search local KakaoTalk archives on Apple Silicon macOS through the katok CLI. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"action:communication"
|
|
6
|
+
],
|
|
7
|
+
"frontmatter": "name: kakaotalk-mac\ndescription: Search local KakaoTalk archives on Apple Silicon macOS through the katok CLI. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.\nlicense: MIT\nmetadata:\n category: messaging\n locale: ko-KR\n phase: v2"
|
|
8
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# KBL Results
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
공식 KBL JSON 표면으로 특정 날짜의 한국프로농구 경기 일정/결과를 조회하고, 필요하면 특정 팀(예: `서울 SK`, `부산 KCC`, 팀 코드 `55`)만 필터링한 뒤 현재 팀 순위까지 함께 정리한다.
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
- "오늘 KBL 경기 결과 알려줘"
|
|
10
|
+
- "2026-04-01 서울 SK 경기 결과 보여줘"
|
|
11
|
+
- "KBL 현재 팀 순위 알려줘"
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
- Node.js 18+
|
|
16
|
+
- `npm install -g kbl-results`
|
|
17
|
+
|
|
18
|
+
## Inputs
|
|
19
|
+
|
|
20
|
+
- 날짜: `YYYY-MM-DD`
|
|
21
|
+
- 선택 사항: 팀명, 풀네임, 팀 코드
|
|
22
|
+
|
|
23
|
+
## Workflow
|
|
24
|
+
|
|
25
|
+
### 0. Install the package globally when missing
|
|
26
|
+
|
|
27
|
+
`npm root -g` 아래에 `kbl-results` 가 없으면 HTML scraping 으로 우회하지 말고 먼저 전역 Node 패키지 설치를 시도한다.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install -g kbl-results
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 1. Fetch the official KBL JSON
|
|
34
|
+
|
|
35
|
+
공식 KBL 웹앱은 `https://api.kbl.or.kr` JSON API를 사용한다. 따라서 브라우저 크롤링 전에 아래 표면을 우선 사용한다.
|
|
36
|
+
|
|
37
|
+
- 일정/결과: `https://api.kbl.or.kr/match/list`
|
|
38
|
+
- 팀 순위: `https://api.kbl.or.kr/league/rank/team`
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
GLOBAL_NPM_ROOT="$(npm root -g)" node --input-type=module - <<'JS'
|
|
42
|
+
import path from "node:path";
|
|
43
|
+
import { pathToFileURL } from "node:url";
|
|
44
|
+
|
|
45
|
+
const entry = pathToFileURL(
|
|
46
|
+
path.join(process.env.GLOBAL_NPM_ROOT, "kbl-results", "src", "index.js"),
|
|
47
|
+
).href;
|
|
48
|
+
const { getKBLSummary } = await import(entry);
|
|
49
|
+
|
|
50
|
+
const summary = await getKBLSummary("2026-04-01", {
|
|
51
|
+
team: "부산 KCC",
|
|
52
|
+
includeStandings: true,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
console.log(JSON.stringify(summary, null, 2));
|
|
56
|
+
JS
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### 2. Normalize for humans
|
|
60
|
+
|
|
61
|
+
원본 JSON을 그대로 던지지 말고 아래 기준으로 정리한다.
|
|
62
|
+
|
|
63
|
+
- 홈팀 vs 원정팀
|
|
64
|
+
- 경기 시간 / 종료 여부 / LIVE 여부
|
|
65
|
+
- 스코어
|
|
66
|
+
- 현재 순위
|
|
67
|
+
- 요청 팀이 있으면 해당 팀 경기만 필터링
|
|
68
|
+
|
|
69
|
+
### 3. Keep the answer compact
|
|
70
|
+
|
|
71
|
+
요청이 scoreboard 면 경기별 한 줄 요약부터 준다. 특정 팀 요청이면 그 팀 경기와 현재 순위만 먼저 보여준다.
|
|
72
|
+
|
|
73
|
+
## Done when
|
|
74
|
+
|
|
75
|
+
- 날짜 기준 경기 요약이 있다
|
|
76
|
+
- 팀 요청이면 해당 팀 경기만 남아 있다
|
|
77
|
+
- 현재 순위가 같이 정리되어 있다
|
|
78
|
+
|
|
79
|
+
## Failure modes
|
|
80
|
+
|
|
81
|
+
- KBL가 `api.kbl.or.kr` 응답 구조를 바꾸면 패키지 수정이 필요하다
|
|
82
|
+
- 경기 전 날짜면 결과 대신 예정 상태가 반환될 수 있다
|
|
83
|
+
- 크롤링 fallback은 공식 JSON이 막혔을 때만 검토한다
|
|
84
|
+
|
|
85
|
+
## Notes
|
|
86
|
+
|
|
87
|
+
- 이 스킬은 조회 전용이다
|
|
88
|
+
- 사용자의 "오늘/어제" 요청은 항상 절대 날짜(`YYYY-MM-DD`)로 변환해서 실행한다
|
|
89
|
+
- 자세한 사용 예시는 `docs/features/kbl-results.md` 와 `packages/kbl-results/README.md` 를 따른다
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kbl-results",
|
|
3
|
+
"description": "KBL 한국프로농구 경기 결과와 현재 팀 순위를 날짜/팀 기준으로 조회한다. 공식 JSON 엔드포인트와 kbl-results npm 패키지를 사용한다.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"browser",
|
|
6
|
+
"lookup"
|
|
7
|
+
],
|
|
8
|
+
"frontmatter": "name: kbl-results\ndescription: KBL 한국프로농구 경기 결과와 현재 팀 순위를 날짜/팀 기준으로 조회한다. 공식 JSON 엔드포인트와 kbl-results npm 패키지를 사용한다.\nlicense: MIT\nmetadata:\n category: sports\n locale: ko-KR\n phase: v1"
|
|
9
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# KBO Results
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
`kbo-game` 패키지로 특정 날짜 KBO 경기 정보를 가져와 경기 일정, 스코어, 상태를 요약한다.
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
- "오늘 KBO 경기 결과 알려줘"
|
|
10
|
+
- "어제 한화 경기 스코어 보여줘"
|
|
11
|
+
- "2026-04-01 KBO 일정 정리해줘"
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
- Node.js 18+
|
|
16
|
+
- `npm install -g kbo-game`
|
|
17
|
+
|
|
18
|
+
## Inputs
|
|
19
|
+
|
|
20
|
+
- 날짜: `YYYY-MM-DD`
|
|
21
|
+
- 선택 사항: 특정 팀명
|
|
22
|
+
|
|
23
|
+
## Workflow
|
|
24
|
+
|
|
25
|
+
### 0. Install the package globally when missing
|
|
26
|
+
|
|
27
|
+
`npm root -g` 아래에 `kbo-game` 이 없으면 다른 구현으로 우회하지 말고 전역 Node 패키지 설치를 먼저 시도한다.
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm install -g kbo-game
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
패키지가 없다는 이유로 다른 비공식 scoreboard 소스를 자동 채택하지 않는다.
|
|
34
|
+
|
|
35
|
+
### 1. Fetch the date
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
GLOBAL_NPM_ROOT="$(npm root -g)" node --input-type=module - <<'JS'
|
|
39
|
+
import path from "node:path";
|
|
40
|
+
import { pathToFileURL } from "node:url";
|
|
41
|
+
|
|
42
|
+
const entry = pathToFileURL(
|
|
43
|
+
path.join(process.env.GLOBAL_NPM_ROOT, "kbo-game", "dist", "index.js"),
|
|
44
|
+
).href;
|
|
45
|
+
const { getGame } = await import(entry);
|
|
46
|
+
|
|
47
|
+
const date = "2026-03-25";
|
|
48
|
+
const games = await getGame(new Date(`${date}T00:00:00+09:00`));
|
|
49
|
+
console.log(JSON.stringify(games, null, 2));
|
|
50
|
+
JS
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`kbo-game@0.0.2` 기준 실제 export는 `getGame` 하나이며, 문자열 날짜(`"2026-03-25"`)를 직접 넘기면 실패한다. 항상 `Date` 객체로 변환해서 호출한다. 전역 설치를 기본으로 쓰므로 inline snippet에서는 전역 npm root 아래 entry file을 직접 import 한다.
|
|
54
|
+
|
|
55
|
+
### 2. Normalize for humans
|
|
56
|
+
|
|
57
|
+
원본 데이터를 그대로 던지지 말고 아래 기준으로 정리한다.
|
|
58
|
+
|
|
59
|
+
- 홈팀 vs 원정팀
|
|
60
|
+
- 진행 상태 또는 경기 종료 여부
|
|
61
|
+
- 스코어
|
|
62
|
+
- 필요한 경우 특정 팀만 필터링
|
|
63
|
+
|
|
64
|
+
### 3. Keep the answer compact
|
|
65
|
+
|
|
66
|
+
사용자가 scoreboard를 원하면 경기별 한 줄 요약부터 준다.
|
|
67
|
+
|
|
68
|
+
## Done when
|
|
69
|
+
|
|
70
|
+
- 날짜 기준 전체 경기 요약이 있다
|
|
71
|
+
- 팀 필터 요청이면 해당 팀 경기만 남아 있다
|
|
72
|
+
- raw JSON이 필요하면 별도로 제공할 수 있다
|
|
73
|
+
|
|
74
|
+
## Failure modes
|
|
75
|
+
|
|
76
|
+
- KBO 사이트 변경으로 패키지 응답이 깨질 수 있다
|
|
77
|
+
- 비시즌 날짜는 빈 결과가 올 수 있다
|
|
78
|
+
|
|
79
|
+
## Notes
|
|
80
|
+
|
|
81
|
+
- 이 스킬은 조회 전용이다
|
|
82
|
+
- 사용자 기준 "오늘/어제" 같은 상대 날짜는 항상 절대 날짜로 변환해서 실행한다
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "kbo-results",
|
|
3
|
+
"description": "Fetch KBO game schedules and results for a specific date with the kbo-game npm package. Use when the user asks for today's KBO games, yesterday's scores, or a date-specific scoreboard.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"lookup"
|
|
6
|
+
],
|
|
7
|
+
"frontmatter": "name: kbo-results\ndescription: Fetch KBO game schedules and results for a specific date with the kbo-game npm package. Use when the user asks for today's KBO games, yesterday's scores, or a date-specific scoreboard.\nlicense: MIT\nmetadata:\n category: sports\n locale: ko-KR\n phase: v1"
|
|
8
|
+
}
|