@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,85 @@
|
|
|
1
|
+
# Seoul Subway Arrival
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
서울 열린데이터 광장의 실시간 지하철 도착정보 Open API를 `k-skill-proxy` 경유로 조회해 역 기준 도착 예정 열차 정보를 요약한다.
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
- "강남역 지금 몇 분 뒤 도착해?"
|
|
10
|
+
- "서울역 1호선 도착 정보 보여줘"
|
|
11
|
+
- "잠실역 곧 들어오는 열차 정리해줘"
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
- optional: `jq`
|
|
16
|
+
- optional: `KSKILL_PROXY_BASE_URL` (self-host·별도 프록시를 쓸 때만 설정. 비우면 기본 hosted `https://k-skill-proxy.nomadamas.org` 를 사용한다.)
|
|
17
|
+
|
|
18
|
+
## Required environment variables
|
|
19
|
+
|
|
20
|
+
- 없음. `KSKILL_PROXY_BASE_URL` 은 선택 사항이며, 비우면 기본 hosted `https://k-skill-proxy.nomadamas.org` 를 사용한다.
|
|
21
|
+
|
|
22
|
+
사용자가 개인 서울 열린데이터 광장 OpenAPI key를 직접 발급할 필요는 없다. `/v1/seoul-subway/arrival` route는 기본 hosted proxy에서 호출하고, upstream key는 proxy 서버 쪽에만 보관한다. 별도 proxy를 쓰는 경우에만 `KSKILL_PROXY_BASE_URL` 을 설정한다.
|
|
23
|
+
|
|
24
|
+
### Proxy resolution order
|
|
25
|
+
|
|
26
|
+
1. **`KSKILL_PROXY_BASE_URL` 이 있으면** 그 값을 사용한다.
|
|
27
|
+
2. **없거나 빈 값이면** 기본 hosted proxy `https://k-skill-proxy.nomadamas.org` 를 사용한다.
|
|
28
|
+
3. **직접 proxy를 운영하는 경우에만** proxy 서버 upstream key를 서버 쪽에만 설정한다.
|
|
29
|
+
|
|
30
|
+
클라이언트/사용자 쪽에서 upstream key를 직접 다루지 않는다.
|
|
31
|
+
|
|
32
|
+
## Inputs
|
|
33
|
+
|
|
34
|
+
- 역명
|
|
35
|
+
- 선택 사항: 가져올 건수
|
|
36
|
+
|
|
37
|
+
## Workflow
|
|
38
|
+
|
|
39
|
+
### 1. Resolve the proxy base URL
|
|
40
|
+
|
|
41
|
+
`KSKILL_PROXY_BASE_URL` 이 있으면 그 값을 사용하고, 없거나 비어 있으면 기본 hosted proxy `https://k-skill-proxy.nomadamas.org` 를 사용한다.
|
|
42
|
+
|
|
43
|
+
### 2. Query the official station arrival endpoint
|
|
44
|
+
|
|
45
|
+
proxy는 서울 실시간 지하철 API key를 서버에서 주입하고, 역명 기준 실시간 도착정보만 공개 read-only endpoint로 노출한다.
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
BASE="${KSKILL_PROXY_BASE_URL:-https://k-skill-proxy.nomadamas.org}"
|
|
49
|
+
curl -fsS --get "${BASE}/v1/seoul-subway/arrival" \
|
|
50
|
+
--data-urlencode 'stationName=강남'
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
필요하면 `startIndex`, `endIndex` 로 응답 범위를 조정할 수 있다.
|
|
54
|
+
|
|
55
|
+
### 3. Summarize the response
|
|
56
|
+
|
|
57
|
+
가능하면 아래 항목만 먼저 요약한다.
|
|
58
|
+
|
|
59
|
+
- 호선
|
|
60
|
+
- 상/하행 또는 외/내선
|
|
61
|
+
- 첫 번째 도착 메시지
|
|
62
|
+
- 두 번째 도착 메시지
|
|
63
|
+
- 도착 예정 시간(있으면 초 단위)
|
|
64
|
+
|
|
65
|
+
### 4. Be conservative about live data
|
|
66
|
+
|
|
67
|
+
실시간 데이터는 몇 초 단위로 바뀔 수 있으므로, 답변에는 조회 시점을 같이 적는다.
|
|
68
|
+
|
|
69
|
+
## Done when
|
|
70
|
+
|
|
71
|
+
- 요청 역의 도착 예정 열차가 정리되어 있다
|
|
72
|
+
- live data 기준 시점이 명시되어 있다
|
|
73
|
+
- upstream key가 클라이언트에 노출되지 않았다
|
|
74
|
+
|
|
75
|
+
## Failure modes
|
|
76
|
+
|
|
77
|
+
- proxy upstream key 미설정
|
|
78
|
+
- quota 초과
|
|
79
|
+
- 역명 표기 불일치
|
|
80
|
+
|
|
81
|
+
## Notes
|
|
82
|
+
|
|
83
|
+
- 서울 열린데이터 광장 가이드는 실시간 지하철 Open API에 일일 호출 제한이 있을 수 있다고 안내한다
|
|
84
|
+
- proxy 운영/환경변수 설정은 `docs/features/k-skill-proxy.md` 를 참고한다
|
|
85
|
+
- endpoint path는 API 버전 변경 가능성이 있으므로 실패 시 dataset console의 최신 샘플 URL을 다시 확인한다
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "seoul-subway-arrival",
|
|
3
|
+
"description": "Look up Seoul real-time subway arrival information with the official Seoul Open Data API. Use when the user asks when a train arrives, which trains are approaching a station, or how crowded Seoul subway timing looks right now.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"proxy",
|
|
6
|
+
"lookup"
|
|
7
|
+
],
|
|
8
|
+
"frontmatter": "name: seoul-subway-arrival\ndescription: Look up Seoul real-time subway arrival information with the official Seoul Open Data API. Use when the user asks when a train arrives, which trains are approaching a station, or how crowded Seoul subway timing looks right now.\nlicense: MIT\nmetadata:\n category: transit\n locale: ko-KR\n phase: v1"
|
|
9
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
# SH Notice Search
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
서울주택도시개발공사(SH, `www.i-sh.co.kr`)의 **공고 및 공지** 공개 HTML 게시판을 직접 읽어 청약·주택 공고 목록과 상세 본문, 첨부파일 메타데이터를 JSON으로 정리한다.
|
|
6
|
+
|
|
7
|
+
- 키워드로 SH 공고/공지 목록을 검색한다.
|
|
8
|
+
- 공식 게시판 분류(주택임대, 주택분양, 주택매입/주거복지, 토지, 상가/공장 등)를 선택한다.
|
|
9
|
+
- 상세 페이지에서 본문, 담당부서, 등록일, 조회수, 실제 첨부파일명을 추출한다.
|
|
10
|
+
- 첨부는 아이콘 템플릿이 아니라 `existFile('N')` onclick이 달린 실제 첨부 앵커와 `downList` 메타데이터를 기준으로 추출한다.
|
|
11
|
+
|
|
12
|
+
청약 신청, 서류 제출, 로그인 필요한 마이페이지 조회, 결제, 알림 발송은 하지 않는다.
|
|
13
|
+
|
|
14
|
+
## When to use
|
|
15
|
+
|
|
16
|
+
- "SH 행복주택 공고 찾아줘"
|
|
17
|
+
- "서울주택도시개발공사 매입임대 공고 보여줘"
|
|
18
|
+
- "SH 공고 seq 304371 상세와 첨부파일 알려줘"
|
|
19
|
+
- "SH 분양 공고 최신 목록 조회"
|
|
20
|
+
|
|
21
|
+
## Prerequisites
|
|
22
|
+
|
|
23
|
+
- 인터넷 연결
|
|
24
|
+
- Node.js 18+
|
|
25
|
+
- 이 저장소의 `sh-notice-search` npm package 또는 동일 로직
|
|
26
|
+
|
|
27
|
+
## Public access path discovered
|
|
28
|
+
|
|
29
|
+
### Primary source: official SH public HTML board
|
|
30
|
+
|
|
31
|
+
- default rent list: `https://www.i-sh.co.kr/app/lay2/program/S1T294C297/www/brd/m_247/list.do?multi_itm_seq=2`
|
|
32
|
+
- default rent detail: `https://www.i-sh.co.kr/app/lay2/program/S1T294C297/www/brd/m_247/view.do?multi_itm_seq=2&seq=<seq>`
|
|
33
|
+
- title keyword search: add `srchWord=<keyword>&srchTp=0`
|
|
34
|
+
- content keyword search: add `srchWord=<keyword>&srchTp=1`
|
|
35
|
+
- fixed board page size: 10 rows per page; use `page` for pagination.
|
|
36
|
+
|
|
37
|
+
Discovery result: direct unauthenticated fetches from `www.i-sh.co.kr` return list/detail HTML. A live smoke on 2026-05-15 showed `srchWord=행복주택` without `srchTp` returned the full rent board count, while `srchTp=0` narrowed the result set. Therefore the client always sends `srchTp` when a keyword is present.
|
|
38
|
+
|
|
39
|
+
No `k-skill-proxy` route is used because this upstream is public and does not require an API key.
|
|
40
|
+
|
|
41
|
+
## Supported category aliases
|
|
42
|
+
|
|
43
|
+
| Input aliases | Official tab |
|
|
44
|
+
| --- | --- |
|
|
45
|
+
| `rent`, `임대`, `주택임대` | 주택임대 (`multi_itm_seq=2`) |
|
|
46
|
+
| `sale`, `분양`, `주택분양` | 주택분양 (`multi_itm_seq=1`) |
|
|
47
|
+
| `purchase`, `매입`, `매입임대`, `welfare`, `주거복지` | 주택매입 (`multi_itm_seq=512`) |
|
|
48
|
+
| `land`, `토지` | 토지 |
|
|
49
|
+
| `commercial`, `상가`, `공장` | 상가/공장 |
|
|
50
|
+
| `compensation`, `보상`, `이주` | 보상/이주 |
|
|
51
|
+
| `design`, `현상설계` | 현상설계 |
|
|
52
|
+
| `etc`, `기타` | 기타 |
|
|
53
|
+
| `all`, `전체` | 전체 |
|
|
54
|
+
|
|
55
|
+
`주거복지`는 SH 공고 및 공지의 공개 탭명이 아니라 사용자 친화 alias이며, 현재는 SH의 공개 `주택매입` 탭으로 매핑한다. 답변할 때는 이 매핑을 밝힌다.
|
|
56
|
+
|
|
57
|
+
## Workflow
|
|
58
|
+
|
|
59
|
+
### 1. Search notices
|
|
60
|
+
|
|
61
|
+
```js
|
|
62
|
+
const { searchNotices } = require("sh-notice-search")
|
|
63
|
+
|
|
64
|
+
const result = await searchNotices({
|
|
65
|
+
keyword: "행복주택",
|
|
66
|
+
category: "임대",
|
|
67
|
+
page: 1,
|
|
68
|
+
limit: 5
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
console.log(result.items)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
CLI:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
node packages/sh-notice-search/src/cli.js 행복주택 --category 임대 --limit 5
|
|
78
|
+
node packages/sh-notice-search/src/cli.js 매입임대 --category 주거복지 --status 진행
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Returned list fields include:
|
|
82
|
+
|
|
83
|
+
- `seq`
|
|
84
|
+
- `title`
|
|
85
|
+
- `department`
|
|
86
|
+
- `registered_date`
|
|
87
|
+
- `views`
|
|
88
|
+
- `is_new`
|
|
89
|
+
- `category`, `category_name`
|
|
90
|
+
- `status`, `status_basis`
|
|
91
|
+
- `detail_url`
|
|
92
|
+
|
|
93
|
+
### 2. Fetch detail
|
|
94
|
+
|
|
95
|
+
```js
|
|
96
|
+
const { getNoticeDetail } = require("sh-notice-search")
|
|
97
|
+
|
|
98
|
+
const detail = await getNoticeDetail({ seq: "304371", category: "임대" })
|
|
99
|
+
console.log(detail.notice.content_text)
|
|
100
|
+
console.log(detail.notice.attachments)
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
CLI:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
node packages/sh-notice-search/src/cli.js --seq 304371 --category 임대
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Attachment fields:
|
|
110
|
+
|
|
111
|
+
- `filename`
|
|
112
|
+
- `file_seq`
|
|
113
|
+
- `file_size`
|
|
114
|
+
- `file_type`
|
|
115
|
+
- `preview_url` (official SH preview/converter URL)
|
|
116
|
+
|
|
117
|
+
Direct download URLs are intentionally not returned. Hand off `detail_url` or `preview_url` to the user's browser.
|
|
118
|
+
|
|
119
|
+
### 3. Interpret status conservatively
|
|
120
|
+
|
|
121
|
+
The SH public board list does not expose a first-class status field like `접수중`/`마감`. The package can filter by `status`, but it is a title-text classifier:
|
|
122
|
+
|
|
123
|
+
- `open`/`진행`: titles with 모집공고, 입주자 모집, 신청, 접수, 공고
|
|
124
|
+
- `closed`/`마감`: titles with 마감, 계약결과, 결과, 완료, 종료
|
|
125
|
+
- `announced`/`당첨자`: titles with 당첨, 발표
|
|
126
|
+
|
|
127
|
+
When answering, disclose that status is inferred from the title unless the detailed 공고문 body states exact dates.
|
|
128
|
+
|
|
129
|
+
## Done when
|
|
130
|
+
|
|
131
|
+
- Official SH list/detail URLs were queried directly from the user machine.
|
|
132
|
+
- Keyword searches include `srchTp` so `srchWord` is not ignored.
|
|
133
|
+
- Pagination uses `page` and recognizes the fixed 10-row board page size.
|
|
134
|
+
- Attachments are extracted from actual `existFile()` anchors/downList metadata, not extension icon templates.
|
|
135
|
+
- Public source URLs are shown, and login/application automation is avoided.
|
|
136
|
+
|
|
137
|
+
## Failure modes
|
|
138
|
+
|
|
139
|
+
- SH can change board paths, table markup, JavaScript functions, or `downList` structure; parsing may become partial or fail.
|
|
140
|
+
- IP-rate-limit, NetFunnel throttling, maintenance pages, or temporary 4xx/5xx responses can block live fetches. Do not bypass CAPTCHA/login/queue protections.
|
|
141
|
+
- `srchWord` without `srchTp` is known to be ignored by the SH board; always send `srchTp=0` for title or `srchTp=1` for content.
|
|
142
|
+
- `pageSize` larger than 10 does not make SH return more rows. Use `page` for additional results.
|
|
143
|
+
- Attachment preview URLs may require browser handoff and can be governed by SH's current direct-link/download policy.
|
|
144
|
+
- Status is inferred from title text because the public list lacks an explicit status column.
|
|
145
|
+
|
|
146
|
+
## Notes
|
|
147
|
+
|
|
148
|
+
- Read-only lookup only.
|
|
149
|
+
- No proxy, no API key, no secrets.
|
|
150
|
+
- Do not automate 청약 신청, 로그인, 서류 제출, payment, or 마이페이지 flows.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "sh-notice-search",
|
|
3
|
+
"description": "서울주택도시개발공사(SH) 공개 공고/공지 게시판에서 청약·주택 공고 목록, 상세 본문, 첨부 미리보기 메타데이터를 직접 조회한다. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"proxy",
|
|
6
|
+
"action:submission"
|
|
7
|
+
],
|
|
8
|
+
"frontmatter": "name: sh-notice-search\ndescription: 서울주택도시개발공사(SH) 공개 공고/공지 게시판에서 청약·주택 공고 목록, 상세 본문, 첨부 미리보기 메타데이터를 직접 조회한다. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.\nlicense: MIT\nmetadata:\n category: housing\n locale: ko-KR\n phase: v1"
|
|
9
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
# SRT Booking
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
`SRTrain` 위에 `scripts/srt_booking.py` helper 를 얹어 SRT 조회와 호차별 좌석번호 확인을 처리하고, 예약과 취소는 고정된 열차/예약을 다시 식별한 뒤 `SRTrain`으로 진행한다.
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
- "수서에서 부산 가는 SRT 찾아줘"
|
|
10
|
+
- "내일 오전 SRT 빈자리 있으면 잡아줘"
|
|
11
|
+
- "SRT 5호차 빈 좌석 확인해줘"
|
|
12
|
+
- "SRT 11A 좌석이 비었는지 봐줘"
|
|
13
|
+
- "창측 좌석을 우선해서 SRT 빈자리 보여줘"
|
|
14
|
+
- "예약 내역 확인해줘"
|
|
15
|
+
- "이 SRT 예약 취소해줘"
|
|
16
|
+
|
|
17
|
+
## When not to use
|
|
18
|
+
|
|
19
|
+
- 돌쇠가 아니며 결제까지 자동으로 끝내야 하는 경우
|
|
20
|
+
- 비밀번호를 채팅창에 직접 보내려는 경우
|
|
21
|
+
- SRT가 아니라 KTX/Korail 예매인 경우
|
|
22
|
+
|
|
23
|
+
## Prerequisites
|
|
24
|
+
|
|
25
|
+
- Python 3.10+
|
|
26
|
+
- `python3 -m pip install SRTrain`
|
|
27
|
+
|
|
28
|
+
## Required environment variables
|
|
29
|
+
|
|
30
|
+
- `KSKILL_SRT_ID`
|
|
31
|
+
- `KSKILL_SRT_PASSWORD`
|
|
32
|
+
|
|
33
|
+
### Credential handling
|
|
34
|
+
|
|
35
|
+
- 돌쇠 credential mode에서는 `vault-run` capability를 사용하고, 없으면 `request_vault_credential`을 호출한다. ID/PW 원문을 채팅이나 shell에 넣지 않는다.
|
|
36
|
+
- 그 밖의 환경에서는 이미 주입된 환경변수 → host vault → `~/.config/k-skill/secrets.env` 순서로 사용한다.
|
|
37
|
+
|
|
38
|
+
## Inputs
|
|
39
|
+
|
|
40
|
+
- 출발역
|
|
41
|
+
- 도착역
|
|
42
|
+
- 날짜: `YYYYMMDD`
|
|
43
|
+
- 희망 시작 시각: `HHMMSS`
|
|
44
|
+
- 인원 수와 승객 유형
|
|
45
|
+
- 좌석 선호: 일반실 / 특실
|
|
46
|
+
- 좌석 상세 조건: 객실 등급, 호차 번호, 좌석 번호, 빈 좌석만 보기, 탐색 우선순위
|
|
47
|
+
|
|
48
|
+
## Workflow
|
|
49
|
+
|
|
50
|
+
### 0. Install the package globally when missing
|
|
51
|
+
|
|
52
|
+
`python3 -c 'import SRT'` 가 실패하면 다른 구현으로 우회하지 말고 전역 Python 패키지 설치를 먼저 시도한다.
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
python3 -m pip install SRTrain
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 1. Ensure credentials are available
|
|
59
|
+
|
|
60
|
+
돌쇠 credential mode에서는 `vault-run`의 SRT capability를 확인하고, 없으면 `request_vault_credential`로 앱 vault 입력 UI를 호출한다. generic fallback에서만 `KSKILL_SRT_ID`, `KSKILL_SRT_PASSWORD` 환경변수를 확인한다.
|
|
61
|
+
|
|
62
|
+
시크릿이 없다는 이유로 웹사이트를 직접 긁거나 다른 비공식 경로를 찾지 않는다.
|
|
63
|
+
|
|
64
|
+
### 2. Search first
|
|
65
|
+
|
|
66
|
+
먼저 helper 로 조회해서 후보를 요약한다.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
python3 scripts/srt_booking.py search 수서 부산 20260328 080000 --time-limit 120000 --limit 5
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### 3. Summarize options before side effects
|
|
73
|
+
|
|
74
|
+
예약 전에는 항상 아래를 짧게 정리한다.
|
|
75
|
+
|
|
76
|
+
- 출발/도착 시각
|
|
77
|
+
- 일반실/특실 가능 여부
|
|
78
|
+
- 예상 운임
|
|
79
|
+
|
|
80
|
+
### 4. Inspect detailed seats when the user asks for seat numbers
|
|
81
|
+
|
|
82
|
+
`search` 의 좌석 가능 여부는 열차 단위 플래그다. 사용자가 "남은 좌석 번호", "호차별 좌석", "특정 좌석", "창측/순방향 자리", "예약 전에 자리 확인"처럼 구체적인 좌석을 물으면 예약 전에 `seats` 를 호출한다.
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
python3 scripts/srt_booking.py seats 수서 부산 20260328 080000 --train-id <train_id>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
특정 호차의 빈 좌석만 확인하려면 `--car-no` 와 `--available-only` 를 쓴다.
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
python3 scripts/srt_booking.py seats 수서 부산 20260328 080000 --train-id <train_id> --car-no 5 --available-only
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
특정 좌석이 비었는지 확인하려면 `--seat` 를 붙인다.
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
python3 scripts/srt_booking.py seats 수서 부산 20260328 080000 --train-id <train_id> --car-no 5 --seat 11A
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
특정 호차를 지정하지 않으면 가운데 호차부터 탐색한다. `--car-priority center|low|high` 로 호차 탐색 순서를 바꾸고, `--seat-priority forward-window|window-forward|row-low` 로 좌석 정렬 우선순위를 바꾼다.
|
|
101
|
+
|
|
102
|
+
상세 좌석 응답을 보여줄 때는 아래를 우선 요약한다.
|
|
103
|
+
|
|
104
|
+
- 호차별 `available_seat_count`
|
|
105
|
+
- 남은 좌석 번호 (`available_seats`)
|
|
106
|
+
- 좌석별 `direction`, `position`
|
|
107
|
+
- 특정 좌석 요청이면 `requested_seat_available`
|
|
108
|
+
|
|
109
|
+
이 기능은 좌석을 선택/선점하지 않는다. 실제 예약은 다음 단계에서만 진행한다.
|
|
110
|
+
|
|
111
|
+
### 5. Reserve only after the train is fixed
|
|
112
|
+
|
|
113
|
+
예약은 부작용이 있으므로 정확한 열차를 고른 뒤에만 진행한다.
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
python3 - <<'PY'
|
|
117
|
+
import os
|
|
118
|
+
from SRT import Adult, SRT, SeatType
|
|
119
|
+
|
|
120
|
+
srt = SRT(os.environ["KSKILL_SRT_ID"], os.environ["KSKILL_SRT_PASSWORD"])
|
|
121
|
+
trains = srt.search_train("수서", "부산", "20260328", "080000", time_limit="120000")
|
|
122
|
+
reservation = srt.reserve(
|
|
123
|
+
trains[0],
|
|
124
|
+
passengers=[Adult(1)],
|
|
125
|
+
special_seat=SeatType.GENERAL_FIRST,
|
|
126
|
+
)
|
|
127
|
+
print(reservation)
|
|
128
|
+
PY
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### 6. Continue to payment in Dolshoi
|
|
132
|
+
|
|
133
|
+
예약이 성공하면 예약번호, 운임, 구입기한을 즉시 알려서 **좌석 확보는 완료되었다**고 명확히 말한다.
|
|
134
|
+
|
|
135
|
+
돌쇠에서 사용자가 예매 완료를 요청했다면 여기서 멈추지 않는다.
|
|
136
|
+
|
|
137
|
+
1. CloakBrowser의 공식 SRT 예약/결제 화면에서 방금 만든 예약을 다시 식별한다.
|
|
138
|
+
2. vault-backed login을 사용하고 결제수단/할인/승객/예약 정보를 확인한다.
|
|
139
|
+
3. 실제 결제 버튼 직전에 `clarify`로 열차, 날짜·시각, 승객, 좌석 등급, 총액을 보여주고 승인받는다.
|
|
140
|
+
4. 승인되면 결제를 실행하고 결제 완료 화면, 예약번호, 영수증/결제 상태를 확인한다.
|
|
141
|
+
|
|
142
|
+
돌쇠가 아니거나 공식 결제 표면을 사용할 수 없으면 예약번호와 구입기한을 제공하고 generic handoff로 종료한다.
|
|
143
|
+
|
|
144
|
+
### 7. Inspect or cancel
|
|
145
|
+
|
|
146
|
+
취소 전에는 대상 예약을 다시 식별한다.
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
python3 - <<'PY'
|
|
150
|
+
import os
|
|
151
|
+
from SRT import SRT
|
|
152
|
+
|
|
153
|
+
srt = SRT(os.environ["KSKILL_SRT_ID"], os.environ["KSKILL_SRT_PASSWORD"])
|
|
154
|
+
reservations = srt.get_reservations()
|
|
155
|
+
print(reservations)
|
|
156
|
+
PY
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
취소 실행 직전에 `clarify`로 예약번호, 열차, 날짜·시각, 승객, 환불/위약금 정보를 확인하고 승인받는다.
|
|
160
|
+
|
|
161
|
+
## Done when
|
|
162
|
+
|
|
163
|
+
- 조회 요청이면 후보 열차가 정리되어 있다
|
|
164
|
+
- 좌석 상세 확인이면 호차별 남은 좌석번호나 특정 좌석 공석 여부가 정리되어 있다
|
|
165
|
+
- 예약 요청이면 예약 결과, 운임, 구입기한이 확인되어 좌석 확보 완료를 안내했다
|
|
166
|
+
- 돌쇠의 예매 완료 요청이면 `clarify` 승인 후 결제 완료 상태와 영수증/예약번호를 확인했다
|
|
167
|
+
- 취소 요청이면 어떤 예약을 취소했는지 명확하다
|
|
168
|
+
|
|
169
|
+
## Failure modes
|
|
170
|
+
|
|
171
|
+
- 로그인 오류: 계정 정보나 SRT site policy 변경 가능성 확인
|
|
172
|
+
- 매진: 다른 시간대나 좌석 타입으로 재조회
|
|
173
|
+
- 좌석선택 페이지 형식 변경: helper 파서 업데이트 필요
|
|
174
|
+
- 네트워크 오류: 짧게 재시도하되 aggressive polling은 피하기
|
|
175
|
+
|
|
176
|
+
## Notes
|
|
177
|
+
|
|
178
|
+
- 상세 좌석 확인은 SRT 웹 좌석선택 페이지를 조회 전용으로 읽는다
|
|
179
|
+
- `SRTrain`은 SRT 전용 라이브러리라서 스킬 의도가 더 선명하다
|
|
180
|
+
- 결제 자동화 금지는 generic fallback에만 적용한다. 돌쇠에서는 `clarify` 승인 후 공식 결제 표면으로 완료한다
|
|
181
|
+
- 자동 재시도 루프는 계정 보호 차원에서 짧고 보수적으로 유지한다
|