@nomadamas/k-skill 0.2.3 → 0.2.5
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/package.json +1 -1
- package/skills/k-skill-cleaner/instruction.md +1 -1
- package/skills/k-skill-setup/instruction.md +114 -157
- package/skills/k-skill-setup/skill.json +2 -2
- package/skills/kakao-bar-nearby/instruction.md +73 -31
- package/skills/kakao-bar-nearby/skill.json +4 -2
- package/skills/seoul-weather-risk/instruction.md +111 -0
- package/skills/seoul-weather-risk/references/admin-dong-place-map.json +1 -0
- package/skills/seoul-weather-risk/scripts/seoul_weather_risk.py +503 -0
- package/skills/seoul-weather-risk/skill.json +9 -0
- package/skills/store-longevity-radar/instruction.md +7 -3
- package/skills/store-longevity-radar/scripts/__pycache__/store_longevity_download.cpython-312.pyc +0 -0
- package/skills/store-longevity-radar/scripts/store_longevity_download.py +136 -0
- package/skills/store-longevity-radar/scripts/store_longevity_radar.py +1 -51
- package/skills/toss-securities/instruction.md +9 -34
- package/skills/toss-securities/references/TRADEMARK-LEGAL-STATEMENT.md +1 -1
- package/skills/toss-securities/skill.json +2 -2
- package/skills/yebigun-training/instruction.md +1 -1
- package/skills/catchtable-sniper/instruction.md +0 -270
- package/skills/catchtable-sniper/references/TRADEMARK-LEGAL-STATEMENT.md +0 -9
- package/skills/catchtable-sniper/skill.json +0 -9
- package/skills/hipass-receipt/instruction.md +0 -97
- package/skills/hipass-receipt/references/TRADEMARK-LEGAL-STATEMENT.md +0 -9
- package/skills/hipass-receipt/skill.json +0 -10
- package/skills/used-car-price-search/instruction.md +0 -109
- package/skills/used-car-price-search/references/TRADEMARK-LEGAL-STATEMENT.md +0 -9
- package/skills/used-car-price-search/skill.json +0 -8
package/package.json
CHANGED
|
@@ -36,7 +36,7 @@ npx -y @nomadamas/k-skill@0 exec k-skill-cleaner scripts/k_skill_cleaner.py -- \
|
|
|
36
36
|
--skills-root . \
|
|
37
37
|
--scan-default-logs \
|
|
38
38
|
--days 90 \
|
|
39
|
-
--never-use
|
|
39
|
+
--never-use lotto-results,market-kurly-search \
|
|
40
40
|
--keep k-skill-setup,k-skill-cleaner
|
|
41
41
|
```
|
|
42
42
|
|
|
@@ -2,184 +2,164 @@
|
|
|
2
2
|
|
|
3
3
|
## Purpose
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
`k-skill` 스킬 설치부터 CLI 런타임, credential, 환경 검증까지 한 번에 정리한다.
|
|
6
|
+
이미 설치된 항목은 확인만 하고 건너뛴다.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
- 런타임 환경변수 확인
|
|
9
|
-
- 선택 사항: 주기적인 업데이트 확인 자동화
|
|
10
|
-
- 선택 사항: GitHub star 여부 확인 및 동의 시 실행
|
|
8
|
+
기본 원칙:
|
|
11
9
|
|
|
12
|
-
|
|
10
|
+
- Node.js 18 이상과 `npx`를 사용한다.
|
|
11
|
+
- credential은 환경변수, agent vault, `~/.config/k-skill/secrets.env` 순으로 확인한다.
|
|
12
|
+
- Dolshoi credential mode에서는 평문 credential을 요청하거나 파일에 직접 저장하지 않는다.
|
|
13
|
+
- 설치, 예약 작업, GitHub star처럼 외부 상태를 바꾸는 작업은 실행 전에 동의를 받는다.
|
|
14
|
+
- 사용자가 승인한 범위만 실행하고 별도 helper, 요약, AI/CLI 예약 작업을 추가하지 않는다.
|
|
13
15
|
|
|
14
|
-
|
|
15
|
-
- credential resolution order에 따라 확보한다
|
|
16
|
-
- 필요한 패키지가 없으면 대체 구현을 찾기보다 전역 설치를 먼저 시도한다
|
|
17
|
-
- `cron`, `launchd`, `schtasks`, `gh` 같은 지속성/외부 상태 변경은 자동으로 하지 말고 먼저 사용자 동의를 받는다
|
|
18
|
-
- GitHub star는 사용자가 명시적으로 동의했을 때만 실행한다
|
|
16
|
+
## 1. Install the skills
|
|
19
17
|
|
|
20
|
-
|
|
18
|
+
일반적인 Claude Code, Codex, OpenCode, OpenClaw 등에서는 `skills` CLI로 전체 스킬을
|
|
19
|
+
전역 설치하는 경로를 권장한다.
|
|
21
20
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
2. 필요한 login capability가 이미 provision되어 있으면 `vault-run <capability_id> <action> [args...]`를 사용한다.
|
|
26
|
-
3. capability가 없으면 username/password/key를 채팅으로 묻지 말고 `request_vault_credential` tool로 앱 vault 입력 UI를 호출한다.
|
|
27
|
-
4. 내장 browser tool이 CloakBrowser를 제공하거나 `CLOAKBROWSER_PEEK_TOKEN`이 있으면 browser action은 CloakBrowser를 우선한다.
|
|
28
|
-
5. 조회 결과가 실제 action의 입력이면 공식 표면에서 장바구니, 예약, 신청서 작성, 연락 초안 등 가역적 단계를 이어서 수행한다.
|
|
29
|
-
6. 결제, 실제 메시지/메일 전송, 최종 제출, 취소 같은 비가역 효과 직전에만 `clarify`로 대상·금액/payload·효과를 승인받고, 승인되면 같은 turn에 실행한다.
|
|
21
|
+
```bash
|
|
22
|
+
npx --yes skills add NomaDamas/k-skill --all -g
|
|
23
|
+
```
|
|
30
24
|
|
|
31
|
-
|
|
25
|
+
목록을 먼저 보거나 일부 스킬만 설치하려면:
|
|
32
26
|
|
|
33
|
-
|
|
27
|
+
```bash
|
|
28
|
+
npx --yes skills add NomaDamas/k-skill --list
|
|
29
|
+
npx --yes skills add NomaDamas/k-skill --skill <skill-name> -g
|
|
30
|
+
```
|
|
34
31
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
3. **`~/.config/k-skill/secrets.env`** (기본 fallback) — plain dotenv 파일, 퍼미션 `0600`.
|
|
38
|
-
4. **아무것도 없으면** 유저에게 물어서 2 또는 3에 저장한다.
|
|
32
|
+
Claude Code에서는 marketplace plugin으로 전체 번들을 설치하는 경로도 지원한다.
|
|
33
|
+
Claude Code 안에서 다음 명령을 실행한다.
|
|
39
34
|
|
|
40
|
-
|
|
35
|
+
```text
|
|
36
|
+
/plugin marketplace add NomaDamas/k-skill
|
|
37
|
+
/plugin install k-skill@k-skill
|
|
38
|
+
```
|
|
41
39
|
|
|
42
|
-
|
|
40
|
+
plugin으로 설치한 스킬은 `/k-skill:<스킬 이름>`으로 호출한다.
|
|
41
|
+
예: `/k-skill:k-skill-setup`, `/k-skill:lotto-results`.
|
|
43
42
|
|
|
44
|
-
|
|
43
|
+
두 설치 방식을 중복 실행할 필요는 없다. 현재 agent에서 스킬이 이미 보이면 설치를
|
|
44
|
+
다시 하지 말고 다음 단계로 진행한다.
|
|
45
45
|
|
|
46
|
-
##
|
|
46
|
+
## 2. Use the k-skill CLI
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
설치되는 `SKILL.md`는 스킬 선택과 최소 안전 규칙을 담은 adapter다. 전체 instruction
|
|
49
|
+
조립과 bundled `scripts/`, `references/` 접근은 `@nomadamas/k-skill` CLI가 담당한다.
|
|
49
50
|
|
|
50
|
-
|
|
51
|
+
기본 경로는 `npx`이며 CLI를 별도로 설치할 필요는 없다.
|
|
51
52
|
|
|
52
53
|
```bash
|
|
53
|
-
npx
|
|
54
|
+
npx -y @nomadamas/k-skill@0 instruct k-skill-setup
|
|
55
|
+
npx -y @nomadamas/k-skill@0 list
|
|
54
56
|
```
|
|
55
57
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
## Setup steps
|
|
59
|
-
|
|
60
|
-
### 1. Create the default secrets file (generic fallback only)
|
|
61
|
-
|
|
62
|
-
돌쇠 credential mode나 다른 host vault를 쓰지 않는 경우에만 기본 fallback 파일을 만든다.
|
|
58
|
+
반복 사용으로 전역 명령이 필요할 때만 선택적으로 설치한다.
|
|
63
59
|
|
|
64
60
|
```bash
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
KSKILL_SRT_ID=replace-me
|
|
68
|
-
KSKILL_SRT_PASSWORD=replace-me
|
|
69
|
-
KSKILL_KTX_ID=replace-me
|
|
70
|
-
KSKILL_KTX_PASSWORD=replace-me
|
|
71
|
-
KSKILL_FORESTTRIP_ID=replace-me
|
|
72
|
-
KSKILL_FORESTTRIP_PASSWORD=replace-me
|
|
73
|
-
KSKILL_EV_CHARGER_API_KEY=replace-me
|
|
74
|
-
KSKILL_BUILDING_REGISTER_API_KEY=replace-me
|
|
75
|
-
KSKILL_RISS_API_KEY=replace-me
|
|
76
|
-
LAW_OC=replace-me
|
|
77
|
-
KIPRIS_PLUS_API_KEY=replace-me
|
|
78
|
-
AIR_KOREA_OPEN_API_KEY=replace-me
|
|
79
|
-
KSKILL_PROXY_BASE_URL=
|
|
80
|
-
EOF
|
|
81
|
-
chmod 0600 ~/.config/k-skill/secrets.env
|
|
61
|
+
npm install -g @nomadamas/k-skill@0
|
|
62
|
+
k-skill instruct k-skill-setup
|
|
82
63
|
```
|
|
83
64
|
|
|
84
|
-
|
|
65
|
+
bundled helper와 reference는 항상 CLI를 통해 사용한다.
|
|
85
66
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
한국 부동산 실거래가 조회는 기본 hosted proxy(`k-skill-proxy.nomadamas.org`)를 경유하므로 사용자 쪽 `DATA_GO_KR_API_KEY` 가 불필요하다.
|
|
67
|
+
```bash
|
|
68
|
+
npx -y @nomadamas/k-skill@0 exec <skill-name> scripts/<file> -- <args>
|
|
69
|
+
npx -y @nomadamas/k-skill@0 read <skill-name> references/<file>
|
|
70
|
+
```
|
|
91
71
|
|
|
92
|
-
|
|
72
|
+
설치된 스킬 디렉터리나 repository 상대 경로에서 helper를 직접 실행하지 않는다.
|
|
93
73
|
|
|
94
|
-
|
|
74
|
+
## 3. Resolve credentials
|
|
95
75
|
|
|
96
|
-
|
|
76
|
+
각 스킬이 요구하는 값만 준비한다. 모든 credential을 미리 요구하지 않는다.
|
|
97
77
|
|
|
98
|
-
|
|
78
|
+
credential resolution order:
|
|
99
79
|
|
|
100
|
-
|
|
80
|
+
1. 현재 프로세스 환경변수
|
|
81
|
+
2. agent가 제공하는 secret vault
|
|
82
|
+
3. 기본 fallback `~/.config/k-skill/secrets.env`
|
|
83
|
+
4. 필요한 값이 없으면 정확한 환경변수 이름과 발급처를 안내
|
|
101
84
|
|
|
102
|
-
|
|
85
|
+
Dolshoi credential mode:
|
|
103
86
|
|
|
104
|
-
|
|
87
|
+
- `DOLSHOI_ACTION_BROKER_URL`과 usable `vault-run`이 모두 있을 때만 활성화한다.
|
|
88
|
+
- plaintext credential을 묻거나 출력하거나 `secrets.env`를 만들지 않는다.
|
|
89
|
+
- 필요한 credential이 없으면 `request_vault_credential`을 사용한다.
|
|
105
90
|
|
|
106
|
-
|
|
91
|
+
Generic mode에서 fallback 파일이 필요하면:
|
|
107
92
|
|
|
108
|
-
|
|
93
|
+
```bash
|
|
94
|
+
mkdir -p ~/.config/k-skill
|
|
95
|
+
touch ~/.config/k-skill/secrets.env
|
|
96
|
+
chmod 0600 ~/.config/k-skill/secrets.env
|
|
97
|
+
```
|
|
109
98
|
|
|
110
|
-
|
|
99
|
+
실제 값은 사용자가 이용 중인 가장 안전한 입력 표면으로 받는다. 대화에 평문 값을
|
|
100
|
+
붙여 넣도록 요구하지 않는다.
|
|
111
101
|
|
|
112
|
-
|
|
102
|
+
`KSKILL_PROXY_BASE_URL`을 비워 두면 `k-skill-proxy` 기반 스킬은 기본 hosted endpoint를 사용한다.
|
|
103
|
+
사용자가 직접 운영하는 proxy가 있을 때만 URL을 설정한다.
|
|
113
104
|
|
|
114
|
-
|
|
105
|
+
```bash
|
|
106
|
+
KSKILL_PROXY_BASE_URL=
|
|
107
|
+
# KSKILL_PROXY_BASE_URL=https://your-proxy.example.com
|
|
108
|
+
```
|
|
115
109
|
|
|
116
|
-
|
|
110
|
+
무료 hosted proxy로 처리되는 기능에는 사용자 upstream API key를 요구하지 않는다.
|
|
111
|
+
로그인 기반 스킬은 해당 스킬의 공식 로그인/browser 절차를 따르며 credential을
|
|
112
|
+
`secrets.env`에 복사하도록 요구하지 않는다.
|
|
117
113
|
|
|
118
|
-
|
|
114
|
+
Hosted proxy 기본 계약:
|
|
119
115
|
|
|
120
|
-
|
|
116
|
+
- 미세먼지, 한강 수위, 주유소 가격, 생활쓰레기 배출정보 조회, 학교 급식 식단 조회, 의약품 안전 체크, 식품 안전 체크는 `KSKILL_PROXY_BASE_URL`을 비워 두면 기본 hosted endpoint를 사용한다.
|
|
117
|
+
- 서울 지하철: 사용자 시크릿 불필요 (기본 hosted proxy 사용, 운영자만 `SEOUL_OPEN_API_KEY`).
|
|
118
|
+
- 생활쓰레기 배출정보 조회: 사용자 시크릿 불필요. `/v1/household-waste/info`와 운영자 서버의 `DATA_GO_KR_API_KEY`를 사용한다.
|
|
119
|
+
- 학교 급식 식단 조회: 사용자 시크릿 불필요. `/v1/neis/school-search`, `/v1/neis/school-meal`과 운영자 서버의 `KEDU_INFO_KEY`를 사용한다.
|
|
120
|
+
- 한국 법령 검색은 기본 hosted proxy를 사용하며, 운영자만 서버 환경변수 `LAW_OC`를 설정한다.
|
|
121
|
+
- 한국 특허 정보 검색: `KIPRIS_PLUS_API_KEY`는 운영자 서버에만 둔다.
|
|
122
|
+
- 한국 주식 정보 조회는 proxy가 운영자 `KRX_API_KEY`를 사용하므로 사용자 키가 불필요하다.
|
|
123
|
+
- 부동산 실거래가 조회와 주유소 가격 조회도 hosted proxy 기본 경로에서는 사용자 upstream key가 불필요하다.
|
|
121
124
|
|
|
122
|
-
|
|
125
|
+
## 4. Verify the setup
|
|
123
126
|
|
|
124
|
-
|
|
125
|
-
- KTX: `KSKILL_KTX_ID`, `KSKILL_KTX_PASSWORD`
|
|
126
|
-
- 자연휴양림 빈 객실 조회: `KSKILL_FORESTTRIP_ID`, `KSKILL_FORESTTRIP_PASSWORD`
|
|
127
|
-
- 한국 법령 검색: 사용자 시크릿 불필요 (기본 hosted proxy 사용, 운영자만 `LAW_OC`)
|
|
128
|
-
- 한국 부동산 실거래가 조회: 사용자 시크릿 불필요 (기본 hosted proxy 사용)
|
|
129
|
-
- 한국 특허 정보 검색: `KIPRIS_PLUS_API_KEY`
|
|
130
|
-
- 한국 주식 정보 조회: 사용자 시크릿 불필요 (기본 hosted proxy 사용, 운영자만 `KRX_API_KEY`)
|
|
131
|
-
- 생활쓰레기 배출정보 조회: 사용자 시크릿 불필요 (`serviceKey`는 proxy 서버 주입, 호출 시 `pageNo=1`·`numOfRows=100` 필수)
|
|
132
|
-
- 학교 급식 식단 조회: 사용자 시크릿 불필요 (`KEDU_INFO_KEY`는 proxy 서버만)
|
|
133
|
-
- 도서관 도서 조회: 사용자 시크릿 불필요 (`DATA4LIBRARY_AUTH_KEY`는 proxy 서버만)
|
|
134
|
-
- 의약품 안전 체크: 사용자 시크릿 불필요 (`DATA_GO_KR_API_KEY`는 proxy 서버만)
|
|
135
|
-
- 식품 안전 체크: 사용자 시크릿 불필요 (`DATA_GO_KR_API_KEY`와 선택적 `FOODSAFETYKOREA_API_KEY`는 proxy 서버만)
|
|
136
|
-
- 창업진흥원 K-Startup 조회: 사용자 시크릿 불필요 (`DATA_GO_KR_API_KEY`는 proxy 서버만; `--direct` 호출 때만 `KSKILL_KSTARTUP_API_KEY`)
|
|
137
|
-
- 전기차 충전소 위치·상태 조회: 사용자 시크릿 불필요 (hosted proxy 사용; `--direct` 때만 `KSKILL_EV_CHARGER_API_KEY` 또는 `DATA_GO_KR_API_KEY`)
|
|
138
|
-
- 건축물대장 표제부 조회: 사용자 시크릿 불필요 (hosted proxy 사용; `--direct` 때만 `KSKILL_BUILDING_REGISTER_API_KEY` 또는 `DATA_GO_KR_API_KEY`)
|
|
139
|
-
- KERIS/RISS 학술자료 검색: 사용자 본인 `KSKILL_RISS_API_KEY`(호환 `RISS_API_KEY`) 필요 (RISS 검색 API는 비영리 기관/대학 전용 키로 직접 호출, proxy 미사용)
|
|
140
|
-
- 근처 가장 싼 주유소 찾기: 사용자 시크릿 불필요 (기본 hosted proxy 사용)
|
|
141
|
-
- 서울 지하철: 사용자 시크릿 불필요 (기본 hosted proxy 사용, 운영자만 `SEOUL_OPEN_API_KEY`)
|
|
142
|
-
- 서울 실시간 혼잡도: 사용자 시크릿 불필요 (기본 hosted proxy 사용, 운영자만 `SEOUL_OPEN_API_KEY`)
|
|
143
|
-
- 한국 날씨: 사용자 시크릿 불필요 (기본 hosted proxy 사용, 운영자만 `KMA_OPEN_API_KEY`)
|
|
144
|
-
- 사용자 위치 미세먼지 조회: `KSKILL_PROXY_BASE_URL` 또는 `AIR_KOREA_OPEN_API_KEY`
|
|
127
|
+
bundled 검증 helper를 CLI로 실행한다.
|
|
145
128
|
|
|
146
|
-
|
|
129
|
+
```bash
|
|
130
|
+
npx -y @nomadamas/k-skill@0 exec k-skill-setup scripts/check-setup.sh --
|
|
131
|
+
```
|
|
147
132
|
|
|
148
|
-
|
|
133
|
+
Generic mode에서 `secrets.env`가 필요하지 않은 구성이라면 파일 부재 자체를 전체 설치
|
|
134
|
+
실패로 단정하지 않는다. 실제 사용할 스킬의 필수 환경변수와 CLI 실행 가능 여부를 함께
|
|
135
|
+
확인한다.
|
|
149
136
|
|
|
150
|
-
|
|
137
|
+
최소 확인:
|
|
151
138
|
|
|
152
139
|
```bash
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
echo "next steps:"
|
|
157
|
-
echo " 1. create ~/.config/k-skill/secrets.env with your credentials"
|
|
158
|
-
echo " 2. chmod 0600 ~/.config/k-skill/secrets.env"
|
|
159
|
-
else
|
|
160
|
-
perms=$(stat -f '%Lp' "$secrets_file" 2>/dev/null || stat -c '%a' "$secrets_file" 2>/dev/null)
|
|
161
|
-
if [ "$perms" != "600" ]; then
|
|
162
|
-
echo "insecure permissions on $secrets_file: $perms (expected 600)"
|
|
163
|
-
echo "run: chmod 0600 $secrets_file"
|
|
164
|
-
else
|
|
165
|
-
echo "k-skill setup looks usable"
|
|
166
|
-
fi
|
|
167
|
-
fi
|
|
140
|
+
node --version
|
|
141
|
+
npx -y @nomadamas/k-skill@0 list
|
|
142
|
+
npx -y @nomadamas/k-skill@0 instruct k-skill-setup
|
|
168
143
|
```
|
|
169
144
|
|
|
170
|
-
|
|
145
|
+
확인이 끝나면 다음만 짧게 보고한다.
|
|
171
146
|
|
|
172
|
-
|
|
147
|
+
- 사용한 스킬 설치 방식 (`skills` 또는 Claude Code plugin)
|
|
148
|
+
- CLI 사용 방식 (`npx` 기본 또는 선택적 global install)
|
|
149
|
+
- 준비된 credential과 아직 필요한 환경변수 이름
|
|
150
|
+
- 검증 성공/실패와 사용자가 해야 할 다음 한 단계
|
|
173
151
|
|
|
174
|
-
|
|
152
|
+
## 5. Optional update checks
|
|
175
153
|
|
|
176
|
-
|
|
154
|
+
주기적인 업데이트 확인을 원하는지 먼저 묻는다. 원하지 않으면 건너뛴다.
|
|
177
155
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
- 기본
|
|
181
|
-
-
|
|
182
|
-
-
|
|
156
|
+
정책:
|
|
157
|
+
|
|
158
|
+
- 기본 명령은 설치를 변경하지 않는 `npx --yes skills check`다.
|
|
159
|
+
- `check`에 `-g` 같은 추가 옵션을 붙이지 않는다.
|
|
160
|
+
- 자동 업데이트는 사용자가 명시적으로 요청한 경우에만 별도로 논의한다.
|
|
161
|
+
- 사용자가 승인한 확인 작업만 생성한다.
|
|
162
|
+
- 별도 요약 작업, helper script, `claude -p` 같은 AI/CLI 작업을 함께 만들지 않는다.
|
|
183
163
|
|
|
184
164
|
macOS / Linux 예시:
|
|
185
165
|
|
|
@@ -210,44 +190,21 @@ npx --yes skills check >> "$HOME/.config/k-skill/logs/skills-check.log" 2>&1
|
|
|
210
190
|
schtasks /Create /SC DAILY /TN "k-skill-update-check" /TR "\"$HOME/.config/k-skill/bin/check-skill-updates.cmd\"" /ST 09:00 /F
|
|
211
191
|
```
|
|
212
192
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
- `~/.config/k-skill/logs/skills-check.log`
|
|
193
|
+
사용자가 이 확인 작업 하나만 승인했다면 `k-skill-update-check` 외의 예약 작업이나
|
|
194
|
+
추가 스크립트를 만들지 않는다.
|
|
216
195
|
|
|
217
|
-
|
|
196
|
+
## 6. Optional GitHub star
|
|
218
197
|
|
|
219
|
-
|
|
198
|
+
마지막에 한 번만 묻는다.
|
|
220
199
|
|
|
221
200
|
```text
|
|
222
201
|
k-skill 저장소(NomaDamas/k-skill)에 GitHub star를 눌러드릴까요?
|
|
223
|
-
원하시면 `gh` 로 바로 처리하고, 원하지 않으면 건너뜁니다.
|
|
224
202
|
```
|
|
225
203
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
- 사용자가 명시적으로 동의하기 전에는 star API를 호출하지 않는다
|
|
229
|
-
- `gh` 가 없거나 인증되지 않았으면 설치/로그인 안내만 하고 자동 우회하지 않는다
|
|
230
|
-
- star 대상 저장소는 `NomaDamas/k-skill` 이다
|
|
231
|
-
|
|
232
|
-
동의했고 `gh auth status` 가 정상이면 GitHub API로 star를 실행한다. (`gh` CLI에는 `repo star` 서브커맨드가 없다.)
|
|
204
|
+
동의한 경우에만 실행한다.
|
|
233
205
|
|
|
234
206
|
```bash
|
|
235
|
-
|
|
236
|
-
gh api user/starred/NomaDamas/k-skill >/dev/null 2>&1 && echo "already starred" || echo "not starred yet"
|
|
237
|
-
|
|
238
|
-
# star 실행
|
|
239
|
-
gh api -X PUT user/starred/NomaDamas/k-skill
|
|
207
|
+
gh api -X PUT /user/starred/NomaDamas/k-skill
|
|
240
208
|
```
|
|
241
209
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
## Completion checklist
|
|
245
|
-
|
|
246
|
-
- `~/.config/k-skill/secrets.env` exists with permission `0600` (또는 에이전트가 자체 vault로 credential을 관리 중)
|
|
247
|
-
- 필요한 환경변수가 설정되어 있다
|
|
248
|
-
- 사용자가 원한 경우에만 업데이트 확인 자동화 또는 GitHub star가 설정되었다
|
|
249
|
-
|
|
250
|
-
## Notes
|
|
251
|
-
|
|
252
|
-
- 기본 흐름은 "전체 스킬 설치 → 이 setup skill 실행 → 개별 기능 사용" 이다
|
|
253
|
-
- 저장소 안에는 secret file을 두지 않는다
|
|
210
|
+
동의하지 않거나 `gh` 인증이 없으면 건너뛴다.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "k-skill-setup",
|
|
3
|
-
"description": "
|
|
3
|
+
"description": "Install the k-skill bundle, use the unified CLI, resolve credentials, verify the runtime, and optionally configure update checks and GitHub starring.",
|
|
4
4
|
"profiles": [
|
|
5
5
|
"proxy",
|
|
6
6
|
"vault",
|
|
7
7
|
"browser",
|
|
8
8
|
"operations"
|
|
9
9
|
],
|
|
10
|
-
"frontmatter": "name: k-skill-setup\ndescription:
|
|
10
|
+
"frontmatter": "name: k-skill-setup\ndescription: Install the k-skill bundle, use the unified CLI, resolve credentials, verify the runtime, and optionally configure update checks and GitHub starring.\nlicense: MIT\nmetadata:\n category: setup\n locale: ko-KR\n phase: v1",
|
|
11
11
|
"bundle": [
|
|
12
12
|
{
|
|
13
13
|
"from": "scripts/check-setup.sh",
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## What this skill does
|
|
4
4
|
|
|
5
|
-
유저가 알려준 현재 위치를 기준으로 **카카오맵
|
|
5
|
+
유저가 알려준 현재 위치를 기준으로 **카카오맵 공식 API에서 근처 술집 후보를 찾고**, 후보별 카카오맵 상세 링크로 핸드오프해 영업 상태·메뉴·좌석 정보를 확인한다.
|
|
6
6
|
|
|
7
7
|
- 위치는 자동으로 추정하지 않는다.
|
|
8
8
|
- **반드시 먼저 현재 위치를 질문**한다.
|
|
9
9
|
- `서울역`, `강남`, `사당`, `신논현`, `논현` 같은 역명/동네/랜드마크 질의를 그대로 받을 수 있다.
|
|
10
|
-
-
|
|
10
|
+
- 장소 후보 검색과 거리 계산은 `k-skill-proxy`의 Kakao Local REST API를 우선 사용한다.
|
|
11
|
+
- 공식 API에 없는 현재 영업 상태, 대표 메뉴, 좌석 옵션은 반환된 카카오맵 장소 상세 링크에서 확인한다.
|
|
11
12
|
|
|
12
13
|
## When to use
|
|
13
14
|
|
|
@@ -23,19 +24,67 @@
|
|
|
23
24
|
- 권장 질문: `현재 위치를 알려주세요. 서울역/강남/사당 같은 역명이나 동네명으로 보내주시면 카카오맵 기준 근처 술집을 찾아볼게요.`
|
|
24
25
|
- 위치가 애매하면: `가까운 역명이나 동 이름으로 한 번만 더 알려주세요.`
|
|
25
26
|
|
|
26
|
-
##
|
|
27
|
+
## Access path
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
-
|
|
29
|
+
### Primary: official Kakao Local API
|
|
30
|
+
|
|
31
|
+
- hosted proxy: `https://k-skill-proxy.nomadamas.org`
|
|
32
|
+
- anchor and bar search: `GET /v1/kakao-map/search/keyword`
|
|
33
|
+
- user API key: 필요 없음
|
|
34
|
+
- package function: `searchNearbyBarsByLocationQuery(locationQuery, options?)`
|
|
35
|
+
|
|
36
|
+
패키지는 기준 장소를 공식 API로 찾은 뒤 같은 좌표를 중심으로 `<location> 술집`을 거리순 검색한다. 결과의 `sourceUrl`과 `detailLookup.url`은 Kakao Local 응답의 `place_url`을 사용하며, 누락 시 공식 장소 ID로 `https://place.map.kakao.com/<id>`를 구성한다.
|
|
37
|
+
|
|
38
|
+
### Detail handoff: official Kakao Map place page
|
|
39
|
+
|
|
40
|
+
- place detail: `https://place.map.kakao.com/<id>`
|
|
41
|
+
- detail fields: `openStatus`, `menuSamples`, `seatingKeywords`, `capacityHint`
|
|
42
|
+
|
|
43
|
+
내부 `place-api.map.kakao.com/places/panel3` JSON이나 모바일 검색 HTML을 기본 검색 경로로 사용하지 않는다. 장소 상세 정보가 필요할 때만 반환된 공식 장소 페이지를 브라우저로 연다.
|
|
31
44
|
|
|
32
45
|
## Workflow
|
|
33
46
|
|
|
34
47
|
1. 유저에게 반드시 현재 위치를 묻는다.
|
|
35
|
-
2.
|
|
36
|
-
3.
|
|
37
|
-
4. 상위 후보의
|
|
38
|
-
5.
|
|
48
|
+
2. `searchNearbyBarsByLocationQuery`로 공식 Kakao Local API 기반 후보를 가져온다.
|
|
49
|
+
3. `items[]`에서 이름, 카테고리, 주소, 전화번호, 거리, `detailLookup.url`을 확인한다.
|
|
50
|
+
4. 상위 3~5개 후보의 `detailLookup.url`을 브라우저로 열고 장소명이 후보와 일치하는지 먼저 확인한다.
|
|
51
|
+
5. 상세 페이지에서 보이는 정보만 사용해 다음 필드를 보강한다.
|
|
52
|
+
- 현재 영업 상태와 오늘 영업시간
|
|
53
|
+
- 대표 메뉴 2~3개
|
|
54
|
+
- 단체석, 룸, 바테이블, 혼술 등 좌석/인원 힌트
|
|
55
|
+
6. 상세 확인이 끝난 후보는 영업 중 우선, 그다음 거리순으로 정리한다.
|
|
56
|
+
7. 상세 페이지가 차단되거나 해당 필드가 없으면 추정하지 않는다. 공식 API 결과와 장소 링크를 제공하고 `상세 정보 미확인`으로 표시한다.
|
|
57
|
+
|
|
58
|
+
## Package output contract
|
|
59
|
+
|
|
60
|
+
```js
|
|
61
|
+
const { searchNearbyBarsByLocationQuery } = require("kakao-bar-nearby");
|
|
62
|
+
|
|
63
|
+
const result = await searchNearbyBarsByLocationQuery("서울역", {
|
|
64
|
+
limit: 5,
|
|
65
|
+
radius: 3000
|
|
66
|
+
});
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
주요 반환 필드:
|
|
70
|
+
|
|
71
|
+
- `anchor`: 공식 API에서 선택한 기준 장소
|
|
72
|
+
- `items[].name`, `category`, `address`, `phone`
|
|
73
|
+
- `items[].distanceMeters`
|
|
74
|
+
- `items[].sourceUrl`
|
|
75
|
+
- `items[].detailLookup.status`: 상세 페이지 확인 전에는 `required`
|
|
76
|
+
- `items[].detailLookup.url`: 영업·메뉴·좌석 확인에 사용할 카카오맵 장소 링크
|
|
77
|
+
- `items[].detailLookup.fields`: 상세 페이지에서 확인할 필드 목록
|
|
78
|
+
- `meta.source`: `kakao-local-rest-api`
|
|
79
|
+
- `meta.detailLookupRequiredCount`
|
|
80
|
+
|
|
81
|
+
공식 API 단계에서는 상세 필드를 임의로 채우지 않는다.
|
|
82
|
+
|
|
83
|
+
- `isOpenNow`: `null`
|
|
84
|
+
- `openStatus`: `null`
|
|
85
|
+
- `menuSamples`: `[]`
|
|
86
|
+
- `seatingKeywords`: `[]`
|
|
87
|
+
- `capacityHint`: `null`
|
|
39
88
|
|
|
40
89
|
## Responding
|
|
41
90
|
|
|
@@ -43,34 +92,27 @@
|
|
|
43
92
|
|
|
44
93
|
- 술집명
|
|
45
94
|
- 카테고리
|
|
46
|
-
- 영업 상태 (`영업 중`, `영업 전`,
|
|
95
|
+
- 영업 상태 (`영업 중`, `영업 전`, `휴무일`, `상세 정보 미확인`)
|
|
47
96
|
- 대표 메뉴 2~3개
|
|
48
97
|
- 좌석/인원 수용 힌트 (`단체석`, `바테이블` 등)
|
|
49
98
|
- 전화번호
|
|
50
|
-
- 거리
|
|
51
|
-
|
|
52
|
-
## Node.js example
|
|
99
|
+
- 거리
|
|
100
|
+
- 카카오맵 상세 링크
|
|
53
101
|
|
|
54
|
-
|
|
55
|
-
const { searchNearbyBarsByLocationQuery } = require("kakao-bar-nearby");
|
|
56
|
-
|
|
57
|
-
async function main() {
|
|
58
|
-
const result = await searchNearbyBarsByLocationQuery("서울역", {
|
|
59
|
-
limit: 5
|
|
60
|
-
});
|
|
102
|
+
공식 API에서 확인한 값과 상세 페이지에서 확인한 값을 혼동하지 않는다. 메뉴·영업·좌석 정보는 상세 페이지에서 실제로 확인한 후보에만 표시한다.
|
|
61
103
|
|
|
62
|
-
|
|
63
|
-
console.log(result.items);
|
|
64
|
-
}
|
|
104
|
+
## Failure modes
|
|
65
105
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
106
|
+
- `429 rate_limited`: 잠시 후 재시도가 필요함을 알리고 반복 호출하지 않는다.
|
|
107
|
+
- `502 upstream_error` / `503 upstream_not_configured`: 공식 Kakao API 경로가 현재 사용 불가하므로 원인을 그대로 설명한다.
|
|
108
|
+
- 기준 장소가 모호함: 가까운 역명이나 동 이름을 한 번 더 묻는다.
|
|
109
|
+
- 술집 후보 없음: 반경을 넓히거나 `와인바`, `이자카야`, `호프`처럼 키워드를 구체화한다.
|
|
110
|
+
- 장소 상세 페이지 차단, CAPTCHA, 빈 화면, 구조 변경: 우회하지 않고 공식 API 후보와 링크까지만 제공한다.
|
|
111
|
+
- 메뉴·좌석·영업 정보가 페이지에 없음: 추정하지 않고 `상세 정보 미확인`으로 표시한다.
|
|
71
112
|
|
|
72
113
|
## Done when
|
|
73
114
|
|
|
74
115
|
- 유저의 현재 위치를 먼저 확인했다.
|
|
75
|
-
-
|
|
76
|
-
-
|
|
116
|
+
- 공식 Kakao Local API로 술집 후보를 최소 1개 이상 찾았거나 실패 이유를 설명했다.
|
|
117
|
+
- 각 후보의 카카오맵 상세 링크를 확보했다.
|
|
118
|
+
- 상위 후보의 상세 링크에서 영업 상태·메뉴·좌석 정보를 확인했거나, 확인하지 못한 이유를 명시했다.
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kakao-bar-nearby",
|
|
3
|
-
"description": "Use when the user asks for nearby bars or 근처 술집.
|
|
3
|
+
"description": "Use when the user asks for nearby bars or 근처 술집. Ask for the user's location, search with the official Kakao Local API, then follow returned Kakao Map detail links for open-now, menu, and seating hints. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.",
|
|
4
4
|
"profiles": [
|
|
5
|
+
"proxy",
|
|
6
|
+
"browser",
|
|
5
7
|
"action:booking"
|
|
6
8
|
],
|
|
7
|
-
"frontmatter": "name: kakao-bar-nearby\ndescription: Use when the user asks for nearby bars or 근처 술집.
|
|
9
|
+
"frontmatter": "name: kakao-bar-nearby\ndescription: Use when the user asks for nearby bars or 근처 술집. Ask for the user's location, search with the official Kakao Local API, then follow returned Kakao Map detail links for open-now, menu, and seating hints. 돌쇠에서는 공식 표면을 통한 후속 액션까지 진행한다.\nlicense: MIT\nmetadata:\n category: food\n locale: ko-KR\n phase: v1"
|
|
8
10
|
}
|