deel-local-cli 1.7.0 → 1.8.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.md CHANGED
@@ -1,15 +1,15 @@
1
1
  <div align="center">
2
2
 
3
3
  <picture>
4
- <source media="(prefers-color-scheme: dark)" srcset="docs/assets/hero-ko-dark.svg">
5
- <img alt="deel — 컴퓨터 안에서만" src="docs/assets/hero-ko-light.svg" width="620">
4
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/hero-en-dark.svg">
5
+ <img alt="deel — stays on this machine" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/hero-en-light.svg" width="620">
6
6
  </picture>
7
7
 
8
- ### 로컬 모델과 사내 게이트웨이로 도는 코딩 에이전트 CLI
8
+ ### A coding-agent CLI that runs on local models and private gateways
9
9
 
10
- 의존성 0개 · Node 20+ · 소스가 나가는 자리는
10
+ Zero dependencies · Node 20+ · Exactly one place your source can go
11
11
 
12
- 바깥 API 붙습니다**말했을 때만**
12
+ Vendor APIs connect too**only when you say so**
13
13
 
14
14
  <br>
15
15
 
@@ -20,222 +20,279 @@
20
20
 
21
21
  [![Node.js CI](https://img.shields.io/github/actions/workflow/status/jysvai/deel-local-cli/test.yml?branch=main&logo=github&logoColor=white&label=Node.js%20CI)](https://github.com/jysvai/deel-local-cli/actions/workflows/test.yml)
22
22
  [![CodeQL](https://img.shields.io/github/actions/workflow/status/jysvai/deel-local-cli/codeql.yml?branch=main&logo=github&logoColor=white&label=CodeQL)](https://github.com/jysvai/deel-local-cli/actions/workflows/codeql.yml)
23
- [![tests](https://img.shields.io/badge/tests-5%2C685%20passing-1a7f37?logo=checkmarx&logoColor=white)](docs/ko/develop.md)
23
+ [![tests](https://img.shields.io/badge/tests-5%2C899%20passing-1a7f37?logo=checkmarx&logoColor=white)](docs/en/develop.md)
24
24
 
25
25
  [![dependencies](https://img.shields.io/badge/dependencies-0-1a7f37)](https://www.npmjs.com/package/deel-local-cli?activeTab=dependencies)
26
26
  [![ESM](https://img.shields.io/badge/ESM-Node%2020%2B-5FA04E?logo=javascript&logoColor=white)](package.json)
27
- [![network](https://img.shields.io/badge/network-127.0.0.1%20only-1a7f37?logo=wireguard&logoColor=white)](#데이터가-나가는-길)
28
- [![telemetry](https://img.shields.io/badge/telemetry-none-1a7f37?logo=ghostery&logoColor=white)](#데이터가-나가는-길)
27
+ [![network](https://img.shields.io/badge/network-127.0.0.1%20only-1a7f37?logo=wireguard&logoColor=white)](#where-your-data-can-go)
28
+ [![telemetry](https://img.shields.io/badge/telemetry-none-1a7f37?logo=ghostery&logoColor=white)](#where-your-data-can-go)
29
29
 
30
- **[English](README.en.md)** · [사내 반입 안내](#사내-반입) · [문제 해결](#문제-해결) · [자세한 문서](docs/ko/)
30
+ **[한국어](README.ko.md)** · [Corporate review](#corporate-review-package) · [Troubleshooting](#troubleshooting) · [Full docs](docs/en/)
31
31
 
32
32
  </div>
33
33
 
34
34
  ---
35
35
 
36
+ ### The first thing you see answers the only question that matters
37
+
38
+ <picture>
39
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-head-en-dark.svg">
40
+ <img alt="deel startup panel: model, where it sends, link capabilities, folder, approval mode" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-head-en-light.svg" width="900">
41
+ </picture>
42
+
43
+ **`sends to this machine 127.0.0.1 ← and nowhere else`.** Not in a policy document —
44
+ on screen, every time you start. The `⌂` in front stays in the status bar for the whole
45
+ session and turns into `↗` the moment traffic would leave. A real capture, not a mockup:
46
+ `node tools/shot.mjs` regenerates every image on this page from a live run.
47
+
48
+ <br>
49
+
50
+ Then you give it work, and it goes and does it:
51
+
52
+ <picture>
53
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-chat-en-dark.svg">
54
+ <img alt="deel doing a task end to end: Grep, Read, Edit with an inline diff, and the file it wrote" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/shot-chat-en-light.svg" width="900">
55
+ </picture>
56
+
57
+ Every number in that image is real — the tools ran against real files. Only the model is a
58
+ stub on `127.0.0.1`, so the capture is reproducible; the tool calls, the diff and the file
59
+ summary are what deel actually printed.
60
+
61
+ ---
62
+
63
+ ## 60 seconds
64
+
65
+ ```bash
66
+ npm i -g deel-local-cli # 0 dependencies, no install scripts
67
+ deel setup # point it at Ollama, LM Studio, or your gateway
68
+ deel # start working in the current folder
36
69
  ```
37
- ╭──────────────────────────────────────────────────────────────╮
38
- deel 1.7.0 ⌂ 안 OpenAI 호환 규격 │
39
- │ │
40
- │ 모델 qwen2.5-coder:7b (40k 토큰) │
41
- │ 보냄 이 컴퓨터 안 127.0.0.1:11434 ← 여기 말고는 어디로도 안 갑니다 │
42
- │ 연결 스트리밍 · 도구 · 추론 조절 │
43
- │ 폴더 C:\work\myproject │
44
- │ 승인 ⏵⏵ 자동 승인 — 안 묻고 고칩니다. 되돌리기(/undo)가 안전망입니다 │
45
- │ Shift+Tab 으로 바꿉니다 · Tab 은 치던 / 명령을 채웁니다 │
46
- │ 이 PC 스킬 337 · 명령 127 · 플러그인 42 │
47
- ╰──────────────────────────────────────────────────────────────╯
48
- /help 명령 목록 /think 추론 강도 Ctrl+C 중단·끝내기
49
-
50
- ▏myproject · qwen2.5-coder:7b ▏ ▰▰▱▱▱▱▱▱▱▱ 22% 28k/128k ▏ ◎ 종합 · ◇ medium·절약 · ⏵⏵ 자동
51
- ❯ 로그 형식 통일해줘
52
-
53
- ❊ Grep(console.log)
54
- └ 1개 파일 · 1건
55
- ◧ Read(src/runner.js)
56
- └ 5줄
57
- ◈ Edit(src/runner.js)
58
- └ 1군데
59
-
60
- ▌ 로그 호출을 logger 형식으로 통일했습니다. runner.js 한 군데를 고쳤습니다.
61
-
62
- ── 4.2초 · 도구 3회 · ↑3,900 ↓180
63
- ```
70
+
71
+ No account, no sign-up, no telemetry. If you already run Ollama or LM Studio,
72
+ `deel setup` finds it — `deel scan` lists every local runtime and model on the machine.
64
73
 
65
74
  ---
66
75
 
67
- ## 목차
68
-
69
- - [왜 만들었나](#왜-만들었나)
70
- - [무엇이 다른가](#무엇이-다른가)
71
- - [빠른 시작](#빠른-시작)
72
- - [데이터가 나가는 ](#데이터가-나가는-길)
73
- - [바깥 API 붙이기](#바깥-api-붙이기)
74
- - [로컬 모델 여러 개 쓰기](#로컬-모델-여러-개-쓰기)
75
- - [대화 명령](#대화-중-명령)
76
- - [작업 모드](#작업-모드)
77
- - [쉬움 · 개발자](#쉬움--개발자)
78
- - [도구](#도구)
79
- - [한글 문서와 엑셀](#한글-문서와-엑셀)
80
- - [만든 웹을 그 자리에서 띄웁니다](#만든-웹을-그-자리에서-띄웁니다)
81
- - [스킬·플러그인](#스킬플러그인)
82
- - [추론 강도](#추론-강도)
83
- - [자동 압축](#자동-압축)
84
- - [대화 이어하기](#대화-이어하기)
85
- - [밖에서 도구 붙이기 (MCP)](#밖에서-도구-붙이기-mcp)
86
- - [에디터 안에서 쓰기 (ACP)](#에디터-안에서-쓰기-acp)
87
- - [비밀이 새지 않게](#비밀이-새지-않게)
88
- - [안전망](#안전망)
89
- - [사내 반입](#사내-반입)
90
- - [설정](#설정)
91
- - [문제 해결](#문제-해결)
92
- - [개발](#개발)
93
- - [릴리스 노트](#릴리스-노트)
94
-
95
- 여기는 **요약**입니다. 절마다 붙은 링크를 따라가면 그 안의 이야기가 나옵니다.
96
-
97
- | 자세한 문서 | 무엇이 있나 |
76
+ <details>
77
+ <summary><b>Contents</b> — every section on this page</summary>
78
+
79
+ <br>
80
+
81
+ - [Why this exists](#why-this-exists)
82
+ - [What's different](#whats-different)
83
+ - [Quick start](#quick-start)
84
+ - [Where your data can go](#where-your-data-can-go)
85
+ - [Connecting a vendor API](#connecting-a-vendor-api)
86
+ - [Keys that expire (corporate gateways)](#keys-that-expire-corporate-gateways)
87
+ - [Multiple local runtimes](#multiple-local-runtimes)
88
+ - [Slash commands](#slash-commands)
89
+ - [Work modes](#work-modes)
90
+ - [Simple vs developer](#simple-vs-developer)
91
+ - [Tools](#tools)
92
+ - [Korean text and Excel](#korean-text-and-excel)
93
+ - [Serving what you built](#serving-what-you-built)
94
+ - [Skills and plugins](#skills-and-plugins)
95
+ - [Reasoning effort](#reasoning-effort)
96
+ - [Auto-compaction](#auto-compaction)
97
+ - [Resuming a conversation](#resuming-a-conversation)
98
+ - [Attaching tools from outside (MCP)](#attaching-tools-from-outside-mcp)
99
+ - [Inside your editor (ACP)](#inside-your-editor-acp)
100
+ - [Keeping secrets out of the conversation](#keeping-secrets-out-of-the-conversation)
101
+ - [Safety](#safety)
102
+ - [Corporate review package](#corporate-review-package)
103
+ - [Configuration](#configuration)
104
+ - [Troubleshooting](#troubleshooting)
105
+ - [Development](#development)
106
+ - [Release notes](#release-notes)
107
+
108
+ </details>
109
+
110
+ This page is the **summary**. Each section links to the detail behind it.
111
+
112
+ | Full docs | What is in there |
98
113
  |---|---|
99
- | [모델 다루기](docs/ko/models.md) | 급과 크기 · 국산 모델 이름표 · 프로젝트 읽기 |
100
- | [화면과 조작](docs/ko/interface.md) | 입력칸 · 작업 모드 · 쉬움과 개발자 · 무엇을 묻고 무엇을 그냥 하나 |
101
- | [도구 자세히](docs/ko/tools.md) | `Outline` · `Verify` · `Task` · `Jobs` · `Append` · `Def`/`Refs` · 편집 매칭 |
102
- | [한글 문서와 엑셀](docs/ko/documents.md) | hwpx·docx·pptx·**PDF** · 인코딩 · 엑셀 → CSV |
103
- | [늘려 쓰기](docs/ko/extend.md) | 스킬 · 플러그인 · MCP · ACP |
104
- | [속도와 씀씀이](docs/ko/tuning.md) | 단계별 추론 강도 · 프리픽스 캐시 · 컨텍스트 길이 |
105
- | [안전망과 사내 반입](docs/ko/safety.md) | 되돌리기 · 작업 범위 · 감사기록 · 심사 서류 |
106
- | [설정](docs/ko/config.md) · [개발](docs/ko/develop.md) | 환경변수 · 실행 옵션 · 검사 돌리기 · 폴더 구조 |
107
- | [릴리스 노트](docs/ko/releases.md) | [1.7.x](docs/ko/releases/1.7.md) · [1.6.x](docs/ko/releases/1.6.md) · [1.5.x](docs/ko/releases/1.5.md) · [1.4.x](docs/ko/releases/1.4.md) · [1.3.x](docs/ko/releases/1.3.md) · [1.2.x](docs/ko/releases/1.2.md) |
114
+ | [Models](docs/en/models.md) | Grade and window size · Korean-model presets · project detection |
115
+ | [The screen](docs/en/interface.md) | The input box · work modes · simple vs developer · what it asks about |
116
+ | [Tools in depth](docs/en/tools.md) | `Outline` · `Verify` · `Task` · `Jobs` · `Append` · `Def`/`Refs` · edit matching |
117
+ | [Korean documents and Excel](docs/en/documents.md) | hwpx/docx/pptx/**PDF** · encoding · Excel → CSV |
118
+ | [Extending](docs/en/extend.md) | Skills · plugins · MCP · ACP |
119
+ | [Speed and spend](docs/en/tuning.md) | Per-stage effort · the prefix cache · context length |
120
+ | [Safety and corporate review](docs/en/safety.md) | Undo · working scope · audit log · the review package |
121
+ | [Configuration](docs/en/config.md) · [Development](docs/en/develop.md) | Env vars · run flags · running the tests · folder layout |
122
+ | [Release notes](docs/en/releases.md) | [1.7.x](docs/en/releases/1.7.md) · [1.6.x](docs/en/releases/1.6.md) · [1.5.x](docs/en/releases/1.5.md) · [1.4.x](docs/en/releases/1.4.md) · [1.3.x](docs/en/releases/1.3.md) · [1.2.x](docs/en/releases/1.2.md) |
108
123
 
109
124
  ---
110
125
 
111
- ## 만들었나
126
+ ## Why this exists
112
127
 
113
- 사내 보안 정책이 **미승인 소프트웨어 반입**을 막으면, 코딩 에이전트 도구는 대부분 쓸 수 없습니다.
114
- 의존성 수백 개가 딸려 오고, 설치할 스크립트가 돌고, 어디로 통신하는지 줄로 답할 수 없기 때문입니다.
128
+ When a corporate security policy blocks **unapproved software**, most coding-agent tools are
129
+ unusable: hundreds of transitive dependencies, scripts that run at install time, and no
130
+ one-line answer to "where does it send my code?"
115
131
 
116
- deel 심사를 통과하는 것을 목표로 만들었습니다.
132
+ deel is built to pass that review.
117
133
 
118
134
  | | deel |
119
135
  |---|---|
120
- | 외부 의존성 | **0개** — Node 내장 기능만 |
121
- | 설치 스크립트 | **없음**압축 풀고 바로 실행 |
122
- | 소스가 나가는 자리 | **딱 곳** 직접 설정한 주소 |
123
- | 필요한 | Node 20 이상 |
136
+ | External dependencies | **0** — Node built-ins only |
137
+ | Install scripts | **none**unzip and run |
138
+ | Where source can go | **one address**the one you configured |
139
+ | Requirement | Node 20+ |
124
140
 
125
- 직접 확인하실 수 있습니다.
141
+ Verify it yourself:
126
142
 
127
143
  ```bash
128
144
  npm view deel-local-cli dependencies # {}
129
- npm view deel-local-cli scripts # install/postinstall 없음
130
- deel audit # 심사서 전문 출력
145
+ npm view deel-local-cli scripts # no install/postinstall
146
+ deel audit # full review sheet
131
147
  ```
132
148
 
133
149
  ---
134
150
 
135
- ## 무엇이 다른가
151
+ ## What's different
136
152
 
137
- 로컬 모델을 상대하는 코딩 에이전트는 있습니다. 그런데 **로컬로 돌리는
138
- 전제로 속을 다시 설계한** 것은 드뭅니다.
153
+ A handful of coding agents can talk to a local model. Far fewer were
154
+ **redesigned inside for running locally.**
139
155
 
140
- | | 다른 도구 | deel |
156
+ | | Other tools | deel |
141
157
  |---|---|---|
142
- | `/undo` | 파일만 되돌린다대화는 일이 있었다고 믿는 채로 | **대화까지** 같이 되감는다 |
143
- | 대화 | 클라우드가 느끼는 비용을 로컬에서도 그대로 짊어진다 | 프리픽스 캐시가 **살아남게** 순서를 설계 |
144
- | 작은 모델의 편집 | 공백 하나 틀려도 실패 | 성공률 20%→**100%**, 엉뚱한 0 |
145
- | 국산 모델 | 겪어 보기 전엔 모른다 | 공개 문서로 **미리** 안다 |
146
- | "다 됐습니다" | 확인 것도 됐다고 한다 | `/evidence`·`/export` — **안 것까지** 적는다 |
147
- | MCP·ACP | SDK 필요하다 | `child_process` + `JSON` |
148
- | 심사 서류 | 사람이 손으로 써서 실제와 어긋난다 | **코드가 소스를 훑어서** 만든다 |
158
+ | `/undo` | rolls back files only the conversation still believes it happened | rewinds **the conversation too** |
159
+ | Long conversations | pay a cost cloud tools never feel, unchanged, locally | ordering designed so the prefix cache **survives** |
160
+ | Edits on small models | fail on a single whitespace mismatch | 20%→**100%** success, 0 wrong-location edits |
161
+ | Korean models | unknown until you've run them | known **in advance** from public docs |
162
+ | "Done" | says so even for what wasn't checked | `/evidence` / `/export` — **unproven items included** |
163
+ | MCP · ACP | need an SDK | `child_process` + `JSON`, nothing else |
164
+ | Compliance paperwork | hand-written, drifts from reality | **generated by scanning the source** |
149
165
 
150
166
  <br>
151
167
 
152
- #### `/undo` 파일과 대화를 같이 되감습니다
168
+ #### `/undo` rewinds the conversation along with the files
153
169
 
154
- 파일만 되돌리면 모델은 방금 편집을 했다고 계속 믿고 다음 턴을 위에
155
- 쌓습니다 화면에는 아무 일도 없었던 것처럼 보입니다. deel 되돌린 만큼
156
- 오간 메시지도 같이 접습니다. 접다가 도구 호출의 짝이 어긋나면 API 400 을
157
- 내므로, 짝을 다시 맞추는 로직(`repairToolPairs`)까지 같이 돕니다.
170
+ Roll back only the files and the model still believes it just made that edit
171
+ it builds the next step on a premise that no longer holds, and nothing on
172
+ screen says otherwise. deel folds the messages back in lockstep with the
173
+ files. Folding can orphan a tool call, which the server answers with a 400,
174
+ so the same pass repairs the pairing (`repairToolPairs`).
158
175
 
159
- #### 대화에서 로컬 모델이 갈수록 느려지는 이유를 직접 잡았습니다
176
+ #### Fixed the hidden reason local models get slower as a conversation grows
160
177
 
161
- Ollama·llama.cpp 프롬프트 앞부분이 글자라도 바뀌면 뒤 전부를 다시
162
- 계산합니다. 클라우드 API 비용을 느끼니 신경 이유가 없지만,
163
- 로컬로 돌리는 사람에게는 대화가 길어질수록 턴마다 지연이 쌓입니다. deel
164
- 바뀔 있는 것(모드·핀)을 프롬프트 **맨 끝**으로 보내고, Ollama 에는
165
- `keep_alive: 60m` 같이 보내 앞부분이 캐시에 그대로 남게 합니다. 순서는
166
- 검사(`test/cache.test.js`)가 지킵니다.
178
+ Ollama and llama.cpp only reuse computation when a request's prefix exactly
179
+ matches the last one change one character near the front and everything
180
+ after it, the whole conversation, gets recomputed. A cloud API never pays
181
+ this cost, so cloud-first tools have no reason to care; someone running
182
+ locally feels it compound every turn. deel pushes what can change per turn
183
+ (mode, pins) to the **end** of the prompt and sends Ollama `keep_alive: 60m`
184
+ so the front stays cached. The ordering is enforced by a test
185
+ (`test/cache.test.js`).
167
186
 
168
- #### 작은 모델도 편집이 실제로 성공합니다
187
+ #### Edits actually succeed on small models
169
188
 
170
- 작은 로컬 모델은 고치려는 문자열을 공백 하나까지 완벽히 재현하지 못하는
171
- 경우가 흔합니다. `npm run bench` 로 잰 내부 벤치마크에서, 정확히 일치만
172
- 요구하던 방식은 성공률 20% 였습니다. 지금 방식(공백·들여쓰기를 단계적으로
173
- 완화) **100%** — 그러면서도 엉뚱한 곳을 고친 건수는 두 방식 다 **0건**
174
- 입니다. 모호하면 찾지 못했다고 말할지언정 짐작해서 고치지 않습니다.
189
+ Small local models often can't reproduce the exact whitespace of the string
190
+ they're trying to edit. The internal benchmark (`npm run bench`) measured
191
+ 20% success for the old exact-match-only approach. The current approach
192
+ (stepped whitespace/indent tolerance) measures **100%** — and both approaches
193
+ land at **0** wrong-location edits. When it's ambiguous, it says so instead
194
+ of guessing.
175
195
 
176
- #### 국산 모델은 겪어 보기 전에 압니다
196
+ #### Korean models are known before you've ever run them
177
197
 
178
- EXAONE·HyperCLOVA X·Kanana·Midm·Solar 공개 문서로 확인 가능한 버릇(예:
179
- 추론형 여부)을 deel 미리 알고 시작합니다. 다른 도구는 모델들을 한
180
- 번도 만나 채로 취급하고, 사람이 턴을 겪어야 요령이 붙습니다.
198
+ EXAONE, HyperCLOVA X, Kanana, Midm, and Solar get whatever's verifiable from
199
+ public documentation (e.g., whether a model is a reasoning model) applied
200
+ before the first prompt. Other tools meet these models cold, and it takes a
201
+ dozen-plus turns of trial and error before anyone learns their quirks.
181
202
 
182
- #### "다 됐습니다" 대신 증명서를 냅니다
203
+ #### "Done" comes with a receipt, not just a claim
183
204
 
184
- `/evidence` `/export` 무엇을 바꿨는지뿐 아니라 **무엇을 확인하지
185
- 못했는지**까지 적습니다. AI 코딩 도구가 사람을 제일 속이는 순간이 자신
186
- 있게 "됐습니다" 라고 말할 때라는 알기 때문입니다. `/export` 바깥
187
- 주소가 하나도 없는 자기완결 HTML 이라 폐쇄망 어디서든 열립니다.
205
+ `/evidence` and `/export` record what wasn't verified alongside what was —
206
+ because the moment an AI coding tool is most likely to mislead someone is
207
+ exactly the moment it confidently says "done." `/export` is a self-contained
208
+ HTML file with zero outbound links, so it opens anywhere, including an
209
+ air-gapped network.
188
210
 
189
- #### MCP·ACP SDK 없이 붙였습니다
211
+ #### MCP and ACP, with no SDK
190
212
 
191
- Model Context Protocol Agent Client Protocol 둘 다 표준입출력으로 줄
192
- 단위 JSON-RPC 2.0 주고받는 전부입니다. deel `child_process` 와
193
- `JSON` 만으로 다 구현했습니다 의존성 0개가 "기능을 결과" 가 아니라
194
- "안 필요해서" 라는 가지가 보여 줍니다.
213
+ Both the Model Context Protocol and the Agent Client Protocol are just
214
+ newline-delimited JSON-RPC 2.0 over stdio. deel implements both with nothing
215
+ but `child_process` and `JSON`proof that zero dependencies isn't a
216
+ capability given up, it's a capability that was never needed.
195
217
 
196
- #### 심사 서류를 손으로 씁니다
218
+ #### Compliance paperwork it doesn't hand-write
197
219
 
198
- `deel pack` 만드는 반입심사서·SBOM·감사 사양은 **코드가 소스를 훑어서**
199
- 만든 겁니다. 손으로 적은 서류는 언젠가 실제와 어긋나고, 담당자가 그걸 한 번
200
- 발견하면 나머지 서류도 믿습니다.
220
+ The import-review report, SBOM, and audit spec that `deel pack` produces are
221
+ generated **by scanning the actual source**, not typed by a person.
222
+ Hand-written paperwork eventually drifts from reality, and the moment a
223
+ reviewer catches one drifted claim, they stop trusting the rest of it.
201
224
 
202
225
  ---
203
226
 
204
- ## 빠른 시작
227
+ ## Quick start
228
+
229
+ ### The screen speaks your language
230
+
231
+ deel is written in Korean — the code, the function names, the comments. That part stays.
232
+ What you see on screen does not have to. Four screen languages ship: **한국어 · English ·
233
+ 日本語 · 中文**.
205
234
 
206
- ### 설치
235
+ > **How this is kept honest:** `/lang` counting the table is not enough — it can only count
236
+ > strings that made it *into* the table, and for a long time the tool result summaries and the
237
+ > thinking indicator never did. So a test starts deel in each language and reads the screen:
238
+ > `test/langleak.test.js` walks seven screens and fails if a Korean character shows up on an
239
+ > English one. It also fails on `1 files`, and on a stray `·` left dangling at the end of a line.
240
+
241
+ ```bash
242
+ DEEL_LANG=en deel # this run only (also ja, zh)
243
+ /lang en # and remember it
244
+ /lang ja # 日本語
245
+ /lang zh # 中文
246
+ /lang # how much is translated so far
247
+ ```
248
+
249
+ Nothing ever comes through blank. A line that has not been translated falls back to English
250
+ first and Korean second — so a Japanese or Chinese screen degrades to English, not to Korean —
251
+ and `/lang` prints exactly how many strings are covered.
252
+
253
+ What the model reads follows the same switch. Set it to English and the rules, the mode
254
+ instructions, and the tool descriptions all go out in English — so the model answers you in
255
+ English instead of Korean. That side is cheaper, too: the part of the window that ships on every
256
+ single request drops from about 4,900 tokens to about 3,450 — on a 32k model, from 15% of the
257
+ window to 10.5%.
258
+
259
+ Tool names and argument names stay Korean (`목적`, `할일`, `번호`). Those are identifiers, not
260
+ prose — rename them and the tool stops being called at all.
261
+
262
+ ### Install
207
263
 
208
264
  ```bash
209
265
  npm install -g deel-local-cli
210
266
  ```
211
267
 
212
- 설치가 싫으면 소스를 받아 그대로 쓰셔도 됩니다. `npm install` 이 필요 없습니다.
268
+ Or skip installing entirely there is no `npm install` step:
213
269
 
214
270
  ```bash
215
271
  git clone https://github.com/jysvai/deel-local-cli
216
272
  node deel-local-cli/bin/deel.js
217
273
  ```
218
274
 
219
- > **주의** 디렉터리(`~`)에서 `npm install` 하지 마세요. 거기에 `node_modules` 생기면
220
- > 이후 모든 npm 명령이 폴더를 훑어서 무관한 패키지 경고를 냅니다. `-g` 설치하거나 `npx` 를 쓰세요.
275
+ > **Note**do not run `npm install` in your home directory. A `node_modules` there makes every
276
+ > later npm command scan it and report warnings about unrelated packages. Use `-g` or `npx`.
221
277
 
222
- ### 연결 정하기
278
+ ### Point it at a model
223
279
 
224
- PC 있는 로컬 서버를 훑어서 고르는 방법:
280
+ Scan this machine and pick one:
225
281
 
226
282
  ```bash
227
283
  deel scan --pick
228
284
  ```
229
285
 
230
- 주소를 직접 넣는 방법 (사내 게이트웨이는 이쪽):
286
+ Or enter an address directly (use this for a corporate gateway):
231
287
 
232
288
  ```bash
233
289
  deel setup
234
290
  ```
235
291
 
236
- ### 시작
292
+ ### Start
237
293
 
238
- 작업할 폴더에서 `deel` 칩니다. **그 폴더가 작업 범위가 되고, 밖의 파일은 읽지도 쓰지도 못합니다.**
294
+ Run `deel` in the folder you want to work in. **That folder becomes the scope — files outside it
295
+ cannot be read or written.**
239
296
 
240
297
  ```bash
241
298
  cd C:\work\myproject
@@ -244,461 +301,491 @@ deel
244
301
 
245
302
  ---
246
303
 
247
- ## 데이터가 나가는
304
+ ## Where your data can go
248
305
 
249
- 코딩 에이전트는 소스 코드를 통째로 모델에 보냅니다. **그 주소가 어디인지가 전부입니다.**
250
- 말로 보장하는 대신 코드가 막습니다 `src/safety/network.js` 요청마다 확인하고,
251
- 허용 목록에 없으면 요청을 만들지도 않습니다.
306
+ A coding agent ships your whole source to a model. **The address is everything.**
307
+ Rather than promising in prose, the code enforces it: `src/safety/network.js` checks every request
308
+ and never builds one for an address that is not on the allow-list.
252
309
 
253
310
  ```
254
- [A] 모델 게이트웨이 ─── 소스 코드가 나가는 유일한
255
- setup 에서 정한 자리만. 모델을 바꾸면 이전 자리는 닫힙니다.
311
+ [A] Model gateway ────── the only path your source travels
312
+ One address, set in `setup`. Switching models closes the previous one.
256
313
 
257
- [B] 읽기 (WebFetch) ─ 받아 오기만 하는 길
258
- GET 만. 본문 0바이트. 사내망·로컬 주소는 거절. 다녀온 곳은 전부 기록.
314
+ [B] Web read (WebFetch) ─ receive-only
315
+ GET only, zero-byte body. Private/loopback addresses refused. Every visit logged.
259
316
 
260
- [C] 플러그인 받기 ────── /plugin install 을 칠 때만 잠깐
317
+ [C] Plugin fetch ─────── open only while /plugin install runs
261
318
 
262
- [D] MCP 서버 ─────────── 자식 프로세스, 남의 프로그램
263
- .deel/mcp.json 사람이 직접 적어야만 뜹니다. 기본은 꺼져 있습니다.
319
+ [D] MCP servers ──────── a separate child process, someone else's program
320
+ Only starts if a human writes it into .deel/mcp.json. Off by default.
264
321
  ```
265
322
 
266
- A·B·C deel 직접 만드는 요청이라 하나씩 걸러낼 있습니다. **[D] 는
267
- 다릅니다** — MCP 서버는 별도 프로세스라 안에서 무슨 소켓을 여는지 코드로
268
- 없습니다. 그래서 `--offline` 때는 요청을 거르는 대신 **그 서버
269
- 자체를 아예 띄우지 않습니다** 막을 없는 것을 막았다고 말하지 않습니다.
323
+ A, B, and C are requests deel makes itself, so each one can be filtered.
324
+ **D is different** an MCP server is its own process; there is no way to see
325
+ what sockets it opens from the outside. So under `--offline`, instead of
326
+ filtering its requests, deel **never starts the server at all** it doesn't
327
+ claim to have blocked what it can't actually see.
270
328
 
271
- `--offline` 주면 **B·C·D 모두 막히고 컴퓨터 안으로만** 다닙니다.
329
+ Pass `--offline` and **B, C, and D are all closed** traffic stays on this machine.
272
330
 
273
331
  ```bash
274
332
  deel --offline
275
333
  ```
276
334
 
277
- 무엇이 어디로 있는지는 화면 위에 늘 적혀 있습니다.
335
+ The destination is printed at the top of every session:
278
336
 
279
337
  ```
280
- deel 1.7.0 ⌂ 이 안
281
- 보냄 이 컴퓨터 127.0.0.1:11434 ← 여기 말고는 어디로도 안 갑니다
338
+ deel 1.8.0 ⌂ inside
339
+ Sends to this machine 127.0.0.1:11434 ← nowhere else
282
340
  ```
283
341
 
284
- ### 실행 모드
342
+ ### Three run modes
285
343
 
286
- 1.6 까지는 자물쇠가 `--offline` 하나였고 **기본이 열림**이었습니다.
287
- `.deel/config.json` 주소 줄만 바깥으로 바꾸면 그대로 나갔습니다.
288
- 화면에 `↗` 뜨긴 했지만 그건 **알리는 것**이지 막는 것이 아닙니다.
344
+ Through 1.6 the only lock was `--offline`, and **the default was open**. One
345
+ line in `.deel/config.json` pointing outside was enough. The screen did show
346
+ `↗`, but that is a *notice*, not a lock.
289
347
 
290
- | 모드 | 켜는 | 바깥 주소일 |
348
+ | Mode | How | On an external address |
291
349
  |---|---|---|
292
- | `⌂ 안` | `deel` (처음 값) | **물어봅니다.** 허락하면 연결은 다음부터 묻습니다 |
293
- | `↗ 바깥` | `deel online` · `--online` | 물어봅니다 |
294
- | `⛊ 봉인` | `deel offline` · `--offline` | 기억해 허가까지 무시합니다 (제일 셈) |
350
+ | `⌂ inside` | `deel` (default) | **Asks.** Say yes once and that connection stops asking |
351
+ | `↗ outside` | `deel online` · `--online` | Does not ask |
352
+ | `⛊ sealed` | `deel offline` · `--offline` | Ignores even remembered permission (strongest) |
295
353
 
296
- **주소와 허가가 있어야 나갑니다.** 주소만 바꿔서는 나갑니다.
354
+ **Both the address and the permission are required.** Changing the address
355
+ alone does not get you out.
297
356
 
298
- 로컬·사내망(`127.x` · `10.x` · `192.168.x` · `172.16~31.x`) 셋 중 어느
299
- 모드에서도 그냥 갑니다 — `offline` 「인터넷 없음」 아니라 「회사 밖으로
300
- 나감」 입니다.
357
+ Local and intranet ranges (`127.x` · `10.x` · `192.168.x` · `172.16-31.x`) pass
358
+ in all three modes — `offline` does not mean "no internet," it means "nothing
359
+ leaves the company."
301
360
 
302
- 수집·전송하는 것이 없습니다. 텔레메트리, 사용 통계, 오류 보고 전부 없습니다.
303
- 대화 기록·되돌리기 이력·설정은 작업 폴더의 `.deel/` 안에만 남습니다.
361
+ Nothing is collected or transmitted. No telemetry, no usage stats, no crash reporting.
362
+ Conversation history, undo snapshots and config live only in `.deel/` inside your working folder.
304
363
 
305
- > 검증: `npm test` network·web·mcp 검사 159항목. 허용되지 않은 서버에 실제로
306
- > 요청이 **한 건도 닿지 않는지**, `--offline` MCP 서버가 **한 번도
307
- > 뜨는지**까지 진짜 서버를 띄워서 확인합니다.
364
+ > Verified by 159 checks in `npm test` (network + web + mcp), including bringing up a real
365
+ > server and confirming that **not a single request reaches it** when it is not allow-listed,
366
+ > and that an MCP server **never starts** under `--offline`.
308
367
 
309
368
  ---
310
369
 
311
- ## 바깥 API 붙이기
370
+ ## Connecting a vendor API
312
371
 
313
- 로컬 모델이 도구의 기본값이고, 그건 바뀝니다. 다만 「사내에 GPU 없다」
314
- 「이 가지만 모델로 하고 싶다」 자리가 있어서, 벤더 API 붙을 수
315
- 있게 열었습니다. **위의 모드가 문을 지킵니다.**
372
+ Local models are the default and that does not change. But "we have no GPU
373
+ in-house" and "just this one task on a bigger model" are real situations, so
374
+ vendor APIs can connect. **The modes above guard that door.**
316
375
 
317
376
  ```bash
318
377
  deel setup
319
378
  ```
320
379
 
321
- 주소를 묻는 대신 **어디에 붙을지**를 묻습니다.
380
+ Instead of asking for a URL, it asks **where you're connecting**.
322
381
 
323
382
  ```
324
- 1. 열쇠만 있습니다어디 것인지 찾아 드립니다 빈칸 1
325
- 2. 주소를 직접 넣기 (사내 게이트웨이 · 로컬) 빈칸 2개
326
- 3. OpenAI (GPT) 빈칸 1개
327
- 4. Anthropic (Claude) 빈칸 1개
328
- 5. Google (Gemini) 빈칸 1개
329
- 6. AWS Bedrock 빈칸 2개
383
+ 1. I only have a key I'll figure out where it goes 1 blank
384
+ 2. Enter an address (corporate gateway · local) 2 blanks
385
+ 3. OpenAI (GPT) 1 blank
386
+ 4. Anthropic (Claude) 1 blank
387
+ 5. Google (Gemini) 1 blank
388
+ 6. AWS Bedrock 2 blanks
330
389
  ```
331
390
 
332
- 1번이 핵심입니다. 열쇠 앞머리로 어디 것인지 짚어서 **한 곳만** 묻습니다.
391
+ Option 1 is the point the key prefix decides which single vendor is asked.
333
392
 
334
393
  ```
335
394
  ❯ sk-ant-api03-••••
336
- ✓ Anthropic (Claude) 열쇠로 보입니다. (열쇠가 sk-ant- 로 시작합니다)
337
- 여기저기 던지지 않습니다.
395
+ Looks like an Anthropic (Claude) key. (the key starts with sk-ant-)
396
+ It is not thrown at every vendor in turn.
338
397
  ```
339
398
 
340
- 벤더마다 찔러 보는 식으로 만들면 Anthropic 열쇠가 OpenAI 서버로, 다시 Google
341
- 서버로 갑니다. 401 오고 끝이지만 **열쇠는 이미 갔습니다.** 그래서 모르는
342
- 열쇠는 짐작하지 않고 사람에게 묻습니다.
399
+ Probing vendors one by one would send an Anthropic key to OpenAI's server and
400
+ then to Google's. You get a 401 and stop but **the key has already left.**
401
+ So an unrecognized key is never guessed at; you are asked.
343
402
 
344
- Bedrock 리전을 고릅니다서울(`ap-northeast-2`) 포함 다섯 곳과 「직접 입력」.
345
- Claude 몸통 규격이 달라서 여섯 자리를 따로 흡수했습니다
346
- ([1.7.0 릴리스 노트](docs/ko/releases/1.7.md#170)).
403
+ Bedrock asks for a region five including Seoul (`ap-northeast-2`), plus
404
+ "enter it yourself." Claude has a different wire shape, absorbed in six places
405
+ ([1.7.0 release notes](docs/en/releases/1.7.md#170)).
347
406
 
348
- ### 바깥에 붙으면 파일 비밀도 가립니다
407
+ ### Going outside masks secrets in file contents too
349
408
 
350
- 로컬만 때는 파일에서 읽어 글을 **일부러 가렸습니다** — 가리면 모델이
351
- 가림표를 다시 파일에 써서 사람의 진짜 열쇠를 지워 버리기 때문입니다.
409
+ While everything stayed local, text read from files was deliberately **not**
410
+ masked: mask it and the model writes the mask back into the file, destroying
411
+ your real key.
352
412
 
353
- 바깥으로 나가면 저울이 뒤집힙니다. `Read` 번이면 `.env` 통째로 남의
354
- 서버 로그에 남고, 그건 되돌릴 수가 없습니다. 잃는 쪽은 다른 자리에서 막았습니다
355
- `Write`·`Append`·`Edit` 가린 표를 파일에 씁니다.
413
+ Going outside flips that trade. One `Read` puts your whole `.env` into someone
414
+ else's server log, and that cannot be undone. The other side is now handled
415
+ elsewhere — `Write`, `Append` and `Edit` refuse to write a mask back into a file.
356
416
 
357
- ### 얼마 나갔는지 보입니다
417
+ ### You can see what it costs
358
418
 
359
419
  ```
360
- ❯ ─ 12.4초 · 도구 3 · ↑8.2k ↓1.1k · $0.0271
420
+ ❯ ─ 12.4s · 3 tools · ↑8.2k ↓1.1k · $0.0271
361
421
  ```
362
422
 
363
- **값이 박힌 요금표가 없습니다.** 요금은 회사가 아무 때나 바꾸는 값이라, 소스에
364
- 박아 두면 반년 도구는 틀린 금액을 자신 있게 찍는 도구가 됩니다.
365
- `.deel/config.json` 에 적으면 셈합니다 100만 토큰당 달러입니다.
423
+ **There is no built-in price table.** Prices change whenever a vendor decides,
424
+ and a table baked into source would have the tool confidently printing wrong
425
+ amounts six months later. Write them in `.deel/config.json` — dollars per
426
+ million tokens:
366
427
 
367
428
  ```json
368
429
  "요금": { "claude-opus-4-6": { "입력": 0, "출력": 0, "기준": "2026-09-01" } }
369
430
  ```
370
431
 
371
- 금액 옆에 **어디서 값인지·언제 기준인지**가 같이 뜨고, 반년이 지나면
372
- 오래됨` 붙습니다. 모르면 찍습니다 로컬로만 쓰는 화면에는 이야기가
373
- 아예 뜹니다.
432
+ The amount is shown with **where it came from and as of when**, and after six
433
+ months it is marked stale. Unknown means nothing is printed a local-only
434
+ session never sees money at all.
374
435
 
375
436
  ---
376
437
 
377
- ## 로컬 모델 여러 쓰기
438
+ ## Keys that expire (corporate gateways)
439
+
440
+ Corporate gateways do not hand out a fixed key. They hand out a one-hour token, behind a
441
+ corporate login. Pasting one in works until lunch, and then you get `HTTP 401` — a message
442
+ that **does not distinguish "wrong key" from "old key."** People go re-issue a key that was
443
+ never the problem.
378
444
 
379
- 로컬 런타임은 보통 하나만 쓰지 않습니다. Ollama 작은 모델을 돌리면서
380
- LM Studio 로 큰 모델을 띄워 두기도 합니다. `deel scan` 이 알려진 자리 13곳을 동시에 두드려
381
- 전부 찾아냅니다.
445
+ So write down *how to get a key* instead of the key:
382
446
 
447
+ ```json
448
+ "열쇠받기": {
449
+ "명령": "az account get-access-token --resource api://ai-gw --query accessToken -o tsv",
450
+ "수명": 3600
451
+ }
383
452
  ```
384
- $ deel scan
385
453
 
386
- ── 로컬 모델 서버 훑기 ───────────────────────────────────────────────
387
- 127.0.0.1 알려진 자리 13곳을 두드립니다. 바깥으로는 나가지 않습니다.
454
+ It runs right before a request, keeps the result in memory only, and fetches a fresh one a
455
+ minute before expiry a token alive when the request left and dead when it arrived is
456
+ exactly that 401. On a 401 it fetches once more and retries **once**; a second 401 means you
457
+ genuinely lack access.
458
+
459
+ | | |
460
+ |---|---|
461
+ | You write the path | Nothing is auto-detected. Guessing at `az` on your PATH would mean you no longer know when this program runs what |
462
+ | Separate process | Never `import`ed — code inside our process would see other keys and the conversation |
463
+ | Asked once per session | Not once per fetch. Three prompts and people just press the key |
464
+ | Not while sealed | An `--offline` session does not go out to a login portal |
465
+ | Never written to disk | Memory only, for the life of the session |
466
+ | Banner output rejected | `Logged in as …` followed by a token gets a 400 from the gateway, indistinguishable on screen from a wrong key. The first line is shown back so you know to add `--query` |
467
+
468
+ `/status` says `Key store fetched · 52 min left` — not "stored", because we are not holding
469
+ it. An organisation can set the same block in the [managed policy](docs/en/config.md) file,
470
+ where it overrides the user's config and is never asked about.
471
+
472
+ ---
388
473
 
389
- 3곳 찾음
474
+ ## Multiple local runtimes
390
475
 
391
- Ollama 127.0.0.1:11434 Ollama 규격 36ms
476
+ People rarely run just one. `deel scan` knocks on 13 known ports concurrently and identifies
477
+ each runtime from its **response**, not its port number — Ollama by `/api/version`,
478
+ LM Studio by `/api/v0/models`, llama.cpp by `/props`. Unrecognised ones are marked as a guess.
479
+
480
+ ```
481
+ $ deel scan
482
+
483
+ ✓ found 3
484
+
485
+ ◆ Ollama 127.0.0.1:11434 Ollama API 36ms
392
486
  · qwen2.5-coder:7b 7B · 4.4GB
393
487
  · llama3.2:1b 1B · 1.2GB
394
- ◆ LM Studio 127.0.0.1:1234 OpenAI 호환 7ms
488
+ ◆ LM Studio 127.0.0.1:1234 OpenAI-compat 7ms
395
489
  · devstral-small-2507
396
- ◆ llama.cpp 127.0.0.1:8080 OpenAI 호환 7ms
490
+ ◆ llama.cpp 127.0.0.1:8080 OpenAI-compat 7ms
397
491
  · gemma-3-4b-it
398
492
 
399
- 합계 서버 3곳 · 모델 6개
400
-
401
- 추천 Ollama · qwen2.5-coder:7b
402
- 코딩용 모델 · 도구 호출을 잘하는 계열
493
+ Recommended Ollama · qwen2.5-coder:7b
403
494
  ```
404
495
 
405
- 포트로 단정하지 않고 **응답을 보고** 런타임을 구분합니다 — Ollama 는 `/api/version`,
406
- LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추정)` 이라고 밝힙니다.
407
-
408
- | 명령 | 하는 일 |
496
+ | Command | What it does |
409
497
  |---|---|
410
- | `deel scan` | 찾아서 보여주기만 |
411
- | `deel scan --pick` | 목록에서 골라 등록 |
412
- | `deel scan --save` | 찾은 전부 등록 |
413
- | `deel scan --ports 9000,9100` | 기본 자리 말고 볼 포트 |
414
- | `deel scan --host <주소>` | 기본은 `127.0.0.1` |
415
- | `deel scan --key <키>` | 키가 필요한 로컬 서버일 때 |
498
+ | `deel scan` | Show what is running |
499
+ | `deel scan --pick` | Choose one from the list |
500
+ | `deel scan --save` | Register everything found |
501
+ | `deel scan --ports 9000,9100` | Extra ports to probe |
502
+ | `deel scan --host <addr>` | Defaults to `127.0.0.1` |
416
503
 
417
- 등록한 뒤에는 대화 중 `/model` 갈아탑니다. **대화 내용은 그대로 이어집니다.**
504
+ Switch with `/model` mid-conversation **the conversation carries over.**
418
505
 
419
- > **자세히**걸린 모델에 맞춰 스스로 바뀝니다 · 국산 모델은 겪기 전에 압니다 · 작은 창에서는 고정 몫을 줄입니다 · 폴더가 무슨 프로젝트인지 읽습니다
506
+ > **More**It adapts to whatever model is attached · Korean models are known before they are experienced · Small windows get a smaller fixed share · On startup it reads what kind of project this folder is
420
507
  >
421
- > **[모델 다루기 읽기 →](docs/ko/models.md#로컬-모델-여러-개-쓰기)**
508
+ > **[Models read →](docs/en/models.md#multiple-local-runtimes)**
422
509
 
423
510
  ---
424
511
 
425
- ## 대화 중 명령
512
+ ## Slash commands
426
513
 
427
- 이름은 Claude Code / Codex 관례에 맞췄습니다.
514
+ Names follow Claude Code / Codex conventions.
428
515
 
429
- | 명령 | 하는 |
516
+ | Command | What it does |
430
517
  |---|---|
431
- | `/help` | 명령 목록 |
432
- | `/bell [on|off]` | 됐을 때·물어볼 종소리와 제목 |
433
- | `/lang [ko|en|ja|zh] [시킬말]` | 화면 (한국어·English·日本語·中文 가지, 전부 채워져 있다). **시킬 말을 따로 줄 수 있다** `/lang ko en` 이면 모델에게는 영어로 시키고 답은 한국어로 받는다(8k 창에서 고정 몫 23% 감소). 코드는 그대로 |
434
- | `/keys` | 터미널이 무슨 키를 보내는지 눌러서 확인 줄바꿈이 |
435
- | `/consult <프로필> <질문>` | 다른 모델에게 물어보기 지금 쓰는 것은 바꿈 |
436
- | `/export` | 대화를 **보고서 장**(HTML)으로시킨 것·바뀐 것·확인한 것. 폐쇄망에서 여는 자기완결 파일 |
437
- | `/lsp [on\|off]` | 언어 서버무엇이 깔려 있고 `Def`·`Refs` 수 있는지. `off` 고친 진단만 |
438
- | `/context` | 무엇이 컨텍스트를 먹고 있는지 |
439
- | `/ctx [auto\|숫자\|자세히]` | 컨텍스트 **길이**모델에 맞춰 다시 재거나 직접 지정 |
440
- | `/out [숫자\|auto]` | 번에 받을 **답 길이** 상한 파일이 잘리면 여기를 올립니다 |
441
- | `/grade [작음\|보통\|큼\|auto]` | 모델 **급**얼마나 알아서 하나. `/ctx` 다른 축입니다 |
442
- | `/compact` | 앞선 대화를 요약해서 접기 |
443
- | `/clear` | 대화 비우기 (연결·규칙은 유지) |
444
- | `/thread [new\|fork\|close\|번호]` | 대화 갈래곁가지를 자리에서. 연결·되돌리기는 같이 씁니다 |
445
- | `/learned [지우기]` | 쓰면서 저절로 알게 되는 명령·이 모델의 버릇 |
446
- | `/pin <말>` | 박기접거나 요약해도 **안 지워지는** |
447
- | `/evidence [파일]` | 증거무엇을 바꿨고 무엇이 그걸 증명하나. **안 것도** 적습니다 |
448
- | `/commit [전부\|미리보기\|제목]` | 이번 대화가 바꾼 것만 담아 커밋. 메시지는 diff 증거에서. **push 안 합니다** |
449
- | `/model` | 연결·모델 바꾸기 |
450
- | `/model 카드` | 모델을 겪어 결과 그래서 deel 무엇을 바꿔 뒀는지 |
451
- | `/think <강도>` | 추론 강도 (`off·low·medium·high·max`) |
452
- | `/think 배분 <배분>` | 단계별 배분 (`균일·절약·깊게`) |
453
- | `/think 자세히` | 단계표어느 단계를 어떤 강도·상한으로 도는지 |
454
- | `/mode <모드>` | 승인 정책얼마나 물어보나 (`auto` · `confirm` · `strict`) |
455
- | `/work [모드]` | 작업 모드무슨 일을 하는 중인가 |
456
- | `/auto` | 다시 맡기기말을 보고 알맞은 모드로 저절로 옮겨 갑니다 |
457
- | `/code` `/plan` `/architect` `/debug` `/ask` `/orchestrator` | 작업 모드 바로 바꾸기 (그때부터 고정) |
458
- | `/level [수준]` | 화면에 무엇을 내놓을지 (`쉬움` · `개발자`) |
459
- | `/motion [기본\|기사\|동물\|사무실\|끔]` | 일하는 동안 뭐가 도나 자리에서 바뀌고 설정에 남습니다 |
460
- | `/undo [턴수]` | 파일 변경 되돌리기 |
461
- | `/diff [파일]` | 이번 대화에서 바뀐 파일 · 바뀐 자리 보기 |
462
- | `/preview [폴더\|파일\|off]` | 만든 웹을 자리에서 띄워 보기브라우저가 같이 열립니다 |
463
- | `/tools` | 있는 도구 |
464
- | `/skills [검색어\|all\|off]` | 스킬 보기·검색·골라 올리기 |
465
- | `/plugin [install\|remove\|pack]` | 플러그인 관리 |
466
- | `/cost` | 이번 세션 사용량 |
467
- | `/status` | 연결 상태 |
468
- | `/scan [save]` | PC 있는 로컬 모델 서버 훑기 (`save` 바로 등록) |
469
- | `/sessions` | 폴더의 지난 대화 목록 |
470
- | `/recall <말>` | 지난 대화에서 **내용으로** 찾기 |
471
- | `/memory` | 대화가 끝나도 남는 기억보기·적기·지우기 |
472
- | `/mcp` | 밖에서 붙인 도구(MCP) 서버 보기 |
473
- | `/init` | `DEEL.md` 규칙 파일 만들기 |
474
- | `/exit` | 끝내기 |
475
-
476
- `/scan` `/sessions` 나가지 않고도 씁니다. 로컬 서버를 새로 켰거나 모델을
477
- 바꿔 올렸을 때 `/scan save` → `/model` 두 번이면 대화를 이어둔 채로 갈아탑니다.
478
-
479
- **치지 않고 쓰는 것**
480
-
481
- | 키 | 무엇을 |
518
+ | `/help` | Command list |
519
+ | `/lang [ko\|en] [prompt lang]` | Screen language. **The prompt language is a separate axis** — `/lang en ko` instructs the model in Korean while answering you in English. Korean screen + English prompt cuts the 8k fixed share by 23% |
520
+ | `/keys` | Press keys to see what your terminal actually sendsfor when new lines will not work |
521
+ | `/bell [on\|off]` | Ring and set the window title when a turn ends, or when deel needs an answer |
522
+ | `/consult <profile> <question>` | Ask a second model one question. Your current model stays put |
523
+ | `/export` | This conversation as a **one-page HTML report** asked, changed, verified. Self-contained, opens on any network |
524
+ | `/lsp [on\|off]` | Language serverswhat is installed, and whether `Def`/`Refs` are available. `off` turns post-edit diagnostics off only |
525
+ | `/context` | What is consuming the context window |
526
+ | `/ctx [auto\|number]` | Context **length**re-read it off the model, or set it yourself |
527
+ | `/grade [small\|medium\|large\|auto]` | Model **grade** how much it does on its own. A different axis from `/ctx` |
528
+ | `/out [number\|auto]` | Cap on a **single reply** raise it when large files get cut |
529
+ | `/compact` | Summarise and fold older turns |
530
+ | `/clear` | Clear the conversation (keeps link and rules) |
531
+ | `/thread [new\|fork\|close\|n]` | Conversation threadsside work in its own context. Link and undo stay shared |
532
+ | `/learned [clear]` | What deel has picked up on its own commands that work here, this model's habits |
533
+ | `/pin <text>` | Pin a line folding and compaction **cannot reach it** |
534
+ | `/evidence [file]` | Evidencewhat changed, and what proves it. **What is unproven is listed too** |
535
+ | `/commit [all\|preview\|title]` | Commits only what this session changed; message from the diff and the evidence. **Never pushes** |
536
+ | `/model` | Switch connection / model |
537
+ | `/model 카드` | Model card what this model has actually done here, and what deel changed because of it |
538
+ | `/think <level>` | Reasoning level (`off·low·medium·high·max`) |
539
+ | `/think 배분 <profile>` | Per-stage profile (`even·save·deep`) |
540
+ | `/think 자세히` | Stage table which stage runs at which level and cap |
541
+ | `/mode <mode>` | Approval policyhow much it asks (`auto` · `confirm` · `strict`) |
542
+ | `/work [mode]` | Work modewhat kind of work you are doing |
543
+ | `/auto` | Hand the wheel back it picks the mode from what you type |
544
+ | `/code` `/plan` `/architect` `/debug` `/ask` `/orchestrator` | Switch work mode directly (pins it) |
545
+ | `/level [level]` | How much to show (`쉬움` simple · `개발자` developer) |
546
+ | `/motion [plain\|knight\|animal\|office\|off]` | What animates while it works takes effect at once, and is saved |
547
+ | `/undo [turns]` | Revert file changes |
548
+ | `/diff [file]` | Files changed this session, and the changed lines |
549
+ | `/preview [folder\|file\|off]` | Serve what you built, right herea browser opens with it |
550
+ | `/tools` | Available tools |
551
+ | `/skills [query\|all\|off]` | Browse, search, load skills |
552
+ | `/plugin [install\|remove\|pack]` | Manage plugins |
553
+ | `/cost` | Session usage |
554
+ | `/status` | Connection status |
555
+ | `/scan [save]` | Sweep this machine for local model servers (`save` registers them) |
556
+ | `/sessions` | Past conversations in this folder |
557
+ | `/recall <text>` | Search past conversations **by content** |
558
+ | `/memory` | What persists across sessionsview, add, delete |
559
+ | `/mcp` | Externally attached tools (MCP servers) |
560
+ | `/init` | Create a `DEEL.md` rules file |
561
+ | `/exit` | Quit |
562
+
563
+ Discovered plugin commands are invoked as `/<plugin>:<name>`, with `$ARGUMENTS` substituted.
564
+
565
+ `/scan` and `/sessions` work without leaving the session. If you just started another local
566
+ server or loaded a different model, `/scan save` then `/model` switches over without losing
567
+ the conversation.
568
+
569
+ **Without typing**
570
+
571
+ | Key | What it does |
482
572
  |---|---|
483
- | `Tab` | 치던 `/` 명령을 채웁니다. 치는 도중에 후보가 상자 아래에 뜹니다 |
484
- | `Shift+Tab` | 승인 방식 (`⏵⏵ 자동` → `⏵ 위험만` → `⏸ 모두`) |
485
- | `Ctrl+O` | 작업 모드 (`종합` → `코드` → `계획` → …) |
486
- | `↑` `↓` | 지난 입력 이력 |
487
- | `Ctrl+C` | 답하는 중이면 답만 끊고, 줄에서 번이면 끝냅니다 |
488
- | 일하는 중에 그냥 치고 `Enter` | 하던 일을 버리고 방향만 틉니다 다음 걸음부터 반영 |
573
+ | `Tab` | Completes the `/` command you are typing. Candidates appear under the box as you type |
574
+ | `Shift+Tab` | Approval policy (`⏵⏵ auto` → `⏵ risky only` → `⏸ everything`) |
575
+ | `Ctrl+O` | Work mode (`종합` → `코드` → `계획` → …) |
576
+ | `↑` `↓` | Input history |
577
+ | `Ctrl+C` | Stops the answer in progress; twice on an empty line quits |
578
+ | Typing while it works, then `Enter` | Steers without throwing anything awaytakes effect from the next step |
489
579
 
490
- 한글 조합·붙여넣기·`Ctrl+A/E`·백스페이스는 전부 그대로 됩니다.
580
+ Korean IME composition, paste, `Ctrl+A/E` and backspace all keep working.
491
581
 
492
- > **자세히**@파일 바로 붙이기 · 도중에 멈추기 · 멈추지 않고 방향만 틀기
582
+ > **More**Attaching a file with @ · Interrupting · Steering without stopping
493
583
  >
494
- > **[화면과 조작 읽기 →](docs/ko/interface.md#대화-중-명령)**
584
+ > **[The screen read →](docs/en/interface.md#slash-commands)**
495
585
 
496
586
  ---
497
587
 
498
- ## 작업 모드
588
+ ## Work modes
499
589
 
500
- 무슨 일을 하는 중인지에 따라 **줄 있는 도구와 추론 설정이 같이 바뀝니다.**
501
- `Shift+Tab` 으로 차례로 돌리거나, 이름을 그대로 치면 됩니다.
590
+ What you are working on changes **which tools the model is given and how hard it thinks.**
591
+ Cycle with `Shift+Tab`, or type the name.
502
592
 
503
- | 모드 | 하는 | 파일을 고치나 | 추론 |
593
+ | Mode | For | Can edit files | Reasoning |
504
594
  |---|---|---|---|
505
- | `/auto` ◎ 종합 | **처음 값.** 말을 보고 알맞은 모드로 옮겨 간다 | | 보통 (`save`) |
506
- | `/code` ◆ 코드 | 고치고 만든다 | | 보통 (`save`) |
507
- | `/plan` ☰ 계획 | 먼저 계획만 세운다 | **아니오** | 깊게 (`deep`·high) |
508
- | `/architect` ◈ 설계 | 구조를 짠다 | **아니오** | 깊게 (`deep`·high) |
509
- | `/debug` ◉ 디버그 | 원인을 찾는다 | | 깊게 · 단계 많이 (32) |
510
- | `/ask` ◇ 묻기 | 설명만 한다 | **아니오** | 얕게 (`low`) |
511
- | `/orchestrator` ❋ 총괄 | 일을 쪼개서 | | 단계 아주 많이 (40) |
595
+ | `/auto` ◎ Auto | **Default.** Reads your message and switches for you | Yes | Normal (`save`) |
596
+ | `/code` ◆ Code | Writing and fixing | Yes | Normal (`save`) |
597
+ | `/plan` ☰ Plan | Planning first | **No** | Deep (`deep`·high) |
598
+ | `/architect` ◈ Architect | Shaping structure | **No** | Deep (`deep`·high) |
599
+ | `/debug` ◉ Debug | Finding causes | Yes | Deep, more steps (32) |
600
+ | `/ask` ◇ Ask | Explaining only | **No** | Shallow (`low`) |
601
+ | `/orchestrator` ❋ Orchestrator | Breaking up large work | Yes | Many steps (40) |
512
602
 
513
- 읽기만 하는 모드에서는 `Write`·`Edit`·`Bash` **모델에게 아예 보내지 않습니다.**
514
- "고치지 마세요" 라고 부탁하지 않습니다모델은 부탁을 잊습니다. 없는 도구는 씁니다.
603
+ In read-only modes, `Write`, `Edit` and `Bash` are **never sent to the model at all.**
604
+ It is not asked politely not to edit models forget requests. A tool that isn't there can't be used.
515
605
 
516
- `/mode` 헷갈리지 마세요. 둘은 다른 축입니다.
606
+ Don't confuse this with `/mode`. They are separate axes:
517
607
 
518
- - `/mode` — **얼마나 물어보나** (auto · confirm · strict)
519
- - `/work` — **무슨 일을 하는 중인가** ( 일곱 가지)
608
+ - `/mode` — **how much it asks you** (auto · confirm · strict)
609
+ - `/work` — **what kind of work you are doing** (the seven above)
520
610
 
521
- `/think` `/mode` 직접 고른 적이 있으면 선택이 우선합니다.
522
- 모드가 사람이 고른 값을 덮어쓰지 않습니다.
611
+ If you have explicitly set `/think` or `/mode`, your choice wins. A work mode never
612
+ overrides something a person chose.
523
613
 
524
- > **자세히**저절로 옮겨 가기 (종합 모드)
614
+ > **More**Switching by itself (Auto mode)
525
615
  >
526
- > **[화면과 조작 읽기 →](docs/ko/interface.md#작업-모드)**
616
+ > **[The screen read →](docs/en/interface.md#work-modes)**
527
617
 
528
618
  ---
529
619
 
530
- ## 쉬움 · 개발자
620
+ ## Simple vs developer
531
621
 
532
- 처음 사람에게 명령 스무 개를 들이밀면 아무것도 고릅니다.
533
- 그렇다고 기능을 잠그면 만해졌을 막힙니다. 그래서 **보이는 것만** 나눕니다.
622
+ Twenty commands on first launch means nothing gets chosen. Locking features away means
623
+ hitting a wall later. So only **what is shown** differs.
534
624
 
535
- | | 쉬움 (기본) | 개발자 |
625
+ | | Simple (`쉬움`, default) | Developer (`개발자`) |
536
626
  |---|---|---|
537
- | `/help` 목록 | 자주 쓰는 것만 | 전부 |
538
- | 오류 문구 | 무엇을 하면 되는지 | 원래 문구 그대로 |
539
- | 안전 장치 | **똑같음** | **똑같음** |
627
+ | `/help` listing | Common commands only | Everything |
628
+ | Error messages | What to do about it | The original text |
629
+ | Safety | **Identical** | **Identical** |
540
630
 
541
- `/level 개발자` 바꾸면 설정에 남아 다음에 때도 이어집니다.
631
+ `/level 개발자` is saved to config and persists across sessions.
542
632
 
543
- 중요한 가지입니다.
633
+ Two things matter here:
544
634
 
545
- - **감춘 것도 그대로 먹습니다.** 쉬움에서 `/think high` 쳐도 됩니다. 목록에 띄울 뿐입니다.
546
- - **초보라고 승인을 받지 않습니다.** 되돌리기·작업 범위·위험 명령 차단은 수준이 같습니다.
547
- 초보일수록 되돌릴 있어야 합니다.
635
+ - **Hidden commands still work.** `/think high` works in simple mode. It just isn't listed.
636
+ - **Beginners do not get fewer safeguards.** Undo, workspace scope and dangerous-command
637
+ blocking are identical. A beginner needs the undo more, not less.
548
638
 
549
- > **자세히**입력칸 · 명령은 쳐도 됩니다 · 일하는 중에는 상자가 그대로 있습니다 · 왼쪽 그림도 같이 움직입니다 1
639
+ > **More**The input box · You don't have to type the whole command · The box stays while it works · The picture on the left moves too and 1 more
550
640
  >
551
- > **[화면과 조작 읽기 →](docs/ko/interface.md#쉬움--개발자)**
641
+ > **[The screen read →](docs/en/interface.md#simple-vs-developer)**
552
642
 
553
643
  ---
554
644
 
555
- ## 도구
645
+ ## Tools
556
646
 
557
- 이름과 인자를 Claude Code 같게 맞췄습니다. 관례로 쓰인 스킬·명령이 그대로 먹습니다.
647
+ Names and arguments match Claude Code, so skills written for that convention work unchanged.
558
648
 
559
- | 도구 | 하는 |
649
+ | Tool | What it does |
560
650
  |---|---|
561
- | `Read` | 파일 읽기 ( 번호 · `offset`/`limit` 지원 · **엑셀은 CSV 로, hwpx·docx·pptx·PDF 글로 바꿔서**) |
562
- | `Write` | 파일 쓰기·덮어쓰기 (**여러 개는 `files` 배열로 한 번에**) |
563
- | `Append` | 파일 끝에 이어 붙이기**큰 파일을 나눠 쓰는 자리** |
564
- | `Edit` | 정확한 문자열 바꾸기 (`replace_all` · **여러 군데는 `edits` 배열로 한 번에**) |
565
- | `Move` | 파일·폴더 옮기기·이름 바꾸기**구조를 바꾸는 자리** (`moves` 배열로 번에 · 되돌리기에 잡힘) |
566
- | `Glob` | 이름 패턴으로 파일 찾기 |
567
- | `Grep` | 내용 정규식 검색 |
568
- | `Bash` | 명령 실행 (**끝나지 않는 것은 `background: true`**) |
569
- | `Skill` | 스킬 본문 펼쳐 읽기 (스킬이 있을 때만 모델에게 보임) |
570
- | `WebFetch` | 페이지 읽기 (읽기 전용 · `--offline` 이면 숨김) |
571
- | `Ask` | 갈림길에서 **사람에게 되묻기**고를 것을 주고 숫자 하나로 받는다 |
572
- | `Recall` | **지난 대화**에서 찾기"저번에 그거" 모델이 스스로 뒤진다 |
573
- | `Remember` | 대화가 끝나도 남길 다음에 처음부터 안다 |
574
- | `TodoWrite` | 목록 일을 쪼개서 어디까지 했는지 화면에 띄움 |
575
- | `Outline` | 폴더의 **뼈대만** 보기통째로 읽는 것보다 수십 분의 |
576
- | `Verify` | 만든 것이 **진짜 되는지** 확인 |
577
- | `Task` | 일의 덩이를 **따로 떨어진 창**에서 돌리기 |
578
- | `Jobs` | **뒤에서 도는 명령** 보기·읽기·끝내기 — `Bash` `background` 와 짝 |
579
- | `Def` | 이름이 **어디 정의됐는지**언어 서버가 깔려 있을 때만 보입니다 |
580
- | `Refs` | 이름을 **어디서 쓰는지** 전부언어 서버가 깔려 있을 때만 보입니다 |
581
-
582
- Claude Code 없는 것은 아홉입니다 — `Append` · `Move` · `Ask` · `Recall` ·
583
- `Remember` · `Outline` · `Verify` · `Task` · `Jobs`. 도구 하나가 스키마로 150~400토큰을 먹고
584
- 그게 **매 요청마다** 나가므로, 늘릴 때마다 검사에서 멈추게 뒀습니다
585
- (`test/loop.test.js`). 뒤의 넷은 값을 치르고도 넣을 만해서 넣은 것들이라,
586
- 아래에 왜인지를 적어 뒀습니다.
587
-
588
- > **자세히** — Outline · Verify · Task · Def · Refs · 끝나지 않는 명령은 뒤에서 외 9개
651
+ | `Read` | Read a file (line numbers, `offset`/`limit`, **Excel as CSV, hwpx/docx/pptx and PDF as text**) |
652
+ | `Write` | Write / overwrite a file (**several at once via the `files` array**) |
653
+ | `Append` | Append to the end of a file **how large files get written in pieces** |
654
+ | `Edit` | Replace an exact string (`replace_all`; **several sites at once via the `edits` array**) |
655
+ | `Move` | Move / rename files and folders **how you restructure** (`moves` array; covered by undo) |
656
+ | `Glob` | Find files by name pattern |
657
+ | `Grep` | Regex search file contents |
658
+ | `Bash` | Run a command (**`background: true` for anything that does not finish**) |
659
+ | `Skill` | Expand a skill body (shown to the model only when skills exist) |
660
+ | `WebFetch` | Read a web page (read-only; hidden under `--offline`) |
661
+ | `Ask` | **Ask you back** at a fork offers the choices, takes a single number |
662
+ | `Recall` | Search **past conversations**the model digs up "that thing last time" itself |
663
+ | `Remember` | One line that outlives the sessionknown from the start next time |
664
+ | `TodoWrite` | Checklist breaks long work into steps and shows progress |
665
+ | `Outline` | See a folder's **skeleton only** tens of times cheaper than reading it whole |
666
+ | `Verify` | Check that what was built **actually works** |
667
+ | `Task` | Run one chunk of a big job in a **separate context** |
668
+ | `Jobs` | Inspect, read and stop **background commands** the other half of `Bash`'s `background` |
669
+ | `Def` | **Where a name is defined** only shown when a language server is installed |
670
+ | `Refs` | **Every place a name is used** only shown when a language server is installed |
671
+
672
+ Nine tools here are not in Claude Code — `Append`, `Move`, `Ask`, `Recall`, `Remember`,
673
+ `Outline`, `Verify`, `Task`, `Jobs`. Each tool costs 150-400 tokens of schema on **every request**,
674
+ so a test stops you every time the list grows (`test/loop.test.js`). The last four earned
675
+ their cost; here is why.
676
+
677
+ > **More** — Outline · Verify · Task · Def · Refs · Commands that never finish and 9 more
589
678
  >
590
- > **[도구 자세히 읽기 →](docs/ko/tools.md#도구)**
679
+ > **[Tools in depth read →](docs/en/tools.md#tools)**
591
680
 
592
681
  ---
593
682
 
594
- ## 한글 문서와 엑셀
595
-
596
- **CP949 로 저장된 파일은 CP949 로 되돌려 씁니다.** 인코딩을 바꾸지 않습니다.
597
- 엑셀(`.xlsx`)은 CSV 로, 한글·워드·파워포인트(`.hwpx`/`.docx`/`.pptx`)와
598
- **PDF** 는 글로 바꿔서 읽습니다 — 전부 읽기 전용입니다.
683
+ ## Korean text and Excel
599
684
 
600
- PDF **못 읽은 쪽을 읽었다고 말합니다.** 스캔본·암호·글꼴 표가 없는 쪽은
601
- 글로 넘기지 않고 자리에 까닭을 적습니다 빈 글은 「그런 내용이 없다」로
602
- 읽히기 때문입니다.
685
+ **A file saved as CP949 is written back as CP949.** The encoding is never changed.
686
+ Excel (`.xlsx`) is read as CSVread-only.
603
687
 
604
- 형식(`.ppt`·`.doc`·`.xls`·`.rtf`) **이 PC 깔린 LibreOffice 를 빌려서**
605
- 읽습니다`rg` 빌려 쓰는 것과 같은 원칙으로, 아무것도 설치하지 않습니다.
606
- 없으면 **없다고 박고 끝냅니다**(무엇이 없어서 하는지, 무엇을 하면 되는지,
607
- 그리고 「다시 열지 말라」까지). 끄려면 `DEEL_CONVERT=off`.
688
+ Old formats (`.ppt`, `.doc`, `.xls`, `.rtf`) are read by **borrowing the LibreOffice already
689
+ on this machine** the same terms on which deel borrows `rg`, and nothing is ever installed.
690
+ With no converter it **says so definitively and stops**: what is missing, what you can do about
691
+ it, and not to open the file again. Turn it off with `DEEL_CONVERT=off`.
608
692
 
609
- > **자세히**인코딩 · 엑셀 · hwpx/docx/pptx · PDF · 변환기 빌려 쓰기
693
+ > **More**Encoding · Excel · borrowing a converter
610
694
  >
611
- > **[한글 문서와 엑셀 읽기 →](docs/ko/documents.md#한글-문서와-엑셀)**
695
+ > **[Korean documents and Excel read →](docs/en/documents.md#korean-text-and-excel)**
612
696
 
613
697
  ---
614
698
 
615
- ## 만든 웹을 자리에서 띄웁니다
699
+ ## Serving what you built
616
700
 
617
701
  ```
618
702
  ❯ /preview
619
703
 
620
- 띄웠습니다 http://127.0.0.1:56801/
621
- 보여 주는 것 .
622
- 파일을 고치면 화면이 저절로 새로 뜹니다.
623
- 컴퓨터에서만 열립니다(127.0.0.1). 다른 PC 에서는 보입니다.
624
- 끄려면 /preview off · deel 끝내면 같이 꺼집니다.
704
+ Serving http://127.0.0.1:56801/
705
+ showing .
706
+ Edit a file and the page reloads by itself.
707
+ Only this machine can open it (127.0.0.1). No other PC can see it.
708
+ Stop with /preview off · it shuts down when deel exits.
625
709
  ```
626
710
 
627
- 브라우저가 같이 열립니다. `/preview 폴더` 자리를 정하고, `/preview off` 끕니다.
711
+ A browser opens with it. `/preview <folder>` picks what to serve, `/preview off` stops it.
628
712
 
629
- **파일을 눌러 여는 (`file://`) 다릅니다.** `file://` 에서는 아래가 전부
630
- 막힙니다그런데 오류는 콘솔에만 나오고 화면은 그냥 희어서, 만든 사람은 코드를
631
- 의심하며 시간을 씁니다. 진짜 HTTP 서버라 돕니다:
713
+ **This is not the same as double-clicking the file (`file://`).** Under `file://` everything
714
+ below is blocked and the error only shows up in the console while the page stays blank, so
715
+ you end up suspecting your own code. This is a real HTTP server, so it all works:
632
716
 
633
717
  | | `file://` | `/preview` |
634
718
  |---|---|---|
635
- | `<script type="module">` · `import` | 막힘 (CORS) | **됨** |
636
- | `fetch('./자료.json')` | 막힘 | **됨** |
637
- | `new Worker(...)` | 막힘 | **됨** |
638
- | `WebAssembly.compileStreaming` | 막힘 (형식) | **됨** |
639
- | 텍스처·`getImageData` | 캔버스 오염 | **됨** |
640
- | `.glb` / `.gltf` (Three.js) | 형식 없음조용히 그려짐 | **됨** |
641
-
642
- 실제 크롬에서 이 일곱 가지를 돌려 **7/7** 을 확인했습니다.
719
+ | `<script type="module">` · `import` | blocked (CORS) | **works** |
720
+ | `fetch('./data.json')` | blocked | **works** |
721
+ | `new Worker(...)` | blocked | **works** |
722
+ | `WebAssembly.compileStreaming` | blocked (MIME) | **works** |
723
+ | textures · `getImageData` | tainted canvas | **works** |
724
+ | `.glb` / `.gltf` (Three.js) | no MIME type silently not drawn | **works** |
643
725
 
644
- 라우터를 쓰는 앱(React Router 등)은 안쪽 주소에서 새로고침해도 장이 나옵니다.
645
- 다만 확장자가 있는 요청(`app.js`)에는 절대 안 그럽니다 — 없는 스크립트에 HTML 을
646
- 돌려주면 `Unexpected token '<'` 로 죽는데, 그게 진짜 원인(파일 이름 오타)을 가립니다.
726
+ All seven were run in a real Chrome and confirmed **7/7**.
647
727
 
648
- ### 열어 주는 만큼만 엽니다
728
+ Apps with a router (React Router and friends) get the first page back when you reload on a
729
+ deep link. Never for requests with an extension (`app.js`) though — returning HTML for a
730
+ missing script dies with `Unexpected token '<'`, which hides the real cause (a typo in a filename).
649
731
 
650
- 서버를 띄운다는 것은 디스크를 남에게 열어 주는 일입니다.
732
+ ### It opens exactly as much as it says
651
733
 
652
- - **`127.0.0.1` 에만** 묶습니다. `0.0.0.0` 아예 씁니다 — 같은 사무실 망에서
653
- 아무나 내 소스를 읽게 됩니다.
654
- - 포트는 **0**(커널이 빈 것을 줍니다). 고정 포트는 남이 쓰던 것을 뺏습니다.
655
- - 경로는 작업 범위 밖으로 못 나갑니다. `../` · `%2e%2e` · 두 번 인코딩 · 절대 경로 ·
656
- 널바이트 · 심볼릭 링크 — 여덟 가지를 검사로 막아 뒀습니다.
657
- - **주기만 합니다.** `POST` · `PUT` · `DELETE` 는 405 로 거절합니다.
658
- - `deel` 을 끝내면 같이 꺼집니다.
734
+ Starting a server means opening your disk to somebody else.
659
735
 
660
- ## 스킬·플러그인
736
+ - Bound to **`127.0.0.1` only**. `0.0.0.0` is not available at all — on an office network
737
+ that would let anyone read your source.
738
+ - Port **0** (the kernel hands out a free one). A fixed port steals someone else's.
739
+ - Paths cannot leave the working scope. `../` · `%2e%2e` · double encoding · absolute paths ·
740
+ null bytes · symlinks — eight of these are held shut by tests.
741
+ - **It only serves.** `POST` · `PUT` · `DELETE` are refused with 405.
742
+ - It shuts down when `deel` exits.
661
743
 
662
- **남의 스킬은 품고 다니지 않습니다.** 켜질 때 그 PC 를 훑어 있는 것을 그대로 씁니다.
744
+ ---
663
745
 
664
- **다만 일하는 방법 일곱 가지는 품고 다닙니다.** 사내에서 새로 받은 PC 에는
665
- `~/.claude/skills` 도 플러그인도 없습니다. 거기서는 방법론이 0개라 모델이 매번
666
- 제 나름대로 했고, 시킨 것만 겨우 하고 끝나는 얄팍한 결과가 거기서 나왔습니다.
746
+ ## Skills and plugins
667
747
 
668
- | 스킬 | 언제 |
669
- |---|---|
670
- | `깊이있게-만들기` | 고도화·보고용·선포용 — 최소치만 내고 끝내지 않게 |
671
- | `끝까지-하기` | 시킨 것이 여러 조각일 때. 빼먹은 것은 말하게 |
672
- | `차근차근-디버깅` | 재현 → 좁히기 → 원인 → 고치기 → 증명 |
673
- | `검사-먼저` | 고치기 전에 실패하는 검사부터 |
674
- | `찔러보기` | 되는지 모를 때 시간 정해 작게 찔러 보고 버리기 |
675
- | `코드-줄이기` | 동작은 그대로 두고 읽기 쉽게 |
676
- | `스스로-검토` | 다 됐다고 말하기 전에. 못 잰 것까지 말하게 |
677
-
678
- 목록으로 늘 나가는 몫은 354토큰입니다(8k 창의 4%). 본문은 `Skill` 로 부를 때만 나갑니다.
679
- 같은 이름을 직접 만들면 그쪽이 이깁니다 — 품고 다니는 것이 제일 낮은 자리입니다.
748
+ **deel does not carry skills with it.** On startup it scans the machine it is running on and uses
749
+ whatever is there. On a clean PC: zero. On a PC with skills installed: those skills.
680
750
 
681
751
  ```
682
- 품고 다님 (패키지 안) ← 제일 낮은 자리
683
- 프로젝트 ./.deel/skills ./.claude/skills ./.deel/commands ./.claude/commands
684
- 사용자 ~/.deel/skills ~/.claude/skills ~/.claude/commands
685
- 플러그인 ~/.claude/plugins/** ~/.deel/plugins/**
752
+ project ./.deel/skills ./.claude/skills ./.deel/commands ./.claude/commands
753
+ user ~/.deel/skills ~/.claude/skills ~/.claude/commands
754
+ plugins ~/.claude/plugins/** ~/.deel/plugins/**
686
755
  ```
687
756
 
688
- Claude Code 같은 형식(`SKILL.md` + YAML 앞머리, `commands/*.md`, `$ARGUMENTS`)을 읽습니다.
757
+ Reads the Claude Code format: `SKILL.md` with YAML front matter, `commands/*.md`, `$ARGUMENTS`.
689
758
 
690
- > **자세히**3단계로 나눠 올립니다 · 플러그인 받아 오기 · 넣은
759
+ > **More**Loaded in three stages · Fetching plugins · Deliberately not included
691
760
  >
692
- > **[늘려 쓰기 읽기 →](docs/ko/extend.md#스킬플러그인)**
761
+ > **[Extending read →](docs/en/extend.md#skills-and-plugins)**
693
762
 
694
763
  ---
695
764
 
696
- ## 추론 강도
765
+ ### The hidden latency of local models — keeping the prefix cache alive
766
+
767
+ Ollama and llama.cpp reuse computation **only while the request starts the same way as the
768
+ last one.** Change one early character and everything after it — the entire conversation —
769
+ is recomputed. This is the usual hidden reason long local sessions feel slower and slower,
770
+ and it never shows up anywhere, because it is not an error.
771
+
772
+ deel routes every message to the right mode automatically, and that mode instruction used to
773
+ sit **early** in the prompt — every mode switch broke the whole cache. So the stable parts
774
+ (rules, folder, project fingerprint, user rules, memory, skills) are frozen at the front and
775
+ the per-turn parts (mode, pins) go last. A test pins this order down (`test/cache.test.js`).
776
+
777
+ Ollama also gets `keep_alive: 60m` — with the 5-minute default, the model unloads while you
778
+ glance at another window, and the first message after you come back recomputes everything.
779
+ Override with `DEEL_KEEP_ALIVE`. If you run llama.cpp directly, `--cache-reuse 256` on the
780
+ server side does the same job.
697
781
 
698
- 에이전트 번의 대답은 모델을 여러 번 부릅니다. **부를 때마다 필요한 생각의 양이 다릅니다.**
699
- 전부 세게 두면 느리고, 전부 얕게 두면 엉뚱한 길로 갑니다.
782
+ ## Reasoning effort
700
783
 
701
- 기본은 **한 줄**입니다. 알고 싶은 것은 '지금 얼마나 생각하나' 이지 단계표가 아닙니다.
784
+ One answer means several model calls, and **each needs a different amount of thinking.**
785
+ All-high is slow; all-low wanders off.
786
+
787
+ The default is **one line**. What you want to know is how hard it is thinking right now,
788
+ not a stage table.
702
789
 
703
790
  ```
704
791
  $ /think
@@ -707,17 +794,17 @@ $ /think
707
794
  더 세게 /think high 더 빠르게 /think low
708
795
  ```
709
796
 
710
- | 배분 | 성격 |
797
+ | Profile | Character |
711
798
  |---|---|
712
- | `even` (균일) | 모든 단계 같은 강도 예측 가능한 대신 느림 |
713
- | `save` (절약, 기본) | 판단만 세게, 이어가기는 얕게 |
714
- | `deep` (깊게) | 단계 칸씩 위로 어려운 일에만 |
799
+ | `even` | Same effort everywherepredictable, slower |
800
+ | `save` (default) | Hard on the first decision only |
801
+ | `deep` | Everything one notch upfor hard work |
715
802
 
716
- 배분은 `/think 배분 절약` 정합니다. **강도와 배분은 다른 축이라 명령을 갈랐습니다** —
717
- 전에는 `/think high` `/think save` 같은 이름으로 다른 것을 정해서,
718
- 화면을 봐도 지금 무엇이 무엇인지 읽히지 않았습니다.
803
+ Set the profile with `/think 배분 절약`. **Level and profile are different axes, so the
804
+ commands were split** — `/think high` and `/think save` used to set different things under
805
+ one name, which made the screen unreadable.
719
806
 
720
- 단계표는 `/think 자세히` 로 뺐습니다(개발자 수준 기본).
807
+ The stage table moved to `/think 자세히` (the default at developer level).
721
808
 
722
809
  ```
723
810
  $ /think 자세히
@@ -734,374 +821,412 @@ $ /think 자세히
734
821
  컨텍스트 40,960 · 지금 찬 양 2,087
735
822
  ```
736
823
 
737
- 마지막에서 번째 줄이 있는 이유: **세 값이 같을 그게 고장인지 아닌지**
738
- 줄로 갈립니다. 아는 상한이 낮으면 셋이 같아지는 것이 맞습니다.
739
- 한동안 표는 줄이 `16,384` 였고, 그건 표가 뜻이 없다는 뜻이었습니다.
824
+ That second-to-last line exists for a reason: **when all three caps are equal, it is the
825
+ only thing that says whether that is correct.** A low known cap makes them equal, and that
826
+ is fine. For a while all three read `16,384` always which meant the table said nothing.
740
827
 
741
- > **자세히**컨텍스트 길이는 모델에서 긁어옵니다 · /out · 잘린 도구 호출
828
+ > **More**Context length is read off the model · /out · Truncated tool calls
742
829
  >
743
- > **[속도와 씀씀이 읽기 →](docs/ko/tuning.md#추론-강도)**
830
+ > **[Speed and spend read →](docs/en/tuning.md#reasoning-effort)**
744
831
 
745
832
  ---
746
833
 
747
- ## 자동 압축
834
+ ## Auto-compaction
748
835
 
749
- 컨텍스트가 80% 차면 앞선 대화를 **요약해서 접고 계속 이어 갑니다.**
750
- 그냥 잘라내면 모델이 하던 일을 잊고, 파일을 다시 읽고, 이미 고친 곳을 고칩니다.
836
+ At 80% context, older turns are **summarised and folded** so work continues.
837
+ Plain truncation makes the model forget: it re-reads files and re-fixes what it already fixed.
751
838
 
752
839
  ```
753
- 대화 44개를 요약으로 접었습니다 — 10,399 → 3,170 토큰 (70% 줄어듦)
840
+ Folded 44 turns into a summary — 10,399 → 3,170 tokens (70% smaller)
754
841
  ```
755
842
 
756
- 요약은 목표 / / 알아낸 / 정한 / 남은 다섯 항목으로 남습니다.
757
- 접을 **도구 호출과 결과가 갈라지지 않는 자리**를 골라 자릅니다 갈라지면 서버가 400 을 냅니다.
758
- 요약 요청이 실패하면 방식(그냥 줄이기)으로 물러서고 멈추지 않습니다.
843
+ The summary keeps goal / done / learned / decided / remaining. The cut point is chosen so a
844
+ **tool call is never separated from its result** splitting them makes the server return 400.
845
+ If the summary request fails, it falls back to plain trimming rather than stopping.
759
846
 
760
- `/compact` 직접 접을 수도 있습니다.
847
+ `/compact` folds on demand.
761
848
 
762
849
  ---
763
850
 
764
- ## 대화 이어하기
851
+ ## Resuming a conversation
765
852
 
766
- 터미널을 실수로 닫거나 컴퓨터가 재부팅돼도 하던 대화를 그대로 이어 받습니다.
767
- 오간 내용은 **메시지 하나가 끝날 때마다 바로** `.deel/sessions/` 적히기 때문에,
768
- 도중에 죽어도 직전까지는 남습니다.
853
+ Close the terminal by accident, or reboot, and the conversation is still there.
854
+ Messages are written to `.deel/sessions/` **as each one completes**, so a crash
855
+ loses at most the message in flight.
769
856
 
770
857
  ```
771
858
  $ deel sessions
772
859
 
773
- ── 폴더의 대화 ──────────────────────────────────────────────
774
- ● 20260824-090200 방금 1devstral-small-2507
775
- 테스트 깨진 고쳐줘
776
- · 20260824-084500 2시간 전 2턴 qwen2.5-coder:7b
777
- src/a.js 로그를 logger 로 바꿔줘
860
+ ── conversations in this folder ────────────────────────────────
861
+ ● 20260824-090200 just now 1 turn devstral-small-2507
862
+ fix the failing test
863
+ · 20260824-084500 2h ago 2 turns qwen2.5-coder:7b
864
+ switch src/a.js logging to the logger
778
865
  ```
779
866
 
780
- | 명령 | 하는 |
867
+ | Command | What it does |
781
868
  |---|---|
782
- | `deel --continue` | 폴더에서 가장 최근 대화 이어하기 |
783
- | `deel --resume <id>` | 골라서 이어하기 |
784
- | `deel sessions` | 남아 있는 대화 목록 |
785
- | `deel sessions --rm <id>` | 하나 지우기 |
869
+ | `deel --continue` | Resume the most recent conversation in this folder |
870
+ | `deel --resume <id>` | Resume a specific one |
871
+ | `deel sessions` | List what is stored |
872
+ | `deel sessions --rm <id>` | Delete one |
786
873
 
787
- 줄에 메시지 하나씩 쓰는 `jsonl` 이라, 쓰다가 전원이 나가도 마지막 줄만 잃습니다.
788
- 이어받은 대화는 도구 호출과 결과의 짝까지 그대로 살아 있어 바로 이어서 일할 수 있습니다.
789
- 30일이 지나고 최근 30 밖인 것은 자동으로 정리합니다.
874
+ The format is `jsonl` one message per line so a power cut costs only the last line.
875
+ Resumed history keeps tool calls paired with their results, so work continues immediately.
876
+ Conversations older than 30 days and outside the most recent 30 are pruned automatically.
790
877
 
791
- 저장 위치는 작업 폴더의 `.deel/sessions/` 이고, `.gitignore` `.deel/` 들어 있어
792
- 깃에 올라가지 않습니다.
878
+ Everything lives in `.deel/sessions/` inside the working folder, and `.gitignore`
879
+ covers `.deel/` so it never reaches a repository.
793
880
 
794
881
  ---
795
882
 
796
- ## 밖에서 도구 붙이기 (MCP)
883
+ ## Starting over (`deel reset`)
797
884
 
798
- 사내 위키 검색기, 이슈 트래커, DB 조회기 같은 것을 팀이 MCP 서버로 만들어 두면
799
- deel 그걸 **코드를 고치고** 도구로 씁니다.
885
+ Switching gateways, learned facts that went stale, handing the machine to someone else
886
+ sometimes you want to go back to the beginning. Reinstalling does not do it: `~/.deel`
887
+ survives an install. Hence a command of its own.
800
888
 
801
- `.deel/mcp.json` 에 적습니다. Claude Code 설정을 그대로 복사해 붙일 수 있습니다:
889
+ ```
890
+ $ deel reset
891
+
892
+ ── what can be wiped ──────────────────────────────────────────
893
+ home C:\Users\me\.deel
894
+ working folder C:\work\myproject
895
+
896
+ connections 2
897
+ memory 8 lines
898
+ conversations 14
899
+ learned 2 places
900
+ evidence, exports, temp 6
901
+ plugins 3
902
+ sealed key DPAPI — this PC, this account only
903
+
904
+ ── what is kept ───────────────────────────────────────────────
905
+ undo snapshots 41 needs all --hard
906
+ audit log 1,203 lines needs all --hard
907
+ written by you .deel/mcp.json · .deelignore
908
+ never touched, by any route.
909
+ ```
910
+
911
+ **Bare `deel reset` wipes nothing.** It shows what exists and asks.
912
+
913
+ | Command | What goes |
914
+ |---|---|
915
+ | `deel reset model` | connections and profiles, plus the key in the OS keystore |
916
+ | `deel reset memory` | memory (`.deel/memory.md`) |
917
+ | `deel reset sessions` | conversation history |
918
+ | `deel reset learned` | learned facts (this PC + this folder) |
919
+ | `deel reset plugins` | installed plugins |
920
+ | `deel reset all` | everything above **except plugins** |
921
+ | `deel reset all --hard` | plus undo snapshots and the audit log |
922
+ | `--yes` | skip the question (scripts, first-time provisioning) |
923
+
924
+ What it does **not** touch matters more.
925
+
926
+ | Kept | Why |
927
+ |---|---|
928
+ | `.deel/history/` (undo snapshots) | This is the safety net offered in place of an approval prompt. `--hard` only |
929
+ | `.deel/audit.jsonl` | The evidence for an internal review. `--hard` only |
930
+ | `.deel/mcp.json` · `.deelignore` · `DEEL.md` | You wrote these by hand. **Never touched, by any route** |
931
+ | Everything else in the working folder | Nothing outside `.deel` and the home folder is ever reached |
932
+
933
+ It runs on a broken config. That is usually *why* someone reaches for a reset, so
934
+ `deel reset` starts without reading the connection — the same reason `deel --version` answers
935
+ without one. Plugins take time to fetch again, so they stay out of `all`; ask for them by name.
936
+
937
+ ---
938
+
939
+ ## Attaching tools from outside (MCP)
940
+
941
+ A corporate wiki search, an issue tracker, a DB query tool — if a team publishes one as an MCP
942
+ server, deel uses it as a tool **without a code change**.
943
+
944
+ Configure in `.deel/mcp.json`. A Claude Code config can be copied over verbatim:
802
945
 
803
946
  ```json
804
- { "mcpServers": { "사내위키": { "command": "node", "args": ["wiki-mcp.js"] } } }
947
+ { "mcpServers": { "wiki": { "command": "node", "args": ["wiki-mcp.js"] } } }
805
948
  ```
806
949
 
807
- 모델에게는 `mcp__사내위키__검색` 이라는 이름으로 보입니다. `/mcp` 무엇이 붙었는지 봅니다.
950
+ The model sees it as `mcp__wiki__search`. `/mcp` shows what is attached.
808
951
 
809
- **의존성은 그대로 0 입니다.** stdio 규격은 자식 프로세스의 stdin/stdout 줄 단위
810
- JSON-RPC 2.0 주고받는 것이 전부라, `child_process` `JSON` 이면 됩니다. SDK
811
- 필요 없습니다.
952
+ **Dependencies stay at zero.** The stdio transport is nothing but newline-delimited JSON-RPC
953
+ 2.0 over a child process's stdin/stdout, so `child_process` and `JSON` cover it. No SDK.
812
954
 
813
- > **자세히**다만 이건 남의 프로그램입니다
955
+ > **More**But this is somebody else's program
814
956
  >
815
- > **[늘려 쓰기 읽기 →](docs/ko/extend.md#밖에서-도구-붙이기-mcp)**
957
+ > **[Extending read →](docs/en/extend.md#attaching-tools-from-outside-mcp)**
816
958
 
817
959
  ---
818
960
 
819
- ## 에디터 안에서 쓰기 (ACP)
961
+ ## Inside your editor (ACP)
820
962
 
821
- 터미널을 하나 띄우게 하는 도구는 주쯤 뒤에 씁니다. 개발자는 하루 종일
822
- IDE 안에 있습니다. 그래서 **ACP**(Agent Client Protocol) 지킵니다 — Zed ·
823
- JetBrains · Neovim · Emacs **저쪽을 줄도 고치고** deel 붙입니다.
963
+ A tool that makes you open one more terminal window stops being used after about two weeks.
964
+ Developers live inside the IDE. So deel speaks **ACP** (Agent Client Protocol) — Zed,
965
+ JetBrains, Neovim and Emacs attach to it **without changing a line on their side**.
824
966
 
825
- 에디터 설정에 명령 하나만 적으면 됩니다.
967
+ One command in your editor's settings:
826
968
 
827
969
  ```
828
970
  deel acp
829
971
  ```
830
972
 
831
- 에디터가 이걸 자식 프로세스로 띄우고, 표준입출력으로 단위 JSON-RPC 2.0
832
- 주고받습니다. 사람이 직접 명령은 아닙니다.
973
+ The editor spawns that as a child process and exchanges newline-delimited JSON-RPC 2.0 over
974
+ stdio. It is not a command you type yourself.
833
975
 
834
- **붙으면 이렇게 됩니다.**
976
+ **What you get once it is attached:**
835
977
 
836
- | 에디터 | deel |
978
+ | In the editor | From deel |
837
979
  |---|---|
838
- | 답이 흘러나오는 자리 | 모델이 흘리는 · 생각 |
839
- | 도구 목록 (아이콘·상태) | `Read` 읽기, `Edit` 고치기, `Bash` 실행**갈래를 붙여** 보냅니다 |
840
- | 파일 링크 | 고친 파일의 **절대 경로**. 눌러서 자리로 갑니다 |
841
- | 승인 | deel 안전망이 그대로 에디터 창으로 뜹니다 (`이번만` · `앞으로 묻지 않기` · `안 함`) |
842
- | 모드 고르개 | deel 작업 모드 7개 (`종합` · `코드` · `계획` · `설계` · `디버그` · `묻기` · `총괄`) |
843
- | 멈춤 단추 | 도중에 닿습니다 답을 기다리는 중에도 |
844
- | 지난 대화 | 껐다 켜도 그대로 열립니다. 터미널과 **같은 자리**에 남아서, 에디터에서 하던 것을 `deel --resume` 으로 이어받는 것도 됩니다 |
845
-
846
- **의존성은 그대로 0 입니다.** MCP 같은 이유입니다 단위 JSON-RPC 2.0
847
- 전부라 SDK 필요 없습니다.
848
-
849
- > **자세히**조용히 깨지는 자리들
980
+ | Streaming reply pane | The model's text and its reasoning |
981
+ | Tool list with icons and status | `Read` is a read, `Edit` is an edit, `Bash` is an execution **the kind is sent**, not just a name |
982
+ | Clickable file links | The **absolute path** of every file touched |
983
+ | Approval dialog | deel's safety rails, rendered as the editor's own prompt (`allow once` · `always allow` · `reject`) |
984
+ | Mode picker | deel's seven work modes (auto · code · plan · architect · debug · ask · orchestrator) |
985
+ | Stop button | Reaches the turn mid-flight, even while waiting on the model |
986
+ | Past conversations | Still there after a restart. They live in the **same place** as the terminal's, so a session started in the editor can be picked up with `deel --resume` |
987
+
988
+ **Still zero dependencies.** Same reason as MCPnewline-delimited JSON-RPC 2.0 is the whole
989
+ transport, so no SDK is needed.
990
+
991
+ > **More**Details the places this breaks silently
850
992
  >
851
- > **[늘려 쓰기 읽기 →](docs/ko/extend.md#에디터-안에서-쓰기-acp)**
993
+ > **[Extending read →](docs/en/extend.md#inside-your-editor-acp)**
852
994
 
853
995
  ---
854
996
 
855
- ## 비밀이 새지 않게
997
+ ## Keeping secrets out of the conversation
856
998
 
857
- 사람이 열쇠를 붙여 넣는 일은 드뭅니다. 새는 자리는 거의 항상 **명령 출력**입니다.
999
+ People rarely paste a key. The leak is almost always **command output**.
858
1000
 
859
1001
  ```
860
1002
  env OPENAI_API_KEY=sk-proj-…
861
- git remote -v https://사람:토큰@github.com/…
1003
+ git remote -v https://user:token@github.com/…
862
1004
  curl -v > Authorization: Bearer eyJ…
863
- 검사 실패 로그 연결 문자열이 통째로
1005
+ a failing test log the whole connection string
864
1006
  ```
865
1007
 
866
- 글은 모델에게 실려 가고, **동시에** `.deel/sessions/*.jsonl` 디스크에
867
- 적힙니다. 파일은 나중에 `/recall` 다시 읽히고 `deel pack` 딸려 수도
868
- 있습니다. 새면 여러 벌이 됩니다.
1008
+ That text goes to the model **and** gets written to `.deel/sessions/*.jsonl` on disk. That
1009
+ file is later re-read by `/recall` and can end up inside a `deel pack` bundle. Leak once and
1010
+ you have several copies.
869
1011
 
870
- 그래서 도구 결과가 대화로 들어가는 **한 자리**에서 가립니다.
1012
+ So it is masked at the single point where tool output enters the conversation.
871
1013
 
872
1014
  ```
873
- ⏺ Bash(env | grep API) 완료
874
- 비밀로 보이는 2군데가 대화에 들어갔습니다 (openai · 환경변수) — 모델에 가려서 보냈습니다
1015
+ ⏺ Bash(env | grep API) done
1016
+ 2 secret-looking values entered the conversation (openai · env var) — masked before the model
875
1017
  ```
876
1018
 
877
- 찾는 것: 사설키 블록 · OpenAI/Anthropic 열쇠 · GitHub 토큰 · Slack 토큰 ·
878
- AWS · Google · JWT · 주소에 박힌 열쇠 · `Authorization` 계열 헤더 ·
879
- 이름이 `…KEY`/`…TOKEN`/`…SECRET`/`…PASSWORD` 환경변수. 그리고 **설정에
880
- 게이트웨이 열쇠는 모양과 상관없이**그건 짐작이 아니라 아는 값이니까요.
1019
+ What it looks for: private-key blocks · OpenAI/Anthropic keys · GitHub tokens · Slack tokens ·
1020
+ AWS keys · Google keys · JWTs · credentials embedded in URLs · `Authorization`-family headers ·
1021
+ env vars named `…KEY` / `…TOKEN` / `…SECRET` / `…PASSWORD`. Plus **the configured gateway key
1022
+ regardless of its shape**that one is not a guess, it is a known value.
881
1023
 
882
- ### 파일 내용은 일부러 가립니다
1024
+ ### File contents are deliberately not masked
883
1025
 
884
- 가리고 싶은 마음이 제일 드는 자리가 `.env` 인데, 거기를 가리면 이렇게 됩니다
885
- 모델이 가려진 글을 보고, 그걸 고쳐서 되돌려 씁니다. 그러면 진짜 열쇠가 있던
886
- 자리에 `«가림»` 적힙니다. **비밀을 지키려다 사람의 열쇠를 우리 손으로
887
- 지우는 셈입니다.**
1026
+ `.env` is exactly where masking feels most tempting, and exactly where it backfires: the model
1027
+ sees the masked text, edits it, writes it back and `«가림»` lands where the real key was.
1028
+ **Protecting the secret would destroy it.**
888
1029
 
889
- 그래서 파일 쪽은 가리는 대신 **알립니다.**
1030
+ So on the file side it reports instead of rewriting.
890
1031
 
891
1032
  ```
892
- ⏺ Read(.env) 12
893
- ! 비밀로 보이는 3군데가 대화에 들어갔습니다 (환경변수)
894
- 파일 내용은 가리지 않습니다 (가리면 되돌려 지워집니다)
1033
+ ⏺ Read(.env) 12 lines
1034
+ ! 3 secret-looking values entered the conversation (env var)
1035
+ file contents are not masked (masking them would erase the key on write-back)
895
1036
  ```
896
1037
 
897
- 무엇을 막는지 분명히 말하는 편이, 막았다고 놓고 파일을 망가뜨리는 것보다
898
- 언제나 낫습니다. 어느 쪽이든 감사기록에 남습니다.
1038
+ Saying plainly what cannot be stopped beats claiming it was stopped while corrupting the file.
1039
+ Either way it lands in the audit log.
899
1040
 
900
1041
  ---
901
1042
 
902
- ## 안전망
1043
+ ## Safety
903
1044
 
904
- 승인 프롬프트 대신 **되돌릴 있게** 만들었습니다. 기본 모드 `auto` 는 묻지 않고 알아서 합니다.
1045
+ Instead of approval prompts, the design makes things **reversible**. The default `auto` mode
1046
+ does not ask.
905
1047
 
906
- | 장치 | 내용 |
1048
+ | Mechanism | Detail |
907
1049
  |---|---|
908
- | **되돌리기** | 파일을 고치기 항상 스냅샷. `/undo` 단위 복구. **`Bash` 옮기고 지우는 것도 포함** |
909
- | **바뀐 자리 보기** | 고칠 때마다 바뀐 줄을 화면에. 이번 대화 전체는 `/diff` |
910
- | **작업 범위** | 시작한 폴더 밖은 모델이 시켜도 거부 |
911
- | **위험 명령 차단** | 되돌릴 없는 것만 (디스크 포맷, 재귀 삭제, `--force` 푸시 등) |
912
- | **재실행 금지** | 변경성 명령은 실패해도 다시 실행하지 않음 번 돌면 사고 |
913
- | **중단** | Ctrl+C 도중에 끊어도 대화가 성한 채로 남음 |
914
- | **헛돌기 차단** | 같은 도구가 같은 이유로 3번 실패하면 턴을 멈추고 왜인지 말함 |
915
- | **안 읽는 자리** | 남의 도구 살림과 deel 자신의 기록·설정(열쇠) 거절 |
916
- | **감사 로그** | `.deel/audit.jsonl` 에 전부 기록 |
917
-
918
- | 모드 | 언제 물어보나 |
1050
+ | **Undo** | Snapshot before every write. `/undo` restores per turn. **Includes moves and deletes done through `Bash`** |
1051
+ | **Change display** | The changed lines are shown on every edit; `/diff` for the whole session |
1052
+ | **Scope** | Outside the starting folder is refused, even if the model insists |
1053
+ | **Blocked commands** | Only irreversible ones (disk format, recursive delete, `--force` push) |
1054
+ | **No re-run** | A mutating command is never retried after failure |
1055
+ | **Interrupt** | Ctrl+C stops mid-answer and leaves the conversation valid |
1056
+ | **Spin guard** | Three identical failures stop the turn, with the reason |
1057
+ | **Not read** | Other tools' private stores, and deel's own logs and config (the key), are refused |
1058
+ | **Audit log** | Everything recorded in `.deel/audit.jsonl` |
1059
+
1060
+ | Mode | Asks when |
919
1061
  |---|---|
920
- | `auto` (기본) | 물어봄. 되돌리기가 안전망 |
921
- | `confirm` | 되돌릴 없는 명령만 |
922
- | `strict` | 파일 변경·명령 전부 |
1062
+ | `auto` (default) | Never undo is the safety net |
1063
+ | `confirm` | Irreversible commands only |
1064
+ | `strict` | All file changes and commands |
923
1065
 
924
- 되돌리기 이력은 파일 내용을 통째로 담기 때문에 파일을 여러 고치면 금방 커집니다.
925
- 32MB 넘으면 **최근 50턴만 남기고** 오래된 것을 버립니다. 방금 일은 언제나
926
- 되돌릴 있고, 지금 이력이 얼마나 되는지는 `/status` 에서 봅니다.
1066
+ Undo history stores whole file contents, so repeated edits to large files add up. Past 32MB
1067
+ it keeps the **most recent 50 turns** and drops the rest. What you just did is always
1068
+ undoable; `/status` shows how large the history currently is.
927
1069
 
928
- > **자세히** — Bash 사라진 것도 되돌아갑니다 · 읽는 자리
1070
+ > **More**Files removed through Bash come back too · What it will not read
929
1071
  >
930
- > **[안전망과 사내 반입 읽기 →](docs/ko/safety.md#안전망)**
1072
+ > **[Safety and corporate review read →](docs/en/safety.md#safety)**
931
1073
 
932
1074
  ---
933
1075
 
934
- ## 사내 반입
935
-
936
- 심사서와 소스를 zip 하나로 묶습니다.
1076
+ ## Corporate review package
937
1077
 
938
1078
  ```bash
939
- deel pack --out deel-반입.zip
1079
+ deel pack --out deel-import.zip
940
1080
  ```
941
1081
 
942
1082
  ```
943
- ── 반입 묶음 ───────────────────────────────────────────────────
944
- deel-반입.zip
945
- 94개 파일 · 509.6KB
946
-
947
- 의존성 0개
948
- 설치 스크립트 없음
949
- 외부 import 0건
950
- 네트워크 호출 3곳 (설정한 주소로만)
951
- 포트 열기 1곳 (/preview 만)
1083
+ deel-import.zip
1084
+ 94 files · 509.6KB
1085
+
1086
+ Dependencies 0
1087
+ Install scripts none
1088
+ External imports 0
1089
+ Network calls 3 sites (configured address only)
1090
+ Ports opened 1 site (/preview only)
952
1091
  ```
953
1092
 
954
- zip 안에는 **사람이 읽을 장, 기계가 읽을 장**이 같이 들어갑니다.
955
- 반입 심사는 사람만 보는 절차가 아니기 때문입니다 보안팀은 SBOM 스캐너에
956
- 먹여 취약점 목록을 뽑고, 운영팀은 감사 사양을 보고 SIEM 수집 규칙을 짭니다.
1093
+ The zip carries **one document for people and two for machines.** A corporate review is
1094
+ not a human-only process security feeds an SBOM to a scanner, and operations reads the
1095
+ audit-log spec to write SIEM ingestion rules.
957
1096
 
958
- | 파일 | 무엇 |
1097
+ | File | What |
959
1098
  |---|---|
960
- | `반입심사서.txt` | 의존성 · 설치 스크립트 · **소스를 훑어 찾은 네트워크·외부 명령 호출 자리 전부**(파일:줄) · 나가는 갈래 · 파일별 SHA-256 |
961
- | `sbom.cdx.json` | **SBOM (CycloneDX 1.5).** 스캐너에 그대로 넣습니다. 파일마다 부품 하나에 SHA-256, 의존성은 **빈 배열로 명시** 적어 것과 없는 것은 다릅니다 |
962
- | `심사명세.json` | 통신 목록(갈래마다 언제·어디로·무엇이·막는법·소스 자리) · **감사기록 사양**( 이름과 뜻, 남기는 ) · 파일 해시 |
1099
+ | `반입심사서.txt` | Dependencies · install scripts · **every network and process-spawn call site found by scanning the source** (file:line) · the three outbound lanes · SHA-256 per file |
1100
+ | `sbom.cdx.json` | **SBOM (CycloneDX 1.5).** Feed it straight to a scanner. One component per file with SHA-256; dependencies stated as an **explicit empty array** "not declared" and "none" are different claims |
1101
+ | `심사명세.json` | Egress list (per lane: when, where, what, how it's stopped, and the source location) · **audit-log spec** (field names and meanings, plus what is never recorded) · file hashes |
963
1102
 
964
1103
  ```bash
965
- deel audit # 사람이 읽는 심사서만 보기
966
- deel sbom # 기계가 읽는 장을 표준출력으로 (deel sbom | jq)
967
- deel sbom --out 심사.json # 파일로
968
- deel sbom --only sbom # SBOM 장만
1104
+ deel audit # the human-readable sheet only
1105
+ deel sbom # the two machine-readable ones, on stdout (deel sbom | jq)
1106
+ deel sbom --out review.json # to a file
1107
+ deel sbom --only sbom # just the SBOM
969
1108
  ```
970
1109
 
971
- 손으로 적지 않고 코드가 소스를 훑어서 만듭니다손으로 적으면 언젠가
972
- 사실과 어긋나고, **어긋난 심사 서류는 없느니만 못합니다.** 담당자가 틀린
973
- 것을 발견하면 나머지도 믿습니다. 감사기록 사양만은 손으로 적혀 있어서,
974
- 그것이 진짜 기록과 어긋나지 않는지를 검사가 매번 대조합니다.
1110
+ All three are generated by scanning the source, never written by hand hand-written sheets
1111
+ drift, and **a review document that drifts is worse than none.** Find one wrong line and the
1112
+ reviewer stops trusting the rest. The audit-log spec is the one hand-written part, so a test
1113
+ checks it against real log records on every run.
975
1114
 
976
- > **자세히**사내 게이트웨이 진단
1115
+ > **More**Diagnosing a corporate gateway
977
1116
  >
978
- > **[안전망과 사내 반입 읽기 →](docs/ko/safety.md#사내-반입)**
1117
+ > **[Safety and corporate review read →](docs/en/safety.md#corporate-review-package)**
979
1118
 
980
1119
  ---
981
1120
 
982
- ## 설정
1121
+ ## Configuration
983
1122
 
984
- `~/.deel/config.json` 저장됩니다. 프로젝트 폴더에 `.deel/config.json` 있으면 그쪽이 우선입니다.
1123
+ Stored in `~/.deel/config.json`. A `.deel/config.json` in the project folder takes precedence.
985
1124
 
986
- > **자세히**붙는 서버 · 환경변수 · 실행 옵션 · 프로젝트 규칙
1125
+ > **More**Supported servers · Environment variables · Flags · Project rules
987
1126
  >
988
- > **[설정 읽기 →](docs/ko/config.md#설정)**
1127
+ > **[Configuration read →](docs/en/config.md#configuration)**
989
1128
 
990
1129
  ---
991
1130
 
992
- ## 문제 해결
1131
+ ## Troubleshooting
993
1132
 
994
- | 증상 | 확인할 |
1133
+ | Symptom | Check |
995
1134
  |---|---|
996
- | `주소를 찾을 없습니다` | 주소 오타, DNS, 사내망 접속 여부 |
997
- | `연결이 거부되었습니다` | 서버가 꺼져 있거나 포트가 다름 |
998
- | `인증서 문제` | `set NODE_EXTRA_CA_CERTS=C:\경로\사내CA.pem` |
999
- | 프록시를 거쳐야 | `set HTTPS_PROXY=http://프록시:포트` (인증은 `http://user:pw@프록시:포트`). 화면과 `/status` `프록시 …` 뜨면 거치는 것. 거칠 곳은 `NO_PROXY=.corp.com,10.1.2.3`, 아예 끄려면 설정에 `"proxy": "none"` |
1000
- | 프록시가 407 | 프록시 주소에 `user:pw@` 넣으세요. NTLM · Negotiate 받는 프록시는 씁니다 담당자에게 Basic 이나 인증 없는 주소를 문의 |
1001
- | 401 / 403 | 키가 틀렸거나 인증 헤더 형식이 다름 (4가지를 자동 시도합니다) |
1002
- | `허용되지 않은 주소입니다` | 자물쇠가 막은 것. 정상입니다 — `/model` 로 연결을 고르세요 |
1003
- | 도구 호출이 먹음 | `deel diagnose` 판정을 보세요. 작은 모델(1B~3B) 자주 합니다 |
1004
- | 대답이 비어 있음 | 스트리밍을 무시하는 서버입니다. 번은 저절로 다시 부르고, 그래도 비면 대화에서는 스트리밍을 끕니다 |
1005
- | 파일이 중간에 끊김 | `/out` 으로 지금 상한을 보고 올리세요. 상한을 몰라 16,384 있을 있습니다 |
1006
- | `HTTP 400` | 서버가 보낸 문장을 그대로 보여 줍니다. 길이 문제면 숫자를 읽어 저절로 맞춥니다 |
1007
- | `429` · `503` | 게이트웨이가 잠깐 막은 것입니다. 번까지 저절로 기다렸다 다시 부릅니다(`Retry-After` 를 지킵니다). 그래도 계속 뜨면 할당량을 보세요 |
1008
- | `deel scan` 0곳 | 로컬 서버가 꺼져 있거나 다른 포트 — `--ports` 로 지정 |
1135
+ | `address not found` | Typo, DNS, VPN / intranet connectivity |
1136
+ | `connection refused` | Server is down or the port differs |
1137
+ | certificate error | `set NODE_EXTRA_CA_CERTS=C:\path\corp-ca.pem` |
1138
+ | behind a proxy | `set HTTPS_PROXY=http://proxy:port` (with auth: `http://user:pw@proxy:port`). If the first screen and `/status` show `proxy …`, it is in use. Exclude hosts with `NO_PROXY=.corp.com,10.1.2.3`; turn it off entirely with `"proxy": "none"` in the config |
1139
+ | the proxy answers 407 | Put `user:pw@` into the proxy address. Proxies that only accept NTLM · Negotiate are not supported ask the admin for Basic or an unauthenticated address |
1140
+ | 401 / 403 | Wrong key or auth header style (four are tried automatically) |
1141
+ | `address not permitted` | The lock did its job pick a connection with `/model` |
1142
+ | Tool calls don't work | Run `deel diagnose`. Small models (1B3B) often can't |
1143
+ | Empty replies | The server ignores streaming. deel retries once, then turns streaming off for the session |
1144
+ | Large files cut off mid-write | Check `/out` and raise it the cap may be sitting at the 16,384 default because it could not be discovered |
1145
+ | Only `HTTP 400` shows | The server's own message is shown verbatim. If it is a length problem the number is read and applied automatically |
1146
+ | `429` · `503` shows | The gateway pushed back for a moment. deel waits and calls again, up to three times (honouring `Retry-After`). If it keeps happening, check your quota |
1147
+ | `deel scan` finds nothing | Server is off or on another port use `--ports` |
1009
1148
 
1010
1149
  ---
1011
1150
 
1012
- ## 개발
1151
+ ## Development
1013
1152
 
1014
1153
  ```bash
1015
- npm test 전체 검증 (5,685항목)
1016
- npm run coverage 검사가 소스의 어디를 밟았는지
1017
- npm run verify 반입·통신 검증만
1018
- npm run bench 편집 성공률 측정
1019
- npm run demo 화면이 어떻게 보이는지 실제로 돌려 보기
1020
- npm run check 파일 문법 검사
1154
+ npm test Full suite (~5,890 checks; a few are TTY-dependent)
1155
+ npm run coverage Which lines the tests actually execute
1156
+ npm run verify Import + network checks only
1157
+ npm run bench Edit success rate
1158
+ npm run demo See what the UI actually looks like
1159
+ npm run check Syntax check every file
1021
1160
  ```
1022
1161
 
1023
- 검증은 **가짜 게이트웨이**를 띄워서 합니다. 실제 모델 없이 규격 그대로
1024
- 루프·스트리밍·도구 실행·되돌리기·압축을 결정적으로 확인합니다.
1025
- zip 은 진짜 `unzip` 으로, tar 진짜 `tar` 만든 것을 읽혀 교차 확인합니다.
1026
-
1027
- `npm test` 는 파일을 하나씩 돌리고 **파일별 종료코드**를 표로 남깁니다.
1028
- 화면의 통과 표시가 아니라 종료코드가 CI 가 보는 값이기 때문입니다. 둘은
1029
- 갈라질 수 있습니다 — 검사를 다 통과하고도 끝낼 때 죽으면 화면은 초록인데
1030
- 종료코드는 1 입니다. 실제로 윈도우에서 그렇게 한 번 놓쳤습니다.
1031
- 첫 실패에서 멈추지 않고 끝까지 돌기 때문에, 한 번 돌리면 전부 알 수 있습니다.
1162
+ Tests run against a **fake gateway**, so the loop, streaming, tool execution, undo and compaction
1163
+ are verified deterministically without any model. ZIP output is cross-checked with the real
1164
+ `unzip`; the TAR reader is fed archives produced by the real `tar`.
1032
1165
 
1033
- ```
1034
- ────────────────────────────────────────────────────────────
1035
- 검사 파일 종료코드 통과 실패 시간
1036
- ────────────────────────────────────────────────────────────
1037
- smoke.js 0 20 0 0.2초
1038
- ✗ scan.test.js 1 19 0 0.2초
1039
- ────────────────────────────────────────────────────────────
1040
-
1041
- ✗ scan.test.js — 종료코드 1
1042
- 검사는 전부 통과했는데 종료코드만 1 입니다 —
1043
- 끝낼 때 남은 핸들·처리 안 된 거절 때문입니다.
1044
- ```
1166
+ `npm test` runs each file separately and reports **per-file exit codes**, because the exit code
1167
+ — not the pass marks on screen — is what CI reads, and the two can disagree: a file can pass
1168
+ every check and still die on the way out, leaving the screen green and the exit code 1. That
1169
+ happened once on Windows and cost a lot of time. The runner does not stop at the first failure,
1170
+ so one run tells you everything.
1045
1171
 
1046
- | 검증 | 항목 | 무엇을 |
1172
+ | Suite | Checks | Covers |
1047
1173
  |---|---|---|
1048
- | `smoke` | 20 | 도구·작업범위·되돌리기·감사로그 |
1049
- | `loop` | 16 | 에이전트 루프·스트리밍·도구 호출 |
1050
- | `guard` | 24 | **안 하는 자리**거부·모르는 도구·두 실행·범위 |
1051
- | `network` | 30 | 정해진 자리 밖으로 새지 않는가 |
1052
- | `web` | 25 | 읽기가 읽기만 하는가 |
1053
- | `abort` · `steer` | 16 · 15 | Ctrl+C 끊어도 대화가 성한가 · 도중에 말이 다음 부름에 실리는가 |
1054
- | `parallel` | 23 | 읽기만 동시에 도는가 · 일 목록 |
1055
- | `cli` | 75 | **진짜 `deel` 띄워** 끝까지 돌려 본다 |
1056
- | `setup` | 42 | 실행 마법사 (가짜 TTY 사람처럼 입력) |
1057
- | `detect` | 66 | 주소 줄로 규격·인증을 짚어내는가 |
1058
- | `modes` · `route` | 89 · 33 | 작업 모드 · 종합에서 알맞은 모드로 옮겨 가는가 |
1059
- | `ctxsize` | 43 | 모델에 걸린 컨텍스트 길이를 긁어오는가 |
1060
- | `commands` · `commands-more` | 128 · 62 | 슬래시 명령 전부 |
1061
- | `ui` · `ui2` | 60 · 40 | 암호 가림·한글 폭·상태줄·대화 목록·엑셀→글 |
1062
- | `encoding` · `xlsx` | 68 · 72 | 한글 인코딩 판별 · 엑셀 읽기 |
1063
- | `compact` | 21 | 요약 압축·짝 깨짐·실패 물러섬 |
1064
- | `store` | 34 | 대화 저장·이어하기·중간에 죽어도 복구 |
1065
- | `scan` | 29 | 여러 런타임을 구분해 찾는가 |
1066
- | `plugins` | 38 | 플러그인 받기·묶기·ZIP/TAR |
1067
- | `no-bundle` | 12 | 배포 묶음에 남의 것이 섞였는가 · 검사 파일 위생 |
1068
- | `edit-bench` | 20 | 편집 성공률 |
1069
-
1070
- > **자세히**어디를 밟았는지 · 폴더 구조
1174
+ | `smoke` | 20 | Tools, scope, undo, audit log |
1175
+ | `loop` | 16 | Agent loop, streaming, tool calls |
1176
+ | `guard` | 24 | **What it refuses to do** denied edits, unknown tools, repeated mutations, out-of-scope writes |
1177
+ | `network` | 30 | Nothing escapes the configured address |
1178
+ | `web` | 25 | Web reads stay read-only |
1179
+ | `abort` · `steer` | 16 · 15 | Ctrl+C leaves the conversation valid · a line typed mid-turn rides the next call |
1180
+ | `parallel` | 23 | Read-only tools run together; checklists |
1181
+ | `cli` | 75 | **Spawns the real `deel`** and drives it to completion |
1182
+ | `setup` | 42 | First-run wizard, driven through a fake TTY |
1183
+ | `detect` | 66 | Identifying shape and auth from one address |
1184
+ | `modes` · `route` | 89 · 33 | Work modes; auto-switching from Auto |
1185
+ | `ctxsize` | 43 | Reading context length off the model |
1186
+ | `commands` · `commands-more` | 128 · 62 | Every slash command |
1187
+ | `ui` · `ui2` | 60 · 40 | Password masking, CJK width, status line, session list, Excel→text |
1188
+ | `encoding` · `xlsx` | 68 · 72 | Legacy-encoding detection; Excel reading |
1189
+ | `compact` | 21 | Summary folding, pairing intact, graceful fallback |
1190
+ | `store` | 34 | Session persistence, resume, crash recovery |
1191
+ | `scan` | 29 | Distinguishing multiple runtimes |
1192
+ | `plugins` | 38 | Plugin fetch/pack, ZIP/TAR |
1193
+ | `no-bundle` | 12 | Nothing foreign in the published package; test-file hygiene |
1194
+ | `edit-bench` | 20 cases | Edit success rate |
1195
+
1196
+ > **More**Coverage · Layout
1071
1197
  >
1072
- > **[개발 읽기 →](docs/ko/develop.md#개발)**
1198
+ > **[Development read →](docs/en/develop.md#development)**
1073
1199
 
1074
1200
  ---
1075
1201
 
1076
- ## 릴리스 노트
1202
+ ## Release notes
1077
1203
 
1078
- | | 무엇이 바뀌었나 |
1204
+ | Version | What changed |
1079
1205
  |---|---|
1080
- | **[1.7.0](docs/ko/releases/1.7.md#170)** | 로컬은 그대로 두고, 말했을 때만 바깥으로모드 · 벤더 붙이기 · 자동 마스킹 · 표시 |
1081
- | [1.6.3](docs/ko/releases/1.6.md#163) | 일이 되고 있는데 헛돈다고 끊던 자리배열로 옮기면 무엇이 움직였는지가 사라졌다 |
1082
- | **[1.6.2](docs/ko/releases/1.6.md#162)** | 누르면 멈추고, 시킨 대로 하고, 끊긴다ESC · 되묻기 · 요청 누락 · 붙여넣기 접기 · 끊긴 자리 잇기 |
1083
- | **[1.6.1](docs/ko/releases/1.6.md#161)** | 헛도는 턴을 만들던 자리들 울타리가 `/dev/null` 까지 막던 · 문서를 읽던 · 파일에서 그림이 사라지던 |
1084
- | **[1.6.0](docs/ko/releases/1.6.md#160)** | 사내망에서 되던 것들 프록시 · 429 · 윈도우 셸 · 5만 저장소 · PDF · 캡처 붙여넣기 · 에디터 이어하기 |
1085
- | **[1.5.8](docs/ko/releases/1.5.md#158)** | 5MB 문서를 919줄 8줄만 보던 · 정규식을 경로로 읽어 명령을 막던 |
1086
- | **[1.5.7](docs/ko/releases/1.5.md#157)** | 한글 폴더에서 파일이 「범위 밖」이던 · 붙여넣기 · ESC |
1087
- | **[1.5.6](docs/ko/releases/1.5.md#156)** | 막히면 물어본다글로 묻고 턴을 끝내는 대신에 |
1088
- | **[1.5.5](docs/ko/releases/1.5.md#155)** | 계획을 세우면 방이 찬다「한 명뿐」은 고정이 아니라 버그였다 |
1089
- | [1.5.4](docs/ko/releases/1.5.md#154) | 방에 하루가 흐른다아침·낮·노을·밤 · 벽시계 · 식은 커피 |
1090
- | [1.5.3](docs/ko/releases/1.5.md#153) | 맥에서 걸린 가지 줄바꿈 안내 · 사무실이 사라짐 · `/motion` 하나로 |
1091
- | [1.5.2](docs/ko/releases/1.5.md#152) | 적대적 리뷰가 남긴 나머지를 전부 정리했다 화면이 거짓말하던 자리들 |
1092
- | [1.5.1](docs/ko/releases/1.5.md#151) | 1.5.0 넣은 개가 망가진 나갔다. 그것을 고친다 |
1093
- | [1.5.0](docs/ko/releases/1.5.md#150) | 줄바꿈이 생겼고, 화면이 재미있어졌고, 그러면서 오히려 가벼워졌다 |
1094
- | [1.4.3](docs/ko/releases/1.4.md#143) | README 다른지 말하고, 심사서의 빠진 줄을 채운다 |
1095
- | [1.4.2](docs/ko/releases/1.4.md#142) | 1.4.1 보안 수정 전에 나갔다그걸 바로잡는 |
1096
- | [1.4.1](docs/ko/releases/1.4.md#141) | 기능 없이, 실제로 찾은 것만 고친다윈도우 abort·ReDoS·XSS |
1097
- | [1.4.0](docs/ko/releases/1.4.md#140) | deel 얼굴을 갖고, 영어로도 말하고, 뜻까지 본다열한 자리 |
1098
- | [1.3.0](docs/ko/releases/1.3.md#130) | 대신 증거, 터미널 대신 에디터 여섯 자리 |
1099
- | [1.2.0](docs/ko/releases/1.2.md#120) | 대화가 끊기지 않게 — 여섯 자리 |
1100
-
1101
- 무엇이 왜 바뀌었는지는 **[릴리스 노트](docs/ko/releases.md)** 에 있습니다.
1206
+ | **[1.8.0](docs/en/releases/1.8.md#180)** | A full day against a gateway that hands out one-hour tokens fetch the key instead of storing it · `deel reset` · an English screen that is actually English |
1207
+ | [1.7.0](docs/en/releases/1.7.md#170) | Local stays local; it goes out only when you say so three modes · vendor setup · automatic masking · cost |
1208
+ | [1.6.1](docs/en/releases/1.6.md#161) | The places that made a turn spin in circles the fence blocking `/dev/null` · old documents it could not read · images vanishing from files |
1209
+ | **[1.6.0](docs/en/releases/1.6.md#160)** | The things that did not work on a corporate network — proxy · 429 · Windows shell · 50k-file repos · PDF · clipboard paste · editor resume |
1210
+ | **[1.5.8](docs/en/releases/1.5.md#158)** | A 5MB document showed 8 lines out of 919 · a regex read as a path blocked the command |
1211
+ | **[1.5.7](docs/en/releases/1.5.md#157)** | Korean folders on macOS made your own files "out of scope" · paste · ESC |
1212
+ | **[1.5.6](docs/en/releases/1.5.md#156)** | It asks when stuck instead of writing a question and ending the turn |
1213
+ | **[1.5.5](docs/en/releases/1.5.md#155)** | A plan fills the room "only one person" was a bug, not a design |
1214
+ | [1.5.4](docs/en/releases/1.5.md#154) | A day passes in the room morning to night, a wall clock, a cold coffee |
1215
+ | [1.5.3](docs/en/releases/1.5.md#153) | Three things a Mac user tripped over newline hint, office stays put, one `/motion` |
1216
+ | [1.5.2](docs/en/releases/1.5.md#152) | Everything else the adversarial reviews turned up where the screen was lying |
1217
+ | [1.5.1](docs/en/releases/1.5.md#151) | Two of the things 1.5.0 added shipped broken. This fixes them |
1218
+ | [1.5.0](docs/en/releases/1.5.md#150) | Line breaks exist now, the screen got fun, and it came out lighter than before |
1219
+ | [1.4.3](docs/en/releases/1.4.md#143) | The README explains what's different, and the review report gets its missing line |
1220
+ | [1.4.2](docs/en/releases/1.4.md#142) | 1.4.1 shipped before its own security fixes this corrects that |
1221
+ | [1.4.1](docs/en/releases/1.4.md#141) | No new features, only what was actually found and fixed Windows abort, ReDoS, XSS |
1222
+ | [1.4.0](docs/en/releases/1.4.md#140) | deel gets a face, speaks English, and sees meaning eleven places |
1223
+ | [1.3.0](docs/en/releases/1.3.md#130) | Evidence instead of claims, the editor instead of a terminal six places |
1224
+ | [1.2.0](docs/en/releases/1.2.md#120) | So the conversation doesn't breaksix places |
1225
+
1226
+ What changed and why is in the **[release notes](docs/en/releases.md)**.
1102
1227
 
1103
1228
  ---
1104
1229
 
1105
- ## 라이선스
1230
+ ## Licence
1106
1231
 
1107
1232
  [MIT](LICENSE)