Skip to content

Latest commit

ย 

History

History
658 lines (558 loc) ยท 39.6 KB

File metadata and controls

658 lines (558 loc) ยท 39.6 KB

Claude Code ์•„ํ‚คํ…์ฒ˜ ํ•™์Šต ๋ฐ ์—ฐ๊ตฌ

์†Œ๊ฐœ: ์ด ํ”„๋กœ์ ํŠธ๋Š” CLI Agent ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ํ•™์Šต ๋ฐ ์—ฐ๊ตฌ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ์ž๋ฃŒ๋Š” ์ „์ ์œผ๋กœ ์ธํ„ฐ๋„ท์— ๊ณต๊ฐœ๋œ ์ •๋ณด์™€ ํ† ๋ก ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ •๋ฆฌ๋˜์—ˆ์œผ๋ฉฐ, ํŠนํžˆ ํ˜„์žฌ ๋งค์šฐ ์ธ๊ธฐ ์žˆ๋Š” CLI Agent์ธ claude-code์™€ ๊ด€๋ จ๋œ ๊ณต๊ฐœ ์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ์˜ ๋ชฉ์ ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด Agent ๊ธฐ์ˆ ์„ ๋” ์ž˜ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ž์œผ๋กœ๋„ Agent ์•„ํ‚คํ…์ฒ˜์™€ ๊ด€๋ จ๋œ ๋” ๋งŽ์€ ํ†ต์ฐฐ๊ณผ ์‹ค์šฉ์ ์ธ ํ† ๋ก  ์ฝ˜ํ…์ธ ๋ฅผ ์ง€์†์ ์œผ๋กœ ๊ณต์œ ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ด€์‹ฌ๊ณผ ์„ฑ์›์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

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

์–ธ์–ด: English | ไธญๆ–‡ | ํ•œ๊ตญ์–ด | ๆ—ฅๆœฌ่ชž


๋„๊ตฌ ์‹œ์Šคํ…œ ๋ฐ ๊ถŒํ•œ ์•„ํ‚คํ…์ฒ˜

                    ๋„๊ตฌ ์ธํ„ฐํŽ˜์ด์Šค
                    ==============

    buildTool(definition) โ”€โ”€> Tool<Input, Output, Progress>

    ๋ชจ๋“  ๋„๊ตฌ๋Š” ๋‹ค์Œ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค:
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  ์ˆ˜๋ช…์ฃผ๊ธฐ (LIFECYCLE)                                  โ”‚
    โ”‚  โ”œโ”€โ”€ validateInput()      โ†’ ์ž˜๋ชป๋œ ์ธ์ˆ˜ ์กฐ๊ธฐ ๊ฑฐ๋ถ€      โ”‚
    โ”‚  โ”œโ”€โ”€ checkPermissions()   โ†’ ๋„๊ตฌ๋ณ„ ๊ถŒํ•œ ๊ฒ€์‚ฌ           โ”‚
    โ”‚  โ””โ”€โ”€ call()               โ†’ ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜          โ”‚
    โ”‚                                                        โ”‚
    โ”‚  ๊ธฐ๋Šฅ (CAPABILITIES)                                   โ”‚
    โ”‚  โ”œโ”€โ”€ isEnabled()          โ†’ ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ํ™•์ธ           โ”‚
    โ”‚  โ”œโ”€โ”€ isConcurrencySafe()  โ†’ ๋ณ‘๋ ฌ ์‹คํ–‰ ๊ฐ€๋Šฅ ์—ฌ๋ถ€?       โ”‚
    โ”‚  โ”œโ”€โ”€ isReadOnly()         โ†’ ๋ถ€์ž‘์šฉ(side effects) ์—†์Œ? โ”‚
    โ”‚  โ”œโ”€โ”€ isDestructive()      โ†’ ๋˜๋Œ๋ฆด ์ˆ˜ ์—†๋Š” ์ž‘์—…?       โ”‚
    โ”‚  โ””โ”€โ”€ interruptBehavior()  โ†’ ์ทจ์†Œ ๋˜๋Š” ์‚ฌ์šฉ์ž ๋Œ€๊ธฐ?     โ”‚
    โ”‚                                                        โ”‚
    โ”‚  ๋ Œ๋”๋ง (RENDERING - React/Ink)                        โ”‚
    โ”‚  โ”œโ”€โ”€ renderToolUseMessage()     โ†’ ์ž…๋ ฅ ํ‘œ์‹œ            โ”‚
    โ”‚  โ”œโ”€โ”€ renderToolResultMessage()  โ†’ ์ถœ๋ ฅ ํ‘œ์‹œ            โ”‚
    โ”‚  โ”œโ”€โ”€ renderToolUseProgressMessage() โ†’ ์Šคํ”ผ๋„ˆ/์ƒํƒœ ํ‘œ์‹œ โ”‚
    โ”‚  โ””โ”€โ”€ renderGroupedToolUse()     โ†’ ๋ณ‘๋ ฌ ๋„๊ตฌ ๊ทธ๋ฃน ํ‘œ์‹œ  โ”‚
    โ”‚                                                        โ”‚
    โ”‚  AI ์—ฐ๋™ (AI FACING)                                   โ”‚
    โ”‚  โ”œโ”€โ”€ prompt()             โ†’ LLM์šฉ ๋„๊ตฌ ์„ค๋ช…            โ”‚
    โ”‚  โ”œโ”€โ”€ description()        โ†’ ๋™์  ์„ค๋ช…                  โ”‚
    โ”‚  โ””โ”€โ”€ mapToolResultToAPI() โ†’ API ์‘๋‹ต์šฉ ํฌ๋งทํŒ…          โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์ „์ฒด ๋„๊ตฌ ์ธ๋ฒคํ† ๋ฆฌ

    ํŒŒ์ผ ์ž‘์—…                 ๊ฒ€์ƒ‰ ๋ฐ ํƒ์ƒ‰               ์‹คํ–‰
    โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•        โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•     โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
    FileReadTool             GlobTool                  BashTool
    FileEditTool             GrepTool                  PowerShellTool
    FileWriteTool            ToolSearchTool
    NotebookEditTool                                   ์ƒํ˜ธ์ž‘์šฉ
                                                       โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
    ์›น ๋ฐ ๋„คํŠธ์›Œํฌ           ์—์ด์ „ํŠธ / ์ž‘์—…           AskUserQuestionTool
    โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•        โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•        BriefTool
    WebFetchTool             AgentTool
    WebSearchTool            SendMessageTool           ๊ณ„ํš ๋ฐ ์›Œํฌํ”Œ๋กœ์šฐ
                             TeamCreateTool            โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
    MCP ํ”„๋กœํ† ์ฝœ             TeamDeleteTool            EnterPlanModeTool
    โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•           TaskCreateTool            ExitPlanModeTool
    MCPTool                  TaskGetTool               EnterWorktreeTool
    ListMcpResourcesTool     TaskUpdateTool            ExitWorktreeTool
    ReadMcpResourceTool      TaskListTool              TodoWriteTool
                             TaskStopTool
                             TaskOutputTool            ์‹œ์Šคํ…œ
                                                       โ•โ•โ•โ•โ•โ•โ•โ•
                             ์Šคํ‚ฌ ๋ฐ ํ™•์žฅ              ConfigTool
                             โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•     SkillTool
                             SkillTool                 ScheduleCronTool
                             LSPTool                   SleepTool
                                                       TungstenTool

๊ถŒํ•œ ์‹œ์Šคํ…œ

    ๋„๊ตฌ ํ˜ธ์ถœ ์š”์ฒญ
          โ”‚
          โ–ผ
    โ”Œโ”€ validateInput() โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  ๊ถŒํ•œ ๊ฒ€์‚ฌ ์ „ ์œ ํšจํ•˜์ง€ ์•Š์€ ์ž…๋ ฅ ์กฐ๊ธฐ ๊ฑฐ๋ถ€         โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                         โ”‚
                         โ–ผ
    โ”Œโ”€ PreToolUse Hooks (๋„๊ตฌ ์‚ฌ์šฉ ์ „ ํ›…) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  ์‚ฌ์šฉ์ž ์ •์˜ ์‰˜ ๋ช…๋ น (settings.json hooks)         โ”‚
    โ”‚  ๊ฐ€๋Šฅ ์ž‘์—…: ์Šน์ธ, ๊ฑฐ๋ถ€ ๋˜๋Š” ์ž…๋ ฅ ์ˆ˜์ •              โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                         โ”‚
                         โ–ผ
    โ”Œโ”€ Permission Rules (๊ถŒํ•œ ๊ทœ์น™) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  alwaysAllowRules:  ๋„๊ตฌ ์ด๋ฆ„/ํŒจํ„ด ์ผ์น˜ โ†’ ์ž๋™ ์Šน์ธโ”‚
    โ”‚  alwaysDenyRules:   ๋„๊ตฌ ์ด๋ฆ„/ํŒจํ„ด ์ผ์น˜ โ†’ ์ž๋™ ๊ฑฐ๋ถ€โ”‚
    โ”‚  alwaysAskRules:    ๋„๊ตฌ ์ด๋ฆ„/ํŒจํ„ด ์ผ์น˜ โ†’ ํ•ญ์ƒ ํ™•์ธโ”‚
    โ”‚  ์ถœ์ฒ˜: ์„ค์ •, CLI ์ธ์ˆ˜, ์„ธ์…˜ ๋‚ด ๊ฒฐ์ •                โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                         โ”‚
                    ์ผ์น˜ํ•˜๋Š” ๊ทœ์น™ ์—†์Œ?
                         โ”‚
                         โ–ผ
    โ”Œโ”€ Interactive Prompt (๋Œ€ํ™”ํ˜• ํ”„๋กฌํ”„ํŠธ) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  ์‚ฌ์šฉ์ž๊ฐ€ ๋„๊ตฌ ์ด๋ฆ„ + ์ž…๋ ฅ๊ฐ’ ํ™•์ธ                  โ”‚
    โ”‚  ์˜ต์…˜: ํ•œ ๋ฒˆ ํ—ˆ์šฉ / ํ•ญ์ƒ ํ—ˆ์šฉ / ๊ฑฐ๋ถ€               โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                         โ”‚
                         โ–ผ
    โ”Œโ”€ checkPermissions() โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  ๋„๊ตฌ๋ณ„ ํŠน์ˆ˜ ๋กœ์ง (์˜ˆ: ๊ฒฝ๋กœ ์ƒŒ๋“œ๋ฐ•์Šค ๊ฒ€์‚ฌ)         โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                         โ”‚
                    ์Šน์ธ๋จ โ†’ tool.call()

์„œ๋ธŒ ์—์ด์ „ํŠธ ๋ฐ ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์•„ํ‚คํ…์ฒ˜

                        ๋ฉ”์ธ ์—์ด์ „ํŠธ
                        ==========
                            โ”‚
            โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
            โ–ผ               โ–ผ               โ–ผ
     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
     โ”‚ ํฌํฌ ์—์ด์ „ํŠธโ”‚ โ”‚ ์›๊ฒฉ ์—์ด์ „ํŠธโ”‚ โ”‚ ํ”„๋กœ์„ธ์Šค ๋‚ด ๋™๋ฃŒโ”‚
     โ”‚ (FORK)       โ”‚ โ”‚ (REMOTE)   โ”‚ โ”‚ (IN-PROCESS)   โ”‚
     โ”‚ ํ”„๋กœ์„ธ์Šค ํฌํฌโ”‚ โ”‚ ๋ธŒ๋ฆฟ์ง€ ์„ธ์…˜โ”‚ โ”‚ ๋™์ผ ํ”„๋กœ์„ธ์Šค  โ”‚
     โ”‚ ์บ์‹œ ๊ณต์œ     โ”‚ โ”‚ ์™„์ „ ๊ฒฉ๋ฆฌ  โ”‚ โ”‚ ๋น„๋™๊ธฐ ์ปจํ…์ŠคํŠธโ”‚
     โ”‚ ์ƒˆ msgs[]    โ”‚ โ”‚            โ”‚ โ”‚ ์ƒํƒœ ๊ณต์œ       โ”‚
     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

    ์ƒ์„ฑ ๋ชจ๋“œ (SPAWN MODES):
    โ”œโ”€ default    โ†’ ํ”„๋กœ์„ธ์Šค ๋‚ด, ๋Œ€ํ™” ๊ณต์œ 
    โ”œโ”€ fork       โ†’ ์ž์‹ ํ”„๋กœ์„ธ์Šค, ์ƒˆ๋กœ์šด messages[], ํŒŒ์ผ ์บ์‹œ ๊ณต์œ 
    โ”œโ”€ worktree   โ†’ ๊ฒฉ๋ฆฌ๋œ git worktree + fork
    โ””โ”€ remote     โ†’ Claude Code Remote / ์ปจํ…Œ์ด๋„ˆ๋กœ์˜ ๋ธŒ๋ฆฟ์ง€ ์—ฐ๊ฒฐ

    ํ†ต์‹  ๋ฉ”์ปค๋‹ˆ์ฆ˜ (COMMUNICATION):
    โ”œโ”€ SendMessageTool     โ†’ ์—์ด์ „ํŠธ ๊ฐ„ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ
    โ”œโ”€ TaskCreate/Update   โ†’ ๊ณต์œ  ์ž‘์—… ๋ณด๋“œ(task board)
    โ””โ”€ TeamCreate/Delete   โ†’ ํŒ€ ์ˆ˜๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ

    ์Šค์›œ ๋ชจ๋“œ (SWARM MODE, ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ๋กœ ์ œ์–ด๋จ):
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  ๋ฆฌ๋” ์—์ด์ „ํŠธ (Lead Agent)                 โ”‚
    โ”‚    โ”œโ”€โ”€ ๋™๋ฃŒ A โ”€โ”€> ์ž‘์—… 1 ํ• ๋‹น               โ”‚
    โ”‚    โ”œโ”€โ”€ ๋™๋ฃŒ B โ”€โ”€> ์ž‘์—… 2 ํ• ๋‹น               โ”‚
    โ”‚    โ””โ”€โ”€ ๋™๋ฃŒ C โ”€โ”€> ์ž‘์—… 3 ํ• ๋‹น               โ”‚
    โ”‚                                             โ”‚
    โ”‚  ๊ณต์œ : ์ž‘์—… ๋ณด๋“œ, ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ ํ•จ             โ”‚
    โ”‚  ๊ฒฉ๋ฆฌ: messages[], ํŒŒ์ผ ์บ์‹œ, cwd           โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์ปจํ…์ŠคํŠธ ๊ด€๋ฆฌ (์••์ถ• ์‹œ์Šคํ…œ)

    ์ปจํ…์ŠคํŠธ ์ฐฝ ์˜ˆ์‚ฐ (CONTEXT WINDOW BUDGET)
    โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ (๋„๊ตฌ, ๊ถŒํ•œ, CLAUDE.md)            โ”‚
    โ”‚  โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•      โ”‚
    โ”‚                                                     โ”‚
    โ”‚  ๋Œ€ํ™” ๊ธฐ๋ก (Conversation History)                   โ”‚
    โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
    โ”‚  โ”‚ [์ด์ „ ๋ฉ”์‹œ์ง€๋“ค์˜ ์••์ถ•๋œ ์š”์•ฝ]                โ”‚    โ”‚
    โ”‚  โ”‚ โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•  โ”‚    โ”‚
    โ”‚  โ”‚ [compact_boundary ๋งˆ์ปค]                      โ”‚    โ”‚
    โ”‚  โ”‚ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ โ”‚    โ”‚
    โ”‚  โ”‚ [์ตœ๊ทผ ๋ฉ”์‹œ์ง€ โ€” ์›๋ณธ ๊ทธ๋Œ€๋กœ ์œ ์ง€]             โ”‚    โ”‚
    โ”‚  โ”‚ user โ†’ assistant โ†’ tool_use โ†’ tool_result   โ”‚    โ”‚
    โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
    โ”‚                                                     โ”‚
    โ”‚  ํ˜„์žฌ ํ„ด (์‚ฌ์šฉ์ž + ์–ด์‹œ์Šคํ„ดํŠธ ์‘๋‹ต)                 โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

    3๊ฐ€์ง€ ์••์ถ• ์ „๋žต:
    โ”œโ”€ autoCompact     โ†’ ํ† ํฐ ์ˆ˜๊ฐ€ ์ž„๊ณ„๊ฐ’์„ ์ดˆ๊ณผํ•  ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋จ
    โ”‚                     ์••์ถ• API ํ˜ธ์ถœ์„ ํ†ตํ•ด ์ด์ „ ๋ฉ”์‹œ์ง€ ์š”์•ฝ
    โ”œโ”€ snipCompact     โ†’ ๋ถˆํ•„์š”ํ•œ ๋ฉ”์‹œ์ง€์™€ ์˜ค๋ž˜๋œ ๋งˆ์ปค ์ œ๊ฑฐ
    โ”‚                     (HISTORY_SNIP ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ)
    โ””โ”€ contextCollapse โ†’ ํšจ์œจ์„ฑ์„ ์œ„ํ•ด ์ปจํ…์ŠคํŠธ ์žฌ๊ตฌ์„ฑ
                         (CONTEXT_COLLAPSE ๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ)

    ์••์ถ• ํ๋ฆ„ (COMPACTION FLOW):
    messages[] โ”€โ”€> getMessagesAfterCompactBoundary()
                        โ”‚
                        โ–ผ
                  ์ด์ „ ๋ฉ”์‹œ์ง€ โ”€โ”€> Claude API (์š”์•ฝ) โ”€โ”€> ์••์ถ•๋œ ์š”์•ฝ
                        โ”‚
                        โ–ผ
                  [์š”์•ฝ] + [compact_boundary] + [์ตœ๊ทผ ๋ฉ”์‹œ์ง€]

MCP (Model Context Protocol) ํ†ตํ•ฉ

    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚                  MCP ์•„ํ‚คํ…์ฒ˜                            โ”‚
    โ”‚                                                         โ”‚
    โ”‚  MCPConnectionManager.tsx                               โ”‚
    โ”‚    โ”œโ”€โ”€ ์„œ๋ฒ„ ๊ฒ€์ƒ‰ (settings.json ๊ตฌ์„ฑ ๊ธฐ๋ฐ˜)              โ”‚
    โ”‚    โ”‚     โ”œโ”€โ”€ stdio  โ†’ ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ                โ”‚
    โ”‚    โ”‚     โ”œโ”€โ”€ sse    โ†’ HTTP EventSource                  โ”‚
    โ”‚    โ”‚     โ”œโ”€โ”€ http   โ†’ ์ŠคํŠธ๋ฆฌ๋ฐ HTTP                     โ”‚
    โ”‚    โ”‚     โ”œโ”€โ”€ ws     โ†’ WebSocket                         โ”‚
    โ”‚    โ”‚     โ””โ”€โ”€ sdk    โ†’ ํ”„๋กœ์„ธ์Šค ๋‚ด ์ „์†ก                  โ”‚
    โ”‚    โ”‚                                                    โ”‚
    โ”‚    โ”œโ”€โ”€ ํด๋ผ์ด์–ธํŠธ ์ˆ˜๋ช…์ฃผ๊ธฐ                              โ”‚
    โ”‚    โ”‚     โ”œโ”€โ”€ connect โ†’ initialize โ†’ list tools          โ”‚
    โ”‚    โ”‚     โ”œโ”€โ”€ MCPTool ๋ž˜ํผ๋ฅผ ํ†ตํ•œ ๋„๊ตฌ ํ˜ธ์ถœ              โ”‚
    โ”‚    โ”‚     โ””โ”€โ”€ ๋ฐฑ์˜คํ”„(backoff)๊ฐ€ ํฌํ•จ๋œ ์—ฐ๊ฒฐ ํ•ด์ œ / ์žฌ์—ฐ๊ฒฐโ”‚
    โ”‚    โ”‚                                                    โ”‚
    โ”‚    โ”œโ”€โ”€ ์ธ์ฆ (Authentication)                            โ”‚
    โ”‚    โ”‚     โ”œโ”€โ”€ OAuth 2.0 ํ๋ฆ„ (McpOAuthConfig)            โ”‚
    โ”‚    โ”‚     โ”œโ”€โ”€ ๊ต์ฐจ ์•ฑ ์•ก์„ธ์Šค (XAA / SEP-990)             โ”‚
    โ”‚    โ”‚     โ””โ”€โ”€ ํ—ค๋”๋ฅผ ํ†ตํ•œ API ํ‚ค ์ „๋‹ฌ                    โ”‚
    โ”‚    โ”‚                                                    โ”‚
    โ”‚    โ””โ”€โ”€ ๋„๊ตฌ ๋“ฑ๋ก (Tool Registration)                    โ”‚
    โ”‚          โ”œโ”€โ”€ mcp__<server>__<tool> ๋ช…๋ช… ๊ทœ์น™            โ”‚
    โ”‚          โ”œโ”€โ”€ MCP ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋™์  ์Šคํ‚ค๋งˆ(schema) ์ˆ˜์‹     โ”‚
    โ”‚          โ”œโ”€โ”€ Claude Code๋กœ ๊ถŒํ•œ ํ†ต๊ณผ(passthrough)       โ”‚
    โ”‚          โ””โ”€โ”€ ๋ฆฌ์†Œ์Šค ๋ชฉ๋กํ™” (ListMcpResourcesTool)       โ”‚
    โ”‚                                                         โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๋ธŒ๋ฆฟ์ง€ ๋ ˆ์ด์–ด (Claude Desktop / Remote)

    Claude Desktop / Web / Cowork          Claude Code CLI
    โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•            โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                 โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚  ๋ธŒ๋ฆฟ์ง€ ํด๋ผ์ด์–ธํŠธโ”‚  โ†โ”€ HTTP โ”€โ”€โ†’   โ”‚  bridgeMain.ts   โ”‚
    โ”‚  (Desktop App)    โ”‚                 โ”‚                  โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ”‚  ์„ธ์…˜ ๊ด€๋ฆฌ์ž     โ”‚
                                          โ”‚  โ”œโ”€โ”€ CLI ์Šคํฐ    โ”‚
    ํ”„๋กœํ† ์ฝœ (PROTOCOL):                  โ”‚  โ”œโ”€โ”€ ์ƒํƒœ ํด๋ง   โ”‚
    โ”œโ”€ JWT ์ธ์ฆ                           โ”‚  โ”œโ”€โ”€ ๋ฉ”์‹œ์ง€ ๋ฆด๋ ˆ์ดโ”‚
    โ”œโ”€ Work secret ๊ตํ™˜                   โ”‚  โ””โ”€โ”€ ์šฉ๋Ÿ‰ ์›จ์ดํฌ โ”‚
    โ”œโ”€ ์„ธ์…˜ ์ˆ˜๋ช…์ฃผ๊ธฐ                      โ”‚                  โ”‚
    โ”‚  โ”œโ”€โ”€ create                         โ”‚  ๋ฐฑ์˜คํ”„(Backoff):โ”‚
    โ”‚  โ”œโ”€โ”€ run                            โ”‚  โ”œโ”€ ์—ฐ๊ฒฐ: 2sโ†’2m  โ”‚
    โ”‚  โ””โ”€ stop                            โ”‚  โ””โ”€ ์ƒ์„ฑ: 500msโ†’30sโ”‚
    โ””โ”€ ํ† ํฐ ์ƒˆ๋กœ๊ณ ์นจ ์Šค์ผ€์ค„๋Ÿฌ             โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์„ธ์…˜ ์˜์†์„ฑ (Session Persistence)

    ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€ (SESSION STORAGE)
    โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

    ~/.claude/projects/<hash>/sessions/
    โ””โ”€โ”€ <session-id>.jsonl           โ† ์ถ”๊ฐ€ ์ „์šฉ(append-only) ๋กœ๊ทธ
        โ”œโ”€โ”€ {"type":"user",...}
        โ”œโ”€โ”€ {"type":"assistant",...}
        โ”œโ”€โ”€ {"type":"progress",...}
        โ””โ”€โ”€ {"type":"system","subtype":"compact_boundary",...}

    ๋ณต๊ตฌ ํ๋ฆ„ (RESUME FLOW):
    getLastSessionLog() โ”€โ”€> JSONL ํŒŒ์‹ฑ โ”€โ”€> messages[] ์žฌ๊ตฌ์„ฑ
         โ”‚
         โ”œโ”€โ”€ --continue     โ†’ ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋งˆ์ง€๋ง‰ ์„ธ์…˜
         โ”œโ”€โ”€ --resume <id>  โ†’ ํŠน์ • ์„ธ์…˜
         โ””โ”€โ”€ --fork-session โ†’ ์ƒˆ ID, ๊ธฐ๋ก ๋ณต์‚ฌ

    ์˜์†์„ฑ ์ „๋žต (PERSISTENCE STRATEGY):
    โ”œโ”€ ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€ โ†’ ์“ฐ๊ธฐ ๋Œ€๊ธฐ (์ถฉ๋Œ ๋ณต๊ตฌ๋ฅผ ์œ„ํ•œ ๋ธ”๋กœํ‚น)
    โ”œโ”€ ์–ด์‹œ์Šคํ„ดํŠธ ๋ฉ”์‹œ์ง€ โ†’ ๋น„๋™๊ธฐ ์ „์†ก (์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜๋Š” ํ)
    โ”œโ”€ ์ง„ํ–‰ ์ƒํƒœ     โ†’ ์ธ๋ผ์ธ ์“ฐ๊ธฐ (๋‹ค์Œ ์ฟผ๋ฆฌ ์‹œ ์ค‘๋ณต ์ œ๊ฑฐ)
    โ””โ”€ ํ”Œ๋Ÿฌ์‹œ(Flush) โ†’ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ ์‹œ / cowork ์ฆ‰์‹œ ํ”Œ๋Ÿฌ์‹œ

๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ ์‹œ์Šคํ…œ (Feature Flag System)

    ๋ฐ๋“œ ์ฝ”๋“œ ์ œ๊ฑฐ (Bun ์ปดํŒŒ์ผ ์‹œ์ )
    โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

    feature('FLAG_NAME')  โ”€โ”€โ†’  true  โ†’ ๋ฒˆ๋“ค์— ํฌํ•จ๋จ
                           โ”€โ”€โ†’  false โ†’ ๋ฒˆ๋“ค์—์„œ ์ œ๊ฑฐ๋จ

    ํ”Œ๋ž˜๊ทธ ๋ชฉ๋ก (์†Œ์Šค์—์„œ ๊ด€์ฐฐ๋จ):
    โ”œโ”€ COORDINATOR_MODE      โ†’ ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์ฝ”๋””๋„ค์ดํ„ฐ
    โ”œโ”€ HISTORY_SNIP          โ†’ ๊ณต๊ฒฉ์ ์ธ ๊ธฐ๋ก ๋‹ค๋“ฌ๊ธฐ
    โ”œโ”€ CONTEXT_COLLAPSE      โ†’ ์ปจํ…์ŠคํŠธ ์žฌ๊ตฌ์„ฑ
    โ”œโ”€ DAEMON                โ†’ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋ฐ๋ชฌ ์›Œ์ปค
    โ”œโ”€ AGENT_TRIGGERS        โ†’ ํฌ๋ก (cron)/์›๊ฒฉ ํŠธ๋ฆฌ๊ฑฐ
    โ”œโ”€ AGENT_TRIGGERS_REMOTE โ†’ ์›๊ฒฉ ํŠธ๋ฆฌ๊ฑฐ ์ง€์›
    โ”œโ”€ MONITOR_TOOL          โ†’ MCP ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ
    โ”œโ”€ WEB_BROWSER_TOOL      โ†’ ๋ธŒ๋ผ์šฐ์ € ์ž๋™ํ™”
    โ”œโ”€ VOICE_MODE            โ†’ ์Œ์„ฑ ์ž…๋ ฅ/์ถœ๋ ฅ
    โ”œโ”€ TEMPLATES             โ†’ ์ž‘์—… ๋ถ„๋ฅ˜๊ธฐ
    โ”œโ”€ EXPERIMENTAL_SKILL_SEARCH โ†’ ์Šคํ‚ฌ ํƒ์ƒ‰
    โ”œโ”€ KAIROS                โ†’ ํ‘ธ์‹œ ์•Œ๋ฆผ, ํŒŒ์ผ ์ „์†ก
    โ”œโ”€ PROACTIVE             โ†’ ์ˆ˜๋ฉด ๋„๊ตฌ, ์„ ์ œ์  ํ–‰๋™
    โ”œโ”€ OVERFLOW_TEST_TOOL    โ†’ ํ…Œ์ŠคํŠธ ๋„๊ตฌ
    โ”œโ”€ TERMINAL_PANEL        โ†’ ํ„ฐ๋ฏธ๋„ ์บก์ฒ˜
    โ”œโ”€ WORKFLOW_SCRIPTS      โ†’ ์›Œํฌํ”Œ๋กœ์šฐ ๋„๊ตฌ
    โ”œโ”€ CHICAGO_MCP           โ†’ ์ปดํ“จํ„ฐ ์‚ฌ์šฉ MCP
    โ”œโ”€ DUMP_SYSTEM_PROMPT    โ†’ ํ”„๋กฌํ”„ํŠธ ์ถ”์ถœ (๋‚ด๋ถ€ ์ „์šฉ)
    โ”œโ”€ UDS_INBOX             โ†’ ํ”ผ์–ด ํƒ์ƒ‰
    โ”œโ”€ ABLATION_BASELINE     โ†’ ์‹คํ—˜ ์ œ๊ฑฐ(ablation)
    โ””โ”€ UPGRADE_NOTICE        โ†’ ์—…๊ทธ๋ ˆ์ด๋“œ ์•Œ๋ฆผ

    ๋Ÿฐํƒ€์ž„ ๊ฒŒ์ดํŠธ (RUNTIME GATES):
    โ”œโ”€ process.env.USER_TYPE === 'ant'  โ†’ ๋‚ด๋ถ€ ๊ธฐ๋Šฅ
    โ””โ”€ GrowthBook feature flags         โ†’ ๋Ÿฐํƒ€์ž„ A/B ์‹คํ—˜

์ƒํƒœ ๊ด€๋ฆฌ (State Management)

    โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
    โ”‚                  AppState Store                           โ”‚
    โ”‚                                                          โ”‚
    โ”‚  AppState {                                              โ”‚
    โ”‚    toolPermissionContext: {                              โ”‚
    โ”‚      mode: PermissionMode,           โ† default/plan ๋“ฑ  โ”‚
    โ”‚      additionalWorkingDirectories,                        โ”‚
    โ”‚      alwaysAllowRules,               โ† ์ž๋™ ์Šน์ธ         โ”‚
    โ”‚      alwaysDenyRules,                โ† ์ž๋™ ๊ฑฐ๋ถ€         โ”‚
    โ”‚      alwaysAskRules,                 โ† ํ•ญ์ƒ ํ™•์ธ         โ”‚
    โ”‚      isBypassPermissionsModeAvailable                    โ”‚
    โ”‚    },                                                    โ”‚
    โ”‚    fileHistory: FileHistoryState,    โ† ์‹คํ–‰ ์ทจ์†Œ ์Šค๋ƒ…์ƒท  โ”‚
    โ”‚    attribution: AttributionState,    โ† ์ปค๋ฐ‹ ์ถ”์          โ”‚
    โ”‚    verbose: boolean,                                     โ”‚
    โ”‚    mainLoopModel: string,           โ† ํ™œ์„ฑ ๋ชจ๋ธ         โ”‚
    โ”‚    fastMode: FastModeState,                              โ”‚
    โ”‚    speculation: SpeculationState                          โ”‚
    โ”‚  }                                                       โ”‚
    โ”‚                                                          โ”‚
    โ”‚  React ํ†ตํ•ฉ:                                             โ”‚
    โ”‚  โ”œโ”€โ”€ AppStateProvider   โ†’ createContext๋ฅผ ํ†ตํ•ด ์Šคํ† ์–ด ์ƒ์„ฑโ”‚
    โ”‚  โ”œโ”€โ”€ useAppState(sel)   โ†’ ์„ ํƒ์ž(selector) ๊ธฐ๋ฐ˜ ๊ตฌ๋…     โ”‚
    โ”‚  โ””โ”€โ”€ useSetAppState()   โ†’ immer ์Šคํƒ€์ผ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜     โ”‚
    โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

12๊ฐ€์ง€ ์ ์ง„์  ์•ˆ์ „ ์žฅ์น˜ (The 12 Progressive Harness Mechanisms)

์ด ์•„ํ‚คํ…์ฒ˜๋Š” ๊ธฐ๋ณธ ๋ฃจํ”„ ์™ธ์— ํ”„๋กœ๋•์…˜ AI ์—์ด์ „ํŠธ ํ•˜๋‹ˆ์Šค์— ํ•„์š”ํ•œ 12๊ณ„์ธต์˜ ์ ์ง„์  ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ด์ „ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•๋ฉ๋‹ˆ๋‹ค:

    s01  ํ•ต์‹ฌ ๋ฃจํ”„ (THE LOOP)  "ํ•˜๋‚˜์˜ ๋ฃจํ”„์™€ Bash๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค"
         query.ts: Claude API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” while-true ๋ฃจํ”„,
         stop_reason์„ ํ™•์ธํ•˜๊ณ , ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ๊ฒฐ๊ณผ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    s02  ๋„๊ตฌ ๋””์ŠคํŒจ์น˜ (TOOL DISPATCH) "๋„๊ตฌ ์ถ”๊ฐ€ = ํ•ธ๋“ค๋Ÿฌ ํ•˜๋‚˜ ์ถ”๊ฐ€"
         Tool.ts + tools.ts: ๋ชจ๋“  ๋„๊ตฌ๊ฐ€ ๋””์ŠคํŒจ์น˜ ๋งต์— ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค.
         ๋ฃจํ”„๋Š” ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. buildTool() ํŒฉํ† ๋ฆฌ๊ฐ€ ์•ˆ์ „ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    s03  ๊ณ„ํš (PLANNING)      "๊ณ„ํš ์—†๋Š” ์—์ด์ „ํŠธ๋Š” ํ‘œ๋ฅ˜ํ•œ๋‹ค"
         EnterPlanModeTool/ExitPlanModeTool + TodoWriteTool:
         ๋‹จ๊ณ„๋ฅผ ๋จผ์ € ๋‚˜์—ดํ•œ ๋‹ค์Œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์™„๋ฃŒ์œจ์„ ๋‘ ๋ฐฐ๋กœ ๋†’์ž…๋‹ˆ๋‹ค.

    s04  ์„œ๋ธŒ ์—์ด์ „ํŠธ (SUB-AGENTS)  "ํฐ ์ž‘์—…์„ ๋‚˜๋ˆ„๊ณ  ํ•˜์œ„ ์ž‘์—…๋งˆ๋‹ค ์ปจํ…์ŠคํŠธ๋ฅผ ์ •๋ฆฌํ•œ๋‹ค"
         AgentTool + forkSubagent.ts: ๊ฐ ํ•˜์œ„ ์—์ด์ „ํŠธ๋Š” ์ƒˆ๋กœ์šด messages[]๋ฅผ ๊ฐ€์ ธ,
         ๋ฉ”์ธ ๋Œ€ํ™”๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

    s05  ์˜จ๋””๋งจ๋“œ ์ง€์‹ (KNOWLEDGE) "ํ•„์š”ํ•  ๋•Œ ์ง€์‹์„ ๋กœ๋“œํ•œ๋‹ค"
         SkillTool + memdir/: ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ์•„๋‹Œ tool_result๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
         ๋””๋ ‰ํ„ฐ๋ฆฌ๋ณ„๋กœ CLAUDE.md ํŒŒ์ผ์„ ์ง€์—ฐ ๋กœ๋“œ(lazy load)ํ•ฉ๋‹ˆ๋‹ค.

    s06  ์ปจํ…์ŠคํŠธ ์••์ถ• (COMPRESSION) "์ปจํ…์ŠคํŠธ๊ฐ€ ๊ฝ‰ ์ฐจ๋ฉด ๊ณต๊ฐ„์„ ํ™•๋ณดํ•œ๋‹ค"
         services/compact/: 3๊ณ„์ธต ์ „๋žต:
         autoCompact (์š”์•ฝ) + snipCompact (์ž๋ฅด๊ธฐ) + contextCollapse

    s07  ์˜๊ตฌ ์ž‘์—… (TASKS)   "ํฐ ๋ชฉํ‘œ โ†’ ์ž‘์€ ์ž‘์—… โ†’ ๋””์Šคํฌ"
         TaskCreate/Update/Get/List: ํŒŒ์ผ ๊ธฐ๋ฐ˜์˜ ์ž‘์—… ๊ทธ๋ž˜ํ”„(Task graph)๋กœ,
         ์ƒํƒœ ์ถ”์ , ์ข…์†์„ฑ ๋ฐ ์˜์†์„ฑ์„ ๊ฐ–์Šต๋‹ˆ๋‹ค.

    s08  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—… (BACKGROUND) "๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋А๋ฆฐ ์ž‘์—… ์‹คํ–‰; ์—์ด์ „ํŠธ๋Š” ๊ณ„์† ์ƒ๊ฐํ•œ๋‹ค"
         DreamTask + LocalShellTask: ๋ฐ๋ชฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ ,
         ์™„๋ฃŒ ์‹œ ์•Œ๋ฆผ์„ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.

    s09  ์—์ด์ „ํŠธ ํŒ€ (TEAMS)     "ํ˜ผ์ž ํ•˜๊ธฐ์—” ๋„ˆ๋ฌด ํฌ๋‹ค โ†’ ๋™๋ฃŒ์—๊ฒŒ ์œ„์ž„ํ•œ๋‹ค"
         TeamCreate/Delete + InProcessTeammateTask: 
         ๋น„๋™๊ธฐ ๋ฉ”์ผ๋ฐ•์Šค๋ฅผ ๊ฐ€์ง„ ์˜๊ตฌ์ ์ธ ๋™๋ฃŒ ์—์ด์ „ํŠธ๋“ค.

    s10  ํŒ€ ํ”„๋กœํ† ์ฝœ (PROTOCOLS) "๊ณต์œ ๋œ ํ†ต์‹  ๊ทœ์น™"
         SendMessageTool: ํ•˜๋‚˜์˜ ์š”์ฒญ-์‘๋‹ต ํŒจํ„ด์ด
         ์—์ด์ „ํŠธ ๊ฐ„์˜ ๋ชจ๋“  ํ˜‘์ƒ์„ ์ฃผ๋„ํ•ฉ๋‹ˆ๋‹ค.

    s11  ์ž์œจ ์—์ด์ „ํŠธ (AUTONOMOUS) "๋™๋ฃŒ๋“ค์ด ์Šค์Šค๋กœ ์ž‘์—…์„ ์Šค์บ”ํ•˜๊ณ  ์ฒญ๊ตฌํ•œ๋‹ค"
         coordinator/coordinatorMode.ts: ์œ ํœด ๋ฃจํ”„(Idle cycle) + ์ž๋™ ํ• ๋‹น,
         ๋ฆฌ๋”๊ฐ€ ๋ชจ๋“  ์ž‘์—…์„ ์ผ์ผ์ด ํ• ๋‹นํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

    s12  ์ž‘์—… ํŠธ๋ฆฌ ๊ฒฉ๋ฆฌ (WORKTREE) "๊ฐ์ž ์ž์‹ ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์ž‘์—…ํ•œ๋‹ค"
         EnterWorktreeTool/ExitWorktreeTool: ์ž‘์—…์€ ๋ชฉํ‘œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ ,
         ์ž‘์—… ํŠธ๋ฆฌ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ID๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋””์ž์ธ ํŒจํ„ด (Key Design Patterns)

ํŒจํ„ด ์œ„์น˜ ๋ชฉ์ 
AsyncGenerator ์ŠคํŠธ๋ฆฌ๋ฐ QueryEngine, query() API์—์„œ ์†Œ๋น„์ž๋กœ ์ด์–ด์ง€๋Š” ์ „์ฒด ์ฒด์ธ ์ŠคํŠธ๋ฆฌ๋ฐ
๋นŒ๋” + ํŒฉํ† ๋ฆฌ (Builder + Factory) buildTool() ๋„๊ตฌ ์ •์˜๋ฅผ ์œ„ํ•œ ์•ˆ์ „ํ•œ ๊ธฐ๋ณธ๊ฐ’ ์ œ๊ณต
๋ธŒ๋žœ๋“œ ํƒ€์ž… (Branded Types) SystemPrompt, asSystemPrompt() ๋ฌธ์ž์—ด/๋ฐฐ์—ด ํ˜ผ๋™ ๋ฐฉ์ง€
๊ธฐ๋Šฅ ํ”Œ๋ž˜๊ทธ + DCE bun:bundle์˜ feature() ์ปดํŒŒ์ผ ์‹œ์  ๋ฐ๋“œ ์ฝ”๋“œ ์ œ๊ฑฐ(DCE)
๊ตฌ๋ณ„๋œ ์œ ๋‹ˆ์˜จ (Discriminated Unions) Message ํƒ€์ž… ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๋ณด์žฅ๋˜๋Š” ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ
์˜ต์ €๋ฒ„ + ์ƒํƒœ ๋จธ์‹  StreamingToolExecutor ๋„๊ตฌ ์‹คํ–‰ ์ˆ˜๋ช…์ฃผ๊ธฐ ์ถ”์ 
์Šค๋ƒ…์ƒท ์ƒํƒœ (Snapshot State) FileHistoryState ํŒŒ์ผ ์ž‘์—…์˜ ์‹คํ–‰ ์ทจ์†Œ/๋‹ค์‹œ ์‹คํ–‰
๋ง ๋ฒ„ํผ (Ring Buffer) ์—๋Ÿฌ ๋กœ๊ทธ ๊ธด ์„ธ์…˜์„ ์œ„ํ•œ ์ œํ•œ๋œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ
๋ฐœ์‚ฌ ํ›„ ๋ง๊ฐ (Fire-and-Forget) recordTranscript() ์ˆœ์„œ๊ฐ€ ์œ ์ง€๋˜๋Š” ๋…ผ๋ธ”๋กœํ‚น ์˜์†ํ™”
์ง€์—ฐ ์Šคํ‚ค๋งˆ (Lazy Schema) lazySchema() ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ Zod ์Šคํ‚ค๋งˆ ์ง€์—ฐ ํ‰๊ฐ€
์ปจํ…์ŠคํŠธ ๊ฒฉ๋ฆฌ (Context Isolation) AsyncLocalStorage ๊ณต์œ  ํ”„๋กœ์„ธ์Šค ๋‚ด ๊ฐ ์—์ด์ „ํŠธ๋ณ„ ์ปจํ…์ŠคํŠธ

๋ฐ์ดํ„ฐ ํ๋ฆ„: ๋‹จ์ผ ์ฟผ๋ฆฌ ์ˆ˜๋ช…์ฃผ๊ธฐ

 ์‚ฌ์šฉ์ž ์ž…๋ ฅ (ํ”„๋กฌํ”„ํŠธ / ์Šฌ๋ž˜์‹œ ๋ช…๋ น)
     โ”‚
     โ–ผ
 processUserInput()                โ† /๋ช…๋ น์–ด ํŒŒ์‹ฑ, UserMessage ์ƒ์„ฑ
     โ”‚
     โ–ผ
 fetchSystemPromptParts()          โ† ๋„๊ตฌ โ†’ ํ”„๋กฌํ”„ํŠธ ์„น์…˜, CLAUDE.md ๋ฉ”๋ชจ๋ฆฌ
     โ”‚
     โ–ผ
 recordTranscript()                โ† ์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€๋ฅผ ๋””์Šคํฌ์— ์˜์†ํ™” (JSONL)
     โ”‚
     โ–ผ
 โ”Œโ”€โ†’ normalizeMessagesForAPI()     โ† UI ์ „์šฉ ํ•„๋“œ ์ œ๊ฑฐ, ํ•„์š”์‹œ ์••์ถ• ์ˆ˜ํ–‰
 โ”‚   โ”‚
 โ”‚   โ–ผ
 โ”‚   Claude API (์ŠคํŠธ๋ฆฌ๋ฐ)         โ† ๋„๊ตฌ + ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์™€ ํ•จ๊ป˜ POST /v1/messages
 โ”‚   โ”‚
 โ”‚   โ–ผ
 โ”‚   ์ŠคํŠธ๋ฆผ ์ด๋ฒคํŠธ                 โ† message_start โ†’ content_block_delta โ†’ message_stop
 โ”‚   โ”‚
 โ”‚   โ”œโ”€ ํ…์ŠคํŠธ ๋ธ”๋ก โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ ์†Œ๋น„์ž(SDK / REPL)์—๊ฒŒ ์ „๋‹ฌ
 โ”‚   โ”‚
 โ”‚   โ””โ”€ tool_use ๋ธ”๋ก?
 โ”‚       โ”‚
 โ”‚       โ–ผ
 โ”‚   StreamingToolExecutor         โ† ๋ถ„ํ• : ๋™์‹œ์„ฑ ์•ˆ์ „(concurrent-safe) vs ์ง๋ ฌ(serial)
 โ”‚       โ”‚
 โ”‚       โ–ผ
 โ”‚   canUseTool()                  โ† ๊ถŒํ•œ ๊ฒ€์‚ฌ (ํ›… + ๊ทœ์น™ + UI ํ”„๋กฌํ”„ํŠธ)
 โ”‚       โ”‚
 โ”‚       โ”œโ”€ ๊ฑฐ๋ถ€ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ†’ tool_result(error) ์ถ”๊ฐ€, ๋ฃจํ”„ ๊ณ„์†
 โ”‚       โ”‚
 โ”‚       โ””โ”€ ํ—ˆ์šฉ
 โ”‚           โ”‚
 โ”‚           โ–ผ
 โ”‚       tool.call()               โ† ๋„๊ตฌ ์‹คํ–‰ (Bash, Read, Edit ๋“ฑ)
 โ”‚           โ”‚
 โ”‚           โ–ผ
 โ”‚       tool_result ์ถ”๊ฐ€          โ† messages[]์— ํ‘ธ์‹œ, recordTranscript()
 โ”‚           โ”‚
 โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                       โ† API ํ˜ธ์ถœ๋กœ ๋ฃจํ”„ ๋ณต๊ท€
     โ”‚
     โ–ผ (stop_reason != "tool_use")
 ๊ฒฐ๊ณผ ๋ฉ”์‹œ์ง€ ์ƒ์„ฑ                  โ† ์ตœ์ข… ํ…์ŠคํŠธ, ์‚ฌ์šฉ๋Ÿ‰, ๋น„์šฉ, session_id

๋ชฉ์ฐจ


์‹ฌ์ธต ๋ถ„์„ ๋ณด๊ณ ์„œ (docs/)

์ธํ„ฐ๋„ท์— ๊ณต๊ฐœ๋œ ์ž๋ฃŒ์™€ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ† ๋ก ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ •๋ฆฌ๋œ Claude Code v2.1.88 ๋ถ„์„ ๋ณด๊ณ ์„œ. ์˜์–ด/์ค‘๊ตญ์–ด/ํ•œ๊ตญ์–ด/์ผ๋ณธ์–ด 4๊ฐœ ๊ตญ์–ด ์ œ๊ณต.

docs/
โ”œโ”€โ”€ en/                                        # English
โ”‚   โ”œโ”€โ”€ [01-telemetry-and-privacy.md]          # Telemetry & Privacy โ€” what's collected, why you can't opt out
โ”‚   โ”œโ”€โ”€ [02-hidden-features-and-codenames.md]  # Codenames (Capybara/Tengu/Numbat), feature flags, internal vs external
โ”‚   โ”œโ”€โ”€ [03-undercover-mode.md]                # Undercover Mode โ€” hiding AI authorship in open-source repos
โ”‚   โ”œโ”€โ”€ [04-remote-control-and-killswitches.md]# Remote Control โ€” managed settings, killswitches, model overrides
โ”‚   โ””โ”€โ”€ [05-future-roadmap.md]                 # Future Roadmap โ€” Numbat, KAIROS, voice mode, unreleased tools
โ”‚
โ”œโ”€โ”€ ko/                                        # ํ•œ๊ตญ์–ด
โ”‚   โ”œโ”€โ”€ [01-ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ์™€-ํ”„๋ผ์ด๋ฒ„์‹œ.md]          # ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ ๋ฐ ํ”„๋ผ์ด๋ฒ„์‹œ โ€” ์ˆ˜์ง‘ ํ•ญ๋ชฉ, ๋น„ํ™œ์„ฑํ™” ๋ถˆ๊ฐ€ ์ด์œ 
โ”‚   โ”œโ”€โ”€ [02-์ˆจ๊ฒจ์ง„-๊ธฐ๋Šฅ๊ณผ-์ฝ”๋“œ๋„ค์ž„.md]          # ์ˆจ๊ฒจ์ง„ ๊ธฐ๋Šฅ โ€” ๋ชจ๋ธ ์ฝ”๋“œ๋„ค์ž„, feature flag, ๋‚ด๋ถ€/์™ธ๋ถ€ ์‚ฌ์šฉ์ž ์ฐจ์ด
โ”‚   โ”œโ”€โ”€ [03-์–ธ๋”์ปค๋ฒ„-๋ชจ๋“œ.md]                   # ์–ธ๋”์ปค๋ฒ„ ๋ชจ๋“œ โ€” ์˜คํ”ˆ์†Œ์Šค์—์„œ AI ์ €์ž‘ ์€ํ
โ”‚   โ”œโ”€โ”€ [04-์›๊ฒฉ-์ œ์–ด์™€-ํ‚ฌ์Šค์œ„์น˜.md]            # ์›๊ฒฉ ์ œ์–ด โ€” ๊ด€๋ฆฌ ์„ค์ •, ํ‚ฌ์Šค์œ„์น˜, ๋ชจ๋ธ ์˜ค๋ฒ„๋ผ์ด๋“œ
โ”‚   โ””โ”€โ”€ [05-ํ–ฅํ›„-๋กœ๋“œ๋งต.md]                     # ํ–ฅํ›„ ๋กœ๋“œ๋งต โ€” Numbat, KAIROS, ์Œ์„ฑ ๋ชจ๋“œ, ๋ฏธ๊ณต๊ฐœ ๋„๊ตฌ
โ”‚
โ””โ”€โ”€ zh/                                        # ไธญๆ–‡
    โ”œโ”€โ”€ [01-้ฅๆต‹ไธŽ้š็งๅˆ†ๆž.md]                    # ้ฅๆต‹ไธŽ้š็ง โ€” ๆ”ถ้›†ไบ†ไป€ไนˆ๏ผŒไธบไป€ไนˆๆ— ๆณ•้€€ๅ‡บ
    โ”œโ”€โ”€ [02-้š่—ๅŠŸ่ƒฝไธŽๆจกๅž‹ไปฃๅท.md]                # ้š่—ๅŠŸ่ƒฝ โ€” ๆจกๅž‹ไปฃๅท๏ผŒfeature flag๏ผŒๅ†…ๅค–็”จๆˆทๅทฎๅผ‚
    โ”œโ”€โ”€ [03-ๅงๅบ•ๆจกๅผๅˆ†ๆž.md]                     # ๅงๅบ•ๆจกๅผ โ€” ๅœจๅผ€ๆบ้กน็›ฎไธญ้š่— AI ่บซไปฝ
    โ”œโ”€โ”€ [04-่ฟœ็จ‹ๆŽงๅˆถไธŽ็ดงๆ€ฅๅผ€ๅ…ณ.md]                # ่ฟœ็จ‹ๆŽงๅˆถ โ€” ๆ‰˜็ฎก่ฎพ็ฝฎ๏ผŒ็ดงๆ€ฅๅผ€ๅ…ณ๏ผŒๆจกๅž‹่ฆ†็›–
    โ””โ”€โ”€ [05-ๆœชๆฅ่ทฏ็บฟๅ›พ.md]                       # ๆœชๆฅ่ทฏ็บฟๅ›พ โ€” Numbat๏ผŒKAIROS๏ผŒ่ฏญ้Ÿณๆจกๅผ๏ผŒๆœชไธŠ็บฟๅทฅๅ…ท

ํŒŒ์ผ๋ช…์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ๋ณด๊ณ ์„œ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

# ์ฃผ์ œ ํ•ต์‹ฌ ๋ฐœ๊ฒฌ ๋งํฌ
01 ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ ๋ฐ ํ”„๋ผ์ด๋ฒ„์‹œ ์ด์ค‘ ๋ถ„์„ ํŒŒ์ดํ”„๋ผ์ธ (1P, Datadog). ํ™˜๊ฒฝ ํ•‘๊ฑฐํ”„๋ฆฐํŠธ, ํ”„๋กœ์„ธ์Šค ๋ฉ”ํŠธ๋ฆญ, ๋ชจ๋“  ์ด๋ฒคํŠธ์— ์„ธ์…˜/์‚ฌ์šฉ์ž ID ํฌํ•จ. ์‚ฌ์šฉ์ž ๋Œ€์ƒ ๋น„ํ™œ์„ฑํ™” ์„ค์ • ์—†์Œ. OTEL_LOG_TOOL_DETAILS=1๋กœ ์ „์ฒด ๋„๊ตฌ ์ž…๋ ฅ ๊ธฐ๋ก ๊ฐ€๋Šฅ. EN ยท ํ•œ๊ตญ์–ด ยท ไธญๆ–‡
02 ์ˆจ๊ฒจ์ง„ ๊ธฐ๋Šฅ๊ณผ ์ฝ”๋“œ๋„ค์ž„ ๋™๋ฌผ ์ฝ”๋“œ๋„ค์ž„ ์ฒด๊ณ„ (Capybara v8, Tengu, Fennecโ†’Opus 4.6, Numbat ์ฐจ๊ธฐ). Feature flag์— ๋ฌด์ž‘์œ„ ๋‹จ์–ด ์กฐํ•ฉ์œผ๋กœ ๋ชฉ์  ๋‚œ๋…ํ™”. ๋‚ด๋ถ€ ์‚ฌ์šฉ์ž๋Š” ๋” ๋‚˜์€ ํ”„๋กฌํ”„ํŠธ์™€ ๊ฒ€์ฆ ์—์ด์ „ํŠธ ์ œ๊ณต. ์ˆจ๊ฒจ์ง„ ๋ช…๋ น์–ด: /btw, /stickers. EN ยท ํ•œ๊ตญ์–ด ยท ไธญๆ–‡
03 ์–ธ๋”์ปค๋ฒ„ ๋ชจ๋“œ ๊ณต์‹ ์ง์›์€ ๊ณต๊ฐœ ์ €์žฅ์†Œ์—์„œ ์ž๋™์œผ๋กœ ์–ธ๋”์ปค๋ฒ„ ๋ชจ๋“œ ์ง„์ž…. ๋ชจ๋ธ ์ง€์‹œ: "์ •์ฒด๋ฅผ ๋“คํ‚ค์ง€ ๋งˆ๋ผ" โ€” ๋ชจ๋“  AI ์ €์ž‘ ํ‘œ์‹œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ์‚ฌ๋žŒ์ด ์ž‘์„ฑํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ปค๋ฐ‹. ๊ฐ•์ œ ๋น„ํ™œ์„ฑํ™” ์˜ต์…˜ ์—†์Œ. EN ยท ํ•œ๊ตญ์–ด ยท ไธญๆ–‡
04 ์›๊ฒฉ ์ œ์–ด ๋ฐ ํ‚ฌ์Šค์œ„์น˜ 1์‹œ๊ฐ„๋งˆ๋‹ค /api/claude_code/settings ํด๋ง. ์œ„ํ—˜ ๋ณ€๊ฒฝ ์‹œ ์ฐจ๋‹จ ๋‹ค์ด์–ผ๋กœ๊ทธ โ€” ๊ฑฐ๋ถ€ = ์•ฑ ์ข…๋ฃŒ. 6๊ฐœ ์ด์ƒ ํ‚ฌ์Šค์œ„์น˜ (๊ถŒํ•œ ์šฐํšŒ, fast ๋ชจ๋“œ, ์Œ์„ฑ ๋ชจ๋“œ, ๋ถ„์„ ์‹ฑํฌ). GrowthBook์œผ๋กœ ๋™์˜ ์—†์ด ์‚ฌ์šฉ์ž ๋™์ž‘ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ. EN ยท ํ•œ๊ตญ์–ด ยท ไธญๆ–‡
05 ํ–ฅํ›„ ๋กœ๋“œ๋งต Numbat ์ฝ”๋“œ๋„ค์ž„ ํ™•์ธ. Opus 4.7 / Sonnet 4.8 ๊ฐœ๋ฐœ ์ค‘. KAIROS = ์™„์ „ ์ž์œจ ์—์ด์ „ํŠธ ๋ชจ๋“œ, <tick> ํ•˜ํŠธ๋น„ํŠธ, ํ‘ธ์‹œ ์•Œ๋ฆผ, PR ๊ตฌ๋…. ์Œ์„ฑ ๋ชจ๋“œ(push-to-talk) ์ค€๋น„ ์™„๋ฃŒ. ๋ฏธ๊ณต๊ฐœ ๋„๊ตฌ 17๊ฐœ ๋ฐœ๊ฒฌ. EN ยท ํ•œ๊ตญ์–ด ยท ไธญๆ–‡

์ €์ž‘๊ถŒ ๋ฐ ๋ฉด์ฑ… ์กฐํ•ญ

๋ณธ ์ €์žฅ์†Œ๋Š” ๊ธฐ์ˆ  ์—ฐ๊ตฌ ๋ฐ ๊ต์œก ๋ชฉ์ ์œผ๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ƒ์—…์  ์‚ฌ์šฉ์€ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค.

์ €์ž‘๊ถŒ์ž๋กœ์„œ ๋ณธ ์ €์žฅ์†Œ ์ฝ˜ํ…์ธ ๊ฐ€ ๊ท€ํ•˜์˜ ๊ถŒ๋ฆฌ๋ฅผ ์นจํ•ดํ•œ๋‹ค๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฒฝ์šฐ,
์ €์žฅ์†Œ ์†Œ์œ ์ž์—๊ฒŒ ์—ฐ๋ฝ ์ฃผ์‹œ๋ฉด ์ฆ‰์‹œ ์‚ญ์ œํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ†ต๊ณ„

ํ•ญ๋ชฉ ์ˆ˜๋Ÿ‰
ํŒŒ์ผ (.ts/.tsx) ~1,884
๋ผ์ธ ์ˆ˜ ~512,664
์ตœ๋Œ€ ๋‹จ์ผ ํŒŒ์ผ query.ts (~785KB)
๋‚ด์žฅ ๋„๊ตฌ ~40๊ฐœ ์ด์ƒ
์Šฌ๋ž˜์‹œ ๋ช…๋ น ~80๊ฐœ ์ด์ƒ
์˜์กด์„ฑ (node_modules) ~192๊ฐœ ํŒจํ‚ค์ง€
๋Ÿฐํƒ€์ž„ Bun (Node.js >= 18 ๋ฒˆ๋“ค๋กœ ์ปดํŒŒ์ผ)

์—์ด์ „ํŠธ ๋ชจ๋“œ

                    ์ฝ”์–ด ๋ฃจํ”„
                    ========

    ์‚ฌ์šฉ์ž --> messages[] --> Claude API --> ์‘๋‹ต
                                          |
                                stop_reason == "tool_use"?
                               /                          \
                             ์˜ˆ                           ์•„๋‹ˆ์˜ค
                              |                             |
                        ๋„๊ตฌ ์‹คํ–‰                        ํ…์ŠคํŠธ ๋ฐ˜ํ™˜
                        tool_result ์ถ”๊ฐ€
                        ๋ฃจํ”„ ์žฌ์ง„์ž… -----------------> messages[]


    ์ด๊ฒƒ์ด ์ตœ์†Œ ์—์ด์ „ํŠธ ๋ฃจํ”„์ด๋‹ค. Claude Code๋Š” ์ด ๋ฃจํ”„ ์œ„์—
    ํ”„๋กœ๋•์…˜๊ธ‰ ํ•˜๋‹ˆ์Šค๋ฅผ ๋ž˜ํ•‘ํ•œ๋‹ค: ๊ถŒํ•œ, ์ŠคํŠธ๋ฆฌ๋ฐ, ๋™์‹œ์„ฑ,
    ์••์ถ•, ์„œ๋ธŒ์—์ด์ „ํŠธ, ์˜์†ํ™” ๋ฐ MCP.

๋””๋ ‰ํ„ฐ๋ฆฌ ์ฐธ์กฐ

src/
โ”œโ”€โ”€ main.tsx                 # REPL ๋ถ€ํŠธ์ŠคํŠธ๋žฉ, 4,683์ค„
โ”œโ”€โ”€ QueryEngine.ts           # SDK/headless ์ฟผ๋ฆฌ ๋ผ์ดํ”„์‚ฌ์ดํด ์—”์ง„
โ”œโ”€โ”€ query.ts                 # ๋ฉ”์ธ ์—์ด์ „ํŠธ ๋ฃจํ”„ (785KB, ์ตœ๋Œ€ ํŒŒ์ผ)
โ”œโ”€โ”€ Tool.ts                  # ๋„๊ตฌ ์ธํ„ฐํŽ˜์ด์Šค + buildTool ํŒฉํ† ๋ฆฌ
โ”œโ”€โ”€ Task.ts                  # ํƒœ์Šคํฌ ํƒ€์ž…, ID, ์ƒํƒœ ๋ฒ ์ด์Šค ํด๋ž˜์Šค
โ”œโ”€โ”€ tools.ts                 # ๋„๊ตฌ ๋“ฑ๋ก, ํ”„๋ฆฌ์…‹, ํ•„ํ„ฐ๋ง
โ”œโ”€โ”€ commands.ts              # ์Šฌ๋ž˜์‹œ ๋ช…๋ น ์ •์˜
โ”œโ”€โ”€ context.ts               # ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์ปจํ…์ŠคํŠธ
โ”œโ”€โ”€ cost-tracker.ts          # API ๋น„์šฉ ๋ˆ„์ 
โ”œโ”€โ”€ setup.ts                 # ์ตœ์ดˆ ์‹คํ–‰ ์„ค์ • ํ”Œ๋กœ์šฐ
โ”‚
โ”œโ”€โ”€ bridge/                  # Claude Desktop / ์›๊ฒฉ ๋ธŒ๋ฆฟ์ง€
โ”‚   โ”œโ”€โ”€ bridgeMain.ts        #   ์„ธ์…˜ ๋ผ์ดํ”„์‚ฌ์ดํด ๋งค๋‹ˆ์ €
โ”‚   โ”œโ”€โ”€ bridgeApi.ts         #   HTTP ํด๋ผ์ด์–ธํŠธ
โ”‚   โ”œโ”€โ”€ bridgeConfig.ts      #   ์—ฐ๊ฒฐ ์„ค์ •
โ”‚   โ”œโ”€โ”€ bridgeMessaging.ts   #   ๋ฉ”์‹œ์ง€ ๋ฆด๋ ˆ์ด
โ”‚   โ”œโ”€โ”€ sessionRunner.ts     #   ํ”„๋กœ์„ธ์Šค ์Šคํฐ
โ”‚   โ”œโ”€โ”€ jwtUtils.ts          #   JWT ๊ฐฑ์‹ 
โ”‚   โ”œโ”€โ”€ workSecret.ts        #   ์ธ์ฆ ํ† ํฐ
โ”‚   โ””โ”€โ”€ capacityWake.ts      #   ์šฉ๋Ÿ‰ ๊ธฐ๋ฐ˜ ์›จ์ดํฌ
โ”‚
โ”œโ”€โ”€ cli/                     # CLI ์ธํ”„๋ผ
โ”‚   โ”œโ”€โ”€ handlers/            #   ๋ช…๋ น ํ•ธ๋“ค๋Ÿฌ
โ”‚   โ””โ”€โ”€ transports/          #   I/O ์ „์†ก (stdio, structured)
โ”‚
โ”œโ”€โ”€ commands/                # ~80๊ฐœ ์Šฌ๋ž˜์‹œ ๋ช…๋ น
โ”œโ”€โ”€ components/              # React/Ink ํ„ฐ๋ฏธ๋„ UI
โ”œโ”€โ”€ entrypoints/             # ์•ฑ ์ง„์ž…์ 
โ”œโ”€โ”€ hooks/                   # React hooks
โ”œโ”€โ”€ services/                # ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๋ ˆ์ด์–ด
โ”œโ”€โ”€ state/                   # ์•ฑ ์ƒํƒœ
โ”œโ”€โ”€ tasks/                   # ํƒœ์Šคํฌ ๊ตฌํ˜„
โ”œโ”€โ”€ tools/                   # 40๊ฐœ ์ด์ƒ ๋„๊ตฌ ๊ตฌํ˜„
โ”œโ”€โ”€ types/                   # ํƒ€์ž… ์ •์˜
โ”œโ”€โ”€ utils/                   # ์œ ํ‹ธ๋ฆฌํ‹ฐ (์ตœ๋Œ€ ๋””๋ ‰ํ„ฐ๋ฆฌ)
โ””โ”€โ”€ vendor/                  # ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋“ˆ ์Šคํ…

์•„ํ‚คํ…์ฒ˜ ๊ฐœ์š”

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                         ์ง„์ž… ๋ ˆ์ด์–ด                                  โ”‚
โ”‚  cli.tsx โ”€โ”€> main.tsx โ”€โ”€> REPL.tsx (์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ)                     โ”‚
โ”‚                     โ””โ”€โ”€> QueryEngine.ts (headless/SDK)              โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
                               โ”‚
                               โ–ผ
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                       ์ฟผ๋ฆฌ ์—”์ง„                                      โ”‚
โ”‚  submitMessage(prompt) โ”€โ”€> AsyncGenerator<SDKMessage>               โ”‚
โ”‚    โ”œโ”€โ”€ fetchSystemPromptParts()    โ”€โ”€> ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ์กฐ๋ฆฝ          โ”‚
โ”‚    โ”œโ”€โ”€ processUserInput()          โ”€โ”€> /๋ช…๋ น ์ฒ˜๋ฆฌ                    โ”‚
โ”‚    โ”œโ”€โ”€ query()                     โ”€โ”€> ๋ฉ”์ธ ์—์ด์ „ํŠธ ๋ฃจํ”„            โ”‚
โ”‚    โ”‚     โ”œโ”€โ”€ StreamingToolExecutor โ”€โ”€> ๋ณ‘๋ ฌ ๋„๊ตฌ ์‹คํ–‰               โ”‚
โ”‚    โ”‚     โ”œโ”€โ”€ autoCompact()         โ”€โ”€> ์ปจํ…์ŠคํŠธ ์••์ถ•                โ”‚
โ”‚    โ”‚     โ””โ”€โ”€ runTools()            โ”€โ”€> ๋„๊ตฌ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜           โ”‚
โ”‚    โ””โ”€โ”€ yield SDKMessage            โ”€โ”€> ์†Œ๋น„์ž์—๊ฒŒ ์ŠคํŠธ๋ฆฌ๋ฐ           โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

๋ผ์ด์„ ์Šค

๋ณธ ์ €์žฅ์†Œ ์ฝ˜ํ…์ธ ๋Š” ๊ธฐ์ˆ  ์—ฐ๊ตฌ ๋ฐ ๊ต์œก ๋ชฉ์ ์œผ๋กœ๋งŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ง€์  ์žฌ์‚ฐ๊ถŒ์€ ์› ํšŒ์‚ฌ์— ๊ท€์†๋ฉ๋‹ˆ๋‹ค. ๊ถŒ๋ฆฌ ์นจํ•ด๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์‚ญ์ œ๋ฅผ ์œ„ํ•ด ์—ฐ๋ฝ ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.