Disclaimer:
kmsg๋ Kakao Corp. ์ ๊ณต์ ๋๊ตฌ๊ฐ ์๋๋๋ค. ์ฌ์ฉ์๋ ๋ณธ์ธ ๊ณ์ /ํ๊ฒฝ์์ ๊ด๋ จ ๋ฒ๊ท, ์๋น์ค ์ฝ๊ด, ํ์ฌ ๋ณด์ ์ ์ฑ ์ ์ค์ํ ์ฑ ์์ด ์์ต๋๋ค. ์ด ๋๊ตฌ ์ฌ์ฉ์ผ๋ก ๋ฐ์ํ ์ ์๋ ๊ณ์ ์ ํ, ์ค์๋, ๋ฐ์ดํฐ ์์ค, ๊ธฐํ ์ํด์ ๋ํ ์ฑ ์์ ์ฌ์ฉ์์๊ฒ ์์ต๋๋ค.
kmsg ๋ macOS์์ ์นด์นด์คํก ๋ฉ์์ง๋ฅผ CLI ๋ก ์ฝ๊ณ ๋ณด๋ด๋ ๋๊ตฌ์
๋๋ค. ๋จ์ํ ์๋ CLI ๋ฅผ ๋์ด, AI Agent ๋๋ Hook ์ด๋ฒคํธ ๋ฑ์ ์๋ํ ํ์ดํ๋ผ์ธ์ ์ฐ๊ฒฐํ๊ธฐ ์ฝ๋๋ก ๊ตฌํํ์ต๋๋ค. kmsg ๋ openclaw ์ ์ฐฝ์์์ธ steipete ๊ฐ ๋ง๋ iMessage ์ปจํธ๋กค์ ์ํ CLI ๋๊ตฌ์ธ imsg ์ ์๊ฐ์ ๋ฐ์ ์์ฑ๋์์ต๋๋ค.
record.mp4
์๊ตฌ์ฌํญ:
- macOS 13+
- macOS์ฉ KakaoTalk ์ค์น
brew install channprj/tap/kmsgmkdir -p ~/.local/bin && curl -fL https://github.com/channprj/kmsg/releases/latest/download/kmsg-macos-universal -o ~/.local/bin/kmsg && chmod +x ~/.local/bin/kmsg์ค์น ํ์ธ์ ์๋์ ๊ฐ์ด ์งํํฉ๋๋ค.
kmsg status๊ถํ ํ์ ์ด ๋จ๋ฉด ํ์ฉํด ์ฃผ์ธ์.
kmsg๋ฅผ ๋ฐ๋ก ์คํํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด PATH ๋ฑ๋ก์ ํด์ฃผ์ธ์.
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc && source ~/.zshrckmsg status
kmsg send "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "์๋
ํ์ธ์"
kmsg send "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "$(date '+%Y-%m-%d %H:%M:%S') ํ
์คํธ"
kmsg send "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "ํ
์คํธ" --keep-window
kmsg send-image "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "/path/to/image.png"
kmsg chats
kmsg read "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" --limit 20
kmsg read "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" --limit 20 --keep-window
kmsg read "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" --limit 20 --json
kmsg read "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" --limit 20 --deep-recovery
kmsg inspect --window 0 --depth 20 --debug-layout์ต์
์ ๋น๋ ๊ธฐ์ค kmsg --help, kmsg <command> --help ์ถ๋ ฅ๊ณผ ๋์ผํ๊ฒ ๊ด๋ฆฌ๋ฉ๋๋ค.
kmsg status [--verbose]--verbose: ์์ธ ์ํ ์ถ๋ ฅ
kmsg chats [--verbose] [--limit <limit>] [--trace-ax]-v, --verbose: ์์ธ ์ ๋ณด ์ถ๋ ฅ-l, --limit <limit>: ์ต๋ ์ฑํ ๋ชฉ๋ก ๊ฐ์ (๊ธฐ๋ณธ๊ฐ: 20)--trace-ax: AX ํ์/์ฌ์๋ ๋ก๊ทธ ์ถ๋ ฅ
kmsg read <chat> [--limit <limit>] [--debug] [--trace-ax] [--keep-window] [--deep-recovery] [--json]-l, --limit <limit>: ์ต๋ ๋ฉ์์ง ๊ฐ์ (๊ธฐ๋ณธ๊ฐ: 20)--debug: raw element ๋๋ฒ๊ทธ ์ ๋ณด ์ถ๋ ฅ--trace-ax: AX ํ์/์ฌ์๋ ๋ก๊ทธ ์ถ๋ ฅ-k, --keep-window: ์๋์ผ๋ก ์ฐ ์ฑํ ์ฐฝ ์ ์ง--deep-recovery: ๋น ๋ฅธ ํ์ ์คํจ ์ deep recovery ์ํ--json: JSON ํ์์ผ๋ก ์ถ๋ ฅ
kmsg send <recipient> <message> [--dry-run] [--trace-ax] [--no-cache] [--refresh-cache] [--keep-window] [--deep-recovery]--dry-run: ์ค์ ์ ์ก ์์ด ์๋ฎฌ๋ ์ด์ --trace-ax: AX ํ์/์ฌ์๋ ๋ก๊ทธ ์ถ๋ ฅ--no-cache: ์ด๋ฒ ์คํ์์ AX path cache ๋นํ์ฑํ--refresh-cache: ์ด๋ฒ ์คํ์์ AX path cache ๊ฐ์ ์ฌ๊ตฌ์ฑ-k, --keep-window: ์๋์ผ๋ก ์ฐ ์ฑํ ์ฐฝ ์ ์ง--deep-recovery: ๋น ๋ฅธ ํ์ ์คํจ ์ deep recovery ์ํ
kmsg send-image <recipient> <image-path> [--trace-ax] [--no-cache] [--keep-window] [--deep-recovery]--trace-ax: AX ํ์/์ฌ์๋ ๋ก๊ทธ ์ถ๋ ฅ--no-cache: ์ด๋ฒ ์คํ์์ AX path cache ๋นํ์ฑํ-k, --keep-window: ์๋์ผ๋ก ์ฐ ์ฑํ ์ฐฝ ์ ์ง--deep-recovery: ๋น ๋ฅธ ํ์ ์คํจ ์ deep recovery ์ํ
kmsg inspect [--depth <depth>] [--window <window>] [--show-attributes] [--show-path] [--show-frame] [--show-index] [--show-flags] [--show-actions] [--debug-layout] [--row-summary] [--row-range <start:end>]-d, --depth <depth>: ์ต๋ ํ์ ๊น์ด (๊ธฐ๋ณธ๊ฐ: 4)-w, --window <window>: inspect ๋์ ์ฐฝ ์ธ๋ฑ์ค (๊ธฐ๋ณธ๊ฐ: main window)--show-attributes: ๊ฐ ์์์ AX attribute ์ถ๋ ฅ--show-path: ๊ฐ ์์์ AX ๊ฒฝ๋ก ์ถ๋ ฅ--show-frame: ๊ฐ ์์ frame ์ถ๋ ฅ--show-index: sibling index ์ถ๋ ฅ--show-flags: ์ํ ํ๋๊ทธ(enabled/focused/selected/editable) ์ถ๋ ฅ--show-actions: ์ง์ AX action ์ถ๋ ฅ--debug-layout:path/frame/index/flags๋ฅผ ํ ๋ฒ์ ์ผ๋ ๋ ์ด์์ ๋๋ฒ๊ทธ ๋ฒ๋ค--row-summary: ๋ฉ์์ง row ์์ฝ ์ถ๋ ฅ--row-range <start:end>:--row-summary๊ฒฐ๊ณผ๋ฅผ ํน์ ๋ฒ์๋ง ์ถ๋ ฅ (inclusive, zero-based)
kmsg help cachestatus(default): ์บ์ ์ํ ์ถ๋ ฅclear: ์บ์ ์ญ์ export <output-path>: ์บ์ JSON ๋ด๋ณด๋ด๊ธฐimport <input-path>: ์บ์ JSON ๊ฐ์ ธ์ค๊ธฐwarmup [--recipient <recipient>] [--trace-ax] [--keep-window]: ๊ฒฝ๋ก ์บ์ ์๋ฐ์
kmsg๋ ์์ฌ์ด ์ฌ์ฉ(Accessibility) ๊ถํ์ด ํ์ํฉ๋๋ค.
์ฑ์ด ์๋ ์์ฒญ์ ์คํจํ๋ฉด:
- ์์คํ ์ค์ ์ด๊ธฐ
๊ฐ์ธ์ ๋ณด ๋ณดํธ ๋ฐ ๋ณด์ > ์์ฌ์ด ์ฌ์ฉkmsgํ ๊ธ ์ผ๊ธฐ
read ๋ช
๋ น์ --json ํ๋๊ทธ๋ก ๊ตฌ์กฐํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
kmsg read "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" --limit 20 --json{
"chat": "ํ๊ธธ๋",
"fetched_at": "2026-02-26T01:23:45.678Z",
"count": 20,
"messages": [
{
"author": "ํ๊ธธ๋",
"time_raw": "00:27",
"body": "๋ฐค์ด ๊น์๋ค"
}
]
}chat: ์ค์ ๋ก ์ฝ์ ์ฑํ ๋ฐฉ ์ ๋ชฉfetched_at: ๋ฉ์์ง ์์ง ์๊ฐ(ISO-8601 UTC)count: ๋ฐํ๋ ๋ฉ์์ง ๊ฐ์messages[].author: ์์ฑ์ ์ด๋ฆ ((me)๋ ๋ด ๋ฉ์์ง ๋๋ ์์ฑ์ ์ถ๋ก ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ)messages[].time_raw: UI์์ ์ฝํ ์๊ฐ ๋ฌธ์์ด(์์ผ๋ฉดnull)messages[].body: ๋ฉ์์ง ๋ณธ๋ฌธ
--json์ฌ์ฉ ์ JSON์stdout์ผ๋ก๋ง ์ถ๋ ฅ๋ฉ๋๋ค.--trace-ax๋ก๊ทธ๋stderr๋ก ๋ถ๋ฆฌ๋๋ฏ๋ก OpenClaw ๊ฐ์ ํ์ดํ ์ฐ๋์์ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
kmsg ๋ MCP ๋ก ๋ถ์ฌ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
์ฐ์ , ์๋์ ๊ฐ์ด MCP ์๋ฒ๋ฅผ ์คํํฉ๋๋ค.
python tools/kmsg-mcp.pyMCP ์๋ฒ๋ฅผ ๋์ ๋ค๋ฉด ์๋์ ๊ฐ์ด JSON ์ค์ ๊ฐ์ ์ฃผ๋ฉด์ MCP ์ฐ๋์ ํด๋ฌ๋ผ๊ณ ํ๋ฉด ๋ฉ๋๋ค. ์ ๋ง ๊ฐ๋จํ์ฃ ? ๊ทธ๋๋ args ์ path ๋ ์์ ํ์ ์ผ ํฉ๋๋ค.
{
"mcpServers": {
"kmsg": {
"command": "python3",
"args": ["/path/to/kmsg/tools/kmsg-mcp.py"],
"env": {
"KMSG_BIN": "$HOME/.local/bin/kmsg",
"KMSG_DEFAULT_DEEP_RECOVERY": "false",
"KMSG_TRACE_DEFAULT": "false"
}
}
}
}kmsg_read:chat,limit,deep_recovery,keep_window,trace_axkmsg_send:chat,message,confirm,deep_recovery,keep_window,trace_axkmsg_send_image:chat,image_path,confirm,deep_recovery,keep_window,trace_ax
kmsg_send, kmsg_send_image๋ ๊ธฐ๋ณธ๊ฐ(confirm=false, ๋๋ confirm ์๋ต)์์ ์ค์ ์ ์ก์ ์ํํฉ๋๋ค.
confirm=true๋ก ํธ์ถํ๋ฉด ์ ์กํ์ง ์๊ณ CONFIRMATION_REQUIRED๋ฅผ ๋ฐํํฉ๋๋ค.
MCP ์๋ฒ ์ฐ๊ฒฐ ํ, ์๋ ์์๋ก ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
- ์ต๊ทผ ๋ฉ์์ง ์ฝ๊ธฐ
{
"name": "kmsg_read",
"arguments": {
"chat": "ํ๊ธธ๋",
"limit": 20
}
}- ๋ฉ์์ง ๋ณด๋ด๊ธฐ (๊ธฐ๋ณธ๊ฐ: ์ฆ์ ์ ์ก)
{
"name": "kmsg_send",
"arguments": {
"chat": "ํ๊ธธ๋",
"message": "๋ฐ๋ก ์ ์ก๋ฉ๋๋ค."
}
}- ์ด๋ฏธ์ง ๋ณด๋ด๊ธฐ (๊ธฐ๋ณธ๊ฐ: ์ฆ์ ์ ์ก)
{
"name": "kmsg_send_image",
"arguments": {
"chat": "ํ๊ธธ๋",
"image_path": "/path/to/image.png"
}
}- ์ ์ก ์ ํ์ธ ๋จ๊ณ ๊ฐ์ (
confirm=true)
{
"name": "kmsg_send",
"arguments": {
"chat": "ํ๊ธธ๋",
"message": "์ฌ์ฉ์ ์น์ธ ํ ๋ค์ ์ ์ก",
"confirm": true
}
}openclaw ์์ ์์ธํ ์ฐ๋/์ด์ ๊ฐ์ด๋๋ docs/openclaw.md ๋ฅผ ์ฐธ๊ณ ํ์ธ์. ์ค์ ํ ํ๋ฆฟ์ docs/openclaw.mcp.example.json ์๋ ํฌํจ๋์ด ์์ต๋๋ค.
git clone https://github.com/channprj/kmsg.git
cd kmsg
swift build -c release
install -m 755 .build/release/kmsg ~/.local/bin/kmsgkmsg send "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "ํ
์คํธ" --trace-ax
kmsg send "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "ํ
์คํธ" --dry-run --trace-ax
kmsg send "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "ํ
์คํธ" --no-cache
kmsg send "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "ํ
์คํธ" --refresh-cache
kmsg send-image "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "/path/to/image.png" --trace-ax
KMSG_AX_TIMEOUT=0.25 kmsg send "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "ํ
์คํธ"
kmsg inspect --window 0 --depth 20 --debug-layout
kmsg inspect --window 0 --depth 20 --row-summary
kmsg inspect --window 0 --depth 20 --row-summary --row-range 10:35
kmsg cache status
kmsg cache warmup --recipient "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" --trace-ax
kmsg cache warmup --recipient "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" --keep-window
kmsg cache export ./ax-cache.json
kmsg cache import ./ax-cache.json
kmsg read "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" --deep-recovery --trace-ax
kmsg send "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "ํ
์คํธ" --deep-recovery --trace-ax
kmsg send-image "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "/path/to/image.png" --deep-recovery --trace-ax --keep-window--deep-recovery๋ ๋น ๋ฅธ ์ฐฝ ํ์์ด ์คํจํ ๋๋ง relaunch/open ๋ณต๊ตฌ๋ฅผ ์ถ๊ฐ๋ก ์ํํฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ์๋์ผ๋ก ์ฐ ์นด์นด์คํก ์ฐฝ์ ๋ช
๋ น ์ข
๋ฃ ์ ๋ซํ๋ฉฐ, --keep-window(๋๋ -k)๋ก ์ ์งํ ์ ์์ต๋๋ค.
๋ฉ์์ง ์ฝ๊ธฐ/๋ณด๋ด๊ธฐ๊ฐ ๊ธฐ๋์ ๋ค๋ฅด๋ฉด ์๋ ์์๋ก ์ํ๋ฅผ ์์งํด ์ฃผ์ธ์.
# 1) ๋์ ์ฑํ
์ฐฝ ๊ตฌ์กฐ ํ์ธ
kmsg inspect --window 0 --depth 20 --debug-layout
# 1-1) ๋ฉ์์ง row ํ์ฑ ์ง๋จ
kmsg inspect --window 0 --depth 20 --row-summary
kmsg inspect --window 0 --depth 20 --row-summary --row-range 10:30
# 2) ์ฝ๊ธฐ ๊ฒฝ๋ก/AX ๋ก๊ทธ ํ์ธ
kmsg read "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" --limit 20 --trace-ax
# 3) ๋ณด๋ด๊ธฐ ๊ฒฝ๋ก/AX ๋ก๊ทธ ํ์ธ
kmsg send "๋ณธ์ธ, ์น๊ตฌ, ๋๋ ๋จํก๋ฐฉ ์ด๋ฆ" "ํ
์คํธ" --trace-ax --dry-runAXTextArea, value: "..."๋ ์ค์ ๋ฉ์์ง ๋ณธ๋ฌธ ํ๋ณด์ ๋๋ค.AXStaticText, value: "5\n00:27"๊ฐ์ ๊ฐ์ ๋ณดํต ์นด์ดํธ/์๊ฐ ๋ฉํ ์ ๋ณด์ ๋๋ค.--debug-layout์ ์ผ๋ฉดpath/frame/index/flags๊ฐ ํจ๊ป ์ถ๋ ฅ๋์ด ์์น ๊ธฐ๋ฐ ๋ถ์์ด ์ฌ์์ง๋๋ค.--row-summary๋readํ์ ๊ธฐ์ค์ผ๋ก row๋ณauthorCandidates,time,buttonTitles๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ฒํ ๋ ์ ์ฉํฉ๋๋ค.- ์ด์ ๋ณด๊ณ ์
inspect์ถ๋ ฅ๊ณผ--trace-ax์ถ๋ ฅ์ ํจ๊ป ์ฒจ๋ถํ๋ฉด ์์ธ ํ์ ์ด ๋นจ๋ผ์ง๋๋ค.
๊ฐ๋ฐ์ ์งํํ๊ฑฐ๋ ๋ฒ๊ทธ ์์ ์ ์ํ ๋ Coding Agent์๊ฒ ์๋ ์ ๋ณด์ ํจ๊ป ์์ฒญํ๋ฉด ์ข์ต๋๋ค.
- ์คํํ ๋ช
๋ น์ด:
kmsg read ... --trace-ax,kmsg inspect ... - ๊ธฐ๋ ๊ฒฐ๊ณผ: ๋ฌด์์ด ๋ณด์ฌ์ผ ํ๋์ง
- ์ค์ ๊ฒฐ๊ณผ: ํ์ฌ ๋ฌด์์ด ์ถ๋ ฅ๋๋์ง
- ๊ด๋ จ ๋ก๊ทธ:
inspect๋ณธ๋ฌธ ๊ตฌ๊ฐ (AXRow > AXCell > AXTextArea) +trace-ax
kmsg read๊ฐ ๋ฉ์์ง ๋ณธ๋ฌธ ๋์ ์๊ฐ/์ซ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
inspect ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค์ผ๋ก AXRow > AXCell > AXTextArea.value๋ฅผ ์ฐ์ ์ถ์ถํ๋๋ก ์์ ํด ์ฃผ์ธ์.
README ๋๋ฒ๊น
๊ฐ์ด๋๋ ํจ๊ป ์
๋ฐ์ดํธํด ์ฃผ์ธ์.
v* ํ๊ทธ๋ฅผ ํธ์ํ๋ฉด GitHub Actions๊ฐ ์๋์ผ๋ก ๋น๋ํด์ kmsg-macos-universal ํ์ผ์ Releases์ ์
๋ก๋ํฉ๋๋ค.
๋ํ TAP_REPO_TOKEN์ด ์ค์ ๋์ด ์์ผ๋ฉด channprj/homebrew-tap์ Formula/kmsg.rb๋ฅผ ์๋์ผ๋ก ๊ฐฑ์ ํฉ๋๋ค.
๋ฐฐํฌ ์ ์ VERSION ํ์ผ ๊ฐ์ ๋จผ์ ์
๋ฐ์ดํธํ์ธ์.
# gh ํ ํฐ์ด ๋ง๋ฃ๋์ผ๋ฉด ์ฌ๋ก๊ทธ์ธ
gh auth login -h github.com
# ๋ฐฐํฌ ํ๊ทธ ์์ฑ/ํธ์
git tag v0.2.3
git push origin v0.2.3ํ์ํ๋ฉด Actions๋ฅผ ์๋ ์คํํ ์ ์์ต๋๋ค.
workflow_dispatch์์ tag๋ฅผ ๋น์๋๋ฉด VERSION ํ์ผ์ ์ฝ์ด v<version>์ผ๋ก ์๋ ์์ฑํฉ๋๋ค.
tag๋ฅผ ์ง์ ์
๋ ฅํ ๊ฒฝ์ฐ vX.Y.Z ํ์๋ง ํ์ฉ๋ฉ๋๋ค.
# ํ๊ทธ๋ฅผ ์ง์ ์ง์ ํด์ ์คํ
gh workflow run release.yml -f tag=v0.2.4
# tag ๋ฏธ์ง์ ์ VERSION(์: 0.2.4) ๊ธฐ๋ฐ์ผ๋ก ์คํ
gh workflow run release.ymlchannprj/homebrew-tap์ ์ฅ์๋ฅผ ๋ง๋ค๊ณFormula/๋๋ ํฐ๋ฆฌ๋ฅผ ์ค๋นํฉ๋๋ค.kmsg์ ์ฅ์ Secrets์TAP_REPO_TOKEN์ ์ถ๊ฐํฉ๋๋ค.- ๊ถํ:
homebrew-tap์ ์ฅ์contents: write
- ๊ถํ:
- tap ์ ์ฅ์ ๊ธฐ๋ณธ ๋ธ๋์น๊ฐ
main์ด ์๋๋ฉด.github/workflows/release.yml์TAP_REPO_REF๊ฐ์ ๋ง์ถฐ ์ฃผ์ธ์.
๋ฆด๋ฆฌ์ฆ ํ ์ฌ์ฉ์๋ ์๋ ๋ช ๋ น์ผ๋ก ์ค์นํ ์ ์์ต๋๋ค.
brew install channprj/tap/kmsg- Homebrew ์ค์น:
brew install channprj/tap/kmsg - ์ง์ ์ค์น๋
kmsg-macos-universal์ํฐํฉํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. - ๋ค์ด๋ก๋ ์คํจ ์ https://github.com/channprj/kmsg/releases ์์ ์ง์ ๋ด๋ ค๋ฐ์
~/.local/bin/kmsg๋ก ์ ์ฅ ํchmod +x ~/.local/bin/kmsg๋ฅผ ์งํํ์๋ฉด ๋ฉ๋๋ค.
This project is strongly inspired by steipete and his works.
