New skill helpers and tests were easy to omit from the growing lint/test/pack scripts. Discover them by path so CI stays complete without touching package.json.
Co-authored-by: Cursor <cursoragent@cursor.com>
CI installed korail2==0.4.0 from PyPI while the shipped helper runs a pinned
git fork, so fork API drift could not fail the test suite. The test environment
now installs the same revision, and a regression test keeps package.json in
sync with the script header.
KTX search silently returned count=0 when the requested station name did not
match Korail's canonical name (for example "서울역"). Both helpers now
normalize a trailing station suffix, and KTX raises with the station names
Korail actually returned instead of an empty result. An empty time window
still returns count=0.
ASK 서울이 공개하는 weather_place_risk_window(장소별 기상 위험 예상 시간대)
단일 제품을 인증된 읽기 전용 HTTPS API로 조회하는 Python 스크립트 유형 스킬.
폭염·한파·호우·대설·강풍 후보 예보 시간대와 그 판정 근거(기온·풍속·강수확률·
강수형태·강수량·적설량)를 조회한다. 기상청 공식 특보가 아님을 계약과 문서에
명시한다.
- scripts/seoul_weather_risk.py: bundle/product/data 응답 계약을 검증하는
read-only client. stdlib(urllib)만 사용하고 외부 dependency 없음
- 시크릿은 KSKILL_SEOUL_WEATHER_RISK_API_KEY/_API_BASE_URL 환경변수 전용,
HTTPS origin 강제(loopback mock 제외)·redirect 미추종으로 bearer 유출 차단
- tests: 인증·계약 drift·HTTP problem status·자격증명 미노출 등 9개
- package.json lint/test에 등록, README·docs/sources.md·runtime-action-audit
갱신, SKILL.md와 CLI bundle은 generate/sync 스크립트로 생성
- StatisticSearch/TableList/ItemList/KeyStatisticList/StatisticWord 5개 서비스 지원
- 기준금리·원달러환율·CPI·M2·국고채3년 alias 제공
- 공개 데모 키 sample로 무가입 동작 확인(호출당 10행 캡) → proxy 미경유 직접 호출
- BYOK: KSKILL_BOK_ECOS_API_KEY로 행 수 확장
- stdlib-only helper + 19 unit tests, README/docs/sources/root CI 배선
Closes#368
- data.ex.co.kr trafficAmountByRealtime로 콘존별 속도/교통량/정체 등급 조회
- openapi.its.go.kr cctvInfo로 좌표 범위 내 CCTV HLS 스트림 메타데이터 조회
- 두 upstream 모두 공개 데모 키로 무가입 동작 확인 → proxy 미경유 직접 호출
- stdlib-only helper + 17 unit tests, README/docs/sources/root CI 배선
Closes#384
* feat: add regional EV subsidy status skill
* docs: generalize EV subsidy model examples
* fix: align ev-subsidy-status with workspace k-skill-browser-runtime ^0.2.0
- depend on the workspace browser-runtime range like every other
browser-backed package (changesets bumps ranges at release)
- refresh package-lock.json; also heals pre-existing dev drift where
court-auction/hipass/yebigun/court-payment entries were stale
(npm ci was failing on the lockfile/package.json mismatch)
---------
Co-authored-by: Jeffrey (Dongkyu) Kim <vkehfdl1@gmail.com>
로그인된 예비군 홈페이지(yebigun1.mil.kr) Chrome 세션을 재사용해 훈련 일정/장소를
조회하고 작년 기록과 비교한다. 식별 정보 없는 조회 화면만 읽고(view), 신청/편집
화면은 열기만 하며(open-menu) 로그인·제출은 절대 자동화하지 않는다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
* feat(srt): 좌석 조회와 탐색 우선순위 추가
SRT search 결과의 stable train_id로 객차별 좌석을 조회하고, 특정 호차/좌석 확인과 탐색 우선순위 옵션을 제공한다.
Constraint: SRT와 KTX는 별도 upstream 표면이므로 SRT HTML 파서와 테스트를 분리함
Rejected: KTX 좌석 helper 공유 | Korail API와 SRT 웹 좌석선택 HTML 계약이 달라 혼용하면 파서 안정성이 낮아짐
Confidence: medium
Scope-risk: moderate
Directive: SRT 좌석선택 HTML에서 노출되지 않는 속성은 추정하지 말고 명시적으로 처리할 것
Tested: PYTHONPATH=.:scripts python3 -m unittest scripts.test_srt_booking scripts.test_ktx_booking; python3 -m py_compile scripts/srt_booking.py scripts/srt_seats.py scripts/test_srt_booking.py
Not-tested: 실제 예약 API에 우선순위 좌석 선택을 연결하는 흐름
* fix(srt): 좌석 조회 JSON 출력 안정화
SRT 대기열 메시지가 stdout에 섞여 seats JSON을 깨는 실제 표면 문제를 막고, 누락된 좌석 방향/위치 속성을 unknown으로 정규화한다.
Constraint: issue #303 범위는 예약 부작용이 없는 좌석 조회 보조 흐름으로 제한됨
Rejected: 실제 예약 subcommand 추가 | 좌석 선점/예약은 외부 부작용이라 이번 acceptance criteria에 포함되지 않음
Confidence: high
Scope-risk: narrow
Directive: SRTrain upstream 출력이 추가되더라도 helper stdout은 JSON 전용으로 유지할 것
Tested: RED→GREEN in .omo/ulw-loop/evidence/srt-c002-red-green-tests.txt; live SRT tmux QA in .omo/ulw-loop/evidence/srt-c001-live-search-seats.txt; npm run ci in .omo/ulw-loop/evidence/srt-c003-regression-ci.txt
Not-tested: 실제 예약/결제/취소 부작용 흐름
* test(srt): split seat helper regression coverage
---------
Co-authored-by: Jeffrey (Dongkyu) Kim <vkehfdl1@gmail.com>