Skip to content

Latest commit

ย 

History

History
550 lines (392 loc) ยท 24.3 KB

File metadata and controls

550 lines (392 loc) ยท 24.3 KB

csp โ€” Code Search Please
์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•œ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•œ ์ฝ”๋“œ ๊ฒ€์ƒ‰
grep+read ๋Œ€๋น„ ์•ฝ 98% ์ ์€ ํ† ํฐ ์‚ฌ์šฉ

English | ํ•œ๊ตญ์–ด

ํ€ต์Šคํƒ€ํŠธ โ€ข MCP ์„œ๋ฒ„ โ€ข AGENTS.md โ€ข CLI โ€ข ๋™์ž‘ ์›๋ฆฌ

Rust ํฌํŠธ. csp๋Š” Python์œผ๋กœ ์ž‘์„ฑ๋œ MinishLab/semble์˜ Rust ํฌํŠธ์ž…๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์„ค๊ณ„์˜ ๋ชจ๋“  ๊ณต๋กœ๋Š” ์›์ €์ž์—๊ฒŒ ์žˆ์Šต๋‹ˆ๋‹ค. Rust ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” Homebrew์™€ npm์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ์ž์ฒด ์™„๊ฒฐํ˜• ์‹คํ–‰ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค(Homebrew ๋นŒ๋“œ๋Š” ๋Ÿฐํƒ€์ž„์ด ํ•„์š” ์—†์Œ).

csp๋Š” ์—์ด์ „ํŠธ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋œ ์ฝ”๋“œ ๊ฒ€์ƒ‰ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, grep + read ์กฐํ•ฉ ๋Œ€๋น„ ์•ฝ 98% ์ ์€ ํ† ํฐ๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ธ๋ฑ์‹ฑ๊ณผ ๊ฒ€์ƒ‰์ด 1์ดˆ ์ด๋‚ด์— ๋๋‚˜๋ฉฐ, API ํ‚ค, GPU, ์™ธ๋ถ€ ์„œ๋น„์Šค ์—†์ด CPU ์œ„์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. MCP ์„œ๋ฒ„๋กœ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ AGENTS.md ์•ˆ๋‚ด๋กœ ์…ธ์—์„œ ํ˜ธ์ถœํ•˜๋ฉด Claude Code, Cursor, Codex, OpenCode ๋“ฑ ์–ด๋–ค ์—์ด์ „ํŠธ๋ผ๋„ ์ž„์˜์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ฆ‰์‹œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ€ต์Šคํƒ€ํŠธ

์—์ด์ „ํŠธ๋Š” "์ธ์ฆ์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋‚˜์š”?" ๊ฐ™์€ ์ž์—ฐ์–ด๋กœ csp์— ์งˆ์˜ํ•˜๊ณ , ๊ด€๋ จ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ๋งŒ ๋ฐ›์•„๋ด…๋‹ˆ๋‹ค. grep ํ•˜๊ฑฐ๋‚˜ ์ „์ฒด ํŒŒ์ผ์„ ์ฝ์„ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

csp๋Š” ์„ธ ๊ฐ€์ง€ ๋ณด์™„์ ์ธ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์…‹ ๋‹ค ํ•จ๊ป˜ ์“ฐ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ, ํ•„์š”์— ๋”ฐ๋ผ ๊ณจ๋ผ ์“ฐ์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

  • MCP ์„œ๋ฒ„: ์—์ด์ „ํŠธ๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” MCP ์„œ๋ฒ„.
  • AGENTS.md: CLI ํ˜ธ์ถœ ์ง€์นจ์„ ๋‹ด์€ AGENTS.md ์Šค๋‹ˆํŽซ.
  • ์„œ๋ธŒ ์—์ด์ „ํŠธ: ์ง€์› ํ•˜๋‹ˆ์Šค๋ฅผ ์œ„ํ•œ ์ „์šฉ csp-search ์„œ๋ธŒ ์—์ด์ „ํŠธ.

MCP

csp๋ฅผ MCP ๋„ค์ดํ‹ฐ๋ธŒ ๋„๊ตฌ๋กœ ๋…ธ์ถœ์‹œ์ผœ ์—์ด์ „ํŠธ๊ฐ€ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. Claude Code์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

claude mcp add csp -s user -- bunx @pleaseai/csp mcp

๋‹ค๋ฅธ ํ•˜๋‹ˆ์Šค(Cursor, Codex, OpenCode ๋“ฑ)๋Š” ์•„๋ž˜ MCP ์„œ๋ฒ„ ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ํ”Œ๋Ÿฌ๊ทธ์ธ (Claude Code & Codex)

csp๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค. MCP ์„œ๋ฒ„์™€ csp-search ํ—ฌํผ๋ฅผ ํ•œ ๋ฒˆ์— ๋“ฑ๋กํ•˜๋ฉฐ, ๋™์ผํ•œ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ Claude Code์™€ Codex ์–‘์ชฝ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

Claude Code:

/plugin marketplace add pleaseai/claude-code-plugins
/plugin install csp@pleaseai

Codex:

codex plugin marketplace add pleaseai/claude-code-plugins
codex plugin add csp@pleaseai

csp MCP ์„œ๋ฒ„(search, find_related)์™€ ํ•จ๊ป˜ csp-search ์„œ๋ธŒ์—์ด์ „ํŠธ(Claude Code) / ์Šคํ‚ฌ(Codex)์„ ๋ฒˆ๋“คํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฅผ bunx๋กœ ์‹คํ–‰ํ•˜๋ ค๋ฉด PATH์— Bun์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ plugins/csp๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

AGENTS.md

์—์ด์ „ํŠธ์˜ ์ปจํ…์ŠคํŠธ์— csp ์‚ฌ์šฉ๋ฒ•์„ ์ถ”๊ฐ€ํ•ด ์–ธ์ œ ์–ด๋–ป๊ฒŒ CLI๋ฅผ ํ˜ธ์ถœํ• ์ง€ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ € csp CLI๋ฅผ ์„ค์น˜ํ•œ ๋’ค, ์•„๋ž˜ ์Šค๋‹ˆํŽซ์„ AGENTS.md ๋˜๋Š” CLAUDE.md์— ์ถ”๊ฐ€ํ•˜์„ธ์š”.

# Homebrew (macOS / Linux) โ€” Node/Bun ์—†์ด ๋™์ž‘ํ•˜๋Š” ๋…๋ฆฝ ์‹คํ–‰ ๋ฐ”์ด๋„ˆ๋ฆฌ
brew install pleaseai/tap/csp

# ๋˜๋Š” ๋…๋ฆฝ ์‹คํ–‰ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ง์ ‘ ๋‚ด๋ ค๋ฐ›๊ธฐ (ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ๋ถˆํ•„์š”)
curl -fsSL https://raw.githubusercontent.com/pleaseai/code-search/main/scripts/install.sh | bash

# ๋˜๋Š” JavaScript ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ ์„ค์น˜ (PATH์— Bun ๋˜๋Š” Node 22+ ํ•„์š”)
bun add -g @pleaseai/csp     # bun์œผ๋กœ ์„ค์น˜ (๊ถŒ์žฅ)
npm install -g @pleaseai/csp # ๋˜๋Š” npm
pnpm add -g @pleaseai/csp    # ๋˜๋Š” pnpm

# ๋˜๋Š” Cargo๋กœ ์†Œ์Šค์—์„œ ์„ค์น˜ (standalone ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋กœ์ปฌ์—์„œ ์ปดํŒŒ์ผ)
cargo install code-search-please

Homebrew formula๋Š” ์ž์ฒด ์™„๊ฒฐํ˜• Rust ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(cargo build --release; tree-sitter ๋ฌธ๋ฒ•ยท์ž„๋ฒ ๋”ฉ ๋Ÿฐํƒ€์ž„ ๋‚ด์žฅ)๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„์— Node/Bun์ด ํ•„์š” ์—†์Šต๋‹ˆ๋‹ค. install.sh ์Šคํฌ๋ฆฝํŠธ๋Š” ํ”Œ๋žซํผ์— ๋งž๋Š” ๋™์ผํ•œ ๋…๋ฆฝ ์‹คํ–‰ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ GitHub ๋ฆด๋ฆฌ์Šค์—์„œ ๋‚ด๋ ค๋ฐ›์•„ ์ฒดํฌ์„ฌ์„ ๊ฒ€์ฆํ•œ ๋’ค ~/.local/bin์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค(CSP_INSTALL_DIR๋กœ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ, bash -s -- --version v0.1.7๋กœ ๋ฒ„์ „ ๊ณ ์ • ๊ฐ€๋Šฅ). npm ํŒจํ‚ค์ง€๋Š” ๋™์ผํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์ž‘์€ Node ๋Ÿฐ์ฒ˜ ๋’ค์— ๋‹ด์•„ ๋ฐฐํฌํ•˜๋ฏ€๋กœ, npm/bun/pnpm ์„ค์น˜ ๊ฒฝ๋กœ๋Š” PATH์— Bun ๋˜๋Š” Node 22+๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ธ๋ฑ์Šค๋Š” ~/.csp/์— ์บ์‹œ๋ฉ๋‹ˆ๋‹ค(ADR 0002 ์ฐธ๊ณ ).

AGENTS.md / CLAUDE.md ์Šค๋‹ˆํŽซ
## Code Search

์ฝ”๋“œ๋ฅผ grep ์œผ๋กœ ์ฐพ๊ธฐ ์ „์— `csp search`๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋™์ž‘์„ ์ž์—ฐ์–ด๋กœ ์„ค๋ช…ํ•˜๊ฑฐ๋‚˜ ์‹ฌ๋ณผ/์‹๋ณ„์ž๋ช…์„ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

```bash
csp search "authentication flow" ./my-project
csp search "saveCheckpoint" ./my-project
csp search "save model to disk" ./my-project --top-k 10
```

์—ฌ๋Ÿฌ ๋ฒˆ ๊ฒ€์ƒ‰ํ•  ์˜ˆ์ •์ด๋ผ๋ฉด `csp index`๋กœ ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“ค์–ด ๋‘์„ธ์š”.

```bash
csp index ./my-project -o my_index
```

์ดํ›„ ์ธ๋ฑ์Šค๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```bash
csp search "saveCheckpoint" --index my_index
```

์ธ๋ฑ์Šค๋Š” ์ž๋™์œผ๋กœ ๊ฐฑ์‹ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ํฌ๊ฒŒ ๋ฐ”๋€Œ์—ˆ๊ฑฐ๋‚˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์˜ค๋ž˜๋œ ๊ฒƒ ๊ฐ™๋‹ค๋ฉด ๋‹ค์‹œ ์ธ๋ฑ์‹ฑํ•˜์„ธ์š”.

`--content docs`๋กœ ๋ฌธ์„œ์™€ ์‚ฐ๋ฌธ์„, `--content config`๋กœ yaml/toml ๋“ฑ ์„ค์ • ํŒŒ์ผ์„, `--content all`๋กœ ๋ชจ๋‘ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```bash
csp search "deployment guide" ./my-project --content docs
csp search "database host port" ./my-project --content config
csp search "authentication" ./my-project --content all
```

`csp find-related`๋กœ ๊ธฐ์กด ์œ„์น˜์™€ ๋น„์Šทํ•œ ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ด์ „ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์˜ `file_path`์™€ `line`์„ ์‚ฌ์šฉ).

```bash
csp find-related src/auth.ts 42 ./my-project
```

`search`์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ `find-related`๋„ `--index` ์ธ์ž๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

`path`๋ฅผ ์ƒ๋žตํ•˜๋ฉด ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. git URL๋„ ๋ฐ›์Šต๋‹ˆ๋‹ค.

`csp`๊ฐ€ `$PATH`์— ์—†๋‹ค๋ฉด `bunx @pleaseai/csp`๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”.

### Workflow

1. `csp index -o cached_index`๋กœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ธ๋ฑ์‹ฑ.
2. `csp search`๋กœ ๊ด€๋ จ ์ฒญํฌ๋ฅผ ์ฐพ๊ธฐ. ์ธ๋ฑ์Šค๋ฅผ ๋„˜๊ธฐ๋ฉด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.
3. ๋ฌธ์„œ๋Š” `--content docs`, ์„ค์ • ํŒŒ์ผ์€ `--content config`, ์ „๋ถ€๋Š” `--content all`.
4. ๋ฐ˜ํ™˜๋œ ์ฒญํฌ๋กœ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ๋งŒ ํŒŒ์ผ์„ ์ „์ฒด ์ฝ๊ธฐ.
5. ์œ ๋งํ•œ ๊ฒฐ๊ณผ์—์„œ `csp find-related`๋กœ ๋น„์Šทํ•œ ๊ตฌํ˜„์„ ์ถ”๊ฐ€ ํƒ์ƒ‰.
6. ์ •ํ™•ํ•œ ๋ฆฌํ„ฐ๋Ÿด ๋งค์นญ์ด๋‚˜ ๋ฌธ์ž์—ด ํ™•์ธ์ด ํ•„์š”ํ•  ๋•Œ๋งŒ grep ์‚ฌ์šฉ.

์„œ๋ธŒ ์—์ด์ „ํŠธ

์„œ๋ธŒ ์—์ด์ „ํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ํ•˜๋‹ˆ์Šค์—์„œ๋Š” csp-search ์ „์šฉ ์„œ๋ธŒ ์—์ด์ „ํŠธ๋ฅผ ์„ค์น˜ํ•ด ๊ฒ€์ƒ‰์ด ๋ณ„๋„ ์ปจํ…์ŠคํŠธ์—์„œ ๋™์ž‘ํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (CLI ํ•„์š”).

csp init   # Claude Code โ†’ .claude/agents/csp-search.md

๋‹ค๋ฅธ ํ•˜๋‹ˆ์Šค(Cursor, Codex, OpenCode ๋“ฑ)๋Š” ์•„๋ž˜ ์„œ๋ธŒ ์—์ด์ „ํŠธ ์„ค์ • ์„น์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

csp ์—…๋ฐ์ดํŠธ
bun update -g @pleaseai/csp     # bun
npm update -g @pleaseai/csp     # npm
pnpm update -g @pleaseai/csp    # pnpm

์ฃผ์š” ๊ธฐ๋Šฅ

  • ๋น ๋ฆ„: ํ‰๊ท ์ ์ธ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ 1์ดˆ ์ด๋‚ด์— ์ธ๋ฑ์‹ฑํ•˜๊ณ , ์ฟผ๋ฆฌ๋Š” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. ์ „๋ถ€ CPU์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ์ •ํ™•ํ•จ: ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰(๋ฐ€์ง‘ ์ž„๋ฒ ๋”ฉ + BM25)๊ณผ ์ฝ”๋“œ ์ธ์ง€ํ˜• ๋ฆฌ๋žญํ‚น์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ† ํฐ ํšจ์œจ์ : ๊ด€๋ จ ์ฒญํฌ๋งŒ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ grep+read ๋Œ€๋น„ ์•ฝ 98% ์ ์€ ํ† ํฐ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ๋กœ ์…‹์—…: API ํ‚ค, GPU, ์™ธ๋ถ€ ์„œ๋น„์Šค ์—†์ด CPU์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • MCP ์„œ๋ฒ„: Claude Code, Cursor, Codex, OpenCode, VS Code ๋“ฑ MCP ํ˜ธํ™˜ ์—์ด์ „ํŠธ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋กœ์ปฌ / ์›๊ฒฉ: ๋กœ์ปฌ ๊ฒฝ๋กœ ๋˜๋Š” git URL์„ ๋ชจ๋‘ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ผ ๋ฐ”์ด๋„ˆ๋ฆฌ: ์ž์ฒด ์™„๊ฒฐํ˜• Rust ์‹คํ–‰ ํŒŒ์ผ โ€” Homebrew๋กœ๋Š” ๋Ÿฐํƒ€์ž„ ์—†์ด ์„ค์น˜ํ•˜๊ฑฐ๋‚˜, npm/bun/pnpm์œผ๋กœ ์„ค์น˜(PATH์— Node 22+ ๋˜๋Š” Bun ํ•„์š”).

MCP ์„œ๋ฒ„

csp๋Š” MCP ์„œ๋ฒ„๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์–ด ์—์ด์ „ํŠธ๊ฐ€ ์–ด๋–ค ์ฝ”๋“œ๋ฒ ์ด์Šค๋“  ์ง์ ‘ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋Š” ํ•„์š”ํ•  ๋•Œ ํด๋ก ๋˜์–ด ์ธ๋ฑ์‹ฑ๋ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ์„ธ์…˜ ๋™์•ˆ ์ธ๋ฉ”๋ชจ๋ฆฌ ํ•ซ ์บ์‹œ๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ, CLI์™€ ๋™์ผํ•œ ๋””์Šคํฌ ์บ์‹œ ~/.csp/index/๋ฅผ ๊ณต์œ ํ•˜๋ฏ€๋กœ ํ•œ ๋ฒˆ ๋งŒ๋“  ์ธ๋ฑ์Šค๋Š” ์–‘์ชฝ์—์„œ ์žฌ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ๊ฒฝ๋กœ๋Š” ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ๊ฐ์‹œํ•ด ์ž๋™์œผ๋กœ ์žฌ์ธ๋ฑ์‹ฑํ•˜๋ฉฐ, ๋””์Šคํฌ ์บ์‹œ ์žฌ์‚ฌ์šฉ์€ ์†Œ์Šค ์ฝ˜ํ…์ธ  ํ•ด์‹œ๋กœ ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค.

์„ค์ •

Claude Code
claude mcp add csp -s user -- bunx @pleaseai/csp mcp
Cursor

~/.cursor/mcp.json (๋˜๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด .cursor/mcp.json)์— ์ถ”๊ฐ€:

{
  "mcpServers": {
    "csp": {
      "command": "bunx",
      "args": ["@pleaseai/csp", "mcp"]
    }
  }
}
Codex

~/.codex/config.toml์— ์ถ”๊ฐ€:

[mcp_servers.csp]
command = "bunx"
args = [
  "@pleaseai/csp",
  "mcp"
]
OpenCode

~/.opencode/config.json์— ์ถ”๊ฐ€:

{
  "mcp": {
    "csp": {
      "type": "local",
      "command": ["bunx", "@pleaseai/csp", "mcp"]
    }
  }
}
VS Code

ํ”„๋กœ์ ํŠธ์˜ .vscode/mcp.json (๋˜๋Š” ์‚ฌ์šฉ์ž ํ”„๋กœํ•„์˜ mcp.json)์— ์ถ”๊ฐ€:

{
  "servers": {
    "csp": {
      "command": "bunx",
      "args": ["@pleaseai/csp", "mcp"]
    }
  }
}
GitHub Copilot CLI

~/.copilot/mcp-config.json์— ์ถ”๊ฐ€:

{
  "mcpServers": {
    "csp": {
      "command": "bunx",
      "args": ["@pleaseai/csp", "mcp"]
    }
  }
}
Windsurf

~/.codeium/windsurf/mcp_config.json์— ์ถ”๊ฐ€:

{
  "mcpServers": {
    "csp": {
      "command": "bunx",
      "args": ["@pleaseai/csp", "mcp"]
    }
  }
}
Gemini CLI

~/.gemini/settings.json์— ์ถ”๊ฐ€:

{
  "mcpServers": {
    "csp": {
      "command": "bunx",
      "args": ["@pleaseai/csp", "mcp"]
    }
  }
}
Zed

~/.config/zed/settings.json (๋˜๋Š” ํ”„๋กœ์ ํŠธ ๋‚ด .zed/settings.json)์— ์ถ”๊ฐ€:

{
  "context_servers": {
    "csp": {
      "command": "bunx",
      "args": ["@pleaseai/csp", "mcp"]
    }
  }
}

๋„๊ตฌ

๋„๊ตฌ ์„ค๋ช…
search ์ž์—ฐ์–ด ๋˜๋Š” ์ฝ”๋“œ ์ฟผ๋ฆฌ๋กœ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฒ€์ƒ‰. repo๋Š” ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ ๋˜๋Š” https:// git URL.
find_related ํŒŒ์ผ ๊ฒฝ๋กœ์™€ ๋ผ์ธ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์•„, ํ•ด๋‹น ์œ„์น˜์˜ ์ฝ”๋“œ์™€ ์˜๋ฏธ์ ์œผ๋กœ ์œ ์‚ฌํ•œ ์ฒญํฌ๋ฅผ ๋ฐ˜ํ™˜.

๊ธฐ๋ณธ์ ์œผ๋กœ MCP ์„œ๋ฒ„๋Š” ์ฝ”๋“œ ํŒŒ์ผ๋งŒ ์ธ๋ฑ์‹ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์„œ/์„ค์ •/์ „์ฒด๋ฅผ ํ•จ๊ป˜ ์ธ๋ฑ์‹ฑํ•˜๋ ค๋ฉด ๋ช…๋ น์— --content docs, --content config, --content all ๋˜๋Š” ์กฐํ•ฉ(์˜ˆ: --content code docs)์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด Claude Code์—์„œ๋Š” claude mcp add csp -s user -- bunx @pleaseai/csp mcp --content all.

์„œ๋ธŒ ์—์ด์ „ํŠธ ์„ค์ •

Claude Code, Gemini CLI, Cursor, OpenCode, GitHub Copilot CLI, Kiro, Antigravity, Command Code, Pi, Reasonix๋Š” ๋ชจ๋‘ ์ „์šฉ csp ๊ฒ€์ƒ‰ ์„œ๋ธŒ ์—์ด์ „ํŠธ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์—์„œ csp init์„ ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜์„ธ์š”.

csp init                      # Claude Code  โ†’ .claude/agents/csp-search.md
csp init --agent gemini       # Gemini CLI   โ†’ .gemini/agents/csp-search.md
csp init --agent cursor       # Cursor       โ†’ .cursor/agents/csp-search.md
csp init --agent opencode     # OpenCode     โ†’ .opencode/agents/csp-search.md
csp init --agent copilot      # Copilot CLI  โ†’ .github/agents/csp-search.md
csp init --agent kiro         # Kiro         โ†’ .kiro/agents/csp-search.md
csp init --agent antigravity  # Antigravity  โ†’ .antigravity/agents/csp-search.md
csp init --agent commandcode  # Command Code โ†’ .commandcode/agents/csp-search.md
csp init --agent pi           # Pi           โ†’ .pi/agents/csp-search.md
csp init --agent reasonix     # Reasonix     โ†’ .reasonix/agents/csp-search.md

csp๊ฐ€ $PATH์— ์—†๋‹ค๋ฉด ๋ช…๋ น ์•ž์— bunx @pleaseai/csp๋ฅผ ๋ถ™์ด์„ธ์š”.

CLI

csp๋Š” ๋…๋ฆฝ ์‹คํ–‰ํ˜• CLI๋กœ๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋‚˜ MCP ์„ธ์…˜ ์—†์ด ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

# ๋กœ์ปฌ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ฒ€์ƒ‰
csp search "authentication flow" ./my-project

# ๋ฐ˜๋ณต ๊ฒ€์ƒ‰์„ ๋น ๋ฅด๊ฒŒ ํ•˜๋ ค๋ฉด ๋จผ์ € ์ธ๋ฑ์‹ฑ (--index๋Š” ์•„๋ž˜ ๋ชจ๋“  ๋ช…๋ น๊ณผ ํ˜ธํ™˜)
csp index ./my-project -o my-index
csp search "authentication flow" --index my-index

# ์›๊ฒฉ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ฒ€์ƒ‰ (ํ•„์š”ํ•  ๋•Œ ํด๋ก )
csp search "save model to disk" https://github.com/MinishLab/model2vec

# ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜ ์ œํ•œ
csp search "save model to disk" ./my-project --top-k 10

# ์ฝ”๋“œ ๋Œ€์‹  docs/config/์ „์ฒด ๊ฒ€์ƒ‰
csp search "deployment guide" ./my-project --content docs   # ๋˜๋Š” config, all

# ํŠน์ • ์œ„์น˜์™€ ๋น„์Šทํ•œ ์ฝ”๋“œ ์ฐพ๊ธฐ
csp find-related src/auth.ts 42 ./my-project

--content๋Š” code (๊ธฐ๋ณธ), docs, config, all์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. path๋ฅผ ์ƒ๋žตํ•˜๋ฉด ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. git URL๋„ ๋ฐ›์Šต๋‹ˆ๋‹ค. csp๊ฐ€ $PATH์— ์—†๋‹ค๋ฉด bunx @pleaseai/csp๋กœ ๋Œ€์ฒดํ•˜์„ธ์š”.

csp search๋‚˜ csp find-related๋ฅผ --index ์—†์ด ์‹คํ–‰ํ•˜๋ฉด, csp๋Š” ์†Œ์Šค์™€ ์ฝ˜ํ…์ธ  ์„ ํƒ์„ ํ‚ค๋กœ ํ•˜์—ฌ ๊ธ€๋กœ๋ฒŒ ์บ์‹œ ~/.csp/index/์— ์ž๋™์œผ๋กœ ์ธ๋ฑ์‹ฑยท์บ์‹œํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์‹คํ–‰ ๋•Œ ์บ์‹œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉฐ, ์†Œ์Šค ํŒŒ์ผ์ด ๋ฐ”๋€Œ๋ฉด ์ฝ˜ํ…์ธ  ํ•ด์‹œ๋กœ ์ž๋™ ๋ฌดํšจํ™”๋˜๋ฏ€๋กœ ์ˆ˜๋™์œผ๋กœ ๋‹ค์‹œ ์ธ๋ฑ์‹ฑํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. --index <๊ฒฝ๋กœ>๋ฅผ ์ง€์ •ํ•˜๋ฉด ๊ทธ ๊ฒฝ๋กœ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์ž๋™ ์บ์‹œ๋ฅผ ์šฐํšŒํ•ฉ๋‹ˆ๋‹ค. csp index -o <๊ฒฝ๋กœ>๋Š” ๋ช…์‹œ์  ์˜์†ํ™” ์ „์šฉ(-o ํ•„์ˆ˜)์ด๋ฉฐ ์ž๋™ ์บ์‹œ์™€๋Š” ๋…๋ฆฝ์ ์ž…๋‹ˆ๋‹ค.

ํ† ํฐ ์ ˆ์•ฝ๋Ÿ‰ ๋ณด๊ธฐ

csp savings๋Š” ๋ชจ๋“  ๊ฒ€์ƒ‰์—์„œ csp๊ฐ€ ์ ˆ์•ฝํ•œ ํ† ํฐ๋Ÿ‰์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

csp savings           # ๊ธฐ๊ฐ„๋ณ„ ์š”์•ฝ
csp savings --verbose # ํ˜ธ์ถœ ์œ ํ˜•๋ณ„ ๋ถ„ํ•ด ํฌํ•จ
  Csp Token Savings
  โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•

  Total saved:  ~1.2M tokens  (89%)
  Total calls:  1.4k
  Efficiency:  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘  89%

  By Period
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  Period             Calls           Saved  Ratio
  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
  Today                 42    ~58.4k tokens  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘  95%
  Last 7 days          287   ~312.4k tokens  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘  90%
  All time             1.4k     ~1.2M tokens  โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘  89%

์ ˆ์•ฝ๋Ÿ‰ ๊ณ„์‚ฐ: ๊ฐ ํ˜ธ์ถœ๋งˆ๋‹ค ๋ฐ˜ํ™˜๋œ ์ฒญํฌ๊ฐ€ ์†ํ•œ ํŒŒ์ผ๋“ค์˜ ์ด ๋ฌธ์ž ์ˆ˜์™€ ๋ฐ˜ํ™˜๋œ ์Šค๋‹ˆํŽซ์˜ ๋ฌธ์ž ์ˆ˜๋ฅผ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ ˆ์•ฝ๋œ ํ† ํฐ ์ถ”์ •์น˜๋Š” (ํŒŒ์ผ ๋ฌธ์ž ์ˆ˜ โˆ’ ์Šค๋‹ˆํŽซ ๋ฌธ์ž ์ˆ˜) / 4 (1ํ† ํฐ โ‰ˆ 4๋ฌธ์ž). ์ด๋Š” ๋ณด์ˆ˜์ ์ธ ์ถ”์ •์œผ๋กœ, ๊ธฐ์ค€์„ ์€ "์—์ด์ „ํŠธ๊ฐ€ ๋งค์นญ๋œ ํŒŒ์ผ์„ ํ†ต์งธ๋กœ ์ฝ๋Š”๋‹ค"๋Š” ์ผ๋ฐ˜์ ์ธ ์ฝ”๋”ฉ ์—์ด์ „ํŠธ ๋™์ž‘์ž…๋‹ˆ๋‹ค.

stdout์ด ์ปฌ๋Ÿฌ๋ฅผ ์ง€์›ํ•˜๋Š” TTY์ผ ๋•Œ ์ถœ๋ ฅ์— ์ƒ‰์ด ์ž…ํ˜€์ง‘๋‹ˆ๋‹ค(NO_COLOR, dumb ํ„ฐ๋ฏธ๋„, ํŒŒ์ดํ”„ ์—ฐ๊ฒฐ ์‹œ์—๋Š” ๋น„ํ™œ์„ฑํ™”). --verbose๋ฅผ ์ฃผ๋ฉด "By Call Type" ๋ถ„ํ•ด๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

ํ†ต๊ณ„๋Š” ~/.csp/savings.jsonl์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์บ์‹œ ๋น„์šฐ๊ธฐ

csp clear๋Š” ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

csp clear savings  # ~/.csp/savings.jsonl ์‚ญ์ œ
csp clear index    # ๊ธ€๋กœ๋ฒŒ ์ธ๋ฑ์Šค ์บ์‹œ ~/.csp/index/ ์‚ญ์ œ
csp clear all      # ์ธ๋ฑ์Šค ์บ์‹œ์™€ savings ๋ชจ๋‘ ์‚ญ์ œ

clear index๋Š” ๊ธ€๋กœ๋ฒŒ ์ธ๋ฑ์Šค ์บ์‹œ ~/.csp/index/(์—ฌ๊ธฐ์— csp search/find-related๊ฐ€ ์ธ๋ฑ์Šค๋ฅผ ์ž๋™ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค)๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ œ๊ฑฐ๋œ ์บ์‹œ ์—”ํŠธ๋ฆฌ ์ˆ˜๋ฅผ ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค. ~/.csp/savings.jsonl์€ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค. clear all์€ ~/.csp/index/์™€ ~/.csp/savings.jsonl์„ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

csp index -o <๊ฒฝ๋กœ>๋กœ ๋ช…์‹œ์ ์œผ๋กœ ๊ธฐ๋กํ•œ ์ธ๋ฑ์Šค ๊ฒฝ๋กœ๋Š” ์ž๋™ ์บ์‹œ ๋Œ€์ƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ clear๊ฐ€ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋””๋ ‰ํ„ฐ๋ฆฌ๋Š” ์ง์ ‘ ์‚ญ์ œํ•˜์„ธ์š”.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ

csp๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Rust ํฌ๋ ˆ์ดํŠธ, ๋˜๋Š” ๊ฐ™์€ ์ฝ”์–ด๋ฅผ napi-rs๋กœ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐ”์ธ๋”ฉํ•œ JavaScript/TypeScript SDK(@pleaseai/csp-sdk)์ž…๋‹ˆ๋‹ค.

Rust โ€” ์งง์€ ์ด๋ฆ„ csp๊ฐ€ ์ด๋ฏธ ์„ ์ ๋˜์–ด ์žˆ์–ด crates.io์—๋Š” code-search-please๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์€ csp ๊ทธ๋Œ€๋กœ์ด๋ฏ€๋กœ ์˜์กด์„ฑ์€ code-search-please๋กœ ์ถ”๊ฐ€ํ•˜๋˜ ์ฝ”๋“œ์—์„œ๋Š” use csp::...๋ฅผ ์”๋‹ˆ๋‹ค. CspIndex(from_path / from_git / search / find_related)์™€ ContentType enum, ๋žญํ‚น ํŒŒ์ดํ”„๋ผ์ธ์„ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ด ํฌ๋ ˆ์ดํŠธ๋Š” csp CLI๋„ ํ•จ๊ป˜ ๋‹ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(๊ธฐ๋ณธ ํ™œ์„ฑํ™”๋œ cli ํ”ผ์ฒ˜). ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์˜์กดํ•  ๋•Œ๋Š” ๊ธฐ๋ณธ ํ”ผ์ฒ˜๋ฅผ ๋„๋ฉด CLI ์Šคํƒ(clap / tokio / rmcp)์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค:

[dependencies]
code-search-please = { version = "0.1", default-features = false }
use std::path::Path;
use csp::indexing::index::{CspIndex, LoadOptions, QueryOptions};

// ๋กœ์ปฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ธ๋ฑ์‹ฑํ•˜๊ณ  ๊ฒ€์ƒ‰
let index = CspIndex::from_path(Path::new("./my-project"), &LoadOptions::default())?;
let results = index.search("save model to disk", &QueryOptions { top_k: Some(3), ..Default::default() });

for r in &results {
    println!("{}:{}-{}", r.chunk.file_path, r.chunk.start_line, r.chunk.end_line);
}

JavaScript / TypeScript โ€” @pleaseai/csp-sdk๋Š” ๋™์ผํ•œ Rust ๊ฒ€์ƒ‰ ์—”์ง„์„ ์ธํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰ํ•˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ(napi-rs) ์• ๋“œ์˜จ์ž…๋‹ˆ๋‹ค. ์„œ๋ธŒํ”„๋กœ์„ธ์Šค๋„, JSON ์™•๋ณต๋„ ์—†์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์ง„์ž…์ ์€ ๋น„๋™๊ธฐ, ์ฟผ๋ฆฌ ํ˜ธ์ถœ์€ ๋™๊ธฐ์ž…๋‹ˆ๋‹ค.

import { ContentType, CspIndex } from '@pleaseai/csp-sdk'

const index = await CspIndex.fromPath('./my-project', { content: [ContentType.Code] })
const results = index.search('save model to disk', { topK: 3 })

for (const { chunk, score } of results) {
  console.log(score.toFixed(3), chunk.location) // ์˜ˆ: 0.871 src/index.ts:42-58
}

๋‘ npm ํŒจํ‚ค์ง€๋Š” ๋ณ„๊ฐœ์ž…๋‹ˆ๋‹ค. **@pleaseai/csp**๋Š” csp CLI + MCP ์„œ๋ฒ„๋ฅผ ๋Ÿฐ์ฒ˜ ๋’ค์— ๋‹ด์•„ ๋ฐฐํฌํ•˜๋ฉฐ(JS API๋Š” ๋…ธ์ถœํ•˜์ง€ ์•Š์Œ), **@pleaseai/csp-sdk**๋Š” ์ธํ”„๋กœ์„ธ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ SDK์ž…๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ํ•˜๋‚˜์˜ Rust ์ฝ”์–ด์—์„œ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค. ํฌ๋ ˆ์ดํŠธ๋Š” crates.io์— code-search-please๋กœ ๋ฐฐํฌ๋˜๋ฉฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ด๋ฆ„์€ csp์ž…๋‹ˆ๋‹ค.

๋™์ž‘ ์›๋ฆฌ

csp๋Š” tree-sitter๋กœ ๊ฐ ํŒŒ์ผ์„ ์ฝ”๋“œ ์ธ์ง€ํ˜• ์ฒญํฌ๋กœ ๋ถ„ํ• ํ•œ ๋’ค, ๋‘ ๊ฐœ์˜ ์ƒํ˜ธ ๋ณด์™„์ ์ธ ๊ฒ€์ƒ‰๊ธฐ๋กœ ์ฟผ๋ฆฌ๋ฅผ ๋ชจ๋“  ์ฒญํฌ์™€ ์ ์ˆ˜ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์˜๋ฏธ ์œ ์‚ฌ๋„๋ฅผ ์œ„ํ•œ ์ •์  Model2Vec ์ž„๋ฒ ๋”ฉ(์ฝ”๋“œ ํŠนํ™” potion-code-16M-v2 ๋ชจ๋ธ ์‚ฌ์šฉ)๊ณผ, ์‹๋ณ„์ž/API๋ช… ๋“ฑ ์–ดํœ˜ ๋งค์นญ์„ ์œ„ํ•œ BM25์ž…๋‹ˆ๋‹ค. ๋‘ ์ ์ˆ˜ ๋ฆฌ์ŠคํŠธ๋Š” Reciprocal Rank Fusion(RRF)์œผ๋กœ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค.

๊ฒฐํ•ฉ ํ›„์—๋Š” ์ฝ”๋“œ ์ธ์ง€ํ˜• ์‹ ํ˜ธ๋“ค๋กœ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

๋žญํ‚น ์‹ ํ˜ธ
  • ์ ์‘ํ˜• ๊ฐ€์ค‘์น˜. Foo::bar, _private, getUserById ๊ฐ™์€ ์‹ฌ๋ณผํ˜• ์ฟผ๋ฆฌ๋Š” ์–ดํœ˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋” ๋ฐ›๊ณ , ์ž์—ฐ์–ด ์ฟผ๋ฆฌ๋Š” ์˜๋ฏธ/์–ดํœ˜ ๊ฒ€์ƒ‰๊ธฐ ์‚ฌ์ด์—์„œ ๊ท ํ˜•์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ •์˜ ๋ถ€์ŠคํŠธ. ์ฟผ๋ฆฌ๋œ ์‹ฌ๋ณผ์„ ์ •์˜ํ•˜๋Š” ์ฒญํฌ(class, function, interface ๋“ฑ)๋Š” ๋‹จ์ˆœ ์ฐธ์กฐํ•˜๋Š” ์ฒญํฌ๋ณด๋‹ค ์ƒ์œ„์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹๋ณ„์ž ์Šคํ…œ. ์ฟผ๋ฆฌ ํ† ํฐ์„ ์Šคํ…œ ์ฒ˜๋ฆฌํ•ด ์ฒญํฌ ๋‚ด ์‹๋ณ„์ž ์Šคํ…œ๊ณผ ๋งค์นญํ•˜๊ณ , ๋งค์นญ๋œ ์ฒญํฌ์— ์ถ”๊ฐ€ ๊ฐ€์ค‘์น˜๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: parse config ์ฟผ๋ฆฌ๋Š” parseConfig, ConfigParser, config_parser๊ฐ€ ํฌํ•จ๋œ ์ฒญํฌ๋ฅผ ๋ถ€์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.
  • ํŒŒ์ผ ์ผ๊ด€์„ฑ. ๊ฐ™์€ ํŒŒ์ผ์˜ ์—ฌ๋Ÿฌ ์ฒญํฌ๊ฐ€ ์ฟผ๋ฆฌ์— ๋งค์นญ๋˜๋ฉด ํ•ด๋‹น ํŒŒ์ผ์„ ๋ถ€์ŠคํŠธํ•ด, ๋‹จ์ผ ์ฒญํฌ๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ ์ˆ˜์ค€์˜ ๊ด€๋ จ์„ฑ์ด ์ƒ์œ„์— ๋ฐ˜์˜๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ๋…ธ์ด์ฆˆ ํŽ˜๋„ํ‹ฐ. ํ…Œ์ŠคํŠธ ํŒŒ์ผ, compat//legacy/ ์…ฐ์ž„, ์˜ˆ์ œ ์ฝ”๋“œ, .d.ts ์„ ์–ธ ์Šคํ…์€ ์ˆœ์œ„๊ฐ€ ๋‚ฎ์•„์ ธ ์ •๊ทœ ๊ตฌํ˜„์ด ๋จผ์ € ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ์ด ์ •์ ์ด๋ผ ์ฟผ๋ฆฌ ์‹œ์ ์— ํŠธ๋žœ์Šคํฌ๋จธ forward pass๊ฐ€ ์—†์œผ๋ฏ€๋กœ, ์œ„ ๋ชจ๋“  ๊ณผ์ •์ด CPU์—์„œ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ csp ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” Cargo ์›Œํฌ์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค(crates/csp์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ csp ๋ฐ”์ด๋„ˆ๋ฆฌ๊ฐ€ ํ•จ๊ป˜ ์žˆ๊ณ , csp ๋ฐ”์ด๋„ˆ๋ฆฌ๋Š” ๊ธฐ๋ณธ ํ™œ์„ฑํ™”๋œ cli ํ”ผ์ฒ˜ ๋’ค์— ์žˆ์Šต๋‹ˆ๋‹ค):

cargo build --release          # csp ๋ฐ”์ด๋„ˆ๋ฆฌ ๋นŒ๋“œ
cargo test --workspace         # ํ…Œ์ŠคํŠธ ์‹คํ–‰
cargo fmt --all                # ํฌ๋งท
cargo clippy --all-targets --all-features -- -D warnings   # ๋ฆฐํŠธ

ํฌ๋ ˆ๋”ง

csp๋Š” MinishLab์˜ Thomas van Dongen๊ณผ Stรฉphan Tulkens๊ฐ€ ๋งŒ๋“  Semble์˜ Rust ํฌํŠธ์ž…๋‹ˆ๋‹ค. ์•Œ๊ณ ๋ฆฌ์ฆ˜, ๋žญํ‚น ์‹ ํ˜ธ, ์ „์ฒด ์•„ํ‚คํ…์ฒ˜์˜ ๊ณต๋กœ๋Š” ๋ชจ๋‘ ์›์ €์ž์—๊ฒŒ ์žˆ์œผ๋ฉฐ, ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” ์ด๋ฅผ Rust๋กœ ์ด์‹ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฐ๊ตฌ์—์„œ ํ•ต์‹ฌ ์•„์ด๋””์–ด๋ฅผ ์ธ์šฉํ•˜์‹œ๋ ค๋ฉด ์›๋ณธ Semble ๋…ผ๋ฌธ์„ ์ธ์šฉํ•ด ์ฃผ์„ธ์š”.

@software{minishlab2026semble,
  author       = {{van Dongen}, Thomas and Stephan Tulkens},
  title        = {Semble: Fast and Accurate Code Search for Agents},
  year         = {2026},
  publisher    = {Zenodo},
  doi          = {10.5281/zenodo.19785932},
  url          = {https://github.com/MinishLab/semble},
  license      = {MIT}
}

๋ผ์ด์„ ์Šค

MIT ยฉ ์ด๋ฏผ์ˆ˜

csp๋Š” ๋™์ผํ•˜๊ฒŒ MIT ๋ผ์ด์„ ์Šค์ธ MinishLab/semble์˜ ํŒŒ์ƒ ์ €์ž‘๋ฌผ์ž…๋‹ˆ๋‹ค.