- name
- setup
- description
- This skill should be used when the user wants gptaku-core to also route requests to skills that are not gptaku plugins โ their personal skills in ~/.claude/skills and skills from other plugin marketplaces โ so those are picked automatically without being named. It scans installed skills, drafts routing keywords from each skill's trigger phrases, asks for approval, writes ~/.claude/gptaku-core/routes.json, and self-checks the result. Korean triggers: "gptaku-core ์
์
", "๋ด ์คํฌ๋ ๋ผ์ฐํ
", "๋ด ์คํฌ ์๋์ผ๋ก ์ฐ๊ฒ", "๊ฐ์ธ ์คํฌ ๋ผ์ฐํ
์ค์ ", "๋ผ์ฐํฐ์ ์คํฌ ์ถ๊ฐ", "๋ผ์ฐํธ ๋ค์ ์ก์์ค". English triggers: "gptaku-core setup", "route my own skills", "add my skills to the router".
# gptaku-core setup โ ๋ด ์คํฌ๋ ์๋์ผ๋ก ์ฐ๊ฒ
gptaku-core ๋ผ์ฐํฐ๋ ์ผ์ง gptaku ํ๋ฌ๊ทธ์ธ์ `routing.json`๊ณผ ํจ๊ป **์ฌ์ฉ์ ๋ผ์ฐํธ ํ์ผ**
`~/.claude/gptaku-core/routes.json`์ ์ฝ๋๋ค. ์ด ์
์
์ ๊ทธ ํ์ผ์ ์ฌ์ฉ์์ ์ค์ ์คํฌ๋ก ์ฑ์ด๋ค.
ํ์ผ ํ์์ ํ๋ฌ๊ทธ์ธ `routing.json`๊ณผ ๊ฐ๊ณ , ๊ฐ์ธ ์คํฌ(`~/.claude/skills/<name>`)์ ์ฝ๋ก ์๋
์ด๋ฆ(`"skill": "my-skill"`), ๋ค๋ฅธ ๋ง์ผ ํ๋ฌ๊ทธ์ธ ์คํฌ์ `"plugin:skill"`๋ก ์ ๋๋ค.
๋๊ตฌ: `python3 "${CLAUDE_PLUGIN_ROOT}/hooks/user_routes.py" <scan|write|remove|check|list>`
## Step 1 โ ์ค์บ
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/hooks/user_routes.py" scan
```
๊ฒฐ๊ณผ์ `skills[]` ์ค `routed: false`์ธ ๊ฒ์ด ๋์์ด๋ค. `explicit_only: true`(๋ชจ๋ธ ์๋ ํธ์ถ์ ๋
์คํฌ)๋ ๋ผ์ฐํธ๋ฅผ ๋ง๋ค์ง ์๋๋ค. ๊ฐ ํญ๋ชฉ์ `triggers`(์ค๋ช
์ ์ธ์ฉ ๋ฌธ๊ตฌ)์ `draft_keywords`(์์ฒญ ์ด๋ฏธ๋ฅผ
๋ ์ด์)๋ฅผ ์ถ๋ฐ์ ์ผ๋ก ์ด๋ค.
## Step 2 โ ์ด์ ์์ฑ
๋์๋ง๋ค ๋ผ์ฐํธ ํ๋๋ฅผ ๋ง๋ ๋ค. ์์น:
- `keywords`์๋ **๊ทธ ์คํฌ๋ง์ ํํ**๋ง ๋ฃ๋๋ค. `"๋ฃจํ"`, `"์ธํฐ๋ทฐ"`, `"wrap"`, `"watch"`, `"design review"`์ฒ๋ผ
๋ค๋ฅธ ๋งฅ๋ฝ์์๋ ํํ ๋ง์ ๋นผ๊ฑฐ๋ `weak`(1์ , ๊ฐ์ ์ ์ ๊ฐํ ๊ทผ๊ฑฐยท`context`๊ฐ ์์ ๋๋ง)๋ก ๋ด๋ฆฐ๋ค.
- ํค์๋๋ ์์ฒญ ์ด๋ฏธ๋ฅผ ๋ ์ค๊ธฐ๋ก ์ด๋ค(`"์ค๋ฌธํด์ค"` โ `"์ค๋ฌธ"`). ์๋ฌธยท์ซ์๋ ๋จ์ด ๊ฒฝ๊ณ๋ก, ํ๊ธ์ ์์ชฝ
๊ฒฝ๊ณ๋ก ๋์กฐ๋๋ค.
- ์ฝ๋ ์์
๊ณผ ๊ฒน์น๋ ์คํฌ์ด ์๋๋ฉด `exclude`์ `["์ฝ๋", "ํจ์", "ํ
์คํธ", "๋ฆฌํฉํฐ", "๋ฒ๊ทธ", "์๋ฌ"]`๋ฅผ ๋ฃ๋๋ค.
- `when`์ ์ธ์
๊ท์น์ ๊ทธ๋๋ก ๋ค์ด๊ฐ๋ ํ ์ค ์ค๋ช
์ด๋ค(ํ๊ตญ์ด, "~ํ ๋").
- `priority`๋ ๊ธฐ๋ณธ 20. ๊ฐ์ ์ผ์ ํ๋ ์คํฌ์ด ๋์ด๋ฉด ์ฌ์ฉ์๊ฐ ์ฃผ๋ก ์ฐ๋ ์ชฝ์ ๋์ธ๋ค(๊ทธ ๋ฐ๋๋ ์ด๋ฆ์
์ง์ ๋ถ๋ฅผ ๋๋ง ๊ฑธ๋ฆฌ๋๋ก ๊ทธ ์ด๋ฆ๋ง `keywords`์ ๋๋ค).
- `"์ฒดํฌ์ธ"`์ฒ๋ผ ํ ๋จ์ด๋ก ๋ถ๋ฅด๋ ์คํฌ์ ๊ทธ ๋จ์ด๋ฅผ `keywords`์ ๋ฃ์ผ๋ฉด ์ด๋ฏธ ์์ด๋ ๊ฑธ๋ฆฐ๋ค.
- ๊ฐ์ ์คํฌ์ด `~/.claude/skills`์ ํ๋ฌ๊ทธ์ธ ์์ชฝ์ ์์ผ๋ฉด(์: `cloudflare`์ `cloudflare:cloudflare`)
์ฌ์ฉ์๊ฐ ์ค์ ๋ก ๋ถ๋ฅด๋ ์ชฝ ํ๋๋ง ๋ง๋ ๋ค.
- ํธ๋ฆฌ๊ฑฐ๊ฐ ์๊ฑฐ๋ ์ฐ์์ ์ ์ ์๋ ์คํฌ์ ์ต์ง๋ก ๋ง๋ค์ง ๋ง๊ณ ํ์ "๋ณด๋ฅ"๋ก ๋จ๊ธด๋ค.
## Step 3 โ ์น์ธ
ํ(์คํฌ ยท when ยท ๋ํ keywords ยท ๋ณด๋ฅ ์ฌ๋ถ)๋ก ๋ณด์ฌ ์ฃผ๊ณ AskUserQuestion์ผ๋ก "์ ๋ถ ์ ์ฉ / ๊ณ ๋ฅผ๊ฒ /
์ทจ์"๋ฅผ ๋ฌป๋๋ค. ์น์ธ ์ ์๋ ํ์ผ์ ์ฐ์ง ์๋๋ค. ๋ฌด์๋ต์ ์น์ธ์ด ์๋๋ค.
## Step 4 โ ์ฐ๊ธฐ
์น์ธ๋ ๋ผ์ฐํธ๋ง ์์ ํ์ผ(`{"routes": [...]}`)์ ๋ด์ ํฉ์น๋ค. ๊ฐ์ ์คํฌ์ ๊ต์ฒด๋๊ณ ๋๋จธ์ง ๊ธฐ์กด
์ฌ์ฉ์ ๋ผ์ฐํธ๋ ์ ์ง๋๋ค.
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/hooks/user_routes.py" write /tmp/gptaku-user-routes.json
```
`invalid`๊ฐ ๋์ค๋ฉด ๊ทธ ๋ผ์ฐํธ๋ฅผ ๊ณ ์ณ ๋ค์ ์ด๋ค.
## Step 5 โ ์์ฒด ์ ๊ฒ
์คํฌ๋ง๋ค **๊ฑธ๋ ค์ผ ํ ๋ฌธ์ฅ 2๊ฐ**์ **๊ฑธ๋ฆฌ๋ฉด ์ ๋๋ ๋ฌธ์ฅ 1๊ฐ**(๊ทธ ์คํฌ ๋จ์ด๊ฐ ๋ค์ด๊ฐ์ง๋ง ๋ค๋ฅธ ์ผ์ธ ๋ฌธ์ฅ)๋ฅผ
๋ง๋ค์ด ํ ๋ฒ์ ํ์ธํ๋ค.
```bash
python3 "${CLAUDE_PLUGIN_ROOT}/hooks/user_routes.py" check "๋ฌธ์ฅ1" "๋ฌธ์ฅ2" ...
```
๊ฐ ์ค์ `์ง๋ชฉ๋ ์คํฌ<TAB>๋ฌธ์ฅ`(์์ผ๋ฉด `-`)์ด๋ค. ๊ธฐ๋์ ๋ค๋ฅด๋ฉด ํค์๋๋ฅผ ๊ณ ์ณ Step 4๋ถํฐ ๋ค์ ํ๋ค.
gptaku ํ๋ฌ๊ทธ์ธ ์คํฌ๋ก ๊ฐ์ผ ํ ๋ฌธ์ฅ(์: "๊ตฌ๊ธ ์บ๋ฆฐ๋ ์ผ์ ํ์ธํด์ค")์ด ์ฌ์ฉ์ ๋ผ์ฐํธ๋ก ๋นผ์๊ธฐ์ง
์๋์ง๋ ํ ์ค ๋ฃ์ด ํ์ธํ๋ค.
## Step 6 โ ๋ณด๊ณ
์ ์ฉํ ์คํฌ ์, ๋ณด๋ฅํ ์คํฌ๊ณผ ์ด์ , ์ ๊ฒ ๊ฒฐ๊ณผ(๊ธฐ๋์ ๋ค๋ฅธ ์ค์ด ์์๋ค๋ฉด ๊ณ ์น ๋ด์ฉ)๋ฅผ ์งง๊ฒ ๋ณด๊ณ ํ๋ค.
์ ๋ผ์ฐํธ๋ **๋ค์ ์์ฒญ๋ถํฐ** ๋ฐ๋ก ์ ์ฉ๋๊ณ , ์ธ์
๊ท์น ๋ชฉ๋ก์ ๋ค์ ์ธ์
์์(๋๋ `/clear`)๋ถํฐ ๋ฐ์๋๋ค.
## ๊ด๋ฆฌ
- ์คํฌ์ ์๋ก ์ค์นํ์ผ๋ฉด ์ด ์
์
์ ๋ค์ ๋๋ฆฐ๋ค(์ด๋ฏธ ๋ผ์ฐํธ๊ฐ ์๋ ์คํฌ์ `routed: true`๋ก ๋์ ๊ฑด๋๋ด๋ค).
- ์ง์ฐ๊ธฐ: `user_routes.py remove <skill>` ยท ํ์ฌ ๋ชฉ๋ก: `user_routes.py list`
- ๋ผ์ฐํฐ๋ฅผ ์ ์ ๋๊ธฐ: ํ๊ฒฝ๋ณ์ `GPTAKU_ROUTER=off`
View on GitHub