SpyBara
Go Premium

statusline.md 2026-06-22 23:59 UTC to 2026-06-23 22:00 UTC

1 added, 1 removed.

2026
Tue 30 23:02 Mon 29 23:02 Sat 27 01:01 Fri 26 23:00 Thu 25 23:58 Wed 24 22:02 Tue 23 22:00 Mon 22 23:59 Fri 19 22:58 Thu 18 22:00 Wed 17 17:02 Tue 16 21:57 Mon 15 23:02 Sat 13 21:59 Fri 12 22:00 Thu 11 23:01 Wed 10 23:57 Tue 9 06:34 Mon 8 06:52 Sat 6 06:24 Fri 5 06:45 Thu 4 06:52 Wed 3 06:53 Tue 2 06:51

์ƒํƒœ ํ‘œ์‹œ์ค„ ์‚ฌ์šฉ์ž ์ •์˜

Claude Code์—์„œ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ์‚ฌ์šฉ๋Ÿ‰, ๋น„์šฉ ๋ฐ git ์ƒํƒœ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ์ƒํƒœ ํ‘œ์‹œ์ค„ ๊ตฌ์„ฑ

์ƒํƒœ ํ‘œ์‹œ์ค„์€ Claude Code ํ•˜๋‹จ์˜ ์‚ฌ์šฉ์ž ์ •์˜ ๊ฐ€๋Šฅํ•œ ๋ง‰๋Œ€๋กœ, ๊ตฌ์„ฑํ•œ ๋ชจ๋“  ์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. stdin์„ ํ†ตํ•ด JSON ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ถœ๋ ฅํ•˜๋Š” ๋ชจ๋“  ๋‚ด์šฉ์„ ํ‘œ์‹œํ•˜์—ฌ ์ปจํ…์ŠคํŠธ ์‚ฌ์šฉ๋Ÿ‰, ๋น„์šฉ, git ์ƒํƒœ ๋˜๋Š” ์ถ”์ ํ•˜๋ ค๋Š” ๋‹ค๋ฅธ ํ•ญ๋ชฉ์„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ๋Š” ์ง€์†์ ์ธ ๋ณด๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ ํ‘œ์‹œ์ค„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค:

  • ์ž‘์—… ์ค‘ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋ ค๋Š” ๊ฒฝ์šฐ
  • ์„ธ์…˜ ๋น„์šฉ์„ ์ถ”์ ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • ์—ฌ๋Ÿฌ ์„ธ์…˜์—์„œ ์ž‘์—…ํ•˜๊ณ  ์ด๋“ค์„ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
  • git ๋ธŒ๋žœ์น˜ ๋ฐ ์ƒํƒœ๋ฅผ ํ•ญ์ƒ ํ‘œ์‹œํ•˜๋ ค๋Š” ๊ฒฝ์šฐ

์ƒํƒœ ํ‘œ์‹œ์ค„์€ ๊ธฐ๋ณธ ์ œ๊ณต ๋ฐ”๋‹ฅ๊ธ€ ๋ฐฐ์ง€ ์œ„์˜ ์ž์ฒด ํ–‰์—์„œ ๋ Œ๋”๋ง๋˜๋ฉฐ ์ด๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€ํ™”์— ID๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋‹ฅ๊ธ€์— ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ๋งํฌ ๋ฐฐ์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ๋Œ€์‹  footerLinksRegexes๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ฒซ ๋ฒˆ์งธ ์ค„์— git ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ์ค„์— ์ƒ‰์ƒ์œผ๋กœ ๊ตฌ๋ถ„๋œ ์ปจํ…์ŠคํŠธ ๋ง‰๋Œ€๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋‹ค์ค‘ ์ค„ ์ƒํƒœ ํ‘œ์‹œ์ค„์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

๋ชจ๋ธ ์ด๋ฆ„, ๋””๋ ‰ํ† ๋ฆฌ, git ๋ธŒ๋žœ์น˜๋ฅผ ์ฒซ ๋ฒˆ์งธ ์ค„์— ํ‘œ์‹œํ•˜๊ณ  ์ปจํ…์ŠคํŠธ ์‚ฌ์šฉ๋Ÿ‰ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„, ๋น„์šฉ ๋ฐ ๊ธฐ๊ฐ„์„ ๋‘ ๋ฒˆ์งธ ์ค„์— ํ‘œ์‹œํ•˜๋Š” ๋‹ค์ค‘ ์ค„ ์ƒํƒœ ํ‘œ์‹œ์ค„

์ด ํŽ˜์ด์ง€๋Š” ๊ธฐ๋ณธ ์ƒํƒœ ํ‘œ์‹œ์ค„ ์„ค์ •์„ ์•ˆ๋‚ดํ•˜๊ณ , ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด Claude Code์—์„œ ์Šคํฌ๋ฆฝํŠธ๋กœ ์–ด๋–ป๊ฒŒ ํ๋ฅด๋Š”์ง€ ์„ค๋ช…ํ•˜๋ฉฐ, ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ํ•„๋“œ๋ฅผ ๋‚˜์—ดํ•˜๊ณ , git ์ƒํƒœ, ๋น„์šฉ ์ถ”์  ๋ฐ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์— ๋Œ€ํ•œ ์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ ํ‘œ์‹œ์ค„ ์„ค์ •

/statusline ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ Claude Code๊ฐ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๊ฑฐ๋‚˜, ์ˆ˜๋™์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์„ค์ •์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

/statusline ๋ช…๋ น ์‚ฌ์šฉ

/statusline ๋ช…๋ น์€ ํ‘œ์‹œํ•˜๋ ค๋Š” ๋‚ด์šฉ์„ ์„ค๋ช…ํ•˜๋Š” ์ž์—ฐ์–ด ์ง€์‹œ์‚ฌํ•ญ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. Claude Code๋Š” ~/.claude/ ๋””๋ ‰ํ† ๋ฆฌ์— ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์„ค์ •์„ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค:

/statusline show model name and context percentage with a progress bar

์ƒํƒœ ํ‘œ์‹œ์ค„ ์ˆ˜๋™ ๊ตฌ์„ฑ

์‚ฌ์šฉ์ž ์„ค์ •(~/.claude/settings.json, ์—ฌ๊ธฐ์„œ ~๋Š” ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ) ๋˜๋Š” ํ”„๋กœ์ ํŠธ ์„ค์ •์— statusLine ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. type์„ "command"๋กœ ์„ค์ •ํ•˜๊ณ  command๋ฅผ ์Šคํฌ๋ฆฝํŠธ ๊ฒฝ๋กœ ๋˜๋Š” ์ธ๋ผ์ธ ์…ธ ๋ช…๋ น์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ „์ฒด ์„ค๋ช…์€ ์ƒํƒœ ํ‘œ์‹œ์ค„ ๋‹จ๊ณ„๋ณ„ ๊ตฌ์ถ•์„ ์ฐธ์กฐํ•˜์„ธ์š”.

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 2
  }
}

command ํ•„๋“œ๋Š” ์…ธ์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ๋Œ€์‹  ์ธ๋ผ์ธ ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋Š” jq๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JSON ์ž…๋ ฅ์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๊ณ  ๋ชจ๋ธ ์ด๋ฆ„๊ณผ ์ปจํ…์ŠคํŠธ ๋ฐฑ๋ถ„์œจ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค:

{
  "statusLine": {
    "type": "command",
    "command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'"
  }
}

์„ ํƒ์  padding ํ•„๋“œ๋Š” ์ƒํƒœ ํ‘œ์‹œ์ค„ ์ฝ˜ํ…์ธ ์— ์ถ”๊ฐ€ ์ˆ˜ํ‰ ๊ฐ„๊ฒฉ(๋ฌธ์ž ๋‹จ์œ„)์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ 0์ž…๋‹ˆ๋‹ค. ์ด ํŒจ๋”ฉ์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋ณธ ์ œ๊ณต ๊ฐ„๊ฒฉ์— ์ถ”๊ฐ€๋˜๋ฏ€๋กœ ํ„ฐ๋ฏธ๋„ ๊ฐ€์žฅ์ž๋ฆฌ๋กœ๋ถ€ํ„ฐ์˜ ์ ˆ๋Œ€ ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹Œ ์ƒ๋Œ€ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

์„ ํƒ์  refreshInterval ํ•„๋“œ๋Š” ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์—…๋ฐ์ดํŠธ์— ์ถ”๊ฐ€๋กœ N์ดˆ๋งˆ๋‹ค ๋ช…๋ น์„ ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œ๊ฐ’์€ 1์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ํ‘œ์‹œ์ค„์ด ์‹œ๊ณ„์™€ ๊ฐ™์€ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜ ์ฃผ ์„ธ์…˜์ด ์œ ํœด ์ƒํƒœ์ผ ๋•Œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋ธŒ์—์ด์ „ํŠธ๊ฐ€ git ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์ด๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ์—์„œ๋งŒ ์‹คํ–‰ํ•˜๋ ค๋ฉด ์„ค์ •ํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ๋‘์„ธ์š”.

์„ ํƒ์  hideVimModeIndicator ํ•„๋“œ๋Š” ํ”„๋กฌํ”„ํŠธ ์•„๋ž˜์˜ ๊ธฐ๋ณธ ์ œ๊ณต -- INSERT -- ํ…์ŠคํŠธ๋ฅผ ์ˆจ๊น๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ vim.mode ์ž์ฒด๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ์ด๋ฅผ true๋กœ ์„ค์ •ํ•˜์—ฌ ๋ชจ๋“œ๊ฐ€ ๋‘ ๋ฒˆ ํ‘œ์‹œ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ƒํƒœ ํ‘œ์‹œ์ค„ ๋น„ํ™œ์„ฑํ™”

/statusline์„ ์‹คํ–‰ํ•˜๊ณ  ์ƒํƒœ ํ‘œ์‹œ์ค„์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ์ง€์šฐ๋„๋ก ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: /statusline delete, /statusline clear, /statusline remove it). settings.json์—์„œ statusLine ํ•„๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒํƒœ ํ‘œ์‹œ์ค„ ๋‹จ๊ณ„๋ณ„ ๊ตฌ์ถ•

์ด ์„ค๋ช…์„œ๋Š” ํ˜„์žฌ ๋ชจ๋ธ, ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ์‚ฌ์šฉ๋Ÿ‰ ๋ฐฑ๋ถ„์œจ์„ ํ‘œ์‹œํ•˜๋Š” ์ƒํƒœ ํ‘œ์‹œ์ค„์„ ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“ค์–ด ๋‚ด๋ถ€ ๋™์ž‘์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ๋Š” macOS ๋ฐ Linux์—์„œ ์ž‘๋™ํ•˜๋Š” Bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Windows์—์„œ๋Š” Windows ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์—ฌ PowerShell ๋ฐ Git Bash ์˜ˆ์ œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

๋ชจ๋ธ ์ด๋ฆ„, ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ ์ปจํ…์ŠคํŠธ ๋ฐฑ๋ถ„์œจ์„ ํ‘œ์‹œํ•˜๋Š” ์ƒํƒœ ํ‘œ์‹œ์ค„
1

JSON์„ ์ฝ๊ณ  ์ถœ๋ ฅ์„ ์ธ์‡„ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ๋งŒ๋“ค๊ธฐ

Claude Code๋Š” stdin์„ ํ†ตํ•ด JSON ๋ฐ์ดํ„ฐ๋ฅผ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” jq(์„ค์น˜ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์ค„ JSON ํŒŒ์„œ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋ธ ์ด๋ฆ„, ๋””๋ ‰ํ† ๋ฆฌ ๋ฐ ์ปจํ…์ŠคํŠธ ๋ฐฑ๋ถ„์œจ์„ ์ถ”์ถœํ•œ ๋‹ค์Œ ํ˜•์‹์ด ์ง€์ •๋œ ์ค„์„ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ~/.claude/statusline.sh์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ~๋Š” ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์ด๋ฉฐ, macOS์—์„œ๋Š” /Users/username, Linux์—์„œ๋Š” /home/username):

#!/bin/bash
# Claude Code๊ฐ€ stdin์œผ๋กœ ๋ณด๋‚ด๋Š” JSON ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ
input=$(cat)

# jq๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„๋“œ ์ถ”์ถœ
MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
# "// 0"์€ ํ•„๋“œ๊ฐ€ null์ธ ๊ฒฝ์šฐ ํด๋ฐฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

# ์ƒํƒœ ํ‘œ์‹œ์ค„ ์ถœ๋ ฅ - ${DIR##*/}๋Š” ํด๋” ์ด๋ฆ„๋งŒ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค
echo "[$MODEL] ๐Ÿ“ ${DIR##*/} | ${PCT}% context"
2

์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ธฐ

์…ธ์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค:

chmod +x ~/.claude/statusline.sh
3

์„ค์ •์— ์ถ”๊ฐ€

Claude Code์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒํƒœ ํ‘œ์‹œ์ค„๋กœ ์‹คํ–‰ํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ตฌ์„ฑ์„ ~/.claude/settings.json์— ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” type์„ "command"๋กœ ์„ค์ •ํ•˜๊ณ (์˜๋ฏธ: "์ด ์…ธ ๋ช…๋ น ์‹คํ–‰") command๋ฅผ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค:

{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh"
}
}

์ƒํƒœ ํ‘œ์‹œ์ค„์ด ์ธํ„ฐํŽ˜์ด์Šค ํ•˜๋‹จ์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์„ค์ •์€ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋กœ๋“œ๋˜์ง€๋งŒ Claude Code์™€์˜ ๋‹ค์Œ ์ƒํ˜ธ ์ž‘์šฉ๊นŒ์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒํƒœ ํ‘œ์‹œ์ค„ ์ž‘๋™ ๋ฐฉ์‹

Claude Code๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  stdin์„ ํ†ตํ•ด JSON ์„ธ์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์ดํ”„ํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋Š” JSON์„ ์ฝ๊ณ  ํ•„์š”ํ•œ ๊ฒƒ์„ ์ถ”์ถœํ•œ ๋‹ค์Œ stdout์— ํ…์ŠคํŠธ๋ฅผ ์ธ์‡„ํ•ฉ๋‹ˆ๋‹ค. Claude Code๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ธ์‡„ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ ์‹œ๊ธฐ

์Šคํฌ๋ฆฝํŠธ๋Š” ์ƒˆ๋กœ์šด ์–ด์‹œ์Šคํ„ดํŠธ ๋ฉ”์‹œ์ง€ ํ›„, /compact ์™„๋ฃŒ ํ›„, ๊ถŒํ•œ ๋ชจ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋˜๋Š” vim ๋ชจ๋“œ๊ฐ€ ์ „ํ™˜๋  ๋•Œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์—…๋ฐ์ดํŠธ๋Š” 300ms์—์„œ ๋””๋ฐ”์šด์Šค๋˜๋ฏ€๋กœ ๋น ๋ฅธ ๋ณ€๊ฒฝ์ด ํ•จ๊ป˜ ์ผ๊ด„ ์ฒ˜๋ฆฌ๋˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋Š” ์ƒํ™ฉ์ด ์•ˆ์ •ํ™”๋˜๋ฉด ํ•œ ๋ฒˆ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์—ฌ์ „ํžˆ ์‹คํ–‰ ์ค‘์ธ ๋™์•ˆ ์ƒˆ ์—…๋ฐ์ดํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉด ์ง„ํ–‰ ์ค‘์ธ ์‹คํ–‰์ด ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํŽธ์ง‘ํ•˜๋ฉด Claude Code์™€์˜ ๋‹ค์Œ ์ƒํ˜ธ ์ž‘์šฉ์ด ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•  ๋•Œ๊นŒ์ง€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ํŠธ๋ฆฌ๊ฑฐ๋Š” ์ฃผ ์„ธ์…˜์ด ์œ ํœด ์ƒํƒœ์ผ ๋•Œ(์˜ˆ: ์ฝ”๋””๋„ค์ดํ„ฐ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋ธŒ์—์ด์ „ํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆด ๋•Œ) ์กฐ์šฉํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํœด ๊ธฐ๊ฐ„ ๋™์•ˆ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋˜๋Š” ์™ธ๋ถ€ ์†Œ์Šค ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ ค๋ฉด refreshInterval์„ ์„ค์ •ํ•˜์—ฌ ๊ณ ์ • ํƒ€์ด๋จธ์—์„œ๋„ ๋ช…๋ น์„ ๋‹ค์‹œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

ํ„ฐ๋ฏธ๋„์— ๋งž๊ฒŒ ์ถœ๋ ฅ ํฌ๊ธฐ ์กฐ์ •

Claude Code๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ์ถœ๋ ฅ์„ ์บก์ฒ˜ํ•˜๋ฏ€๋กœ ํ„ฐ๋ฏธ๋„์— ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์•„ ์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์—์„œ tput cols์™€ ์–ธ์–ด ์ˆ˜์ค€์˜ ๋„ˆ๋น„ ๊ฐ์ง€๊ฐ€ ํ„ฐ๋ฏธ๋„ ํฌ๊ธฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. {/* min-version: 2.1.153 */}COLUMNS ๋ฐ LINES ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋Œ€์‹  ์ฝ์œผ์„ธ์š”. Claude Code๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋ฅผ ํ˜„์žฌ ํ„ฐ๋ฏธ๋„ ํฌ๊ธฐ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Claude Code v2.1.153 ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฐ์ดํ„ฐ

Claude Code๋Š” stdin์„ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ์— ๋‹ค์Œ JSON ํ•„๋“œ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค:

ํ•„๋“œ ์„ค๋ช…
model.id, model.display_name ํ˜„์žฌ ๋ชจ๋ธ ์‹๋ณ„์ž ๋ฐ ํ‘œ์‹œ ์ด๋ฆ„
cwd, workspace.current_dir ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ. ๋‘ ํ•„๋“œ ๋ชจ๋‘ ๋™์ผํ•œ ๊ฐ’์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. workspace.current_dir์€ workspace.project_dir๊ณผ์˜ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค.
workspace.project_dir Claude Code๊ฐ€ ์‹œ์ž‘๋œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ, ์„ธ์…˜ ์ค‘์— ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด cwd์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
workspace.added_dirs /add-dir ๋˜๋Š” --add-dir์„ ํ†ตํ•ด ์ถ”๊ฐ€๋œ ์ถ”๊ฐ€ ๋””๋ ‰ํ† ๋ฆฌ. ์ถ”๊ฐ€๋œ ๊ฒƒ์ด ์—†์œผ๋ฉด ๋นˆ ๋ฐฐ์—ด
workspace.git_worktree git worktree add๋กœ ์ƒ์„ฑ๋œ ์—ฐ๊ฒฐ๋œ worktree ๋‚ด์— ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ์„ ๋•Œ Git worktree ์ด๋ฆ„. ์ฃผ ์ž‘์—… ํŠธ๋ฆฌ์—๋Š” ์—†์Šต๋‹ˆ๋‹ค. worktree.*์™€ ๋‹ฌ๋ฆฌ --worktree ์„ธ์…˜์—๋งŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ชจ๋“  git worktree์— ๋Œ€ํ•ด ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค
workspace.repo.host, workspace.repo.owner, workspace.repo.name origin ์›๊ฒฉ์—์„œ ํŒŒ์‹ฑ๋œ ์ €์žฅ์†Œ ์‹๋ณ„์ž(์˜ˆ: "github.com", "anthropics", "claude-code"). git ์ €์žฅ์†Œ ์™ธ๋ถ€์— ์žˆ๊ฑฐ๋‚˜ origin ์›๊ฒฉ์ด ๊ตฌ์„ฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—†์Œ
cost.total_cost_usd USD ๋‹จ์œ„์˜ ์ด ์„ธ์…˜ ๋น„์šฉ(ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๊ณ„์‚ฐ). ์‹ค์ œ ์ฒญ๊ตฌ์„œ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
cost.total_duration_ms ์„ธ์…˜ ์‹œ์ž‘ ์ดํ›„์˜ ์ด ๋ฒฝ์‹œ๊ณ„ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)
cost.total_api_duration_ms API ์‘๋‹ต ๋Œ€๊ธฐ์— ์†Œ๋น„๋œ ์ด ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)
cost.total_lines_added, cost.total_lines_removed ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ ์ค„
context_window.total_input_tokens, context_window.total_output_tokens ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ํ˜„์žฌ ์žˆ๋Š” ํ† ํฐ ์ˆ˜(๊ฐ€์žฅ ์ตœ๊ทผ API ์‘๋‹ต์—์„œ). ์ž…๋ ฅ์—๋Š” ์บ์‹œ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. v2.1.132 ์ด์ „์—๋Š” ๋ˆ„์  ์„ธ์…˜ ํ•ฉ๊ณ„์˜€์Šต๋‹ˆ๋‹ค
context_window.context_window_size ํ† ํฐ ๋‹จ์œ„์˜ ์ตœ๋Œ€ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ํฌ๊ธฐ. ๊ธฐ๋ณธ๊ฐ’์€ 200,000์ด๊ฑฐ๋‚˜ ํ™•์žฅ๋œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ 1,000,000์ž…๋‹ˆ๋‹ค.
context_window.used_percentage ์‚ฌ์šฉ๋œ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์˜ ์‚ฌ์ „ ๊ณ„์‚ฐ๋œ ๋ฐฑ๋ถ„์œจ
context_window.remaining_percentage ๋‚จ์€ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์˜ ์‚ฌ์ „ ๊ณ„์‚ฐ๋œ ๋ฐฑ๋ถ„์œจ
context_window.current_usage ๋งˆ์ง€๋ง‰ API ํ˜ธ์ถœ์˜ ํ† ํฐ ์ˆ˜(์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ํ•„๋“œ์— ์„ค๋ช…๋จ)
exceeds_200k_tokens ๊ฐ€์žฅ ์ตœ๊ทผ API ์‘๋‹ต์˜ ์ด ํ† ํฐ ์ˆ˜(์ž…๋ ฅ, ์บ์‹œ ๋ฐ ์ถœ๋ ฅ ํ† ํฐ ๊ฒฐํ•ฉ)๊ฐ€ 200k๋ฅผ ์ดˆ๊ณผํ•˜๋Š”์ง€ ์—ฌ๋ถ€. ์ด๋Š” ์‹ค์ œ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ํฌ๊ธฐ์™€ ๊ด€๊ณ„์—†์ด ๊ณ ์ •๋œ ์ž„๊ณ„๊ฐ’์ž…๋‹ˆ๋‹ค.
effort.level ํ˜„์žฌ ์ถ”๋ก  ๋…ธ๋ ฅ(low, medium, high, xhigh ๋˜๋Š” max). ๋ผ์ด๋ธŒ ์„ธ์…˜ ๊ฐ’์„ ๋ฐ˜์˜ํ•˜๋ฉฐ, ์ค‘๊ฐ„ ์„ธ์…˜ /effort ๋ณ€๊ฒฝ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. Ultracode๋Š” ๋ณ„๊ฐœ์˜ ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ฉฐ xhigh๋กœ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ชจ๋ธ์ด ๋…ธ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” ์—†์Šต๋‹ˆ๋‹ค
thinking.enabled ์„ธ์…˜์— ๋Œ€ํ•ด ํ™•์žฅ๋œ ์‚ฌ๊ณ ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€
rate_limits.five_hour.used_percentage, rate_limits.seven_day.used_percentage 5์‹œ๊ฐ„ ๋˜๋Š” 7์ผ ์†๋„ ์ œํ•œ์˜ ์†Œ๋น„๋œ ๋ฐฑ๋ถ„์œจ(0~100)
rate_limits.five_hour.resets_at, rate_limits.seven_day.resets_at 5์‹œ๊ฐ„ ๋˜๋Š” 7์ผ ์†๋„ ์ œํ•œ ์œˆ๋„์šฐ๊ฐ€ ์žฌ์„ค์ •๋˜๋Š” Unix epoch ์ดˆ
session_id ๊ณ ์œ  ์„ธ์…˜ ์‹๋ณ„์ž
session_name --name ํ”Œ๋ž˜๊ทธ ๋˜๋Š” /rename์œผ๋กœ ์„ค์ •๋œ ์‚ฌ์šฉ์ž ์ •์˜ ์„ธ์…˜ ์ด๋ฆ„. ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฆ„์ด ์„ค์ •๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—†์Œ
transcript_path ๋Œ€ํ™” ๊ธฐ๋ก ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
version Claude Code ๋ฒ„์ „
output_style.name ํ˜„์žฌ ์ถœ๋ ฅ ์Šคํƒ€์ผ์˜ ์ด๋ฆ„
vim.mode vim ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์„ ๋•Œ ํ˜„์žฌ vim ๋ชจ๋“œ(NORMAL, INSERT, VISUAL ๋˜๋Š” VISUAL LINE)
agent.name --agent ํ”Œ๋ž˜๊ทธ ๋˜๋Š” ์—์ด์ „ํŠธ ์„ค์ •์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„ ๋•Œ ์—์ด์ „ํŠธ ์ด๋ฆ„
pr.number, pr.url ํ˜„์žฌ ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•œ ์—ด๋ฆฐ ํ’€ ์š”์ฒญ. ํ•˜๋‹จ ์ƒํƒœ ํ‘œ์‹œ์ค„์˜ PR ๋ฐฐ์ง€๋ฅผ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. PR์„ ์ฐพ์„ ๋•Œ๊นŒ์ง€, git ์ €์žฅ์†Œ์— ์—†์„ ๋•Œ, ๋˜๋Š” PR์ด ๋ณ‘ํ•ฉ๋˜๊ฑฐ๋‚˜ ๋‹ซํžŒ ํ›„์—๋Š” ์—†์Œ
pr.review_state ์—ด๋ฆฐ PR์˜ ๊ฒ€ํ†  ์ƒํƒœ: approved, pending, changes_requested ๋˜๋Š” draft. pr์ด ์žˆ์„ ๋•Œ๋„ ๋…๋ฆฝ์ ์œผ๋กœ ์—†์„ ์ˆ˜ ์žˆ์Œ
worktree.name ํ™œ์„ฑ worktree์˜ ์ด๋ฆ„. --worktree ์„ธ์…˜ ์ค‘์—๋งŒ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค
worktree.path worktree ๋””๋ ‰ํ† ๋ฆฌ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ
worktree.branch worktree์˜ Git ๋ธŒ๋žœ์น˜ ์ด๋ฆ„(์˜ˆ: "worktree-my-feature"). ํ›… ๊ธฐ๋ฐ˜ worktree์˜ ๊ฒฝ์šฐ ์—†์Œ
worktree.original_cwd worktree์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— Claude๊ฐ€ ์žˆ๋˜ ๋””๋ ‰ํ† ๋ฆฌ
worktree.original_branch worktree์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์ฒดํฌ์•„์›ƒ๋œ Git ๋ธŒ๋žœ์น˜. ํ›… ๊ธฐ๋ฐ˜ worktree์˜ ๊ฒฝ์šฐ ์—†์Œ
์ „์ฒด JSON ์Šคํ‚ค๋งˆ

์ƒํƒœ ํ‘œ์‹œ์ค„ ๋ช…๋ น์€ stdin์„ ํ†ตํ•ด ์ด JSON ๊ตฌ์กฐ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค:

{
"cwd": "/current/working/directory",
"session_id": "abc123...",
"session_name": "my-session",
"transcript_path": "/path/to/transcript.jsonl",
"model": {
"id": "claude-opus-4-8",
"display_name": "Opus"
},
"workspace": {
"current_dir": "/current/working/directory",
"project_dir": "/original/project/directory",
"added_dirs": [],
"git_worktree": "feature-xyz",
"repo": {
"host": "github.com",
"owner": "anthropics",
"name": "claude-code"
}
},
"version": "2.1.90",
"output_style": {
"name": "default"
},
"cost": {
"total_cost_usd": 0.01234,
"total_duration_ms": 45000,
"total_api_duration_ms": 2300,
"total_lines_added": 156,
"total_lines_removed": 23
},
"context_window": {
"total_input_tokens": 15500,
"total_output_tokens": 1200,
"context_window_size": 200000,
"used_percentage": 8,
"remaining_percentage": 92,
"current_usage": {
"input_tokens": 8500,
"output_tokens": 1200,
"cache_creation_input_tokens": 5000,
"cache_read_input_tokens": 2000
}
},
"exceeds_200k_tokens": false,
"effort": {
"level": "high"
},
"thinking": {
"enabled": true
},
"rate_limits": {
"five_hour": {
"used_percentage": 23.5,
"resets_at": 1738425600
},
"seven_day": {
"used_percentage": 41.2,
"resets_at": 1738857600
}
},
"vim": {
"mode": "NORMAL"
},
"agent": {
"name": "security-reviewer"
},
"pr": {
"number": 1234,
"url": "https://github.com/anthropics/claude-code/pull/1234",
"review_state": "pending"
},
"worktree": {
"name": "my-feature",
"path": "/path/to/.claude/worktrees/my-feature",
"branch": "worktree-my-feature",
"original_cwd": "/path/to/project",
"original_branch": "main"
}
}

์—†์„ ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ (JSON์— ์—†์Œ):

  • session_name: --name ๋˜๋Š” /rename์œผ๋กœ ์‚ฌ์šฉ์ž ์ •์˜ ์ด๋ฆ„์ด ์„ค์ •๋˜์—ˆ์„ ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚จ
  • workspace.git_worktree: ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์—ฐ๊ฒฐ๋œ git worktree ๋‚ด์— ์žˆ์„ ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚จ
  • workspace.repo: git ์ €์žฅ์†Œ ๋‚ด์— ์žˆ๊ณ  origin ์›๊ฒฉ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„ ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚จ
  • effort: ํ˜„์žฌ ๋ชจ๋ธ์ด ์ถ”๋ก  ๋…ธ๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•  ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚จ
  • vim: vim ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์„ ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚จ
  • agent: --agent ํ”Œ๋ž˜๊ทธ ๋˜๋Š” ์—์ด์ „ํŠธ ์„ค์ •์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์„ ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚จ
  • pr: ํ˜„์žฌ ๋ธŒ๋žœ์น˜์— ๋Œ€ํ•ด ์—ด๋ฆฐ PR์„ ์ฐพ์•˜์„ ๋•Œ๋งŒ ๋‚˜ํƒ€๋‚˜๋ฉฐ, PR์ด ๋ณ‘ํ•ฉ๋˜๊ฑฐ๋‚˜ ๋‹ซํžˆ๋ฉด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. pr.review_state๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • worktree: --worktree ์„ธ์…˜ ์ค‘์—๋งŒ ๋‚˜ํƒ€๋‚จ. ์กด์žฌํ•  ๋•Œ branch ๋ฐ original_branch๋„ ํ›… ๊ธฐ๋ฐ˜ worktree์˜ ๊ฒฝ์šฐ ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • rate_limits: Claude.ai ๊ตฌ๋…์ž(Pro/Max)์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ API ์‘๋‹ต ํ›„์—๋งŒ ๋‚˜ํƒ€๋‚จ. ๊ฐ ์œˆ๋„์šฐ(five_hour, seven_day)๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€์žฌ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด jq -r '.rate_limits.five_hour.used_percentage // empty'๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

null์ผ ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ:

  • context_window.current_usage: ์„ธ์…˜์˜ ์ฒซ ๋ฒˆ์งธ API ํ˜ธ์ถœ ์ „์— null์ด๊ณ , /compact ํ›„์— ๋‹ค์‹œ null์ด ๋˜์—ˆ๋‹ค๊ฐ€ ๋‹ค์Œ API ํ˜ธ์ถœ์ด ์ด๋ฅผ ๋‹ค์‹œ ์ฑ„์šธ ๋•Œ๊นŒ์ง€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค
  • context_window.used_percentage, context_window.remaining_percentage: ์„ธ์…˜ ์ดˆ๊ธฐ์— null์ผ ์ˆ˜ ์žˆ์Œ

์Šคํฌ๋ฆฝํŠธ์—์„œ ์กฐ๊ฑด๋ถ€ ์•ก์„ธ์Šค๋กœ ๋ˆ„๋ฝ๋œ ํ•„๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  null ๊ฐ’์„ ํด๋ฐฑ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ํ•„๋“œ

context_window ๊ฐ์ฒด๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ API ์‘๋‹ต์˜ ๋ผ์ด๋ธŒ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. v2.1.132๋ถ€ํ„ฐ total_input_tokens ๋ฐ total_output_tokens๋Š” ๋ˆ„์  ์„ธ์…˜ ํ•ฉ๊ณ„๊ฐ€ ์•„๋‹Œ ํ˜„์žฌ ์ปจํ…์ŠคํŠธ ์‚ฌ์šฉ๋Ÿ‰์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฒฐํ•ฉ๋œ ํ•ฉ๊ณ„ (total_input_tokens, total_output_tokens): ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ์— ํ˜„์žฌ ์žˆ๋Š” ํ† ํฐ. total_input_tokens๋Š” input_tokens, cache_creation_input_tokens ๋ฐ cache_read_input_tokens์˜ ํ•ฉ๊ณ„์ž…๋‹ˆ๋‹ค. total_output_tokens๋Š” ๊ฐ€์žฅ ์ตœ๊ทผ ์‘๋‹ต์˜ ์ถœ๋ ฅ ํ† ํฐ์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ์ฒซ ๋ฒˆ์งธ API ์‘๋‹ต ์ „์—๋Š” 0์ž…๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ ์š”์†Œ๋ณ„ ์‚ฌ์šฉ๋Ÿ‰ (current_usage): ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๋ถ„๋ฅ˜๋œ ๋™์ผํ•œ ํ† ํฐ ์ˆ˜. ์บ์‹œ ํžˆํŠธ๋ฅผ ์ƒˆ๋กœ์šด ์ž…๋ ฅ๊ณผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•  ๋•Œ ์ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

current_usage ๊ฐ์ฒด์—๋Š” ๋‹ค์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค:

  • input_tokens: ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์˜ ์ž…๋ ฅ ํ† ํฐ
  • output_tokens: ์ƒ์„ฑ๋œ ์ถœ๋ ฅ ํ† ํฐ
  • cache_creation_input_tokens: ์บ์‹œ์— ๊ธฐ๋ก๋œ ํ† ํฐ
  • cache_read_input_tokens: ์บ์‹œ์—์„œ ์ฝ์€ ํ† ํฐ

์บ์‹œ ํ•„๋“œ์˜ ์˜๋ฏธ์™€ ์ฒญ๊ตฌ ๋ฐฉ์‹์— ๋Œ€ํ•ด์„œ๋Š” ์บ์‹œ ์„ฑ๋Šฅ ํ™•์ธ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

used_percentage ํ•„๋“œ๋Š” ์ž…๋ ฅ ํ† ํฐ๋งŒ์œผ๋กœ ๊ณ„์‚ฐ๋ฉ๋‹ˆ๋‹ค: input_tokens + cache_creation_input_tokens + cache_read_input_tokens. output_tokens๋Š” ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

current_usage์—์„œ ์ปจํ…์ŠคํŠธ ๋ฐฑ๋ถ„์œจ์„ ์ˆ˜๋™์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ ๋™์ผํ•œ ์ž…๋ ฅ ์ „์šฉ ๊ณต์‹์„ ์‚ฌ์šฉํ•˜์—ฌ used_percentage์™€ ์ผ์น˜์‹œํ‚ต๋‹ˆ๋‹ค.

current_usage ๊ฐ์ฒด๋Š” ์„ธ์…˜์˜ ์ฒซ ๋ฒˆ์งธ API ํ˜ธ์ถœ ์ „์— null์ด๊ณ , /compact ์งํ›„์— ๋‹ค์‹œ null์ด ๋˜์—ˆ๋‹ค๊ฐ€ ๋‹ค์Œ API ํ˜ธ์ถœ์ด ์ด๋ฅผ ๋‹ค์‹œ ์ฑ„์šธ ๋•Œ๊นŒ์ง€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ

์ด ์˜ˆ์ œ๋Š” ์ผ๋ฐ˜์ ์ธ ์ƒํƒœ ํ‘œ์‹œ์ค„ ํŒจํ„ด์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์˜ˆ์ œ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด:

  1. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ~/.claude/statusline.sh(๋˜๋Š” .py/.js)์™€ ๊ฐ™์€ ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค
  2. ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค: chmod +x ~/.claude/statusline.sh
  3. ์„ค์ •์— ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค

Bash ์˜ˆ์ œ๋Š” jq๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JSON์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. Python ๋ฐ Node.js๋Š” ๊ธฐ๋ณธ ์ œ๊ณต JSON ๊ตฌ๋ฌธ ๋ถ„์„์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ์‚ฌ์šฉ๋Ÿ‰

ํ˜„์žฌ ๋ชจ๋ธ๊ณผ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ ์‚ฌ์šฉ๋Ÿ‰์„ ์‹œ๊ฐ์  ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„๊ณผ ํ•จ๊ป˜ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šคํฌ๋ฆฝํŠธ๋Š” stdin์—์„œ JSON์„ ์ฝ๊ณ , used_percentage ํ•„๋“œ๋ฅผ ์ถ”์ถœํ•˜๊ณ , ์ฑ„์›Œ์ง„ ๋ธ”๋ก(โ–“)์ด ์‚ฌ์šฉ๋Ÿ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” 10์ž ๋ง‰๋Œ€๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค:

๋ชจ๋ธ ์ด๋ฆ„๊ณผ ๋ฐฑ๋ถ„์œจ์ด ์žˆ๋Š” ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„์„ ํ‘œ์‹œํ•˜๋Š” ์ƒํƒœ ํ‘œ์‹œ์ค„
#!/bin/bash
# stdin์˜ ๋ชจ๋“  ๋‚ด์šฉ์„ ๋ณ€์ˆ˜๋กœ ์ฝ๊ธฐ
input=$(cat)

# jq๋กœ ํ•„๋“œ ์ถ”์ถœ, "// 0"์€ null์— ๋Œ€ํ•œ ํด๋ฐฑ ์ œ๊ณต
MODEL=$(echo "$input" | jq -r '.model.display_name')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)

# ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„ ๊ตฌ์ถ•: printf -v๋Š” ๊ณต๋ฐฑ์„ ๋งŒ๋“ค๊ณ ,
# ${var// /โ–“}๋Š” ๊ฐ ๊ณต๋ฐฑ์„ ๋ธ”๋ก ๋ฌธ์ž๋กœ ๋ฐ”๊ฟˆ
BAR_WIDTH=10
FILLED=$((PCT * BAR_WIDTH / 100))
EMPTY=$((BAR_WIDTH - FILLED))
BAR=""
[ "$FILLED" -gt 0 ] && printf -v FILL "%${FILLED}s" && BAR="${FILL// /โ–“}"
[ "$EMPTY" -gt 0 ] && printf -v PAD "%${EMPTY}s" && BAR="${BAR}${PAD// /โ–‘}"

echo "[$MODEL] $BAR $PCT%"

์ƒ‰์ƒ์ด ์žˆ๋Š” git ์ƒํƒœ

์ƒ‰์ƒ์œผ๋กœ ๊ตฌ๋ถ„๋œ ์Šคํ…Œ์ด์ง• ๋ฐ ์ˆ˜์ •๋œ ํŒŒ์ผ ํ‘œ์‹œ๊ธฐ๊ฐ€ ์žˆ๋Š” git ๋ธŒ๋žœ์น˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ํ„ฐ๋ฏธ๋„ ์ƒ‰์ƒ์— ANSI ์ด์Šค์ผ€์ดํ”„ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค: \033[32m์€ ๋…น์ƒ‰, \033[33m์€ ๋…ธ๋ž€์ƒ‰, \033[0m์€ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ, ๋””๋ ‰ํ† ๋ฆฌ, git ๋ธŒ๋žœ์น˜ ๋ฐ ์Šคํ…Œ์ด์ง• ๋ฐ ์ˆ˜์ •๋œ ํŒŒ์ผ์— ๋Œ€ํ•œ ์ƒ‰์ƒ ํ‘œ์‹œ๊ธฐ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ƒํƒœ ํ‘œ์‹œ์ค„

๊ฐ ์Šคํฌ๋ฆฝํŠธ๋Š” ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ git ์ €์žฅ์†Œ์ธ์ง€ ํ™•์ธํ•˜๊ณ , ์Šคํ…Œ์ด์ง• ๋ฐ ์ˆ˜์ •๋œ ํŒŒ์ผ์„ ๊ณ„์‚ฐํ•˜๊ณ , ์ƒ‰์ƒ์œผ๋กœ ๊ตฌ๋ถ„๋œ ํ‘œ์‹œ๊ธฐ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค:

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')

GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'

if git rev-parse --git-dir > /dev/null 2>&1; then
BRANCH=$(git branch --show-current 2>/dev/null)
STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')

GIT_STATUS=""
[ "$STAGED" -gt 0 ] && GIT_STATUS="${GREEN}+${STAGED}${RESET}"
[ "$MODIFIED" -gt 0 ] && GIT_STATUS="${GIT_STATUS}${YELLOW}~${MODIFIED}${RESET}"

echo -e "[$MODEL] ๐Ÿ“ ${DIR##*/} | ๐ŸŒฟ $BRANCH $GIT_STATUS"
else
echo "[$MODEL] ๐Ÿ“ ${DIR##*/}"
fi

๋น„์šฉ ๋ฐ ๊ธฐ๊ฐ„ ์ถ”์ 

์„ธ์…˜์˜ API ๋น„์šฉ ๋ฐ ๊ฒฝ๊ณผ ์‹œ๊ฐ„์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค. cost.total_cost_usd ํ•„๋“œ๋Š” ํ˜„์žฌ ์„ธ์…˜์˜ ๋ชจ๋“  API ํ˜ธ์ถœ ๋น„์šฉ์„ ๋ˆ„์ ํ•ฉ๋‹ˆ๋‹ค. cost.total_duration_ms ํ•„๋“œ๋Š” ์„ธ์…˜ ์‹œ์ž‘ ์ดํ›„์˜ ์ด ๊ฒฝ๊ณผ ์‹œ๊ฐ„์„ ์ธก์ •ํ•˜๋Š” ๋ฐ˜๋ฉด, cost.total_api_duration_ms๋Š” API ์‘๋‹ต ๋Œ€๊ธฐ์— ์†Œ๋น„๋œ ์‹œ๊ฐ„๋งŒ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋น„์šฉ์„ ํ†ตํ™”๋กœ ํ˜•์‹ํ™”ํ•˜๊ณ  ๋ฐ€๋ฆฌ์ดˆ๋ฅผ ๋ถ„๊ณผ ์ดˆ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค:

๋ชจ๋ธ ์ด๋ฆ„, ์„ธ์…˜ ๋น„์šฉ ๋ฐ ๊ธฐ๊ฐ„์„ ํ‘œ์‹œํ•˜๋Š” ์ƒํƒœ ํ‘œ์‹œ์ค„
#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

COST_FMT=$(printf '$%.2f' "$COST")
DURATION_SEC=$((DURATION_MS / 1000))
MINS=$((DURATION_SEC / 60))
SECS=$((DURATION_SEC % 60))

echo "[$MODEL] ๐Ÿ’ฐ $COST_FMT | โฑ๏ธ ${MINS}m ${SECS}s"

์—ฌ๋Ÿฌ ์ค„ ํ‘œ์‹œ

์Šคํฌ๋ฆฝํŠธ๋Š” ์—ฌ๋Ÿฌ ์ค„์„ ์ถœ๋ ฅํ•˜์—ฌ ๋” ํ’๋ถ€ํ•œ ๋””์Šคํ”Œ๋ ˆ์ด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ echo ๋ฌธ์€ ์ƒํƒœ ์˜์—ญ์—์„œ ๋ณ„๋„์˜ ํ–‰์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ ์ค„์— ๋ชจ๋ธ ์ด๋ฆ„, ๋””๋ ‰ํ† ๋ฆฌ, git ๋ธŒ๋žœ์น˜๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ๋‘ ๋ฒˆ์งธ ์ค„์— ์ปจํ…์ŠคํŠธ ์‚ฌ์šฉ๋Ÿ‰ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„, ๋น„์šฉ ๋ฐ ๊ธฐ๊ฐ„์„ ํ‘œ์‹œํ•˜๋Š” ๋‹ค์ค‘ ์ค„ ์ƒํƒœ ํ‘œ์‹œ์ค„

์ด ์˜ˆ์ œ๋Š” ์—ฌ๋Ÿฌ ๊ธฐ๋ฒ•์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค: ์ž„๊ณ„๊ฐ’ ๊ธฐ๋ฐ˜ ์ƒ‰์ƒ(70% ๋ฏธ๋งŒ์ผ ๋•Œ ๋…น์ƒ‰, 70-89% ๋…ธ๋ž€์ƒ‰, 90%+ ๋นจ๊ฐ„์ƒ‰), ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„ ๋ฐ git ๋ธŒ๋žœ์น˜ ์ •๋ณด. ๊ฐ print ๋˜๋Š” echo ๋ฌธ์€ ๋ณ„๋„์˜ ํ–‰์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค:

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0')

CYAN='\033[36m'; GREEN='\033[32m'; YELLOW='\033[33m'; RED='\033[31m'; RESET='\033[0m'

# ์ปจํ…์ŠคํŠธ ์‚ฌ์šฉ๋Ÿ‰์— ๋”ฐ๋ผ ๋ง‰๋Œ€ ์ƒ‰์ƒ ์„ ํƒ
if [ "$PCT" -ge 90 ]; then BAR_COLOR="$RED"
elif [ "$PCT" -ge 70 ]; then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi

FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))
printf -v FILL "%${FILLED}s"; printf -v PAD "%${EMPTY}s"
BAR="${FILL// /โ–ˆ}${PAD// /โ–‘}"

MINS=$((DURATION_MS / 60000)); SECS=$(((DURATION_MS % 60000) / 1000))

BRANCH=""
git rev-parse --git-dir > /dev/null 2>&1 && BRANCH=" | ๐ŸŒฟ $(git branch --show-current 2>/dev/null)"

echo -e "${CYAN}[$MODEL]${RESET} ๐Ÿ“ ${DIR##*/}$BRANCH"
COST_FMT=$(printf '$%.2f' "$COST")
echo -e "${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${YELLOW}${COST_FMT}${RESET} | โฑ๏ธ ${MINS}m ${SECS}s"

์ด ์˜ˆ์ œ๋Š” GitHub ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ๋งํฌ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. git ์›๊ฒฉ URL์„ ์ฝ๊ณ , sed๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SSH ํ˜•์‹์„ HTTPS๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ €์žฅ์†Œ ์ด๋ฆ„์„ OSC 8 ์ด์Šค์ผ€์ดํ”„ ์ฝ”๋“œ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค. Cmd(macOS) ๋˜๋Š” Ctrl(Windows/Linux)์„ ๋ˆ„๋ฅด๊ณ  ํด๋ฆญํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋งํฌ๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

GitHub ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ๋งํฌ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ƒํƒœ ํ‘œ์‹œ์ค„

๊ฐ ์Šคํฌ๋ฆฝํŠธ๋Š” git ์›๊ฒฉ URL์„ ๊ฐ€์ ธ์˜ค๊ณ , SSH ํ˜•์‹์„ HTTPS๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์ €์žฅ์†Œ ์ด๋ฆ„์„ OSC 8 ์ด์Šค์ผ€์ดํ”„ ์ฝ”๋“œ๋กœ ๋ž˜ํ•‘ํ•ฉ๋‹ˆ๋‹ค. Bash ๋ฒ„์ „์€ printf '%b'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์…ธ์—์„œ ๋ฐฑ์Šฌ๋ž˜์‹œ ์ด์Šค์ผ€์ดํ”„๋ฅผ ๋” ์•ˆ์ •์ ์œผ๋กœ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค:

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')

# git SSH URL์„ HTTPS๋กœ ๋ณ€ํ™˜
REMOTE=$(git remote get-url origin 2>/dev/null | sed 's/git@github.com:/https:\/\/github.com\//' | sed 's/\.git$//')

if [ -n "$REMOTE" ]; then
REPO_NAME=$(basename "$REMOTE")
# OSC 8 ํ˜•์‹: \e]8;;URL\a then TEXT then \e]8;;\a
# printf %b๋Š” ์…ธ ์ „์ฒด์—์„œ ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค
printf '%b' "[$MODEL] ๐Ÿ”— \e]8;;${REMOTE}\a${REPO_NAME}\e]8;;\a\n"
else
echo "[$MODEL]"
fi

์†๋„ ์ œํ•œ ์‚ฌ์šฉ๋Ÿ‰

Claude.ai ๊ตฌ๋… ์†๋„ ์ œํ•œ ์‚ฌ์šฉ๋Ÿ‰์„ ์ƒํƒœ ํ‘œ์‹œ์ค„์— ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. rate_limits ๊ฐ์ฒด์—๋Š” five_hour(5์‹œ๊ฐ„ ๋กค๋ง ์œˆ๋„์šฐ) ๋ฐ seven_day(์ฃผ๊ฐ„) ์œˆ๋„์šฐ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ์œˆ๋„์šฐ๋Š” used_percentage(0-100) ๋ฐ resets_at(์œˆ๋„์šฐ๊ฐ€ ์žฌ์„ค์ •๋˜๋Š” Unix epoch ์ดˆ)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด ํ•„๋“œ๋Š” Claude.ai ๊ตฌ๋…์ž(Pro/Max)์˜ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ API ์‘๋‹ต ํ›„์—๋งŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๊ฐ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ถ€์žฌํ•œ ํ•„๋“œ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค:

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
# "// empty"๋Š” rate_limits์ด ์—†์„ ๋•Œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
FIVE_H=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
WEEK=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')

LIMITS=""
[ -n "$FIVE_H" ] && LIMITS="5h: $(printf '%.0f' "$FIVE_H")%"
[ -n "$WEEK" ] && LIMITS="${LIMITS:+$LIMITS }7d: $(printf '%.0f' "$WEEK")%"

[ -n "$LIMITS" ] && echo "[$MODEL] | $LIMITS" || echo "[$MODEL]"

๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—… ์บ์‹ฑ

์ƒํƒœ ํ‘œ์‹œ์ค„ ์Šคํฌ๋ฆฝํŠธ๋Š” ํ™œ์„ฑ ์„ธ์…˜ ์ค‘์— ์ž์ฃผ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. git status ๋˜๋Š” git diff์™€ ๊ฐ™์€ ๋ช…๋ น์€ ํŠนํžˆ ํฐ ์ €์žฅ์†Œ์—์„œ ๋А๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ๋Š” git ์ •๋ณด๋ฅผ ์ž„์‹œ ํŒŒ์ผ์— ์บ์‹ฑํ•˜๊ณ  5์ดˆ๋งˆ๋‹ค๋งŒ ์ƒˆ๋กœ ๊ณ ์นฉ๋‹ˆ๋‹ค.

์บ์‹œ ํŒŒ์ผ ์ด๋ฆ„์€ ์„ธ์…˜ ๋‚ด ์ƒํƒœ ํ‘œ์‹œ์ค„ ํ˜ธ์ถœ ๊ฐ„์— ์•ˆ์ •์ ์ด์–ด์•ผ ํ•˜์ง€๋งŒ ๋™์‹œ ์„ธ์…˜์ด ์„œ๋กœ์˜ ์บ์‹œ๋œ git ์ƒํƒœ๋ฅผ ์ฝ์ง€ ์•Š๋„๋ก ์„ธ์…˜ ๊ฐ„์— ๊ณ ์œ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. $$, os.getpid() ๋˜๋Š” process.pid์™€ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๊ธฐ๋ฐ˜ ์‹๋ณ„์ž๋Š” ๋ชจ๋“  ํ˜ธ์ถœ์—์„œ ๋ณ€๊ฒฝ๋˜๊ณ  ์บ์‹œ๋ฅผ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  JSON ์ž…๋ ฅ์˜ session_id๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”: ์„ธ์…˜์˜ ์ˆ˜๋ช… ๋™์•ˆ ์•ˆ์ •์ ์ด๊ณ  ์„ธ์…˜๋‹น ๊ณ ์œ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์Šคํฌ๋ฆฝํŠธ๋Š” git ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์บ์‹œ ํŒŒ์ผ์ด ๋ˆ„๋ฝ๋˜์—ˆ๊ฑฐ๋‚˜ 5์ดˆ๋ณด๋‹ค ์˜ค๋ž˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค:

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
SESSION_ID=$(echo "$input" | jq -r '.session_id')

CACHE_FILE="/tmp/statusline-git-cache-$SESSION_ID"
CACHE_MAX_AGE=5  # seconds

cache_is_stale() {
[ ! -f "$CACHE_FILE" ] || \
# stat -f %m์€ macOS, stat -c %Y๋Š” Linux
[ $(($(date +%s) - $(stat -f %m "$CACHE_FILE" 2>/dev/null || stat -c %Y "$CACHE_FILE" 2>/dev/null || echo 0))) -gt $CACHE_MAX_AGE ]
}

if cache_is_stale; then
if git rev-parse --git-dir > /dev/null 2>&1; then
BRANCH=$(git branch --show-current 2>/dev/null)
STAGED=$(git diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
MODIFIED=$(git diff --numstat 2>/dev/null | wc -l | tr -d ' ')
echo "$BRANCH|$STAGED|$MODIFIED" > "$CACHE_FILE"
else
echo "||" > "$CACHE_FILE"
fi
fi

IFS='|' read -r BRANCH STAGED MODIFIED < "$CACHE_FILE"

if [ -n "$BRANCH" ]; then
echo "[$MODEL] ๐Ÿ“ ${DIR##*/} | ๐ŸŒฟ $BRANCH +$STAGED ~$MODIFIED"
else
echo "[$MODEL] ๐Ÿ“ ${DIR##*/}"
fi

Windows ๊ตฌ์„ฑ

Windows์—์„œ Claude Code๋Š” Git Bash๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์„ ๋•Œ Git Bash๋ฅผ ํ†ตํ•ด ์ƒํƒœ ํ‘œ์‹œ์ค„ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜, Git Bash๊ฐ€ ์—†์„ ๋•Œ PowerShell์„ ํ†ตํ•ด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Git Bash๋Š” ๋”ฐ์˜ดํ‘œ ์—†๋Š” ๋ฐฑ์Šฌ๋ž˜์‹œ๋ฅผ ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž๋กœ ์ทจ๊ธ‰ํ•˜๋ฏ€๋กœ, C:\Users\username\script.mjs์™€ ๊ฐ™์€ Windows ์Šคํƒ€์ผ ๊ฒฝ๋กœ๋Š” ๊ตฌ๋ถ„ ๊ธฐํ˜ธ๊ฐ€ ์ œ๊ฑฐ๋œ ์ƒํƒœ๋กœ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰๊ธฐ์— ๋„๋‹ฌํ•˜๊ณ  ๋ช…๋ น์ด ๋ณด์ด๋Š” ์˜ค๋ฅ˜ ์—†์ด ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. command ๋ฌธ์ž์—ด์— ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ •๋ฐฉํ–ฅ ์Šฌ๋ž˜์‹œ๋กœ ์ž‘์„ฑํ•˜์„ธ์š”(์•„๋ž˜ ์˜ˆ์ œ์— ํ‘œ์‹œ๋จ). ~ ์•ฝ์ž๋„ ์ž‘๋™ํ•˜๋ฉฐ Windows ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค.

PowerShell ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒํƒœ ํ‘œ์‹œ์ค„๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด powershell์„ ํ†ตํ•ด ํ˜ธ์ถœํ•˜์„ธ์š”. ์ด๋Š” Claude Code๊ฐ€ ๋ช…๋ น์„ Git Bash ๋˜๋Š” PowerShell์„ ํ†ตํ•ด ๋ผ์šฐํŒ…ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค:

{
"statusLine": {
"type": "command",
"command": "powershell -NoProfile -File C:/Users/username/.claude/statusline.ps1"
}
}

๋˜๋Š” Git Bash๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์„ ๋•Œ Bash ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh"
}
}

์„œ๋ธŒ์—์ด์ „ํŠธ ์ƒํƒœ ํ‘œ์‹œ์ค„

subagentStatusLine ์„ค์ •์€ ์„œ๋ธŒ์—์ด์ „ํŠธ ํŒจ๋„์— ํ‘œ์‹œ๋œ ๊ฐ ์„œ๋ธŒ์—์ด์ „ํŠธ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํ–‰ ๋ณธ๋ฌธ์„ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ name ยท description ยท token count ํ–‰์„ ์ž์‹ ์˜ ํ˜•์‹์œผ๋กœ ๋ฐ”๊พธ๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

{
  "subagentStatusLine": {
    "type": "command",
    "command": "~/.claude/subagent-statusline.sh"
  }
}

๋ช…๋ น์€ ์ƒˆ๋กœ ๊ณ ์นจ ํ‹ฑ๋งˆ๋‹ค ํ•œ ๋ฒˆ ์‹คํ–‰๋˜๋ฉฐ ๋ชจ๋“  ํ‘œ์‹œ ๊ฐ€๋Šฅํ•œ ์„œ๋ธŒ์—์ด์ „ํŠธ ํ–‰์ด stdin์˜ ๋‹จ์ผ JSON ๊ฐ์ฒด๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ์—๋Š” ๊ธฐ๋ณธ ํ›… ํ•„๋“œ์™€ columns(์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ–‰ ๋„ˆ๋น„) ๋ฐ tasks ๋ฐฐ์—ด์ด ํฌํ•จ๋˜๋ฉฐ, ๊ฐ ์ž‘์—…์—๋Š” id, name, type, status, description, label, startTime, tokenCount, tokenSamples ๋ฐ cwd๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์žฌ์ •์˜ํ•˜๋ ค๋Š” ๊ฐ ํ–‰์— ๋Œ€ํ•ด stdout์— ํ•œ ์ค„์˜ JSON์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค: {"id": "<task id>", "content": "<row body>"}. content ๋ฌธ์ž์—ด์€ ANSI ์ƒ‰์ƒ ๋ฐ OSC 8 ํ•˜์ดํผ๋งํฌ๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ทธ๋Œ€๋กœ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ์ž‘์—…์˜ id๋ฅผ ์ƒ๋žตํ•˜์—ฌ ํ•ด๋‹น ํ–‰์˜ ๊ธฐ๋ณธ ๋ Œ๋”๋ง์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋นˆ content ๋ฌธ์ž์—ด์„ ๋‚ด๋ณด๋‚ด ์ˆจ๊น๋‹ˆ๋‹ค.

statusLine์— ์ ์šฉ๋˜๋Š” ๋™์ผํ•œ ์‹ ๋ขฐ ๋ฐ disableAllHooks ๊ฒŒ์ดํŠธ๊ฐ€ ์—ฌ๊ธฐ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ settings.json์—์„œ ๊ธฐ๋ณธ subagentStatusLine์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŒ

  • ๋ชจ์˜ ์ž…๋ ฅ์œผ๋กœ ํ…Œ์ŠคํŠธ: echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/home/user/project"},"context_window":{"used_percentage":25},"session_id":"test-session-abc"}' | ./statusline.sh
  • ์ถœ๋ ฅ์„ ์งง๊ฒŒ ์œ ์ง€: ์ƒํƒœ ํ‘œ์‹œ์ค„์˜ ๋„ˆ๋น„๊ฐ€ ์ œํ•œ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ธด ์ถœ๋ ฅ์ด ์ž˜๋ฆฌ๊ฑฐ๋‚˜ ์–ด์ƒ‰ํ•˜๊ฒŒ ์ค„ ๋ฐ”๊ฟˆ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • ๋А๋ฆฐ ์ž‘์—… ์บ์‹ฑ: ์Šคํฌ๋ฆฝํŠธ๋Š” ํ™œ์„ฑ ์„ธ์…˜ ์ค‘์— ์ž์ฃผ ์‹คํ–‰๋˜๋ฏ€๋กœ git status์™€ ๊ฐ™์€ ๋ช…๋ น์ด ์ง€์—ฐ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์บ์‹ฑ ์˜ˆ์ œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ccstatusline ๋ฐ starship-claude์™€ ๊ฐ™์€ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”„๋กœ์ ํŠธ๋Š” ํ…Œ๋งˆ ๋ฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ์‚ฌ์ „ ๊ตฌ์ถ•๋œ ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ

์ƒํƒœ ํ‘œ์‹œ์ค„์ด ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์Œ

  • ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค: chmod +x ~/.claude/statusline.sh
  • ์Šคํฌ๋ฆฝํŠธ๊ฐ€ stderr๊ฐ€ ์•„๋‹Œ stdout์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
  • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
  • Git Bash๊ฐ€ ์„ค์น˜๋œ Windows์—์„œ๋Š” command ๊ฒฝ๋กœ์˜ ๋ฐฑ์Šฌ๋ž˜์‹œ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ „์— ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž๋กœ ์ฒ˜๋ฆฌ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ์—์„œ ์Šฌ๋ž˜์‹œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Windows ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค์ •์—์„œ disableAllHooks๊ฐ€ true๋กœ ์„ค์ •๋˜์–ด ์žˆ์œผ๋ฉด ์ƒํƒœ ํ‘œ์‹œ์ค„๋„ ๋น„ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์„ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ false๋กœ ์„ค์ •ํ•˜์—ฌ ๋‹ค์‹œ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • claude --debug๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์„ธ์…˜์˜ ์ฒซ ๋ฒˆ์งธ ์ƒํƒœ ํ‘œ์‹œ์ค„ ํ˜ธ์ถœ์—์„œ ์ข…๋ฃŒ ์ฝ”๋“œ ๋ฐ stderr๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค
  • Claude์— ์„ค์ • ํŒŒ์ผ์„ ์ฝ๊ณ  statusLine ๋ช…๋ น์„ ์ง์ ‘ ์‹คํ–‰ํ•˜๋„๋ก ์š”์ฒญํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค

์ƒํƒœ ํ‘œ์‹œ์ค„์ด -- ๋˜๋Š” ๋นˆ ๊ฐ’์„ ํ‘œ์‹œํ•จ

  • ํ•„๋“œ๋Š” ์ฒซ ๋ฒˆ์งธ API ์‘๋‹ต์ด ์™„๋ฃŒ๋˜๊ธฐ ์ „์— null์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • jq์˜ // 0๊ณผ ๊ฐ™์€ ํด๋ฐฑ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ์—์„œ null ๊ฐ’์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค
  • ์—ฌ๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ›„์—๋„ ๊ฐ’์ด ๋น„์–ด ์žˆ์œผ๋ฉด Claude Code๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค

์ปจํ…์ŠคํŠธ ๋ฐฑ๋ถ„์œจ์ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฐ’์„ ํ‘œ์‹œํ•จ

  • ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์ •ํ™•ํ•œ ์ปจํ…์ŠคํŠธ ์ƒํƒœ๋ฅผ ์œ„ํ•ด used_percentage๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค
  • ๊ฐ๊ฐ์ด ๊ณ„์‚ฐ๋˜๋Š” ์‹œ๊ธฐ๋กœ ์ธํ•ด ์ปจํ…์ŠคํŠธ ๋ฐฑ๋ถ„์œจ์ด /context ์ถœ๋ ฅ๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

OSC 8 ๋งํฌ๋ฅผ ํด๋ฆญํ•  ์ˆ˜ ์—†์Œ

  • ํ„ฐ๋ฏธ๋„์ด OSC 8 ํ•˜์ดํผ๋งํฌ๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค(iTerm2, Kitty, WezTerm)

  • Terminal.app์€ ํด๋ฆญ ๊ฐ€๋Šฅํ•œ ๋งํฌ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค

  • ๋งํฌ ํ…์ŠคํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€๋งŒ ํด๋ฆญํ•  ์ˆ˜ ์—†์œผ๋ฉด Claude Code๊ฐ€ ํ„ฐ๋ฏธ๋„์—์„œ ํ•˜์ดํผ๋งํฌ ์ง€์›์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ž๋™ ๊ฐ์ง€ ๋ชฉ๋ก์— ์—†๋Š” Windows Terminal ๋ฐ ๊ธฐํƒ€ ์—๋ฎฌ๋ ˆ์ดํ„ฐ์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. Claude Code๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— FORCE_HYPERLINK ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜์—ฌ ๊ฐ์ง€๋ฅผ ์žฌ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:

    FORCE_HYPERLINK=1 claude
    

    PowerShell์—์„œ๋Š” ๋จผ์ € ํ˜„์žฌ ์„ธ์…˜์—์„œ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค:

    $env:FORCE_HYPERLINK = "1"; claude
    
  • SSH ๋ฐ tmux ์„ธ์…˜์€ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ OSC ์‹œํ€€์Šค๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

  • \e]8;;๊ณผ ๊ฐ™์€ ๋ฆฌํ„ฐ๋Ÿด ํ…์ŠคํŠธ๋กœ ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด echo -e ๋Œ€์‹  printf '%b'๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์•ˆ์ •์ ์ธ ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค

์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค๋กœ ์ธํ•œ ๋””์Šคํ”Œ๋ ˆ์ด ๊ฒฐํ•จ

  • ๋ณต์žกํ•œ ์ด์Šค์ผ€์ดํ”„ ์‹œํ€€์Šค(ANSI ์ƒ‰์ƒ, OSC 8 ๋งํฌ)๋Š” ๋‹ค๋ฅธ UI ์—…๋ฐ์ดํŠธ์™€ ๊ฒน์น˜๋ฉด ๊ฐ€๋” ์†์ƒ๋œ ์ถœ๋ ฅ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • ์†์ƒ๋œ ํ…์ŠคํŠธ๊ฐ€ ๋ณด์ด๋ฉด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์ถœ๋ ฅ์œผ๋กœ ๋‹จ์ˆœํ™”ํ•ด ๋ด…๋‹ˆ๋‹ค
  • ์ด์Šค์ผ€์ดํ”„ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๋‹ค์ค‘ ์ค„ ์ƒํƒœ ํ‘œ์‹œ์ค„์€ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ๋‹จ์ผ ์ค„๋ณด๋‹ค ๋ Œ๋”๋ง ๋ฌธ์ œ๊ฐ€ ๋” ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค

์›Œํฌ์ŠคํŽ˜์ด์Šค ์‹ ๋ขฐ ํ•„์š”

  • ์ƒํƒœ ํ‘œ์‹œ์ค„ ๋ช…๋ น์€ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์— ๋Œ€ํ•œ ์›Œํฌ์ŠคํŽ˜์ด์Šค ์‹ ๋ขฐ ๋Œ€ํ™”๋ฅผ ์ˆ˜๋ฝํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. statusLine์ด ์…ธ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฏ€๋กœ ํ›… ๋ฐ ๊ธฐํƒ€ ์…ธ ์‹คํ–‰ ์„ค์ •๊ณผ ๋™์ผํ•œ ์‹ ๋ขฐ ์ˆ˜๋ฝ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ ๋ขฐ๊ฐ€ ์ˆ˜๋ฝ๋˜์ง€ ์•Š์œผ๋ฉด ์ƒํƒœ ํ‘œ์‹œ์ค„ ์ถœ๋ ฅ ๋Œ€์‹  statusline skipped ยท restart to fix ์•Œ๋ฆผ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Claude Code๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ณ  ์‹ ๋ขฐ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ˆ˜๋ฝํ•˜์—ฌ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ ์˜ค๋ฅ˜ ๋˜๋Š” ์ค‘๋‹จ

  • 0์ด ์•„๋‹Œ ์ฝ”๋“œ๋กœ ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š” ์Šคํฌ๋ฆฝํŠธ๋Š” ์ƒํƒœ ํ‘œ์‹œ์ค„์„ ๊ณต๋ฐฑ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค
  • ๋А๋ฆฐ ์Šคํฌ๋ฆฝํŠธ๋Š” ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ์ƒํƒœ ํ‘œ์‹œ์ค„์ด ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š๋„๋ก ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ ์ถœ๋ ฅ์„ ํ”ผํ•˜๋ ค๋ฉด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค
  • ๋А๋ฆฐ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ๋™์•ˆ ์ƒˆ ์—…๋ฐ์ดํŠธ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉด ์ง„ํ–‰ ์ค‘์ธ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค
  • ๊ตฌ์„ฑํ•˜๊ธฐ ์ „์— ๋ชจ์˜ ์ž…๋ ฅ์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค

์•Œ๋ฆผ์ด ์ƒํƒœ ํ‘œ์‹œ์ค„ ํ–‰์„ ๊ณต์œ ํ•จ

  • MCP ์„œ๋ฒ„ ์˜ค๋ฅ˜ ๋ฐ ์ž๋™ ์—…๋ฐ์ดํŠธ์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ ์•Œ๋ฆผ์€ ์ƒํƒœ ํ‘œ์‹œ์ค„๊ณผ ๋™์ผํ•œ ํ–‰์˜ ์˜ค๋ฅธ์ชฝ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ ๋ถ€์กฑ ๊ฒฝ๊ณ ์™€ ๊ฐ™์€ ์ผ์‹œ์  ์•Œ๋ฆผ๋„ ์ด ์˜์—ญ์„ ์ˆœํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž์„ธํ•œ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ด ์˜์—ญ์— ํ† ํฐ ์นด์šดํ„ฐ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค
  • ์ข์€ ํ„ฐ๋ฏธ๋„์—์„œ ์ด๋Ÿฌํ•œ ์•Œ๋ฆผ์ด ์ƒํƒœ ํ‘œ์‹œ์ค„ ์ถœ๋ ฅ์„ ์ž๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค