Skip to main content

Sari - Local Search MCP Server

Project description

๐Ÿง™โ€โ™‚๏ธ Sari (์‚ฌ๋ฆฌ)

"์ž ์‹œ ๋‚ด ๋ง ์ข€ ๋“ค์–ด๋ณด๊ฒŒ๋‚˜... ์ž๋„ค์˜ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ์ง€์˜ฅ์˜ ๋น„๋ช…์„ ์ง€๋ฅด๋Š” ์†Œ๋ฆฌ๋ฅผ!" (Stay awhile and listen...)

**์‚ฌ๋ฆฌ(Sari)**๋Š” ์ธ๊ณต์ง€๋Šฅ(AI) ์นœ๊ตฌ๋“ค์ด ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ณต์žกํ•˜๊ณ  ๊ฑฐ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ์•„์ฃผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” **'ํ˜ธ๋ผ๋“œ๋ฆผ์˜ ์ˆ˜์„ ๊ธฐ๋ก๊ด€'**์ด์—์š”.

์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜๋งŒ ๊ณ„์‹œ๋ฉด ์•„๋ฌด๋ฆฌ ์–ฝํžˆ๊ณ ์„คํ‚จ ์ฝ”๋“œ๋ผ๋„ AI๊ฐ€ ๊ธธ์„ ์žƒ์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ํด๋ž˜์Šค๋ฅผ 0.1์ดˆ ๋งŒ์— ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.
ํ˜ธ๋ผ๋“œ๋ฆผ์˜ ์ด›๋ถˆ์ด ๊บผ์ง€์ง€ ์•Š๋Š” ํ•œ, ์ธ๋ฑ์‹ฑ ๋ˆ„๋ฝ์ด๋ผ๋Š” ํ˜ผ๋ˆ์˜ ๋น„๋ช…์€ ๋“ค๋ฆฌ์ง€ ์•Š๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”. ๐Ÿš€ (์„ ์ƒ๋‹˜์ด ์ง€ํŒก์ด๋กœ ๊ธธ์„ ์•„์ฃผ ์ƒ์„ธํžˆ ์•ˆ๋‚ดํ•ด์ฃผ์‹ ๋‹ต๋‹ˆ๋‹ค.)


๐Ÿง ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์€ ๋ˆ„๊ตฌ์ธ๊ฐ€์š”? (์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ)

์—ฌ๋Ÿฌ๋ถ„์˜ ์ปดํ“จํ„ฐ์—๋Š” ์•„์ฃผ ๋งŽ์€ ์ฝ”๋“œ ํŒŒ์ผ์ด ์žˆ์–ด์š”. ๋˜‘๋˜‘ํ•œ **AI ์นœ๊ตฌ(Codex, Claude, Cursor, Gemini ๋“ฑ)**์—๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๋‹ฌ๋ผ๊ณ  ํ•˜๋ฉด ๊ฐ€๋” ์ด๋Ÿฐ ๋ง์„ ํ•  ๊ฑฐ์˜ˆ์š”. "๋ฏธ์•ˆํ•ด, ํŒŒ์ผ์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์–ด๋””์— ๋ญ๊ฐ€ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์–ด!"

๊ทธ๋•Œ ๋ฐ”๋กœ ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์ด ํŠธ๋ฆฌ์ŠคํŠธ๋Ÿผ ์–ด๋”˜๊ฐ€์—์„œ ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค!

  1. ์ง€๋…ํ•œ ์‚ฌ์„œ: ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์€ ์—ฌ๋Ÿฌ๋ถ„์˜ ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋ฏธ๋ฆฌ ๋‹ค ์ฝ์–ด๋‘๊ณ , ๋ˆ„๊ฐ€ ์–ด๋А ์ง€์˜ฅ ๊ตฌ์„์— ์‚ฌ๋Š”์ง€(์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ํŒŒ์ผ์— ์žˆ๋Š”์ง€) ์•„์ฃผ ์ƒ์„ธํ•œ **'ํ˜ธ๋ผ๋“œ๋ฆผ ์žฅ๋ถ€'**๋ฅผ ๋งŒ๋“ค์–ด๋‘ฌ์š”. (๋ˆˆ์ด ์นจ์นจํ•˜์…”๋„ ์ •๊ทœ์‹์€ ๊ธฐ๊ฐ€ ๋ง‰ํžˆ๊ฒŒ ๋ณด์‹ญ๋‹ˆ๋‹ค.)
  2. AI์˜ ๊ธธ์žก์ด: AI ์นœ๊ตฌ๊ฐ€ "์ด ํ”„๋กœ์ ํŠธ์—์„œ ํšŒ์›๊ฐ€์ž…์€ ์–ด๋–ป๊ฒŒ ํ•ด?"๋ผ๊ณ  ๋ฌผ์–ด๋ณด๋ฉด, ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์ด ์ง€ํŒก์ด๋ฅผ ์งš๊ณ  ์žฅ๋ถ€๋ฅผ ์Šฅ ๋ณด๊ณ ๋Š” "3๋ฒˆ ์„ ๋ฐ˜ ์•„๋ž˜, ๋””์•„๋ธ”๋กœ์˜ ๊ผฌ๋ฆฌ ์˜†์— ์žˆ๋Š” user.py ํŒŒ์ผ์„ ๋ณด๊ฒŒ๋‚˜! ์ฃผ์„ ์ข€ ๋˜‘๋ฐ”๋กœ ๋‹ฌ์ง€ ๊ทธ๋žฌ๋‚˜..."๋ผ๊ณ  ๊พธ์ง–์œผ๋ฉฐ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.
  3. MCP(Model Context Protocol): ์ด๊ฑด AI ์นœ๊ตฌ์™€ ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์ด ์„œ๋กœ ๋Œ€ํ™”ํ•  ๋•Œ ์“ฐ๋Š” 'ํ˜ธ๋ผ๋“œ๋ฆผ ํ†ต์—ญ๊ธฐ' ๊ฐ™์€ ๊ฑฐ์˜ˆ์š”. ์ด ํ†ต์—ญ๊ธฐ ๋•๋ถ„์— ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์€ ์„ธ์ƒ์˜ ๋ชจ๋“  ์ตœ์‹  AI์™€ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! (๊ณ ๋Œ€์–ด๋Š” ๋ชฐ๋ผ๋„ Python์€ ๊ฟฐ๊ณ  ๊ณ„์‹œ์ฃ .) ๐Ÿค

๐ŸŒŸ ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์˜ ํŠน๋ณ„ํ•œ ๋Šฅ๋ ฅ

  • โšก ์ฐจ์›๋ฌธ ๊ฒ€์ƒ‰: ์ˆ˜๋งŒ ์ค„์˜ ์ฝ”๋“œ๋„ ์ˆœ์‹๊ฐ„์— ์ฝ์–ด์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๊ณจ๋ผ๋‚ด์š”. (TP ํƒ€๋Š” ์†๋„๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค.)
  • ๐Ÿง  ์ฝ”๋“œ ์‹ฌ๋ น์ˆ : ๋‹จ์ˆœํžˆ ๊ธ€์ž๋งŒ ์ฐพ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ด๊ฒŒ 'ํ•จ์ˆ˜'์ธ์ง€ 'ํด๋ž˜์Šค'์ธ์ง€ ์ฝ”๋“œ์˜ ์˜ํ˜ผ(AST)์„ ์ฝ์–ด๋ƒ…๋‹ˆ๋‹ค.
  • ๐Ÿ”’ ์ฒ ํ†ต ๋ณด์•ˆ: ๋ชจ๋“  ๊ณต๋ถ€๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ์ปดํ“จํ„ฐ ์•ˆ์—์„œ๋งŒ ํ•ด์š”. ์ฝ”๋“œ๊ฐ€ ์„ฑ์—ญ(์ธํ„ฐ๋„ท) ๋ฐ–์œผ๋กœ ์ ˆ๋Œ€ ๋‚˜๊ฐ€์ง€ ์•Š์œผ๋‹ˆ ์•ˆ์‹ฌํ•˜์„ธ์š”! ์ง€์˜ฅ์˜ ์•…๋งˆ๋„ ์—ฌ๋Ÿฌ๋ถ„์˜ ์†Œ์Šค์ฝ”๋“œ๋Š” ๋ชป ํ›”์ณ๊ฐ‘๋‹ˆ๋‹ค. ๐Ÿ›ก๏ธ
  • ๐Ÿ‘ป ํˆฌ๋ช… ๋งํ† : ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์กฐ์šฉํžˆ ์ผํ•˜๋ฉฐ ์—ฌ๋Ÿฌ๋ถ„์ด ์ฝ”๋“œ๋ฅผ ๊ณ ์น  ๋•Œ๋งˆ๋‹ค ์žฅ๋ถ€๋ฅผ ์•Œ์•„์„œ ์—…๋ฐ์ดํŠธํ•ด์š”. (๊ฐ€๋” ๊ณ„์‹ ์ง€ ํ™•์ธํ•˜์ง€ ์•Š์œผ๋ฉด ์„ญ์„ญํ•ดํ•˜์‹ญ๋‹ˆ๋‹ค.)

๐Ÿš€ ์„ฑ์—ญ ์†Œํ™˜ ์ฃผ๋ฌธ (์„ค์น˜ ๋ฐฉ๋ฒ• - Installation)

์ค‘์š”: deckard ๋ชจ๋“ˆ/์—”ํŠธ๋ฆฌํฌ์ธํŠธ๋Š” ํ˜ธํ™˜์šฉ์œผ๋กœ๋งŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
์•ž์œผ๋กœ๋Š” Sari ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด ์ฃผ์„ธ์š”. (ํ–ฅํ›„ ๋ฒ„์ „์—์„œ ์ œ๊ฑฐ ์˜ˆ์ •)

๊ฐœ๋ฐœ์ž ์ฐธ๊ณ : ๋‚ด๋ถ€ ๋ชจ๋“ˆ์€ sari.core, sari.mcp ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด app, mcp ๊ฐ™์€ ์ตœ์ƒ์œ„ ํŒจํ‚ค์ง€๋Š” ๋ฐฐํฌ๋ณธ์— ํฌํ•จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์„ค์น˜ ๋ฐฉ์‹์€ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

  1. ์„ค์ •๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™ ์„ค์น˜ (๊ถŒ์žฅ)
  2. ์ง์ ‘ ์„ค์น˜ (์˜คํ”„๋ผ์ธ/์ œํ•œ ํ™˜๊ฒฝ์šฉ)

์„ค์น˜ ์•ˆ์ •์„ฑ ๊ธฐ์ค€ (KPI)

  1. ์˜คํ”„๋ผ์ธ/๋กœ์ปฌ ์†Œ์Šค/๋‹ค๋ฅธ workspace ์žฌํ˜„ ์„ฑ๊ณต๋ฅ : 3/3

์ž๋™ ์„ค์น˜ ์กฐ๊ฑด ์š”์•ฝ

  • DECKARD_ENGINE_MODE=embedded + DECKARD_ENGINE_AUTO_INSTALL=1 + ๋„คํŠธ์›Œํฌ/pip ๊ฐ€๋Šฅ

โœ… 1) ์„ค์ •๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ์ž๋™ ์„ค์น˜ (๊ถŒ์žฅ)

MCP ์„ค์ • ํŒŒ์ผ์— ์•„๋ž˜ ๋ธ”๋ก์„ ์ง์ ‘ ์ถ”๊ฐ€ํ•˜๋ฉด, ์‹คํ–‰ ์‹œ Sari๊ฐ€ ์ž๋™ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

[mcp_servers.sari]
command = "bash"
args = ["-lc", "curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; exec ~/.local/share/sari/bootstrap.sh --transport stdio"]
env = { DECKARD_WORKSPACE_ROOT = "/path/to/workspace", DECKARD_RESPONSE_COMPACT = "1" }
startup_timeout_sec = 60

๐Ÿงฉ ์„ค์ •/์„ค์น˜ ์ƒ์„ธ ๊ฐ€์ด๋“œ (์ดˆ๋ณด์ž์šฉ / ๊ณ ๊ธ‰์ž์šฉ)

โœ… ์ดˆ๋ณด์ž์šฉ (๊ถŒ์žฅ ๊ฒฝ๋กœ)

1) ์„ค์น˜ ๋ฐฉ์‹ ์„ ํƒ ๊ฐ€์ด๋“œ

A. ์„ค์ •๋งŒ ์ถ”๊ฐ€(๊ถŒ์žฅ)
MCP ์„ค์ •์— bootstrap.sh ์‹คํ–‰ ๋ธ”๋ก์„ ์ถ”๊ฐ€ํ•˜๋ฉด, ์‹คํ–‰ ์‹œ ์ž๋™ ์„ค์น˜๋ฉ๋‹ˆ๋‹ค.

B. ์˜คํ”„๋ผ์ธ/๊ณ ์ • ์„ค์น˜
๋„คํŠธ์›Œํฌ๊ฐ€ ๋ถˆ๊ฐ€ํ•œ ํ™˜๊ฒฝ์ด๋ฉด ์ด๋ฏธ ์„ค์น˜๋œ bootstrap.sh ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ์ง€์ •ํ•˜์„ธ์š”.

๋กค๋ฐฑ(SQLite) ๊ฒฝ๊ณ 
SQLite ๋ชจ๋“œ๋กœ ๋กค๋ฐฑํ•œ ๊ฒฝ์šฐ FTS ์žฌ๋นŒ๋“œ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์™„๋ฃŒ ์ „๊นŒ์ง€ ๊ฒ€์ƒ‰ ํ’ˆ์งˆ์ด ์ œํ•œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


2) MCP ์„ค์ • ํŒŒ์ผ ์œ„์น˜ (์•ฑ๋ณ„)

Codex / Gemini
<workspace>/.codex/config.toml

Claude Desktop
claude_desktop_config.json

Cursor
์•ฑ Settings > MCP ๋ฉ”๋‰ด


3) MCP ์„ค์ • ํ…œํ”Œ๋ฆฟ (TOML)

[mcp_servers.sari]
command = "bash"
args = ["-lc", "curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; exec ~/.local/share/sari/bootstrap.sh --transport stdio"]
env = {
  DECKARD_WORKSPACE_ROOT = "/path/to/workspace",
  DECKARD_RESPONSE_COMPACT = "1",
  DECKARD_ENGINE_MODE = "embedded",
  DECKARD_ENGINE_TOKENIZER = "auto",
  DECKARD_ENGINE_AUTO_INSTALL = "1"
}
startup_timeout_sec = 60

4) MCP ์„ค์ • ํ…œํ”Œ๋ฆฟ (JSON)

{
  "mcpServers": {
    "sari": {
      "command": "bash",
      "args": [
        "-lc",
        "curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; exec ~/.local/share/sari/bootstrap.sh --transport stdio"
      ],
      "env": {
        "DECKARD_WORKSPACE_ROOT": "/path/to/workspace",
        "DECKARD_RESPONSE_COMPACT": "1",
        "DECKARD_ENGINE_MODE": "embedded",
        "DECKARD_ENGINE_TOKENIZER": "auto",
        "DECKARD_ENGINE_AUTO_INSTALL": "1"
      },
      "startup_timeout_sec": 60
    }
  }
}

5) env ์˜ต์…˜ ์„ค๋ช… (ํ•ต์‹ฌ)

DECKARD_WORKSPACE_ROOT
์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ฃจํŠธ. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์˜ต์…˜.

DECKARD_ENGINE_MODE
์—”์ง„ ๋ชจ๋“œ ์„ ํƒ. embedded|sqlite (๊ธฐ๋ณธ: embedded)

DECKARD_RESPONSE_COMPACT
PACK1 ์‘๋‹ต ์••์ถ•(๊ธฐ๋ณธ 1).

DECKARD_ENGINE_TOKENIZER
auto|cjk|latin ์„ ํƒ.

DECKARD_ENGINE_AUTO_INSTALL
1์ด๋ฉด ์ฒซ ๊ฒ€์ƒ‰/์žฌ๋นŒ๋“œ ์‹œ ์—”์ง„ ์ž๋™ ์„ค์น˜.

DECKARD_READ_MAX_BYTES
read_file ์‘๋‹ต ์ตœ๋Œ€ ๋ฐ”์ดํŠธ ์ˆ˜ ์ œํ•œ (๊ธฐ๋ณธ: 1,048,576 bytes). ํฐ ํŒŒ์ผ OOM ๋ฐฉ์ง€์šฉ. DECKARD_READ_POOL_MAX
read ์ „์šฉ ์ปค๋„ฅ์…˜ ํ’€ ์ƒํ•œ (๊ธฐ๋ณธ: 32). ์ดˆ๊ณผ ์‹œ ๊ธฐ๋ณธ read ์ปค๋„ฅ์…˜์„ ๊ณต์œ .


6) bootstrap.sh ๋‹จ๋… ์‹คํ–‰ (CLI)

DECKARD_WORKSPACE_ROOT=/path/to/workspace \
DECKARD_ENGINE_MODE=embedded \
DECKARD_ENGINE_TOKENIZER=cjk \
DECKARD_ENGINE_AUTO_INSTALL=1 \
~/.local/share/sari/bootstrap.sh --transport stdio

7) ์˜คํ”„๋ผ์ธ/๊ณ ์ • ์„ค์น˜ ๊ฒฝ๋กœ

macOS/Linux
~/.local/share/sari/bootstrap.sh

Windows
%LOCALAPPDATA%\\sari\\bootstrap.bat


8) ๊ฐ€์žฅ ํ”ํ•œ ์‹ค์ˆ˜

workspace-root ๋ฏธ์ง€์ •
ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ ์ „์ฒด๊ฐ€ ์ธ๋ฑ์‹ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์ง€์ •ํ•˜์„ธ์š”.

args/env ๋ถˆ์ผ์น˜
env๊ฐ€ ์šฐ์„  ์ ์šฉ๋˜๋ฏ€๋กœ ๋‘˜์„ ๋™์ผํ•˜๊ฒŒ ๋งž์ถ”์„ธ์š”.

์„ค์น˜๋ณธ/๋ ˆํฌ ๊ฒฝ๋กœ ํ˜ผ์šฉ
ํ•˜๋‚˜์˜ ๊ฒฝ๋กœ๋งŒ ์‚ฌ์šฉํ•˜์„ธ์š”.


๐Ÿ›  ๊ณ ๊ธ‰์ž์šฉ (์ปค์Šคํ„ฐ๋งˆ์ด์ง•)

1) ์—”์ง„/ํ† ํฌ๋‚˜์ด์ € ๊ฐ•์ œ ์„ค์ •

export DECKARD_ENGINE_TOKENIZER=latin
export DECKARD_ENGINE_AUTO_INSTALL=0
export DECKARD_ENGINE_MODE=embedded

2) ์‘๋‹ต ํฌ๋งท ๋””๋ฒ„๊น…

export DECKARD_FORMAT=json
export DECKARD_RESPONSE_COMPACT=0

3) ๋ฃจํŠธ/ํฌํŠธ/DB ๊ฒฝ๋กœ ๊ณ ์ •

export DECKARD_WORKSPACE_ROOT=/path/to/workspace
export DECKARD_HTTP_API_PORT=7331
export DECKARD_DB_PATH=/absolute/path/to/index.db

4) ๋ฉ€ํ‹ฐ ๋ฃจํŠธ (๊ณ ๊ธ‰)

export DECKARD_ROOTS_JSON='["/path/a","/path/b"]'

5) ์‹คํ–‰ ์˜ˆ์‹œ (๋‹จ์ผ ์ปค๋งจ๋“œ)

DECKARD_WORKSPACE_ROOT=/path/to/workspace \
DECKARD_ENGINE_MODE=embedded \
DECKARD_ENGINE_TOKENIZER=cjk \
DECKARD_ENGINE_AUTO_INSTALL=1 \
DECKARD_FORMAT=pack \
~/.local/share/sari/bootstrap.sh --transport stdio

6) ๋ฒˆ๋“ค ํฌ๊ธฐ ์ค„์ด๊ธฐ (์˜ต์…˜)

์—”์ง„ ํ† ํฌ๋‚˜์ด์ € ์‚ฌ์ „์€ OS๋ณ„ wheel์ด ํ•จ๊ป˜ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
๋ฐฐํฌ ํฌ๊ธฐ๋ฅผ ์ค„์ด๋ ค๋ฉด ํ˜„์žฌ OS์— ๋งž๋Š” ๋ฒˆ๋“ค๋งŒ ๋‚จ๊ธฐ์„ธ์š”.

./scripts/prune_tokenizer_bundles.sh

Windows:

scripts\prune_tokenizer_bundles.bat

๐Ÿ”ง Engine/Tokenizer ์˜ต์…˜ (env๋กœ ์ฃผ์ž…)

bootstrap.sh๋กœ ํ•œ๋ฐฉ ์„ค์น˜ํ•ด๋„ env๋Š” ๊ทธ๋Œ€๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
MCP ์„ค์ •์˜ env์— ์•„๋ž˜ ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”.

๋ชจ๋“œ ์ฐจ์ด (Embedded vs SQLite)

  • embedded
    • Tantivy ๊ธฐ๋ฐ˜ ์—”์ง„ ์‚ฌ์šฉ (๊ฒ€์ƒ‰ ํ’ˆ์งˆ/์„ฑ๋Šฅ ์šฐ์„ )
    • ๋ณ„๋„ ์—”์ง„ ์„ค์น˜ ํ•„์š” (์ž๋™ ์„ค์น˜ ๊ฐ€๋Šฅ)
    • CJK ํ˜•ํƒœ์†Œ ๋ถ„์„์€ ๋ฒˆ๋“ค๋œ lindera(ipadic) ์‚ฌ์ „์„ ์‚ฌ์šฉ (์™ธ๋ถ€ ๋‹ค์šด๋กœ๋“œ ์—†์Œ)
    • ์ธ๋ฑ์Šค๋Š” ~/.local/share/sari/index/<roots_hash>์— ๊ด€๋ฆฌ
  • sqlite
    • SQLite FTS/LIKE ๊ธฐ๋ฐ˜ (ํ˜ธํ™˜/๋กค๋ฐฑ์šฉ)
    • ์—”์ง„ ์„ค์น˜ ์—†์ด ๋™์ž‘
    • ๋Œ€์šฉ๋Ÿ‰/๊ณ ์† ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ์€ ์ œํ•œ์ 

์ž๋™ ์„ค์น˜ ๋™์ž‘ ์กฐ๊ฑด

  • DECKARD_ENGINE_MODE=embedded
  • DECKARD_ENGINE_AUTO_INSTALL=1
  • ๋„คํŠธ์›Œํฌ ๊ฐ€๋Šฅ + pip ์„ค์น˜ ๊ฐ€๋Šฅ

์ž๋™ ์„ค์น˜ ๋น„ํ™œ์„ฑ/์‹คํŒจ ์‹œ

  • ์˜คํ”„๋ผ์ธ ํ™˜๊ฒฝ์ด๊ฑฐ๋‚˜ DECKARD_ENGINE_AUTO_INSTALL=0์ธ ๊ฒฝ์šฐ ์ž๋™ ์„ค์น˜๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ˆ˜๋™ ์„ค์น˜ ๋ช…๋ น: sari --cmd engine install

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€/๋ณต๊ตฌ ์•ˆ๋‚ด (๊ณ ์ •)

  • ์ž๋™ ์„ค์น˜ ์‹คํŒจ: ERR_ENGINE_NOT_INSTALLED โ†’ sari --cmd engine install
  • ์—”์ง„ ์ค€๋น„ ์•ˆ ๋จ: ERR_ENGINE_UNAVAILABLE โ†’ sari --cmd engine rebuild

์ฃผ์š” ์˜ต์…˜

  • DECKARD_ENGINE_MODE=embedded|sqlite
    • ๊ธฐ๋ณธ: embedded
    • embedded: Tantivy ๊ธฐ๋ฐ˜ ์—”์ง„
    • sqlite: SQLite ๊ฒ€์ƒ‰ ์—”์ง„(ํ˜ธํ™˜/๋กค๋ฐฑ์šฉ)
  • DECKARD_ENGINE_TOKENIZER=auto|cjk|latin
    • ๊ธฐ๋ณธ: auto
    • cjk: CJK ํ† ํฌ๋‚˜์ด์ € ๊ฐ•์ œ
    • latin: latin ํ† ํฌ๋‚˜์ด์ € ๊ฐ•์ œ
  • DECKARD_ENGINE_AUTO_INSTALL=1|0
    • 1: ์ฒซ ๊ฒ€์ƒ‰/์žฌ๋นŒ๋“œ ์‹œ ์ž๋™ ์„ค์น˜
    • 0: ์ž๋™ ์„ค์น˜ ๋น„ํ™œ์„ฑ (์˜คํ”„๋ผ์ธ/์ œํ•œ ํ™˜๊ฒฝ)
  • DECKARD_LINDERA_DICT_PATH=/path/to/dictionary
    • ํ˜•ํƒœ์†Œ ์‚ฌ์ „ ๊ฒฝ๋กœ ๊ฐ•์ œ ์ง€์ • (ํ•„์š” ์‹œ)
  • DECKARD_READ_MAX_BYTES=0|N
    • read_file ์‘๋‹ต ํฌ๊ธฐ ์ œํ•œ. 0์ด๋ฉด ์ œํ•œ ์—†์Œ.
    • ๊ธฐ๋ณธ: 1048576 (์•ฝ 1MB)
  • DECKARD_READ_POOL_MAX=0|N
    • read ์ „์šฉ ์ปค๋„ฅ์…˜ ํ’€ ์ƒํ•œ. 0์ด๋ฉด ์ œํ•œ ์—†์Œ.
    • ๊ธฐ๋ณธ: 32

์˜ˆ์‹œ

env = {
  DECKARD_WORKSPACE_ROOT = "/path/to/workspace",
  DECKARD_RESPONSE_COMPACT = "1",
  DECKARD_ENGINE_MODE = "embedded",
  DECKARD_ENGINE_TOKENIZER = "cjk",
  DECKARD_ENGINE_AUTO_INSTALL = "1"
}

๐Ÿงฐ 2) ์ง์ ‘ ์„ค์น˜ (์˜คํ”„๋ผ์ธ/์ œํ•œ ํ™˜๊ฒฝ์šฉ)

ํ„ฐ๋ฏธ๋„(Terminal)์—์„œ ์ง์ ‘ ์„ค์น˜๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

# macOS / Linux
curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y

# Windows (PowerShell)
irm https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python - -y

๐Ÿ“– ํ˜ธ๋ผ๋“œ๋ฆผ์˜ ์„ค์น˜ ๊ณ„์‹œ (How it works)

์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์˜ ์„ค์น˜ ๋งˆ๋ฒ•์€ ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:

  1. ์„ค์ •๋งŒ ์ถ”๊ฐ€ โ†’ ์‹คํ–‰ ์‹œ ๋„คํŠธ์›Œํฌ์—์„œ ์ž๋™ ์„ค์น˜
  2. ์„ค์น˜ ์œ„์น˜๋Š” ํ•ญ์ƒ ์ „์—ญ ๊ณ ์ • (~/.local/share/sari / %LOCALAPPDATA%\\sari)
  3. ๋ฐ๋ชฌ์€ ํ•ญ์ƒ ํ•˜๋‚˜๋กœ ์œ ์ง€

์„ค์น˜ํ•˜๋ฉด ์–ด๋–ค ๋งˆ๋ฒ•์ด ์ผ์–ด๋‚˜๋‚˜์š”?

  1. ์ง€ํ˜œ ์ „์ˆ˜: ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์ด ์ผํ•  ๋•Œ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๋„๊ตฌ(Python ์—”์ง„ ๋“ฑ)๋ฅผ ์ž๋™์œผ๋กœ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋น„๋ฐ€ ๊ฑฐ์ฒ˜ ๋งˆ๋ จ: ๋„์„œ๊ด€ ์ฃผ์†Œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. (์ด์‚ฌ ๋น„์šฉ์€ ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค.)
    • macOS/Linux: ~/.local/share/sari (์‚ฌ๊ณผ ๋งˆํฌ๊ฐ€ ์ฐํžŒ ๋น„๋ฐ€ ์ฐฝ๊ณ )
    • Windows: %LOCALAPPDATA%\sari (์ฐฝ๋ฌธ์ด ๋‹ฌ๋ฆฐ ๋น„๋ฐ€ ์ฐฝ๊ณ )
  3. ํ†ต์—ญ๊ธฐ ์—ฐ๊ฒฐ: MCP ์„ค์ • ๋ธ”๋ก๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ์‹คํ–‰ ์‹œ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

์„ค์ •์€ ์–ด๋””์— ์ˆจ๊ฒจ์ง€๋‚˜์š”? (์ˆ˜๋™ ๋“ฑ๋ก ๋ฐฉ์‹)

์„ค์ • ํŒŒ์ผ์€ ์ž๋™์œผ๋กœ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
Codex/Gemini๋Š” TOML, Cursor/Claude๋Š” JSON ํ˜•์‹์œผ๋กœ ๋™์ผ ๋‚ด์šฉ์„ ๋„ฃ์–ด์ฃผ์„ธ์š”.

์—ฌ๋Ÿฌ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ๋™์‹œ์—? (๋ถ„์‹ ์ˆ ์˜ ๋Œ€๊ฐ€)

  • ์„ค์ •์€ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ณ„๋กœ ๊ฐ์ž์˜ ์šด๋ช…์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
    ์˜ˆ: A์—์„œ ์‹คํ–‰ โ†’ A/.codex/config.toml ์ƒ์„ฑ (A์˜ ๊ธฐ๋ก)
    B์—์„œ ์‹คํ–‰ โ†’ B/.codex/config.toml ์ƒ์„ฑ (B์˜ ๋ฐ€์„œ)
  • ๋ชธ์€ ํ•˜๋‚˜, ์ง€ํ˜œ๋Š” ์—ฌ๋Ÿฌ ๊ณณ์—: ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์€ ํ•˜๋‚˜์˜ ๋ฐ๋ชฌ(Daemon)์œผ๋กœ ๋™์ž‘ํ•˜์ง€๋งŒ, ์„ฑ์—ญ ๊ณณ๊ณณ์— ๋ถ„์‹ ์„ ๋ณด๋‚ด์–ด A์™€ B ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ๋™์‹œ์— ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! (์„ ์ƒ๋‹˜์ด ์›Œ์ปคํ™€๋ฆญ์ด๋ผ AB ๋‘˜ ๋‹ค ์ผœ๋‘๋ฉด ๋‘˜ ๋‹ค ์ƒ…์ƒ…์ด ์ˆ˜์ง‘ํ•˜์‹ ๋‹ค๋„ค.)
  • ์ฒ ์ €ํ•œ ๊ธฐ๋ก ๋ถ„๋ฆฌ: A์˜ ์žฅ๋ถ€์™€ B์˜ ์žฅ๋ถ€๋Š” ์„œ๋กœ ์„ž์ด์ง€ ์•Š๋„๋ก ์—„๊ฒฉํžˆ ๋ถ„๋ฆฌ๋œ ์„œ๋ž(Data Directory)์— ๋ณด๊ด€๋ฉ๋‹ˆ๋‹ค. A์—์„œ ๋””์•„๋ธ”๋กœ๋ฅผ ๊ฒ€์ƒ‰ํ–ˆ๋Š”๋ฐ B์˜ ๋ฐ”์•Œ์ด ํŠ€์–ด๋‚˜์˜ค๋Š” ์ผ์€ ์—†์œผ๋‹ˆ ์•ˆ์‹ฌํ•˜์‹œ๊ฒŒ๋‚˜.

๐Ÿช„ ์„ค์น˜ ์˜ต์…˜ (๋Œ€์•ˆ)

์˜คํ”„๋ผ์ธ/์ œํ•œ ํ™˜๊ฒฝ์šฉ
์„ค์ •์—์„œ command๋ฅผ ์„ค์น˜๋ณธ bootstrap.sh๋กœ ์ง์ ‘ ์ง€์ •ํ•˜๋ฉด ๋„คํŠธ์›Œํฌ ์—†์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

bootstrap ์Šคํฌ๋ฆฝํŠธ ์œ„์น˜

  • macOS/Linux: ~/.local/share/sari/bootstrap.sh
  • Windows: %LOCALAPPDATA%\\sari\\bootstrap.bat

๐Ÿงญ ์ฐจ์›๋ฌธ ์—ฐ๊ฒฐ ์œ„์น˜์™€ ๋™์ž‘ (์‹คํ–‰ ์œ„์น˜ ์š”์•ฝ)

์‹คํ–‰ ์œ„์น˜ (์ฐจ์›๋ฌธ ์ฃผ์†Œ) workspace-root๊ฐ€ ์—†์„ ๋•Œ ์šด๋ช…
๋ ˆํฌ ๋‚ด๋ถ€ ๋ ˆํฌ ๋˜๋Š” ์ƒ์œ„ .codex-root๋ฅผ ๊ณ ํ–ฅ์œผ๋กœ ์ธ์‹
์›Œํฌ์ŠคํŽ˜์ด์Šค ๋ฃจํŠธ "์—ฌ๊ธฐ๊ฐ€ ๋‚ด ์ง‘์ด๊ตฌ๋‚˜!" ํ•˜๊ณ  ๋ฐ”๋กœ ์ •์ฐฉ
ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ (~) ์—ฌ๋Ÿฌ๋ถ„์˜ ์˜จ ์ง‘์•ˆ ์‚ด๋ฆผ์„ ๋‹ค ๋’ค์ง‘์–ด ๋ด„ (๊ฐ•๋ ฅํžˆ ๋น„์ถ”์ฒœ!)

โš ๏ธ "์„ฑ์Šค๋Ÿฌ์šด ํ˜ผ์šฉ" ๊ธˆ์ง€ ๊ฒฝ๊ณ 

command์— ์„ค์น˜๋ณธ๊ณผ ๋ ˆํฌ ๊ฒฝ๋กœ๋ฅผ ์„ž์–ด ์“ฐ๋ฉด ์ง€์˜ฅ๋ฌธ์ด ์—ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์—…๋ฐ์ดํŠธ ๊ทœ์น™์ด ๋’ค์—‰์ผœ์„œ ๊ณ ๋Œ€ ๋ฒ„์ „์ด ํŠ€์–ด๋‚˜์˜ค๊ฑฐ๋‚˜,
  • ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ๋ชฌ์ด ๋‚˜ํƒ€๋‚˜ ํฌํŠธ 47779๋ฅผ ๋‘๊ณ  '์„ฑ์ „'์„ ๋ฒŒ์ด๊ฑฐ๋‚˜,
  • "์–ด๋А ์„ค์ •์ด ์ง„์งœ์ธ๊ฐ€" ํ•˜๊ณ  ์ž์•„ ๋ถ„์—ด์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ config์—๋Š” ํ•ญ์ƒ ํ•œ ๊ฒฝ๋กœ๋งŒ ์œ ์ง€ํ•˜์„ธ์š”. (1โ€‘Step ๋˜๋Š” ๊ณ ์ • ๋ชจ๋“œ ์ค‘ ํ•˜๋‚˜!)


๐Ÿ” ์„ฑ์—ญ์˜ ์œ ์ง€๋ณด์ˆ˜ (Update & Recovery)

๐Ÿ” ๊ฐ•์ œ ์—…๋ฐ์ดํŠธ ๋ฐ ๋ณต๊ตฌ

๋งŒ์•ฝ ์„ค์น˜ ํด๋”๊ฐ€ ์†์ƒ๋˜์—ˆ๊ฑฐ๋‚˜, ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ๊ฐ•์ œ ์žฌ์„ค์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด --update ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

# ์„ค์น˜๊ฐ€ ๊ผฌ์˜€๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ
curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - --update -y

โœ… ์ˆ˜์„ ๊ธฐ๋ก๊ด€์˜ ์ตœ์ข… ์ ๊ฒ€ (Checklist)

์„ค์น˜ ํ›„ ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด **๋‹ฅํ„ฐ(Doctor)**๋ฅผ ์†Œํ™˜ํ•˜์„ธ์š”:

python3 ~/.local/share/sari/doctor.py

๐Ÿงน ๋„์„œ๊ด€ ๋Œ€์ฒญ์†Œ ๋ฐ ๋ณด์•ˆ (Caution!)

  • ์žฅ๋ถ€์˜ ์†Œ๋ฉธ: ์‚ญ์ œ ์‹œ ๊ณต๋“ค์—ฌ ๋งŒ๋“  ๊ธฐ๋ก(DB)๋„ ํ•จ๊ป˜ ๊ฐ€๋ฃจ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค โ†’ ์žฌ์„ค์น˜ ํ›„ ์žฌ์ธ๋ฑ์‹ฑ์ด๋ผ๋Š” ์ „์„ค๊ธ‰ ๋…ธ๊ฐ€๋‹ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜ํ–‰์˜ ์‹œ๊ฐ„: ์ฒซ ์‹คํ–‰ ์‹œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (ํ˜ธ๋ผ๋“œ๋ฆผ ๋„์„œ๊ด€ 20,000ํ‰์„ ํ˜ผ์ž ๋น—์งˆํ•˜์‹ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์‹œ๊ฒŒ๋‚˜, ์ง€๊ทนํžˆ ์ •์ƒ์ด๋ผ๋„ค.)

๐Ÿ”’ ์ฒœ์ƒ์˜ ๋ณด์•ˆ/ํ”„๋ผ์ด๋ฒ„์‹œ

  • ๋ชจ๋“  ๊ณต๋ถ€์™€ ๊ฒ€์ƒ‰์€ **์—ฌ๋Ÿฌ๋ถ„์˜ ์•ˆ๋ฐฉ(๋กœ์ปฌ)**์—์„œ๋งŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ๊ฐ€ ์ง€์˜ฅ(์™ธ๋ถ€ ์„œ๋ฒ„)์œผ๋กœ ์ „์†ก๋˜๋Š” ๋ถˆ์ƒ์‚ฌ๋Š” ๊ฒฐ์ฝ” ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ์™€ ์บ์‹œ๋Š” ์˜ค์ง ์—ฌ๋Ÿฌ๋ถ„์˜ ํ•˜๋“œ๋””์Šคํฌ ๊นŠ์ˆ™ํ•œ ๊ณณ์—๋งŒ ๋ด‰์ธ๋ฉ๋‹ˆ๋‹ค. (๋””์•„๋ธ”๋กœ๋„ ๋ชป ํ›”์ณ๊ฐ€๋„ค.)

๐Ÿงผ Redaction (๋ฏผ๊ฐ์ •๋ณด ๋งˆ์Šคํ‚น)

  • ์ธ๋ฑ์‹ฑ/ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ ๋กœ๊ทธ ๊ธฐ๋ก ์ „ ๋ฏผ๊ฐ์ •๋ณด๋ฅผ ๋งˆ์Šคํ‚นํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ๊ฐ’์€ redact_enabled=true์ด๋ฉฐ, ์„ค์ •์—์„œ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งˆ์Šคํ‚น ๋ฒ”์œ„/ํŒจํ„ด์€ app/indexer.py์˜ _redact ๋กœ์ง ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.

๐Ÿงญ ๋‹ค์ค‘ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ๋˜‘๋˜‘ํ•˜๊ฒŒ ์“ฐ๋Š” ๋ฐฉ๋ฒ•

โ€œA๋„ ๋ณด๊ณ  ์‹ถ๊ณ  B๋„ ๋ณด๊ณ  ์‹ถ์–ด!โ€ ํ•˜์‹œ๋Š” ๋ถ„๋“ค์„ ์œ„ํ•œ ํ˜„์‹ค์ ์ธ ์ถ”์ฒœ ํŒจํ„ด์ด์—์š”.

  • ๋ฐฉ๋ฒ• 1: ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ณ„๋กœ ์„ค์ •์„ ๋‚˜๋ˆ ๋‘๊ธฐ (๊ถŒ์žฅ)
    A, B ๊ฐ๊ฐ์— .codex/config.toml์„ ๋งŒ๋“ค์–ด ๋‘๊ณ , ํ•„์š”ํ•  ๋•Œ ๊ทธ ํด๋”์—์„œ ์‹คํ–‰ํ•˜์„ธ์š”.
    ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์€ ํ˜„์žฌ ์œ„์น˜ ๊ธฐ์ค€์œผ๋กœ ์›€์ง์ด๋Š” ์„ฑ๊ฒฉ์ด๋ผ, ๊ทธ๊ฒŒ ์ œ์ผ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐฉ๋ฒ• 2: ํ•˜๋‚˜์˜ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋งŒ ์ง‘์ค‘ ๊ด€๋ฆฌ
    โ€œ์ง€๊ธˆ์€ A๋งŒ ๋ด์•ผ ํ•ด!โ€๋ผ๋ฉด B๋Š” ๊ณผ๊ฐํ•˜๊ฒŒ ์žŠ์œผ์„ธ์š”.
    ์‚ฌ๋ฆฌ๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์— ์ง‘์ค‘ํ•˜๋Š” ์„ ์ƒ๋‹˜์ด์—์š”. (๋ฉ€ํ‹ฐํƒœ์Šคํ‚น์€ ๋‹ค์Œ ํ•™๊ธฐ์—โ€ฆ)


๐Ÿงฏ ๋ฌธ์ œ ํ•ด๊ฒฐ (Troubleshooting)

Q. MCP ์—ฐ๊ฒฐ์ด ์•ˆ ๋ผ์š”

  • command๊ฐ€ bash์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ๋„คํŠธ์›Œํฌ๊ฐ€ ํ—ˆ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”.
  • ์ œํ•œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์„ค์น˜๋ณธ bootstrap ๊ฒฝ๋กœ๋กœ ์ „ํ™˜ํ•˜์„ธ์š”.
  • ๋ฐ๋ชฌ ์ƒํƒœ ํ™•์ธ:
    # macOS/Linux
    ~/.local/share/sari/bootstrap.sh daemon status
    
    # Windows
    %LOCALAPPDATA%\sari\bootstrap.bat daemon status
    
  • ๊ธฐ๋™์ด ๋А๋ฆฌ๋ฉด startup_timeout_sec๋ฅผ 120~180์œผ๋กœ ์˜ฌ๋ ค๋ณด์„ธ์š”.

Q. ์ฒซ ์‹คํ–‰์ด ๋„ˆ๋ฌด ๋А๋ ค์š”

  • ์ฒซ ์ธ๋ฑ์‹ฑ์€ ์›๋ž˜ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. (ํ˜ธ๋ผ๋“œ๋ฆผ ๋„์„œ๊ด€ 20,000ํ‰์„ ํ˜ผ์ž ์ฒญ์†Œํ•˜์‹ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์„ธ์š”.)
  • --workspace-root๋กœ ๋ฒ”์œ„๋ฅผ ์ค„์ด๋ฉด ํ›จ์”ฌ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค. (์„ ์ƒ๋‹˜๊ป˜ ์ฒญ์†Œ ๋ฒ”์œ„๋ฅผ ์ข๊ฒŒ ์•Œ๋ ค๋“œ๋ฆฌ๋Š” ๋งค๋„ˆ!)

Q. ํ…Œ์ŠคํŠธ๊ฐ€ ์šด์˜ ๋ฐ๋ชฌ๊ณผ ์ถฉ๋Œํ•ด์š”

  • ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๋ ค๋ฉด scripts/run_tests_isolated.sh๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. (HOME/registry/log/port ๋ถ„๋ฆฌ)

Q. ์—…๋ฐ์ดํŠธ๊ฐ€ ์•ˆ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์š”

  • ์„ค์น˜๋ณธ VERSION์„ ํ™•์ธํ•˜์„ธ์š”:
    cat ~/.local/share/sari/VERSION
    
  • ํ•„์š”ํ•˜๋ฉด ๊ฐ•์ œ ์—…๋ฐ์ดํŠธ:
    curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - --update -y
    

Q. ์„ค์ • ํŒŒ์ผ์ด ์—ฌ๊ธฐ์ €๊ธฐ ์ƒ๊ฒผ์–ด์š”

  • ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์€ ๊ธ€๋กœ๋ฒŒ ์„ค์ •๊ณผ ํ”„๋กœ์ ํŠธ ์„ค์ •์ด ๋’ค์„ž์—ฌ ํ˜ผ๋ˆ์ด ์˜ค๋Š” ๊ฑธ ๊ทน๋„๋กœ ํ˜์˜คํ•ฉ๋‹ˆ๋‹ค.
    ๊ทธ๋ž˜์„œ ๊ธ€๋กœ๋ฒŒ ~/.codex/config.toml์€ ํ‰ํ™”๋กญ๊ฒŒ ์ •๋ฆฌํ•˜๊ณ , **ํ”„๋กœ์ ํŠธ๋ณ„ ์„œ๋ž(์„ค์ •)**๋งŒ ์‚ฌ์šฉํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.
    ์„ค์ •์˜ ์งˆ์„œ๊ฐ€ ๊ณง ์ฝ”๋“œ์˜ ํ‰ํ™”์ž…๋‹ˆ๋‹ค.

๐Ÿงฉ ์™œ ์„ค์ •์„ ์ž๋™์œผ๋กœ ๋‹ค ์•ˆ ๊ณ ์ณ์ฃผ๋‚˜์š”?

Codex, Gemini, Claude, Cursorโ€ฆ ์ด ๋…€์„๋“ค์€ ์„ฑ๊ฒฉ๋„ ๋‹ค๋ฅด๊ณ  ์‚ฌ๋Š” ๊ณณ(์„ค์ • ๊ฒฝ๋กœ)๋„ ์ œ๊ฐ๊ฐ์ด์—์š”.
์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์€ **โ€œ๋‚จ์˜ ์ง‘ ์•ˆ๋ฐฉ ๊ฐ€๊ตฌ ๋ฐฐ์น˜๋ฅผ ํ•จ๋ถ€๋กœ ๋ฐ”๊พธ์ง€ ์•Š๊ฒ ๋‹คโ€**๋Š” ์—„๊ฒฉํ•œ ๋„๋•์  ์ฒ ํ•™์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„
(์‚ฌ์‹ค ์ž˜๋ชป ๊ฑด๋“œ๋ฆฌ๋ฉด ์ง€์˜ฅ๋ฌธ์ด ์—ด๋ฆด ์ˆ˜ ์žˆ์–ด์„œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.) ๋Œ€์‹  ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” **๋น„๊ธ‰์„œ(์„ค์ • ์˜ˆ์‹œ)**๋Š” ์•„๋ž˜์— ์ ์–ด๋‘์—ˆ์œผ๋‹ˆ ์ง์ ‘ ์˜ฎ๊ฒจ ์ ์–ด๋ณด์‹œ๊ฒŒ๋‚˜!


๐ŸŽฎ ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜ ๋ถ€๋ ค๋จน๊ธฐ (Usage)

1๋‹จ๊ณ„: ๋‚ด ํ”„๋กœ์ ํŠธ ๊ณต๋ถ€์‹œํ‚ค๊ธฐ

์—ฌ๋Ÿฌ๋ถ„ ๊ฐœ๋ฐœ ์‹ค๋ ฅ์˜ ๊ฒฐ์ •์ฒด(ํ˜น์€ ์ง€์˜ฅ์—์„œ ์˜จ ์ŠคํŒŒ๊ฒŒํ‹ฐ ์ฝ”๋“œ)์ธ ํด๋”๋กœ ์ด๋™ํ•ด์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”. ๊ทธ๋Ÿผ ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์ด ์ง€ํŒก์ด๋ฅผ ์งš๊ณ  ๊ทธ ํด๋”๋ฅผ ์ƒ…์ƒ…์ด ๋’ค์ง€๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค!

# macOS/Linux
$HOME/.local/share/sari/bootstrap.sh init

# Windows
%LOCALAPPDATA%\sari\bootstrap.bat init

์ฐธ๊ณ : --workspace-root๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ ์ƒ๋‹˜์˜ ์ด๋™ ๋ฒ”์œ„๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ) .../bootstrap.sh init --workspace-root /path/to/my_precious_code

2๋‹จ๊ณ„: AI์—๊ฒŒ ๋ฌผ์–ด๋ณด๊ธฐ

์ด์ œ AI ์นœ๊ตฌ(Codex, Claude, Cursor ๋“ฑ)๋ฅผ ์—ด๊ณ  ํ‰์†Œ์ฒ˜๋Ÿผ ์งˆ๋ฌธํ•ด๋ณด์„ธ์š”.

"์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์˜ ์žฅ๋ถ€๋ฅผ ๋’ค์ ธ์„œ ๋กœ๊ทธ์ธ ๋กœ์ง์ด ์–ด๋А ์ง€์˜ฅ ๊ตฌ์„์— ์žˆ๋Š”์ง€ ์ฐพ์•„์ค˜."
"์ด ํ”„๋กœ์ ํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ์„ค๋ช…ํ•ด์ฃผ๊ฒŒ๋‚˜. ์‚ฌ์„œ ์„ ์ƒ๋‹˜์ด ์•„๋Š” ๋Œ€๋กœ ๋ง์ด์•ผ."

๊ทธ๋Ÿผ AI๊ฐ€ ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์—๊ฒŒ ๋‹ฌ๋ ค๊ฐ€ ์žฅ๋ถ€๋ฅผ ํ™•์ธํ•˜๊ณ , ์•„์ฃผ ์ •ํ™•ํ•œ ๋‹ต๋ณ€์„ ์—ฌ๋Ÿฌ๋ถ„๊ป˜ ์•Œ๋ ค์ค„ ๊ฑฐ์˜ˆ์š”! (๊ฐ€๋” ๋‹ต๋ณ€ ๋์— "Stay awhile and listen"์ด๋ผ๊ณ  ๋ถ™์—ฌ๋„ ๋†€๋ผ์ง€ ๋งˆ์„ธ์š”.) โœจ


๐Ÿ“Š Sari MCP vs Standard Tools (์‹ค์ธก ๊ธฐ๋ฐ˜ ๋ถ„์„)

์•„๋ž˜ ์ˆ˜์น˜๋Š” **2026-02-02 ๊ธฐ์ค€, ์‹ค์ œ ์›Œํฌ์ŠคํŽ˜์ด์Šค(636 files)**์—์„œ ์‹ค์ธกํ•œ ๋ฐ”์ดํŠธ ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.
๋ถ„์„์— ์‚ฌ์šฉ๋œ ์ €์žฅ์†Œ ์ด๋ฆ„/์ฝ”๋“œ ๋‚ด์šฉ์€ ๊ณต๊ฐœํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (๊ตฌ์กฐยทํ†ต๊ณ„๋งŒ ๊ณต๊ฐœ)
ํ† ํฐ ์ถ”์ •์€ 1,000 bytes โ‰ˆ 280 tokens ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ–ˆ์Šต๋‹ˆ๋‹ค. (๋ชจ๋ธ๋ณ„ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์ œ์™ธ)

์ธก์ • ๋ฐฉ๋ฒ• ์š”์•ฝ

  • Sari MCP: status(details), list_files, search_symbols ์‘๋‹ต์˜ ๋ฐ”์ดํŠธ ํฌ๊ธฐ ์ธก์ •
  • Standard Tools: ls -R, rg --files, rg "class.*Application" ์ถœ๋ ฅ์˜ ๋ฐ”์ดํŠธ ํฌ๊ธฐ ์ธก์ •
  • ๋™์ผ ์›Œํฌ์ŠคํŽ˜์ด์Šค/๋™์ผ ์‹œ์ /๋™์ผ ํ•„ํ„ฐ๋กœ ๋น„๊ต

1) ๊ตฌ์กฐ ํƒ์ƒ‰ (ํŒŒ์ผ ํŠธ๋ฆฌ ํŒŒ์•…)

๋„๊ตฌ ์ธก์ • ํ•ญ๋ชฉ ๋ฐ”์ดํŠธ ์ถ”์ • ํ† ํฐ
Sari status(details) 1,649 ~462
Sari list_files (limit=2000, returned=500) 115,397 ~32,311
Standard ls -R 66,146 ~18,521
Standard rg --files 73,196 ~20,495

ํ•ด์„:

  • status(details)๋Š” ๊ตฌ์กฐ ํŒŒ์•…์šฉ ์š”์•ฝ์œผ๋กœ ์ถœ๋ ฅ๋Ÿ‰์ด ๊ฐ€์žฅ ์ž‘์Šต๋‹ˆ๋‹ค.
  • list_files๋Š” JSON ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋•Œ๋ฌธ์— ์ „์ฒด ํ˜ธ์ถœ ์‹œ ์ถœ๋ ฅ๋Ÿ‰์ด ์ปค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์š”์•ฝ โ†’ repo ์ขํžˆ๊ธฐ โ†’ ์ƒ์„ธ ์ˆœ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ† ํฐ ํšจ์œจ์ด ๋†’์Šต๋‹ˆ๋‹ค.

2) ์—”ํŠธ๋ฆฌํฌ์ธํŠธ ์‹๋ณ„ (Application ํด๋ž˜์Šค ํƒ์ƒ‰)

๋„๊ตฌ ์ธก์ • ํ•ญ๋ชฉ ๋ฐ”์ดํŠธ ๊ฒฐ๊ณผ ์ˆ˜
Sari search_symbols Application 1,008 4
Standard rg "class.*Application" 667 4

ํ•ด์„:

  • ์ถœ๋ ฅ๋Ÿ‰์€ ์œ ์‚ฌํ•˜์ง€๋งŒ, Sari๋Š” ์‹ฌ๋ณผ ํƒ€์ž…/๊ฒฝ๋กœ/๋ผ์ธ์„ ๊ตฌ์กฐํ™”ํ•ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ํ›„์† ๋‹จ๊ณ„(read_symbol)๋กœ ์ด์–ด์งˆ ๋•Œ ์ถ”๊ฐ€ ํƒ์ƒ‰ ๋น„์šฉ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

3) ๊ฒฐ๋ก  (์‹ค์ธก ๊ธฐ๋ฐ˜)

Sari๋Š” โ€œ์š”์•ฝ โ†’ ์ขํžˆ๊ธฐ โ†’ ์‹ฌ๋ณผ ์ฝ๊ธฐโ€ ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ๊ฐ€์žฅ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
๋ฐ˜๋Œ€๋กœ list_files๋ฅผ ์ „์ฒด์— ๋ฌด์‹ฌ์ฝ” ํ˜ธ์ถœํ•˜๋ฉด ํ† ํฐ ๋น„์šฉ์ด ์ปค์งˆ ์ˆ˜ ์žˆ์œผ๋‹ˆ,
repo ์ง€์ • ๋˜๋Š” ์š”์•ฝ ๋ชจ๋“œ๋ฅผ ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•˜์„ธ์š”.


โšก ์„ฑ๋Šฅ๊ณผ ๋น„์šฉ ์ตœ์ ํ™” ๊ฐ€์ด๋“œ

Sari๋Š” ์ธ๋ฑ์‹ฑ + FTS ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ๊ตฌ์กฐ๋ผ์„œ **โ€œ์–ด๋–ค ๋‹จ๊ณ„์—์„œ ์“ฐ๋А๋ƒโ€**์— ๋”ฐ๋ผ ์ฒด๊ฐ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

1) ๊ตฌ์กฐ ํŒŒ์•…: ์š”์•ฝ ๋ชจ๋“œ๊ฐ€ ๊ธฐ๋ณธ

  • ๊ถŒ์žฅ: status(details) โ†’ repo_candidates โ†’ list_files(repo=...)
  • list_files๋Š” repo ๋ฏธ์ง€์ • ์‹œ ์š”์•ฝ ๋ชจ๋“œ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
    ํฐ ์›Œํฌ์ŠคํŽ˜์ด์Šค์—์„œ ์ „์ฒด ํŒŒ์ผ ๋ชฉ๋ก์„ ํ•œ ๋ฒˆ์— ๋คํ”„ํ•˜๋ฉด ๋น„์šฉ/ํ† ํฐ ํญ์ฃผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • HTTP ์š”์ฒญ์€ ์Šค๋ ˆ๋“œ๋ณ„ read ์ „์šฉ ์ปค๋„ฅ์…˜์„ ์‚ฌ์šฉํ•ด ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ํšจ์œจ์„ ๋†’์ž…๋‹ˆ๋‹ค.

2) ๊ฒ€์ƒ‰ ์†๋„: FTS๊ฐ€ ์ผœ์ ธ ์žˆ๋Š”์ง€ ํ™•์ธ

  • status(details)์—์„œ fts_enabled: true์ธ์ง€ ๋จผ์ € ํ™•์ธํ•˜์„ธ์š”.
  • fts_enabled: false๋ฉด ๊ฒ€์ƒ‰์ด LIKE ํด๋ฐฑ์œผ๋กœ ์ „ํ™˜๋˜์–ด ๋А๋ ค์ง€๊ณ  ์ •ํ™•๋„๋„ ๋–จ์–ด์ง‘๋‹ˆ๋‹ค.
  • FTS๊ฐ€ ์ผœ์ ธ ์žˆ์–ด๋„ ์•„์ฃผ ์งง์€ ์ฟผ๋ฆฌ(๊ธธ์ด < 3) ๋˜๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ํฌํ•จ ์ฟผ๋ฆฌ๋Š” LIKE๋กœ ํด๋ฐฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŒŒ์ผ ์ˆ˜๊ฐ€ ๋งŽ๊ณ  ๊ฒ€์ƒ‰์ด ๋А๋ฆฌ๋‹ค๋ฉด status(details)์— ์—”์ง„ ์ถ”์ฒœ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ ๊ธฐ์ค€: 10,000 files ์ด์ƒ์ด๋ฉด embedded(Tantivy) ๊ถŒ์žฅ
    • ์ž„๊ณ„๊ฐ’: DECKARD_ENGINE_SUGGEST_FILES
  • FTS๋Š” ์••์ถ• ํ•ด์ œ ๋ณ‘๋ชฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ fts_content ์ปฌ๋Ÿผ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (๊ฒ€์ƒ‰ CPU ๋ถ€๋‹ด ๊ฐ์†Œ)

3) ์—”ํŠธ๋ฆฌํฌ์ธํŠธ ํƒ์ƒ‰์€ ์‹ฌ๋ณผ ๊ธฐ๋ฐ˜์ด ์œ ๋ฆฌ

  • search_symbols โ†’ read_symbol ์กฐํ•ฉ์€ ํ•„์š”ํ•œ ์ฝ”๋“œ ๋ธ”๋ก๋งŒ ์ฝ์–ด ํ† ํฐ ๋น„์šฉ์„ ์ค„์ž…๋‹ˆ๋‹ค.
  • read_file์€ โ€œ์ •๋ง ์ „์ฒด ํŒŒ์ผ์ด ํ•„์š”ํ•  ๋•Œ๋งŒโ€ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ๊ตฌ์กฐ์  ๋žญํ‚น(Structural Boosting)์ด ์ ์šฉ๋˜์–ด class/function/method ์‹ฌ๋ณผ์€ ๋” ๋†’์€ ์ ์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • search๋Š” ์ •ํ™•ํ•œ ์‹ฌ๋ณผ ์ด๋ฆ„ ๋งค์นญ์— ์ถ”๊ฐ€ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

4) ํฐ ๋ ˆํฌ์ผ์ˆ˜๋ก ํ•„ํ„ฐ๋ง์ด ํ•ต์‹ฌ

  • repo, file_types, path_pattern์„ ์ ๊ทน ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ์˜ˆ) list_files { repo: "sari", file_types: ["py"] }

5) ๋Œ€๋Ÿ‰ ๋ธŒ๋žœ์น˜ ๋ณ€๊ฒฝ(Git checkout) ๋Œ€์‘

  • .git ์ด๋ฒคํŠธ ๊ฐ์ง€ ์‹œ ๊ฐœ๋ณ„ ํŒŒ์ผ ์ด๋ฒคํŠธ ๋Œ€์‹  rescan์œผ๋กœ ํ•ฉ์ณ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • debounce๋Š” DECKARD_GIT_CHECKOUT_DEBOUNCE (๊ธฐ๋ณธ 3์ดˆ)

6) ๋Œ€๋Ÿ‰ ์ด๋ฒคํŠธ ์„ฑ๋Šฅ/๋ณต๊ตฌ

  • ์ธ๋ฑ์‹ฑ ์ฝ”์–ผ๋ ˆ์Šค๋Š” Sharded Lock์œผ๋กœ ๋ถ„์‚ฐ๋˜์–ด ๋Œ€๊ทœ๋ชจ ์ด๋ฒคํŠธ์—์„œ ๋ณ‘๋ชฉ์„ ์ค„์ž…๋‹ˆ๋‹ค.
    • ์ƒค๋“œ ์ˆ˜: DECKARD_COALESCE_SHARDS (๊ธฐ๋ณธ 16)
  • ์‹คํŒจํ•œ ์ธ๋ฑ์‹ฑ ์ž‘์—…์€ DLQ(Dead Letter Queue) ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
    • ์žฌ์‹œ๋„ ๊ฐ„๊ฒฉ: 1๋ถ„ โ†’ 5๋ถ„ โ†’ 1์‹œ๊ฐ„
    • doctor์—์„œ 3ํšŒ ์ด์ƒ ์‹คํŒจํ•œ ํ•ญ๋ชฉ์„ ๊ฒฝ๊ณ ๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ› ๏ธ ๋‚ด๊ฐ€ ์“ฐ๋Š” ์•ฑ์— ์—ฐ๊ฒฐํ•˜๊ธฐ (์ƒ์„ธ ๊ฐ€์ด๋“œ)

๐Ÿค– Claude Desktop ์•ฑ ์—ฐ๋™

์„ค์ • ํŒŒ์ผ(claude_desktop_config.json)์„ ์ฐพ์•„์„œ ์•„๋ž˜ ๋‚ด์šฉ์„ ์™ ๋„ฃ์–ด์ฃผ์„ธ์š”.
์ด๊ฑด ๋งˆ์น˜ ์„ ์ƒ๋‹˜ ์ด๋ฆ„ํ‘œ๋ฅผ ๋‹ฌ์•„์ฃผ๋Š” ์ž‘์—…์ž…๋‹ˆ๋‹ค.

{
  "mcpServers": {
    "sari": {
      "command": "bash",
      "args": [
        "-lc",
        "curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; exec ~/.local/share/sari/bootstrap.sh --transport stdio"
      ],
      "env": {
        "DECKARD_WORKSPACE_ROOT": "/Users/[์‚ฌ์šฉ์ž๋ช…]/path/to/workspace",
        "DECKARD_RESPONSE_COMPACT": "1"
      }
    }
  }
}

๐Ÿงฉ Codex / Gemini ์„ค์ • ์˜ˆ์‹œ (config.toml)

[mcp_servers.sari]
command = "bash"
args = ["-lc", "curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; exec ~/.local/share/sari/bootstrap.sh --transport stdio"]
env = { DECKARD_WORKSPACE_ROOT = "/Users/[์‚ฌ์šฉ์ž๋ช…]/path/to/workspace", DECKARD_RESPONSE_COMPACT = "1" }
startup_timeout_sec = 60

ํ•„๋“œ๋ณ„ ์ƒ์„ธ ์„ค๋ช…

  • command: ์‚ฌ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.
  • command: ๊ธฐ๋ณธ์€ bash (๋„คํŠธ์›Œํฌ ์ž๋™ ์„ค์น˜ ๋ฐฉ์‹).
  • args: curl | python3๋กœ ์„ค์น˜ ํ›„ bootstrap.sh ์‹คํ–‰.
  • env: ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ฐ•์ œ๋กœ ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.
    • DECKARD_WORKSPACE_ROOT๋Š” workspace-root๋ฅผ ๊ณ ์ •ํ•˜๋ ค๊ณ  ๋„ฃ์Šต๋‹ˆ๋‹ค.
  • startup_timeout_sec: ๋ฐ๋ชฌ ๊ธฐ๋™ ๋Œ€๊ธฐ ์‹œ๊ฐ„(์ดˆ).
    ์ดˆ๊ธฐ ์ธ๋ฑ์‹ฑ์ด ๊ธธ๋‹ค๋ฉด 120~180์œผ๋กœ ๋Š˜๋ ค๋ณด์„ธ์š”.

์„ค์ • ๊ฒฝ๋กœ ์šฐ์„ ์ˆœ์œ„(์š”์•ฝ)

  1. DECKARD_CONFIG / LOCAL_SEARCH_CONFIG
  2. <workspace>/.codex/tools/sari/config/config.json
  3. ํŒจํ‚ค์ง€ ๊ธฐ๋ณธ config

๐Ÿ“ˆ ํ…”๋ ˆ๋ฉ”ํŠธ๋ฆฌ ๋กœ๊ทธ

  • tool=search/tool=list_files ๋“ฑ ๋„๊ตฌ ์‹คํ–‰ ๋กœ๊ทธ๊ฐ€ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.
  • search-first ์ •์ฑ… ์œ„๋ฐ˜/๊ฒฝ๊ณ ๋Š” ๋ณ„๋„ ๋กœ๊ทธ ํ•ญ๋ชฉ์œผ๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.

๐Ÿงต ์‘๋‹ต ์••์ถ• ๋ชจ๋“œ

  • DECKARD_RESPONSE_COMPACT=1์ด๋ฉด MCP ์‘๋‹ต JSON์ด minified๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. (๊ธฐ๋ณธ๊ฐ’)
  • DECKARD_RESPONSE_COMPACT=0์ด๋ฉด ๊ธฐ์กด pretty JSON ์ถœ๋ ฅ์œผ๋กœ ๋ณต์›๋ฉ๋‹ˆ๋‹ค.
  • list_files๋Š” compact ๋ชจ๋“œ์—์„œ paths๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (verbose ๋ชจ๋“œ์—์„œ๋งŒ files/meta)

์—ฌ๋Ÿฌ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‚˜์š”?

  • ํ˜„์žฌ๋Š” --workspace-root ๋‹จ์ผ ๊ฒฝ๋กœ๋งŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ์“ฐ๋ ค๋ฉด ๊ฐ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋งˆ๋‹ค ๋ณ„๋„ ์„ค์ •์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

env ์—†์ด๋„ ๋˜๋‚˜์š”?

  • ๋ฉ๋‹ˆ๋‹ค. args์— --workspace-root๊ฐ€ ์žˆ์œผ๋ฉด ์ •์ƒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค๋งŒ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์šฐ์„ ๋˜๋„๋ก ์‚ฌ์šฉ ํ™˜๊ฒฝ์ด ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด, ํ˜ผ์„ ์„ ์ค„์ด๋ ค๋ฉด args์™€ env๋ฅผ ๊ฐ™์ด ๋งž์ถฐ๋‘๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

args์™€ env๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅด๋ฉด?

  • DECKARD_WORKSPACE_ROOT(ํ™˜๊ฒฝ ๋ณ€์ˆ˜)๊ฐ€ ์™•์˜ ๊ถŒ์œ„๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
    ํ•˜์ง€๋งŒ ๋‘ ๊ฐ’์ด ๋‹ค๋ฅด๋ฉด ์„ ์ƒ๋‹˜์ด "์–ด๋””๋กœ ๊ฐ€๋ผ๋Š” ๊ฑด๊ฐ€!" ํ•˜๊ณ  ์ง€ํŒก์ด๋ฅผ ํœ˜๋‘๋ฅด์‹ค ํ…Œ๋‹ˆ, ํ•ญ์ƒ ๋™์ผํ•˜๊ฒŒ ๋งž์ถ”๋Š” ๊ฑธ ์ถ”์ฒœํ•˜๋„ค.

๐Ÿ’ก Cursor/CLI์—์„œ ์˜ต์…˜ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•

Cursor/Claude/Gemini/Codex ๊ฐ™์€ MCP ํด๋ผ์ด์–ธํŠธ๋Š” env ๋ธ”๋ก์œผ๋กœ ์˜ต์…˜ ์ฃผ์ž…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
CLI๋งŒ ์“ฐ๋Š” ๊ฒฝ์šฐ์—” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

A) ์‰˜์—์„œ ์ง์ ‘ env ์ง€์ •

DECKARD_ENGINE_TOKENIZER=cjk DECKARD_ENGINE_AUTO_INSTALL=1 \
  ~/.local/share/sari/bootstrap.sh --transport stdio

B) ๋ž˜ํผ ์Šคํฌ๋ฆฝํŠธ

#!/usr/bin/env bash
export DECKARD_ENGINE_TOKENIZER=cjk
export DECKARD_ENGINE_AUTO_INSTALL=1
exec ~/.local/share/sari/bootstrap.sh --transport stdio

--workspace-root๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์–ด๋–ค ์žฌ์•™์ด?

  • ์‹คํ–‰ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์›Œํฌ์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฉ‹๋Œ€๋กœ ์ถ”์ •ํ•ฉ๋‹ˆ๋‹ค.
    • ํ˜„์žฌ ํด๋” ๋˜๋Š” ์ƒ์œ„ ํด๋”์— .codex-root๊ฐ€ ์žˆ์œผ๋ฉด "์ฐพ์•˜๋‹ค!" ํ•˜๊ณ  ์‚ฌ์šฉ
    • ์—†๋‹ค๋ฉด ํ˜„์žฌ ํด๋” ์ „์ฒด๋ฅผ ์ž๊ธฐ ์•ˆ๋ฐฉ์ธ ์ค„ ์••๋‹ˆ๋‹ค.

์˜ˆ: ํ™ˆ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์‹ค์ˆ˜๋กœ ์‹คํ–‰ํ•˜๋ฉด?

  • ์˜๋„์น˜ ์•Š๊ฒŒ ์—ฌ๋Ÿฌ๋ถ„์˜ '๋น„๋ฐ€ ์‚ฌ์ง„์ฒฉ'๊ณผ '๋‹ค์šด๋กœ๋“œ ํด๋”' ์ „์ฒด๊ฐ€ ํ˜ธ๋ผ๋“œ๋ฆผ ์žฅ๋ถ€์— ๊ธฐ๋ก๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ •์‹  ๊ฑด๊ฐ•์„ ์œ„ํ•ด --workspace-root๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํ•˜๊ณ  ๊ฐ„์ ˆํ•˜๊ฒŒ ์ถ”์ฒœํ•˜๋„ค.

์„ค์ • ํŒŒ์ผ์ด ๋‘ ๊ตฐ๋ฐ ์žˆ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

  • ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์€ **ํ”„๋กœ์ ํŠธ ์„ค์ •(ํ˜„์žฅ ์ค‘์‹ฌ)**์„ ๊ฐ€์žฅ ์‹ ๋ขฐํ•ฉ๋‹ˆ๋‹ค.
    ๊ธ€๋กœ๋ฒŒ ์„ค์ •๊ณผ ํ•จ๊ป˜ ์กด์žฌํ•˜๋ฉด ์„ ์ƒ๋‹˜์ด ํ—ท๊ฐˆ๋ คํ•˜์‹œ๋‹ˆ,
    install.py๋Š” ์ž๋น„๋กญ๊ฒŒ ๊ธ€๋กœ๋ฒŒ์˜ sari ๋ธ”๋ก์„ ์ œ๊ฑฐํ•ด ๋ฒ„๋ฆฐ๋‹ค๋„ค. (์˜ค์ง ์งˆ์„œ!)

โŒจ๏ธ Cursor (AI ์—๋””ํ„ฐ) ์—ฐ๋™

  1. ํ™˜๊ฒฝ์„ค์ •(Settings) > MCP ๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•˜์„ธ์š”.
  2. + Add New MCP Server ๋ฒ„ํŠผ์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.
  3. ์ด๋ฆ„์—” sari, ํƒ€์ž…์€ stdio๋ฅผ ์„ ํƒํ•˜์„ธ์š”.
  4. Command ์นธ์— /Users/[์‚ฌ์šฉ์ž๋ช…]/.local/share/sari/bootstrap.sh๋ฅผ ์ž…๋ ฅํ•˜๊ณ  'Save' ํ•˜๋ฉด ๋!

๐Ÿ—‘๏ธ ๋„์„œ๊ด€ ํ์‡„ (์‚ญ์ œ ๋ฐฉ๋ฒ• - Uninstall)

์ด์ œ ์„ฑ์—ญ์— ํ‰ํ™”๊ฐ€ ์ฐพ์•„์™”๊ฑฐ๋‚˜, ์„ ์ƒ๋‹˜์˜ ์ž”์†Œ๋ฆฌ๊ฐ€ ๋“ฃ๊ธฐ ์‹ซ๋‹ค๋ฉด ์–ธ์ œ๋“  ๋ณด๋‚ด๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์— ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”. (๋ˆˆ๋ฌผ ์ฃผ์˜)

# ๋งˆ๋ฒ• ์ฃผ๋ฌธ์— --uninstall ์˜ต์…˜์„ ๋ถ™์ด๋ฉด ์„ ์ƒ๋‹˜์ด ์ง์„ ์‹ธ์„œ ๋– ๋‚˜์‹ญ๋‹ˆ๋‹ค.
curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - --uninstall

๋˜๋Š” ์„ค์น˜๋ณธ ๊ธฐ์ค€์œผ๋กœ ์ด๋ ‡๊ฒŒ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค:

# macOS/Linux
~/.local/share/sari/bootstrap.sh uninstall

# Windows
%LOCALAPPDATA%\sari\bootstrap.bat uninstall

์‚ญ์ œํ•˜๋ฉด ๋ฌด์—‡์ด ์ •ํ™”๋˜๋‚˜์š”? (์ด๋ณ„์˜ ๋ฏธํ•™)

  • ๊ฑฐ์ฒ˜ ์ •ํ™”: ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜์ด ๋จธ๋ฌผ๋˜ ๋„์„œ๊ด€๊ณผ ๋‚ก์€ ์žฅ๋ถ€(index.db)๋ฅผ ํŠธ๋ฆฌ์ŠคํŠธ๋Ÿผ์˜ ๋ถˆ๊ธธ๋กœ ์†Œ๋ฉธ์‹œํ‚ต๋‹ˆ๋‹ค.
  • ์Œ๋‘ฅ์ด ์œ ๋ น ํ‡ด์น˜: install.py --uninstall์€ Codex์™€ Gemini ์–‘์ชฝ์˜ ์ธ์žฅ์„ ๋ชจ๋‘ ์ง€์›Œ๋ฒ„๋ฆฌ๋Š” ๊ฐ•๋ ฅํ•œ ์ •ํ™” ์˜์‹์„ ๊ฑฐํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ์„ ํƒ์  ์ž‘๋ณ„: bootstrap.sh uninstall์€ ์˜ค์ง Codex์˜ ์ธ์žฅ๋งŒ ์ง€์šฐ๊ณ  ๋– ๋‚˜๋Š” ์ ˆ์ œ๋œ ์ด๋ณ„์„ ์„ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. (Gemini/Claude ๋“ฑ์€ ๊ทธ๋Œ€๋กœ ๋‚จ์Šต๋‹ˆ๋‹ค.)
  • ์œˆ๋„์šฐ ์ฃผ์˜: bootstrap.bat uninstall์€ ์„ค์ • ํŒŒ์ผ์„ ์ •๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•˜๋ฉด ์ˆ˜๋™์œผ๋กœ config.toml์—์„œ sari ๋ธ”๋ก์„ ์ œ๊ฑฐํ•˜์„ธ์š”.
  • ๊น”๋”ํ•œ ์Šน์ฒœ: ์—ฌ๋Ÿฌ๋ถ„์˜ ์ปดํ“จํ„ฐ์— ๊ทธ ์–ด๋–ค ์ง€์˜ฅ์˜ ์ฐŒ๊บผ๊ธฐ๋„ ๋‚จ๊ธฐ์ง€ ์•Š๊ณ  ๊ณ ๊ฒฐํ•˜๊ฒŒ ์‚ฌ๋ผ์ง€์‹ญ๋‹ˆ๋‹ค!

๐Ÿค– MCP ์‘๋‹ต ํฌ๋งท (PACK1) ๊ฐ€์ด๋“œ

์‚ฌ๋ฆฌ v2.5.0๋ถ€ํ„ฐ๋Š” ํ† ํฐ ์ ˆ์•ฝ์„ ์œ„ํ•ด PACK1์ด๋ผ๋Š” ์••์ถ• ํ…์ŠคํŠธ ํฌ๋งท์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JSON์˜ ๋ถˆํ•„์š”ํ•œ ๊ด„ํ˜ธ์™€ ๊ณต๋ฐฑ์„ ์ œ๊ฑฐํ•˜์—ฌ ์•ฝ 30~50%์˜ ํ† ํฐ์„ ์ ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.

1. ํฌ๋งท ๊ฐœ์š”

  • ํ—ค๋”(Header): PACK1 <tool> key=value ...
  • ๋ ˆ์ฝ”๋“œ(Record): <type>:<payload> (ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ)
  • ์ธ์ฝ”๋”ฉ: ํŠน์ˆ˜๋ฌธ์ž๋‚˜ ๊ณต๋ฐฑ์ด ํฌํ•จ๋œ ๊ฐ’์€ ์•ˆ์ „ํ•˜๊ฒŒ URL ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค.
    • ENC_ID: ์‹๋ณ„์ž์šฉ (๊ฒฝ๋กœ, ์ด๋ฆ„ ๋“ฑ). safe="/._-:@"
    • ENC_TEXT: ์ผ๋ฐ˜ ํ…์ŠคํŠธ์šฉ (์Šค๋‹ˆํŽซ, ๋ฉ”์‹œ์ง€ ๋“ฑ). safe=""

2. ์ฃผ์š” ๋„๊ตฌ ์˜ˆ์‹œ

list_files

PACK1 list_files offset=0 limit=100 returned=2 total=2 total_mode=exact
p:src/main.py
p:src/utils.py

search_symbols

PACK1 search_symbols q=User limit=50 returned=1 total_mode=none
h:repo=my-repo path=src/user.py line=10 kind=class name=User

status

PACK1 status returned=5
m:index_ready=true
m:scanned_files=100
m:indexed_files=100
m:errors=0
m:fts_enabled=true

3. ์—๋Ÿฌ ์ฝ”๋“œ (Error Codes)

์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ PACK1 <tool> ok=false ํ—ค๋”์™€ ํ•จ๊ป˜ ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์„ค๋ช…
INVALID_ARGS ์ž˜๋ชป๋œ ์ธ์ž ์ „๋‹ฌ
NOT_INDEXED ์ธ๋ฑ์‹ฑ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์Œ
REPO_NOT_FOUND ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ €์žฅ์†Œ
IO_ERROR ํŒŒ์ผ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์‹คํŒจ
DB_ERROR ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ฅ˜
INTERNAL ๋‚ด๋ถ€ ์„œ๋ฒ„ ์˜ค๋ฅ˜

์ฐธ๊ณ : ๊ธฐ์กด JSON ํฌ๋งท์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ํ™˜๊ฒฝ๋ณ€์ˆ˜ DECKARD_FORMAT=json์„ ์„ค์ •ํ•˜์„ธ์š”. (๋””๋ฒ„๊น…์šฉ) ์—๋Ÿฌ์—๋Š” hint๊ฐ€ ํ•จ๊ป˜ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: run scan_once, run sari doctor)


๐Ÿฉบ MCP status/doctor ๊ฒฝ๊ณ  ์•ˆ๋‚ด

์•„๋ž˜ ์ƒํƒœ๋Š” MCP status/doctor์—์„œ ๊ฒฝ๊ณ ๋กœ ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

1) tokenizer ๋“ฑ๋ก ์‹คํŒจ
engine tokenizers not registered; using default tokenizer

2) ํ”Œ๋žซํผ์šฉ ๋ฒˆ๋“ค ๋ˆ„๋ฝ
tokenizer bundle not found for <platform_tag>

ํ•ด๊ฒฐ:

  • app/engine_tokenizer_data/์— ํ•ด๋‹น OS์šฉ wheel ํฌํ•จ
  • ํ•„์š” ์‹œ scripts/prune_tokenizer_bundles.sh๋กœ ์ •๋ฆฌ

๐Ÿ—๏ธ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ œ์› (Tech Specs)

  • ์–ธ์–ด: Python 3.9+ (ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ œ๋กœ ๋””ํŽœ๋˜์‹œ!)
  • DB: SQLite (WAL ๋ชจ๋“œ) + FTS5 (์ „๋ฌธ ๊ฒ€์ƒ‰ ๊ธฐ์ˆ )
  • ํ†ต์‹ : MCP (Model Context Protocol)
  • ๊ตฌ์กฐ:
    • Daemon: ์‹ค์ œ๋กœ ๊ณต๋ถ€ํ•˜๊ณ  ๊ฒ€์ƒ‰์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ ๋ณธ์ฒด
    • Proxy: AI ์•ฑ๊ณผ Daemon ์‚ฌ์ด์˜ ๋น ๋ฅธ ๋ฉ”์‹ ์ €

๐Ÿง  ์ง€์‹ ๋„๊ตฌ (Call Graph / Snippet / Context / Dry-run Diff)

1) Call Graph (ํ˜ธ์ถœ ๊ด€๊ณ„)

MCP tool: call_graph
CLI:

sari call-graph --symbol process_file --depth 2
# ์‹ฌ๋ณผ์ด ๊ฒน์น  ๋•Œ๋Š” symbol_id๋กœ ์ •ํ™•ํžˆ ์ง€์ •
sari call-graph --symbol-id "<sid>" --depth 2
# ํŠธ๋ฆฌ ์ถœ๋ ฅ
sari call-graph --symbol process_file --depth 2 --format tree
# ๊ฒฝ๋กœ ํ•„ํ„ฐ
sari call-graph --symbol process_file --include-path sari/core --exclude-path tests
# ์ •๋ ฌ ๊ธฐ์ค€
sari call-graph --symbol process_file --format tree --sort name

์„ค๋ช…:

  • search_symbols ๊ฒฐ๊ณผ์— qualname/symbol_id๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • symbol_id๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ํ˜ธ์ถœ ๊ด€๊ณ„๊ฐ€ ํ›จ์”ฌ ์ •ํ™•ํ•˜๊ฒŒ ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค.
  • DECKARD_CALLGRAPH_PLUGIN์œผ๋กœ ์ •์  ๋ถ„์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์—ฌ๋Ÿฌ ๊ฐœ๋Š” ์‰ผํ‘œ๋กœ ์—ฐ๊ฒฐ: mod1,mod2
    • augment_neighbors(direction, neighbors, context) ๋˜๋Š” filter_neighbors(...) ๊ตฌํ˜„ ๊ฐ€๋Šฅ.
    • ์—๋Ÿฌ ๋กœ๊ทธ: DECKARD_CALLGRAPH_PLUGIN_LOG=/tmp/callgraph.log
  • ์ •ํ™•๋„ ํžŒํŠธ๊ฐ€ precision_hint๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค (์–ธ์–ด๋ณ„ ์„ธ๋ถ„ํ™”).
  • search_symbols ๊ฒฐ๊ณผ์—๋„ precision_hint๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
    • ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ: DECKARD_CALLGRAPH_PLUGIN_MANIFEST=/path/to/manifest.json
    • ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์Šคํ‚ค๋งˆ:
      • JSON ๋ฆฌ์ŠคํŠธ: ["mod1", "mod2"]
      • ๋˜๋Š” ๊ฐ์ฒด: {"plugins": ["mod1", "mod2"]}
    • strict ๊ฒ€์ฆ: DECKARD_CALLGRAPH_PLUGIN_MANIFEST_STRICT=1
    • call_graph_health์—์„œ API ๋ถˆ์ผ์น˜/๋กœ๋“œ ์‹คํŒจ ์›์ธ ํ™•์ธ ๊ฐ€๋Šฅ
    • quality_score (0-100)๋กœ ์ •์  ํ•ด์„ ์‹ ๋ขฐ๋„ ์ œ๊ณต (ํŒŒ์ผ ํฌ๊ธฐ/๊ด€๊ณ„ ๋ฐ€๋„ ๋ฐ˜์˜)

์–ธ์–ด๋ณ„ ํŠน์ด์‚ฌํ•ญ:

  • Python: AST ๊ธฐ๋ฐ˜, ์ •ํ™•๋„ ๋†’์Œ. ๋™์  ํ˜ธ์ถœ/๋ฆฌํ”Œ๋ ‰์…˜์€ ํ•œ๊ณ„.
  • JS/TS/Java/Kotlin/Go/C/C++: ์ •๊ทœ์‹ ๊ธฐ๋ฐ˜ ํŒŒ์„œ๋กœ ํ˜ธ์ถœ ๊ด€๊ณ„ ์ •๋ฐ€๋„ ๋‚ฎ์Œ.
    • ์˜ค๋ฒ„๋กœ๋“œ/์ธํ„ฐํŽ˜์ด์Šค/๋ฆฌํ”Œ๋ ‰์…˜/๋™์  ๋””์ŠคํŒจ์น˜์— ์•ฝํ•จ.
    • ๋™์ผ ์ด๋ฆ„ ์‹ฌ๋ณผ ์ถฉ๋Œ ๊ฐ€๋Šฅ โ†’ symbol_id ๊ถŒ์žฅ.

2) Save / Get Snippet

MCP tools: save_snippet, get_snippet
CLI:

sari save-snippet --path "core/db.py:100-150" --tag "db-connection-pattern"
sari get-snippet --tag "db-connection-pattern"
sari get-snippet --tag "db-connection-pattern" --history
sari get-snippet --tag "db-connection-pattern" --no-remap
sari get-snippet --tag "db-connection-pattern" --update
sari get-snippet --tag "db-connection-pattern" --update --diff-path /tmp/snippet.diff

์„ค๋ช…:

  • ์ €์žฅ ์‹œ ์Šค๋‹ˆํŽซ ์ฃผ๋ณ€ ์•ต์ปค(์•ž/๋’ค ๋ผ์ธ)๋ฅผ ํ•จ๊ป˜ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ผ์ด ๋ฐ”๋€Œ์–ด๋„ get_snippet์€ ์•ต์ปค/๋‚ด์šฉ ๋งค์นญ์œผ๋กœ ์ž๋™ ์žฌ๋งคํ•‘(remap)ํ•ฉ๋‹ˆ๋‹ค.
  • ์Šค๋‹ˆํŽซ ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๋ฉด ์ด์ „ ๋ฒ„์ „์ด snippet_versions์— ์ž๋™ ๋ณด๊ด€๋ฉ๋‹ˆ๋‹ค.
  • --update๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ๋งคํ•‘๋œ ์œ„์น˜/๋‚ด์šฉ์„ DB์— ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆฌ๋งคํ•‘ ๊ฒฐ๊ณผ์—๋Š” diff(๋ณ€๊ฒฝ ์š”์•ฝ)๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.
  • --diff-path๋ฅผ ์ง€์ •ํ•˜๋ฉด diff๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • --diff-path๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋Š” ~/.cache/sari/snippet-diffs/<tag>.diff ์ž…๋‹ˆ๋‹ค.
  • --update ์‹œ ์ €์žฅ๋œ ์Šค๋ƒ…์ƒท: <tag>_<id>_<ts>_stored.txt, <tag>_<id>_<ts>_current.txt
  • ๋ฆฌ๋งคํ•‘์ด ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ์—…๋ฐ์ดํŠธ๊ฐ€ ์Šคํ‚ต๋ฉ๋‹ˆ๋‹ค (update_skipped_reason).

3) Archive / Get Context

MCP tools: archive_context, get_context
CLI:

sari archive-context --topic "PricingLogic" --content "์ฟ ํฐ ์ ์šฉ ์ „ ํ• ์ธ ๊ณ„์‚ฐ" --related-files core/pricing.py api/payment.py
sari archive-context --topic "PricingLogic" --content "..." --source "issue-102" --valid-from 2024-02-01
sari get-context --topic "PricingLogic"
sari get-context --query "Pricing" --as-of 2024-06-01

์„ค๋ช…:

  • source, valid_from, valid_until, deprecated๋ฅผ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • get_context --as-of๋Š” ์‹œ์  ๊ธฐ์ค€์œผ๋กœ ์œ ํšจํ•œ ์ปจํ…์ŠคํŠธ๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

4) Dry-run Diff

MCP tool: dry_run_diff
CLI:

sari dry-run-diff --path core/db.py --content "$(cat /tmp/new_db.py)"
sari dry-run-diff --path core/db.py --content "$(cat /tmp/new_db.py)" --lint

์„ค๋ช…:

  • ๊ธฐ๋ณธ์€ ๊ตฌ๋ฌธ ์ฒดํฌ๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • --lint ๋˜๋Š” DECKARD_DRYRUN_LINT=1 ์„ค์ • ์‹œ, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฐํ„ฐ(ruff/eslint)๊ฐ€ ์žˆ์œผ๋ฉด ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงฐ Composite Tool (grep_and_read)

MCP tool: grep_and_read
์„ค๋ช…:

  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ƒ์œ„ N๊ฐœ ํŒŒ์ผ์„ ์ฆ‰์‹œ ์ฝ์–ด์˜ต๋‹ˆ๋‹ค.
  • search โ†’ read_file ๋ฐ˜๋ณต์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ํ† ํฐ/ํ„ด ์ ˆ๊ฐ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ:

{ "name": "grep_and_read", "arguments": { "query": "process_file", "limit": 5, "read_limit": 2 } }

๐Ÿฉบ ์ง„๋‹จ (Doctor)

CLI:

sari doctor
sari doctor --auto-fix
sari doctor --auto-fix --auto-fix-rescan

์„ค๋ช…:

  • --auto-fix๋Š” ๊ฐ€๋Šฅํ•œ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์ž๋™ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • --auto-fix-rescan์€ ์ž๋™ ์ˆ˜์ • ์ดํ›„ scan_once๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ์ง„ํ–‰ ์ƒํƒœ๋Š” Auto Fix Rescan Start / Auto Fix Rescan ํ•ญ๋ชฉ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
    • ์ž๋™ ์ˆ˜์ •์ด ์‹คํŒจํ•˜๋ฉด Auto Fix Rescan Skipped๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

โœ… ์—ฃ์ง€ ํ…Œ์ŠคํŠธ

scripts/run_edge_tests.sh

CI ํฌํ•จ:

scripts/run_tests_isolated.sh

๐Ÿ”Œ Call-Graph ํ”Œ๋Ÿฌ๊ทธ์ธ ํ—ฌ์Šค ์ฒดํฌ

MCP tool: call_graph_health


๐Ÿ” DB ๋‹จ์ผ Writer ์ •์ฑ… (์ค‘์š”)

Sari๋Š” SQLite์˜ ๋‹จ์ผ writer ์›์น™์„ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.

  • ์“ฐ๊ธฐ ์ž‘์—…์€ DBWriter ์ „์šฉ ์Šค๋ ˆ๋“œ์—์„œ๋งŒ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ๋‚ด๋ถ€์—์„œ ๋ณ„๋„ writer ์ปค๋„ฅ์…˜์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ง์ ‘ DB ์“ฐ๊ธฐ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด DB write attempted outside single-writer thread ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, DB ์“ฐ๊ธฐ๋Š” ํ•ญ์ƒ ์ธ๋ฑ์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด์„œ๋งŒ ์ˆ˜ํ–‰๋˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์™ธ๋ถ€ ํ™•์žฅ/์Šคํฌ๋ฆฝํŠธ์—์„œ DB๋ฅผ ์ง์ ‘ ์“ฐ๋Š” ๊ฒƒ์€ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๐Ÿ“œ ๋ผ์ด์„ ์Šค (License)

์ด ํ”„๋กœ์ ํŠธ๋Š” Apache License 2.0์„ ๋”ฐ๋ฅด๊ณ  ์žˆ์–ด์š”. ๋ˆ„๊ตฌ๋‚˜ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ , ๊ณ ์น˜๊ณ , ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฐฐํฌ ์‹œ NOTICE ํŒŒ์ผ์˜ ๊ณ ์ง€์‚ฌํ•ญ๋„ ํ•จ๊ป˜ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


"์ž, ์ด์ œ ์‚ฌ๋ฆฌ ์„ ์ƒ๋‹˜๊ณผ ํ•จ๊ป˜ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ฝ”๋“œ ์†์— ์ˆจ๊ฒจ์ง„ ๋น„๋ฐ€์„ ์ฐพ์•„๋ณด์‹œ๊ฒ ๋‚˜?" ๐Ÿง™โ€โ™‚๏ธโœจ

Project details


Release history Release notifications | RSS feed

This version

0.1.1

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sari-0.1.1.tar.gz (71.7 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sari-0.1.1-py3-none-any.whl (71.7 MB view details)

Uploaded Python 3

File details

Details for the file sari-0.1.1.tar.gz.

File metadata

  • Download URL: sari-0.1.1.tar.gz
  • Upload date:
  • Size: 71.7 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for sari-0.1.1.tar.gz
Algorithm Hash digest
SHA256 5e42e38dfb25bc9c25fb5eebba8e7a410b669820c1a1f2b4c6f46870495596cd
MD5 402fcc46b5bc9e0a679165f05e87ca17
BLAKE2b-256 9c9a9319912b509082f8c80e2c921fd15052b9efa3005962319d83e80e2028f6

See more details on using hashes here.

File details

Details for the file sari-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: sari-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 71.7 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for sari-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b4e1772710b6d803adeb77ba00883df9152642da350d1d1c5289d8aa966f94e2
MD5 b44dbf606494a45f8fa954607e807efc
BLAKE2b-256 e9370de98fa04e6024468fcdc866e239c5eeffe5d1ce24a6c6499f46db5bb680

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page