@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,66 @@
|
|
|
1
|
+
# S2B Notice Search
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
S2B 학교장터(`www.s2b.kr`)의 공개 고객 공고/견적요청 표면에서 학교·교육기관 관련 물품, 공사, 용역 공고를 조회하는 read-only 스킬이다.
|
|
6
|
+
|
|
7
|
+
- 키워드, 기관명, 지역, 게시일 범위, 물품/공사/용역, 1인/2인 수의계약 조건을 정규화한다.
|
|
8
|
+
- `/S2BNCustomer/tcmo001.do` 검색 폼에 보낼 실제 `tcmo001Form` POST form recipe를 만든다.
|
|
9
|
+
- 목록 fixture HTML에서 공고/견적 코드, 제목, 기관, 상태, 품목구분, 게시일, 마감일, 상세 JavaScript action metadata를 추출한다.
|
|
10
|
+
- 상세 fixture HTML에서 제목, 공고번호, 기관명, 품목구분, 계약방법, 게시일, 마감일, 본문, 첨부 action metadata를 추출한다.
|
|
11
|
+
|
|
12
|
+
입찰 참여, 견적 제출, 로그인, 결제, 낙찰/계약 처리 자동화는 하지 않는다.
|
|
13
|
+
|
|
14
|
+
## Public path discovered from Aside
|
|
15
|
+
|
|
16
|
+
Aside Browser로 S2B 공개 고객 화면을 확인할 때 우선 진입점은 다음이다.
|
|
17
|
+
|
|
18
|
+
```text
|
|
19
|
+
https://www.s2b.kr/S2BNCustomer/tcmo001.do
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
이 화면은 학교장터 고객용 공고/견적요청 조회 폼으로 동작하며, 브라우저에서 검색 조건을 채운 뒤 폼 제출 결과 표와 상세 이동 JavaScript action을 관찰한다. 확인된 form 이름은 `tcmo001Form`이고 주요 field는 `forwardName=list01`, `pageNo`, `search_yn=Y`, `process_yn=Y`, `tender_sep1`, `tender_name`, `company_name_s`, `tender_sep2`, `tender_date_start`, `tender_date_end`, `tender_item`, `estimate_kind`, `areaKind`다.
|
|
23
|
+
|
|
24
|
+
## Fallback order
|
|
25
|
+
|
|
26
|
+
1. Aside Browser REPL snapshot/action: 공개 페이지를 열고 snapshot으로 검색 폼과 결과 테이블을 확인한 뒤, 입력/제출/action metadata를 브라우저 표면에서 읽는다.
|
|
27
|
+
2. BrowserOS CDP 또는 로컬 브라우저: Aside를 사용할 수 없으면 사용자가 띄운 BrowserOS 세션에 CDP로 붙거나 로컬 브라우저로 `https://www.s2b.kr/S2BNCustomer/tcmo001.do`를 열고 검색 폼을 제출한 뒤 렌더링된 목록/상세 HTML을 파싱한다.
|
|
28
|
+
3. Direct HTTP best-effort: 같은 session cookie, referer, form token 조건이 브라우저와 동일하게 동작할 때만 `/S2BNCustomer/tcmo001.do`에 POST form body를 보낸다. session/form이 맞지 않으면 브라우저 경로로 돌아간다.
|
|
29
|
+
|
|
30
|
+
## Inputs
|
|
31
|
+
|
|
32
|
+
| Input | Values |
|
|
33
|
+
| --- | --- |
|
|
34
|
+
| `keyword` | 검색어 |
|
|
35
|
+
| `organization` | 기관/학교명 |
|
|
36
|
+
| `dateStart`, `dateEnd` | `YYYYMMDD` 또는 `YYYY-MM-DD`; 3 calendar months 초과 금지 |
|
|
37
|
+
| `itemType` | `물품`, `공사`, `용역`, `all` |
|
|
38
|
+
| `privateContract` | `1인`, `2인`, `all` |
|
|
39
|
+
| `region` | 지역명 |
|
|
40
|
+
| `page` | 1 이상의 정수 |
|
|
41
|
+
|
|
42
|
+
## Package use
|
|
43
|
+
|
|
44
|
+
```js
|
|
45
|
+
const {
|
|
46
|
+
buildBrowserAutomationInstructions,
|
|
47
|
+
buildSearchRequest,
|
|
48
|
+
normalizeSearchOptions,
|
|
49
|
+
parseDetailHtml,
|
|
50
|
+
parseListHtml
|
|
51
|
+
} = require("s2b-notice-search")
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Failure modes
|
|
55
|
+
|
|
56
|
+
- malformed curl/client error: form body, cookies, referer, encoding, or client timeout이 잘못되어 S2B가 정상 HTML을 반환하지 않는다.
|
|
57
|
+
- login/CAPTCHA/blocked: 로그인 벽, CAPTCHA, 차단/점검/보안 페이지가 나오면 우회하지 않고 실패로 분류한다.
|
|
58
|
+
- empty: 검색 조건이 실제로 결과 없음이거나 session/form state가 맞지 않아 빈 목록이 반환된다.
|
|
59
|
+
- upstream markup change: S2B table, 상세 action, hidden input, JavaScript 함수명이 바뀌면 파싱 결과가 부분적이거나 비어 있을 수 있다.
|
|
60
|
+
|
|
61
|
+
## Done when
|
|
62
|
+
|
|
63
|
+
- Aside Browser 또는 fallback browser에서 공개 S2B 조회 표면을 열었다.
|
|
64
|
+
- 검색 기간이 유효하고 3 calendar months를 넘지 않는다.
|
|
65
|
+
- 목록/상세 fixture parser가 필요한 필드를 추출했다.
|
|
66
|
+
- 결과는 read-only lookup으로만 사용하고 제출/계약/로그인 자동화는 하지 않았다.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "s2b-notice-search",
|
|
3
|
+
"description": "S2B 학교장터 공개 고객 공고/견적요청 목록을 브라우저 우선으로 조회하고 fixture HTML을 파싱해 공고 메타데이터를 정리한다. 돌쇠에서는 가능한 가장 가까운 합법적 공식 단계까지 준비한다.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"browser",
|
|
6
|
+
"hard-boundary"
|
|
7
|
+
],
|
|
8
|
+
"frontmatter": "name: s2b-notice-search\ndescription: S2B 학교장터 공개 고객 공고/견적요청 목록을 브라우저 우선으로 조회하고 fixture HTML을 파싱해 공고 메타데이터를 정리한다. 돌쇠에서는 가능한 가장 가까운 합법적 공식 단계까지 준비한다.\nlicense: MIT\nmetadata:\n category: procurement\n locale: ko-KR\n phase: v1"
|
|
9
|
+
}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# Saju Fortune
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
`saju-fortune` npm package로 사주팔자 기본 구조, 오행 분포, 용신 조율점, 주제별 운세, 궁합 풀이를 제공한다. 사용자를 바로 점치는 대신 먼저 필요한 정보를 인터뷰하고, 패키지 결과를 근거로 사주 풀이 에이전트처럼 대화한다.
|
|
6
|
+
|
|
7
|
+
이 스킬은 `hjsh200219/fortuneteller` MCP 서버의 도구 모델(`analyze_saju`, `check_compatibility`, `get_daily_fortune`, `get_dae_un`, `get_fortune_by_period`)을 참고하지만 **MCP 서버를 따로 실행하지 않는다**. 에이전트는 로컬/전역 npm package를 직접 호출한다.
|
|
8
|
+
|
|
9
|
+
## When to use
|
|
10
|
+
|
|
11
|
+
- "사주 봐줘"
|
|
12
|
+
- "올해 운세 어때?"
|
|
13
|
+
- "연애운/재물운/직업운/건강운 봐줘"
|
|
14
|
+
- "우리 궁합 봐줘"
|
|
15
|
+
- "생년월일시로 사주팔자 풀이해줘"
|
|
16
|
+
|
|
17
|
+
## When not to use
|
|
18
|
+
|
|
19
|
+
- 의학적 진단, 투자 수익 보장, 법적 판단처럼 전문 책임이 필요한 결정을 대신해야 하는 경우
|
|
20
|
+
- 사용자가 출생 정보를 제공하지 않고 사주 계산 없이 일반 조언만 원하는 경우
|
|
21
|
+
- 사주 풀이를 사실 확정이나 운명 결정론으로 제시해야 하는 경우
|
|
22
|
+
|
|
23
|
+
## Prerequisites
|
|
24
|
+
|
|
25
|
+
- Node.js 18+
|
|
26
|
+
- 배포 후: `npm install -g saju-fortune`
|
|
27
|
+
- 실행 전: `export NODE_PATH="$(npm root -g)"`
|
|
28
|
+
- 이 저장소에서 개발할 때: 루트에서 `npm install`
|
|
29
|
+
|
|
30
|
+
## Required interview inputs
|
|
31
|
+
|
|
32
|
+
사주 계산 전에 아래를 확인한다.
|
|
33
|
+
|
|
34
|
+
1. 이름(선택)과 한자 이름(선택)
|
|
35
|
+
2. 양력/음력
|
|
36
|
+
3. 생년월일 (`YYYY-MM-DD`)
|
|
37
|
+
4. 태어난 시간 (`HH:mm`, 모르면 모른다고 기록하고 시간 정확도 한계를 설명)
|
|
38
|
+
5. 성별 (`male` 또는 `female`으로 package 호출)
|
|
39
|
+
6. 출생 시군구(선택, 모르면 생략)
|
|
40
|
+
7. 보고 싶은 주제: 종합운, 연애운, 재물운, 직업운, 건강운, 한해 운세, 궁합
|
|
41
|
+
|
|
42
|
+
궁합은 두 사람 각각의 생년월일시와 성별을 확인한다.
|
|
43
|
+
|
|
44
|
+
## Workflow
|
|
45
|
+
|
|
46
|
+
### 1. Interview first
|
|
47
|
+
|
|
48
|
+
정보가 부족하면 풀이를 시작하지 말고 짧게 묻는다.
|
|
49
|
+
|
|
50
|
+
권장 질문:
|
|
51
|
+
|
|
52
|
+
```text
|
|
53
|
+
사주 풀이를 위해 양력/음력, 생년월일, 태어난 시간, 성별을 알려주세요. 보고 싶은 주제도 골라주세요: 연애운, 재물운, 직업운, 건강운, 한해 운세, 궁합.
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
태어난 시간을 모르면:
|
|
57
|
+
|
|
58
|
+
```text
|
|
59
|
+
태어난 시간을 모르면 시주는 확정하지 못해요. 가능한 시간대가 있으면 알려주시고, 없으면 연·월·일 중심의 보수적 풀이로 진행할게요.
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
음력 생일이면 이 패키지 안에서 변환하지 않는다. 검증된 만세력으로 양력 생년월일을 먼저 확인한 뒤 `calendar: "solar"`로 호출하고, 변환 근거와 윤달 여부를 한계로 적는다.
|
|
63
|
+
|
|
64
|
+
### 2. Install package when missing
|
|
65
|
+
|
|
66
|
+
`node -e 'require("saju-fortune")'`가 실패하면 다른 웹 스크래핑이나 MCP 서버 실행으로 우회하지 말고 전역 package 설치를 먼저 시도한다.
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
npm install -g saju-fortune
|
|
70
|
+
export NODE_PATH="$(npm root -g)"
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 3. Analyze one person's saju
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
NODE_PATH="$(npm root -g)" node - <<'JS'
|
|
77
|
+
const { analyzeSaju } = require("saju-fortune")
|
|
78
|
+
|
|
79
|
+
const result = analyzeSaju({
|
|
80
|
+
name: "민준",
|
|
81
|
+
birthDate: "1990-03-15",
|
|
82
|
+
birthTime: "10:30",
|
|
83
|
+
calendar: "solar", // 음력은 검증된 만세력으로 양력 변환 후 입력
|
|
84
|
+
gender: "male",
|
|
85
|
+
birthCity: "서울"
|
|
86
|
+
}, {
|
|
87
|
+
analysisType: "fortune",
|
|
88
|
+
fortuneType: "wealth",
|
|
89
|
+
targetYear: 2026
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
console.log(JSON.stringify(result, null, 2))
|
|
93
|
+
JS
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`fortuneType` mapping:
|
|
97
|
+
|
|
98
|
+
- 종합운: `general`
|
|
99
|
+
- 연애운: `love`
|
|
100
|
+
- 재물운: `wealth`
|
|
101
|
+
- 직업운: `career`
|
|
102
|
+
- 건강운: `health`
|
|
103
|
+
- 한해 운세: `general` + `targetYear`
|
|
104
|
+
|
|
105
|
+
### 4. Check compatibility
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
NODE_PATH="$(npm root -g)" node - <<'JS'
|
|
109
|
+
const { checkCompatibility } = require("saju-fortune")
|
|
110
|
+
|
|
111
|
+
const result = checkCompatibility({
|
|
112
|
+
person1: { name: "민준", birthDate: "1990-03-15", birthTime: "10:30", gender: "male" },
|
|
113
|
+
person2: { name: "서연", birthDate: "1992-07-20", birthTime: "14:30", gender: "female" }
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
console.log(JSON.stringify(result, null, 2))
|
|
117
|
+
JS
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
### 5. MCP-style tool names without serving MCP
|
|
121
|
+
|
|
122
|
+
패키지는 upstream MCP 서버의 대표 도구명을 로컬 함수로 흉내 낸다. MCP 서버를 따로 띄우지 않는다.
|
|
123
|
+
|
|
124
|
+
```js
|
|
125
|
+
const { callSajuTool } = require("saju-fortune")
|
|
126
|
+
|
|
127
|
+
const result = callSajuTool("analyze_saju", {
|
|
128
|
+
birthDate: "1990-03-15",
|
|
129
|
+
birthTime: "10:30",
|
|
130
|
+
gender: "male",
|
|
131
|
+
analysisType: "fortune",
|
|
132
|
+
fortuneType: "love"
|
|
133
|
+
})
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
지원 도구명:
|
|
137
|
+
|
|
138
|
+
- `analyze_saju`
|
|
139
|
+
- `check_compatibility`
|
|
140
|
+
- `get_daily_fortune`
|
|
141
|
+
- `get_dae_un`
|
|
142
|
+
- `get_fortune_by_period`
|
|
143
|
+
- `convert_calendar`
|
|
144
|
+
- `manage_settings`
|
|
145
|
+
|
|
146
|
+
### 6. Interpret like a fortune-reading agent
|
|
147
|
+
|
|
148
|
+
응답은 아래 구조를 따른다.
|
|
149
|
+
|
|
150
|
+
1. 입력 정보와 정확도 한계: 양력/음력, 시간, 출생지 누락 여부를 확인한다.
|
|
151
|
+
2. 사주팔자 요약: 연주·월주·일주·시주와 일간을 짧게 설명한다.
|
|
152
|
+
3. 오행 분포: 강한 오행과 부족한 오행을 생활 언어로 번역한다.
|
|
153
|
+
4. 주제별 풀이: 연애운/재물운/직업운/건강운/한해 운세 중 사용자가 고른 주제만 깊게 본다.
|
|
154
|
+
5. 실천 조언: 결정론 대신 대화, 습관, 리스크 관리 조언을 준다.
|
|
155
|
+
6. 주의 문구: 사주 풀이는 재미와 자기점검용이며 의료·투자·법률 판단을 대신하지 않는다고 말한다.
|
|
156
|
+
|
|
157
|
+
## Done when
|
|
158
|
+
|
|
159
|
+
- 필요한 출생 정보를 인터뷰로 확인했다.
|
|
160
|
+
- `saju-fortune` package 결과를 근거로 사주팔자와 오행 분포를 확인했다.
|
|
161
|
+
- 사용자가 요청한 주제(연애운, 재물운, 한해 운세 등)에 맞춰 풀이했다.
|
|
162
|
+
- 모르는 시간, 음력 윤달, 출생지 누락 같은 한계를 명시했다.
|
|
163
|
+
- MCP 서버를 실행하거나 별도 서버를 서빙하지 않았다.
|
|
164
|
+
|
|
165
|
+
## Failure modes
|
|
166
|
+
|
|
167
|
+
- 태어난 시간이 없으면 시주와 시주 기반 해석은 확정할 수 없다.
|
|
168
|
+
- 음력 또는 윤달 생일은 내장 계산으로 변환하지 않는다. 검증된 만세력으로 양력 날짜를 먼저 확인하지 못하면 풀이하지 않는다.
|
|
169
|
+
- 출생지가 없으면 경도 보정은 생략되거나 기본값으로 해석된다.
|
|
170
|
+
- package가 설치되지 않았고 네트워크도 없으면 설치 실패를 설명하고 진행하지 않는다.
|
|
171
|
+
- 사주 풀이는 전통 해석 기반의 참고 자료이며 의료, 투자, 법률, 안전 결정을 대체하지 않는다.
|
|
172
|
+
|
|
173
|
+
## Notes
|
|
174
|
+
|
|
175
|
+
- 입력한 생년월일시는 풀이 중에만 사용하고 영구 저장하지 않는다.
|
|
176
|
+
- 사용자가 불안해할 만한 단정적 흉언, 저주, 사망 예언, 질병 확정 표현은 하지 않는다.
|
|
177
|
+
- 궁합 점수는 관계 대화의 참고자료일 뿐 이별/결혼 결정을 대신하지 않는다.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "saju-fortune",
|
|
3
|
+
"description": "사주팔자 정보를 인터뷰로 확인한 뒤 saju-fortune npm package를 사용해 연애운, 재물운, 직업운, 건강운, 한해 운세, 궁합을 대화형으로 풀이한다.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"local"
|
|
6
|
+
],
|
|
7
|
+
"frontmatter": "name: saju-fortune\ndescription: 사주팔자 정보를 인터뷰로 확인한 뒤 saju-fortune npm package를 사용해 연애운, 재물운, 직업운, 건강운, 한해 운세, 궁합을 대화형으로 풀이한다.\nlicense: MIT\nmetadata:\n category: utility\n locale: ko-KR\n phase: v1"
|
|
8
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# saramin-talent-search
|
|
2
|
+
|
|
3
|
+
## Use when
|
|
4
|
+
|
|
5
|
+
- 사용자가 사람인 인재풀에서 후보를 찾아달라고 요청한다.
|
|
6
|
+
- 기업회원 로그인/2차 인증이 완료된 브라우저 세션에서 후보를 검색해야 한다.
|
|
7
|
+
- 유료 열람 전 shortlist, 점수, 근거, 리스크, 후보 URL이 필요하다.
|
|
8
|
+
|
|
9
|
+
## Hard boundaries
|
|
10
|
+
|
|
11
|
+
Allowed:
|
|
12
|
+
- 사람인 인재풀 브라우저 세션 열기 및 검색 필터 입력
|
|
13
|
+
- 현재 보이는 마스킹 후보 목록/프로필/이력서 읽기
|
|
14
|
+
- 후보 분석, 점수화, shortlist 작성, 유료 열람 추천
|
|
15
|
+
|
|
16
|
+
Never do without explicit user handoff/confirmation:
|
|
17
|
+
- 유료 이력서 열람, 연락처 확인, 마스킹 해제
|
|
18
|
+
- 포지션/입사 제안 발송
|
|
19
|
+
- 스크랩, 관심후보 등록, 메모, 후보 상태 변경
|
|
20
|
+
- 결제/유료 상품 사용
|
|
21
|
+
- 비밀번호, OTP, 인증번호, 세션 쿠키 요청/저장
|
|
22
|
+
- 후보 개인정보 장기 저장 또는 대량 수집
|
|
23
|
+
|
|
24
|
+
If a control may spend credits, reveal contact/private info, send a proposal, or mutate account state, stop before clicking it.
|
|
25
|
+
|
|
26
|
+
## Primary access
|
|
27
|
+
|
|
28
|
+
Open:
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
https://www.saramin.co.kr/zf_user/memcom/talent-pool/main/search
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
If login or first-device verification is required, pause and show:
|
|
35
|
+
|
|
36
|
+
```text
|
|
37
|
+
사람인 인재풀 검색은 기업회원 로그인과, 처음 사용하는 브라우저/기기에서는 2차 인증이 필요할 수 있습니다.
|
|
38
|
+
제가 브라우저로 사람인 인재풀 검색 페이지를 열어둘게요.
|
|
39
|
+
열린 브라우저에서 직접 로그인과 필요한 경우 2차 인증을 완료해 주세요.
|
|
40
|
+
비밀번호, 인증번호, 세션 쿠키는 저에게 알려주지 마세요.
|
|
41
|
+
인재풀 검색 화면이 보이면 “인증 완료했어”라고 알려주세요.
|
|
42
|
+
그 다음 같은 브라우저 세션에서 검색을 이어가겠습니다.
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Resume only in the same browser session after the user confirms the search UI is visible.
|
|
46
|
+
|
|
47
|
+
## Input normalization
|
|
48
|
+
|
|
49
|
+
Extract or infer:
|
|
50
|
+
|
|
51
|
+
- role_title
|
|
52
|
+
- must_have / nice_to_have
|
|
53
|
+
- negative_keywords
|
|
54
|
+
- career min/max
|
|
55
|
+
- location/work_area
|
|
56
|
+
- role-specific evaluation signals
|
|
57
|
+
- limit / requested Top N
|
|
58
|
+
|
|
59
|
+
Do not block on missing details when a reasonable first search is possible.
|
|
60
|
+
|
|
61
|
+
## Workflow
|
|
62
|
+
|
|
63
|
+
1. Open the primary URL and verify corporate login plus search UI visibility.
|
|
64
|
+
2. Ask the user to log in/verify manually only when required; never handle credentials.
|
|
65
|
+
3. Apply filters: keyword, 직무/직종, 경력, 지역, recent update/activity/relevance sorting, exclusions when supported.
|
|
66
|
+
4. Build a candidate pool from visible rows.
|
|
67
|
+
5. Before final Top N, open normal profile/resume detail links for promising candidates when this does not trigger paid unlock/contact/proposal actions.
|
|
68
|
+
6. Read only visible free/masked details: career, responsibilities, project/achievement evidence, skills, education/certs/languages, desired location/salary/job-seeking state, portfolio links if visible, recent activity.
|
|
69
|
+
7. Score role-adaptively: must-have fit, career depth, concrete achievement/project evidence, location/activity fit, nice-to-have signals, and risk penalty.
|
|
70
|
+
8. Return Korean shortlist with direct URL per recommended candidate.
|
|
71
|
+
|
|
72
|
+
Do not finalize Top N from list rows only unless details are inaccessible or paid-walled. If so, label results as `목록 기반 1차 shortlist` and lower confidence. If detail text was inspected, label as `상세 이력 확인 기반 shortlist`.
|
|
73
|
+
|
|
74
|
+
## Permission guidance
|
|
75
|
+
|
|
76
|
+
Safe after normal tool/browser approval: opening the search page, typing filters, pressing search/apply, scrolling results, opening normal candidate detail links, reading currently visible masked/free text.
|
|
77
|
+
|
|
78
|
+
Must stop/handoff: paid unlock, contact reveal, proposal/send, scrap/interest, memo/status changes, payment, credential/OTP/cookie handling.
|
|
79
|
+
|
|
80
|
+
## URL extraction guidance
|
|
81
|
+
|
|
82
|
+
Every recommended candidate needs a direct Saramin profile/resume URL whenever available. If browser extraction fails, inspect anchors, onclick handlers, data attributes, card containers, and detail-page `location.href`. If still missing, write `URL: 추출 실패` and explain why.
|
|
83
|
+
|
|
84
|
+
## Output shape
|
|
85
|
+
|
|
86
|
+
```text
|
|
87
|
+
사람인 인재풀 shortlist
|
|
88
|
+
|
|
89
|
+
검색 조건
|
|
90
|
+
- 포지션: ...
|
|
91
|
+
- 필수/우대/제외 조건: ...
|
|
92
|
+
- 경력/지역: ...
|
|
93
|
+
- 모드: 상세 이력 확인 기반 shortlist / 목록 기반 1차 shortlist
|
|
94
|
+
|
|
95
|
+
유료 열람 추천 Top N
|
|
96
|
+
1. 후보 A
|
|
97
|
+
- 점수: 88/100
|
|
98
|
+
- 근거: ...
|
|
99
|
+
- 보이는 경력/성과: ...
|
|
100
|
+
- 리스크: ...
|
|
101
|
+
- 추천 액션: 채용 담당자가 유료 열람 검토
|
|
102
|
+
- URL: ...
|
|
103
|
+
|
|
104
|
+
보류 후보
|
|
105
|
+
- ...
|
|
106
|
+
|
|
107
|
+
검색 한계
|
|
108
|
+
- 마스킹/현재 표시 정보만 분석했음
|
|
109
|
+
- 연락처/실명/비공개 정보는 열람하지 않음
|
|
110
|
+
- 유료 액션은 실행하지 않음
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Failure modes
|
|
114
|
+
|
|
115
|
+
- Login/2FA required: open the page and let the user complete it manually.
|
|
116
|
+
- Browser/session unavailable: explain that the agent needs browser/computer-use access; do not silently switch to no-login scraping.
|
|
117
|
+
- Paid wall/contact wall: stop and mark as manual paid review needed.
|
|
118
|
+
- Empty results: adjust keywords, career, region, update/relevance filters.
|
|
119
|
+
- UI changed: rediscover the visible form/data flow before updating instructions.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "saramin-talent-search",
|
|
3
|
+
"description": "사람인 기업회원 인재풀 로그인 세션에서 마스킹된 후보 정보를 검색·비교해 유료 열람 전 shortlist를 만듭니다. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.",
|
|
4
|
+
"profiles": [
|
|
5
|
+
"browser",
|
|
6
|
+
"action:communication"
|
|
7
|
+
],
|
|
8
|
+
"frontmatter": "name: saramin-talent-search\ndescription: 사람인 기업회원 인재풀 로그인 세션에서 마스킹된 후보 정보를 검색·비교해 유료 열람 전 shortlist를 만듭니다. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.\nlicense: MIT\nmetadata:\n category: recruiting\n locale: ko-KR\n phase: v1"
|
|
9
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# Seoul Bike (따릉이)
|
|
2
|
+
|
|
3
|
+
## What this skill does
|
|
4
|
+
|
|
5
|
+
서울 열린데이터 광장의 따릉이 실시간 대여정보를 `k-skill-proxy` 경유로 조회해 대여 가능 자전거 수와 빈 거치대 수를 요약한다.
|
|
6
|
+
|
|
7
|
+
## When to use
|
|
8
|
+
|
|
9
|
+
- "지금 여기서 따릉이 빌릴 수 있어?"
|
|
10
|
+
- "광화문 근처 빈 거치대 있어?"
|
|
11
|
+
- "강남역 따릉이 대여소에 자전거 몇 대 남았어?"
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
- Python 3 표준 라이브러리만 사용한다.
|
|
16
|
+
- optional: `KSKILL_PROXY_BASE_URL` (self-host·별도 프록시를 쓸 때만 설정. 비우면 기본 hosted `https://k-skill-proxy.nomadamas.org` 를 사용한다.)
|
|
17
|
+
|
|
18
|
+
## Required environment variables
|
|
19
|
+
|
|
20
|
+
없음. 사용자가 개인 서울 열린데이터 광장 OpenAPI key를 직접 발급할 필요는 없다. `/v1/seoul-bike/*` routes는 기본 hosted proxy에서 호출하고, upstream key는 proxy 서버 쪽에만 보관한다.
|
|
21
|
+
|
|
22
|
+
## Single entrypoint
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
python3 "$SKILL_DIR/scripts/seoul_bike.py" <subcommand> [args]
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
첫 사용 시 `Bash(python3 *seoul_bike.py:*)` 패턴 한 번만 승인하면 이후 호출은 모두 자동 허용된다.
|
|
29
|
+
|
|
30
|
+
## Subcommands
|
|
31
|
+
|
|
32
|
+
| 명령 | 설명 |
|
|
33
|
+
|---|---|
|
|
34
|
+
| `nearby --lat LAT --lon LON [--radius-m 500] [--limit 10] [--json]` | 좌표 주변 실시간 대여소 조회 |
|
|
35
|
+
| `search <키워드> [--limit 10] [--json]` | 대여소 이름에 키워드가 포함된 실시간 상태 검색 |
|
|
36
|
+
| `realtime [--start-index 1 --end-index 1000]` | 실시간 대여정보 원문 JSON 페이지 조회 |
|
|
37
|
+
|
|
38
|
+
## Workflow
|
|
39
|
+
|
|
40
|
+
### 1. 현재 위치 주변 대여소 조회
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
python3 "$SKILL_DIR/scripts/seoul_bike.py" nearby --lat 37.5717 --lon 126.9763 --radius-m 500
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
요약 항목:
|
|
47
|
+
|
|
48
|
+
- 대여소명
|
|
49
|
+
- 대여 가능 자전거 수 (`parkingBikeTotCnt`)
|
|
50
|
+
- 빈 거치대 수 (`rackTotCnt - parkingBikeTotCnt`)
|
|
51
|
+
- 거리(m)
|
|
52
|
+
- 조회 시각(`proxy.requested_at`)
|
|
53
|
+
|
|
54
|
+
### 2. 대여소 이름 검색
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
python3 "$SKILL_DIR/scripts/seoul_bike.py" search "광화문" --limit 5
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### 3. Proxy endpoints
|
|
61
|
+
|
|
62
|
+
- `GET /v1/seoul-bike/realtime?startIndex=1&endIndex=1000` → 서울 `bikeList` 실시간 대여정보
|
|
63
|
+
- `GET /v1/seoul-bike/stations?startIndex=1&endIndex=1000` → 서울 `tbCycleStationInfo` 대여소 마스터 정보
|
|
64
|
+
- `GET /v1/seoul-bike/nearby?lat=37.5717&lon=126.9763&radius_m=500&limit=10` → proxy-side 주변 대여소 필터링
|
|
65
|
+
|
|
66
|
+
## Done when
|
|
67
|
+
|
|
68
|
+
- 대여 가능 자전거 수와 빈 거치대 수가 정리되어 있다.
|
|
69
|
+
- live data 기준 조회 시각이 명시되어 있다.
|
|
70
|
+
- upstream key가 클라이언트에 노출되지 않았다.
|
|
71
|
+
|
|
72
|
+
## Failure modes
|
|
73
|
+
|
|
74
|
+
- proxy upstream key 미설정 (`SEOUL_OPEN_API_KEY` 없음)
|
|
75
|
+
- 서울 열린데이터 광장 quota 초과
|
|
76
|
+
- 실시간 API가 빈 행 또는 일시 오류를 반환
|
|
77
|
+
- 좌표가 없거나 반경 안에 대여소가 없음
|
|
78
|
+
|
|
79
|
+
## Notes
|
|
80
|
+
|
|
81
|
+
- 실시간 데이터는 계속 변하므로 답변에 조회 시각을 함께 적는다.
|
|
82
|
+
- 예약/대여 자동화는 하지 않는다. 조회 전용 스킬이다.
|
|
83
|
+
- proxy 운영/환경변수 설정은 `docs/features/k-skill-proxy.md` 를 참고한다.
|