sari 0.0.1__tar.gz → 0.0.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. {sari-0.0.1/sari.egg-info → sari-0.0.2}/PKG-INFO +57 -55
  2. {sari-0.0.1 → sari-0.0.2}/README.md +56 -54
  3. {sari-0.0.1 → sari-0.0.2}/app/config.py +16 -1
  4. sari-0.0.2/deckard/version.py +1 -0
  5. {sari-0.0.1 → sari-0.0.2/sari.egg-info}/PKG-INFO +57 -55
  6. sari-0.0.1/deckard/version.py +0 -1
  7. {sari-0.0.1 → sari-0.0.2}/LICENSE +0 -0
  8. {sari-0.0.1 → sari-0.0.2}/app/__init__.py +0 -0
  9. {sari-0.0.1 → sari-0.0.2}/app/db.py +0 -0
  10. {sari-0.0.1 → sari-0.0.2}/app/dedup_queue.py +0 -0
  11. {sari-0.0.1 → sari-0.0.2}/app/engine_registry.py +0 -0
  12. {sari-0.0.1 → sari-0.0.2}/app/engine_runtime.py +0 -0
  13. {sari-0.0.1 → sari-0.0.2}/app/http_server.py +0 -0
  14. {sari-0.0.1 → sari-0.0.2}/app/indexer.py +0 -0
  15. {sari-0.0.1 → sari-0.0.2}/app/main.py +0 -0
  16. {sari-0.0.1 → sari-0.0.2}/app/models.py +0 -0
  17. {sari-0.0.1 → sari-0.0.2}/app/queue_pipeline.py +0 -0
  18. {sari-0.0.1 → sari-0.0.2}/app/ranking.py +0 -0
  19. {sari-0.0.1 → sari-0.0.2}/app/registry.py +0 -0
  20. {sari-0.0.1 → sari-0.0.2}/app/search_engine.py +0 -0
  21. {sari-0.0.1 → sari-0.0.2}/app/watcher.py +0 -0
  22. {sari-0.0.1 → sari-0.0.2}/app/workspace.py +0 -0
  23. {sari-0.0.1 → sari-0.0.2}/deckard/__init__.py +0 -0
  24. {sari-0.0.1 → sari-0.0.2}/deckard/__main__.py +0 -0
  25. {sari-0.0.1 → sari-0.0.2}/deckard/main.py +0 -0
  26. {sari-0.0.1 → sari-0.0.2}/mcp/__init__.py +0 -0
  27. {sari-0.0.1 → sari-0.0.2}/mcp/__main__.py +0 -0
  28. {sari-0.0.1 → sari-0.0.2}/mcp/cli.py +0 -0
  29. {sari-0.0.1 → sari-0.0.2}/mcp/daemon.py +0 -0
  30. {sari-0.0.1 → sari-0.0.2}/mcp/proxy.py +0 -0
  31. {sari-0.0.1 → sari-0.0.2}/mcp/registry.py +0 -0
  32. {sari-0.0.1 → sari-0.0.2}/mcp/server.py +0 -0
  33. {sari-0.0.1 → sari-0.0.2}/mcp/session.py +0 -0
  34. {sari-0.0.1 → sari-0.0.2}/mcp/telemetry.py +0 -0
  35. {sari-0.0.1 → sari-0.0.2}/mcp/test_cli.py +0 -0
  36. {sari-0.0.1 → sari-0.0.2}/mcp/test_daemon.py +0 -0
  37. {sari-0.0.1 → sari-0.0.2}/mcp/test_server.py +0 -0
  38. {sari-0.0.1 → sari-0.0.2}/mcp/tools/__init__.py +0 -0
  39. {sari-0.0.1 → sari-0.0.2}/mcp/tools/_util.py +0 -0
  40. {sari-0.0.1 → sari-0.0.2}/mcp/tools/deckard_guide.py +0 -0
  41. {sari-0.0.1 → sari-0.0.2}/mcp/tools/doctor.py +0 -0
  42. {sari-0.0.1 → sari-0.0.2}/mcp/tools/get_callers.py +0 -0
  43. {sari-0.0.1 → sari-0.0.2}/mcp/tools/get_implementations.py +0 -0
  44. {sari-0.0.1 → sari-0.0.2}/mcp/tools/index_file.py +0 -0
  45. {sari-0.0.1 → sari-0.0.2}/mcp/tools/list_files.py +0 -0
  46. {sari-0.0.1 → sari-0.0.2}/mcp/tools/read_file.py +0 -0
  47. {sari-0.0.1 → sari-0.0.2}/mcp/tools/read_symbol.py +0 -0
  48. {sari-0.0.1 → sari-0.0.2}/mcp/tools/registry.py +0 -0
  49. {sari-0.0.1 → sari-0.0.2}/mcp/tools/repo_candidates.py +0 -0
  50. {sari-0.0.1 → sari-0.0.2}/mcp/tools/rescan.py +0 -0
  51. {sari-0.0.1 → sari-0.0.2}/mcp/tools/scan_once.py +0 -0
  52. {sari-0.0.1 → sari-0.0.2}/mcp/tools/search.py +0 -0
  53. {sari-0.0.1 → sari-0.0.2}/mcp/tools/search_api_endpoints.py +0 -0
  54. {sari-0.0.1 → sari-0.0.2}/mcp/tools/search_symbols.py +0 -0
  55. {sari-0.0.1 → sari-0.0.2}/mcp/tools/status.py +0 -0
  56. {sari-0.0.1 → sari-0.0.2}/pyproject.toml +0 -0
  57. {sari-0.0.1 → sari-0.0.2}/sari/__init__.py +0 -0
  58. {sari-0.0.1 → sari-0.0.2}/sari/__main__.py +0 -0
  59. {sari-0.0.1 → sari-0.0.2}/sari.egg-info/SOURCES.txt +0 -0
  60. {sari-0.0.1 → sari-0.0.2}/sari.egg-info/dependency_links.txt +0 -0
  61. {sari-0.0.1 → sari-0.0.2}/sari.egg-info/entry_points.txt +0 -0
  62. {sari-0.0.1 → sari-0.0.2}/sari.egg-info/requires.txt +0 -0
  63. {sari-0.0.1 → sari-0.0.2}/sari.egg-info/top_level.txt +0 -0
  64. {sari-0.0.1 → sari-0.0.2}/setup.cfg +0 -0
  65. {sari-0.0.1 → sari-0.0.2}/tests/test_contracts.py +0 -0
  66. {sari-0.0.1 → sari-0.0.2}/tests/test_doctor_tool.py +0 -0
  67. {sari-0.0.1 → sari-0.0.2}/tests/test_engine_registry.py +0 -0
  68. {sari-0.0.1 → sari-0.0.2}/tests/test_engine_runtime.py +0 -0
  69. {sari-0.0.1 → sari-0.0.2}/tests/test_http_server.py +0 -0
  70. {sari-0.0.1 → sari-0.0.2}/tests/test_import_fallbacks.py +0 -0
  71. {sari-0.0.1 → sari-0.0.2}/tests/test_list_files_tool.py +0 -0
  72. {sari-0.0.1 → sari-0.0.2}/tests/test_memory_leak.py +0 -0
  73. {sari-0.0.1 → sari-0.0.2}/tests/test_read_tools.py +0 -0
  74. {sari-0.0.1 → sari-0.0.2}/tests/test_search_tool.py +0 -0
  75. {sari-0.0.1 → sari-0.0.2}/tests/test_status_tool.py +0 -0
  76. {sari-0.0.1 → sari-0.0.2}/tests/test_tools_more.py +0 -0
  77. {sari-0.0.1 → sari-0.0.2}/tests/test_util_pack.py +0 -0
  78. {sari-0.0.1 → sari-0.0.2}/tests/test_workspace.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sari
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Summary: Sari - Local Search MCP Server
5
5
  Author: Horadric
6
6
  License: MIT License
@@ -66,23 +66,42 @@ Dynamic: license-file
66
66
 
67
67
  ## 🚀 성역 소환 주문 (설치 방법 - Installation)
68
68
 
69
- 터미널(Terminal)을 열고 아래 마법 주문을 딱 한 줄만 복사해서 붙여넣고 엔터(Enter)를 누르세요!
70
- 명령어는 **최초 설치**뿐만 아니라, **새로운 워크스페이스 연동**에도 똑같이 사용됩니다.
69
+ > **중요:** `deckard` 모듈/엔트리포인트는 **호환용으로만 유지**됩니다.
70
+ > 앞으로는 **Sari 이름을 사용**해 주세요. (향후 버전에서 제거 예정)
71
+
72
+ 설치 방식은 두 가지입니다.
73
+
74
+ 1) **설정만 추가하면 자동 설치 (권장)**
75
+ 2) **직접 설치 (오프라인/제한 환경용)**
76
+
77
+ ### ✅ 1) 설정만 추가하면 자동 설치 (권장)
78
+ MCP 설정 파일에 아래 블록을 **직접 추가**하면, 실행 시 Sari가 자동 설치됩니다.
79
+
80
+ ```toml
81
+ [mcp_servers.sari]
82
+ command = "bash"
83
+ args = ["-lc", "if [ -x ~/.local/share/sari/bootstrap.sh ]; then if [ \"${SARI_AUTO_UPDATE:-}\" = \"1\" ]; then if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y --update; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y --update; fi; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; else if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; fi"]
84
+ env = { DECKARD_WORKSPACE_ROOT = "/path/to/workspace", DECKARD_RESPONSE_COMPACT = "1", SARI_VERSION = "0.0.2", SARI_AUTO_UPDATE = "0" }
85
+ startup_timeout_sec = 60
86
+ ```
87
+
88
+ ### 🧰 2) 직접 설치 (오프라인/제한 환경용)
89
+ 터미널(Terminal)에서 직접 설치도 가능합니다.
71
90
 
72
91
  ```bash
73
- # macOS / Linux (유닉스의 축복을 받은 자들)
92
+ # macOS / Linux
74
93
  curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y
75
94
 
76
- # Windows (파워쉘의 마법사들)
95
+ # Windows (PowerShell)
77
96
  irm https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python - -y
78
97
  ```
79
98
 
80
99
  ### 📖 호라드림의 설치 계시 (How it works)
81
- 사리 선생님의 설치 마법은 아주 영리하게 동작합니다:
100
+ 사리 선생님의 설치 마법은 이렇게 동작합니다:
82
101
 
83
- 1. **최초 소환:** 사리가 없는 컴퓨터에서 실행하면, `~/.local/share/sari`에 전역 설치를 진행하고 현재 워크스페이스를 연동합니다.
84
- 2. **워크스페이스 추가:** 이미 사리가 설치된 컴퓨터라면, **불필요한 재설치 없이** 현재 폴더에 필요한 설정 파일(`.codex/config.toml` )만 번개처럼 빠르게 생성합니다.
85
- 3. **자동화 우호적:** `-y` 옵션을 통해 파이프라인 설치 시 발생할 수 있는 입력 오류(EOFError)를 원천 차단합니다.
102
+ 1. **설정만 추가** 실행 네트워크에서 자동 설치
103
+ 2. 설치 위치는 항상 **전역 고정** (`~/.local/share/sari` / `%LOCALAPPDATA%\\sari`)
104
+ 3. 데몬은 **항상 하나**로 유지
86
105
 
87
106
 
88
107
  ### 설치하면 어떤 마법이 일어나나요?
@@ -90,14 +109,11 @@ irm https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python
90
109
  2. **비밀 거처 마련**: 도서관 주소를 만듭니다. (이사 비용은 무료입니다.)
91
110
  - **macOS/Linux**: `~/.local/share/sari` (사과 마크가 찍힌 비밀 창고)
92
111
  - **Windows**: `%LOCALAPPDATA%\sari` (창문이 달린 비밀 창고)
93
- 3. **통역기 연결**: AI 에이전트들이 사리 선생님께 "헬프!"를 외칠 있도록 MCP 통역기를 연결합니다.
94
-
95
- ### 설정은 어디에 숨겨지나요? (쌍둥이 CLI 지원)
96
- 설치 스크립트(`install.py`)는 **설정이 지옥의 촉수처럼 흩어져 충돌**나는 것을 막기 위해 다음처럼 엄격하게 동작합니다.
112
+ 3. **통역기 연결**: MCP 설정 블록만 추가하면 실행 자동으로 연결됩니다.
97
113
 
98
- - **쌍둥이의 축복**: 현재 작업 폴더의 `.codex/config.toml`과 `.gemini/config.toml` 양쪽에 사리 선생님의 영혼 인장을 동시에 찍습니다. (하나만 하면 섭섭하니까요.)
99
- - **부정한 유산 정화**: `~/.codex/config.toml`과 `~/.gemini/config.toml`에 남아있던 케케묵은 설정들은 자비 없이 불태워 소멸시킵니다. (오직 깨끗한 것만이 살아남으리!)
100
- - **성역의 예절**: Claude/Cursor 설정은 **함부로 발을 들이지 않습니다.** (남의 집 안방 가구는 집주인이 직접 옮기는 게 도리죠.) 필요하면 아래 비급 예시를 보고 직접 수련하여 옮기시게나.
114
+ ### 설정은 어디에 숨겨지나요? (수동 등록 방식)
115
+ **설정 파일은 자동으로 수정하지 않습니다.**
116
+ Codex/Gemini는 TOML, Cursor/Claude JSON 형식으로 동일 내용을 넣어주세요.
101
117
 
102
118
  ### 여러 워크스페이스를 동시에? (분신술의 대가)
103
119
  - **설정은 워크스페이스별로 각자의 운명**을 가집니다.
@@ -108,21 +124,14 @@ irm https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python
108
124
 
109
125
  ---
110
126
 
111
- ## 🪄 1‑Step 모드 vs 설치본 고정 모드
127
+ ## 🪄 설치 옵션 (대안)
112
128
 
113
- **1‑Step 모드(권장)**
114
- 레포의 `bootstrap.sh`를 config에 등록하면, 실행 자동 설치/업데이트 후 **설치본으로 전환**됩니다.
115
-
116
- **설치본 고정 모드**
117
- 설치본 경로 `~/.local/share/sari/bootstrap.sh`를 등록하면 **자동 업데이트 없이** 고정된 버전을 사용합니다. (변화를 거부하는 보수적인 사서 모드입니다.)
118
-
119
- **자동 업데이트 기준**
120
- 레포 tag와 설치본 `VERSION`이 다르면, 레포의 `bootstrap.sh`가 `install.py`를 자동 실행합니다.
129
+ **오프라인/제한 환경용**
130
+ 설정에서 `command`를 설치본 `bootstrap.sh`로 직접 지정하면 네트워크 없이 실행할 있습니다.
121
131
 
122
132
  **bootstrap 스크립트 위치**
123
- - **macOS/Linux (레포)**: `/path/to/sari/bootstrap.sh`
124
- - **macOS/Linux (설치본)**: `~/.local/share/sari/bootstrap.sh`
125
- - **Windows (설치본)**: `%LOCALAPPDATA%\sari\bootstrap.bat`
133
+ - **macOS/Linux**: `~/.local/share/sari/bootstrap.sh`
134
+ - **Windows**: `%LOCALAPPDATA%\\sari\\bootstrap.bat`
126
135
 
127
136
  ---
128
137
 
@@ -193,8 +202,8 @@ python3 ~/.local/share/sari/doctor.py
193
202
  ## 🧯 문제 해결 (Troubleshooting)
194
203
 
195
204
  ### Q. MCP 연결이 안 돼요
196
- - `command` 경로가 실제 존재하는지 확인하세요.
197
- (레포 경로인지 설치본 경로인지 헷갈리기 쉬워요!)
205
+ - `command`가 `bash`인지, 그리고 네트워크가 허용되는지 확인하세요.
206
+ - 제한 환경이라면 **설치본 bootstrap 경로**로 전환하세요.
198
207
  - 데몬 상태 확인:
199
208
  ```bash
200
209
  # macOS/Linux
@@ -213,11 +222,14 @@ python3 ~/.local/share/sari/doctor.py
213
222
  - 격리된 환경에서 실행하려면 `scripts/run_tests_isolated.sh`를 사용하세요. (HOME/registry/log/port 분리)
214
223
 
215
224
  ### Q. 업데이트가 안 되는 것 같아요
216
- - **1‑Step 모드인지 확인**하세요 (레포 `bootstrap.sh` 사용).
217
225
  - 설치본 `VERSION`을 확인하세요:
218
226
  ```bash
219
227
  cat ~/.local/share/sari/VERSION
220
228
  ```
229
+ - 필요하면 강제 업데이트:
230
+ ```bash
231
+ curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - --update -y
232
+ ```
221
233
 
222
234
  ### Q. 설정 파일이 여기저기 생겼어요
223
235
  - 사리 선생님은 **글로벌 설정과 프로젝트 설정이 뒤섞여 혼돈이 오는 걸 극도로 혐오합니다.**
@@ -332,45 +344,35 @@ Sari는 인덱싱 + FTS 기반 검색 구조라서 **“어떤 단계에서 쓰
332
344
  {
333
345
  "mcpServers": {
334
346
  "sari": {
335
- "command": "/Users/[사용자명]/.local/share/sari/bootstrap.sh",
336
- "args": []
347
+ "command": "bash",
348
+ "args": [
349
+ "-lc",
350
+ "if [ -x ~/.local/share/sari/bootstrap.sh ]; then if [ \"${SARI_AUTO_UPDATE:-}\" = \"1\" ]; then if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y --update; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y --update; fi; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; else if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; fi"
351
+ ],
352
+ "env": {
353
+ "DECKARD_WORKSPACE_ROOT": "/Users/[사용자명]/path/to/workspace",
354
+ "DECKARD_RESPONSE_COMPACT": "1"
355
+ }
337
356
  }
338
357
  }
339
358
  }
340
359
  ```
341
360
 
342
361
  ### 🧩 Codex / Gemini 설정 예시 (config.toml)
343
- > 아래는 **설치본 고정 모드** 예시입니다. 1‑Step 모드를 쓰려면 `command`를 레포 경로로 바꾸세요.
344
-
345
- ```toml
346
- [mcp_servers.sari]
347
- command = "/Users/[사용자명]/.local/share/sari/bootstrap.sh"
348
- args = ["--workspace-root", "/Users/[사용자명]/path/to/workspace"]
349
- env = { DECKARD_WORKSPACE_ROOT = "/Users/[사용자명]/path/to/workspace" }
350
- startup_timeout_sec = 60
351
- ```
352
-
353
- **1‑Step 모드 예시 (레포 bootstrap 사용)**
354
362
  ```toml
355
363
  [mcp_servers.sari]
356
- command = "/Users/[사용자명]/path/to/sari/bootstrap.sh"
357
- args = ["--workspace-root", "/Users/[사용자명]/path/to/workspace"]
358
- env = { DECKARD_WORKSPACE_ROOT = "/Users/[사용자명]/path/to/workspace" }
364
+ command = "bash"
365
+ args = ["-lc", "if [ -x ~/.local/share/sari/bootstrap.sh ]; then if [ \"${SARI_AUTO_UPDATE:-}\" = \"1\" ]; then if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y --update; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y --update; fi; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; else if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; fi"]
366
+ env = { DECKARD_WORKSPACE_ROOT = "/Users/[사용자명]/path/to/workspace", DECKARD_RESPONSE_COMPACT = "1" }
359
367
  startup_timeout_sec = 60
360
368
  ```
361
369
 
362
370
  **필드별 상세 설명**
363
371
  - `command`: 사리를 실행할 경로입니다.
364
- - **1‑Step 모드**: 레포의 `bootstrap.sh` 경로
365
- 예) `/path/to/sari/bootstrap.sh`
366
- - **설치본 고정 모드**: 설치본의 `bootstrap.sh` 경로
367
- 예) `~/.local/share/sari/bootstrap.sh`
368
- - `args`: 실행 옵션을 리스트로 전달합니다.
369
- - `--workspace-root <path>`: 인덱싱할 워크스페이스 루트 경로
370
- - **생략 시**: 현재 실행 위치를 기준으로 동작하거나, `.codex-root`가 있는 상위 폴더를 기준으로 동작합니다.
372
+ - `command`: 기본은 `bash` (네트워크 자동 설치 방식).
373
+ - `args`: `curl | python3`로 설치 후 `bootstrap.sh` 실행.
371
374
  - `env`: 환경 변수를 강제로 주입합니다.
372
375
  - `DECKARD_WORKSPACE_ROOT`는 **workspace-root를 고정**하려고 넣습니다.
373
- - `args`와 **동일한 값**을 넣는 것이 권장됩니다. (둘 중 하나만 있어도 동작합니다)
374
376
  - `startup_timeout_sec`: 데몬 기동 대기 시간(초).
375
377
  초기 인덱싱이 길다면 120~180으로 늘려보세요.
376
378
 
@@ -33,23 +33,42 @@
33
33
 
34
34
  ## 🚀 성역 소환 주문 (설치 방법 - Installation)
35
35
 
36
- 터미널(Terminal)을 열고 아래 마법 주문을 딱 한 줄만 복사해서 붙여넣고 엔터(Enter)를 누르세요!
37
- 명령어는 **최초 설치**뿐만 아니라, **새로운 워크스페이스 연동**에도 똑같이 사용됩니다.
36
+ > **중요:** `deckard` 모듈/엔트리포인트는 **호환용으로만 유지**됩니다.
37
+ > 앞으로는 **Sari 이름을 사용**해 주세요. (향후 버전에서 제거 예정)
38
+
39
+ 설치 방식은 두 가지입니다.
40
+
41
+ 1) **설정만 추가하면 자동 설치 (권장)**
42
+ 2) **직접 설치 (오프라인/제한 환경용)**
43
+
44
+ ### ✅ 1) 설정만 추가하면 자동 설치 (권장)
45
+ MCP 설정 파일에 아래 블록을 **직접 추가**하면, 실행 시 Sari가 자동 설치됩니다.
46
+
47
+ ```toml
48
+ [mcp_servers.sari]
49
+ command = "bash"
50
+ args = ["-lc", "if [ -x ~/.local/share/sari/bootstrap.sh ]; then if [ \"${SARI_AUTO_UPDATE:-}\" = \"1\" ]; then if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y --update; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y --update; fi; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; else if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; fi"]
51
+ env = { DECKARD_WORKSPACE_ROOT = "/path/to/workspace", DECKARD_RESPONSE_COMPACT = "1", SARI_VERSION = "0.0.2", SARI_AUTO_UPDATE = "0" }
52
+ startup_timeout_sec = 60
53
+ ```
54
+
55
+ ### 🧰 2) 직접 설치 (오프라인/제한 환경용)
56
+ 터미널(Terminal)에서 직접 설치도 가능합니다.
38
57
 
39
58
  ```bash
40
- # macOS / Linux (유닉스의 축복을 받은 자들)
59
+ # macOS / Linux
41
60
  curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y
42
61
 
43
- # Windows (파워쉘의 마법사들)
62
+ # Windows (PowerShell)
44
63
  irm https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python - -y
45
64
  ```
46
65
 
47
66
  ### 📖 호라드림의 설치 계시 (How it works)
48
- 사리 선생님의 설치 마법은 아주 영리하게 동작합니다:
67
+ 사리 선생님의 설치 마법은 이렇게 동작합니다:
49
68
 
50
- 1. **최초 소환:** 사리가 없는 컴퓨터에서 실행하면, `~/.local/share/sari`에 전역 설치를 진행하고 현재 워크스페이스를 연동합니다.
51
- 2. **워크스페이스 추가:** 이미 사리가 설치된 컴퓨터라면, **불필요한 재설치 없이** 현재 폴더에 필요한 설정 파일(`.codex/config.toml` )만 번개처럼 빠르게 생성합니다.
52
- 3. **자동화 우호적:** `-y` 옵션을 통해 파이프라인 설치 시 발생할 수 있는 입력 오류(EOFError)를 원천 차단합니다.
69
+ 1. **설정만 추가** 실행 네트워크에서 자동 설치
70
+ 2. 설치 위치는 항상 **전역 고정** (`~/.local/share/sari` / `%LOCALAPPDATA%\\sari`)
71
+ 3. 데몬은 **항상 하나**로 유지
53
72
 
54
73
 
55
74
  ### 설치하면 어떤 마법이 일어나나요?
@@ -57,14 +76,11 @@ irm https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python
57
76
  2. **비밀 거처 마련**: 도서관 주소를 만듭니다. (이사 비용은 무료입니다.)
58
77
  - **macOS/Linux**: `~/.local/share/sari` (사과 마크가 찍힌 비밀 창고)
59
78
  - **Windows**: `%LOCALAPPDATA%\sari` (창문이 달린 비밀 창고)
60
- 3. **통역기 연결**: AI 에이전트들이 사리 선생님께 "헬프!"를 외칠 있도록 MCP 통역기를 연결합니다.
61
-
62
- ### 설정은 어디에 숨겨지나요? (쌍둥이 CLI 지원)
63
- 설치 스크립트(`install.py`)는 **설정이 지옥의 촉수처럼 흩어져 충돌**나는 것을 막기 위해 다음처럼 엄격하게 동작합니다.
79
+ 3. **통역기 연결**: MCP 설정 블록만 추가하면 실행 자동으로 연결됩니다.
64
80
 
65
- - **쌍둥이의 축복**: 현재 작업 폴더의 `.codex/config.toml`과 `.gemini/config.toml` 양쪽에 사리 선생님의 영혼 인장을 동시에 찍습니다. (하나만 하면 섭섭하니까요.)
66
- - **부정한 유산 정화**: `~/.codex/config.toml`과 `~/.gemini/config.toml`에 남아있던 케케묵은 설정들은 자비 없이 불태워 소멸시킵니다. (오직 깨끗한 것만이 살아남으리!)
67
- - **성역의 예절**: Claude/Cursor 설정은 **함부로 발을 들이지 않습니다.** (남의 집 안방 가구는 집주인이 직접 옮기는 게 도리죠.) 필요하면 아래 비급 예시를 보고 직접 수련하여 옮기시게나.
81
+ ### 설정은 어디에 숨겨지나요? (수동 등록 방식)
82
+ **설정 파일은 자동으로 수정하지 않습니다.**
83
+ Codex/Gemini는 TOML, Cursor/Claude JSON 형식으로 동일 내용을 넣어주세요.
68
84
 
69
85
  ### 여러 워크스페이스를 동시에? (분신술의 대가)
70
86
  - **설정은 워크스페이스별로 각자의 운명**을 가집니다.
@@ -75,21 +91,14 @@ irm https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python
75
91
 
76
92
  ---
77
93
 
78
- ## 🪄 1‑Step 모드 vs 설치본 고정 모드
94
+ ## 🪄 설치 옵션 (대안)
79
95
 
80
- **1‑Step 모드(권장)**
81
- 레포의 `bootstrap.sh`를 config에 등록하면, 실행 자동 설치/업데이트 후 **설치본으로 전환**됩니다.
82
-
83
- **설치본 고정 모드**
84
- 설치본 경로 `~/.local/share/sari/bootstrap.sh`를 등록하면 **자동 업데이트 없이** 고정된 버전을 사용합니다. (변화를 거부하는 보수적인 사서 모드입니다.)
85
-
86
- **자동 업데이트 기준**
87
- 레포 tag와 설치본 `VERSION`이 다르면, 레포의 `bootstrap.sh`가 `install.py`를 자동 실행합니다.
96
+ **오프라인/제한 환경용**
97
+ 설정에서 `command`를 설치본 `bootstrap.sh`로 직접 지정하면 네트워크 없이 실행할 있습니다.
88
98
 
89
99
  **bootstrap 스크립트 위치**
90
- - **macOS/Linux (레포)**: `/path/to/sari/bootstrap.sh`
91
- - **macOS/Linux (설치본)**: `~/.local/share/sari/bootstrap.sh`
92
- - **Windows (설치본)**: `%LOCALAPPDATA%\sari\bootstrap.bat`
100
+ - **macOS/Linux**: `~/.local/share/sari/bootstrap.sh`
101
+ - **Windows**: `%LOCALAPPDATA%\\sari\\bootstrap.bat`
93
102
 
94
103
  ---
95
104
 
@@ -160,8 +169,8 @@ python3 ~/.local/share/sari/doctor.py
160
169
  ## 🧯 문제 해결 (Troubleshooting)
161
170
 
162
171
  ### Q. MCP 연결이 안 돼요
163
- - `command` 경로가 실제 존재하는지 확인하세요.
164
- (레포 경로인지 설치본 경로인지 헷갈리기 쉬워요!)
172
+ - `command`가 `bash`인지, 그리고 네트워크가 허용되는지 확인하세요.
173
+ - 제한 환경이라면 **설치본 bootstrap 경로**로 전환하세요.
165
174
  - 데몬 상태 확인:
166
175
  ```bash
167
176
  # macOS/Linux
@@ -180,11 +189,14 @@ python3 ~/.local/share/sari/doctor.py
180
189
  - 격리된 환경에서 실행하려면 `scripts/run_tests_isolated.sh`를 사용하세요. (HOME/registry/log/port 분리)
181
190
 
182
191
  ### Q. 업데이트가 안 되는 것 같아요
183
- - **1‑Step 모드인지 확인**하세요 (레포 `bootstrap.sh` 사용).
184
192
  - 설치본 `VERSION`을 확인하세요:
185
193
  ```bash
186
194
  cat ~/.local/share/sari/VERSION
187
195
  ```
196
+ - 필요하면 강제 업데이트:
197
+ ```bash
198
+ curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - --update -y
199
+ ```
188
200
 
189
201
  ### Q. 설정 파일이 여기저기 생겼어요
190
202
  - 사리 선생님은 **글로벌 설정과 프로젝트 설정이 뒤섞여 혼돈이 오는 걸 극도로 혐오합니다.**
@@ -299,45 +311,35 @@ Sari는 인덱싱 + FTS 기반 검색 구조라서 **“어떤 단계에서 쓰
299
311
  {
300
312
  "mcpServers": {
301
313
  "sari": {
302
- "command": "/Users/[사용자명]/.local/share/sari/bootstrap.sh",
303
- "args": []
314
+ "command": "bash",
315
+ "args": [
316
+ "-lc",
317
+ "if [ -x ~/.local/share/sari/bootstrap.sh ]; then if [ \"${SARI_AUTO_UPDATE:-}\" = \"1\" ]; then if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y --update; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y --update; fi; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; else if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; fi"
318
+ ],
319
+ "env": {
320
+ "DECKARD_WORKSPACE_ROOT": "/Users/[사용자명]/path/to/workspace",
321
+ "DECKARD_RESPONSE_COMPACT": "1"
322
+ }
304
323
  }
305
324
  }
306
325
  }
307
326
  ```
308
327
 
309
328
  ### 🧩 Codex / Gemini 설정 예시 (config.toml)
310
- > 아래는 **설치본 고정 모드** 예시입니다. 1‑Step 모드를 쓰려면 `command`를 레포 경로로 바꾸세요.
311
-
312
- ```toml
313
- [mcp_servers.sari]
314
- command = "/Users/[사용자명]/.local/share/sari/bootstrap.sh"
315
- args = ["--workspace-root", "/Users/[사용자명]/path/to/workspace"]
316
- env = { DECKARD_WORKSPACE_ROOT = "/Users/[사용자명]/path/to/workspace" }
317
- startup_timeout_sec = 60
318
- ```
319
-
320
- **1‑Step 모드 예시 (레포 bootstrap 사용)**
321
329
  ```toml
322
330
  [mcp_servers.sari]
323
- command = "/Users/[사용자명]/path/to/sari/bootstrap.sh"
324
- args = ["--workspace-root", "/Users/[사용자명]/path/to/workspace"]
325
- env = { DECKARD_WORKSPACE_ROOT = "/Users/[사용자명]/path/to/workspace" }
331
+ command = "bash"
332
+ args = ["-lc", "if [ -x ~/.local/share/sari/bootstrap.sh ]; then if [ \"${SARI_AUTO_UPDATE:-}\" = \"1\" ]; then if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y --update; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y --update; fi; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; else if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; fi"]
333
+ env = { DECKARD_WORKSPACE_ROOT = "/Users/[사용자명]/path/to/workspace", DECKARD_RESPONSE_COMPACT = "1" }
326
334
  startup_timeout_sec = 60
327
335
  ```
328
336
 
329
337
  **필드별 상세 설명**
330
338
  - `command`: 사리를 실행할 경로입니다.
331
- - **1‑Step 모드**: 레포의 `bootstrap.sh` 경로
332
- 예) `/path/to/sari/bootstrap.sh`
333
- - **설치본 고정 모드**: 설치본의 `bootstrap.sh` 경로
334
- 예) `~/.local/share/sari/bootstrap.sh`
335
- - `args`: 실행 옵션을 리스트로 전달합니다.
336
- - `--workspace-root <path>`: 인덱싱할 워크스페이스 루트 경로
337
- - **생략 시**: 현재 실행 위치를 기준으로 동작하거나, `.codex-root`가 있는 상위 폴더를 기준으로 동작합니다.
339
+ - `command`: 기본은 `bash` (네트워크 자동 설치 방식).
340
+ - `args`: `curl | python3`로 설치 후 `bootstrap.sh` 실행.
338
341
  - `env`: 환경 변수를 강제로 주입합니다.
339
342
  - `DECKARD_WORKSPACE_ROOT`는 **workspace-root를 고정**하려고 넣습니다.
340
- - `args`와 **동일한 값**을 넣는 것이 권장됩니다. (둘 중 하나만 있어도 동작합니다)
341
343
  - `startup_timeout_sec`: 데몬 기동 대기 시간(초).
342
344
  초기 인덱싱이 길다면 120~180으로 늘려보세요.
343
345
 
@@ -62,7 +62,19 @@ class Config:
62
62
  "db_path": str(WorkspaceManager.get_local_db_path(workspace_root)),
63
63
  "include_ext": [".py", ".js", ".ts", ".java", ".kt", ".go", ".rs", ".md", ".json", ".yaml", ".yml", ".sh"],
64
64
  "include_files": ["pom.xml", "package.json", "Dockerfile", "Makefile", "build.gradle", "settings.gradle"],
65
- "exclude_dirs": [".git", "node_modules", "__pycache__", ".venv", "venv", "target", "build", "dist", "coverage", "vendor"],
65
+ "exclude_dirs": [
66
+ ".git",
67
+ "node_modules",
68
+ "__pycache__",
69
+ ".venv",
70
+ "venv",
71
+ "target",
72
+ "build",
73
+ "dist",
74
+ "coverage",
75
+ "vendor",
76
+ "data",
77
+ ],
66
78
  "exclude_globs": [
67
79
  "*.min.js",
68
80
  "*.min.css",
@@ -75,6 +87,9 @@ class Config:
75
87
  "*.pyc",
76
88
  "*.pyo",
77
89
  "__pycache__/*",
90
+ "*.db",
91
+ "*.db-shm",
92
+ "*.db-wal",
78
93
  ],
79
94
  "redact_enabled": True,
80
95
  "commit_batch_size": 500,
@@ -0,0 +1 @@
1
+ __version__ = "0.0.2"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sari
3
- Version: 0.0.1
3
+ Version: 0.0.2
4
4
  Summary: Sari - Local Search MCP Server
5
5
  Author: Horadric
6
6
  License: MIT License
@@ -66,23 +66,42 @@ Dynamic: license-file
66
66
 
67
67
  ## 🚀 성역 소환 주문 (설치 방법 - Installation)
68
68
 
69
- 터미널(Terminal)을 열고 아래 마법 주문을 딱 한 줄만 복사해서 붙여넣고 엔터(Enter)를 누르세요!
70
- 명령어는 **최초 설치**뿐만 아니라, **새로운 워크스페이스 연동**에도 똑같이 사용됩니다.
69
+ > **중요:** `deckard` 모듈/엔트리포인트는 **호환용으로만 유지**됩니다.
70
+ > 앞으로는 **Sari 이름을 사용**해 주세요. (향후 버전에서 제거 예정)
71
+
72
+ 설치 방식은 두 가지입니다.
73
+
74
+ 1) **설정만 추가하면 자동 설치 (권장)**
75
+ 2) **직접 설치 (오프라인/제한 환경용)**
76
+
77
+ ### ✅ 1) 설정만 추가하면 자동 설치 (권장)
78
+ MCP 설정 파일에 아래 블록을 **직접 추가**하면, 실행 시 Sari가 자동 설치됩니다.
79
+
80
+ ```toml
81
+ [mcp_servers.sari]
82
+ command = "bash"
83
+ args = ["-lc", "if [ -x ~/.local/share/sari/bootstrap.sh ]; then if [ \"${SARI_AUTO_UPDATE:-}\" = \"1\" ]; then if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y --update; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y --update; fi; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; else if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; fi"]
84
+ env = { DECKARD_WORKSPACE_ROOT = "/path/to/workspace", DECKARD_RESPONSE_COMPACT = "1", SARI_VERSION = "0.0.2", SARI_AUTO_UPDATE = "0" }
85
+ startup_timeout_sec = 60
86
+ ```
87
+
88
+ ### 🧰 2) 직접 설치 (오프라인/제한 환경용)
89
+ 터미널(Terminal)에서 직접 설치도 가능합니다.
71
90
 
72
91
  ```bash
73
- # macOS / Linux (유닉스의 축복을 받은 자들)
92
+ # macOS / Linux
74
93
  curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y
75
94
 
76
- # Windows (파워쉘의 마법사들)
95
+ # Windows (PowerShell)
77
96
  irm https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python - -y
78
97
  ```
79
98
 
80
99
  ### 📖 호라드림의 설치 계시 (How it works)
81
- 사리 선생님의 설치 마법은 아주 영리하게 동작합니다:
100
+ 사리 선생님의 설치 마법은 이렇게 동작합니다:
82
101
 
83
- 1. **최초 소환:** 사리가 없는 컴퓨터에서 실행하면, `~/.local/share/sari`에 전역 설치를 진행하고 현재 워크스페이스를 연동합니다.
84
- 2. **워크스페이스 추가:** 이미 사리가 설치된 컴퓨터라면, **불필요한 재설치 없이** 현재 폴더에 필요한 설정 파일(`.codex/config.toml` )만 번개처럼 빠르게 생성합니다.
85
- 3. **자동화 우호적:** `-y` 옵션을 통해 파이프라인 설치 시 발생할 수 있는 입력 오류(EOFError)를 원천 차단합니다.
102
+ 1. **설정만 추가** 실행 네트워크에서 자동 설치
103
+ 2. 설치 위치는 항상 **전역 고정** (`~/.local/share/sari` / `%LOCALAPPDATA%\\sari`)
104
+ 3. 데몬은 **항상 하나**로 유지
86
105
 
87
106
 
88
107
  ### 설치하면 어떤 마법이 일어나나요?
@@ -90,14 +109,11 @@ irm https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python
90
109
  2. **비밀 거처 마련**: 도서관 주소를 만듭니다. (이사 비용은 무료입니다.)
91
110
  - **macOS/Linux**: `~/.local/share/sari` (사과 마크가 찍힌 비밀 창고)
92
111
  - **Windows**: `%LOCALAPPDATA%\sari` (창문이 달린 비밀 창고)
93
- 3. **통역기 연결**: AI 에이전트들이 사리 선생님께 "헬프!"를 외칠 있도록 MCP 통역기를 연결합니다.
94
-
95
- ### 설정은 어디에 숨겨지나요? (쌍둥이 CLI 지원)
96
- 설치 스크립트(`install.py`)는 **설정이 지옥의 촉수처럼 흩어져 충돌**나는 것을 막기 위해 다음처럼 엄격하게 동작합니다.
112
+ 3. **통역기 연결**: MCP 설정 블록만 추가하면 실행 자동으로 연결됩니다.
97
113
 
98
- - **쌍둥이의 축복**: 현재 작업 폴더의 `.codex/config.toml`과 `.gemini/config.toml` 양쪽에 사리 선생님의 영혼 인장을 동시에 찍습니다. (하나만 하면 섭섭하니까요.)
99
- - **부정한 유산 정화**: `~/.codex/config.toml`과 `~/.gemini/config.toml`에 남아있던 케케묵은 설정들은 자비 없이 불태워 소멸시킵니다. (오직 깨끗한 것만이 살아남으리!)
100
- - **성역의 예절**: Claude/Cursor 설정은 **함부로 발을 들이지 않습니다.** (남의 집 안방 가구는 집주인이 직접 옮기는 게 도리죠.) 필요하면 아래 비급 예시를 보고 직접 수련하여 옮기시게나.
114
+ ### 설정은 어디에 숨겨지나요? (수동 등록 방식)
115
+ **설정 파일은 자동으로 수정하지 않습니다.**
116
+ Codex/Gemini는 TOML, Cursor/Claude JSON 형식으로 동일 내용을 넣어주세요.
101
117
 
102
118
  ### 여러 워크스페이스를 동시에? (분신술의 대가)
103
119
  - **설정은 워크스페이스별로 각자의 운명**을 가집니다.
@@ -108,21 +124,14 @@ irm https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python
108
124
 
109
125
  ---
110
126
 
111
- ## 🪄 1‑Step 모드 vs 설치본 고정 모드
127
+ ## 🪄 설치 옵션 (대안)
112
128
 
113
- **1‑Step 모드(권장)**
114
- 레포의 `bootstrap.sh`를 config에 등록하면, 실행 자동 설치/업데이트 후 **설치본으로 전환**됩니다.
115
-
116
- **설치본 고정 모드**
117
- 설치본 경로 `~/.local/share/sari/bootstrap.sh`를 등록하면 **자동 업데이트 없이** 고정된 버전을 사용합니다. (변화를 거부하는 보수적인 사서 모드입니다.)
118
-
119
- **자동 업데이트 기준**
120
- 레포 tag와 설치본 `VERSION`이 다르면, 레포의 `bootstrap.sh`가 `install.py`를 자동 실행합니다.
129
+ **오프라인/제한 환경용**
130
+ 설정에서 `command`를 설치본 `bootstrap.sh`로 직접 지정하면 네트워크 없이 실행할 있습니다.
121
131
 
122
132
  **bootstrap 스크립트 위치**
123
- - **macOS/Linux (레포)**: `/path/to/sari/bootstrap.sh`
124
- - **macOS/Linux (설치본)**: `~/.local/share/sari/bootstrap.sh`
125
- - **Windows (설치본)**: `%LOCALAPPDATA%\sari\bootstrap.bat`
133
+ - **macOS/Linux**: `~/.local/share/sari/bootstrap.sh`
134
+ - **Windows**: `%LOCALAPPDATA%\\sari\\bootstrap.bat`
126
135
 
127
136
  ---
128
137
 
@@ -193,8 +202,8 @@ python3 ~/.local/share/sari/doctor.py
193
202
  ## 🧯 문제 해결 (Troubleshooting)
194
203
 
195
204
  ### Q. MCP 연결이 안 돼요
196
- - `command` 경로가 실제 존재하는지 확인하세요.
197
- (레포 경로인지 설치본 경로인지 헷갈리기 쉬워요!)
205
+ - `command`가 `bash`인지, 그리고 네트워크가 허용되는지 확인하세요.
206
+ - 제한 환경이라면 **설치본 bootstrap 경로**로 전환하세요.
198
207
  - 데몬 상태 확인:
199
208
  ```bash
200
209
  # macOS/Linux
@@ -213,11 +222,14 @@ python3 ~/.local/share/sari/doctor.py
213
222
  - 격리된 환경에서 실행하려면 `scripts/run_tests_isolated.sh`를 사용하세요. (HOME/registry/log/port 분리)
214
223
 
215
224
  ### Q. 업데이트가 안 되는 것 같아요
216
- - **1‑Step 모드인지 확인**하세요 (레포 `bootstrap.sh` 사용).
217
225
  - 설치본 `VERSION`을 확인하세요:
218
226
  ```bash
219
227
  cat ~/.local/share/sari/VERSION
220
228
  ```
229
+ - 필요하면 강제 업데이트:
230
+ ```bash
231
+ curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - --update -y
232
+ ```
221
233
 
222
234
  ### Q. 설정 파일이 여기저기 생겼어요
223
235
  - 사리 선생님은 **글로벌 설정과 프로젝트 설정이 뒤섞여 혼돈이 오는 걸 극도로 혐오합니다.**
@@ -332,45 +344,35 @@ Sari는 인덱싱 + FTS 기반 검색 구조라서 **“어떤 단계에서 쓰
332
344
  {
333
345
  "mcpServers": {
334
346
  "sari": {
335
- "command": "/Users/[사용자명]/.local/share/sari/bootstrap.sh",
336
- "args": []
347
+ "command": "bash",
348
+ "args": [
349
+ "-lc",
350
+ "if [ -x ~/.local/share/sari/bootstrap.sh ]; then if [ \"${SARI_AUTO_UPDATE:-}\" = \"1\" ]; then if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y --update; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y --update; fi; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; else if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; fi"
351
+ ],
352
+ "env": {
353
+ "DECKARD_WORKSPACE_ROOT": "/Users/[사용자명]/path/to/workspace",
354
+ "DECKARD_RESPONSE_COMPACT": "1"
355
+ }
337
356
  }
338
357
  }
339
358
  }
340
359
  ```
341
360
 
342
361
  ### 🧩 Codex / Gemini 설정 예시 (config.toml)
343
- > 아래는 **설치본 고정 모드** 예시입니다. 1‑Step 모드를 쓰려면 `command`를 레포 경로로 바꾸세요.
344
-
345
- ```toml
346
- [mcp_servers.sari]
347
- command = "/Users/[사용자명]/.local/share/sari/bootstrap.sh"
348
- args = ["--workspace-root", "/Users/[사용자명]/path/to/workspace"]
349
- env = { DECKARD_WORKSPACE_ROOT = "/Users/[사용자명]/path/to/workspace" }
350
- startup_timeout_sec = 60
351
- ```
352
-
353
- **1‑Step 모드 예시 (레포 bootstrap 사용)**
354
362
  ```toml
355
363
  [mcp_servers.sari]
356
- command = "/Users/[사용자명]/path/to/sari/bootstrap.sh"
357
- args = ["--workspace-root", "/Users/[사용자명]/path/to/workspace"]
358
- env = { DECKARD_WORKSPACE_ROOT = "/Users/[사용자명]/path/to/workspace" }
364
+ command = "bash"
365
+ args = ["-lc", "if [ -x ~/.local/share/sari/bootstrap.sh ]; then if [ \"${SARI_AUTO_UPDATE:-}\" = \"1\" ]; then if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y --update; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y --update; fi; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; else if [ -n \"${SARI_VERSION:-}\" ]; then curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/v${SARI_VERSION}/install.py | python3 - -y; else curl -fsSL https://raw.githubusercontent.com/BaeCheolHan/sari/main/install.py | python3 - -y; fi; exec ~/.local/share/sari/bootstrap.sh --transport stdio; fi"]
366
+ env = { DECKARD_WORKSPACE_ROOT = "/Users/[사용자명]/path/to/workspace", DECKARD_RESPONSE_COMPACT = "1" }
359
367
  startup_timeout_sec = 60
360
368
  ```
361
369
 
362
370
  **필드별 상세 설명**
363
371
  - `command`: 사리를 실행할 경로입니다.
364
- - **1‑Step 모드**: 레포의 `bootstrap.sh` 경로
365
- 예) `/path/to/sari/bootstrap.sh`
366
- - **설치본 고정 모드**: 설치본의 `bootstrap.sh` 경로
367
- 예) `~/.local/share/sari/bootstrap.sh`
368
- - `args`: 실행 옵션을 리스트로 전달합니다.
369
- - `--workspace-root <path>`: 인덱싱할 워크스페이스 루트 경로
370
- - **생략 시**: 현재 실행 위치를 기준으로 동작하거나, `.codex-root`가 있는 상위 폴더를 기준으로 동작합니다.
372
+ - `command`: 기본은 `bash` (네트워크 자동 설치 방식).
373
+ - `args`: `curl | python3`로 설치 후 `bootstrap.sh` 실행.
371
374
  - `env`: 환경 변수를 강제로 주입합니다.
372
375
  - `DECKARD_WORKSPACE_ROOT`는 **workspace-root를 고정**하려고 넣습니다.
373
- - `args`와 **동일한 값**을 넣는 것이 권장됩니다. (둘 중 하나만 있어도 동작합니다)
374
376
  - `startup_timeout_sec`: 데몬 기동 대기 시간(초).
375
377
  초기 인덱싱이 길다면 120~180으로 늘려보세요.
376
378
 
@@ -1 +0,0 @@
1
- __version__ = "0.0.1"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes