한국인을 위한 스킬 모음집 - SRT, KTX, 카카오톡, 한글과컴퓨터, 날씨, 미세먼지, 법령, 주식정보, 조선왕조실록, KBO, K-리그, LCK, 특허 검색, 토스 증권, 맞춤법 검사, 중고차 가격, 쿠팡, 네이버 블로그, 다이소, 올리브영, 택배 송장 조회 등등... https://k-skill.nomadamas.org
  • JavaScript 64.7%
  • Python 33.3%
  • Shell 1.9%
Find a file
Jeffrey (Dongkyu) Kim 271ea185c4
Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271)
* docs(flight-ticket-search): register skill in README table and add feature guide

PR #224 머지 시 README "어떤 걸 할 수 있나" 표와 "포함된 기능" 리스트, 그리고
docs/features/flight-ticket-search.md 가이드가 등록되지 않아 main에 있는 다른
모든 스킬과 달리 사용자/에이전트가 README만 봐서는 이 스킬을 발견할 수 없는
상태였다. 누락분을 hotfix로 보강한다.

- README 표에 `flight-ticket-search` 행 추가 (마이리얼트립 옆 항공 클러스터)
- README "포함된 기능" 리스트에 가이드 링크 추가
- docs/features/flight-ticket-search.md 신규 작성:
  · 사용 시나리오, 구현 표면(fast-flights==2.2, 사용자 venv 격리)
  · search / compare-month / compare-range / compare-years CLI 예시
  · 응답 필드, IATA 입력 가이드, 예약 링크 정책
  · 검증된 노선 목록, 실패 모드, 비범위, 출처

검증:
- node --test scripts/skill-docs.test.js → 138/138 pass
- ./scripts/validate-skills.sh → skill layout looks valid

코드 변경 없음 → changeset 불필요.

* feat(daiso-product-search): replace blocked-API fallback with Bearer token auth

selStrPkupStck는 더 이상 차단 상태가 아니며, /api/auth/request로 비로그인 JWT를
발급받아 AES-128-CBC(키: PRE_AUTH_ENC_KEY)로 암호화한 Bearer 토큰으로 접근한다.
403 응답 시 토큰을 재발급해 1회 재시도한다. pickupEligibility(selPkupStr) 폴백
로직은 제거했다.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* Preserve Daiso pickup answers when Bearer auth degrades

Keep exact stock lookup on the official Bearer-token path while restoring the public selPkupStr fallback for repeated auth blocks.

Constraint: PR #250 review required Bearer auth to remain primary without removing the resilient pickup eligibility API.

Rejected: Throwing after the retry | it collapses callers back to a brittle single upstream-auth dependency.

Confidence: high

Scope-risk: narrow

Directive: Keep pickupStock quantity semantics separate from pickupEligibility yes/no fallback.

Tested: node --test packages/daiso-product-search/test/index.test.js; npm test --workspace daiso-product-search; npm run lint --workspace daiso-product-search; npm run ci; live lookupStoreProductAvailability smoke for 강남역2호점 / VT 리들샷 100.

Not-tested: Live forced 403 from Daiso upstream; covered with injected fetch regression tests.

* Prove Daiso stock retry sends auth headers

Strengthen the retry regression so the Bearer-token contract cannot regress while still returning success from mocked stock responses.\n\nConstraint: PR #250 review requested explicit Authorization, X-DM-UID, and request body assertions on the retry path.\nRejected: Counting requests only | it allowed header/body regressions to pass.\nConfidence: high\nScope-risk: narrow\nDirective: Keep auth-header assertions on both initial and retry stock requests when editing this flow.\nTested: node --test packages/daiso-product-search/test/index.test.js; npm test --workspace daiso-product-search; npm run lint --workspace daiso-product-search; npm run ci; live lookupStoreProductAvailability smoke for 강남역2호점 / VT 리들샷 100; repeated-403 fixture probe.\nNot-tested: Live repeated upstream 403 because forcing Daiso production auth failure is not available without changing upstream state.

* Preserve Daiso caller headers through Bearer stock lookup

Keep advanced caller headers on the authenticated stock endpoint while generated Bearer and X-DM-UID values remain authoritative. Document the degraded selPkupStr fallback order in skill and source docs so the public workflow matches the restored API surface.\n\nConstraint: PR #250 review required resilient Bearer-primary stock lookup plus selPkupStr fallback and header/body contract coverage.\nRejected: Replacing caller headers with only auth headers | It regressed tracing/test-control header pass-through.\nConfidence: high\nScope-risk: narrow\nDirective: Keep Authorization and X-DM-UID generated by the auth flow even when callers provide same-named headers.\nTested: node --test packages/daiso-product-search/test/index.test.js; npm test --workspace daiso-product-search; npm run lint --workspace daiso-product-search; node --test scripts/skill-docs.test.js; npm run ci; live lookupStoreProductAvailability smoke for 강남역2호점 / VT 리들샷 100.\nNot-tested: Forced live upstream repeated 403; covered by injected fixture tests.

* fix(danawa-price-search): capture .ico.* payment-condition badges and surface as row labels

PR #226 row 파서에 결제조건 배지(`.ico.cash`/`.ico.point`/`.ico.coupon`/`.ico.card`) selector가 누락돼, 카드 결제 불가능한 현금/쿠폰/포인트 전용가가 일반 최저가로 노출되는 결함을 고친다.

- `offers()` row 파싱부에 결제조건 배지 화이트리스트 캡처 블록 추가 (클래스 `cash`/`point`/`coupon`/`discount`/`card`/`membership` 또는 텍스트 `현금`/`포인트`/`쿠폰`/`할인`만 인정 — 빠른배송/안내/상품리뷰 노이즈 차단)
- row dict 신규 필드 6개: `payment_badges`, `cash_only`, `point_only`, `coupon_only`, `card_only_badge`, `is_conditional_price`
- 반환 dict에 `normal_count`, `conditional_count` 추가
- `SKILL.md` / `docs/features/danawa-price-search.md` 갱신 (Output shape · Response style · Workflow · Failure modes에 결제조건 정책과 표 예시 명시)

정렬 정책은 그대로 `total_price` 단일 기준이며, 결제조건은 row 단위 플래그/라벨로만 노출해 호출자가 결제수단에 맞춰 직접 판단하도록 한다.

회귀 (pcode=75001853, 갤럭시 S25 256GB 자급제 `offers --limit 5`):
- 1위 킴스클럽 979,000원 / `cash_only=True` / `payment_badges=["현금"]`
- 2위 롯데ON 1,072,080원 / `cash_only=False` / `payment_badges=[]`
- 3~5위 일반가 row 모두 `payment_badges` 빈 리스트 (노이즈 0건)

Closes #252

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* Ensure captured Danawa payment badges stay conditional

Classify every whitelisted payment badge into normalized condition types so callers cannot count captured discount, membership, or text-only card rows as normal prices.

Constraint: PR #253 review required TDD follow-up on feature/#252 without changing total_price sorting.\nRejected: Removing discount and membership from the whitelist | would lose Danawa condition labels already captured by the parser.\nConfidence: high\nScope-risk: narrow\nDirective: Keep payment_badge whitelist and payment_condition_types in sync whenever adding new badge classes or text keywords.\nTested: PYTHONPATH=.:scripts python3 -m unittest scripts.test_danawa_price_search; live offers 75001853 --limit 5; npm run lint; npm run typecheck; npm run test; architect verification CLEAR.\nNot-tested: Danawa markup variants not represented by current live page or synthetic badge fixtures.

* Keep icon-only Danawa payment badges visible

Class-only Danawa payment icons can carry eligibility information without visible text, so synthesize display labels from the same normalized condition map used for types and booleans. This keeps raw row labels, condition fields, and returned-window counts aligned for downstream table renderers.\n\nConstraint: PR #253 review follow-up requires TDD coverage before parser changes.\nRejected: Leaving payment_badges text-only | icon-only conditional rows would still render without visible payment labels.\nConfidence: high\nScope-risk: narrow\nDirective: Derive future payment badge labels, types, and booleans from one canonical mapping.\nTested: python3 -m py_compile danawa-price-search/scripts/danawa_search.py scripts/test_danawa_price_search.py; PYTHONPATH=.:scripts python3 -m unittest scripts.test_danawa_price_search; python3 danawa-price-search/scripts/danawa_search.py offers 75001853 --limit 5; npm run lint; npm run typecheck; npm run test\nNot-tested: Danawa icon-only markup was verified with synthetic fixtures rather than a live page snapshot.

* Merge pull request #249 from NomaDamas/feature/#248

Feature/#248

* Restore SH notice lookup without proxy policy drift

Reintroduce SH notice search as a direct public HTML client so the skill complies with the free-API proxy boundary while preserving verifiable keyword, pagination, and attachment behavior.

Constraint: i-sh.co.kr board is public unauthenticated HTML, so k-skill-proxy must not host the scraper.\nRejected: Re-adding /v1/sh-notice proxy routes | public HTML scraping in proxy violates repository policy.\nConfidence: high\nScope-risk: moderate\nDirective: Keep SH public HTML access local/direct unless a key-required official free API is discovered and documented.\nTested: npm run ci; npm run lint --workspace sh-notice-search; npm test --workspace sh-notice-search; live SH smoke for 행복주택, 매입임대, 신혼희망타운, page 1/page 5, 1/6/9/11/0 attachment details.\nNot-tested: authenticated SH flows, 청약 application/submission, direct attachment downloads.

* Preserve public SH helper semantics

Route exported URL builders through the same normalization as the CLI/API so natural category aliases cannot bypass srchTp title narrowing or category mapping.\n\nConstraint: PR #254 review found exported helper callers could pass Korean/English public category inputs and get broken or broadened SH URLs.\nRejected: Keep normalized-only fast paths | exported helpers are public API and must protect natural inputs.\nConfidence: high\nScope-risk: narrow\nDirective: Keep exported helper behavior aligned with normalizeSearchOptions and normalizeDetailOptions when adding new public aliases.\nTested: npm test --workspace sh-notice-search; npm run lint --workspace sh-notice-search; npm run typecheck; npm run ci; node helper smoke for 임대 search/detail URLs.\nNot-tested: Live SH network smoke was not rerun for this helper-only change.

* Preserve SH parser helper aliases

Route exported parser helpers through the same public normalizers used by the SH fetch and URL-builder APIs so natural category aliases stay consistent across the package surface.

Constraint: PR #254 Round 2 review found parser helpers still treated raw category aliases as pre-normalized inputs.
Rejected: Keep parser helpers normalized-only | inconsistent with exported URL builders and public helper ergonomics.
Confidence: high
Scope-risk: narrow
Directive: Keep exported SH helper entry points on canonical normalizeSearchOptions/normalizeDetailOptions unless a separate internal-only API is introduced.
Tested: npm test --workspace sh-notice-search; npm run lint --workspace sh-notice-search; npm run typecheck; npm pack --workspace sh-notice-search --dry-run; npm run ci; parser smoke for Korean 임대 list/detail helpers; Ralph architect verification CLEAR; post-deslop regression npm run ci
Not-tested: Live SH network smoke for this follow-up; fixture and injected-fetch coverage exercised the helper contract.

* Make SH parser failures explicit

Warn when SH returns block or maintenance HTML without the expected public board markup, and constrain exposed preview links to the SH converter origin/path.\n\nConstraint: Round 3 review required TDD coverage for block/maintenance HTML and untrusted preview URLs.\nRejected: Throwing on unexpected HTML | Existing parser helpers return partial fixture-friendly results, so warnings preserve compatibility while exposing failure evidence.\nConfidence: high\nScope-risk: narrow\nDirective: Keep SH public HTML lookup direct; do not add proxy routing unless a key-required official free API is adopted.\nTested: npm run lint --workspace sh-notice-search; npm test --workspace sh-notice-search; npm run typecheck; npm pack --workspace sh-notice-search --dry-run; npm run ci; Node smoke for blocked HTML warnings and external preview filtering.\nNot-tested: Live blocked/NetFunnel SH response, because no live blocked page was available during implementation.

* ci: install beautifulsoup4 so danawa price search tests can import bs4

The new scripts/test_danawa_price_search.py imports danawa_search.py,
which requires beautifulsoup4. CI only runs npm ci, so the bs4 import
fails with 'beautifulsoup4 is required: python -m pip install
beautifulsoup4' and the validate job exits with code 1.

Install beautifulsoup4 via pip before running npm run ci so the
Python test suite can import danawa_search and run the new payment
badge regression tests.

* Revert "ci: install beautifulsoup4 so danawa price search tests can import bs4"

This reverts commit 8330e5adf7.

* test: install beautifulsoup4 inside npm test before Python tests

The new scripts/test_danawa_price_search.py imports danawa_search.py,
which requires beautifulsoup4. CI runs npm ci + npm run ci and does
not install Python packages, so the bs4 import fails at module load.

Install beautifulsoup4 via 'pip install --user' as the first step of
the test script so it is available when Python unittests import the
danawa helper. Local dev environments are unaffected because pip
install is idempotent and quiet.

* feat(qa-bot): add k-skill-qa-bot under tools/

External macOS daemon that clones NomaDamas/k-skill main every 3 days, runs
each skill through codex exec, has an LLM judge grade pass/fail/skip via
codex exec --output-schema, and files dedup'd GitHub issues for true failures.

Layout:
- install.sh copies tools/k-skill-qa-bot/ to ~/.local/share/k-skill-qa-bot/
  and registers a LaunchAgent at ~/Library/LaunchAgents/.
- update-clone.sh has a hard guard: refuses any K_SKILL_CLONE outside
  K_QA_HOME/k-skill-clone unless ALLOW_EXTERNAL_CLONE_TARGET=1.
- Force-skip 10 destructive/login-required skills (ktx-booking, srt-booking,
  catchtable-sniper, kakaotalk-mac, hipass-receipt, toss-securities, etc.)
  so the bot never triggers reservation abuse.
- Deprecated skills (strike-through + 지원 중단 in README) auto-detected
  and skipped, never failed.
- First-run safety: CREATE_ISSUES=false by default.
- mkdir-based concurrency lock with atomic stale reclaim.
- Issue dedup: sha1(skill_name + symptom_class)[:12] body marker.
- Deterministic gates override LLM judge to FAIL on exit_code != 0, missing
  VERDICT line, or near-timeout duration.

* Support nearby ER status checks

Add an E-Gen based emergency-room skill that resolves a user location, queries the public nearby emergency-room list, and reports operation flags while documenting that exact remaining bed counts are not exposed by this surface.

Constraint: Issue #255 requested NEMC emergency bed status using public monitoring/E-Gen surfaces.
Rejected: Scraping private monitoring dashboards or claiming exact bed utilization | public endpoints expose operation flags, not per-hospital remaining bed counts.
Confidence: high
Scope-risk: narrow
Directive: Preserve the public-data limitation text unless a verified official bed-count endpoint is added.
Tested: npm run lint --workspace emergency-room-beds; npm test --workspace emergency-room-beds; node --test scripts/skill-docs.test.js; npm run typecheck; npm pack --workspace emergency-room-beds --dry-run; ./scripts/validate-skills.sh; live E-Gen coordinate smoke.
Not-tested: npm run ci end-to-end due local Python 3.14 pip/pyexpat import error before tests.

* Prevent ER status ambiguity from reaching users

Constraint: Health-adjacent public E-Gen/Kakao data can be absent, delayed, schema-drifted, or partially unknown.

Rejected: Mapping all non-Y operation flags to false | It misrepresents missing upstream data as a negative operating status.

Rejected: Treating unknown E-Gen payloads as empty results | It hides upstream failure behind a false no-results response.

Confidence: high

Scope-risk: narrow

Directive: Keep unknown health availability data explicit and preserve upstream failure evidence.

Tested: npm run lint --workspace emergency-room-beds; npm test --workspace emergency-room-beds; node --test scripts/skill-docs.test.js; npm run typecheck; npm pack --workspace emergency-room-beds --dry-run; ./scripts/validate-skills.sh; direct Node smoke for tri-state/schema/coordinate guards.

Not-tested: npm run ci due pre-existing local Python 3.14 pyexpat/libexpat bootstrap failure noted on PR.

Co-authored-by: OmX <omx@oh-my-codex.dev>

* fix(ci): exclude tools/ from skill validator

The tools/ directory hosts repo tooling (e.g. k-skill-qa-bot), not
skills, so validate-skills.sh should skip it like other non-skill
top-level directories.

* 영화관 검색 스킬 추가 (#260)

* Add korean cinema search skill

* Document playDate for cinema skill

* feat(kstartup-search): 창업진흥원 K-Startup 조회 스킬 + 프록시 라우트 4종 (#259)

* feat(kstartup-search): 창업진흥원 K-Startup 조회 스킬과 프록시 라우트 추가

공공데이터포털 dataset 15125364 (창업진흥원_K-Startup(사업소개,사업공고,콘텐츠 등)_조회서비스) 의
4개 endpoint 를 k-skill-proxy 경유로 조회하는 스킬을 추가한다.

- 신규 라우트: GET /v1/kstartup/{business-info,announcements,contents,statistics}
  - 각각 getBusinessInformation01/getAnnouncementInformation01/getContentInformation01/
    getStatisticalInformation01 으로 중계
  - ServiceKey 는 서버 측 DATA_GO_KR_API_KEY 로 주입, returnType=json 강제
  - 정상 응답만 캐시, data.go.kr 에러 envelope (resultCode != "00", errMsg 등) 은 캐시 우회
- helper: kstartup-search/scripts/run_kstartup.py (stdlib only)
  - 일반 조회는 hosted proxy 사용 → 사용자 키 불필요
  - --direct 옵션은 사용자가 본인 KSKILL_KSTARTUP_API_KEY (혹은 DATA_GO_KR_API_KEY) 로
    upstream 직접 호출 + --dry-run 시 키 redact
- 입력 검증: page/perPage 정수·범위, YYYYMMDD 날짜 + 시작일 ≤ 종료일, Y/N 대문자화,
  텍스트 필드 길이 상한, biz_yr 4자리
- 테스트: k-skill-proxy 서버 테스트 10건 신규 (normalizer, 라우트, 캐시 분리,
  returnType=json 강제, 503/400/502, 키 누수 회귀), Python unittest 13건
- 문서: SKILL.md, docs/features/kstartup-search.md, README 표/리스트,
  docs/sources.md, .changeset/kstartup-search.md (k-skill-proxy minor)

* docs(kstartup-search): docs/setup·security·k-skill-setup·proxy README 에 K-Startup 항목 추가

seoul-density · KOSIS · NTS 선례와 동일한 위치·문구로 다음을 보강한다.

- docs/setup.md: dotenv 예시에 KSKILL_KSTARTUP_API_KEY 추가, credential 표에 K-Startup 행 추가, "다음에 볼 문서" 리스트 추가
- docs/security-and-secrets.md: standard variable names 에 KSKILL_KSTARTUP_API_KEY 추가, hosted proxy 사용 스킬 목록·proxy 운영 prose 에 K-Startup 추가, dotenv 예시 추가
- k-skill-setup/SKILL.md: credential resolution prose 와 시크릿 요약 표에 K-Startup 안내 추가
- packages/k-skill-proxy/README.md: 라우트 목록에 /v1/kstartup/{business-info,announcements,contents,statistics} 추가
- docs/features/k-skill-proxy.md: 라우트 목록에 같은 4개 추가

* fix(kstartup-search): strict calendar-date validation in Python helper

validate_yyyymmdd() previously only checked month in [1,12] and day in [1,31],
which accepted impossible dates like 20240230 or 20240431 in --direct mode.
The proxy-side normalizer in packages/k-skill-proxy/src/kstartup.js already
uses Date.UTC() to reject such inputs, so this aligns the --direct path with
the proxy path and eliminates validator drift.

Uses datetime.date(year, month, day) and raises HelperError on ValueError.

Adds regression test covering impossible calendar dates (Feb 30, Apr 31,
month 13, day 0) and the leap-year boundary (2024-02-29 valid, 2023-02-29
not).

---------

Co-authored-by: Jeffrey (Dongkyu) Kim <vkehfdl1@gmail.com>

* fix(qa-bot): upgrade judge to gpt-5.5 and run codex with sandbox bypass

PR #257 follow-up. Two changes:

1. JUDGE_MODEL default: gpt-5.4-mini -> gpt-5.5

   The cheaper judge was misclassifying every wrong-output verdict because
   the offline matcher fell through to the dumb 'VERDICT: FAIL in transcript'
   check. Re-running the same 10 historical fail cases with gpt-5.5 +
   real LLM judge correctly reclassified 7 of them as pass (the codex agent
   actually accomplished the skill goal) and the remaining 3 as
   network-error / partial-success / skip with accurate reasons.

2. Drop -s read-only, add --dangerously-bypass-approvals-and-sandbox

   The read-only codex sandbox was triggering spurious DNS resolution
   failures inside the test runs (host blocked at the syscall level even
   for legitimate proxy / public-API calls). Live re-test with the bypass
   flag and provider pin produced clean transcripts: cheap-gas-nearby,
   daangn-realty-search, han-river-water-level, naver-news-search,
   naver-shopping-search, seoul-density, seoul-subway-arrival all PASS.
   The QA bot is sandboxed externally by launchd anyway.

3. New CODEX_PROVIDER env (default: openai)

   Lets users pin the codex model_provider explicitly so the bot does not
   accidentally route through a private OpenAI-compatible proxy that may
   not have keys registered for all model names.

* Add Ohou today deal skill

* fix spacing in package.json

* fix(qa-bot): per-skill test_prompt overrides and smarter judge

11 skills that need specific inputs (not just a 'demonstrate' query) now
ship with a hardcoded test_prompt in config/skill-overrides.yml:

  flight-ticket-search           ICN -> NRT, 2026-08-20 one-way
  nts-business-registration      124-81-00998 (Samsung Electronics)
  korean-stock-search            005930 Samsung 5-day quote
  joseon-sillok-search           키워드 훈민정음
  korean-law-search              산업안전보건법 제5조
  library-book-search            코스모스 칼 세이건
  lotto-results                  latest round
  k-schoollunch-menu             서울특별시교육청 초등학교 오늘 식단
  delivery-tracking              CJ dummy invoice (negative case ok)
  ticket-availability            YES24 / 인터파크 sample
  zipcode-search                 서울특별시 강남구 테헤란로 152

These were previously synthesized from the SKILL.md first When-to-use bullet,
which is a one-line teaser without concrete inputs. The agent would then
either ask the user for the missing input (partial-success) or fall back
to a generic demo (often producing a VERDICT: FAIL response). Both got
mis-classified as fail by the judge.

qa_utils.synthesize_test_prompt now honors default_inputs.test_prompt as a
verbatim override (only appending the VERDICT line if the override does not
already include it).

Two additional fixes for negative-case correctness:

1. judge-prompt.md: explicitly tells the judge that the agent's literal
   VERDICT: PASS / VERDICT: FAIL is just a hint, not binding. A skill that
   correctly returns 'no such business number' or 'invoice not found' for
   a deliberately invalid input is PASS, not fail.

2. judge-skill.py: drop the deterministic gate that flipped pass to fail
   when 'VERDICT: PASS' literal was missing from the transcript. That gate
   was producing false fails for negative-case tests where the agent
   correctly responded with VERDICT: FAIL because the skill rejected an
   invalid input. The judge LLM (gpt-5.5) is now trusted to evaluate the
   transcript against the SKILL.md 'Done when' criteria.

Verified live:

- nts-business-registration with valid number  -> pass/success (0.99)
- nts-business-registration with fake number   -> pass/success (0.99)
- flight-ticket-search ICN->NRT 2026-08-20     -> pass/success (0.99)

* fix(ohou-today-deal): address PR #264 review (live UA, explicit feed selection, argv validators)

- HIGH: switch fetch_html() to well-formed bot UA with contact URL
  (k-skill-ohou-today-deal/1.0 (+https://github.com/NomaDamas/k-skill)).
  ohou.se Akamai bot manager 403s anonymous UAs but allows identified
  bot UAs that include a contact URL. Live default workflow now returns
  74 deals end-to-end instead of failing with HTTP 403.
- MEDIUM: extract_deals() now explicitly selects React Query entries with
  queryKey == ['today-deal-feed'] or ['special-today-deal-feed'] and
  reads only state.data.todayDealFeed.slots[type=='DEAL']. Unrelated
  DEAL-shaped nodes from navigation/banner modules are excluded.
  Legacy fixture/JSON-payload fallback path preserved for tests that
  construct simplified payloads.
- LOW: --limit now requires a positive integer; --min-discount is
  constrained to 0..100. Both validated via argparse.ArgumentTypeError
  so users get a clear CLI error instead of silent slicing or nonsensical
  thresholds.
- Tests: add 9 new unit tests covering explicit feed selection,
  navigation/GOODS exclusion, fallback compatibility, and argv validators.
  Strengthen skill-docs.test.js to lock the special-today-deal-feed
  surface and well-formed UA signature.
- Docs: update SKILL.md and feature doc to document the explicit
  today-deal-feed + special-today-deal-feed extraction boundary and the
  Akamai UA policy.

* Merge pull request #263 from NomaDamas/feature/#257

Feature/#257

* Feature/#256 (#266)

* Enable public local-election candidate lookups

Add an NEC integrated-search skill and helper package so agents can answer 지방선거 후보자 lookup requests without credentials or proxy routes.

Constraint: Issue #256 requested TDD, Ralph completion, branch feature/#256, and PR targeting dev.

Rejected: k-skill-proxy route | NEC integrated candidate search is public and requires no API key.

Confidence: high

Scope-risk: moderate

Directive: Keep the helper read-only and do not automate NEC login, CAPTCHA, filing, or privileged election workflows.

Tested: git diff --check; node --test packages/local-election-candidate-search/test/index.test.js; npm run lint --workspace local-election-candidate-search; npm run test --workspace local-election-candidate-search; npm pack --workspace local-election-candidate-search --dry-run; node packages/local-election-candidate-search/src/cli.js 오세훈 --election 시도지사 --region 서울 --limit 1; PATH=/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin:/Users/jeffrey/.codex/tmp/arg0/codex-arg0a6JueA:/opt/homebrew/lib/node_modules/@openai/codex/node_modules/@openai/codex-darwin-arm64/vendor/aarch64-apple-darwin/path:/Users/jeffrey/.cmuxterm/omo-bin:/opt/homebrew/share/android-commandlinetools/platform-tools:/opt/homebrew/share/android-commandlinetools/emulator:/opt/homebrew/share/android-commandlinetools/cmdline-tools/latest/bin:/Users/jeffrey/.local/bin:/Users/jeffrey/.bun/bin:/opt/homebrew/opt/node@22/bin:/opt/homebrew/opt/openjdk@21/bin:/opt/homebrew/opt/postgresql@18/bin:/Users/jeffrey/.jenv/shims:/Users/jeffrey/.jenv/bin:/opt/homebrew/opt/imagemagick/bin:/opt/homebrew/Cellar/pyenv-virtualenv/1.4.0/shims:/Users/jeffrey/.pyenv/shims:/opt/homebrew/opt/openssl@3/bin:/Users/jeffrey/.rbenv/shims:/Users/jeffrey/.rbenv/bin:/Users/jeffrey/google-cloud-sdk/bin:/Applications/cmux.app/Contents/Resources/bin:/Users/jeffrey/Library/pnpm:/Users/jeffrey/.nvm/versions/node/v24.13.0/bin:/Users/jeffrey/.cops/bin:/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/opt/pmk/env/global/bin:/Library/Apple/usr/bin:/Library/TeX/texbin:/Users/jeffrey/.cargo/bin:/Users/jeffrey/Library/Application Support/JetBrains/Toolbox/scripts:/Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home/bin:/Users/jeffrey/xcode-projects/marshroom/cli npm run ci

Not-tested: Exhaustive NEC markup variants for every historical election type.

Co-authored-by: OmX <omx@oh-my-codex.dev>

* Enforce fail-closed candidate identity parsing

Constraint: PR #266 review required exact candidate-name matching and CLI help regression coverage.\nRejected: fallback-to-query-name on missing upstream markup | it can mislabel unrelated candidates as exact matches.\nConfidence: high\nScope-risk: narrow\nDirective: Keep NEC parser changes fail-closed when candidate identity cannot be parsed.\nTested: git diff --check; node --test packages/local-election-candidate-search/test/index.test.js; npm run lint --workspace local-election-candidate-search; npm run test --workspace local-election-candidate-search; npm pack --workspace local-election-candidate-search --dry-run; live CLI smoke for 오세훈; CLI --help smoke.\nNot-tested: repo-wide npm run ci remains blocked by pre-existing missing SKILL.md: ohou-today-deal.

* Preserve unique candidate lookup results

Deduplicate parsed NEC candidate/election rows before applying user limits, and make expected CLI validation failures concise by default while keeping an explicit debug stack escape hatch.

Constraint: PR #266 round-2 follow-up requested TDD fixes for duplicate NEC rows and CLI validation UX.\nRejected: Deduplicating after limit | would still allow duplicates to crowd out unique rows.\nRejected: Always printing stack traces | exposes local paths for normal user-input failures.\nConfidence: high\nScope-risk: narrow\nDirective: Keep dedupe keys stable enough to avoid collapsing legitimately distinct historical election rows.\nTested: git diff --check; node --test packages/local-election-candidate-search/test/index.test.js; npm run lint --workspace local-election-candidate-search; npm run test --workspace local-election-candidate-search; npm pack --workspace local-election-candidate-search --dry-run; live 오세훈 smoke; live 김동연 duplicate repro; CLI no-args/help.\nNot-tested: Full npm run ci remains blocked by pre-existing missing SKILL.md: ohou-today-deal.

* Prevent filtered NEC lookup false negatives

Fix the candidate parser so documented education-superintendent and filtered local-election lookups return bounded, evidence-backed results instead of silently dropping valid rows.

Constraint: PR #266 round-3 review required TDD, Ralph verification, and branch update for issue #256.

Rejected: Full NEC pagination in this follow-up | broader than the approved change; bounded 100-row fetch now avoids user-limit false negatives and warns when capped.

Confidence: high

Scope-risk: narrow

Directive: Preserve exact-name fail-closed parsing and count raw parsed upstream rows before cap-warning decisions.

Tested: git diff --check; node --test packages/local-election-candidate-search/test/index.test.js; npm run lint --workspace local-election-candidate-search; npm run test --workspace local-election-candidate-search; npm pack --workspace local-election-candidate-search --dry-run; live CLI smokes for 오세훈, 조희연, 김동연; CLI help/no-args checks; architect verification CLEAR.

Not-tested: Full npm run ci remains blocked by pre-existing repo-wide missing SKILL.md: ohou-today-deal.

---------

Co-authored-by: OmX <omx@oh-my-codex.dev>

* chore(changesets): rename daiso bearer-auth changeset to avoid name collision with consumed main release

PR #245 already consumed .changeset/issue-207-daiso-pickup-eligibility.md
into daiso-product-search v0.3.0 on main. The dev branch later modified that
same changeset file in d7263a5 to describe the newer Bearer-auth fix, which
collides with main's deletion on the next dev→main sync.

Renaming the still-unreleased Bearer-auth note to
issue-207-daiso-bearer-auth.md preserves the release entry for the next
version-packages run and clears the modify/delete conflict on PR #271
without losing the changelog content.

* fix(kstartup-search): implement promised client-side filter to deliver on SKILL.md L121

Live data revealed two unmet contracts in the kstartup-search helper:

1. SKILL.md L121 promised the helper re-applies supt_regin / aply_trgt /
   biz_enyy filters on the client side because K-Startup upstream ignores
   them server-side. The helper had no such logic — calling
   `--supt-regin 서울특별시 --rcrt-prgs-yn Y` returned 경북/충북/충남
   announcements as-is, silently misleading callers.

2. The upstream `supt_regin` field is stored as the short form
   (`서울`, `경기`, `충북`, ...) but every CLI example in the skill used
   the standard 광역지자체 long form (`서울특별시`), which would never
   substring-match even after a client filter was added.

Add `apply_client_filters()` that runs after `urlopen` returns. It honors
the SKILL.md contract literally: substring match per token, AND-joined
across comma-separated user values, with a 17-region (+`전국`) shortname
normalisation table so both `--supt-regin 서울특별시` and
`--supt-regin 서울` resolve to upstream's `서울`. Filtered responses
expose a new `client_filter: {fields, upstream_returned, after_filter}`
metadata block so callers can detect "first page was depleted by filter"
and page through.

Tests: 9 new ClientFilterTests + 2 normalisation tests on top of the
existing 14 (25 total, all passing).

Live smoke (against a dev proxy with DATA_GO_KR_API_KEY activated for
dataset 15125364): `--supt-regin 서울특별시 --rcrt-prgs-yn Y --per-page 10`
now returns 4 actual 서울 announcements (upstream returned 10 mixed-region
rows; client filter narrowed to 4), with detl_pg_url to k-startup.go.kr.

Confidence: high. Scope-risk: narrow — purely additive on the response
path; other endpoints (business-info / contents / statistics) pass
through unchanged.

---------

Co-authored-by: arnold714 <arnold714@naver.com>
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: chanmin <cmju@cowave.kr>
Co-authored-by: OmX <omx@oh-my-codex.dev>
Co-authored-by: hmmhmmhm/ <hmmhmmhm@naver.com>
Co-authored-by: 배기민 <53887180+BAEM1N@users.noreply.github.com>
Co-authored-by: lee-ji-hong <zhffktkdlekghksxk@naver.com>
2026-05-19 11:08:10 +09:00
.changeset Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
.github Make Python release workflow plan safely 2026-05-14 12:26:57 +09:00
blue-ribbon-nearby [FEAT] blue-ribbon-nearby: rebrowser-playwright 기반 브라우저 fallback 추가 2026-04-09 13:33:52 +09:00
bunjang-search Sync dev → main: 84 commits incl. korea-weather, korean-stock-search, korean-patent-search, bunjang-search (#80) 2026-04-08 21:13:55 +09:00
catchtable-sniper Release: Merge dev into main (#163) 2026-04-24 10:41:21 +09:00
cheap-gas-nearby cheap-gas-nearby: proxy 경유로 전환 + 프로덕션 배포 구조 문서화 2026-04-06 16:51:27 +09:00
corporate-registration-consulting Merge dev into main (#197) 2026-05-02 23:51:59 +09:00
coupang-product-search Sync dev → main: MFDS proxy fixes, cache hardening, HWP kordoc, KRX degraded handling + new skills (#152) 2026-04-21 09:53:03 +09:00
court-auction-notice-search Enable property search by free auction conditions (#213) 2026-05-08 10:14:33 +09:00
daangn-cars-search feat: add Daangn search skills 2026-05-13 15:48:49 +09:00
daangn-jobs-search Keep Daangn jobs detail resilient 2026-05-14 00:40:00 +09:00
daangn-realty-search feat: add Daangn search skills 2026-05-13 15:48:49 +09:00
daangn-used-goods-search feat: add Daangn search skills 2026-05-13 15:48:49 +09:00
daishin-report-search Constrain report fetch credentials 2026-05-14 09:57:45 +09:00
daiso-product-search Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
danawa-price-search Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
delivery-tracking Document the verified public tracking outputs explicitly 2026-03-27 02:44:48 +09:00
docs Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
donation-place-search Feature/#212 (#214) 2026-05-08 15:41:21 +09:00
emergency-room-beds Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
examples Route shared key APIs through the proxy 2026-05-13 16:31:29 +09:00
express-bus-booking Make KOBUS seat holds reproducible for checkout handoff 2026-05-13 16:37:10 +09:00
fine-dust-location Stop guessing districts and require exact station retries for ambiguous fine-dust lookups 2026-03-28 23:28:12 +09:00
flight-ticket-search Validate flight search arguments before bootstrap 2026-05-12 19:11:29 +09:00
foresttrip-vacancy Merge pull request #188 from seolcoding/feature/foresttrip-vacancy 2026-04-30 01:28:57 +09:00
gangnamunni-clinic-search Enable public Gangnam Unni clinic lookup 2026-05-13 01:49:16 +09:00
geeknews-search Add a repeatable GeekNews lookup path without unofficial APIs 2026-04-13 00:16:35 +09:00
gongsijiga-search feat: 개별공시지가(gongsijiga-search) 스킬 추가 (#200) 2026-05-05 00:27:31 +09:00
han-river-water-level Merge main into dev and resolve 16-file conflicts 2026-04-06 15:25:49 +09:00
hipass-receipt Sync dev → main: 84 commits incl. korea-weather, korean-stock-search, korean-patent-search, bunjang-search (#80) 2026-04-08 21:13:55 +09:00
hola-poke-yeoksam Sync dev → main: scholarship, public restroom, KBL, Hola Poke + HWP/stock proxy upgrades (#136) 2026-04-18 11:50:47 +09:00
household-waste-info 📝 docs: 생활쓰레기·급식 hosted proxy 문서 정합성 및 skill-docs 회귀 테스트 2026-04-11 03:34:11 +09:00
hwp Release: Merge dev into main (#163) 2026-04-24 10:41:21 +09:00
intercity-bus-booking Let intercity booking helper create temporary seat holds 2026-05-13 15:43:26 +09:00
iros-registry-automation Prevent IROS download path failures after payment 2026-04-28 14:47:30 +09:00
joseon-sillok-search Restore the sillok CLI's verified stdlib transport fallback 2026-04-04 00:28:58 +09:00
k-dart Release: Merge dev into main (#163) 2026-04-24 10:41:21 +09:00
k-schoollunch-menu NEIS 급식·학교검색 프록시, k-schoollunch-menu 스킬 및 문서 2026-04-10 13:14:15 +09:00
k-skill-cleaner Clarify cleaner usage evidence boundaries 2026-04-28 18:08:17 +09:00
k-skill-setup Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
kakao-bar-nearby Let agents find open nearby bars from Korean map data 2026-03-29 15:34:31 +09:00
kakaotalk-mac Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
kbl-results Sync dev → main: scholarship, public restroom, KBL, Hola Poke + HWP/stock proxy upgrades (#136) 2026-04-18 11:50:47 +09:00
kbo-results Prepare k-skill for packaged releases and broader skill discovery 2026-03-25 23:57:53 +09:00
kleague-results Add an official K League results client and skill 2026-03-29 15:57:15 +09:00
korea-weather Feature/#205 (#210) 2026-05-06 16:56:40 +09:00
korean-character-count Preserve documented Korean count semantics in edge-case inputs 2026-04-08 23:28:42 +09:00
korean-cinema-search Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
korean-jangbu-for Prevent partial jangbu wrapper installs on collisions 2026-04-29 01:09:11 +09:00
korean-law-search Keep korean-law-search available during upstream outages (#45) 2026-04-02 23:33:12 +09:00
korean-marathon-schedule Feature/#211 (#222) 2026-05-12 18:49:06 +09:00
korean-patent-search Enable official English address lookup for Korean postcode searches 2026-04-10 10:34:25 +09:00
korean-privacy-terms Sync dev → main: MFDS proxy fixes, cache hardening, HWP kordoc, KRX degraded handling + new skills (#152) 2026-04-21 09:53:03 +09:00
korean-scholarship-search Sync dev → main: scholarship, public restroom, KBL, Hola Poke + HWP/stock proxy upgrades (#136) 2026-04-18 11:50:47 +09:00
korean-slang-writing Release: Merge dev into main (#163) 2026-04-24 10:41:21 +09:00
korean-spell-check Bundle korean-spell-check script inside skill directory for packageless installs 2026-04-06 15:11:24 +09:00
korean-stock-search Sync dev → main: scholarship, public restroom, KBL, Hola Poke + HWP/stock proxy upgrades (#136) 2026-04-18 11:50:47 +09:00
korean-transit-route Route shared key APIs through the proxy 2026-05-13 16:31:29 +09:00
kosis-stats Route shared key APIs through the proxy 2026-05-13 16:31:29 +09:00
kstartup-search Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
ktx-booking Reduce N-card number exposure in KTX booking 2026-05-12 19:06:27 +09:00
lck-analytics Ship LCK analytics inside k-skill's managed release flow 2026-04-03 18:05:14 +09:00
lh-notice-search Release: Merge dev into main (#163) 2026-04-24 10:41:21 +09:00
library-book-search Sync dev → main: MFDS proxy fixes, cache hardening, HWP kordoc, KRX degraded handling + new skills (#152) 2026-04-21 09:53:03 +09:00
local-election-candidate-search Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
lotto-results Prepare k-skill for packaged releases and broader skill discovery 2026-03-25 23:57:53 +09:00
market-kurly-search Add a supported Market Kurly price-lookup skill 2026-04-09 14:51:30 +09:00
mfds-drug-safety Route MFDS drug-safety and food-safety lookups through k-skill-proxy 2026-04-14 00:07:18 +09:00
mfds-food-safety Add product-report proxy route for health food manufacturing data (I0030) 2026-04-14 02:44:25 +09:00
myrealtrip-search Keep MyRealTrip MCP calls bounded and covered 2026-05-12 19:03:34 +09:00
naver-blog-research feat: 네이버 블로그 리서치 스킬 추가 (#107) 2026-04-13 00:06:18 +09:00
naver-news-search Release: Merge dev into main (#163) 2026-04-24 10:41:21 +09:00
naver-shopping-search Sync dev → main: MFDS proxy fixes, cache hardening, HWP kordoc, KRX degraded handling + new skills (#152) 2026-04-21 09:53:03 +09:00
nts-business-registration Harden NTS validate privacy boundary 2026-05-14 22:20:33 +09:00
ohou-today-deal Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
olive-young-search Document a runnable Olive Young clone fallback 2026-04-05 23:34:21 +09:00
packages Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
parking-lot-search Fix parking lot lookups: force HTTPS, cache full dataset, normalize provider fields (#156) 2026-04-22 10:52:57 +09:00
public-restroom-nearby Improve restroom coverage with Kakao source merging 2026-04-28 23:28:12 +09:00
python-packages Prepare k-skill for packaged releases and broader skill discovery 2026-03-25 23:57:53 +09:00
real-estate-search real-estate-search: MCP self-host → k-skill-proxy HTTP 전환 2026-04-06 16:50:27 +09:00
rhwp-advanced Release: Merge dev into main (#163) 2026-04-24 10:41:21 +09:00
rhwp-edit Release: Merge dev into main (#163) 2026-04-24 10:41:21 +09:00
scripts Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
seoul-density Ship seoul-density script next to its SKILL.md 2026-05-15 00:32:54 +09:00
seoul-subway-arrival Feature/#205 (#210) 2026-05-06 16:56:40 +09:00
sh-notice-search Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
srt-booking Replace sops+age encryption with plain dotenv and agent-native credential resolution 2026-03-30 22:12:04 +09:00
subway-lost-property Keep LOST112 curl guidance usable under live latency 2026-04-10 13:01:01 +09:00
ticket-availability Let ticket tests run without httpx installed 2026-05-14 12:30:05 +09:00
tools/k-skill-qa-bot Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
toss-securities Add a safe Toss Securities lookup surface without trading mutations 2026-03-30 11:25:43 +09:00
used-car-price-search Enable repeatable used-car price lookups from a rental-company source 2026-04-02 16:26:04 +09:00
zipcode-search Document direct zipcode helper execution so the executable follow-up stays discoverable 2026-04-10 10:59:22 +09:00
.gitignore feat: Manus.ai 호환 import 경로 추가 (GitHub URL + rolling .skill 번들) (#227) 2026-05-11 12:12:44 +09:00
AGENTS.md feat: 개별공시지가(gongsijiga-search) 스킬 추가 (#200) 2026-05-05 00:27:31 +09:00
CLAUDE.md chore: merge dev into danawa skill PR 2026-05-10 17:42:10 +09:00
CONTRIBUTING.md Feature/#202 (#208) 2026-05-06 12:39:49 +09:00
ecosystem.config.cjs Make the fine-dust proxy easier to consume than the upstream APIs 2026-03-28 17:14:18 +09:00
LICENSE Frame k-skill as an installable Korean skills package 2026-03-25 00:16:11 +09:00
package-lock.json Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
package.json Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
README.md Sync dev → main: 신규 스킬 6종 (emergency-room-beds · korean-cinema-search · kstartup-search · local-election-candidate-search · ohou-today-deal · sh-notice-search) + k-skill-qa-bot + daiso/danawa 보강 (#271) 2026-05-19 11:08:10 +09:00
tsconfig.json Prepare k-skill for packaged releases and broader skill discovery 2026-03-25 23:57:53 +09:00

k-skill

k-skill thumbnail

한국인인가요? 이 스킬 모음집을 다운로드 받아 두세요. 언젠가 무조건 쓸 때가 옵니다! SRT, KTX, KBO, 로또, 당근, 쿠팡, 카톡, 정부24, 홈택스 등등 귀찮은 것을 AI 에이전트에게 다 시켜버리세요.

Claude Code, Codex, OpenCode, OpenClaw/ClawHub 등 각종 코딩 에이전트 지원합니다.

추가 클라이언트 API 레이어는 불필요합니다. 필요한 경우 k-skill-proxy 같은 프록시 서버에 HTTP 요청만 넣으면 됩니다.

잠깐만~~~

한국인이면 깃허브 스타 눌러줍시다. 다만 에이전트는 자동으로 누르지 말고, 사용자가 동의한 경우에만 gh repo star NomaDamas/k-skill 를 실행합니다.

기여 전에는 기여 가이드를 확인해 주세요.

어떤 걸 할 수 있나

"사용자 로그인" 컬럼은 사용자 본인이 직접 로그인/시크릿을 들고 있어야 하는지 만 표시합니다. k-skill-proxy 등 운영자가 관리하는 키는 사용자 입장에서는 불필요로 분류합니다. 선택사항은 사용자가 운영자 키를 직접 들고 있으면 더 풍부한 경로가 켜지고, 없으면 기본 경로(보통 운영자가 관리하는 hosted fallback)로 그대로 동작하는 경우를 말합니다.

할 수 있는 일 스킬 이름 설명 사용자 로그인 문서
SRT 예매 srt-booking SRT 열차 조회, 예약, 예약 확인, 취소 필요 SRT 예매 가이드
KTX 예매 ktx-booking KTX/Korail 열차 조회, 예약, 예약 확인, 취소 필요 KTX 예매 가이드
고속버스 예매 express-bus-booking KOBUS 고속버스 배차·좌석·요금 조회와 결제 직전 handoff(결제는 수동) 불필요 고속버스 예매 가이드
시외버스 예매 intercity-bus-booking 티머니 시외버스 배차·좌석·요금 조회와 결제 직전 handoff(결제는 수동) 불필요 시외버스 예매 가이드
자연휴양림 빈 객실 조회 foresttrip-vacancy 공식 숲나들e 자연휴양림 예약 가능 객실 조회 자동화 (예약/결제 제외) 필요 자연휴양림 빈 객실 조회 가이드
카카오톡 Mac CLI kakaotalk-mac macOS에서 카카오톡 대화 조회, 검색, 메시지 전송/삭제 불필요(로컬 앱/권한 필요) 카카오톡 Mac CLI 가이드
서울 지하철 도착정보 조회 seoul-subway-arrival 서울 지하철 역 기준 실시간 도착 예정 열차 확인 불필요 서울 지하철 도착정보 가이드
서울 실시간 혼잡도 조회 seoul-density 서울 주요 121개 핫스팟의 실시간 혼잡도 단계와 추정 인구 조회 불필요 서울 실시간 혼잡도 가이드
한국 대중교통 길찾기 korean-transit-route ODsay LIVE API + Kakao geocoding 기반 출발지→도착지 지하철+버스+도보 경로 및 환승 정보 조회 필요 한국 대중교통 길찾기 가이드
지하철 분실물 조회 subway-lost-property 지하철 역/물품명 기준 공식 LOST112 분실물 검색 조건과 유실물센터 진입점 안내 불필요 지하철 분실물 조회 가이드
긱뉴스 조회 geeknews-search GeekNews 공개 RSS/Atom 피드 기반 최신 글 목록, 검색, 상세 확인 불필요 긱뉴스 조회 가이드
한국 날씨 조회 korea-weather 기상청 단기예보 기반 한국 날씨 조회 불필요 한국 날씨 조회 가이드
사용자 위치 미세먼지 조회 fine-dust-location 현재 위치 또는 지역 기준 PM10/PM2.5 미세먼지 조회 불필요 사용자 위치 미세먼지 조회 가이드
한강 수위 정보 조회 han-river-water-level 한강 관측소 기준 현재 수위·유량·기준수위 확인 불필요 한강 수위 정보 가이드
한국 법령 검색 korean-law-search 한국 법령/조문/판례/유권해석 검색 불필요 한국 법령 검색 가이드
등기부등본 자동화 iros-registry-automation 인터넷등기소(IROS)에서 법인/부동산 등기부등본 장바구니, 수동 결제 후 열람·저장 흐름을 보조 필요(수동 로그인·결제/TouchEn) 등기부등본 자동화 가이드
법인등기 신청 컨설팅 corporate-registration-consulting 일반 영리 주식회사 발기설립 기준으로 법인명·이사·주소 등 사용자 결정사항을 받아 표준 정관, 설립등기 첨부서류, 등록면허세·과밀억제권역 중과 체크, rhwp 기반 HWP 양식 순차 작성 흐름을 참고용으로 안내 불필요 법인등기 신청 컨설팅 가이드
사업자등록정보 확인 nts-business-registration 국세청 사업자등록번호 상태조회와 사업자등록정보 진위확인(공공데이터포털 API, 프록시 경유) 불필요 사업자등록정보 확인 가이드
창업진흥원 K-Startup 조회 kstartup-search 창업진흥원 K-Startup 통합공고 사업·지원사업 공고·창업 콘텐츠·통계보고서 조회 (공공데이터포털 15125364, 프록시 경유) 불필요 창업진흥원 K-Startup 조회 가이드
지방선거 후보자 조회 local-election-candidate-search 중앙선거관리위원회 선거통계시스템 공개 통합검색으로 지방선거 후보자 이력·선거종류·정당·지역·득표 정보를 이름 기준으로 조회 불필요 지방선거 후보자 조회 가이드
한국 사업자 장부 자동화 korean-jangbu-for kimlawtech/korean-jangbu-for 기반 카드·은행·영수증·세금계산서 입력 → 표준 거래내역·계정과목·세무사 전달 CSV·경영 리포트 생성 thin wrapper 선택사항(CODEF BYOK 자동 수집 시 필요) 한국 사업자 장부 자동화 가이드
한국 개인정보처리방침·이용약관 자동 생성 korean-privacy-terms Next.js 프로젝트에 개인정보보호법·약관규제법·전자상거래법 기반 개인정보처리방침/이용약관/쿠키 배너/동의 모달을 생성하는 kimlawtech/korean-privacy-terms (Apache-2.0) thin wrapper 불필요 한국 개인정보처리방침·이용약관 자동 생성 가이드
한국 부동산 실거래가 조회 real-estate-search 아파트/오피스텔/빌라/단독주택 실거래가·전월세·지역코드 조회 불필요 한국 부동산 실거래가 조회 가이드
개별공시지가 조회 gongsijiga-search realtyprice.kr 공개 API에서 지번 단위 개별공시지가(원/㎡) 다년도 추이·전년 대비 변동률 조회 불필요 개별공시지가 조회 가이드
SH 청약·주택 공고문 조회 sh-notice-search 서울주택도시개발공사(SH) 공개 공고/공지 게시판을 직접 조회해 키워드·공고 종류별 목록, 상세 본문, 첨부 미리보기 메타데이터 확인 불필요 SH 청약·주택 공고문 조회 가이드
LH 청약 공고문 조회 lh-notice-search 한국토지주택공사(LH) 임대/분양/주거복지(신혼희망타운)/토지/상가 공고를 지역·상태·공고유형·키워드로 조회하고 마감 여부를 KST 기준으로 표시 불필요 LH 청약 공고문 조회 가이드
법원 경매 부동산 매각공고 조회 court-auction-notice-search 대법원경매정보(courtauction.go.kr) 부동산 매각공고를 매각기일·법원·기일/기간 입찰 조건으로 검색해 사건번호·용도·주소·감정평가액·최저매각가격을 펼치고, 사건번호로 직접 사건정보·물건내역·매각기일이력을 조회 불필요 법원 경매 부동산 매각공고 조회 가이드
기부처 조회 donation-place-search 지역·관심 분야 기준 기부처 후보와 공식 페이지/1365 확인용 검색 링크 안내 (기부·결제 자동화 제외) 불필요 기부처 조회 가이드
장학금 검색 및 조회 korean-scholarship-search 한국장학재단·전국 대학교·재단·기업 장학 공고를 검색해 금액·자격·지원구간·링크를 정리하고 KST 기준 현재 날짜 마감 상태와 조건별 필터링까지 제공 불필요 장학금 검색 및 조회 가이드
생활쓰레기 배출정보 조회 household-waste-info 시군구 기준 생활쓰레기·음식물·재활용 배출요일·시간·장소·관리부서 확인 불필요 생활쓰레기 배출정보 조회 가이드
학교 급식 식단 조회 k-schoollunch-menu 교육청·학교명으로 NEIS 학교 검색·급식 식단 조회 불필요 학교 급식 식단 조회 가이드
도서관 도서 조회 library-book-search 도서관 정보나루 기반 도서 검색, 상세, 소장 도서관, 도서관별 소장 여부 조회 불필요 도서관 도서 조회 가이드
의약품 안전 체크 mfds-drug-safety 식약처 e약은요·안전상비의약품 정보를 인터뷰-first 흐름으로 프록시 조회 불필요 의약품 안전 체크 가이드
식품 안전 체크 mfds-food-safety 식약처 부적합 식품·식품안전나라 회수 정보를 인터뷰-first 흐름으로 프록시 조회 불필요 식품 안전 체크 가이드
한국 주식 정보 조회 korean-stock-search KRX 상장 종목 검색, 기본정보, 일별 시세 조회 불필요 한국 주식 정보 조회 가이드
금감원 DART 전자공시 조회 k-dart 공시검색, 기업개황, 재무제표, 배당, 증자/감자, 감사의견, 주요사항보고서 등 14개 endpoint 필요 금감원 DART 전자공시 조회 가이드
대신증권 리포트 조회 daishin-report-search GitHub Pages에 공개된 대신증권 리포트 HTML 미러에서 최신 리포트 목록, 원문, 설명 페이지, Rating/Target 표를 조회 불필요 대신증권 리포트 조회 가이드
국가데이터처 KOSIS 통계 조회 kosis-stats 국가데이터처가 운영하는 KOSIS(국가통계포털) Open API로 통계표 검색·메타·데이터·대용량 자료 조회 (조회 전용) 일반 조회 불필요 (bigdata/--direct 필요) 국가데이터처 KOSIS 통계 조회 가이드
조선왕조실록 검색 joseon-sillok-search 조선왕조실록 키워드 검색과 왕별/연도별 필터, 기사 발췌 조회 불필요 조선왕조실록 검색 가이드
한국 특허 정보 검색 korean-patent-search 한국 특허/실용신안 키워드 검색 및 출원번호 상세 조회 필요 한국 특허 정보 검색 가이드
근처 가장 싼 주유소 찾기 cheap-gas-nearby 현재 위치 기준 근처 최저가 주유소 조회 불필요 근처 가장 싼 주유소 찾기 가이드
근처 공중화장실 찾기 public-restroom-nearby 현재 위치 기준 근처 공중화장실/개방화장실 조회 불필요 근처 공중화장실 찾기 가이드
근처 공영주차장 찾기 parking-lot-search 현재 위치 기준 근처 공영주차장 위치·요금·운영시간 조회 불필요 근처 공영주차장 찾기 가이드
근처 응급실 병상 상태 확인 emergency-room-beds 현재 위치 기준 가까운 응급실 운영·입원실/병상 운영 플래그와 갱신시각 조회 (정확한 잔여 병상 수/가동률은 공개 E-Gen nearby 목록에 없음) 불필요 근처 응급실 병상 상태 확인 가이드
한국 마라톤 일정 조회 korean-marathon-schedule 고러닝 공개 페이지와 대한철인3종협회 일정에서 마라톤·철인3종 대회 일정, 장소, 신청 마감일, 종목 조회 불필요 한국 마라톤 일정 조회 가이드
KBO 경기 결과 조회 kbo-results 날짜별 KBO 경기 일정, 결과, 팀별 필터링 불필요 KBO 결과 가이드
KBL 경기 결과 조회 kbl-results 날짜별 KBL 경기 일정, 결과, 팀별 필터링, 현재 순위 확인 불필요 KBL 경기 결과 가이드
K리그 경기 결과 조회 kleague-results 날짜별 K리그1/K리그2 경기 결과, 팀별 필터링, 현재 순위 확인 불필요 K리그 결과 가이드
LCK 경기 분석 lck-analytics LCK 경기 결과, 현재 순위, live turning point, 밴픽, 패치 메타, 팀 파워 레이팅 불필요 LCK 경기 분석 가이드
토스증권 조회 toss-securities 토스증권 계좌 요약, 포트폴리오, 시세, 주문내역, 관심종목 조회 필요 토스증권 조회 가이드
하이패스 영수증 발급 hipass-receipt 하이패스 사용내역 조회 및 영수증 출력 payload 준비 필요 하이패스 영수증 발급 가이드
캐치테이블 예약 스나이핑 catchtable-sniper 로그인된 캐치테이블 Chrome 세션으로 빈자리 감시, 오픈런, 자동 예약 시도 필요 캐치테이블 예약 스나이핑 가이드
공연 일정·잔여석 조회 ticket-availability YES24·인터파크 공연의 회차별 일정과 등급별 잔여석 수를 단일 HTTP 호출로 조회 (조회 전용, 예매·결제 없음) 불필요 공연 일정·잔여석 조회 가이드
로또 당첨 확인 lotto-results 로또 최신 회차, 특정 회차, 번호 대조 불필요 로또 결과 가이드
HWP 문서 조회/변환 hwp .hwp/.hwpx → Markdown/JSON 변환, 문서 비교, 양식 필드 추출, Markdown→HWPX 역변환 (kordoc 기반 read-only) 불필요 HWP 문서 처리 가이드
HWP 문서 편집 rhwp-edit .hwp 본문 텍스트 삽입/삭제, 표 생성, 셀 수정, replace-all (k-skill-rhwp CLI + @rhwp/core WASM, HWP 5.x round-trip) 불필요 HWP 문서 편집 가이드
HWP 레이아웃·IR 디버깅 rhwp-advanced 업스트림 rhwp Rust CLI(export-svg --debug-overlay, dump, dump-pages, ir-diff, thumbnail, convert)로 HWP 레이아웃 진단·IR 덤프·버전 비교·썸네일 추출·배포용 문서 잠금 해제 불필요 HWP 레이아웃·IR 디버깅 가이드
근처 블루리본 맛집 ⚠️ 지원 중단 blue-ribbon-nearby 현재 위치 기준 근처 블루리본 선정 맛집 조회 불필요 근처 블루리본 맛집 가이드
근처 술집 조회 kakao-bar-nearby 현재 위치 기준 영업 상태·메뉴·좌석·전화번호가 포함된 근처 술집 조회 불필요 근처 술집 조회 가이드
우편번호 검색 zipcode-search 주소 키워드로 우편번호 + 공식 영문주소 조회 불필요 우편번호 검색 가이드
다이소 상품 조회 daiso-product-search 다이소 매장별 상품 재고 확인 불필요 다이소 상품 조회 가이드
강남언니 병원 조회 gangnamunni-clinic-search 강남언니 공개 검색 페이지에서 성형외과·피부과 병원 후보, 평점, 리뷰 수, 지원 언어, 공개 링크 조회 불필요 강남언니 병원 조회 가이드
마켓컬리 상품 조회 market-kurly-search 마켓컬리 상품 검색, 현재 가격, 할인 여부, 품절 여부 조회 불필요 마켓컬리 상품 조회 가이드
올리브영 검색 olive-young-search 올리브영 매장·상품·재고 조회 불필요 올리브영 검색 가이드
영화관 검색 korean-cinema-search CGV·메가박스·롯데시네마 영화관, 상영작, 시간표, 잔여석 조회 불필요 영화관 검색 가이드
올라포케 역삼 포케 hola-poke-yeoksam 올라포케 역삼점 메뉴, 매장 정보, 이벤트 참여 흐름 안내 불필요 올라포케 역삼 포케 가이드
마이리얼트립 MCP 검색 myrealtrip-search 공식 MCP 서버로 항공권, 숙소, 투어·티켓·액티비티 검색과 상세·옵션 확인 불필요 마이리얼트립 MCP 검색 가이드
항공권 가격 조회 flight-ticket-search fast-flights 기반 Google Flights 공개 검색으로 항공권 후보, 예약 검색 링크, 날짜/월/연도별 최저가·평균가 비교 (조회 전용, 예매·결제 없음) 불필요 항공권 가격 조회 가이드
택배 배송조회 delivery-tracking CJ대한통운·우체국 송장 번호로 배송 상태 조회 불필요 택배 배송조회 가이드
쿠팡 상품 검색 coupang-product-search 쿠팡 상품 검색, 로켓배송 필터, 가격대 검색, 비교, 베스트, 골드박스 특가 조회 선택사항 (운영 키 있으면 로컬 HMAC 경로, 없으면 hosted fallback) 쿠팡 상품 검색 가이드
오늘의집 오늘의딜 조회 ohou-today-deal 오늘의집 공개 오늘의딜 특가 상품의 할인율·가격·리뷰·링크 조회 불필요 오늘의집 오늘의딜 조회 가이드
번개장터 검색 bunjang-search 번개장터 검색, 상세조회, 선택적 찜/채팅, AI TOON export 불필요 번개장터 검색 가이드
당근 중고거래 검색 daangn-used-goods-search 당근 중고거래 공개 웹 데이터 표면으로 키워드·지역 기반 매물 검색과 상세 조회 불필요 당근 중고거래 검색 가이드
당근부동산 검색 daangn-realty-search 당근부동산 공개 웹 데이터 표면으로 지역 기반 부동산 매물 검색과 상세 확인 불필요 당근부동산 검색 가이드
당근알바 검색 daangn-jobs-search 당근알바 공개 웹 데이터 표면으로 키워드·지역 기반 알바 공고 검색과 상세 조회 불필요 당근알바 검색 가이드
당근중고차 검색 daangn-cars-search 당근중고차 공개 웹 데이터 표면으로 지역·가격 조건 기반 차량 검색과 상세 조회 불필요 당근중고차 검색 가이드
중고차 가격 조회 used-car-price-search 중고차 인수가/월 렌트료 비교 조회 불필요 중고차 가격 조회 가이드
한국어 맞춤법 검사 korean-spell-check 한국어 텍스트 맞춤법/문법 검사 및 교정안 정리 불필요 한국어 맞춤법 검사 가이드
네이버 블로그 리서치 naver-blog-research 네이버 블로그 검색, 원문 읽기, 이미지 다운로드, 한국어 콘텐츠 교차 검증 불필요 네이버 블로그 리서치 가이드
네이버 쇼핑 가격비교 naver-shopping-search 네이버 검색 Open API 우선, 공개 BFF JSON fallback으로 상품 후보·현재 노출가·판매처 링크 비교 불필요 네이버 쇼핑 가격비교 가이드
다나와 최저가 비교 danawa-price-search 다나와 공개 검색/가격비교 표면으로 상품 후보·쇼핑몰별 가격·배송비 포함 실구매가·카드 할인가·무이자 할부 비교 불필요 다나와 최저가 비교 가이드
네이버 뉴스 검색 naver-news-search 네이버 검색 Open API 뉴스 검색으로 기사 제목·요약·발행시각·원문/네이버 링크를 정리 불필요 네이버 뉴스 검색 가이드
한국어 글자 수 세기 korean-character-count 한국어 텍스트의 글자 수·줄 수·UTF-8/NEIS byte 수를 결정론적으로 계산 불필요 한국어 글자 수 세기 가이드
한국어 유행어 글쓰기 korean-slang-writing 나무위키 유행어 기반 큐레이션 시드로 한국 유행어 후보 조회, 무드/문맥/safety 필터 및 나무위키 best-effort 요약으로 한국어 글을 유행어 느낌으로 작성 불필요 한국어 유행어 글쓰기 가이드
K-스킬 클리너 k-skill-cleaner 인터뷰와 코딩 에이전트별 트리거 횟수 통계를 합쳐 불필요한 K-스킬 삭제 후보를 추천 불필요 K-스킬 클리너 가이드

⚠️ 근처 블루리본 맛집 스킬 — 지원 중단

블루리본 측이 www.bluer.co.kr 에 자동화 접근 전면 차단을 적용해 스킬이 더 이상 동작하지 않습니다.

  • 브라우저·curl·Playwright·TLS impersonation 등 가능한 우회를 모두 검증했지만 nginx 단에서 403이 반환되며, 같은 가구 공인 IP로도 특정 장비만 차단되는 상황이 관측되었습니다.
  • 유료 회원권 보유자도 접근이 막히는 사례가 확인되었습니다. 복구 여부와 일정은 블루리본 측 정책에 전적으로 달려 있어 이 레포에서 대응할 수 있는 범위를 벗어났습니다.
  • 해당 스킬 디렉토리(blue-ribbon-nearby/)와 관련 프록시 라우트는 히스토리 보존을 위해 당분간 남겨두지만, 새 프로젝트에서는 해당 스킬을 사용하지 마세요. 차단이 해제되는 날이 오면 이 안내를 제거하고 재검증하겠습니다.

처음 시작하는 순서

  1. 설치 방법을 따라 k-skill 전체 스킬을 먼저 설치합니다.
  2. 설치가 끝나면 k-skill-setup 스킬을 사용해 credential 확보와 환경변수 확인을 진행합니다.
  3. 시크릿이 비어 있으면 공통 설정 가이드보안/시크릿 정책에 따라 credential resolution order로 확보합니다.
  4. Node/Python 패키지가 없으면 먼저 전역 설치를 기본으로 진행합니다.
  5. 각 기능 문서를 열어 입력값, 예시, 제한사항을 확인합니다.

문서

문서 설명
설치 방법 패키지 설치, 선택 설치, 로컬 테스트 방법
기여 가이드 외부 기여자를 위한 소통, PR 대상 브랜치, 스킬 문서, Changesets, 프록시 정책
Manus.ai 에서 가져오기 Manus.ai 에서 개별 스킬 폴더 URL 가져오기 또는 npm run build:manus-bundle 로 빌드한 .skill 파일을 드래그-드롭으로 업로드하는 방법
공통 설정 가이드 credential resolution order, 기본 secrets 파일 준비
보안/시크릿 정책 인증 정보 저장 원칙, 금지 패턴, 표준 환경변수 이름
k-skill 프록시 서버 가이드 무료 API를 프록시 서버로 바로 호출하는 방법
릴리스/배포 가이드 npm Changesets, Python release-please, trusted publishing 운영 규칙
로드맵 현재 포함 기능과 다음 후보
출처/참고 표면 설계 시 참고한 공개 라이브러리와 공식 문서

포함된 기능

설치 기본 흐름은 "전체 스킬 설치 → k-skill-setup 실행 → 개별 기능 사용" 입니다.