deel-local-cli 1.10.0 → 1.12.0
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.
- package/README.ko.md +1167 -1166
- package/README.md +1224 -1223
- package/bin/deel.js +1 -1
- package/package.json +60 -60
- package/src/acp/serve.js +810 -769
- package/src/agent/budget.js +156 -153
- package/src/agent/compact.js +128 -22
- package/src/agent/effort.js +308 -197
- package/src/agent/evolve.js +263 -213
- package/src/agent/filemem.js +16 -2
- package/src/agent/loop.js +1707 -1516
- package/src/agent/memory.js +156 -152
- package/src/agent/mention.js +210 -210
- package/src/agent/session.js +1049 -948
- package/src/backend/adapter.js +1159 -798
- package/src/backend/cachemark.js +150 -0
- package/src/backend/detect.js +327 -288
- package/src/backend/quota.js +250 -157
- package/src/backend/retry.js +30 -6
- package/src/backend/tokens.js +37 -0
- package/src/backend/toolfit.js +352 -325
- package/src/backend/wire.js +600 -0
- package/src/commands.js +3135 -2998
- package/src/i18n/en.js +544 -520
- package/src/i18n/ja.js +497 -473
- package/src/i18n/ko.js +591 -567
- package/src/i18n/zh.js +497 -473
- package/src/oneshot.js +620 -549
- package/src/providers/bedrock.js +17 -0
- package/src/repl.js +2602 -2515
- package/src/tools/fsutil.js +265 -250
- package/src/tools/verify.js +358 -357
- package/src/ui/pick.js +115 -115
- package/src/ui/status.js +613 -610
package/README.ko.md
CHANGED
|
@@ -1,1166 +1,1167 @@
|
|
|
1
|
-
<div align="center">
|
|
2
|
-
|
|
3
|
-
<picture>
|
|
4
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/hero-ko-dark.svg">
|
|
5
|
-
<img alt="deel — 이 컴퓨터 안에서만" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/hero-ko-light.svg" width="620">
|
|
6
|
-
</picture>
|
|
7
|
-
|
|
8
|
-
### 로컬 모델과 사내 게이트웨이로 도는 코딩 에이전트 CLI
|
|
9
|
-
|
|
10
|
-
의존성 0개 · Node 20+ · 소스가 나가는 자리는 딱 한 곳
|
|
11
|
-
|
|
12
|
-
바깥 API 도 붙습니다 — **말했을 때만**
|
|
13
|
-
|
|
14
|
-
<br>
|
|
15
|
-
|
|
16
|
-
[](https://www.npmjs.com/package/deel-local-cli)
|
|
17
|
-
[](https://www.npmjs.com/package/deel-local-cli)
|
|
18
|
-
[](https://nodejs.org)
|
|
19
|
-
[](LICENSE)
|
|
20
|
-
|
|
21
|
-
[](https://github.com/jysvai/deel-local-cli/actions/workflows/test.yml)
|
|
22
|
-
[](https://github.com/jysvai/deel-local-cli/actions/workflows/codeql.yml)
|
|
23
|
-
[](docs/ko/develop.md)
|
|
24
|
-
|
|
25
|
-
[](https://www.npmjs.com/package/deel-local-cli?activeTab=dependencies)
|
|
26
|
-
[](package.json)
|
|
27
|
-
[](#데이터가-나가는-길)
|
|
28
|
-
[](#데이터가-나가는-길)
|
|
29
|
-
|
|
30
|
-
**[English](README.md)** · [사내 반입 안내](#사내-반입) · [문제 해결](#문제-해결) · [자세한 문서](docs/ko/)
|
|
31
|
-
|
|
32
|
-
</div>
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
### 켜자마자 제일 궁금한 것부터 답합니다
|
|
37
|
-
|
|
38
|
-
<picture>
|
|
39
|
-
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-chat-ko-dark.svg">
|
|
40
|
-
<img alt="deel 시작 화면과 시킨 일 한 바퀴 — 모델·보내는 곳·폴더·승인 방식, 그리고 Grep→Read→Edit" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-chat-ko-light.svg" width="900">
|
|
41
|
-
</picture>
|
|
42
|
-
|
|
43
|
-
**`보냄 이 컴퓨터 안 127.0.0.1 ← 여기 말고는 어디로도 안 갑니다`.**
|
|
44
|
-
문서에 적힌 약속이 아니라 켤 때마다 화면에 뜹니다. 앞에 붙은 `⌂` 는 대화 내내
|
|
45
|
-
상태줄에 남아 있고, 바깥으로 나갈 일이 생기면 그 자리에서 `↗` 로 바뀝니다.
|
|
46
|
-
|
|
47
|
-
그 아래는 시킨 일 한 바퀴입니다 — 찾고(`Grep`), 읽고(`Read`), 고치고(`Edit`),
|
|
48
|
-
무엇을 고쳤는지 그 자리에서 보여 줍니다.
|
|
49
|
-
|
|
50
|
-
> 이 그림은 **진짜로 돌려서 찍은 것**입니다. 손으로 그린 화면은 판이 바뀌어도
|
|
51
|
-
> 안 바뀌어서 조용히 거짓말이 됩니다. `node tools/shot.mjs` 로 다시 만듭니다.
|
|
52
|
-
> (모델 자리는 127.0.0.1 에 띄운 스텁입니다. 도구는 진짜 파일을 읽고 고칩니다.)
|
|
53
|
-
|
|
54
|
-
---
|
|
55
|
-
|
|
56
|
-
## 목차
|
|
57
|
-
|
|
58
|
-
- [왜 만들었나](#왜-만들었나)
|
|
59
|
-
- [무엇이 다른가](#무엇이-다른가)
|
|
60
|
-
- [빠른 시작](#빠른-시작)
|
|
61
|
-
- [데이터가 나가는 길](#데이터가-나가는-길)
|
|
62
|
-
- [바깥 API 붙이기](#바깥-api-붙이기)
|
|
63
|
-
- [만료되는 열쇠 (사내 게이트웨이)](#만료되는-열쇠-사내-게이트웨이)
|
|
64
|
-
- [로컬 모델 여러 개 쓰기](#로컬-모델-여러-개-쓰기)
|
|
65
|
-
- [대화 중 명령](#대화-중-명령)
|
|
66
|
-
- [작업 모드](#작업-모드)
|
|
67
|
-
- [쉬움 · 개발자](#쉬움--개발자)
|
|
68
|
-
- [도구](#도구)
|
|
69
|
-
- [한글 문서와 엑셀](#한글-문서와-엑셀)
|
|
70
|
-
- [만든 웹을 그 자리에서 띄웁니다](#만든-웹을-그-자리에서-띄웁니다)
|
|
71
|
-
- [스킬·플러그인](#스킬플러그인)
|
|
72
|
-
- [추론 강도](#추론-강도)
|
|
73
|
-
- [자동 압축](#자동-압축)
|
|
74
|
-
- [대화 이어하기](#대화-이어하기)
|
|
75
|
-
- [밖에서 도구 붙이기 (MCP)](#밖에서-도구-붙이기-mcp)
|
|
76
|
-
- [에디터 안에서 쓰기 (ACP)](#에디터-안에서-쓰기-acp)
|
|
77
|
-
- [비밀이 새지 않게](#비밀이-새지-않게)
|
|
78
|
-
- [안전망](#안전망)
|
|
79
|
-
- [사내 반입](#사내-반입)
|
|
80
|
-
- [설정](#설정)
|
|
81
|
-
- [문제 해결](#문제-해결)
|
|
82
|
-
- [개발](#개발)
|
|
83
|
-
- [릴리스 노트](#릴리스-노트)
|
|
84
|
-
|
|
85
|
-
여기는 **요약**입니다. 절마다 붙은 링크를 따라가면 그 안의 이야기가 나옵니다.
|
|
86
|
-
|
|
87
|
-
| 자세한 문서 | 무엇이 있나 |
|
|
88
|
-
|---|---|
|
|
89
|
-
| [모델 다루기](docs/ko/models.md) | 급과 창 크기 · 국산 모델 이름표 · 켤 때 프로젝트 읽기 |
|
|
90
|
-
| [화면과 조작](docs/ko/interface.md) | 입력칸 · 작업 모드 · 쉬움과 개발자 · 무엇을 묻고 무엇을 그냥 하나 |
|
|
91
|
-
| [도구 자세히](docs/ko/tools.md) | `Outline` · `Verify` · `Task` · `Jobs` · `Append` · `Def`/`Refs` · 편집 매칭 |
|
|
92
|
-
| [한글 문서와 엑셀](docs/ko/documents.md) | hwpx·docx·pptx·**PDF** · 인코딩 · 엑셀 → CSV |
|
|
93
|
-
| [늘려 쓰기](docs/ko/extend.md) | 스킬 · 플러그인 · MCP · ACP |
|
|
94
|
-
| [속도와 씀씀이](docs/ko/tuning.md) | 단계별 추론 강도 · 프리픽스 캐시 · 컨텍스트 길이 |
|
|
95
|
-
| [안전망과 사내 반입](docs/ko/safety.md) | 되돌리기 · 작업 범위 · 감사기록 · 심사 서류 |
|
|
96
|
-
| [설정](docs/ko/config.md) · [개발](docs/ko/develop.md) | 환경변수 · 실행 옵션 · 검사 돌리기 · 폴더 구조 |
|
|
97
|
-
| [릴리스 노트](docs/ko/releases.md) | [1.10.x](docs/ko/releases/1.10.md) · [1.9.x](docs/ko/releases/1.9.md) · [1.8.x](docs/ko/releases/1.8.md) · [1.7.x](docs/ko/releases/1.7.md) · [그 앞](docs/ko/releases.md) |
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## 왜 만들었나
|
|
102
|
-
|
|
103
|
-
사내 보안 정책이 **미승인 소프트웨어 반입**을 막으면, 코딩 에이전트 도구는 대부분 쓸 수 없습니다.
|
|
104
|
-
의존성 수백 개가 딸려 오고, 설치할 때 스크립트가 돌고, 어디로 통신하는지 한 줄로 답할 수 없기 때문입니다.
|
|
105
|
-
|
|
106
|
-
deel 은 그 심사를 통과하는 것을 목표로 만들었습니다.
|
|
107
|
-
|
|
108
|
-
| | deel |
|
|
109
|
-
|---|---|
|
|
110
|
-
| 외부 의존성 | **0개** — Node 내장 기능만 |
|
|
111
|
-
| 설치 스크립트 | **없음** — 압축 풀고 바로 실행 |
|
|
112
|
-
| 소스가 나가는 자리 | **딱 한 곳** — 직접 설정한 주소 |
|
|
113
|
-
| 필요한 것 | Node 20 이상 |
|
|
114
|
-
|
|
115
|
-
직접 확인하실 수 있습니다.
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
npm view deel-local-cli dependencies # {}
|
|
119
|
-
npm view deel-local-cli scripts # install/postinstall 없음
|
|
120
|
-
deel audit # 심사서 전문 출력
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
|
-
## 무엇이 다른가
|
|
126
|
-
|
|
127
|
-
로컬 모델을 상대하는 코딩 에이전트는 몇 개 있습니다. 그런데 **로컬로 돌리는
|
|
128
|
-
걸 전제로 속을 다시 설계한** 것은 드뭅니다.
|
|
129
|
-
|
|
130
|
-
| | 다른 도구 | deel |
|
|
131
|
-
|---|---|---|
|
|
132
|
-
| `/undo` | 파일만 되돌린다 — 대화는 그 일이 있었다고 믿는 채로 | **대화까지** 같이 되감는다 |
|
|
133
|
-
| 긴 대화 | 클라우드가 안 느끼는 비용을 로컬에서도 그대로 짊어진다 | 프리픽스 캐시가 **살아남게** 순서를 설계 |
|
|
134
|
-
| 작은 모델의 편집 | 공백 하나 틀려도 실패 | 성공률 20%→**100%**, 엉뚱한 곳 0건 |
|
|
135
|
-
| 국산 모델 | 겪어 보기 전엔 모른다 | 공개 문서로 **미리** 안다 |
|
|
136
|
-
| "다 됐습니다" | 확인 안 된 것도 됐다고 한다 | `/evidence`·`/export` — **안 된 것까지** 적는다 |
|
|
137
|
-
| MCP·ACP | SDK 가 필요하다 | `child_process` + `JSON` 뿐 |
|
|
138
|
-
| 심사 서류 | 사람이 손으로 써서 실제와 어긋난다 | **코드가 소스를 훑어서** 만든다 |
|
|
139
|
-
|
|
140
|
-
<br>
|
|
141
|
-
|
|
142
|
-
#### `/undo` 는 파일과 대화를 같이 되감습니다
|
|
143
|
-
|
|
144
|
-
파일만 되돌리면 모델은 방금 그 편집을 했다고 계속 믿고 다음 턴을 그 위에
|
|
145
|
-
쌓습니다 — 화면에는 아무 일도 없었던 것처럼 보입니다. deel 은 되돌린 만큼
|
|
146
|
-
오간 메시지도 같이 접습니다. 접다가 도구 호출의 짝이 어긋나면 API 가 400 을
|
|
147
|
-
내므로, 짝을 다시 맞추는 로직(`repairToolPairs`)까지 같이 돕니다.
|
|
148
|
-
|
|
149
|
-
#### 긴 대화에서 로컬 모델이 갈수록 느려지는 이유를 직접 잡았습니다
|
|
150
|
-
|
|
151
|
-
Ollama·llama.cpp 는 프롬프트 앞부분이 한 글자라도 바뀌면 그 뒤 전부를 다시
|
|
152
|
-
계산합니다. 클라우드 API 는 이 비용을 안 느끼니 신경 쓸 이유가 없지만,
|
|
153
|
-
로컬로 돌리는 사람에게는 대화가 길어질수록 턴마다 지연이 쌓입니다. deel 은
|
|
154
|
-
매 턴 바뀔 수 있는 것(모드·핀)을 프롬프트 **맨 끝**으로 보내고, Ollama 에는
|
|
155
|
-
`keep_alive: 60m` 을 같이 보내 앞부분이 캐시에 그대로 남게 합니다. 이 순서는
|
|
156
|
-
검사(`test/cache.test.js`)가 지킵니다.
|
|
157
|
-
|
|
158
|
-
#### 작은 모델도 편집이 실제로 성공합니다
|
|
159
|
-
|
|
160
|
-
작은 로컬 모델은 고치려는 문자열을 공백 하나까지 완벽히 재현하지 못하는
|
|
161
|
-
경우가 흔합니다. `npm run bench` 로 잰 내부 벤치마크에서, 정확히 일치만
|
|
162
|
-
요구하던 옛 방식은 성공률 20% 였습니다. 지금 방식(공백·들여쓰기를 단계적으로
|
|
163
|
-
완화)은 **100%** — 그러면서도 엉뚱한 곳을 고친 건수는 두 방식 다 **0건**
|
|
164
|
-
입니다. 모호하면 찾지 못했다고 말할지언정 짐작해서 고치지 않습니다.
|
|
165
|
-
|
|
166
|
-
#### 국산 모델은 겪어 보기 전에 압니다
|
|
167
|
-
|
|
168
|
-
EXAONE·HyperCLOVA X·Kanana·Midm·Solar 는 공개 문서로 확인 가능한 버릇(예:
|
|
169
|
-
추론형 여부)을 deel 이 미리 알고 시작합니다. 다른 도구는 이 모델들을 한
|
|
170
|
-
번도 못 만나 본 채로 취급하고, 사람이 열 몇 턴을 겪어야 요령이 붙습니다.
|
|
171
|
-
|
|
172
|
-
#### "다 됐습니다" 대신 증명서를 냅니다
|
|
173
|
-
|
|
174
|
-
`/evidence` 와 `/export` 는 무엇을 바꿨는지뿐 아니라 **무엇을 확인하지
|
|
175
|
-
못했는지**까지 적습니다. AI 코딩 도구가 사람을 제일 잘 속이는 순간이 자신
|
|
176
|
-
있게 "됐습니다" 라고 말할 때라는 걸 알기 때문입니다. `/export` 는 바깥
|
|
177
|
-
주소가 하나도 없는 자기완결 HTML 이라 폐쇄망 어디서든 열립니다.
|
|
178
|
-
|
|
179
|
-
#### MCP·ACP 를 SDK 없이 붙였습니다
|
|
180
|
-
|
|
181
|
-
Model Context Protocol 과 Agent Client Protocol 은 둘 다 표준입출력으로 줄
|
|
182
|
-
단위 JSON-RPC 2.0 을 주고받는 게 전부입니다. deel 은 `child_process` 와
|
|
183
|
-
`JSON` 만으로 둘 다 구현했습니다 — 의존성 0개가 "기능을 뺀 결과" 가 아니라
|
|
184
|
-
"안 필요해서" 라는 걸 이 두 가지가 보여 줍니다.
|
|
185
|
-
|
|
186
|
-
#### 심사 서류를 손으로 안 씁니다
|
|
187
|
-
|
|
188
|
-
`deel pack` 이 만드는 반입심사서·SBOM·감사 사양은 **코드가 소스를 훑어서**
|
|
189
|
-
만든 겁니다. 손으로 적은 서류는 언젠가 실제와 어긋나고, 담당자가 그걸 한 번
|
|
190
|
-
발견하면 나머지 서류도 안 믿습니다.
|
|
191
|
-
|
|
192
|
-
---
|
|
193
|
-
|
|
194
|
-
## 빠른 시작
|
|
195
|
-
|
|
196
|
-
### 설치
|
|
197
|
-
|
|
198
|
-
```bash
|
|
199
|
-
npm install -g deel-local-cli
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
설치가 싫으면 소스를 받아 그대로 쓰셔도 됩니다. `npm install` 이 필요 없습니다.
|
|
203
|
-
|
|
204
|
-
```bash
|
|
205
|
-
git clone https://github.com/jysvai/deel-local-cli
|
|
206
|
-
node deel-local-cli/bin/deel.js
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
> **주의** — 홈 디렉터리(`~`)에서 `npm install` 하지 마세요. 거기에 `node_modules` 가 생기면
|
|
210
|
-
> 이후 모든 npm 명령이 그 폴더를 훑어서 무관한 패키지 경고를 냅니다. `-g` 로 설치하거나 `npx` 를 쓰세요.
|
|
211
|
-
|
|
212
|
-
### 연결 정하기
|
|
213
|
-
|
|
214
|
-
이 PC 에 떠 있는 로컬 서버를 훑어서 고르는 방법:
|
|
215
|
-
|
|
216
|
-
```bash
|
|
217
|
-
deel scan --pick
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
주소를 직접 넣는 방법 (사내 게이트웨이는 이쪽):
|
|
221
|
-
|
|
222
|
-
```bash
|
|
223
|
-
deel setup
|
|
224
|
-
```
|
|
225
|
-
|
|
226
|
-
### 시작
|
|
227
|
-
|
|
228
|
-
작업할 폴더에서 `deel` 을 칩니다. **그 폴더가 작업 범위가 되고, 밖의 파일은 읽지도 쓰지도 못합니다.**
|
|
229
|
-
|
|
230
|
-
```bash
|
|
231
|
-
cd C:\work\myproject
|
|
232
|
-
deel
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
---
|
|
236
|
-
|
|
237
|
-
## 데이터가 나가는 길
|
|
238
|
-
|
|
239
|
-
코딩 에이전트는 소스 코드를 통째로 모델에 보냅니다. **그 주소가 어디인지가 전부입니다.**
|
|
240
|
-
말로 보장하는 대신 코드가 막습니다 — `src/safety/network.js` 가 요청마다 확인하고,
|
|
241
|
-
허용 목록에 없으면 요청을 만들지도 않습니다.
|
|
242
|
-
|
|
243
|
-
```
|
|
244
|
-
[A] 모델 게이트웨이 ─── 소스 코드가 나가는 유일한 길
|
|
245
|
-
setup 에서 정한 한 자리만. 모델을 바꾸면 이전 자리는 닫힙니다.
|
|
246
|
-
|
|
247
|
-
[B] 웹 읽기 (WebFetch) ─ 받아 오기만 하는 길
|
|
248
|
-
GET 만. 본문 0바이트. 사내망·로컬 주소는 거절. 다녀온 곳은 전부 기록.
|
|
249
|
-
|
|
250
|
-
[C] 플러그인 받기 ────── /plugin install 을 칠 때만 잠깐
|
|
251
|
-
|
|
252
|
-
[D] MCP 서버 ─────────── 딴 자식 프로세스, 남의 프로그램
|
|
253
|
-
.deel/mcp.json 에 사람이 직접 적어야만 뜹니다. 기본은 꺼져 있습니다.
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
A·B·C 는 deel 이 직접 만드는 요청이라 하나씩 걸러낼 수 있습니다. **[D] 는
|
|
257
|
-
다릅니다** — MCP 서버는 별도 프로세스라 그 안에서 무슨 소켓을 여는지 코드로
|
|
258
|
-
볼 수 없습니다. 그래서 `--offline` 일 때는 요청을 거르는 대신 **그 서버
|
|
259
|
-
자체를 아예 띄우지 않습니다** — 막을 수 없는 것을 막았다고 말하지 않습니다.
|
|
260
|
-
|
|
261
|
-
`--offline` 을 주면 **B·C·D 가 모두 막히고 이 컴퓨터 안으로만** 다닙니다.
|
|
262
|
-
|
|
263
|
-
```bash
|
|
264
|
-
deel --offline
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
무엇이 어디로 갈 수 있는지는 켤 때 화면 맨 위에 늘 적혀 있습니다.
|
|
268
|
-
|
|
269
|
-
```
|
|
270
|
-
deel 1.10.0 ⌂ 이 안
|
|
271
|
-
보냄 이 컴퓨터 안 127.0.0.1:11434 ← 여기 말고는 어디로도 안 갑니다
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
### 실행 모드 셋
|
|
275
|
-
|
|
276
|
-
1.6 까지는 자물쇠가 `--offline` 하나였고 **기본이 열림**이었습니다.
|
|
277
|
-
`.deel/config.json` 의 주소 한 줄만 바깥으로 바꾸면 그대로 나갔습니다.
|
|
278
|
-
화면에 `↗` 가 뜨긴 했지만 그건 **알리는 것**이지 막는 것이 아닙니다.
|
|
279
|
-
|
|
280
|
-
| 모드 | 켜는 법 | 바깥 주소일 때 |
|
|
281
|
-
|---|---|---|
|
|
282
|
-
| `⌂ 이 안` | `deel` (처음 값) | **물어봅니다.** 한 번 허락하면 그 연결은 다음부터 안 묻습니다 |
|
|
283
|
-
| `↗ 바깥` | `deel online` · `--online` | 안 물어봅니다 |
|
|
284
|
-
| `⛊ 봉인` | `deel offline` · `--offline` | 기억해 둔 허가까지 무시합니다 (제일 셈) |
|
|
285
|
-
|
|
286
|
-
**주소와 허가가 둘 다 있어야 나갑니다.** 주소만 바꿔서는 못 나갑니다.
|
|
287
|
-
|
|
288
|
-
로컬·사내망(`127.x` · `10.x` · `192.168.x` · `172.16~31.x`)은 셋 중 어느
|
|
289
|
-
모드에서도 그냥 갑니다 — `offline` 은 「인터넷 없음」 이 아니라 「회사 밖으로
|
|
290
|
-
안 나감」 입니다.
|
|
291
|
-
|
|
292
|
-
수집·전송하는 것이 없습니다. 텔레메트리, 사용 통계, 오류 보고 전부 없습니다.
|
|
293
|
-
대화 기록·되돌리기 이력·설정은 작업 폴더의 `.deel/` 안에만 남습니다.
|
|
294
|
-
|
|
295
|
-
> 검증: `npm test` 의 network·web·mcp 검사 159항목. 허용되지 않은 서버에 실제로
|
|
296
|
-
> 요청이 **한 건도 닿지 않는지**, `--offline` 일 때 MCP 서버가 **한 번도 안
|
|
297
|
-
> 뜨는지**까지 진짜 서버를 띄워서 확인합니다.
|
|
298
|
-
|
|
299
|
-
---
|
|
300
|
-
|
|
301
|
-
## 바깥 API 붙이기
|
|
302
|
-
|
|
303
|
-
로컬 모델이 이 도구의 기본값이고, 그건 안 바뀝니다. 다만 「사내에 GPU 가 없다」
|
|
304
|
-
「이 한 가지만 큰 모델로 하고 싶다」 는 자리가 있어서, 벤더 API 도 붙을 수
|
|
305
|
-
있게 열었습니다. **위의 모드가 그 문을 지킵니다.**
|
|
306
|
-
|
|
307
|
-
```bash
|
|
308
|
-
deel setup
|
|
309
|
-
```
|
|
310
|
-
|
|
311
|
-
주소를 묻는 대신 **어디에 붙을지**를 묻습니다.
|
|
312
|
-
|
|
313
|
-
```
|
|
314
|
-
1. 열쇠만 있습니다 — 어디 것인지 찾아 드립니다 빈칸 1개
|
|
315
|
-
2. 주소를 직접 넣기 (사내 게이트웨이 · 로컬) 빈칸 2개
|
|
316
|
-
3. OpenAI (GPT) 빈칸 1개
|
|
317
|
-
4. Anthropic (Claude) 빈칸 1개
|
|
318
|
-
5. Google (Gemini) 빈칸 1개
|
|
319
|
-
6. AWS Bedrock 빈칸 2개
|
|
320
|
-
```
|
|
321
|
-
|
|
322
|
-
1번이 핵심입니다. 열쇠 앞머리로 어디 것인지 짚어서 **한 곳만** 묻습니다.
|
|
323
|
-
|
|
324
|
-
```
|
|
325
|
-
❯ sk-ant-api03-••••
|
|
326
|
-
✓ Anthropic (Claude) 열쇠로 보입니다. (열쇠가 sk-ant- 로 시작합니다)
|
|
327
|
-
여기저기 던지지 않습니다.
|
|
328
|
-
```
|
|
329
|
-
|
|
330
|
-
벤더마다 찔러 보는 식으로 만들면 Anthropic 열쇠가 OpenAI 서버로, 다시 Google
|
|
331
|
-
서버로 갑니다. 401 이 오고 끝이지만 **열쇠는 이미 갔습니다.** 그래서 모르는
|
|
332
|
-
열쇠는 짐작하지 않고 사람에게 묻습니다.
|
|
333
|
-
|
|
334
|
-
Bedrock 은 리전을 고릅니다 — 서울(`ap-northeast-2`) 포함 다섯 곳과 「직접 입력」.
|
|
335
|
-
Claude 는 몸통 규격이 달라서 여섯 자리를 따로 흡수했습니다
|
|
336
|
-
([1.7.0 릴리스 노트](docs/ko/releases/1.7.md#170)).
|
|
337
|
-
|
|
338
|
-
### 바깥에 붙으면 파일 속 비밀도 가립니다
|
|
339
|
-
|
|
340
|
-
로컬만 쓸 때는 파일에서 읽어 온 글을 **일부러 안 가렸습니다** — 가리면 모델이
|
|
341
|
-
그 가림표를 다시 파일에 써서 사람의 진짜 열쇠를 지워 버리기 때문입니다.
|
|
342
|
-
|
|
343
|
-
바깥으로 나가면 저울이 뒤집힙니다. `Read` 한 번이면 `.env` 가 통째로 남의
|
|
344
|
-
서버 로그에 남고, 그건 되돌릴 수가 없습니다. 잃는 쪽은 다른 자리에서 막았습니다 —
|
|
345
|
-
`Write`·`Append`·`Edit` 이 가린 표를 파일에 못 씁니다.
|
|
346
|
-
|
|
347
|
-
### 얼마 나갔는지 보입니다
|
|
348
|
-
|
|
349
|
-
```
|
|
350
|
-
❯ ─ 12.4초 · 도구 3회 · ↑8.2k ↓1.1k · $0.0271
|
|
351
|
-
```
|
|
352
|
-
|
|
353
|
-
**값이 박힌 요금표가 없습니다.** 요금은 회사가 아무 때나 바꾸는 값이라, 소스에
|
|
354
|
-
박아 두면 반년 뒤 이 도구는 틀린 금액을 자신 있게 찍는 도구가 됩니다.
|
|
355
|
-
`.deel/config.json` 에 적으면 셈합니다 — 100만 토큰당 달러입니다.
|
|
356
|
-
|
|
357
|
-
```json
|
|
358
|
-
"요금": { "claude-opus-4-6": { "입력": 0, "출력": 0, "기준": "2026-09-01" } }
|
|
359
|
-
```
|
|
360
|
-
|
|
361
|
-
금액 옆에 **어디서 온 값인지·언제 기준인지**가 같이 뜨고, 반년이 지나면
|
|
362
|
-
`· 오래됨` 이 붙습니다. 모르면 안 찍습니다 — 로컬로만 쓰는 화면에는 돈 이야기가
|
|
363
|
-
아예 안 뜹니다.
|
|
364
|
-
|
|
365
|
-
---
|
|
366
|
-
|
|
367
|
-
## 만료되는 열쇠 (사내 게이트웨이)
|
|
368
|
-
|
|
369
|
-
사내 게이트웨이는 고정된 열쇠를 안 줍니다. 사내 로그인 뒤에 나오는 한 시간짜리
|
|
370
|
-
토큰을 줍니다. 아침에 붙여 넣으면 점심까지는 되고, 그 다음에는 `HTTP 401` 입니다 —
|
|
371
|
-
그 메시지는 **「열쇠가 틀렸다」 와 「열쇠가 늙었다」 를 구별해 주지 않습니다.**
|
|
372
|
-
그래서 사람은 멀쩡한 열쇠를 다시 발급받으러 갑니다.
|
|
373
|
-
|
|
374
|
-
열쇠 대신 **열쇠를 얻는 방법**을 적으세요.
|
|
375
|
-
|
|
376
|
-
```json
|
|
377
|
-
"열쇠받기": {
|
|
378
|
-
"명령": "az account get-access-token --resource api://ai-gw --query accessToken -o tsv",
|
|
379
|
-
"수명": 3600
|
|
380
|
-
}
|
|
381
|
-
```
|
|
382
|
-
|
|
383
|
-
요청 직전에 부르고, 받은 것은 메모리에만 두고, 만료 1분 전부터 미리 새로 받습니다 —
|
|
384
|
-
보내는 순간에 살아 있던 토큰이 게이트웨이에 닿을 때 죽어 있으면 그게 바로 그
|
|
385
|
-
401 이기 때문입니다. 401 을 맞으면 새로 받아 **한 번만** 다시 부릅니다. 두 번째
|
|
386
|
-
401 은 진짜로 권한이 없는 것입니다.
|
|
387
|
-
|
|
388
|
-
| | |
|
|
389
|
-
|---|---|
|
|
390
|
-
| 경로는 직접 적습니다 | 찾아 주지 않습니다. `az` 가 PATH 에 있나 보고 알아서 부르면, 이 프로그램이 언제 무엇을 실행할지 모르게 됩니다 |
|
|
391
|
-
| 딴 프로세스로 띄웁니다 | `import` 하지 않습니다 — 우리 프로세스 안에서 돌면 그 코드가 다른 열쇠와 대화를 봅니다 |
|
|
392
|
-
| 한 판에 한 번 묻습니다 | 받을 때마다가 아닙니다. 세 번 물으면 사람은 손이 가는 대로 누릅니다 |
|
|
393
|
-
| 봉인이면 안 부릅니다 | `--offline` 로 잠근 판은 로그인 포털에 안 나갑니다 |
|
|
394
|
-
| 파일에 안 적습니다 | 이 판이 도는 동안 메모리에만 있습니다 |
|
|
395
|
-
| 배너가 섞이면 거절합니다 | 「Logged in as …」 다음 줄에 토큰이 오는 출력을 통째로 실으면 게이트웨이는 400 을 주고, 화면에서는 열쇠가 틀린 것과 구별이 안 됩니다. 첫 줄을 보여 주므로 `--query` 를 붙일 줄 알게 됩니다 |
|
|
396
|
-
|
|
397
|
-
`/status` 에는 `열쇠 보관 받아 옴 · 52분 남음` 이라고 나옵니다. 보관이라고 안 적는
|
|
398
|
-
까닭은 우리가 그 열쇠를 갖고 있지 않기 때문입니다. 회사가
|
|
399
|
-
[관리 정책](docs/ko/config.md) 파일에 같은 모양으로 적으면 개인 설정을 이기고,
|
|
400
|
-
그때는 묻지 않습니다.
|
|
401
|
-
|
|
402
|
-
---
|
|
403
|
-
|
|
404
|
-
## 로컬 모델 여러 개 쓰기
|
|
405
|
-
|
|
406
|
-
로컬 런타임은 보통 하나만 쓰지 않습니다. Ollama 로 작은 모델을 돌리면서
|
|
407
|
-
LM Studio 로 큰 모델을 띄워 두기도 합니다. `deel scan` 이 알려진 자리 13곳을 동시에 두드려
|
|
408
|
-
전부 찾아냅니다.
|
|
409
|
-
|
|
410
|
-
```
|
|
411
|
-
$ deel scan
|
|
412
|
-
|
|
413
|
-
── 로컬 모델 서버 훑기 ───────────────────────────────────────────────
|
|
414
|
-
127.0.0.1 의 알려진 자리 13곳을 두드립니다. 바깥으로는 나가지 않습니다.
|
|
415
|
-
|
|
416
|
-
✓ 3곳 찾음
|
|
417
|
-
|
|
418
|
-
◆ Ollama 127.0.0.1:11434 Ollama 규격 36ms
|
|
419
|
-
· qwen2.5-coder:7b 7B · 4.4GB
|
|
420
|
-
· llama3.2:1b 1B · 1.2GB
|
|
421
|
-
◆ LM Studio 127.0.0.1:1234 OpenAI 호환 7ms
|
|
422
|
-
· devstral-small-2507
|
|
423
|
-
◆ llama.cpp 127.0.0.1:8080 OpenAI 호환 7ms
|
|
424
|
-
· gemma-3-4b-it
|
|
425
|
-
|
|
426
|
-
합계 서버 3곳 · 모델 6개
|
|
427
|
-
|
|
428
|
-
추천 Ollama · qwen2.5-coder:7b
|
|
429
|
-
코딩용 모델 · 도구 호출을 잘하는 계열
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
포트로 단정하지 않고 **응답을 보고** 런타임을 구분합니다 — Ollama 는 `/api/version`,
|
|
433
|
-
LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추정)` 이라고 밝힙니다.
|
|
434
|
-
|
|
435
|
-
| 명령 | 하는 일 |
|
|
436
|
-
|---|---|
|
|
437
|
-
| `deel scan` | 찾아서 보여주기만 |
|
|
438
|
-
| `deel scan --pick` | 목록에서 골라 등록 |
|
|
439
|
-
| `deel scan --save` | 찾은 것 전부 등록 |
|
|
440
|
-
| `deel scan --ports 9000,9100` | 기본 자리 말고 더 볼 포트 |
|
|
441
|
-
| `deel scan --host <주소>` | 기본은 `127.0.0.1` |
|
|
442
|
-
| `deel scan --key <키>` | 키가 필요한 로컬 서버일 때 |
|
|
443
|
-
|
|
444
|
-
등록한 뒤에는 대화 중 `/model` 로 갈아탑니다. **대화 내용은 그대로 이어집니다.**
|
|
445
|
-
|
|
446
|
-
> **자세히** — 걸린 모델에 맞춰 스스로 바뀝니다 · 국산 모델은 겪기 전에 압니다 · 작은 창에서는 고정 몫을 줄입니다 · 켤 때 이 폴더가 무슨 프로젝트인지 읽습니다
|
|
447
|
-
>
|
|
448
|
-
> **[모델 다루기 읽기 →](docs/ko/models.md#로컬-모델-여러-개-쓰기)**
|
|
449
|
-
|
|
450
|
-
---
|
|
451
|
-
|
|
452
|
-
## 대화 중 명령
|
|
453
|
-
|
|
454
|
-
이름은 Claude Code / Codex 관례에 맞췄습니다.
|
|
455
|
-
|
|
456
|
-
| 명령 | 하는 일 |
|
|
457
|
-
|---|---|
|
|
458
|
-
| `/help` | 명령 목록 |
|
|
459
|
-
| `/bell [on|off]` | 다 됐을 때·물어볼 때 종소리와 창 제목 |
|
|
460
|
-
| `/lang [ko|en|ja|zh] [시킬말]` | 화면 말 (한국어·English·日本語·中文 네 가지). 네 가지 다 채워져 있고, 그 말이 참인지를 **켜서 읽는 검사**가 지킨다 — 일곱 화면을 영어로 띄워 한글이 한 자라도 나오면 빨개진다(`test/langleak.test.js`). 「표는 100% 인데 화면에는 한국어」 를 여기서 한 번 겪었기 때문이다. **시킬 말을 따로 줄 수 있다** — `/lang ko en` 이면 모델에게는 영어로 시키고 답은 한국어로 받는다(8k 창에서 고정 몫 23% 감소). 코드는 그대로 |
|
|
461
|
-
| `/keys` | 이 터미널이 무슨 키를 보내는지 눌러서 확인 — 줄바꿈이 안 될 때 |
|
|
462
|
-
| `/consult <프로필> <질문>` | 다른 모델에게 한 번 물어보기 — 지금 쓰는 것은 안 바꿈 |
|
|
463
|
-
| `/export` | 이 대화를 **보고서 한 장**(HTML)으로 — 시킨 것·바뀐 것·확인한 것. 폐쇄망에서 여는 자기완결 파일 |
|
|
464
|
-
| `/lsp [on\|off]` | 언어 서버 — 무엇이 깔려 있고 `Def`·`Refs` 를 쓸 수 있는지. `off` 는 고친 뒤 진단만 끔 |
|
|
465
|
-
| `/context` | 무엇이 컨텍스트를 먹고 있는지 |
|
|
466
|
-
| `/ctx [auto\|숫자\|자세히]` | 컨텍스트 **길이** — 모델에 맞춰 다시 재거나 직접 지정 |
|
|
467
|
-
| `/out [숫자\|auto]` | 한 번에 받을 **답 길이** 상한 — 큰 파일이 잘리면 여기를 올립니다 |
|
|
468
|
-
| `/grade [작음\|보통\|큼\|auto]` | 모델 **급** — 얼마나 알아서 하나. `/ctx` 와 다른 축입니다 |
|
|
469
|
-
| `/compact` | 앞선 대화를 요약해서 접기 |
|
|
470
|
-
| `/clear` | 대화 비우기 (연결·규칙은 유지) |
|
|
471
|
-
| `/thread [new\|fork\|close\|번호]` | 대화 갈래 — 곁가지를 딴 자리에서. 연결·되돌리기는 같이 씁니다 |
|
|
472
|
-
| `/learned [지우기]` | 쓰면서 저절로 알게 된 것 — 되는 명령·이 모델의 버릇 |
|
|
473
|
-
| `/pin <말>` | 못 박기 — 접거나 요약해도 **안 지워지는** 말 |
|
|
474
|
-
| `/evidence [파일]` | 증거 — 무엇을 바꿨고 무엇이 그걸 증명하나. **안 된 것도** 적습니다 |
|
|
475
|
-
| `/commit [전부\|미리보기\|제목]` | 이번 대화가 바꾼 것만 담아 커밋. 메시지는 diff 와 증거에서. **push 는 안 합니다** |
|
|
476
|
-
| `/model` | 연결·모델 바꾸기 |
|
|
477
|
-
| `/model 카드` | 이 모델을 겪어 본 결과 — 그래서 deel 이 무엇을 바꿔 뒀는지 |
|
|
478
|
-
| `/think <강도>` | 추론 강도 (`off·low·medium·high·max`) |
|
|
479
|
-
| `/think
|
|
480
|
-
| `/think
|
|
481
|
-
| `/
|
|
482
|
-
| `/
|
|
483
|
-
| `/
|
|
484
|
-
| `/
|
|
485
|
-
| `/
|
|
486
|
-
| `/
|
|
487
|
-
| `/
|
|
488
|
-
| `/
|
|
489
|
-
| `/
|
|
490
|
-
| `/
|
|
491
|
-
| `/
|
|
492
|
-
| `/
|
|
493
|
-
| `/
|
|
494
|
-
| `/
|
|
495
|
-
| `/
|
|
496
|
-
| `/
|
|
497
|
-
| `/
|
|
498
|
-
| `/
|
|
499
|
-
| `/
|
|
500
|
-
| `/
|
|
501
|
-
| `/
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
| `
|
|
512
|
-
| `
|
|
513
|
-
|
|
|
514
|
-
|
|
|
515
|
-
|
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
>
|
|
521
|
-
>
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
| `/
|
|
534
|
-
| `/
|
|
535
|
-
| `/
|
|
536
|
-
| `/
|
|
537
|
-
| `/
|
|
538
|
-
| `/
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
- `/
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
>
|
|
553
|
-
>
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
|
566
|
-
|
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
>
|
|
578
|
-
>
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
| `
|
|
590
|
-
| `
|
|
591
|
-
| `
|
|
592
|
-
| `
|
|
593
|
-
| `
|
|
594
|
-
| `
|
|
595
|
-
| `
|
|
596
|
-
| `
|
|
597
|
-
| `
|
|
598
|
-
| `
|
|
599
|
-
| `
|
|
600
|
-
| `
|
|
601
|
-
| `
|
|
602
|
-
| `
|
|
603
|
-
| `
|
|
604
|
-
| `
|
|
605
|
-
| `
|
|
606
|
-
| `
|
|
607
|
-
| `
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
`
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
>
|
|
617
|
-
>
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
>
|
|
638
|
-
>
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
| `
|
|
664
|
-
| `
|
|
665
|
-
| `
|
|
666
|
-
|
|
|
667
|
-
|
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
- `
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
|
699
|
-
|
|
|
700
|
-
|
|
|
701
|
-
|
|
|
702
|
-
|
|
|
703
|
-
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
>
|
|
719
|
-
>
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
| `
|
|
741
|
-
| `
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
>
|
|
770
|
-
>
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
| `deel --
|
|
811
|
-
| `deel
|
|
812
|
-
| `deel sessions
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
<
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
| `deel reset
|
|
840
|
-
| `deel reset
|
|
841
|
-
| `deel reset
|
|
842
|
-
| `deel reset
|
|
843
|
-
| `deel reset
|
|
844
|
-
| `deel reset all
|
|
845
|
-
|
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
| `.deel/
|
|
853
|
-
| `.deel/
|
|
854
|
-
|
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
>
|
|
881
|
-
>
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
|
906
|
-
|
|
|
907
|
-
|
|
|
908
|
-
|
|
|
909
|
-
|
|
|
910
|
-
|
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
>
|
|
917
|
-
>
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
|
976
|
-
|
|
|
977
|
-
|
|
|
978
|
-
|
|
|
979
|
-
|
|
|
980
|
-
|
|
|
981
|
-
|
|
|
982
|
-
|
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
| `
|
|
988
|
-
| `
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
>
|
|
996
|
-
>
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
<
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
| `
|
|
1036
|
-
|
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
deel
|
|
1041
|
-
deel sbom
|
|
1042
|
-
deel sbom --
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
>
|
|
1052
|
-
>
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
>
|
|
1062
|
-
>
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
|
1072
|
-
|
|
|
1073
|
-
|
|
|
1074
|
-
|
|
|
1075
|
-
|
|
|
1076
|
-
|
|
|
1077
|
-
|
|
|
1078
|
-
|
|
|
1079
|
-
|
|
|
1080
|
-
|
|
|
1081
|
-
| `
|
|
1082
|
-
| `
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
npm
|
|
1091
|
-
npm run
|
|
1092
|
-
npm run
|
|
1093
|
-
npm run
|
|
1094
|
-
npm run
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
| `
|
|
1124
|
-
| `
|
|
1125
|
-
| `
|
|
1126
|
-
| `
|
|
1127
|
-
| `
|
|
1128
|
-
| `
|
|
1129
|
-
| `
|
|
1130
|
-
| `
|
|
1131
|
-
| `
|
|
1132
|
-
| `
|
|
1133
|
-
| `
|
|
1134
|
-
| `
|
|
1135
|
-
| `
|
|
1136
|
-
| `
|
|
1137
|
-
| `
|
|
1138
|
-
| `
|
|
1139
|
-
| `
|
|
1140
|
-
| `
|
|
1141
|
-
| `
|
|
1142
|
-
| `
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
>
|
|
1146
|
-
>
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
| [1.
|
|
1156
|
-
| [1.9.
|
|
1157
|
-
|
|
|
1158
|
-
| **[1.
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/hero-ko-dark.svg">
|
|
5
|
+
<img alt="deel — 이 컴퓨터 안에서만" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/hero-ko-light.svg" width="620">
|
|
6
|
+
</picture>
|
|
7
|
+
|
|
8
|
+
### 로컬 모델과 사내 게이트웨이로 도는 코딩 에이전트 CLI
|
|
9
|
+
|
|
10
|
+
의존성 0개 · Node 20+ · 소스가 나가는 자리는 딱 한 곳
|
|
11
|
+
|
|
12
|
+
바깥 API 도 붙습니다 — **말했을 때만**
|
|
13
|
+
|
|
14
|
+
<br>
|
|
15
|
+
|
|
16
|
+
[](https://www.npmjs.com/package/deel-local-cli)
|
|
17
|
+
[](https://www.npmjs.com/package/deel-local-cli)
|
|
18
|
+
[](https://nodejs.org)
|
|
19
|
+
[](LICENSE)
|
|
20
|
+
|
|
21
|
+
[](https://github.com/jysvai/deel-local-cli/actions/workflows/test.yml)
|
|
22
|
+
[](https://github.com/jysvai/deel-local-cli/actions/workflows/codeql.yml)
|
|
23
|
+
[](docs/ko/develop.md)
|
|
24
|
+
|
|
25
|
+
[](https://www.npmjs.com/package/deel-local-cli?activeTab=dependencies)
|
|
26
|
+
[](package.json)
|
|
27
|
+
[](#데이터가-나가는-길)
|
|
28
|
+
[](#데이터가-나가는-길)
|
|
29
|
+
|
|
30
|
+
**[English](README.md)** · [사내 반입 안내](#사내-반입) · [문제 해결](#문제-해결) · [자세한 문서](docs/ko/)
|
|
31
|
+
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
### 켜자마자 제일 궁금한 것부터 답합니다
|
|
37
|
+
|
|
38
|
+
<picture>
|
|
39
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-chat-ko-dark.svg">
|
|
40
|
+
<img alt="deel 시작 화면과 시킨 일 한 바퀴 — 모델·보내는 곳·폴더·승인 방식, 그리고 Grep→Read→Edit" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-chat-ko-light.svg" width="900">
|
|
41
|
+
</picture>
|
|
42
|
+
|
|
43
|
+
**`보냄 이 컴퓨터 안 127.0.0.1 ← 여기 말고는 어디로도 안 갑니다`.**
|
|
44
|
+
문서에 적힌 약속이 아니라 켤 때마다 화면에 뜹니다. 앞에 붙은 `⌂` 는 대화 내내
|
|
45
|
+
상태줄에 남아 있고, 바깥으로 나갈 일이 생기면 그 자리에서 `↗` 로 바뀝니다.
|
|
46
|
+
|
|
47
|
+
그 아래는 시킨 일 한 바퀴입니다 — 찾고(`Grep`), 읽고(`Read`), 고치고(`Edit`),
|
|
48
|
+
무엇을 고쳤는지 그 자리에서 보여 줍니다.
|
|
49
|
+
|
|
50
|
+
> 이 그림은 **진짜로 돌려서 찍은 것**입니다. 손으로 그린 화면은 판이 바뀌어도
|
|
51
|
+
> 안 바뀌어서 조용히 거짓말이 됩니다. `node tools/shot.mjs` 로 다시 만듭니다.
|
|
52
|
+
> (모델 자리는 127.0.0.1 에 띄운 스텁입니다. 도구는 진짜 파일을 읽고 고칩니다.)
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 목차
|
|
57
|
+
|
|
58
|
+
- [왜 만들었나](#왜-만들었나)
|
|
59
|
+
- [무엇이 다른가](#무엇이-다른가)
|
|
60
|
+
- [빠른 시작](#빠른-시작)
|
|
61
|
+
- [데이터가 나가는 길](#데이터가-나가는-길)
|
|
62
|
+
- [바깥 API 붙이기](#바깥-api-붙이기)
|
|
63
|
+
- [만료되는 열쇠 (사내 게이트웨이)](#만료되는-열쇠-사내-게이트웨이)
|
|
64
|
+
- [로컬 모델 여러 개 쓰기](#로컬-모델-여러-개-쓰기)
|
|
65
|
+
- [대화 중 명령](#대화-중-명령)
|
|
66
|
+
- [작업 모드](#작업-모드)
|
|
67
|
+
- [쉬움 · 개발자](#쉬움--개발자)
|
|
68
|
+
- [도구](#도구)
|
|
69
|
+
- [한글 문서와 엑셀](#한글-문서와-엑셀)
|
|
70
|
+
- [만든 웹을 그 자리에서 띄웁니다](#만든-웹을-그-자리에서-띄웁니다)
|
|
71
|
+
- [스킬·플러그인](#스킬플러그인)
|
|
72
|
+
- [추론 강도](#추론-강도)
|
|
73
|
+
- [자동 압축](#자동-압축)
|
|
74
|
+
- [대화 이어하기](#대화-이어하기)
|
|
75
|
+
- [밖에서 도구 붙이기 (MCP)](#밖에서-도구-붙이기-mcp)
|
|
76
|
+
- [에디터 안에서 쓰기 (ACP)](#에디터-안에서-쓰기-acp)
|
|
77
|
+
- [비밀이 새지 않게](#비밀이-새지-않게)
|
|
78
|
+
- [안전망](#안전망)
|
|
79
|
+
- [사내 반입](#사내-반입)
|
|
80
|
+
- [설정](#설정)
|
|
81
|
+
- [문제 해결](#문제-해결)
|
|
82
|
+
- [개발](#개발)
|
|
83
|
+
- [릴리스 노트](#릴리스-노트)
|
|
84
|
+
|
|
85
|
+
여기는 **요약**입니다. 절마다 붙은 링크를 따라가면 그 안의 이야기가 나옵니다.
|
|
86
|
+
|
|
87
|
+
| 자세한 문서 | 무엇이 있나 |
|
|
88
|
+
|---|---|
|
|
89
|
+
| [모델 다루기](docs/ko/models.md) | 급과 창 크기 · 국산 모델 이름표 · 켤 때 프로젝트 읽기 |
|
|
90
|
+
| [화면과 조작](docs/ko/interface.md) | 입력칸 · 작업 모드 · 쉬움과 개발자 · 무엇을 묻고 무엇을 그냥 하나 |
|
|
91
|
+
| [도구 자세히](docs/ko/tools.md) | `Outline` · `Verify` · `Task` · `Jobs` · `Append` · `Def`/`Refs` · 편집 매칭 |
|
|
92
|
+
| [한글 문서와 엑셀](docs/ko/documents.md) | hwpx·docx·pptx·**PDF** · 인코딩 · 엑셀 → CSV |
|
|
93
|
+
| [늘려 쓰기](docs/ko/extend.md) | 스킬 · 플러그인 · MCP · ACP |
|
|
94
|
+
| [속도와 씀씀이](docs/ko/tuning.md) | 단계별 추론 강도 · 프리픽스 캐시 · 컨텍스트 길이 |
|
|
95
|
+
| [안전망과 사내 반입](docs/ko/safety.md) | 되돌리기 · 작업 범위 · 감사기록 · 심사 서류 |
|
|
96
|
+
| [설정](docs/ko/config.md) · [개발](docs/ko/develop.md) | 환경변수 · 실행 옵션 · 검사 돌리기 · 폴더 구조 |
|
|
97
|
+
| [릴리스 노트](docs/ko/releases.md) | [1.10.x](docs/ko/releases/1.10.md) · [1.9.x](docs/ko/releases/1.9.md) · [1.8.x](docs/ko/releases/1.8.md) · [1.7.x](docs/ko/releases/1.7.md) · [그 앞](docs/ko/releases.md) |
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 왜 만들었나
|
|
102
|
+
|
|
103
|
+
사내 보안 정책이 **미승인 소프트웨어 반입**을 막으면, 코딩 에이전트 도구는 대부분 쓸 수 없습니다.
|
|
104
|
+
의존성 수백 개가 딸려 오고, 설치할 때 스크립트가 돌고, 어디로 통신하는지 한 줄로 답할 수 없기 때문입니다.
|
|
105
|
+
|
|
106
|
+
deel 은 그 심사를 통과하는 것을 목표로 만들었습니다.
|
|
107
|
+
|
|
108
|
+
| | deel |
|
|
109
|
+
|---|---|
|
|
110
|
+
| 외부 의존성 | **0개** — Node 내장 기능만 |
|
|
111
|
+
| 설치 스크립트 | **없음** — 압축 풀고 바로 실행 |
|
|
112
|
+
| 소스가 나가는 자리 | **딱 한 곳** — 직접 설정한 주소 |
|
|
113
|
+
| 필요한 것 | Node 20 이상 |
|
|
114
|
+
|
|
115
|
+
직접 확인하실 수 있습니다.
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
npm view deel-local-cli dependencies # {}
|
|
119
|
+
npm view deel-local-cli scripts # install/postinstall 없음
|
|
120
|
+
deel audit # 심사서 전문 출력
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 무엇이 다른가
|
|
126
|
+
|
|
127
|
+
로컬 모델을 상대하는 코딩 에이전트는 몇 개 있습니다. 그런데 **로컬로 돌리는
|
|
128
|
+
걸 전제로 속을 다시 설계한** 것은 드뭅니다.
|
|
129
|
+
|
|
130
|
+
| | 다른 도구 | deel |
|
|
131
|
+
|---|---|---|
|
|
132
|
+
| `/undo` | 파일만 되돌린다 — 대화는 그 일이 있었다고 믿는 채로 | **대화까지** 같이 되감는다 |
|
|
133
|
+
| 긴 대화 | 클라우드가 안 느끼는 비용을 로컬에서도 그대로 짊어진다 | 프리픽스 캐시가 **살아남게** 순서를 설계 |
|
|
134
|
+
| 작은 모델의 편집 | 공백 하나 틀려도 실패 | 성공률 20%→**100%**, 엉뚱한 곳 0건 |
|
|
135
|
+
| 국산 모델 | 겪어 보기 전엔 모른다 | 공개 문서로 **미리** 안다 |
|
|
136
|
+
| "다 됐습니다" | 확인 안 된 것도 됐다고 한다 | `/evidence`·`/export` — **안 된 것까지** 적는다 |
|
|
137
|
+
| MCP·ACP | SDK 가 필요하다 | `child_process` + `JSON` 뿐 |
|
|
138
|
+
| 심사 서류 | 사람이 손으로 써서 실제와 어긋난다 | **코드가 소스를 훑어서** 만든다 |
|
|
139
|
+
|
|
140
|
+
<br>
|
|
141
|
+
|
|
142
|
+
#### `/undo` 는 파일과 대화를 같이 되감습니다
|
|
143
|
+
|
|
144
|
+
파일만 되돌리면 모델은 방금 그 편집을 했다고 계속 믿고 다음 턴을 그 위에
|
|
145
|
+
쌓습니다 — 화면에는 아무 일도 없었던 것처럼 보입니다. deel 은 되돌린 만큼
|
|
146
|
+
오간 메시지도 같이 접습니다. 접다가 도구 호출의 짝이 어긋나면 API 가 400 을
|
|
147
|
+
내므로, 짝을 다시 맞추는 로직(`repairToolPairs`)까지 같이 돕니다.
|
|
148
|
+
|
|
149
|
+
#### 긴 대화에서 로컬 모델이 갈수록 느려지는 이유를 직접 잡았습니다
|
|
150
|
+
|
|
151
|
+
Ollama·llama.cpp 는 프롬프트 앞부분이 한 글자라도 바뀌면 그 뒤 전부를 다시
|
|
152
|
+
계산합니다. 클라우드 API 는 이 비용을 안 느끼니 신경 쓸 이유가 없지만,
|
|
153
|
+
로컬로 돌리는 사람에게는 대화가 길어질수록 턴마다 지연이 쌓입니다. deel 은
|
|
154
|
+
매 턴 바뀔 수 있는 것(모드·핀)을 프롬프트 **맨 끝**으로 보내고, Ollama 에는
|
|
155
|
+
`keep_alive: 60m` 을 같이 보내 앞부분이 캐시에 그대로 남게 합니다. 이 순서는
|
|
156
|
+
검사(`test/cache.test.js`)가 지킵니다.
|
|
157
|
+
|
|
158
|
+
#### 작은 모델도 편집이 실제로 성공합니다
|
|
159
|
+
|
|
160
|
+
작은 로컬 모델은 고치려는 문자열을 공백 하나까지 완벽히 재현하지 못하는
|
|
161
|
+
경우가 흔합니다. `npm run bench` 로 잰 내부 벤치마크에서, 정확히 일치만
|
|
162
|
+
요구하던 옛 방식은 성공률 20% 였습니다. 지금 방식(공백·들여쓰기를 단계적으로
|
|
163
|
+
완화)은 **100%** — 그러면서도 엉뚱한 곳을 고친 건수는 두 방식 다 **0건**
|
|
164
|
+
입니다. 모호하면 찾지 못했다고 말할지언정 짐작해서 고치지 않습니다.
|
|
165
|
+
|
|
166
|
+
#### 국산 모델은 겪어 보기 전에 압니다
|
|
167
|
+
|
|
168
|
+
EXAONE·HyperCLOVA X·Kanana·Midm·Solar 는 공개 문서로 확인 가능한 버릇(예:
|
|
169
|
+
추론형 여부)을 deel 이 미리 알고 시작합니다. 다른 도구는 이 모델들을 한
|
|
170
|
+
번도 못 만나 본 채로 취급하고, 사람이 열 몇 턴을 겪어야 요령이 붙습니다.
|
|
171
|
+
|
|
172
|
+
#### "다 됐습니다" 대신 증명서를 냅니다
|
|
173
|
+
|
|
174
|
+
`/evidence` 와 `/export` 는 무엇을 바꿨는지뿐 아니라 **무엇을 확인하지
|
|
175
|
+
못했는지**까지 적습니다. AI 코딩 도구가 사람을 제일 잘 속이는 순간이 자신
|
|
176
|
+
있게 "됐습니다" 라고 말할 때라는 걸 알기 때문입니다. `/export` 는 바깥
|
|
177
|
+
주소가 하나도 없는 자기완결 HTML 이라 폐쇄망 어디서든 열립니다.
|
|
178
|
+
|
|
179
|
+
#### MCP·ACP 를 SDK 없이 붙였습니다
|
|
180
|
+
|
|
181
|
+
Model Context Protocol 과 Agent Client Protocol 은 둘 다 표준입출력으로 줄
|
|
182
|
+
단위 JSON-RPC 2.0 을 주고받는 게 전부입니다. deel 은 `child_process` 와
|
|
183
|
+
`JSON` 만으로 둘 다 구현했습니다 — 의존성 0개가 "기능을 뺀 결과" 가 아니라
|
|
184
|
+
"안 필요해서" 라는 걸 이 두 가지가 보여 줍니다.
|
|
185
|
+
|
|
186
|
+
#### 심사 서류를 손으로 안 씁니다
|
|
187
|
+
|
|
188
|
+
`deel pack` 이 만드는 반입심사서·SBOM·감사 사양은 **코드가 소스를 훑어서**
|
|
189
|
+
만든 겁니다. 손으로 적은 서류는 언젠가 실제와 어긋나고, 담당자가 그걸 한 번
|
|
190
|
+
발견하면 나머지 서류도 안 믿습니다.
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 빠른 시작
|
|
195
|
+
|
|
196
|
+
### 설치
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
npm install -g deel-local-cli
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
설치가 싫으면 소스를 받아 그대로 쓰셔도 됩니다. `npm install` 이 필요 없습니다.
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
git clone https://github.com/jysvai/deel-local-cli
|
|
206
|
+
node deel-local-cli/bin/deel.js
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
> **주의** — 홈 디렉터리(`~`)에서 `npm install` 하지 마세요. 거기에 `node_modules` 가 생기면
|
|
210
|
+
> 이후 모든 npm 명령이 그 폴더를 훑어서 무관한 패키지 경고를 냅니다. `-g` 로 설치하거나 `npx` 를 쓰세요.
|
|
211
|
+
|
|
212
|
+
### 연결 정하기
|
|
213
|
+
|
|
214
|
+
이 PC 에 떠 있는 로컬 서버를 훑어서 고르는 방법:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
deel scan --pick
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
주소를 직접 넣는 방법 (사내 게이트웨이는 이쪽):
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
deel setup
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### 시작
|
|
227
|
+
|
|
228
|
+
작업할 폴더에서 `deel` 을 칩니다. **그 폴더가 작업 범위가 되고, 밖의 파일은 읽지도 쓰지도 못합니다.**
|
|
229
|
+
|
|
230
|
+
```bash
|
|
231
|
+
cd C:\work\myproject
|
|
232
|
+
deel
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## 데이터가 나가는 길
|
|
238
|
+
|
|
239
|
+
코딩 에이전트는 소스 코드를 통째로 모델에 보냅니다. **그 주소가 어디인지가 전부입니다.**
|
|
240
|
+
말로 보장하는 대신 코드가 막습니다 — `src/safety/network.js` 가 요청마다 확인하고,
|
|
241
|
+
허용 목록에 없으면 요청을 만들지도 않습니다.
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
[A] 모델 게이트웨이 ─── 소스 코드가 나가는 유일한 길
|
|
245
|
+
setup 에서 정한 한 자리만. 모델을 바꾸면 이전 자리는 닫힙니다.
|
|
246
|
+
|
|
247
|
+
[B] 웹 읽기 (WebFetch) ─ 받아 오기만 하는 길
|
|
248
|
+
GET 만. 본문 0바이트. 사내망·로컬 주소는 거절. 다녀온 곳은 전부 기록.
|
|
249
|
+
|
|
250
|
+
[C] 플러그인 받기 ────── /plugin install 을 칠 때만 잠깐
|
|
251
|
+
|
|
252
|
+
[D] MCP 서버 ─────────── 딴 자식 프로세스, 남의 프로그램
|
|
253
|
+
.deel/mcp.json 에 사람이 직접 적어야만 뜹니다. 기본은 꺼져 있습니다.
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
A·B·C 는 deel 이 직접 만드는 요청이라 하나씩 걸러낼 수 있습니다. **[D] 는
|
|
257
|
+
다릅니다** — MCP 서버는 별도 프로세스라 그 안에서 무슨 소켓을 여는지 코드로
|
|
258
|
+
볼 수 없습니다. 그래서 `--offline` 일 때는 요청을 거르는 대신 **그 서버
|
|
259
|
+
자체를 아예 띄우지 않습니다** — 막을 수 없는 것을 막았다고 말하지 않습니다.
|
|
260
|
+
|
|
261
|
+
`--offline` 을 주면 **B·C·D 가 모두 막히고 이 컴퓨터 안으로만** 다닙니다.
|
|
262
|
+
|
|
263
|
+
```bash
|
|
264
|
+
deel --offline
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
무엇이 어디로 갈 수 있는지는 켤 때 화면 맨 위에 늘 적혀 있습니다.
|
|
268
|
+
|
|
269
|
+
```
|
|
270
|
+
deel 1.10.0 ⌂ 이 안
|
|
271
|
+
보냄 이 컴퓨터 안 127.0.0.1:11434 ← 여기 말고는 어디로도 안 갑니다
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### 실행 모드 셋
|
|
275
|
+
|
|
276
|
+
1.6 까지는 자물쇠가 `--offline` 하나였고 **기본이 열림**이었습니다.
|
|
277
|
+
`.deel/config.json` 의 주소 한 줄만 바깥으로 바꾸면 그대로 나갔습니다.
|
|
278
|
+
화면에 `↗` 가 뜨긴 했지만 그건 **알리는 것**이지 막는 것이 아닙니다.
|
|
279
|
+
|
|
280
|
+
| 모드 | 켜는 법 | 바깥 주소일 때 |
|
|
281
|
+
|---|---|---|
|
|
282
|
+
| `⌂ 이 안` | `deel` (처음 값) | **물어봅니다.** 한 번 허락하면 그 연결은 다음부터 안 묻습니다 |
|
|
283
|
+
| `↗ 바깥` | `deel online` · `--online` | 안 물어봅니다 |
|
|
284
|
+
| `⛊ 봉인` | `deel offline` · `--offline` | 기억해 둔 허가까지 무시합니다 (제일 셈) |
|
|
285
|
+
|
|
286
|
+
**주소와 허가가 둘 다 있어야 나갑니다.** 주소만 바꿔서는 못 나갑니다.
|
|
287
|
+
|
|
288
|
+
로컬·사내망(`127.x` · `10.x` · `192.168.x` · `172.16~31.x`)은 셋 중 어느
|
|
289
|
+
모드에서도 그냥 갑니다 — `offline` 은 「인터넷 없음」 이 아니라 「회사 밖으로
|
|
290
|
+
안 나감」 입니다.
|
|
291
|
+
|
|
292
|
+
수집·전송하는 것이 없습니다. 텔레메트리, 사용 통계, 오류 보고 전부 없습니다.
|
|
293
|
+
대화 기록·되돌리기 이력·설정은 작업 폴더의 `.deel/` 안에만 남습니다.
|
|
294
|
+
|
|
295
|
+
> 검증: `npm test` 의 network·web·mcp 검사 159항목. 허용되지 않은 서버에 실제로
|
|
296
|
+
> 요청이 **한 건도 닿지 않는지**, `--offline` 일 때 MCP 서버가 **한 번도 안
|
|
297
|
+
> 뜨는지**까지 진짜 서버를 띄워서 확인합니다.
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## 바깥 API 붙이기
|
|
302
|
+
|
|
303
|
+
로컬 모델이 이 도구의 기본값이고, 그건 안 바뀝니다. 다만 「사내에 GPU 가 없다」
|
|
304
|
+
「이 한 가지만 큰 모델로 하고 싶다」 는 자리가 있어서, 벤더 API 도 붙을 수
|
|
305
|
+
있게 열었습니다. **위의 모드가 그 문을 지킵니다.**
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
deel setup
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
주소를 묻는 대신 **어디에 붙을지**를 묻습니다.
|
|
312
|
+
|
|
313
|
+
```
|
|
314
|
+
1. 열쇠만 있습니다 — 어디 것인지 찾아 드립니다 빈칸 1개
|
|
315
|
+
2. 주소를 직접 넣기 (사내 게이트웨이 · 로컬) 빈칸 2개
|
|
316
|
+
3. OpenAI (GPT) 빈칸 1개
|
|
317
|
+
4. Anthropic (Claude) 빈칸 1개
|
|
318
|
+
5. Google (Gemini) 빈칸 1개
|
|
319
|
+
6. AWS Bedrock 빈칸 2개
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
1번이 핵심입니다. 열쇠 앞머리로 어디 것인지 짚어서 **한 곳만** 묻습니다.
|
|
323
|
+
|
|
324
|
+
```
|
|
325
|
+
❯ sk-ant-api03-••••
|
|
326
|
+
✓ Anthropic (Claude) 열쇠로 보입니다. (열쇠가 sk-ant- 로 시작합니다)
|
|
327
|
+
여기저기 던지지 않습니다.
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
벤더마다 찔러 보는 식으로 만들면 Anthropic 열쇠가 OpenAI 서버로, 다시 Google
|
|
331
|
+
서버로 갑니다. 401 이 오고 끝이지만 **열쇠는 이미 갔습니다.** 그래서 모르는
|
|
332
|
+
열쇠는 짐작하지 않고 사람에게 묻습니다.
|
|
333
|
+
|
|
334
|
+
Bedrock 은 리전을 고릅니다 — 서울(`ap-northeast-2`) 포함 다섯 곳과 「직접 입력」.
|
|
335
|
+
Claude 는 몸통 규격이 달라서 여섯 자리를 따로 흡수했습니다
|
|
336
|
+
([1.7.0 릴리스 노트](docs/ko/releases/1.7.md#170)).
|
|
337
|
+
|
|
338
|
+
### 바깥에 붙으면 파일 속 비밀도 가립니다
|
|
339
|
+
|
|
340
|
+
로컬만 쓸 때는 파일에서 읽어 온 글을 **일부러 안 가렸습니다** — 가리면 모델이
|
|
341
|
+
그 가림표를 다시 파일에 써서 사람의 진짜 열쇠를 지워 버리기 때문입니다.
|
|
342
|
+
|
|
343
|
+
바깥으로 나가면 저울이 뒤집힙니다. `Read` 한 번이면 `.env` 가 통째로 남의
|
|
344
|
+
서버 로그에 남고, 그건 되돌릴 수가 없습니다. 잃는 쪽은 다른 자리에서 막았습니다 —
|
|
345
|
+
`Write`·`Append`·`Edit` 이 가린 표를 파일에 못 씁니다.
|
|
346
|
+
|
|
347
|
+
### 얼마 나갔는지 보입니다
|
|
348
|
+
|
|
349
|
+
```
|
|
350
|
+
❯ ─ 12.4초 · 도구 3회 · ↑8.2k ↓1.1k · $0.0271
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
**값이 박힌 요금표가 없습니다.** 요금은 회사가 아무 때나 바꾸는 값이라, 소스에
|
|
354
|
+
박아 두면 반년 뒤 이 도구는 틀린 금액을 자신 있게 찍는 도구가 됩니다.
|
|
355
|
+
`.deel/config.json` 에 적으면 셈합니다 — 100만 토큰당 달러입니다.
|
|
356
|
+
|
|
357
|
+
```json
|
|
358
|
+
"요금": { "claude-opus-4-6": { "입력": 0, "출력": 0, "기준": "2026-09-01" } }
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
금액 옆에 **어디서 온 값인지·언제 기준인지**가 같이 뜨고, 반년이 지나면
|
|
362
|
+
`· 오래됨` 이 붙습니다. 모르면 안 찍습니다 — 로컬로만 쓰는 화면에는 돈 이야기가
|
|
363
|
+
아예 안 뜹니다.
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
## 만료되는 열쇠 (사내 게이트웨이)
|
|
368
|
+
|
|
369
|
+
사내 게이트웨이는 고정된 열쇠를 안 줍니다. 사내 로그인 뒤에 나오는 한 시간짜리
|
|
370
|
+
토큰을 줍니다. 아침에 붙여 넣으면 점심까지는 되고, 그 다음에는 `HTTP 401` 입니다 —
|
|
371
|
+
그 메시지는 **「열쇠가 틀렸다」 와 「열쇠가 늙었다」 를 구별해 주지 않습니다.**
|
|
372
|
+
그래서 사람은 멀쩡한 열쇠를 다시 발급받으러 갑니다.
|
|
373
|
+
|
|
374
|
+
열쇠 대신 **열쇠를 얻는 방법**을 적으세요.
|
|
375
|
+
|
|
376
|
+
```json
|
|
377
|
+
"열쇠받기": {
|
|
378
|
+
"명령": "az account get-access-token --resource api://ai-gw --query accessToken -o tsv",
|
|
379
|
+
"수명": 3600
|
|
380
|
+
}
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
요청 직전에 부르고, 받은 것은 메모리에만 두고, 만료 1분 전부터 미리 새로 받습니다 —
|
|
384
|
+
보내는 순간에 살아 있던 토큰이 게이트웨이에 닿을 때 죽어 있으면 그게 바로 그
|
|
385
|
+
401 이기 때문입니다. 401 을 맞으면 새로 받아 **한 번만** 다시 부릅니다. 두 번째
|
|
386
|
+
401 은 진짜로 권한이 없는 것입니다.
|
|
387
|
+
|
|
388
|
+
| | |
|
|
389
|
+
|---|---|
|
|
390
|
+
| 경로는 직접 적습니다 | 찾아 주지 않습니다. `az` 가 PATH 에 있나 보고 알아서 부르면, 이 프로그램이 언제 무엇을 실행할지 모르게 됩니다 |
|
|
391
|
+
| 딴 프로세스로 띄웁니다 | `import` 하지 않습니다 — 우리 프로세스 안에서 돌면 그 코드가 다른 열쇠와 대화를 봅니다 |
|
|
392
|
+
| 한 판에 한 번 묻습니다 | 받을 때마다가 아닙니다. 세 번 물으면 사람은 손이 가는 대로 누릅니다 |
|
|
393
|
+
| 봉인이면 안 부릅니다 | `--offline` 로 잠근 판은 로그인 포털에 안 나갑니다 |
|
|
394
|
+
| 파일에 안 적습니다 | 이 판이 도는 동안 메모리에만 있습니다 |
|
|
395
|
+
| 배너가 섞이면 거절합니다 | 「Logged in as …」 다음 줄에 토큰이 오는 출력을 통째로 실으면 게이트웨이는 400 을 주고, 화면에서는 열쇠가 틀린 것과 구별이 안 됩니다. 첫 줄을 보여 주므로 `--query` 를 붙일 줄 알게 됩니다 |
|
|
396
|
+
|
|
397
|
+
`/status` 에는 `열쇠 보관 받아 옴 · 52분 남음` 이라고 나옵니다. 보관이라고 안 적는
|
|
398
|
+
까닭은 우리가 그 열쇠를 갖고 있지 않기 때문입니다. 회사가
|
|
399
|
+
[관리 정책](docs/ko/config.md) 파일에 같은 모양으로 적으면 개인 설정을 이기고,
|
|
400
|
+
그때는 묻지 않습니다.
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## 로컬 모델 여러 개 쓰기
|
|
405
|
+
|
|
406
|
+
로컬 런타임은 보통 하나만 쓰지 않습니다. Ollama 로 작은 모델을 돌리면서
|
|
407
|
+
LM Studio 로 큰 모델을 띄워 두기도 합니다. `deel scan` 이 알려진 자리 13곳을 동시에 두드려
|
|
408
|
+
전부 찾아냅니다.
|
|
409
|
+
|
|
410
|
+
```
|
|
411
|
+
$ deel scan
|
|
412
|
+
|
|
413
|
+
── 로컬 모델 서버 훑기 ───────────────────────────────────────────────
|
|
414
|
+
127.0.0.1 의 알려진 자리 13곳을 두드립니다. 바깥으로는 나가지 않습니다.
|
|
415
|
+
|
|
416
|
+
✓ 3곳 찾음
|
|
417
|
+
|
|
418
|
+
◆ Ollama 127.0.0.1:11434 Ollama 규격 36ms
|
|
419
|
+
· qwen2.5-coder:7b 7B · 4.4GB
|
|
420
|
+
· llama3.2:1b 1B · 1.2GB
|
|
421
|
+
◆ LM Studio 127.0.0.1:1234 OpenAI 호환 7ms
|
|
422
|
+
· devstral-small-2507
|
|
423
|
+
◆ llama.cpp 127.0.0.1:8080 OpenAI 호환 7ms
|
|
424
|
+
· gemma-3-4b-it
|
|
425
|
+
|
|
426
|
+
합계 서버 3곳 · 모델 6개
|
|
427
|
+
|
|
428
|
+
추천 Ollama · qwen2.5-coder:7b
|
|
429
|
+
코딩용 모델 · 도구 호출을 잘하는 계열
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
포트로 단정하지 않고 **응답을 보고** 런타임을 구분합니다 — Ollama 는 `/api/version`,
|
|
433
|
+
LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추정)` 이라고 밝힙니다.
|
|
434
|
+
|
|
435
|
+
| 명령 | 하는 일 |
|
|
436
|
+
|---|---|
|
|
437
|
+
| `deel scan` | 찾아서 보여주기만 |
|
|
438
|
+
| `deel scan --pick` | 목록에서 골라 등록 |
|
|
439
|
+
| `deel scan --save` | 찾은 것 전부 등록 |
|
|
440
|
+
| `deel scan --ports 9000,9100` | 기본 자리 말고 더 볼 포트 |
|
|
441
|
+
| `deel scan --host <주소>` | 기본은 `127.0.0.1` |
|
|
442
|
+
| `deel scan --key <키>` | 키가 필요한 로컬 서버일 때 |
|
|
443
|
+
|
|
444
|
+
등록한 뒤에는 대화 중 `/model` 로 갈아탑니다. **대화 내용은 그대로 이어집니다.**
|
|
445
|
+
|
|
446
|
+
> **자세히** — 걸린 모델에 맞춰 스스로 바뀝니다 · 국산 모델은 겪기 전에 압니다 · 작은 창에서는 고정 몫을 줄입니다 · 켤 때 이 폴더가 무슨 프로젝트인지 읽습니다
|
|
447
|
+
>
|
|
448
|
+
> **[모델 다루기 읽기 →](docs/ko/models.md#로컬-모델-여러-개-쓰기)**
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## 대화 중 명령
|
|
453
|
+
|
|
454
|
+
이름은 Claude Code / Codex 관례에 맞췄습니다.
|
|
455
|
+
|
|
456
|
+
| 명령 | 하는 일 |
|
|
457
|
+
|---|---|
|
|
458
|
+
| `/help` | 명령 목록 |
|
|
459
|
+
| `/bell [on|off]` | 다 됐을 때·물어볼 때 종소리와 창 제목 |
|
|
460
|
+
| `/lang [ko|en|ja|zh] [시킬말]` | 화면 말 (한국어·English·日本語·中文 네 가지). 네 가지 다 채워져 있고, 그 말이 참인지를 **켜서 읽는 검사**가 지킨다 — 일곱 화면을 영어로 띄워 한글이 한 자라도 나오면 빨개진다(`test/langleak.test.js`). 「표는 100% 인데 화면에는 한국어」 를 여기서 한 번 겪었기 때문이다. **시킬 말을 따로 줄 수 있다** — `/lang ko en` 이면 모델에게는 영어로 시키고 답은 한국어로 받는다(8k 창에서 고정 몫 23% 감소). 코드는 그대로 |
|
|
461
|
+
| `/keys` | 이 터미널이 무슨 키를 보내는지 눌러서 확인 — 줄바꿈이 안 될 때 |
|
|
462
|
+
| `/consult <프로필> <질문>` | 다른 모델에게 한 번 물어보기 — 지금 쓰는 것은 안 바꿈 |
|
|
463
|
+
| `/export` | 이 대화를 **보고서 한 장**(HTML)으로 — 시킨 것·바뀐 것·확인한 것. 폐쇄망에서 여는 자기완결 파일 |
|
|
464
|
+
| `/lsp [on\|off]` | 언어 서버 — 무엇이 깔려 있고 `Def`·`Refs` 를 쓸 수 있는지. `off` 는 고친 뒤 진단만 끔 |
|
|
465
|
+
| `/context` | 무엇이 컨텍스트를 먹고 있는지 |
|
|
466
|
+
| `/ctx [auto\|숫자\|자세히]` | 컨텍스트 **길이** — 모델에 맞춰 다시 재거나 직접 지정 |
|
|
467
|
+
| `/out [숫자\|auto]` | 한 번에 받을 **답 길이** 상한 — 큰 파일이 잘리면 여기를 올립니다 |
|
|
468
|
+
| `/grade [작음\|보통\|큼\|auto]` | 모델 **급** — 얼마나 알아서 하나. `/ctx` 와 다른 축입니다 |
|
|
469
|
+
| `/compact` | 앞선 대화를 요약해서 접기 |
|
|
470
|
+
| `/clear` | 대화 비우기 (연결·규칙은 유지) |
|
|
471
|
+
| `/thread [new\|fork\|close\|번호]` | 대화 갈래 — 곁가지를 딴 자리에서. 연결·되돌리기는 같이 씁니다 |
|
|
472
|
+
| `/learned [지우기]` | 쓰면서 저절로 알게 된 것 — 되는 명령·이 모델의 버릇 |
|
|
473
|
+
| `/pin <말>` | 못 박기 — 접거나 요약해도 **안 지워지는** 말 |
|
|
474
|
+
| `/evidence [파일]` | 증거 — 무엇을 바꿨고 무엇이 그걸 증명하나. **안 된 것도** 적습니다 |
|
|
475
|
+
| `/commit [전부\|미리보기\|제목]` | 이번 대화가 바꾼 것만 담아 커밋. 메시지는 diff 와 증거에서. **push 는 안 합니다** |
|
|
476
|
+
| `/model` | 연결·모델 바꾸기 |
|
|
477
|
+
| `/model 카드` | 이 모델을 겪어 본 결과 — 그래서 deel 이 무엇을 바꿔 뒀는지 |
|
|
478
|
+
| `/think <강도>` | 추론 강도 (`off·low·medium·high·xhigh·max`) — 창구가 안 받는 칸은 받는 값으로 낮춰 보냅니다 |
|
|
479
|
+
| `/think auto` | 시킨 말에 맞춰 강도를 고릅니다 — 정한 값이 **천장**이 됩니다 |
|
|
480
|
+
| `/think 배분 <배분>` | 단계별 배분 (`균일·절약·깊게`) |
|
|
481
|
+
| `/think 자세히` | 단계표 — 어느 단계를 어떤 강도·상한으로 도는지 |
|
|
482
|
+
| `/mode <모드>` | 승인 정책 — 얼마나 물어보나 (`auto` · `confirm` · `strict`) |
|
|
483
|
+
| `/work [모드]` | 작업 모드 — 무슨 일을 하는 중인가 |
|
|
484
|
+
| `/auto` | 다시 맡기기 — 말을 보고 알맞은 모드로 저절로 옮겨 갑니다 |
|
|
485
|
+
| `/code` `/plan` `/architect` `/debug` `/ask` `/orchestrator` | 작업 모드 바로 바꾸기 (그때부터 고정) |
|
|
486
|
+
| `/level [수준]` | 화면에 무엇을 내놓을지 (`쉬움` · `개발자`) |
|
|
487
|
+
| `/motion [기본\|기사\|동물\|사무실\|끔]` | 일하는 동안 뭐가 도나 — 그 자리에서 바뀌고 설정에 남습니다 |
|
|
488
|
+
| `/undo [턴수]` | 파일 변경 되돌리기 |
|
|
489
|
+
| `/diff [파일]` | 이번 대화에서 바뀐 파일 · 바뀐 자리 보기 |
|
|
490
|
+
| `/preview [폴더\|파일\|off]` | 만든 웹을 이 자리에서 띄워 보기 — 브라우저가 같이 열립니다 |
|
|
491
|
+
| `/tools` | 쓸 수 있는 도구 |
|
|
492
|
+
| `/skills [검색어\|all\|off]` | 스킬 보기·검색·골라 올리기 |
|
|
493
|
+
| `/plugin [install\|remove\|pack]` | 플러그인 관리 |
|
|
494
|
+
| `/cost` | 이번 세션 사용량 |
|
|
495
|
+
| `/status` | 연결 상태 |
|
|
496
|
+
| `/scan [save]` | 이 PC 에 떠 있는 로컬 모델 서버 훑기 (`save` 면 바로 등록) |
|
|
497
|
+
| `/sessions` | 이 폴더의 지난 대화 목록 |
|
|
498
|
+
| `/recall <말>` | 지난 대화에서 **내용으로** 찾기 |
|
|
499
|
+
| `/memory` | 대화가 끝나도 남는 기억 — 보기·적기·지우기 |
|
|
500
|
+
| `/mcp` | 밖에서 붙인 도구(MCP) 서버 보기 |
|
|
501
|
+
| `/init` | `DEEL.md` 규칙 파일 만들기 |
|
|
502
|
+
| `/exit` | 끝내기 |
|
|
503
|
+
|
|
504
|
+
`/scan` 과 `/sessions` 는 나가지 않고도 씁니다. 로컬 서버를 새로 켰거나 모델을
|
|
505
|
+
바꿔 올렸을 때 `/scan save` → `/model` 두 번이면 대화를 이어둔 채로 갈아탑니다.
|
|
506
|
+
|
|
507
|
+
**치지 않고 쓰는 것**
|
|
508
|
+
|
|
509
|
+
| 키 | 무엇을 |
|
|
510
|
+
|---|---|
|
|
511
|
+
| `Tab` | 치던 `/` 명령을 채웁니다. 치는 도중에 후보가 상자 아래에 뜹니다 |
|
|
512
|
+
| `Shift+Tab` | 승인 방식 (`⏵⏵ 자동` → `⏵ 위험만` → `⏸ 모두`) |
|
|
513
|
+
| `Ctrl+O` | 작업 모드 (`종합` → `코드` → `계획` → …) |
|
|
514
|
+
| `↑` `↓` | 지난 입력 이력 |
|
|
515
|
+
| `Ctrl+C` | 답하는 중이면 그 답만 끊고, 빈 줄에서 두 번이면 끝냅니다 |
|
|
516
|
+
| 일하는 중에 그냥 치고 `Enter` | 하던 일을 안 버리고 방향만 틉니다 — 다음 걸음부터 반영 |
|
|
517
|
+
|
|
518
|
+
한글 조합·붙여넣기·`Ctrl+A/E`·백스페이스는 전부 그대로 됩니다.
|
|
519
|
+
|
|
520
|
+
> **자세히** — @파일 로 바로 붙이기 · 도중에 멈추기 · 멈추지 않고 방향만 틀기
|
|
521
|
+
>
|
|
522
|
+
> **[화면과 조작 읽기 →](docs/ko/interface.md#대화-중-명령)**
|
|
523
|
+
|
|
524
|
+
---
|
|
525
|
+
|
|
526
|
+
## 작업 모드
|
|
527
|
+
|
|
528
|
+
무슨 일을 하는 중인지에 따라 **줄 수 있는 도구와 추론 설정이 같이 바뀝니다.**
|
|
529
|
+
`Shift+Tab` 으로 차례로 돌리거나, 이름을 그대로 치면 됩니다.
|
|
530
|
+
|
|
531
|
+
| 모드 | 하는 일 | 파일을 고치나 | 추론 |
|
|
532
|
+
|---|---|---|---|
|
|
533
|
+
| `/auto` ◎ 종합 | **처음 값.** 말을 보고 알맞은 모드로 옮겨 간다 | 예 | 보통 (`save`) |
|
|
534
|
+
| `/code` ◆ 코드 | 고치고 만든다 | 예 | 보통 (`save`) |
|
|
535
|
+
| `/plan` ☰ 계획 | 먼저 계획만 세운다 | **아니오** | 깊게 (`deep`·high) |
|
|
536
|
+
| `/architect` ◈ 설계 | 구조를 짠다 | **아니오** | 깊게 (`deep`·high) |
|
|
537
|
+
| `/debug` ◉ 디버그 | 원인을 찾는다 | 예 | 깊게 · 단계 많이 (32) |
|
|
538
|
+
| `/ask` ◇ 묻기 | 설명만 한다 | **아니오** | 얕게 (`low`) |
|
|
539
|
+
| `/orchestrator` ❋ 총괄 | 큰 일을 쪼개서 | 예 | 단계 아주 많이 (40) |
|
|
540
|
+
|
|
541
|
+
읽기만 하는 모드에서는 `Write`·`Edit`·`Bash` 를 **모델에게 아예 보내지 않습니다.**
|
|
542
|
+
"고치지 마세요" 라고 부탁하지 않습니다 — 모델은 부탁을 잊습니다. 없는 도구는 못 씁니다.
|
|
543
|
+
|
|
544
|
+
`/mode` 와 헷갈리지 마세요. 둘은 다른 축입니다.
|
|
545
|
+
|
|
546
|
+
- `/mode` — **얼마나 물어보나** (auto · confirm · strict)
|
|
547
|
+
- `/work` — **무슨 일을 하는 중인가** (위 일곱 가지)
|
|
548
|
+
|
|
549
|
+
`/think` 나 `/mode` 를 직접 고른 적이 있으면 그 선택이 우선합니다.
|
|
550
|
+
모드가 사람이 고른 값을 덮어쓰지 않습니다.
|
|
551
|
+
|
|
552
|
+
> **자세히** — 저절로 옮겨 가기 (종합 모드)
|
|
553
|
+
>
|
|
554
|
+
> **[화면과 조작 읽기 →](docs/ko/interface.md#작업-모드)**
|
|
555
|
+
|
|
556
|
+
---
|
|
557
|
+
|
|
558
|
+
## 쉬움 · 개발자
|
|
559
|
+
|
|
560
|
+
처음 켠 사람에게 명령 스무 개를 들이밀면 아무것도 못 고릅니다.
|
|
561
|
+
그렇다고 기능을 잠그면 쓸 만해졌을 때 막힙니다. 그래서 **보이는 것만** 나눕니다.
|
|
562
|
+
|
|
563
|
+
| | 쉬움 (기본) | 개발자 |
|
|
564
|
+
|---|---|---|
|
|
565
|
+
| `/help` 목록 | 자주 쓰는 것만 | 전부 |
|
|
566
|
+
| 오류 문구 | 무엇을 하면 되는지 | 원래 문구 그대로 |
|
|
567
|
+
| 안전 장치 | **똑같음** | **똑같음** |
|
|
568
|
+
|
|
569
|
+
`/level 개발자` 로 바꾸면 설정에 남아 다음에 켤 때도 이어집니다.
|
|
570
|
+
|
|
571
|
+
중요한 것 두 가지입니다.
|
|
572
|
+
|
|
573
|
+
- **감춘 것도 그대로 먹습니다.** 쉬움에서 `/think high` 를 쳐도 됩니다. 목록에 안 띄울 뿐입니다.
|
|
574
|
+
- **초보라고 승인을 덜 받지 않습니다.** 되돌리기·작업 범위·위험 명령 차단은 두 수준이 같습니다.
|
|
575
|
+
초보일수록 되돌릴 수 있어야 합니다.
|
|
576
|
+
|
|
577
|
+
> **자세히** — 입력칸 · 명령은 다 안 쳐도 됩니다 · 일하는 중에는 상자가 그대로 있습니다 · 왼쪽 그림도 같이 움직입니다 외 1개
|
|
578
|
+
>
|
|
579
|
+
> **[화면과 조작 읽기 →](docs/ko/interface.md#쉬움--개발자)**
|
|
580
|
+
|
|
581
|
+
---
|
|
582
|
+
|
|
583
|
+
## 도구
|
|
584
|
+
|
|
585
|
+
이름과 인자를 Claude Code 와 같게 맞췄습니다. 그 관례로 쓰인 스킬·명령이 그대로 먹습니다.
|
|
586
|
+
|
|
587
|
+
| 도구 | 하는 일 |
|
|
588
|
+
|---|---|
|
|
589
|
+
| `Read` | 파일 읽기 (줄 번호 · `offset`/`limit` 지원 · **엑셀은 CSV 로, hwpx·docx·pptx·PDF 는 글로 바꿔서**) |
|
|
590
|
+
| `Write` | 파일 쓰기·덮어쓰기 (**여러 개는 `files` 배열로 한 번에**) |
|
|
591
|
+
| `Append` | 파일 끝에 이어 붙이기 — **큰 파일을 나눠 쓰는 자리** |
|
|
592
|
+
| `Edit` | 정확한 문자열 바꾸기 (`replace_all` · **여러 군데는 `edits` 배열로 한 번에**) |
|
|
593
|
+
| `Move` | 파일·폴더 옮기기·이름 바꾸기 — **구조를 바꾸는 자리** (`moves` 배열로 한 번에 · 되돌리기에 잡힘) |
|
|
594
|
+
| `Glob` | 이름 패턴으로 파일 찾기 |
|
|
595
|
+
| `Grep` | 내용 정규식 검색 |
|
|
596
|
+
| `Bash` | 명령 실행 (**끝나지 않는 것은 `background: true`**) |
|
|
597
|
+
| `Skill` | 스킬 본문 펼쳐 읽기 (스킬이 있을 때만 모델에게 보임) |
|
|
598
|
+
| `WebFetch` | 웹 페이지 읽기 (읽기 전용 · `--offline` 이면 숨김) |
|
|
599
|
+
| `Ask` | 갈림길에서 **사람에게 되묻기** — 고를 것을 주고 숫자 하나로 받는다 |
|
|
600
|
+
| `Recall` | **지난 대화**에서 찾기 — "저번에 그거" 를 모델이 스스로 뒤진다 |
|
|
601
|
+
| `Remember` | 대화가 끝나도 남길 것 한 줄 — 다음에 켤 때 처음부터 안다 |
|
|
602
|
+
| `TodoWrite` | 할 일 목록 — 긴 일을 쪼개서 어디까지 했는지 화면에 띄움 |
|
|
603
|
+
| `Outline` | 폴더의 **뼈대만** 보기 — 통째로 읽는 것보다 수십 분의 일 |
|
|
604
|
+
| `Verify` | 만든 것이 **진짜 되는지** 확인 |
|
|
605
|
+
| `Task` | 큰 일의 한 덩이를 **따로 떨어진 창**에서 돌리기 |
|
|
606
|
+
| `Jobs` | **뒤에서 도는 명령** 보기·읽기·끝내기 — `Bash` 의 `background` 와 짝 |
|
|
607
|
+
| `Def` | 이름이 **어디 정의됐는지** — 언어 서버가 깔려 있을 때만 보입니다 |
|
|
608
|
+
| `Refs` | 이름을 **어디서 쓰는지** 전부 — 언어 서버가 깔려 있을 때만 보입니다 |
|
|
609
|
+
|
|
610
|
+
Claude Code 에 없는 것은 아홉입니다 — `Append` · `Move` · `Ask` · `Recall` ·
|
|
611
|
+
`Remember` · `Outline` · `Verify` · `Task` · `Jobs`. 도구 하나가 스키마로 150~400토큰을 먹고
|
|
612
|
+
그게 **매 요청마다** 나가므로, 늘릴 때마다 검사에서 한 번 멈추게 해 뒀습니다
|
|
613
|
+
(`test/loop.test.js`). 뒤의 넷은 그 값을 치르고도 넣을 만해서 넣은 것들이라,
|
|
614
|
+
아래에 왜인지를 적어 뒀습니다.
|
|
615
|
+
|
|
616
|
+
> **자세히** — Outline · Verify · Task · Def · Refs · 끝나지 않는 명령은 뒤에서 외 9개
|
|
617
|
+
>
|
|
618
|
+
> **[도구 자세히 읽기 →](docs/ko/tools.md#도구)**
|
|
619
|
+
|
|
620
|
+
---
|
|
621
|
+
|
|
622
|
+
## 한글 문서와 엑셀
|
|
623
|
+
|
|
624
|
+
**CP949 로 저장된 파일은 CP949 로 되돌려 씁니다.** 인코딩을 바꾸지 않습니다.
|
|
625
|
+
엑셀(`.xlsx`)은 CSV 로, 한글·워드·파워포인트(`.hwpx`/`.docx`/`.pptx`)와
|
|
626
|
+
**PDF** 는 글로 바꿔서 읽습니다 — 전부 읽기 전용입니다.
|
|
627
|
+
|
|
628
|
+
PDF 는 **못 읽은 쪽을 못 읽었다고 말합니다.** 스캔본·암호·글꼴 표가 없는 쪽은
|
|
629
|
+
빈 글로 넘기지 않고 그 자리에 까닭을 적습니다 — 빈 글은 「그런 내용이 없다」로
|
|
630
|
+
읽히기 때문입니다.
|
|
631
|
+
|
|
632
|
+
옛 형식(`.ppt`·`.doc`·`.xls`·`.rtf`)은 **이 PC 에 깔린 LibreOffice 를 빌려서**
|
|
633
|
+
읽습니다 — `rg` 를 빌려 쓰는 것과 같은 원칙으로, 아무것도 설치하지 않습니다.
|
|
634
|
+
없으면 **없다고 못 박고 끝냅니다**(무엇이 없어서 못 하는지, 무엇을 하면 되는지,
|
|
635
|
+
그리고 「다시 열지 말라」까지). 끄려면 `DEEL_CONVERT=off`.
|
|
636
|
+
|
|
637
|
+
> **자세히** — 인코딩 · 엑셀 · hwpx/docx/pptx · PDF · 변환기 빌려 쓰기
|
|
638
|
+
>
|
|
639
|
+
> **[한글 문서와 엑셀 읽기 →](docs/ko/documents.md#한글-문서와-엑셀)**
|
|
640
|
+
|
|
641
|
+
---
|
|
642
|
+
|
|
643
|
+
## 만든 웹을 그 자리에서 띄웁니다
|
|
644
|
+
|
|
645
|
+
```
|
|
646
|
+
❯ /preview
|
|
647
|
+
|
|
648
|
+
▶ 띄웠습니다 http://127.0.0.1:56801/
|
|
649
|
+
보여 주는 것 .
|
|
650
|
+
파일을 고치면 화면이 저절로 새로 뜹니다.
|
|
651
|
+
이 컴퓨터에서만 열립니다(127.0.0.1). 다른 PC 에서는 안 보입니다.
|
|
652
|
+
끄려면 /preview off · deel 을 끝내면 같이 꺼집니다.
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
브라우저가 같이 열립니다. `/preview 폴더` 로 자리를 정하고, `/preview off` 로 끕니다.
|
|
656
|
+
|
|
657
|
+
**파일을 두 번 눌러 여는 것(`file://`)과 다릅니다.** `file://` 에서는 아래가 전부
|
|
658
|
+
막힙니다 — 그런데 오류는 콘솔에만 나오고 화면은 그냥 희어서, 만든 사람은 제 코드를
|
|
659
|
+
의심하며 시간을 씁니다. 진짜 HTTP 서버라 다 돕니다:
|
|
660
|
+
|
|
661
|
+
| | `file://` | `/preview` |
|
|
662
|
+
|---|---|---|
|
|
663
|
+
| `<script type="module">` · `import` | 막힘 (CORS) | **됨** |
|
|
664
|
+
| `fetch('./자료.json')` | 막힘 | **됨** |
|
|
665
|
+
| `new Worker(...)` | 막힘 | **됨** |
|
|
666
|
+
| `WebAssembly.compileStreaming` | 막힘 (형식) | **됨** |
|
|
667
|
+
| 텍스처·`getImageData` | 캔버스 오염 | **됨** |
|
|
668
|
+
| `.glb` / `.gltf` (Three.js) | 형식 없음 → 조용히 안 그려짐 | **됨** |
|
|
669
|
+
|
|
670
|
+
실제 크롬에서 이 일곱 가지를 돌려 **7/7** 을 확인했습니다.
|
|
671
|
+
|
|
672
|
+
라우터를 쓰는 앱(React Router 등)은 안쪽 주소에서 새로고침해도 첫 장이 나옵니다.
|
|
673
|
+
다만 확장자가 있는 요청(`app.js`)에는 절대 안 그럽니다 — 없는 스크립트에 HTML 을
|
|
674
|
+
돌려주면 `Unexpected token '<'` 로 죽는데, 그게 진짜 원인(파일 이름 오타)을 가립니다.
|
|
675
|
+
|
|
676
|
+
### 열어 주는 만큼만 엽니다
|
|
677
|
+
|
|
678
|
+
서버를 띄운다는 것은 내 디스크를 남에게 열어 주는 일입니다.
|
|
679
|
+
|
|
680
|
+
- **`127.0.0.1` 에만** 묶습니다. `0.0.0.0` 은 아예 못 씁니다 — 같은 사무실 망에서
|
|
681
|
+
아무나 내 소스를 읽게 됩니다.
|
|
682
|
+
- 포트는 **0**(커널이 빈 것을 줍니다). 고정 포트는 남이 쓰던 것을 뺏습니다.
|
|
683
|
+
- 경로는 작업 범위 밖으로 못 나갑니다. `../` · `%2e%2e` · 두 번 인코딩 · 절대 경로 ·
|
|
684
|
+
널바이트 · 심볼릭 링크 — 여덟 가지를 검사로 막아 뒀습니다.
|
|
685
|
+
- **주기만 합니다.** `POST` · `PUT` · `DELETE` 는 405 로 거절합니다.
|
|
686
|
+
- `deel` 을 끝내면 같이 꺼집니다.
|
|
687
|
+
|
|
688
|
+
## 스킬·플러그인
|
|
689
|
+
|
|
690
|
+
**남의 스킬은 품고 다니지 않습니다.** 켜질 때 그 PC 를 훑어 있는 것을 그대로 씁니다.
|
|
691
|
+
|
|
692
|
+
**다만 일하는 방법 일곱 가지는 품고 다닙니다.** 사내에서 새로 받은 PC 에는
|
|
693
|
+
`~/.claude/skills` 도 플러그인도 없습니다. 거기서는 방법론이 0개라 모델이 매번
|
|
694
|
+
제 나름대로 했고, 시킨 것만 겨우 하고 끝나는 얄팍한 결과가 거기서 나왔습니다.
|
|
695
|
+
|
|
696
|
+
| 스킬 | 언제 |
|
|
697
|
+
|---|---|
|
|
698
|
+
| `깊이있게-만들기` | 고도화·보고용·선포용 — 최소치만 내고 끝내지 않게 |
|
|
699
|
+
| `끝까지-하기` | 시킨 것이 여러 조각일 때. 빼먹은 것은 말하게 |
|
|
700
|
+
| `차근차근-디버깅` | 재현 → 좁히기 → 원인 → 고치기 → 증명 |
|
|
701
|
+
| `검사-먼저` | 고치기 전에 실패하는 검사부터 |
|
|
702
|
+
| `찔러보기` | 되는지 모를 때 시간 정해 작게 찔러 보고 버리기 |
|
|
703
|
+
| `코드-줄이기` | 동작은 그대로 두고 읽기 쉽게 |
|
|
704
|
+
| `스스로-검토` | 다 됐다고 말하기 전에. 못 잰 것까지 말하게 |
|
|
705
|
+
|
|
706
|
+
목록으로 늘 나가는 몫은 354토큰입니다(8k 창의 4%). 본문은 `Skill` 로 부를 때만 나갑니다.
|
|
707
|
+
같은 이름을 직접 만들면 그쪽이 이깁니다 — 품고 다니는 것이 제일 낮은 자리입니다.
|
|
708
|
+
|
|
709
|
+
```
|
|
710
|
+
품고 다님 (패키지 안) ← 제일 낮은 자리
|
|
711
|
+
프로젝트 ./.deel/skills ./.claude/skills ./.deel/commands ./.claude/commands
|
|
712
|
+
사용자 ~/.deel/skills ~/.claude/skills ~/.claude/commands
|
|
713
|
+
플러그인 ~/.claude/plugins/** ~/.deel/plugins/**
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
Claude Code 와 같은 형식(`SKILL.md` + YAML 앞머리, `commands/*.md`, `$ARGUMENTS`)을 읽습니다.
|
|
717
|
+
|
|
718
|
+
> **자세히** — 3단계로 나눠 올립니다 · 플러그인 받아 오기 · 안 넣은 것
|
|
719
|
+
>
|
|
720
|
+
> **[늘려 쓰기 읽기 →](docs/ko/extend.md#스킬플러그인)**
|
|
721
|
+
|
|
722
|
+
---
|
|
723
|
+
|
|
724
|
+
## 추론 강도
|
|
725
|
+
|
|
726
|
+
에이전트 한 번의 대답은 모델을 여러 번 부릅니다. **부를 때마다 필요한 생각의 양이 다릅니다.**
|
|
727
|
+
전부 세게 두면 느리고, 전부 얕게 두면 엉뚱한 길로 갑니다.
|
|
728
|
+
|
|
729
|
+
기본은 **한 줄**입니다. 알고 싶은 것은 '지금 얼마나 생각하나' 이지 단계표가 아닙니다.
|
|
730
|
+
|
|
731
|
+
```
|
|
732
|
+
$ /think
|
|
733
|
+
|
|
734
|
+
추론 강도 medium (첫 판단 medium · 이어가기 low · 막혔을 때 high)
|
|
735
|
+
더 세게 /think high 더 빠르게 /think low
|
|
736
|
+
```
|
|
737
|
+
|
|
738
|
+
| 배분 | 성격 |
|
|
739
|
+
|---|---|
|
|
740
|
+
| `even` (균일) | 모든 단계 같은 강도 — 예측 가능한 대신 느림 |
|
|
741
|
+
| `save` (절약, 기본) | 첫 판단만 세게, 이어가기는 얕게 |
|
|
742
|
+
| `deep` (깊게) | 전 단계 한 칸씩 위로 — 어려운 일에만 |
|
|
743
|
+
|
|
744
|
+
배분은 `/think 배분 절약` 로 정합니다. **강도와 배분은 다른 축이라 명령을 갈랐습니다** —
|
|
745
|
+
전에는 `/think high` 와 `/think save` 가 같은 이름으로 다른 것을 정해서,
|
|
746
|
+
화면을 봐도 지금 무엇이 무엇인지 읽히지 않았습니다.
|
|
747
|
+
|
|
748
|
+
단계표는 `/think 자세히` 로 뺐습니다(개발자 수준 기본).
|
|
749
|
+
|
|
750
|
+
```
|
|
751
|
+
$ /think 자세히
|
|
752
|
+
|
|
753
|
+
추론 강도 medium (첫 판단 medium · 이어가기 low · 막혔을 때 high)
|
|
754
|
+
배분 절약 첫 판단만 세게, 이어가기는 얕게 — 대개 이게 낫습니다
|
|
755
|
+
|
|
756
|
+
단계 강도 출력상한 언제
|
|
757
|
+
첫 판단 · medium 15,549 무엇을 할지 정하는 자리
|
|
758
|
+
이어가기 ↓ low 13,605 도구 결과를 읽고 다음 한 수
|
|
759
|
+
막혔을 때 ↑ high 16,384 직전 도구가 오류를 냄
|
|
760
|
+
|
|
761
|
+
출력 상한은 16,384 (모르는 값이라 기본값) 안에서 나눕니다 — /out
|
|
762
|
+
컨텍스트 40,960 · 지금 찬 양 2,087
|
|
763
|
+
```
|
|
764
|
+
|
|
765
|
+
마지막에서 두 번째 줄이 있는 이유: **세 값이 다 같을 때 그게 고장인지 아닌지**
|
|
766
|
+
이 한 줄로 갈립니다. 아는 상한이 낮으면 셋이 같아지는 것이 맞습니다.
|
|
767
|
+
한동안 이 표는 세 줄이 늘 `16,384` 였고, 그건 표가 뜻이 없다는 뜻이었습니다.
|
|
768
|
+
|
|
769
|
+
> **자세히** — 컨텍스트 길이는 모델에서 긁어옵니다 · /out · 잘린 도구 호출
|
|
770
|
+
>
|
|
771
|
+
> **[속도와 씀씀이 읽기 →](docs/ko/tuning.md#추론-강도)**
|
|
772
|
+
|
|
773
|
+
---
|
|
774
|
+
|
|
775
|
+
## 자동 압축
|
|
776
|
+
|
|
777
|
+
컨텍스트가 80% 차면 앞선 대화를 **요약해서 접고 계속 이어 갑니다.**
|
|
778
|
+
그냥 잘라내면 모델이 하던 일을 잊고, 파일을 다시 읽고, 이미 고친 곳을 또 고칩니다.
|
|
779
|
+
|
|
780
|
+
```
|
|
781
|
+
◱ 대화 44개를 요약으로 접었습니다 — 10,399 → 3,170 토큰 (70% 줄어듦)
|
|
782
|
+
```
|
|
783
|
+
|
|
784
|
+
요약은 목표 / 한 일 / 알아낸 것 / 정한 것 / 남은 일 다섯 항목으로 남습니다.
|
|
785
|
+
접을 때 **도구 호출과 그 결과가 갈라지지 않는 자리**를 골라 자릅니다 — 갈라지면 서버가 400 을 냅니다.
|
|
786
|
+
요약 요청이 실패하면 옛 방식(그냥 줄이기)으로 물러서고 멈추지 않습니다.
|
|
787
|
+
|
|
788
|
+
`/compact` 로 직접 접을 수도 있습니다.
|
|
789
|
+
|
|
790
|
+
---
|
|
791
|
+
|
|
792
|
+
## 대화 이어하기
|
|
793
|
+
|
|
794
|
+
터미널을 실수로 닫거나 컴퓨터가 재부팅돼도 하던 대화를 그대로 이어 받습니다.
|
|
795
|
+
오간 내용은 **메시지 하나가 끝날 때마다 바로** `.deel/sessions/` 에 적히기 때문에,
|
|
796
|
+
도중에 죽어도 그 직전까지는 남습니다.
|
|
797
|
+
|
|
798
|
+
```
|
|
799
|
+
$ deel sessions
|
|
800
|
+
|
|
801
|
+
── 이 폴더의 대화 ──────────────────────────────────────────────
|
|
802
|
+
● 20260824-090200 방금 1턴 devstral-small-2507
|
|
803
|
+
테스트 깨진 거 고쳐줘
|
|
804
|
+
· 20260824-084500 2시간 전 2턴 qwen2.5-coder:7b
|
|
805
|
+
src/a.js 의 로그를 logger 로 바꿔줘
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
| 명령 | 하는 일 |
|
|
809
|
+
|---|---|
|
|
810
|
+
| `deel --continue` | 이 폴더에서 가장 최근 대화 이어하기 |
|
|
811
|
+
| `deel --resume <id>` | 골라서 이어하기 |
|
|
812
|
+
| `deel sessions` | 남아 있는 대화 목록 |
|
|
813
|
+
| `deel sessions --rm <id>` | 하나 지우기 |
|
|
814
|
+
|
|
815
|
+
한 줄에 메시지 하나씩 쓰는 `jsonl` 이라, 쓰다가 전원이 나가도 마지막 줄만 잃습니다.
|
|
816
|
+
이어받은 대화는 도구 호출과 그 결과의 짝까지 그대로 살아 있어 바로 이어서 일할 수 있습니다.
|
|
817
|
+
30일이 지나고 최근 30개 밖인 것은 자동으로 정리합니다.
|
|
818
|
+
|
|
819
|
+
저장 위치는 작업 폴더의 `.deel/sessions/` 이고, `.gitignore` 에 `.deel/` 이 들어 있어
|
|
820
|
+
깃에 올라가지 않습니다.
|
|
821
|
+
|
|
822
|
+
---
|
|
823
|
+
|
|
824
|
+
## 되돌아가기 (`deel reset`)
|
|
825
|
+
|
|
826
|
+
연결을 바꿔 보다, 배운 것이 꼬여서, 남에게 넘기기 전에 — 처음으로 돌리고 싶을 때가 있습니다.
|
|
827
|
+
다시 깔아도 `~/.deel` 은 그대로 남아서 사실 초기화가 안 됩니다. 그래서 따로 있습니다.
|
|
828
|
+
|
|
829
|
+
<picture>
|
|
830
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-reset-dark.svg">
|
|
831
|
+
<img alt="deel reset — 지울 수 있는 것과 안 지우는 것을 세어서 보여 준다" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-reset-light.svg" width="760">
|
|
832
|
+
</picture>
|
|
833
|
+
|
|
834
|
+
|
|
835
|
+
**그냥 `deel reset` 은 아무것도 안 지웁니다.** 무엇이 얼마나 있는지 보여 주고 물어봅니다.
|
|
836
|
+
|
|
837
|
+
| 명령 | 지우는 것 |
|
|
838
|
+
|---|---|
|
|
839
|
+
| `deel reset model` | 연결·프로필 + 잠금장치에 든 열쇠 |
|
|
840
|
+
| `deel reset memory` | 기억 (`.deel/memory.md`) |
|
|
841
|
+
| `deel reset sessions` | 대화 기록 |
|
|
842
|
+
| `deel reset learned` | 배운 것 (이 PC + 이 폴더) |
|
|
843
|
+
| `deel reset plugins` | 설치한 플러그인 |
|
|
844
|
+
| `deel reset all` | 위에서 **플러그인만 빼고** 전부 |
|
|
845
|
+
| `deel reset all --hard` | 거기에 되돌리기 스냅샷·감사기록까지 |
|
|
846
|
+
| `--yes` | 안 묻고 지웁니다 (스크립트·초기 배포용) |
|
|
847
|
+
|
|
848
|
+
무엇을 **안** 지우는지가 더 중요합니다.
|
|
849
|
+
|
|
850
|
+
| 안 지우는 것 | 왜 |
|
|
851
|
+
|---|---|
|
|
852
|
+
| `.deel/history/` (되돌리기 스냅샷) | 승인 프롬프트 대신 내건 안전망 그 자체입니다. `--hard` 로만 |
|
|
853
|
+
| `.deel/audit.jsonl` (감사기록) | 사내 심사에 낼 근거입니다. `--hard` 로만 |
|
|
854
|
+
| `.deel/mcp.json` · `.deelignore` · `DEEL.md` | 사람이 손으로 적은 것입니다. **어떤 길로도 안 건드립니다** |
|
|
855
|
+
| 작업 폴더의 나머지 전부 | `.deel` 과 살림 폴더 밖은 아예 손대지 않습니다 |
|
|
856
|
+
|
|
857
|
+
설정이 깨져 있어도 돕니다 — 초기화를 찾는 까닭이 대개 그것이라서,
|
|
858
|
+
`deel reset` 은 `deel --version` 처럼 연결을 안 읽고 시작합니다.
|
|
859
|
+
플러그인은 다시 받는 데 시간이 걸려서 `all` 에 안 넣었습니다. 따로 골라야 지웁니다.
|
|
860
|
+
|
|
861
|
+
---
|
|
862
|
+
|
|
863
|
+
## 밖에서 도구 붙이기 (MCP)
|
|
864
|
+
|
|
865
|
+
사내 위키 검색기, 이슈 트래커, DB 조회기 같은 것을 각 팀이 MCP 서버로 만들어 두면
|
|
866
|
+
deel 은 그걸 **코드를 안 고치고** 도구로 씁니다.
|
|
867
|
+
|
|
868
|
+
`.deel/mcp.json` 에 적습니다. Claude Code 설정을 그대로 복사해 붙일 수 있습니다:
|
|
869
|
+
|
|
870
|
+
```json
|
|
871
|
+
{ "mcpServers": { "사내위키": { "command": "node", "args": ["wiki-mcp.js"] } } }
|
|
872
|
+
```
|
|
873
|
+
|
|
874
|
+
모델에게는 `mcp__사내위키__검색` 이라는 이름으로 보입니다. `/mcp` 로 무엇이 붙었는지 봅니다.
|
|
875
|
+
|
|
876
|
+
**의존성은 그대로 0 입니다.** stdio 규격은 자식 프로세스의 stdin/stdout 에 줄 단위
|
|
877
|
+
JSON-RPC 2.0 을 주고받는 것이 전부라, `child_process` 와 `JSON` 이면 됩니다. SDK 가
|
|
878
|
+
필요 없습니다.
|
|
879
|
+
|
|
880
|
+
> **자세히** — 다만 이건 남의 프로그램입니다
|
|
881
|
+
>
|
|
882
|
+
> **[늘려 쓰기 읽기 →](docs/ko/extend.md#밖에서-도구-붙이기-mcp)**
|
|
883
|
+
|
|
884
|
+
---
|
|
885
|
+
|
|
886
|
+
## 에디터 안에서 쓰기 (ACP)
|
|
887
|
+
|
|
888
|
+
터미널을 하나 더 띄우게 하는 도구는 두 주쯤 뒤에 안 씁니다. 개발자는 하루 종일
|
|
889
|
+
IDE 안에 있습니다. 그래서 **ACP**(Agent Client Protocol)를 지킵니다 — Zed ·
|
|
890
|
+
JetBrains · Neovim · Emacs 가 **저쪽을 한 줄도 안 고치고** deel 을 붙입니다.
|
|
891
|
+
|
|
892
|
+
에디터 설정에 이 명령 하나만 적으면 됩니다.
|
|
893
|
+
|
|
894
|
+
```
|
|
895
|
+
deel acp
|
|
896
|
+
```
|
|
897
|
+
|
|
898
|
+
에디터가 이걸 자식 프로세스로 띄우고, 표준입출력으로 줄 단위 JSON-RPC 2.0 을
|
|
899
|
+
주고받습니다. 사람이 직접 칠 명령은 아닙니다.
|
|
900
|
+
|
|
901
|
+
**붙으면 이렇게 됩니다.**
|
|
902
|
+
|
|
903
|
+
| 에디터 쪽 | deel 쪽 |
|
|
904
|
+
|---|---|
|
|
905
|
+
| 답이 흘러나오는 자리 | 모델이 흘리는 글 · 생각 |
|
|
906
|
+
| 도구 목록 (아이콘·상태) | `Read` 는 읽기, `Edit` 는 고치기, `Bash` 는 실행 — **갈래를 붙여** 보냅니다 |
|
|
907
|
+
| 파일 링크 | 고친 파일의 **절대 경로**. 눌러서 그 자리로 갑니다 |
|
|
908
|
+
| 승인 창 | deel 의 안전망이 그대로 에디터 창으로 뜹니다 (`이번만` · `앞으로 묻지 않기` · `안 함`) |
|
|
909
|
+
| 모드 고르개 | deel 의 작업 모드 7개 (`종합` · `코드` · `계획` · `설계` · `디버그` · `묻기` · `총괄`) |
|
|
910
|
+
| 멈춤 단추 | 도중에 닿습니다 — 답을 기다리는 중에도 |
|
|
911
|
+
| 지난 대화 | 껐다 켜도 그대로 열립니다. 터미널과 **같은 자리**에 남아서, 에디터에서 하던 것을 `deel --resume` 으로 이어받는 것도 됩니다 |
|
|
912
|
+
|
|
913
|
+
**의존성은 그대로 0 입니다.** MCP 와 같은 이유입니다 — 줄 단위 JSON-RPC 2.0 이
|
|
914
|
+
전부라 SDK 가 필요 없습니다.
|
|
915
|
+
|
|
916
|
+
> **자세히** — 조용히 깨지는 자리들
|
|
917
|
+
>
|
|
918
|
+
> **[늘려 쓰기 읽기 →](docs/ko/extend.md#에디터-안에서-쓰기-acp)**
|
|
919
|
+
|
|
920
|
+
---
|
|
921
|
+
|
|
922
|
+
## 비밀이 새지 않게
|
|
923
|
+
|
|
924
|
+
사람이 열쇠를 붙여 넣는 일은 드뭅니다. 새는 자리는 거의 항상 **명령 출력**입니다.
|
|
925
|
+
|
|
926
|
+
```
|
|
927
|
+
env OPENAI_API_KEY=sk-proj-…
|
|
928
|
+
git remote -v https://사람:토큰@github.com/…
|
|
929
|
+
curl -v > Authorization: Bearer eyJ…
|
|
930
|
+
검사 실패 로그 연결 문자열이 통째로
|
|
931
|
+
```
|
|
932
|
+
|
|
933
|
+
그 글은 모델에게 실려 가고, **동시에** `.deel/sessions/*.jsonl` 로 디스크에
|
|
934
|
+
적힙니다. 그 파일은 나중에 `/recall` 로 다시 읽히고 `deel pack` 에 딸려 갈 수도
|
|
935
|
+
있습니다. 한 번 새면 여러 벌이 됩니다.
|
|
936
|
+
|
|
937
|
+
그래서 도구 결과가 대화로 들어가는 **한 자리**에서 가립니다.
|
|
938
|
+
|
|
939
|
+
```
|
|
940
|
+
⏺ Bash(env | grep API) 완료
|
|
941
|
+
⊘ 비밀로 보이는 값 2군데가 대화에 들어갔습니다 (openai · 환경변수) — 모델에 가려서 보냈습니다
|
|
942
|
+
```
|
|
943
|
+
|
|
944
|
+
찾는 것: 사설키 블록 · OpenAI/Anthropic 열쇠 · GitHub 토큰 · Slack 토큰 ·
|
|
945
|
+
AWS 키 · Google 키 · JWT · 주소에 박힌 열쇠 · `Authorization` 계열 헤더 ·
|
|
946
|
+
이름이 `…KEY`/`…TOKEN`/`…SECRET`/`…PASSWORD` 인 환경변수. 그리고 **설정에 든
|
|
947
|
+
게이트웨이 열쇠는 모양과 상관없이** — 그건 짐작이 아니라 아는 값이니까요.
|
|
948
|
+
|
|
949
|
+
### 파일 내용은 일부러 안 가립니다
|
|
950
|
+
|
|
951
|
+
가리고 싶은 마음이 제일 드는 자리가 `.env` 인데, 거기를 가리면 이렇게 됩니다 —
|
|
952
|
+
모델이 가려진 글을 보고, 그걸 고쳐서 되돌려 씁니다. 그러면 진짜 열쇠가 있던
|
|
953
|
+
자리에 `«가림»` 이 적힙니다. **비밀을 지키려다 사람의 열쇠를 우리 손으로
|
|
954
|
+
지우는 셈입니다.**
|
|
955
|
+
|
|
956
|
+
그래서 파일 쪽은 가리는 대신 **알립니다.**
|
|
957
|
+
|
|
958
|
+
```
|
|
959
|
+
⏺ Read(.env) 12줄
|
|
960
|
+
! 비밀로 보이는 값 3군데가 대화에 들어갔습니다 (환경변수)
|
|
961
|
+
— 파일 내용은 가리지 않습니다 (가리면 되돌려 쓸 때 지워집니다)
|
|
962
|
+
```
|
|
963
|
+
|
|
964
|
+
무엇을 못 막는지 분명히 말하는 편이, 막았다고 해 놓고 파일을 망가뜨리는 것보다
|
|
965
|
+
언제나 낫습니다. 어느 쪽이든 감사기록에 남습니다.
|
|
966
|
+
|
|
967
|
+
---
|
|
968
|
+
|
|
969
|
+
## 안전망
|
|
970
|
+
|
|
971
|
+
승인 프롬프트 대신 **되돌릴 수 있게** 만들었습니다. 기본 모드 `auto` 는 묻지 않고 알아서 합니다.
|
|
972
|
+
|
|
973
|
+
| 장치 | 내용 |
|
|
974
|
+
|---|---|
|
|
975
|
+
| **되돌리기** | 파일을 고치기 전 항상 스냅샷. `/undo` 로 턴 단위 복구. **`Bash` 로 옮기고 지우는 것도 포함** |
|
|
976
|
+
| **바뀐 자리 보기** | 고칠 때마다 바뀐 줄을 화면에. 이번 대화 전체는 `/diff` |
|
|
977
|
+
| **작업 범위** | 시작한 폴더 밖은 모델이 시켜도 거부 |
|
|
978
|
+
| **위험 명령 차단** | 되돌릴 수 없는 것만 (디스크 포맷, 재귀 삭제, `--force` 푸시 등) |
|
|
979
|
+
| **재실행 금지** | 변경성 명령은 실패해도 다시 실행하지 않음 — 두 번 돌면 사고 |
|
|
980
|
+
| **중단** | Ctrl+C 로 도중에 끊어도 대화가 성한 채로 남음 |
|
|
981
|
+
| **헛돌기 차단** | 같은 도구가 같은 이유로 3번 실패하면 그 턴을 멈추고 왜인지 말함 |
|
|
982
|
+
| **안 읽는 자리** | 남의 도구 살림과 deel 자신의 기록·설정(열쇠)은 거절 |
|
|
983
|
+
| **감사 로그** | `.deel/audit.jsonl` 에 전부 기록 |
|
|
984
|
+
|
|
985
|
+
| 모드 | 언제 물어보나 |
|
|
986
|
+
|---|---|
|
|
987
|
+
| `auto` (기본) | 안 물어봄. 되돌리기가 안전망 |
|
|
988
|
+
| `confirm` | 되돌릴 수 없는 명령만 |
|
|
989
|
+
| `strict` | 파일 변경·명령 전부 |
|
|
990
|
+
|
|
991
|
+
되돌리기 이력은 파일 내용을 통째로 담기 때문에 큰 파일을 여러 번 고치면 금방 커집니다.
|
|
992
|
+
32MB 를 넘으면 **최근 50턴만 남기고** 오래된 것을 버립니다. 방금 한 일은 언제나
|
|
993
|
+
되돌릴 수 있고, 지금 이력이 얼마나 되는지는 `/status` 에서 봅니다.
|
|
994
|
+
|
|
995
|
+
> **자세히** — Bash 로 사라진 것도 되돌아갑니다 · 안 읽는 자리
|
|
996
|
+
>
|
|
997
|
+
> **[안전망과 사내 반입 읽기 →](docs/ko/safety.md#안전망)**
|
|
998
|
+
|
|
999
|
+
---
|
|
1000
|
+
|
|
1001
|
+
## 사내 반입
|
|
1002
|
+
|
|
1003
|
+
심사서와 소스를 zip 하나로 묶습니다.
|
|
1004
|
+
|
|
1005
|
+
```bash
|
|
1006
|
+
deel pack --out deel-반입.zip
|
|
1007
|
+
```
|
|
1008
|
+
|
|
1009
|
+
```
|
|
1010
|
+
── 반입 묶음 ───────────────────────────────────────────────────
|
|
1011
|
+
✓ deel-반입.zip
|
|
1012
|
+
94개 파일 · 509.6KB
|
|
1013
|
+
|
|
1014
|
+
의존성 0개
|
|
1015
|
+
설치 스크립트 없음
|
|
1016
|
+
외부 import 0건
|
|
1017
|
+
네트워크 호출 3곳 (설정한 주소로만)
|
|
1018
|
+
포트 열기 1곳 (/preview 만)
|
|
1019
|
+
```
|
|
1020
|
+
|
|
1021
|
+
심사서는 `deel audit` 으로 먼저 볼 수 있습니다. 손으로 적은 것이 아니라
|
|
1022
|
+
**소스를 훑어서 그때그때 만듭니다** — 그래서 코드와 어긋날 수가 없습니다.
|
|
1023
|
+
|
|
1024
|
+
<picture>
|
|
1025
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-audit-dark.svg">
|
|
1026
|
+
<img alt="deel audit — 의존성·네트워크 호출·포트를 소스에서 훑어 만든 심사서" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-audit-light.svg" width="820">
|
|
1027
|
+
</picture>
|
|
1028
|
+
|
|
1029
|
+
zip 안에는 **사람이 읽을 것 한 장, 기계가 읽을 것 두 장**이 같이 들어갑니다.
|
|
1030
|
+
반입 심사는 사람만 보는 절차가 아니기 때문입니다 — 보안팀은 SBOM 을 스캐너에
|
|
1031
|
+
먹여 취약점 목록을 뽑고, 운영팀은 감사 사양을 보고 SIEM 수집 규칙을 짭니다.
|
|
1032
|
+
|
|
1033
|
+
| 파일 | 무엇 |
|
|
1034
|
+
|---|---|
|
|
1035
|
+
| `반입심사서.txt` | 의존성 · 설치 스크립트 · **소스를 훑어 찾은 네트워크·외부 명령 호출 자리 전부**(파일:줄) · 나가는 길 세 갈래 · 파일별 SHA-256 |
|
|
1036
|
+
| `sbom.cdx.json` | **SBOM (CycloneDX 1.5).** 스캐너에 그대로 넣습니다. 파일마다 부품 하나에 SHA-256, 의존성은 **빈 배열로 명시** — 안 적어 낸 것과 없는 것은 다릅니다 |
|
|
1037
|
+
| `심사명세.json` | 통신 목록(갈래마다 언제·어디로·무엇이·막는법·소스 자리) · **감사기록 사양**(칸 이름과 뜻, 안 남기는 것) · 파일 해시 |
|
|
1038
|
+
|
|
1039
|
+
```bash
|
|
1040
|
+
deel audit # 사람이 읽는 심사서만 보기
|
|
1041
|
+
deel sbom # 기계가 읽는 두 장을 표준출력으로 (deel sbom | jq)
|
|
1042
|
+
deel sbom --out 심사.json # 파일로
|
|
1043
|
+
deel sbom --only sbom # SBOM 한 장만
|
|
1044
|
+
```
|
|
1045
|
+
|
|
1046
|
+
셋 다 손으로 적지 않고 코드가 소스를 훑어서 만듭니다 — 손으로 적으면 언젠가
|
|
1047
|
+
사실과 어긋나고, **어긋난 심사 서류는 없느니만 못합니다.** 담당자가 한 번 틀린
|
|
1048
|
+
것을 발견하면 나머지도 안 믿습니다. 감사기록 사양만은 손으로 적혀 있어서,
|
|
1049
|
+
그것이 진짜 기록과 어긋나지 않는지를 검사가 매번 대조합니다.
|
|
1050
|
+
|
|
1051
|
+
> **자세히** — 사내 게이트웨이 진단
|
|
1052
|
+
>
|
|
1053
|
+
> **[안전망과 사내 반입 읽기 →](docs/ko/safety.md#사내-반입)**
|
|
1054
|
+
|
|
1055
|
+
---
|
|
1056
|
+
|
|
1057
|
+
## 설정
|
|
1058
|
+
|
|
1059
|
+
`~/.deel/config.json` 에 저장됩니다. 프로젝트 폴더에 `.deel/config.json` 이 있으면 그쪽이 우선입니다.
|
|
1060
|
+
|
|
1061
|
+
> **자세히** — 붙는 서버 · 환경변수 · 실행 옵션 · 프로젝트 규칙
|
|
1062
|
+
>
|
|
1063
|
+
> **[설정 읽기 →](docs/ko/config.md#설정)**
|
|
1064
|
+
|
|
1065
|
+
---
|
|
1066
|
+
|
|
1067
|
+
## 문제 해결
|
|
1068
|
+
|
|
1069
|
+
| 증상 | 확인할 것 |
|
|
1070
|
+
|---|---|
|
|
1071
|
+
| `주소를 찾을 수 없습니다` | 주소 오타, DNS, 사내망 접속 여부 |
|
|
1072
|
+
| `연결이 거부되었습니다` | 서버가 꺼져 있거나 포트가 다름 |
|
|
1073
|
+
| `인증서 문제` | `set NODE_EXTRA_CA_CERTS=C:\경로\사내CA.pem` |
|
|
1074
|
+
| 프록시를 거쳐야 함 | `set HTTPS_PROXY=http://프록시:포트` (인증은 `http://user:pw@프록시:포트`). 첫 화면과 `/status` 에 `프록시 …` 가 뜨면 거치는 것. 안 거칠 곳은 `NO_PROXY=.corp.com,10.1.2.3`, 아예 끄려면 설정에 `"proxy": "none"` |
|
|
1075
|
+
| 프록시가 407 을 줌 | 프록시 주소에 `user:pw@` 를 넣으세요. NTLM · Negotiate 만 받는 프록시는 못 씁니다 — 담당자에게 Basic 이나 인증 없는 주소를 문의 |
|
|
1076
|
+
| 401 / 403 | 키가 틀렸거나 인증 헤더 형식이 다름 (4가지를 자동 시도합니다) |
|
|
1077
|
+
| `허용되지 않은 주소입니다` | 자물쇠가 막은 것. 정상입니다 — `/model` 로 연결을 고르세요 |
|
|
1078
|
+
| 도구 호출이 안 먹음 | `deel diagnose` 로 판정을 보세요. 작은 모델(1B~3B)은 자주 못 합니다 |
|
|
1079
|
+
| 대답이 비어 있음 | 스트리밍을 무시하는 서버입니다. 한 번은 저절로 다시 부르고, 그래도 비면 이 대화에서는 스트리밍을 끕니다 |
|
|
1080
|
+
| 큰 파일이 중간에 끊김 | `/out` 으로 지금 상한을 보고 올리세요. 상한을 몰라 16,384 로 서 있을 수 있습니다 |
|
|
1081
|
+
| `HTTP 400` 만 뜸 | 서버가 보낸 문장을 그대로 보여 줍니다. 길이 문제면 숫자를 읽어 저절로 맞춥니다 |
|
|
1082
|
+
| `429` · `503` 이 뜸 | 게이트웨이가 잠깐 막은 것입니다. 세 번까지 저절로 기다렸다 다시 부릅니다(`Retry-After` 를 지킵니다). 그래도 계속 뜨면 할당량을 보세요 |
|
|
1083
|
+
| `deel scan` 이 0곳 | 로컬 서버가 꺼져 있거나 다른 포트 — `--ports` 로 지정 |
|
|
1084
|
+
|
|
1085
|
+
---
|
|
1086
|
+
|
|
1087
|
+
## 개발
|
|
1088
|
+
|
|
1089
|
+
```bash
|
|
1090
|
+
npm test 전체 검증 (5,890항목 안팎 — 몇몇은 터미널에 따라 갈립니다)
|
|
1091
|
+
npm run coverage 검사가 소스의 어디를 밟았는지
|
|
1092
|
+
npm run verify 반입·통신 검증만
|
|
1093
|
+
npm run bench 편집 성공률 측정
|
|
1094
|
+
npm run demo 화면이 어떻게 보이는지 실제로 돌려 보기
|
|
1095
|
+
npm run check 전 파일 문법 검사
|
|
1096
|
+
```
|
|
1097
|
+
|
|
1098
|
+
검증은 **가짜 게이트웨이**를 띄워서 합니다. 실제 모델 없이 규격 그대로
|
|
1099
|
+
루프·스트리밍·도구 실행·되돌리기·압축을 결정적으로 확인합니다.
|
|
1100
|
+
zip 은 진짜 `unzip` 으로, tar 는 진짜 `tar` 가 만든 것을 읽혀 교차 확인합니다.
|
|
1101
|
+
|
|
1102
|
+
`npm test` 는 파일을 하나씩 돌리고 **파일별 종료코드**를 표로 남깁니다.
|
|
1103
|
+
화면의 통과 표시가 아니라 종료코드가 CI 가 보는 값이기 때문입니다. 둘은
|
|
1104
|
+
갈라질 수 있습니다 — 검사를 다 통과하고도 끝낼 때 죽으면 화면은 초록인데
|
|
1105
|
+
종료코드는 1 입니다. 실제로 윈도우에서 그렇게 한 번 놓쳤습니다.
|
|
1106
|
+
첫 실패에서 멈추지 않고 끝까지 돌기 때문에, 한 번 돌리면 전부 알 수 있습니다.
|
|
1107
|
+
|
|
1108
|
+
```
|
|
1109
|
+
────────────────────────────────────────────────────────────
|
|
1110
|
+
검사 파일 종료코드 통과 실패 시간
|
|
1111
|
+
────────────────────────────────────────────────────────────
|
|
1112
|
+
✓ smoke.js 0 20 0 0.2초
|
|
1113
|
+
✗ scan.test.js 1 19 0 0.2초
|
|
1114
|
+
────────────────────────────────────────────────────────────
|
|
1115
|
+
|
|
1116
|
+
✗ scan.test.js — 종료코드 1
|
|
1117
|
+
검사는 전부 통과했는데 종료코드만 1 입니다 —
|
|
1118
|
+
끝낼 때 남은 핸들·처리 안 된 거절 때문입니다.
|
|
1119
|
+
```
|
|
1120
|
+
|
|
1121
|
+
| 검증 | 항목 | 무엇을 |
|
|
1122
|
+
|---|---|---|
|
|
1123
|
+
| `smoke` | 20 | 도구·작업범위·되돌리기·감사로그 |
|
|
1124
|
+
| `loop` | 16 | 에이전트 루프·스트리밍·도구 호출 |
|
|
1125
|
+
| `guard` | 24 | **안 하는 자리** — 거부·모르는 도구·두 번 실행·범위 밖 |
|
|
1126
|
+
| `network` | 30 | 정해진 자리 밖으로 새지 않는가 |
|
|
1127
|
+
| `web` | 25 | 웹 읽기가 읽기만 하는가 |
|
|
1128
|
+
| `abort` · `steer` | 16 · 15 | Ctrl+C 로 끊어도 대화가 성한가 · 도중에 낀 말이 다음 부름에 실리는가 |
|
|
1129
|
+
| `parallel` | 23 | 읽기만 동시에 도는가 · 할 일 목록 |
|
|
1130
|
+
| `cli` | 75 | **진짜 `deel` 을 띄워** 끝까지 돌려 본다 |
|
|
1131
|
+
| `setup` | 42 | 첫 실행 마법사 (가짜 TTY 로 사람처럼 입력) |
|
|
1132
|
+
| `detect` | 66 | 주소 한 줄로 규격·인증을 짚어내는가 |
|
|
1133
|
+
| `modes` · `route` | 89 · 33 | 작업 모드 · 종합에서 알맞은 모드로 옮겨 가는가 |
|
|
1134
|
+
| `ctxsize` | 43 | 모델에 걸린 컨텍스트 길이를 긁어오는가 |
|
|
1135
|
+
| `commands` · `commands-more` | 128 · 62 | 슬래시 명령 전부 |
|
|
1136
|
+
| `ui` · `ui2` | 60 · 40 | 암호 가림·한글 폭·상태줄·대화 목록·엑셀→글 |
|
|
1137
|
+
| `encoding` · `xlsx` | 68 · 72 | 한글 인코딩 판별 · 엑셀 읽기 |
|
|
1138
|
+
| `compact` | 21 | 요약 압축·짝 안 깨짐·실패 시 물러섬 |
|
|
1139
|
+
| `store` | 34 | 대화 저장·이어하기·중간에 죽어도 복구 |
|
|
1140
|
+
| `scan` | 29 | 여러 런타임을 구분해 찾는가 |
|
|
1141
|
+
| `plugins` | 38 | 플러그인 받기·묶기·ZIP/TAR |
|
|
1142
|
+
| `no-bundle` | 12 | 배포 묶음에 남의 것이 안 섞였는가 · 검사 파일 위생 |
|
|
1143
|
+
| `edit-bench` | 20건 | 편집 성공률 |
|
|
1144
|
+
|
|
1145
|
+
> **자세히** — 어디를 밟았는지 · 폴더 구조
|
|
1146
|
+
>
|
|
1147
|
+
> **[개발 읽기 →](docs/ko/develop.md#개발)**
|
|
1148
|
+
|
|
1149
|
+
---
|
|
1150
|
+
|
|
1151
|
+
## 릴리스 노트
|
|
1152
|
+
|
|
1153
|
+
| 판 | 무엇이 바뀌었나 |
|
|
1154
|
+
|---|---|
|
|
1155
|
+
| **[1.10.0](docs/ko/releases/1.10.md#1100)** | ESC 가 진짜로 멈춥니다 · 자리가 다 차도 그 턴 안에서 이어 갑니다 · 회사별 창구를 여덟 자리 전부 쟀습니다 |
|
|
1156
|
+
| [1.9.2](docs/ko/releases/1.9.md#192) | 막고 있다고 적어 둔 것이 실제로는 안 막고 있던 자리들 · 접히면 시킨 말과 남은 할 일이 사라지던 것 |
|
|
1157
|
+
| [1.9.1](docs/ko/releases/1.9.md#191) | 한글 이름을 쓴 MCP 도구가 모델 눈에 전부 같아 보이던 것 — 서로 다르고 판마다 같은 이름으로 |
|
|
1158
|
+
| **[1.9.0](docs/ko/releases/1.9.md#190)** | 표를 표로 그린다 · Claude·Bedrock 에 추론 강도가 실제로 걸린다 · 회사별 도구 규격 · 바뀐 자리만 다시 싣기 |
|
|
1159
|
+
| **[1.8.0](docs/ko/releases/1.8.md#180)** | 한 시간짜리 토큰을 쓰는 사내 게이트웨이에서 하루를 — 열쇠를 받아 오기 · `deel reset` · 영어 화면이 진짜 영어 |
|
|
1160
|
+
|
|
1161
|
+
가까운 다섯 판만 적었습니다. 나머지 전부와 무엇이 왜 바뀌었는지는 **[릴리스 노트](docs/ko/releases.md)** 에 있습니다.
|
|
1162
|
+
|
|
1163
|
+
---
|
|
1164
|
+
|
|
1165
|
+
## 라이선스
|
|
1166
|
+
|
|
1167
|
+
[MIT](LICENSE)
|