mirror of
https://github.com/NomaDamas/k-skill.git
synced 2026-06-24 02:04:11 +00:00
feat: add catchtable-sniper skill (#146)
* feat: add catchtable-sniper skill * Make the Catchtable skill loadable and discoverable The submitted skill landed under skills/ without YAML frontmatter, which broke the repo's auto-discovery contract and Codex skill loading. Move it to the root-level skill layout, add the required metadata block, and document the feature in the main README plus a dedicated guide so the PR ships in a usable state. Constraint: This repository auto-discovers skills from root-level directories only Constraint: Skill manifests must start with YAML frontmatter for Codex to load them Rejected: Keep the nested skills/catchtable-sniper layout | validate-skills and the repo's documented convention reject it Rejected: Add only README links without a feature guide | would create a broken documentation target Confidence: high Scope-risk: narrow Reversibility: clean Directive: Future skill PRs should follow docs/adding-a-skill.md and place each skill in its own root directory Tested: node --test scripts/skill-docs.test.js Tested: ./scripts/validate-skills.sh Tested: git diff --check Not-tested: End-to-end Catchtable reservation completion on a logged-in account --------- Co-authored-by: Jeffrey (Dongkyu) Kim <vkehfdl1@gmail.com>
This commit is contained in:
parent
e0981abd08
commit
a01a164a31
3 changed files with 376 additions and 0 deletions
|
|
@ -52,6 +52,7 @@ Claude Code, Codex, OpenCode, OpenClaw/ClawHub 등 각종 코딩 에이전트
|
|||
| LCK 경기 분석 | LCK 경기 결과, 현재 순위, live turning point, 밴픽, 패치 메타, 팀 파워 레이팅 | 불필요 | [LCK 경기 분석 가이드](docs/features/lck-analytics.md) |
|
||||
| 토스증권 조회 | 토스증권 계좌 요약, 포트폴리오, 시세, 주문내역, 관심종목 조회 | 필요 | [토스증권 조회 가이드](docs/features/toss-securities.md) |
|
||||
| 하이패스 영수증 발급 | 하이패스 사용내역 조회 및 영수증 출력 payload 준비 | 필요 | [하이패스 영수증 발급 가이드](docs/features/hipass-receipt.md) |
|
||||
| 캐치테이블 예약 스나이핑 | 로그인된 캐치테이블 Chrome 세션으로 빈자리 감시, 오픈런, 자동 예약 시도 | 필요 | [캐치테이블 예약 스나이핑 가이드](docs/features/catchtable-sniper.md) |
|
||||
| 로또 당첨 확인 | 로또 최신 회차, 특정 회차, 번호 대조 | 불필요 | [로또 결과 가이드](docs/features/lotto-results.md) |
|
||||
| HWP 문서 조회/변환 | `.hwp/.hwpx` → Markdown/JSON 변환, 문서 비교, 양식 필드 추출, Markdown→HWPX 역변환 (kordoc 기반 read-only) | 불필요 | [HWP 문서 처리 가이드](docs/features/hwp.md) |
|
||||
| HWP 문서 편집 | `.hwp` 본문 텍스트 삽입/삭제, 표 생성, 셀 수정, replace-all (`k-skill-rhwp` CLI + `@rhwp/core` WASM, HWP 5.x round-trip) | 불필요 | [HWP 문서 편집 가이드](docs/features/rhwp-edit.md) |
|
||||
|
|
@ -135,6 +136,7 @@ Claude Code, Codex, OpenCode, OpenClaw/ClawHub 등 각종 코딩 에이전트
|
|||
- [LCK 경기 분석 가이드](docs/features/lck-analytics.md)
|
||||
- [토스증권 조회 가이드](docs/features/toss-securities.md)
|
||||
- [하이패스 영수증 발급 가이드](docs/features/hipass-receipt.md)
|
||||
- [캐치테이블 예약 스나이핑 가이드](docs/features/catchtable-sniper.md)
|
||||
- [로또 당첨 확인](docs/features/lotto-results.md)
|
||||
- [HWP 문서 조회/변환](docs/features/hwp.md)
|
||||
- [HWP 문서 편집](docs/features/rhwp-edit.md)
|
||||
|
|
|
|||
284
catchtable-sniper/SKILL.md
Normal file
284
catchtable-sniper/SKILL.md
Normal file
|
|
@ -0,0 +1,284 @@
|
|||
---
|
||||
name: catchtable-sniper
|
||||
description: Monitor Catchtable for open reservation slots and attempt booking using a logged-in Chrome session.
|
||||
license: MIT
|
||||
metadata:
|
||||
category: lifestyle
|
||||
subcategory: food
|
||||
locale: ko-KR
|
||||
phase: v1
|
||||
requires:
|
||||
- Chrome MCP
|
||||
- Logged-in Catchtable Chrome session
|
||||
---
|
||||
|
||||
# catchtable-sniper
|
||||
|
||||
## 📋 기본 정보
|
||||
|
||||
- **스킬명**: catchtable-sniper
|
||||
- **라이선스**: MIT
|
||||
- **단계**: v1
|
||||
- **카테고리**: lifestyle / food
|
||||
- **로케일**: ko-KR
|
||||
- **요구사항**: Chrome MCP, 캐치테이블 로그인된 Chrome 세션
|
||||
|
||||
---
|
||||
|
||||
## 🎯 주요 기능
|
||||
|
||||
캐치테이블에서 원하는 식당의 빈자리(취소 슬롯)를 30초 간격으로 감시하다가 발견하는 즉시 자동 예약합니다.
|
||||
멀티 타겟 동시 감시, 예약 오픈런 모드, 인원 유연 매칭, Dry-run 알림 전용 모드를 지원합니다.
|
||||
|
||||
---
|
||||
|
||||
## ✅ 적합한 사용 사례
|
||||
|
||||
- `"온지음 5월 토요일 저녁 2인 빈자리 나오면 예약해줘"`
|
||||
- `"온지음, 밍글스, 라연 중 5월 주말 2인 아무데나 먼저 뜨는 거 잡아줘"` ← 멀티 타겟
|
||||
- `"라연 5월 예약 오픈이 4월 30일 오전 10시야, 그때 맞춰서 잡아줘"` ← 오픈런 모드
|
||||
- `"스시야마 이번달 안에 2인 — 못 잡으면 4인 있으면 알려줘"` ← 인원 유연
|
||||
- `"밍글스 빈자리 뜨면 예약은 내가 할게 알림만 줘"` ← Dry-run 모드
|
||||
- `"https://app.catchtable.co.kr/ct/shop/mingles 토요일 4명 자동예약"`
|
||||
|
||||
---
|
||||
|
||||
## ❌ 부적합한 사용 사례
|
||||
|
||||
- 로그인 자동화 (카카오/네이버 로그인은 직접 해야 함)
|
||||
- 선결제 식당의 결제 정보 자동 입력 (결제 단계는 사람이 직접)
|
||||
- 캐치테이블 외 플랫폼 예약 (네이버 예약, 식신 등)
|
||||
- 30초 미만 폴링 간격 (서버 부하 방지)
|
||||
|
||||
---
|
||||
|
||||
## 🔧 기술 요구사항
|
||||
|
||||
- **Chrome MCP** 연결 필수
|
||||
- 캐치테이블(`app.catchtable.co.kr`)에 **로그인된 Chrome 세션** 필요
|
||||
- 별도 API 키, 패키지 설치 불필요
|
||||
|
||||
---
|
||||
|
||||
## 🔐 인증 처리
|
||||
|
||||
이 스킬은 이미 Chrome에 로그인된 세션을 그대로 사용합니다.
|
||||
로그인 정보를 스킬에 전달하지 않습니다.
|
||||
|
||||
로그인 안 된 경우:
|
||||
```
|
||||
"캐치테이블에 로그인되어 있지 않습니다.
|
||||
Chrome에서 캐치테이블에 카카오/네이버 로그인 후 다시 실행해주세요."
|
||||
```
|
||||
→ 스킬 중단. 로그인 자동화 없음.
|
||||
|
||||
---
|
||||
|
||||
## 🗂️ 입력 파싱
|
||||
|
||||
사용자 입력에서 다음을 추출한다:
|
||||
|
||||
| 항목 | 예시 | 필수 여부 |
|
||||
|------|------|----------|
|
||||
| 식당명 또는 URL | `"온지음"` / `app.catchtable.co.kr/ct/shop/onjium` | 필수 (복수 가능) |
|
||||
| 날짜 | `"5월 3일"`, `"이번 주 토요일"`, `"5월 주말 전체"` | 필수 |
|
||||
| 인원 | `"2명"`, `"4인"` | 필수 |
|
||||
| 시간대 | `"저녁"`, `"19시 이후"` | 선택 (없으면 전체) |
|
||||
| 모드 | `"알림만"`, `"dry-run"` | 선택 (없으면 자동예약) |
|
||||
| 인원 유연 | `"2인 없으면 4인도 괜찮아"` | 선택 |
|
||||
| 오픈 시간 | `"4월 30일 오전 10시 오픈"` | 선택 (오픈런 모드) |
|
||||
| 폴링 간격 | `"30초마다"` | 선택 (기본: 30초) |
|
||||
|
||||
**멀티 타겟 감지**: 식당명이 쉼표/슬래시로 구분되거나 "중 아무데나", "먼저 뜨는 거" 표현이 있으면 멀티 타겟 모드로 전환.
|
||||
|
||||
---
|
||||
|
||||
## 📊 실행 플로우
|
||||
|
||||
### STEP 1 — 브라우저 준비 및 로그인 확인
|
||||
|
||||
Chrome MCP로 캐치테이블 접속:
|
||||
```
|
||||
navigate: https://app.catchtable.co.kr
|
||||
```
|
||||
MY 탭에서 로그인 상태 확인. 미로그인 시 중단.
|
||||
|
||||
---
|
||||
|
||||
### STEP 2 — 모드 분기
|
||||
|
||||
```
|
||||
입력 파싱 완료
|
||||
├─ 오픈 시간 명시됨 → STEP 2-A (오픈런 모드)
|
||||
└─ 오픈 시간 없음 → STEP 2-B (취소 스나이핑 모드)
|
||||
```
|
||||
|
||||
#### STEP 2-A: 오픈런 모드
|
||||
|
||||
예약 오픈 시간까지 대기:
|
||||
```
|
||||
[10:00:00 오픈 예정] 현재 09:58:42 — 77초 후 오픈
|
||||
[10:00:00] ✅ 오픈 시각 도달 — 즉시 예약 시도
|
||||
```
|
||||
오픈 시각 정각에 날짜 선택 → 슬롯 클릭 → 예약 폼 진입.
|
||||
슬롯이 이미 마감이면 → 취소 스나이핑 모드(STEP 2-B)로 자동 전환.
|
||||
|
||||
#### STEP 2-B: 취소 스나이핑 모드 (폴링 루프)
|
||||
|
||||
```
|
||||
while 빈자리 없음:
|
||||
{폴링 간격}초 대기
|
||||
페이지 새로고침 또는 날짜 재클릭
|
||||
슬롯 파싱
|
||||
빈자리 발견 → STEP 3
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### STEP 3 — 멀티 타겟 처리
|
||||
|
||||
**단일 타겟**: 해당 식당 슬롯 확인.
|
||||
|
||||
**멀티 타겟**: 지정된 식당들을 순차 순회하며 슬롯 확인.
|
||||
```
|
||||
[14:23:15] 온지음 5/3 확인 중... 없음
|
||||
[14:23:17] 밍글스 5/3 확인 중... 없음
|
||||
[14:23:19] 라연 5/3 확인 중... 없음 (30초 후 재시도)
|
||||
[14:23:49] ✅ 밍글스 5/3 19:30 빈자리 발견! — 예약 시작
|
||||
```
|
||||
한 곳에서 슬롯 발견 시 나머지 감시 즉시 중단 → 발견된 식당 예약 진행.
|
||||
|
||||
---
|
||||
|
||||
### STEP 4 — 인원 유연 매칭
|
||||
|
||||
지정 인원(예: 2인) 슬롯이 없을 경우:
|
||||
|
||||
```
|
||||
if 인원_유연 == True:
|
||||
대안_인원(예: 4인) 슬롯 확인
|
||||
발견 시:
|
||||
"2인 슬롯은 없지만 4인 슬롯(19:00)이 있습니다.
|
||||
4인으로 예약할까요? (예/아니오)"
|
||||
→ 사용자 확인 후 진행
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### STEP 5 — 예약 진행 (모드 분기)
|
||||
|
||||
**Dry-run 모드** (`"알림만"` / `"dry-run"` 입력 시):
|
||||
```
|
||||
✅ 빈자리 발견! 예약은 진행하지 않습니다.
|
||||
식당: 밍글스
|
||||
날짜: 5월 3일(토)
|
||||
시간: 19:30
|
||||
인원: 2명
|
||||
→ 지금 바로 예약하시겠습니까? (예/아니오)
|
||||
```
|
||||
→ 예약 여부는 사람이 결정.
|
||||
|
||||
**자동예약 모드** (기본):
|
||||
|
||||
빈 슬롯 버튼 즉시 클릭 → 예약 폼 진입.
|
||||
|
||||
폼 자동 입력:
|
||||
- 인원수: 지정한 인원 선택
|
||||
- 방문 목적: "식사" (기본값)
|
||||
- 주의사항 동의: 전체 동의 체크
|
||||
- 예약자 정보: 앱 저장 정보 자동 사용
|
||||
|
||||
**선결제 식당인 경우**:
|
||||
```
|
||||
"빈자리를 발견했습니다! 결제가 필요합니다.
|
||||
결제 금액: {금액}원
|
||||
지금 결제를 진행할까요? (예/아니오)"
|
||||
```
|
||||
→ 결제 정보 자동 입력 없음. 사용자 확인 후 결제 진행.
|
||||
|
||||
**무료 예약**: "예약하기" 최종 확인 버튼 클릭.
|
||||
|
||||
---
|
||||
|
||||
### STEP 6 — 완료 확인
|
||||
|
||||
```
|
||||
🎉 예약 완료!
|
||||
|
||||
식당: {식당명}
|
||||
날짜: {날짜}
|
||||
시간: {시간}
|
||||
인원: {인원}명
|
||||
모드: {자동예약 / Dry-run}
|
||||
예약번호: {예약번호}
|
||||
|
||||
캐치테이블 앱 > MY > 예약내역에서 확인 가능합니다.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 중간 상태 출력 형식
|
||||
|
||||
```
|
||||
[14:23:15] 밍글스 5/3 저녁 슬롯 확인 중... 빈자리 없음 (30초 후 재시도)
|
||||
[14:23:45] 온지음 5/3 저녁 슬롯 확인 중... 빈자리 없음
|
||||
[14:24:15] ✅ 밍글스 5/3 19:30 (2인) 빈자리 발견! — 예약 시작
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ 설정값
|
||||
|
||||
| 항목 | 기본값 | 범위 |
|
||||
|------|--------|------|
|
||||
| 폴링 간격 | 30초 | 30초 이상 |
|
||||
| 최대 감시 시간 | 2시간 | — |
|
||||
| 멀티 타겟 최대 수 | 5개 | — |
|
||||
|
||||
2시간 초과 시:
|
||||
```
|
||||
"2시간 동안 빈자리가 없었습니다. 계속 시도할까요? (예/아니오)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚨 에러 핸들링
|
||||
|
||||
| 상황 | 대응 |
|
||||
|------|------|
|
||||
| 식당 페이지 404 | "식당을 찾을 수 없습니다. 이름을 다시 확인해주세요." |
|
||||
| 예약 오픈 전 | 오픈 일정 안내 후 오픈런 모드로 전환 제안 |
|
||||
| 슬롯 클릭 후 이미 마감 | 즉시 재폴링 재개 |
|
||||
| 네트워크 오류 | 10초 후 재시도, 3회 연속 실패 시 사용자 알림 |
|
||||
| 멀티 타겟 중 일부 404 | 해당 식당 제외, 나머지 계속 감시 |
|
||||
| 2시간 초과 | "계속 시도할까요?" 확인 후 연장 또는 종료 |
|
||||
|
||||
---
|
||||
|
||||
## ✨ 완료 기준
|
||||
|
||||
다음 중 하나:
|
||||
- 예약 완료 화면 확인 + 예약번호 수집
|
||||
- Dry-run 모드에서 빈자리 발견 및 사용자 알림 완료
|
||||
- 사용자가 명시적으로 중단 요청
|
||||
|
||||
---
|
||||
|
||||
## 사용 예시
|
||||
|
||||
```
|
||||
"온지음 5월 10일 저녁 2인 빈자리 나오면 예약해줘"
|
||||
"온지음, 밍글스, 라연 5월 토요일 저녁 2인 중 아무데나 먼저 뜨는 거 잡아줘"
|
||||
"라연 5월 예약이 4월 30일 오전 10시 오픈이야, 그때 맞춰 2인 잡아줘"
|
||||
"스시야마 이번달 2인 — 없으면 4인도 괜찮아, dry-run으로"
|
||||
"https://app.catchtable.co.kr/ct/shop/mingles 토요일 4명 자동예약"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 주의사항
|
||||
|
||||
- Chrome에 캐치테이블 로그인 세션이 있어야 동작합니다.
|
||||
- 선결제 식당의 결제 정보는 직접 입력해야 합니다.
|
||||
- 폴링 간격은 최소 30초를 유지합니다 (서버 부하 방지).
|
||||
- 캐치테이블 이용약관을 준수하는 범위에서 사용하세요.
|
||||
90
docs/features/catchtable-sniper.md
Normal file
90
docs/features/catchtable-sniper.md
Normal file
|
|
@ -0,0 +1,90 @@
|
|||
# 캐치테이블 예약 스나이핑 가이드
|
||||
|
||||
## 이 기능으로 할 수 있는 일
|
||||
|
||||
- 로그인된 Chrome 세션을 재사용해 캐치테이블 예약 페이지 진입
|
||||
- 원하는 식당의 취소 슬롯/빈자리 폴링
|
||||
- 여러 식당을 순차 감시하다가 먼저 열린 슬롯에 예약 시도
|
||||
- 예약 오픈 시간에 맞춘 오픈런 시도
|
||||
- dry-run 모드로 빈자리 발견까지만 알리고 최종 예약은 사용자에게 넘기기
|
||||
|
||||
## 먼저 알아둘 점
|
||||
|
||||
- 이 기능은 **Chrome MCP + 로그인된 캐치테이블 세션**이 있어야만 동작한다.
|
||||
- 카카오/네이버 로그인 자동화는 하지 않는다.
|
||||
- 결제 정보 자동 입력은 하지 않는다.
|
||||
- 선결제 매장은 결제 단계에서 반드시 사용자가 직접 확인해야 한다.
|
||||
- 서버 부하를 줄이기 위해 폴링 간격은 **30초 이상**으로 유지한다.
|
||||
|
||||
## 입력 형태
|
||||
|
||||
다음 정보를 자연어에서 추출해 사용한다.
|
||||
|
||||
- 식당명 또는 캐치테이블 URL
|
||||
- 날짜 또는 날짜 범위
|
||||
- 인원 수
|
||||
- 시간대(선택)
|
||||
- dry-run 여부
|
||||
- 인원 유연 매칭 여부
|
||||
- 예약 오픈 시각(오픈런 모드일 때)
|
||||
|
||||
예시:
|
||||
|
||||
- `온지음 5월 토요일 저녁 2인 빈자리 나오면 예약해줘`
|
||||
- `온지음, 밍글스, 라연 중 5월 주말 2인 아무데나 먼저 뜨는 거 잡아줘`
|
||||
- `라연 5월 예약 오픈이 4월 30일 오전 10시야, 그때 맞춰 2인 잡아줘`
|
||||
- `밍글스 빈자리 뜨면 예약은 내가 할게, dry-run으로`
|
||||
- `https://app.catchtable.co.kr/ct/shop/mingles 토요일 4명 자동예약`
|
||||
|
||||
## 동작 흐름
|
||||
|
||||
1. 캐치테이블 홈 또는 식당 페이지에 접속한다.
|
||||
2. 로그인 상태를 확인한다.
|
||||
3. 오픈런 모드면 지정 시각까지 대기 후 즉시 예약을 시도한다.
|
||||
4. 일반 스나이핑 모드면 30초 간격으로 새로고침/재조회하며 슬롯을 감시한다.
|
||||
5. 슬롯이 열리면 날짜/인원/시간을 선택하고 예약 흐름으로 진입한다.
|
||||
6. 무료 예약이면 최종 예약 버튼까지 진행하고, 선결제 매장이면 결제 직전 단계에서 사용자 확인을 요구한다.
|
||||
|
||||
## 멀티 타겟 / 인원 유연 모드
|
||||
|
||||
### 멀티 타겟
|
||||
|
||||
- 여러 식당을 순차적으로 감시한다.
|
||||
- 한 곳에서 예약 가능한 슬롯을 발견하면 나머지 감시는 즉시 중단한다.
|
||||
|
||||
### 인원 유연 매칭
|
||||
|
||||
- 예를 들어 2인 자리가 없을 때 4인 자리를 대안으로 확인할 수 있다.
|
||||
- 대안 인원 슬롯을 발견하면 사용자에게 확인을 받고 다음 단계로 진행한다.
|
||||
|
||||
## dry-run 모드
|
||||
|
||||
`알림만`, `dry-run` 같은 표현이 있으면 예약 완료 대신 다음까지만 수행한다.
|
||||
|
||||
- 빈자리 발견
|
||||
- 식당/날짜/시간/인원 요약
|
||||
- 사용자가 직접 예약할 수 있도록 알림
|
||||
|
||||
## 제한사항
|
||||
|
||||
- 로그인 자동화 없음
|
||||
- 카드/간편결제 정보 자동 입력 없음
|
||||
- 캐치테이블 외 예약 플랫폼 미지원
|
||||
- UI 변경 시 selector/흐름이 깨질 수 있음
|
||||
|
||||
## 검증 메모
|
||||
|
||||
2026-04-22 기준 로컬 검증에서 다음을 확인했다.
|
||||
|
||||
- 캐치테이블 식당 페이지 진입
|
||||
- 예약 가능한 식당에서 날짜/인원/시간 선택
|
||||
- 방문 확인 단계 진입
|
||||
- 결제 방식 선택 단계 진입
|
||||
|
||||
다만 최종 예약 완료는 **로그인된 캐치테이블 세션이 없는 Chrome 프로필**에서는 검증할 수 없었다. 이 기능의 최종 성공 여부는 로그인된 사용자 세션과 실시간 좌석 상황에 직접 의존한다.
|
||||
|
||||
## 원칙
|
||||
|
||||
- 사용자의 로그인 자격 증명을 새 env var나 repo 문서에 추가하지 않는다.
|
||||
- 사용자가 이미 로그인해 둔 브라우저 세션만 재사용한다.
|
||||
- 결제나 취소 수수료가 얽힌 단계에서는 사용자 확인을 우선한다.
|
||||
Loading…
Add table
Add a link
Reference in a new issue