@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,206 @@
|
|
|
1
|
+
# HWP
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
`kordoc`으로 `.hwp` / `.hwpx` / `.hwpml` 문서를 AI가 읽기 좋은 Markdown 또는 JSON으로 바꾸고,
|
|
6
|
+
필요하면 문서 비교, 양식 필드 추출, Markdown→HWPX 역변환까지 수행한다.
|
|
7
|
+
|
|
8
|
+
이 스킬의 기본 엔진은 **항상 `kordoc`** 이다. 문서 변환, 비교, 필드 추출, 역변환까지 같은 도구로 일관되게 처리한다.
|
|
9
|
+
|
|
10
|
+
> **스킬 라우팅** — 이 `hwp` 스킬은 **조회/변환(read-only)** 전용이다.
|
|
11
|
+
> HWP 바이너리 **편집**(본문 텍스트 삽입/삭제, 표 생성, 셀 수정, replace-all)은 [`rhwp-edit`](../rhwp-edit/SKILL.md) 스킬이,
|
|
12
|
+
> 레이아웃 디버깅·IR 덤프·썸네일·배포용 문서 잠금 해제 같은 **고급 검사**는 [`rhwp-advanced`](../rhwp-advanced/SKILL.md) 스킬이 맡는다.
|
|
13
|
+
|
|
14
|
+
## When to use
|
|
15
|
+
|
|
16
|
+
- "이 HWP 파일을 Markdown으로 바꿔줘"
|
|
17
|
+
- "공문서를 JSON 구조로 뽑아서 AI가 읽게 해줘"
|
|
18
|
+
- "두 버전 문서 차이점을 보고 싶어"
|
|
19
|
+
- "신청서 HWPX 안에 어떤 양식 필드가 있는지 뽑아줘"
|
|
20
|
+
- "AI가 만든 Markdown을 다시 HWPX로 저장해줘"
|
|
21
|
+
- "폴더 안 문서를 한 번에 변환해줘"
|
|
22
|
+
|
|
23
|
+
## When not to use
|
|
24
|
+
|
|
25
|
+
- OCR이 필수인데 OCR provider 연결이 전혀 없는 이미지 기반 PDF만 있는 경우
|
|
26
|
+
- `.docx`, `.xlsx`, `.pdf` 만 다루더라도 문서 파싱 자체가 아니라 편집기 GUI 자동화가 필요한 경우
|
|
27
|
+
- 원본 프로그램의 실시간 UI 제어가 반드시 필요한 경우
|
|
28
|
+
- **본문 텍스트 직접 삽입·삭제·치환 또는 표 구조 변경** — `rhwp-edit` 스킬의 `k-skill-rhwp` CLI 를 사용한다.
|
|
29
|
+
- **페이지 SVG 렌더 디버깅·IR 덤프·ir-diff·썸네일 추출** — `rhwp-advanced` 스킬의 업스트림 `rhwp` CLI 를 사용한다.
|
|
30
|
+
|
|
31
|
+
## Prerequisites
|
|
32
|
+
|
|
33
|
+
- Node.js 18+
|
|
34
|
+
- 출력 경로 쓰기 권한
|
|
35
|
+
- `kordoc`과 `pdfjs-dist`를 같은 전역/로컬 환경에 설치했거나, 둘 다 포함된 `npx --yes --package kordoc --package pdfjs-dist kordoc ...` 실행 환경
|
|
36
|
+
- 현재 배포된 `kordoc` CLI는 시작 시 `pdfjs-dist`를 바로 로드하므로 PDF를 안 써도 함께 설치해야 한다
|
|
37
|
+
|
|
38
|
+
## Inputs
|
|
39
|
+
|
|
40
|
+
- 원본 `.hwp`, `.hwpx`, `.hwpml` 파일 경로 또는 폴더/글롭 경로
|
|
41
|
+
- 원하는 결과 형태: `markdown`, `json`, `hwpx`
|
|
42
|
+
- 출력 파일/디렉터리 경로
|
|
43
|
+
- 페이지 범위 지정 여부
|
|
44
|
+
- 비교 / 양식 필드 추출 / 역변환 여부
|
|
45
|
+
|
|
46
|
+
## Routing policy
|
|
47
|
+
|
|
48
|
+
### Default: `kordoc`
|
|
49
|
+
|
|
50
|
+
다음 작업은 모두 기본적으로 `kordoc`으로 처리한다.
|
|
51
|
+
|
|
52
|
+
- HWP/HWPX/HWPML → Markdown
|
|
53
|
+
- HWP/HWPX/HWPML → JSON (`blocks`, `metadata`)
|
|
54
|
+
- 배치 변환
|
|
55
|
+
- 페이지 범위 파싱
|
|
56
|
+
- 이미지/표/양식이 포함된 공문서 구조 추출
|
|
57
|
+
- 디렉터리 감시 변환 (`watch`)
|
|
58
|
+
- Markdown→HWPX 역변환
|
|
59
|
+
- HWPX 양식 필드 추출
|
|
60
|
+
|
|
61
|
+
### Optional library path
|
|
62
|
+
|
|
63
|
+
CLI만으로 부족하면 Node API를 사용한다.
|
|
64
|
+
|
|
65
|
+
- `parse()` — Markdown + 구조화 블록
|
|
66
|
+
- `compare()` — 신구 문서 비교
|
|
67
|
+
- `extractFormFields()` — 파싱된 블록에서 양식 필드 추출
|
|
68
|
+
- `markdownToHwpx()` — Markdown→HWPX 역변환
|
|
69
|
+
|
|
70
|
+
## Workflow
|
|
71
|
+
|
|
72
|
+
### 1. Prepare the CLI runtime
|
|
73
|
+
|
|
74
|
+
일회성 변환이면 둘 다 포함한 `npx` 형태를 바로 쓴다.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npx --yes --package kordoc --package pdfjs-dist kordoc --help
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
반복 실행용 전역 설치가 필요하면:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
npm install -g kordoc pdfjs-dist
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
현재 배포된 `kordoc` CLI는 `pdfjs-dist`가 없으면 `kordoc --help` 단계부터 실패하므로
|
|
87
|
+
깨끗한 환경에서는 두 패키지를 같이 설치한 뒤 실행한다.
|
|
88
|
+
|
|
89
|
+
### 2. Prepare a local project for Node API examples
|
|
90
|
+
|
|
91
|
+
`parse()`, `compare()`, `extractFormFields()`, `markdownToHwpx()` 같은 ESM 예시는
|
|
92
|
+
전역 `NODE_PATH`가 아니라 **로컬 프로젝트 설치** 기준으로 실행한다.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
mkdir -p ./kordoc-local && cd ./kordoc-local
|
|
96
|
+
npm init -y
|
|
97
|
+
npm install kordoc pdfjs-dist
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
이미 `package.json`이 있는 작업 디렉터리라면 `npm install kordoc pdfjs-dist`만 추가로 실행하면 된다.
|
|
101
|
+
|
|
102
|
+
### 3. Convert a document to Markdown
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
npx --yes --package kordoc --package pdfjs-dist kordoc 보고서.hwp -o 보고서.md
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
여러 문서를 한 번에 처리하려면:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
npx --yes --package kordoc --package pdfjs-dist kordoc ./문서함/* -d ./변환결과
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
특정 페이지 범위만 읽고 싶으면:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
npx --yes --package kordoc --package pdfjs-dist kordoc 보고서.hwp --pages 1-3
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 4. Extract structured JSON for AI/automation
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
npx --yes --package kordoc --package pdfjs-dist kordoc 검토서.hwpx --format json > 검토서.json
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
JSON 결과에서는 `success`, `markdown`, `blocks`, `metadata`를 우선 확인한다.
|
|
127
|
+
표나 이미지가 중요하면 `blocks` 안의 `table`, `image` 타입을 확인한다.
|
|
128
|
+
|
|
129
|
+
### 5. Inspect HWPX form fields from parsed blocks
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
node --input-type=module - <<'EOF'
|
|
133
|
+
import { parse, extractFormFields } from "kordoc";
|
|
134
|
+
|
|
135
|
+
const result = await parse("신청서.hwpx");
|
|
136
|
+
if (!result.success) {
|
|
137
|
+
console.error(result.error);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const fields = extractFormFields(result.blocks);
|
|
142
|
+
console.log(JSON.stringify(fields, null, 2));
|
|
143
|
+
EOF
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
자동 변환이 계속 들어오는 폴더면 CLI의 `watch` 명령을 쓴다.
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
npx --yes --package kordoc --package pdfjs-dist kordoc watch ./문서함
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 6. Reverse-convert Markdown back to HWPX
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
node --input-type=module - <<'EOF'
|
|
156
|
+
import { markdownToHwpx } from "kordoc";
|
|
157
|
+
import { writeFileSync } from "node:fs";
|
|
158
|
+
|
|
159
|
+
const hwpx = await markdownToHwpx("# 제목\n\n본문\n\n| 항목 | 값 |\n| --- | --- |\n| 성명 | 홍길동 |");
|
|
160
|
+
writeFileSync("출력.hwpx", Buffer.from(hwpx));
|
|
161
|
+
EOF
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 7. Compare two document versions when diff matters
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
node --input-type=module - <<'EOF'
|
|
168
|
+
import { compare } from "kordoc";
|
|
169
|
+
import { readFileSync } from "node:fs";
|
|
170
|
+
|
|
171
|
+
const before = readFileSync("이전버전.hwp");
|
|
172
|
+
const after = readFileSync("최신버전.hwpx");
|
|
173
|
+
const diff = await compare(before, after);
|
|
174
|
+
console.log(diff.stats);
|
|
175
|
+
EOF
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Verify outputs after every run
|
|
179
|
+
|
|
180
|
+
- Markdown: 파일이 생성되었고 제목/본문/표 구조가 깨지지 않았는지 확인
|
|
181
|
+
- JSON: `success: true` 와 `blocks` / `metadata` 존재 여부 확인
|
|
182
|
+
- 배치 처리: 입력 수와 출력 수가 크게 어긋나지 않는지 확인
|
|
183
|
+
- 양식 필드 추출: `extractFormFields(result.blocks)` 결과가 비어 있지 않은지 확인
|
|
184
|
+
- 역변환: 생성된 `.hwpx` 파일이 열리고 기본 서식/테이블 구조가 유지되는지 확인
|
|
185
|
+
- 비교: `diff.stats` 에 added / removed / modified 값이 합리적인지 확인
|
|
186
|
+
|
|
187
|
+
## Done when
|
|
188
|
+
|
|
189
|
+
- 요청한 Markdown / JSON / HWPX 결과물이 생성되어 있다
|
|
190
|
+
- 공문서 표·이미지·메타데이터가 필요한 수준으로 확인되어 있다
|
|
191
|
+
- 양식 필드 추출이나 역변환 요청이 있었다면 결과/출력 구조까지 검증되어 있다
|
|
192
|
+
- 배치 요청이면 처리 범위와 실패 건수가 정리되어 있다
|
|
193
|
+
|
|
194
|
+
## Failure modes
|
|
195
|
+
|
|
196
|
+
- 손상된 HWP/HWPX/HWPML 파일
|
|
197
|
+
- 암호화/배포 제한 문서에서 일부 파싱 한계 발생
|
|
198
|
+
- 이미지 기반 PDF인데 OCR provider가 없음
|
|
199
|
+
- 출력 디렉터리 권한 부족
|
|
200
|
+
- 양식 라벨이 템플릿 안에서 예상과 다르게 배치되어 일부 필드가 인식되지 않음
|
|
201
|
+
|
|
202
|
+
## Notes
|
|
203
|
+
|
|
204
|
+
- `kordoc`은 HWP/HWPX뿐 아니라 HWPML, PDF, XLSX, DOCX도 함께 다룬다.
|
|
205
|
+
- 기본 목적은 **AI가 읽을 수 있는 Markdown/JSON 변환** 이다.
|
|
206
|
+
- 현재 배포본 기준으로 문서화된 CLI 명령은 기본 변환과 `watch` 이며, 양식 처리는 `extractFormFields()` 같은 Node API로 연결한다.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "hwp",
|
|
3
|
+
"description": "Use kordoc for agent-native HWP/HWPX document parsing, JSON extraction, diffing, form-field extraction, and Markdown→HWPX reverse conversion (read/convert only — for binary editing use rhwp-edit).",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"local"
|
|
6
|
+
],
|
|
7
|
+
"frontmatter": "name: hwp\ndescription: Use kordoc for agent-native HWP/HWPX document parsing, JSON extraction, diffing, form-field extraction, and Markdown→HWPX reverse conversion (read/convert only — for binary editing use rhwp-edit).\nlicense: MIT\nmetadata:\n category: documents\n locale: ko-KR\n phase: v1"
|
|
8
|
+
}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Intercity Bus Booking (Tmoney 시외버스)
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Use this skill for Korean 시외버스 timetable lookup and reservation assistance via the official Tmoney intercity bus site. Prefer HTTP/API-first flows for route lookup, timetable search, fare/seat-stage entry, and checkout-entry handoff.
|
|
6
|
+
|
|
7
|
+
Keep 시외버스 separate from 고속버스. Tmoney terminal codes and POST flows are different from KOBUS 고속버스. Use `express-bus-booking` for KOBUS routes.
|
|
8
|
+
|
|
9
|
+
## When to Use
|
|
10
|
+
|
|
11
|
+
- The user asks for `시외버스 예매`, `시외버스 시간표`, `시외버스 예약`, or a known 시외버스 route.
|
|
12
|
+
- The user names 티머니/Tmoney/시외버스 통합예매.
|
|
13
|
+
- The task is to present timetable candidates, check remaining seats/fares, or assist up to the official card-information page.
|
|
14
|
+
|
|
15
|
+
Do **not** use this for:
|
|
16
|
+
|
|
17
|
+
- 고속버스/KOBUS routes — use `express-bus-booking`.
|
|
18
|
+
- Final card submission or payment unless the user explicitly confirms the exact action.
|
|
19
|
+
- Browser automation as the first option when HTTP endpoints are available.
|
|
20
|
+
|
|
21
|
+
## Core Principles
|
|
22
|
+
|
|
23
|
+
- Use official Tmoney 시외버스 surfaces: `https://intercitybus.tmoney.co.kr`.
|
|
24
|
+
- Use cookies, referers, and a normal browser User-Agent.
|
|
25
|
+
- Default scope is lookup and assisted manual checkout: timetable, fare/seat stage, selected-seat temporary hold, and official card-information page handoff.
|
|
26
|
+
- Do not submit card fields, final payment, or irreversible reservation steps without explicit confirmation.
|
|
27
|
+
- If a test or user-abandoned hold is created, use the official cancellation/back flow when available.
|
|
28
|
+
|
|
29
|
+
## Known HTTP Flow
|
|
30
|
+
|
|
31
|
+
See `references/tmoney-intercity-http-flow.md` for session-proven endpoint details and parameter examples.
|
|
32
|
+
|
|
33
|
+
### 1. Start a Session
|
|
34
|
+
|
|
35
|
+
Fetch a landing or booking-entry page with cookies enabled:
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
GET https://intercitybus.tmoney.co.kr/
|
|
39
|
+
GET https://intercitybus.tmoney.co.kr/otck/trmlInfEnty.do
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### 2. Query Timetable
|
|
43
|
+
|
|
44
|
+
```text
|
|
45
|
+
POST /otck/readAlcnList.do
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Typical fields include:
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
depr_Trml_Cd=0511601
|
|
52
|
+
arvl_Trml_Cd=2482701
|
|
53
|
+
depr_Trml_Nm=동서울
|
|
54
|
+
arvl_Trml_Nm=속초
|
|
55
|
+
ig=1
|
|
56
|
+
im=0
|
|
57
|
+
ic=0
|
|
58
|
+
iv=0
|
|
59
|
+
depr_Dt=YYYYMMDD
|
|
60
|
+
depr_Time=000000
|
|
61
|
+
bef_Aft_Dvs=D
|
|
62
|
+
req_Rec_Num=10
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`bef_Aft_Dvs` and `req_Rec_Num` are required hidden fields from the browser JavaScript `readAlcnListEntry(...)`. If they are omitted, Tmoney can return a generic error page with no schedules.
|
|
66
|
+
|
|
67
|
+
Parse schedule buttons/rows. The next-stage parameters are often embedded in `readSasFeeInf(...)` onclick arguments.
|
|
68
|
+
|
|
69
|
+
### 3. Enter Fare / Seat-Count Stage
|
|
70
|
+
|
|
71
|
+
```text
|
|
72
|
+
POST /otck/readSatsFee.do
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Send selected values from `readSasFeeInf(...)` plus passenger counts and original search fields. The response should include `form#readPcpySats` and hidden values such as:
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
rot_Id
|
|
79
|
+
alcn_Sqno
|
|
80
|
+
depr_Trml_Cd
|
|
81
|
+
arvl_Trml_Cd
|
|
82
|
+
depr_Time
|
|
83
|
+
igFee
|
|
84
|
+
imFee
|
|
85
|
+
icFee
|
|
86
|
+
total
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 4. Temporary Hold and Card-Information Entry
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
POST /otck/readPcpySats.do
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Submit the `readPcpySats` hidden fields plus selected seat/count fields, commonly including:
|
|
96
|
+
|
|
97
|
+
```text
|
|
98
|
+
pcpy_Num
|
|
99
|
+
sats_No
|
|
100
|
+
bus_Tck_Knd_Cd
|
|
101
|
+
cty_Bus_Dc_Knd_Cd
|
|
102
|
+
dcrt_Dvs_Cd
|
|
103
|
+
rtrp_Depr_Dt
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
A successful response lands on the official `카드정보 입력` page and includes a temporary seat hold identifier such as `sats_Pcpy_Id`.
|
|
107
|
+
|
|
108
|
+
## Timetable Helper
|
|
109
|
+
|
|
110
|
+
For read-only timetable lookup, use the bundled helper before attempting browser automation:
|
|
111
|
+
|
|
112
|
+
```bash
|
|
113
|
+
python3 intercity-bus-booking/scripts/intercity_bus_search.py \
|
|
114
|
+
--depart-code 0511601 \
|
|
115
|
+
--arrive-code 2482701 \
|
|
116
|
+
--depart-name 동서울 \
|
|
117
|
+
--arrive-name 속초 \
|
|
118
|
+
--date 20260520
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
The helper starts a cookie-backed session, posts the browser-required timetable fields, parses `readSasFeeInf(...)`, and prints JSON with departure time, company, class, fares, and remaining/total seats. By default it is read-only. With `--hold-seat <seatNo>` or `--hold-first-seat`, it enters `readSatsFee.do`, posts `readPcpySats.do`, and saves the official Tmoney card-information HTML page plus cancel/back fields. It still never submits card data or final payment.
|
|
122
|
+
|
|
123
|
+
### Temporary Hold Helper
|
|
124
|
+
|
|
125
|
+
To create a temporary hold and save the official card-information page:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
python3 intercity-bus-booking/scripts/intercity_bus_search.py \
|
|
129
|
+
--depart-code 0511601 \
|
|
130
|
+
--arrive-code 2482701 \
|
|
131
|
+
--depart-name 동서울 \
|
|
132
|
+
--arrive-name 속초 \
|
|
133
|
+
--date 20260520 \
|
|
134
|
+
--select-index 1 \
|
|
135
|
+
--hold-first-seat \
|
|
136
|
+
--output-dir /tmp/tmoney-hold
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Success requires `hold.success=true`, a `sats_Pcpy_Id`, and the saved page containing `카드정보 입력`. The saved cancel fields can be posted back to `/otck/readSatsFee.do` with `pcpyCanc=C` to abandon the hold. Live probes did not expose an exact countdown on the card-information page; treat the hold as short-lived and have the user complete payment immediately.
|
|
140
|
+
|
|
141
|
+
## Checkout-Entry Link Helper
|
|
142
|
+
|
|
143
|
+
A helper-served HTML page can auto-submit a POST form directly to:
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
https://intercitybus.tmoney.co.kr/otck/readPcpySats.do
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
This creates the hold in the user's browser/session and opens the official Tmoney card-information page. The user should manually finish payment on the official page.
|
|
150
|
+
|
|
151
|
+
For Discord/mobile, provide helper links as normal text links rather than fenced code blocks so the user can tap them.
|
|
152
|
+
|
|
153
|
+
## Mobile and In-App Browser Notes
|
|
154
|
+
|
|
155
|
+
Tmoney 시외버스 is more mobile-tolerant than KOBUS in the tested flow: an iPhone Safari-style mobile User-Agent returned the official `카드정보 입력` page with `sats_Pcpy_Id` present.
|
|
156
|
+
|
|
157
|
+
However, in-app browser User-Agents can behave differently or fail if the same seat/hold payload is replayed. If a Discord/Android in-app test returns a generic error such as `발행을 실패하였습니다`, do not assume route lookup is broken. Recreate a fresh hold payload, retry once in an external browser, and cancel stale holds.
|
|
158
|
+
|
|
159
|
+
## Suggested Output Format
|
|
160
|
+
|
|
161
|
+
Keep candidate lists concise:
|
|
162
|
+
|
|
163
|
+
```text
|
|
164
|
+
시외버스 동서울 → 속초 / 2026-05-09
|
|
165
|
+
1. 06:05 우등 / 금강고속 / 잔여 8석 / 성인 21,300원
|
|
166
|
+
2. ...
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
When a checkout-entry helper is created, say that it opens the official Tmoney card-information page and that payment remains manual.
|
|
170
|
+
|
|
171
|
+
## Common Pitfalls
|
|
172
|
+
|
|
173
|
+
1. **Mixing terminal code systems.** Tmoney 시외버스 codes are not KOBUS codes.
|
|
174
|
+
2. **Assuming checkout-entry equals final payment.** `readPcpySats.do` can open the card-information page, but final payment remains a separate manual step.
|
|
175
|
+
3. **Omitting hidden timetable fields.** `readAlcnList.do` needs `bef_Aft_Dvs=D` and `req_Rec_Num=10`; without them it may return a generic `errorCont` page of about 13 KB instead of schedule rows.
|
|
176
|
+
4. **Replaying stale hold payloads.** A repeated POST for the same route/seat can fail or create confusing results. Generate a fresh seat-stage payload for real use.
|
|
177
|
+
5. **Skipping cancellation/back flow.** Use the official cancellation/back form (`pcpyCanc=C` via `readSatsFee.do` when available) for abandoned holds.
|
|
178
|
+
6. **Overusing browser automation.** Use browser only for endpoint discovery or visual verification after HTTP probing.
|
|
179
|
+
|
|
180
|
+
## Verification Checklist
|
|
181
|
+
|
|
182
|
+
- [ ] Route/terminal codes were resolved from Tmoney 시외버스, not guessed or copied from KOBUS.
|
|
183
|
+
- [ ] Timetable POST included `bef_Aft_Dvs=D` and `req_Rec_Num=10`.
|
|
184
|
+
- [ ] Timetable response was parsed for schedule rows/buttons and next-stage parameters.
|
|
185
|
+
- [ ] Fare/seat-stage response contains `form#readPcpySats` and expected hidden fields.
|
|
186
|
+
- [ ] Checkout-entry response contains `카드정보 입력` and a hold identifier such as `sats_Pcpy_Id` before reporting success.
|
|
187
|
+
- [ ] Stale/test holds were released through the official cancellation/back flow where possible.
|
|
188
|
+
- [ ] Payment/card submission was left to the user unless explicitly confirmed.
|
|
189
|
+
- [ ] Mobile links are provided as tappable text links on Discord/mobile platforms.
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Tmoney 시외버스 HTTP/API Probe Notes
|
|
2
|
+
|
|
3
|
+
Session-proven on 2026-05-08 and re-verified on 2026-05-13. Goal: avoid browser automation where possible.
|
|
4
|
+
|
|
5
|
+
## Base
|
|
6
|
+
|
|
7
|
+
```text
|
|
8
|
+
https://intercitybus.tmoney.co.kr
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Use a normal browser User-Agent, cookie jar, and referers.
|
|
12
|
+
|
|
13
|
+
## Tested Flow
|
|
14
|
+
|
|
15
|
+
### Timetable
|
|
16
|
+
|
|
17
|
+
```text
|
|
18
|
+
POST /otck/readAlcnList.do
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Example tested route/date:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
동서울(0511601) -> 속초(2482701), 2026-05-09
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Observed results:
|
|
28
|
+
|
|
29
|
+
```text
|
|
30
|
+
2026-05-09: 14 reservation buttons/schedules
|
|
31
|
+
2026-05-20: 20 readSasFeeInf schedule buttons, first departure 06:05 금강고속 우등, 24/28 seats
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Typical POST fields:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
depr_Trml_Cd=0511601
|
|
38
|
+
arvl_Trml_Cd=2482701
|
|
39
|
+
depr_Trml_Nm=동서울
|
|
40
|
+
arvl_Trml_Nm=속초
|
|
41
|
+
ig=1
|
|
42
|
+
im=0
|
|
43
|
+
ic=0
|
|
44
|
+
iv=0
|
|
45
|
+
depr_Dt=YYYYMMDD
|
|
46
|
+
depr_Time=000000
|
|
47
|
+
bef_Aft_Dvs=D
|
|
48
|
+
req_Rec_Num=10
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
`bef_Aft_Dvs=D` and `req_Rec_Num=10` are not optional. They are appended by the site JavaScript (`readAlcnListEntry(bef_Aft_Dvs, req_Rec_Num)`) before the browser submits `#onewayInfo`. Omitting them returned a generic error page (`errorCont`, about 13,770 bytes) with no `readSasFeeInf(...)` schedules in live probing.
|
|
52
|
+
|
|
53
|
+
The next-stage values are embedded in `readSasFeeInf(...)` onclick calls. Example prefix:
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
readSasFeeInf('RT201603150047276','1','20260509','1','0511601','2482701','동서울','속초','060500','C004','IDP','금강고속','우등','1','0','0','8','28', ...)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Fare / Seat-Count Stage
|
|
60
|
+
|
|
61
|
+
```text
|
|
62
|
+
POST /otck/readSatsFee.do
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Send selected values from `readSasFeeInf(...)` plus passenger counts and original search fields.
|
|
66
|
+
|
|
67
|
+
Observed response contained `form#readPcpySats` and hidden values:
|
|
68
|
+
|
|
69
|
+
```json
|
|
70
|
+
{
|
|
71
|
+
"rot_Id": "RT201603150047276",
|
|
72
|
+
"alcn_Sqno": "1",
|
|
73
|
+
"depr_Trml_Cd": "0511601",
|
|
74
|
+
"arvl_Trml_Cd": "2482701",
|
|
75
|
+
"depr_Time": "060500",
|
|
76
|
+
"igFee": "21300",
|
|
77
|
+
"imFee": "17000",
|
|
78
|
+
"icFee": "10700",
|
|
79
|
+
"total": "21300"
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Temporary Hold / Card-Information Entry
|
|
84
|
+
|
|
85
|
+
```text
|
|
86
|
+
POST /otck/readPcpySats.do
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Send `readPcpySats` hidden fields plus selected seat fields:
|
|
90
|
+
|
|
91
|
+
```text
|
|
92
|
+
pcpy_Num
|
|
93
|
+
sats_No
|
|
94
|
+
bus_Tck_Knd_Cd
|
|
95
|
+
cty_Bus_Dc_Knd_Cd
|
|
96
|
+
dcrt_Dvs_Cd
|
|
97
|
+
rtrp_Depr_Dt
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Observed success markers:
|
|
101
|
+
|
|
102
|
+
```text
|
|
103
|
+
카드정보 입력
|
|
104
|
+
sats_Pcpy_Id
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Re-verified on 2026-05-13 with 동서울 -> 속초, 2026-05-20, 06:05 금강고속 우등, seat 1. `readPcpySats.do` returned `카드정보 입력` and `sats_Pcpy_Id=SP...`. Posting the resulting cancel/back fields with `pcpyCanc=C` to `/otck/readSatsFee.do` returned to the seat-selection page and subsequent timetable lookup still showed 24/28 seats.
|
|
108
|
+
|
|
109
|
+
### Cancellation / Back Flow
|
|
110
|
+
|
|
111
|
+
A POST back to `/otck/readSatsFee.do` with `pcpyCanc=C` and the hold fields returned to seat selection and appeared to release the temporary hold in testing.
|
|
112
|
+
|
|
113
|
+
## Mobile Notes
|
|
114
|
+
|
|
115
|
+
- iPhone Safari-style mobile User-Agent returned HTTP 200 with `카드정보 입력` and `sats_Pcpy_Id` present.
|
|
116
|
+
- A replayed Discord/Android in-app User-Agent test returned a generic `발행을 실패하였습니다` page. Because the same seat/hold payload had already been used, treat this as a stale/replayed hold caveat rather than proof that mobile is unsupported.
|
|
117
|
+
- For real use, generate a fresh hold payload, send a helper link, and ask the user to open it in an external browser if an in-app browser fails.
|
|
118
|
+
|
|
119
|
+
## Interpretation
|
|
120
|
+
|
|
121
|
+
- Login was not required for timetable lookup, fare/seat-stage entry, or card-information page entry in the tested flow.
|
|
122
|
+
- CAPTCHA was not observed in the tested flow.
|
|
123
|
+
- A generic `errorCont` response usually means the posted form contract is incomplete, not necessarily that the route is unavailable; first verify `bef_Aft_Dvs` and `req_Rec_Num`.
|
|
124
|
+
- Payment/card-info submission is separate and should not be automated without explicit confirmation.
|
|
125
|
+
- The live card-information page did not expose an exact countdown/expiry text in probes. Treat temporary holds as short-lived: hand off immediately, and post the cancel/back fields for abandoned holds.
|
|
126
|
+
- Terminal codes are Tmoney-specific and must not be mixed with KOBUS codes.
|