k-skill
FrameworkNomaDamas/k-skill
A collection of AI agent skills for Korean daily life and government services.
Overview
Provides a comprehensive set of skills for AI coding agents like Claude Code and Codex, covering Korean services such as train booking, transit, public data, real estate, and legal tasks. Users install skills via npx, and optional proxy support handles backend credentials.
README Preview
# k-skill\n\n\n\n한국인인가요? 이 스킬 모음집을 다운로드 받아 두세요. 언젠가 **무조건** 쓸 때가 옵니다!\nSRT, KTX, KBO, 로또, 당근, 쿠팡, 카톡, 정부24, 홈택스 등등 귀찮은 것을 AI 에이전트에게 다 시켜버리세요.\n\nClaude Code, Codex, OpenCode, OpenClaw/ClawHub 등 각종 코딩 에이전트 지원합니다.\n\n추가 클라이언트 API 레이어는 불필요합니다. 필요한 경우 `k-skill-proxy` 같은 프록시 서버에 HTTP 요청만 넣으면 됩니다.\n\n## 설치\n\n```bash\n# 전체 스킬 설치\nnpx --yes skills add NomaDamas/k-skill --all -g\n\n# 특정 스킬만 설치\nnpx --yes skills add NomaDamas/k-skill --skill srt-booking -g\n```\n\nNode.js 18 이상과 `npx`만 있으면 됩니다. Claude Code 사용자는 아래 마켓플레이스로도 설치할 수 있습니다. 자세한 방법은 [설치 방법](docs/install.md)을 참고하세요.\n\n## 잠깐만~~~\n\n한국인이면 깃허브 스타 눌러줍시다.\n다만 에이전트는 자동으로 누르지 말고, 사용자가 동의한 경우에만 `gh repo star NomaDamas/k-skill` 를 실행합니다.\n\n기여 전에는 [기여 가이드](CONTRIBUTING.md)를 확인해 주세요.\n\n## 어떤 걸 할 수 있나\n\n"사용자 로그인" 컬럼은 **사용자 본인이 직접 로그인/시크릿을 들고 있어야 하는지** 만 표시합니다. `k-skill-proxy` 등 운영자가 관리하는 키는 사용자 입장에서는 **불필요**로 분류합니다. **선택사항**은 사용자가 운영자 키를 직접 들고 있으면 더 풍부한 경로가 켜지고, 없으면 기본 경로(보통 운영자가 관리하는 hosted fallback)로 그대로 동작하는 경우를 말합니다.\n\n| 할 수 있는 일 | 스킬 이름 | 설명 | 사용자 로그인 | 문서 |\n| --- | --- | --- | --- | --- |\n| SRT 예매 | `srt-booking` | SRT 열차 조회·좌석 확인·예약·취소 | 필요 | [SRT 예매 가이드](docs/features/srt-booking.md) |\n| KTX 예매 | `ktx-booking` | KTX/Korail 좌석번호·콘센트 좌석 확인·예약·취소 | 필요 | [KTX 예매 가이드](docs/features/ktx-booking.md) |\n| 고속버스 예매 | `express-bus-booking` | KOBUS 배차·좌석·요금·임시 선점 조회와 예매 지원 | 필요 | [고속버스 예매 가이드](docs/features/express-bus-booking.md) |\n| 시외버스 예매 | `intercity-bus-booking` | 티머니 배차·좌석·요금·임시 선점 조회와 예매 지원 | 필요 | [시외버스 예매 가이드](docs/features/intercity-bus-booking.md) |\n| 자연휴양림 빈 객실 조회 | `foresttrip-vacancy` | 공식 숲나들e 빈 객실 조회와 예약 지원 | 필요 | [자연휴양림 빈 객실 조회 가이드](docs/features/foresttrip-vacancy.md) |\n| 카카오톡 Mac 아카이브 검색 | `kakaotalk-mac` | `katok`으로 macOS 카카오톡 로컬 아카이브를 동기화하고 keyword/BM25/semantic 검색 | 불필요(로컬 앱/권한 필요) | [카카오톡 Mac 아카이브 검색](docs/features/kakaotalk-mac.md) |\n| 서울 지하철 도착정보 조회 | `seoul-subway-arrival` | 서울 지하철 역 기준 실시간 도착 예정 열차 확인 | 불필요 | [서울 지하철 도착정보 가이드](docs/features/seoul-subway-arrival.md) |\n| 서울 실시간 혼잡도 조회 | `seoul-d
FAQ (5)
TroubleshootingHow to fix Cloudflare 530 and dashboard 502 after a server reboot when systemd user services do not automatically restart?
The outage occurs when the local proxy is healthy but the cloudflared tunnel and observability/dashboard services remain dead after reboot. Restart=on-failure does not restart services after a clean reboot/SIGTERM, and the deploy cron only restarted the proxy.
Immediate recovery on gpu01 as the service user:
systemctl --user start k-skill-proxy-tunnel k-skill-proxy-grafana k-skill-proxy-loki k-skill-proxy-promtail
systemctl --user is-active k-skill-proxy-tunnel k-skill-proxy-grafana k-skill-proxy-loki k-skill-proxy-promtail
curl -fsS http://127.0.0.1:8080/healthThen verify the public proxy returns 200/302 and the dashboard no longer returns 502.
Permanent fix:
1. Commit the missing tunnel unit to the repository and include the NFS boot-race dependency:
[Unit]
StartLimitIntervalSec=0
RequiresMountsFor=/data/...
[Service]
Restart=always2. Change all units under
infra/k-skill-proxy-dashboard/systemd/*.service from Restart=on-failure to Restart=always.3. Reload and enable the updated units:
systemctl --user daemon-reload
systemctl --user enable --now k-skill-proxy-tunnel k-skill-proxy-grafana k-skill-proxy-loki k-skill-proxy-promtail4. Add a watchdog to the 5-minute deploy cron so dead services are started even when the deployed SHA has not changed:
systemctl --user is-active --quiet \
k-skill-proxy-tunnel k-skill-proxy-grafana k-skill-proxy-loki k-skill-proxy-promtail \
|| systemctl --user start \
k-skill-proxy-tunnel k-skill-proxy-grafana k-skill-proxy-loki k-skill-proxy-promtail5. Run the public
/health smoke test on every cron execution, regardless of deployed-sha, and alert or create an incident issue on failure.6. As additional hardening, set
KSKILL_PROXY_HOST=127.0.0.1 instead of 0.0.0.0, and upgrade cloudflared from 2026.6.1 to 2026.8.2.
Validation: reboot gpu01, then confirm all five services return active and both https://k-skill-proxy.nomadamas.org and https://k-skill-proxy-dashboard.nomadamas.org return 200/302 without manual intervention.
TroubleshootingHow do I fix k-skill-proxy real-estate 502 errors caused by MOLIT returning HTTP 200 with resultCode 22 quota exceeded?
These 502s are semantic upstream errors, not retryable transport failures. MOLIT returns HTTP 200 with an XML error body where resultCode != 000; molit.js converts it to molit_api_<code>, and server.js maps all such results to 502. fetchWithRetry retries only HTTP 429/5xx, so resultCode 22 (LIMITED NUMBER OF SERVICE REQUESTS EXCEEDS) is not retried successfully. Deploy the fix from PR #621, or apply the same mapping: classify resultCode 22 as 503 upstream_quota_exceeded with Retry-After: 3600 and do not retry it; classify key/application errors such as 20, 30, and 31 separately and log them at error level; keep 502 only for genuine transient upstream failures. In the real-estate and krx-stock routes, add request.log.warn({ route, upstreamError: result.error, message }) before returning 502. Add a server.test.js scenario for resultCode 22 and run the test suite. After deployment, quota failures appear as attributable 503 responses instead of anonymous 502s.
Troubleshootingkorean-privacy-terms에서 한글 이용약관 템플릿이 0바이트라 약관이 생성되지 않을 때 어떻게 해결하나요?
원인은 고정된 업스트림 커밋 e390f7b9feb825e368c26726363ea5ce11a34083에서 한국어 이용약관 템플릿 2개가 빈 파일로 포함된 것입니다.
먼저 빈 템플릿을 확인하세요:
find ~/.claude/skills/korean-privacy-terms -name '*.tmpl' -size 0
임시 해결 방법은 영문 템플릿을 구조 참고용으로 사용해 한국어 약관을 직접 작성하는 것입니다:
base=~/.claude/skills/korean-privacy-terms/upstream
# 필요한 경로에 한국어 약관 파일을 직접 생성
vi "$base/jurisdictions/kr-pipa/terms-of-service.ko.mdx.tmpl"
vi "$base/templates/terms-of-service.mdx.tmpl"작성 시 같은 디렉터리의
terms-of-service.en.mdx.tmpl 또는 templates/terms-of-service.en.mdx.tmpl의 변수와 레이아웃은 유지하고, 법률 문구는 한국어로 검토해 교체해야 합니다. 작성 후 스킬 렌더링을 다시 실행하세요. 개인정보처리방침 템플릿은 정상이므로 해당 산출물에는 영향이 없습니다.
병합된 d7f45d4는 install.sh에 0바이트 템플릿 경고와 문서화를 추가했을 뿐, 빈 한국어 템플릿 자체를 채우지는 않습니다. 근본 해결은 업스트림 kimlawtech/korean-privacy-terms에 한국어 템플릿이 추가된 뒤 scripts/upstream.pin을 해당 커밋으로 올려야 합니다.
TroubleshootingHow to fix the CGV bot-block error or '503 CGV_UPSTREAM_UNAVAILABLE' in korean-movie-search?
This is caused by CGV's upstream bot detection/access restriction, not by an invalid skill or CLI input. First verify the service with npx --yes daiso health. If health is normal but CGV endpoints return 503 CGV_UPSTREAM_UNAVAILABLE, wait and retry later. Do not bypass CAPTCHA, browser verification, or access controls; proxies, user-agent spoofing, and automated CAPTCHA solving are not supported. If a different error occurs, recheck the movie/theater identifier and CLI syntax. Persistent failures require waiting until CGV removes the restriction.
informationalHow can I search for animal pharmacies selling specific veterinary medicine in Korea via MCP?
You can use the Streamable HTTP MCP server at https://hkmedi.co.kr/pharmacy-mcp, which has also been packaged as the animal-pharmacy-search skill in the K-Skill repository (merged via PR #630). This tool supports: 1. Browsing regional lists of Korean animal pharmacies, 2. Searching veterinary medicinal products by keyword or efficacy, 3. Filtering results to only pharmacies with a purchase record for the target product in the last 6 months for higher reliability. Note: This data is sourced from private commercial distributor Hongik Medicare, not official public government data. It does not guarantee real-time in-stock status or complete nationwide coverage, and is not a replacement for professional veterinary diagnosis or prescription. Always call the pharmacy to confirm product availability before visiting.