deel-local-cli 1.6.3 → 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.
Files changed (53) hide show
  1. package/README.ko.md +1182 -0
  2. package/README.md +850 -636
  3. package/bin/deel.js +44 -3
  4. package/package.json +3 -3
  5. package/src/acp/map.js +1 -1
  6. package/src/acp/serve.js +25 -2
  7. package/src/agent/loop.js +41 -9
  8. package/src/agent/session.js +15 -9
  9. package/src/backend/adapter.js +277 -4
  10. package/src/backend/ctxsize.js +16 -2
  11. package/src/backend/detect.js +104 -6
  12. package/src/backend/price.js +197 -0
  13. package/src/backend/retry.js +3 -0
  14. package/src/backend/scanui.js +2 -1
  15. package/src/backend/vision.js +26 -4
  16. package/src/commands.js +141 -38
  17. package/src/completion.js +21 -2
  18. package/src/i18n/en.js +160 -1
  19. package/src/i18n/index.js +22 -0
  20. package/src/i18n/ja.js +152 -1
  21. package/src/i18n/ko.js +173 -1
  22. package/src/i18n/zh.js +152 -1
  23. package/src/oneshot.js +39 -6
  24. package/src/pack/selfpack.js +1 -1
  25. package/src/providers/anthropic.js +48 -0
  26. package/src/providers/bedrock.js +102 -0
  27. package/src/providers/custom.js +65 -0
  28. package/src/providers/gemini.js +64 -0
  29. package/src/providers/index.js +121 -0
  30. package/src/providers/openai.js +68 -0
  31. package/src/repl.js +198 -33
  32. package/src/report.js +3 -2
  33. package/src/reset.js +397 -0
  34. package/src/safety/audit.js +5 -2
  35. package/src/safety/authcmd.js +305 -0
  36. package/src/safety/keystore.js +53 -0
  37. package/src/safety/runmode.js +123 -0
  38. package/src/safety/secrets.js +61 -0
  39. package/src/safety/undo.js +3 -2
  40. package/src/setup.js +215 -12
  41. package/src/tools/desc.en.js +19 -14
  42. package/src/tools/index.js +141 -43
  43. package/src/tools/jobs.js +17 -13
  44. package/src/tools/lsp.js +5 -4
  45. package/src/tools/outline.js +7 -3
  46. package/src/tools/task.js +10 -6
  47. package/src/tools/todo.js +9 -2
  48. package/src/tools/verify.js +9 -3
  49. package/src/tools/webfetch.js +2 -1
  50. package/src/ui/export.js +1 -1
  51. package/src/ui/histline.js +67 -0
  52. package/src/ui/status.js +88 -3
  53. package/README.en.md +0 -1025
package/README.md CHANGED
@@ -1,13 +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
+
12
+ Vendor APIs connect too — **only when you say so**
11
13
 
12
14
  <br>
13
15
 
@@ -18,221 +20,279 @@
18
20
 
19
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)
20
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)
21
- [![tests](https://img.shields.io/badge/tests-4%2C932%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)
22
24
 
23
25
  [![dependencies](https://img.shields.io/badge/dependencies-0-1a7f37)](https://www.npmjs.com/package/deel-local-cli?activeTab=dependencies)
24
26
  [![ESM](https://img.shields.io/badge/ESM-Node%2020%2B-5FA04E?logo=javascript&logoColor=white)](package.json)
25
- [![network](https://img.shields.io/badge/network-127.0.0.1%20only-1a7f37?logo=wireguard&logoColor=white)](#데이터가-나가는-길)
26
- [![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)
27
29
 
28
- **[English](README.en.md)** · [사내 반입 안내](#사내-반입) · [문제 해결](#문제-해결) · [자세한 문서](docs/ko/)
30
+ **[한국어](README.ko.md)** · [Corporate review](#corporate-review-package) · [Troubleshooting](#troubleshooting) · [Full docs](docs/en/)
29
31
 
30
32
  </div>
31
33
 
32
34
  ---
33
35
 
34
- ```
35
- ╭──────────────────────────────────────────────────────────────╮
36
- │ deel OpenAI 호환 규격 │
37
- │ │
38
- 모델 qwen2.5-coder:7b (40k 토큰) │
39
- │ 보냄 이 컴퓨터 안 127.0.0.1:11434 ← 여기 말고는 어디로도 안 갑니다 │
40
- │ 연결 스트리밍 · 도구 · 추론 조절 │
41
- 폴더 C:\work\myproject │
42
- 승인 ⏵⏵ 자동 승인 — 묻고 고칩니다. 되돌리기(/undo)가 안전망입니다
43
- │ Shift+Tab 으로 바꿉니다 · Tab 치던 / 명령을 채웁니다 │
44
- PC 스킬 337 · 명령 127 · 플러그인 42 │
45
- ╰──────────────────────────────────────────────────────────────╯
46
- /help 명령 목록 /think 추론 강도 Ctrl+C 중단·끝내기
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>
47
49
 
48
- ▏myproject · qwen2.5-coder:7b ▰▰▱▱▱▱▱▱▱▱ 22% 28k/128k 종합 · ◇ medium·절약 · ⏵⏵ 자동
49
- ❯ 로그 형식 통일해줘
50
+ Then you give it work, and it goes and does it:
50
51
 
51
- ❊ Grep(console.log)
52
- 1개 파일 · 1건
53
- Read(src/runner.js)
54
- └ 5줄
55
- ◈ Edit(src/runner.js)
56
- └ 1군데
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>
57
56
 
58
- 로그 호출을 logger 형식으로 통일했습니다. runner.js 군데를 고쳤습니다.
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.
59
60
 
60
- ── 4.2초 · 도구 3회 · ↑3,900 ↓180
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
61
69
  ```
62
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.
73
+
63
74
  ---
64
75
 
65
- ## 목차
66
-
67
- - [왜 만들었나](#왜-만들었나)
68
- - [무엇이 다른가](#무엇이-다른가)
69
- - [빠른 시작](#빠른-시작)
70
- - [데이터가 나가는 ](#데이터가-나가는-길)
71
- - [로컬 모델 여러 개 쓰기](#로컬-모델-여러-개-쓰기)
72
- - [대화 중 명령](#대화-중-명령)
73
- - [작업 모드](#작업-모드)
74
- - [쉬움 · 개발자](#쉬움--개발자)
75
- - [도구](#도구)
76
- - [한글 문서와 엑셀](#한글-문서와-엑셀)
77
- - [만든 웹을 그 자리에서 띄웁니다](#만든-웹을-그-자리에서-띄웁니다)
78
- - [스킬·플러그인](#스킬플러그인)
79
- - [추론 강도](#추론-강도)
80
- - [자동 압축](#자동-압축)
81
- - [대화 이어하기](#대화-이어하기)
82
- - [밖에서 도구 붙이기 (MCP)](#밖에서-도구-붙이기-mcp)
83
- - [에디터 안에서 쓰기 (ACP)](#에디터-안에서-쓰기-acp)
84
- - [비밀이 새지 않게](#비밀이-새지-않게)
85
- - [안전망](#안전망)
86
- - [사내 반입](#사내-반입)
87
- - [설정](#설정)
88
- - [문제 해결](#문제-해결)
89
- - [개발](#개발)
90
- - [릴리스 노트](#릴리스-노트)
91
-
92
- 여기는 **요약**입니다. 절마다 붙은 링크를 따라가면 그 안의 이야기가 나옵니다.
93
-
94
- | 자세한 문서 | 무엇이 있나 |
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 |
95
113
  |---|---|
96
- | [모델 다루기](docs/ko/models.md) | 급과 크기 · 국산 모델 이름표 · 프로젝트 읽기 |
97
- | [화면과 조작](docs/ko/interface.md) | 입력칸 · 작업 모드 · 쉬움과 개발자 · 무엇을 묻고 무엇을 그냥 하나 |
98
- | [도구 자세히](docs/ko/tools.md) | `Outline` · `Verify` · `Task` · `Jobs` · `Append` · `Def`/`Refs` · 편집 매칭 |
99
- | [한글 문서와 엑셀](docs/ko/documents.md) | hwpx·docx·pptx·**PDF** · 인코딩 · 엑셀 → CSV |
100
- | [늘려 쓰기](docs/ko/extend.md) | 스킬 · 플러그인 · MCP · ACP |
101
- | [속도와 씀씀이](docs/ko/tuning.md) | 단계별 추론 강도 · 프리픽스 캐시 · 컨텍스트 길이 |
102
- | [안전망과 사내 반입](docs/ko/safety.md) | 되돌리기 · 작업 범위 · 감사기록 · 심사 서류 |
103
- | [설정](docs/ko/config.md) · [개발](docs/ko/develop.md) | 환경변수 · 실행 옵션 · 검사 돌리기 · 폴더 구조 |
104
- | [릴리스 노트](docs/ko/releases.md) | [1.6.1](docs/ko/releases.md#161) · [1.6.0](docs/ko/releases.md#160) · [1.5.8](docs/ko/releases.md#158) · [1.5.7](docs/ko/releases.md#157) · [1.5.6](docs/ko/releases.md#156) · [1.5.5](docs/ko/releases.md#155) · [1.5.4](docs/ko/releases.md#154) · [1.5.3](docs/ko/releases.md#153) · [1.5.2](docs/ko/releases.md#152) · [1.5.1](docs/ko/releases.md#151) · [1.5.0](docs/ko/releases.md#150) · [1.4.3](docs/ko/releases.md#143) · [1.4.2](docs/ko/releases.md#142) · [1.4.1](docs/ko/releases.md#141) · [1.4.0](docs/ko/releases.md#140) · [1.3.0](docs/ko/releases.md#130) · [1.2.0](docs/ko/releases.md#120) |
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) |
105
123
 
106
124
  ---
107
125
 
108
- ## 만들었나
126
+ ## Why this exists
109
127
 
110
- 사내 보안 정책이 **미승인 소프트웨어 반입**을 막으면, 코딩 에이전트 도구는 대부분 쓸 수 없습니다.
111
- 의존성 수백 개가 딸려 오고, 설치할 스크립트가 돌고, 어디로 통신하는지 줄로 답할 수 없기 때문입니다.
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?"
112
131
 
113
- deel 심사를 통과하는 것을 목표로 만들었습니다.
132
+ deel is built to pass that review.
114
133
 
115
134
  | | deel |
116
135
  |---|---|
117
- | 외부 의존성 | **0개** — Node 내장 기능만 |
118
- | 설치 스크립트 | **없음**압축 풀고 바로 실행 |
119
- | 소스가 나가는 자리 | **딱 곳** 직접 설정한 주소 |
120
- | 필요한 | 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+ |
121
140
 
122
- 직접 확인하실 수 있습니다.
141
+ Verify it yourself:
123
142
 
124
143
  ```bash
125
144
  npm view deel-local-cli dependencies # {}
126
- npm view deel-local-cli scripts # install/postinstall 없음
127
- deel audit # 심사서 전문 출력
145
+ npm view deel-local-cli scripts # no install/postinstall
146
+ deel audit # full review sheet
128
147
  ```
129
148
 
130
149
  ---
131
150
 
132
- ## 무엇이 다른가
151
+ ## What's different
133
152
 
134
- 로컬 모델을 상대하는 코딩 에이전트는 있습니다. 그런데 **로컬로 돌리는
135
- 전제로 속을 다시 설계한** 것은 드뭅니다.
153
+ A handful of coding agents can talk to a local model. Far fewer were
154
+ **redesigned inside for running locally.**
136
155
 
137
- | | 다른 도구 | deel |
156
+ | | Other tools | deel |
138
157
  |---|---|---|
139
- | `/undo` | 파일만 되돌린다대화는 일이 있었다고 믿는 채로 | **대화까지** 같이 되감는다 |
140
- | 대화 | 클라우드가 느끼는 비용을 로컬에서도 그대로 짊어진다 | 프리픽스 캐시가 **살아남게** 순서를 설계 |
141
- | 작은 모델의 편집 | 공백 하나 틀려도 실패 | 성공률 20%→**100%**, 엉뚱한 0 |
142
- | 국산 모델 | 겪어 보기 전엔 모른다 | 공개 문서로 **미리** 안다 |
143
- | "다 됐습니다" | 확인 것도 됐다고 한다 | `/evidence`·`/export` — **안 것까지** 적는다 |
144
- | MCP·ACP | SDK 필요하다 | `child_process` + `JSON` |
145
- | 심사 서류 | 사람이 손으로 써서 실제와 어긋난다 | **코드가 소스를 훑어서** 만든다 |
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** |
146
165
 
147
166
  <br>
148
167
 
149
- #### `/undo` 파일과 대화를 같이 되감습니다
168
+ #### `/undo` rewinds the conversation along with the files
150
169
 
151
- 파일만 되돌리면 모델은 방금 편집을 했다고 계속 믿고 다음 턴을 위에
152
- 쌓습니다 화면에는 아무 일도 없었던 것처럼 보입니다. deel 되돌린 만큼
153
- 오간 메시지도 같이 접습니다. 접다가 도구 호출의 짝이 어긋나면 API 400 을
154
- 내므로, 짝을 다시 맞추는 로직(`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`).
155
175
 
156
- #### 대화에서 로컬 모델이 갈수록 느려지는 이유를 직접 잡았습니다
176
+ #### Fixed the hidden reason local models get slower as a conversation grows
157
177
 
158
- Ollama·llama.cpp 프롬프트 앞부분이 글자라도 바뀌면 뒤 전부를 다시
159
- 계산합니다. 클라우드 API 비용을 느끼니 신경 이유가 없지만,
160
- 로컬로 돌리는 사람에게는 대화가 길어질수록 턴마다 지연이 쌓입니다. deel
161
- 바뀔 있는 것(모드·핀)을 프롬프트 **맨 끝**으로 보내고, Ollama 에는
162
- `keep_alive: 60m` 같이 보내 앞부분이 캐시에 그대로 남게 합니다. 순서는
163
- 검사(`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`).
164
186
 
165
- #### 작은 모델도 편집이 실제로 성공합니다
187
+ #### Edits actually succeed on small models
166
188
 
167
- 작은 로컬 모델은 고치려는 문자열을 공백 하나까지 완벽히 재현하지 못하는
168
- 경우가 흔합니다. `npm run bench` 로 잰 내부 벤치마크에서, 정확히 일치만
169
- 요구하던 방식은 성공률 20% 였습니다. 지금 방식(공백·들여쓰기를 단계적으로
170
- 완화) **100%** — 그러면서도 엉뚱한 곳을 고친 건수는 두 방식 다 **0건**
171
- 입니다. 모호하면 찾지 못했다고 말할지언정 짐작해서 고치지 않습니다.
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.
172
195
 
173
- #### 국산 모델은 겪어 보기 전에 압니다
196
+ #### Korean models are known before you've ever run them
174
197
 
175
- EXAONE·HyperCLOVA X·Kanana·Midm·Solar 공개 문서로 확인 가능한 버릇(예:
176
- 추론형 여부)을 deel 미리 알고 시작합니다. 다른 도구는 모델들을 한
177
- 번도 만나 채로 취급하고, 사람이 턴을 겪어야 요령이 붙습니다.
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.
178
202
 
179
- #### "다 됐습니다" 대신 증명서를 냅니다
203
+ #### "Done" comes with a receipt, not just a claim
180
204
 
181
- `/evidence` `/export` 무엇을 바꿨는지뿐 아니라 **무엇을 확인하지
182
- 못했는지**까지 적습니다. AI 코딩 도구가 사람을 제일 속이는 순간이 자신
183
- 있게 "됐습니다" 라고 말할 때라는 알기 때문입니다. `/export` 바깥
184
- 주소가 하나도 없는 자기완결 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.
185
210
 
186
- #### MCP·ACP SDK 없이 붙였습니다
211
+ #### MCP and ACP, with no SDK
187
212
 
188
- Model Context Protocol Agent Client Protocol 둘 다 표준입출력으로 줄
189
- 단위 JSON-RPC 2.0 주고받는 전부입니다. deel `child_process` 와
190
- `JSON` 만으로 다 구현했습니다 의존성 0개가 "기능을 결과" 가 아니라
191
- "안 필요해서" 라는 가지가 보여 줍니다.
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.
192
217
 
193
- #### 심사 서류를 손으로 씁니다
218
+ #### Compliance paperwork it doesn't hand-write
194
219
 
195
- `deel pack` 만드는 반입심사서·SBOM·감사 사양은 **코드가 소스를 훑어서**
196
- 만든 겁니다. 손으로 적은 서류는 언젠가 실제와 어긋나고, 담당자가 그걸 한 번
197
- 발견하면 나머지 서류도 믿습니다.
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.
198
224
 
199
225
  ---
200
226
 
201
- ## 빠른 시작
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
+ 日本語 · 中文**.
234
+
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.
202
261
 
203
- ### 설치
262
+ ### Install
204
263
 
205
264
  ```bash
206
265
  npm install -g deel-local-cli
207
266
  ```
208
267
 
209
- 설치가 싫으면 소스를 받아 그대로 쓰셔도 됩니다. `npm install` 이 필요 없습니다.
268
+ Or skip installing entirely there is no `npm install` step:
210
269
 
211
270
  ```bash
212
271
  git clone https://github.com/jysvai/deel-local-cli
213
272
  node deel-local-cli/bin/deel.js
214
273
  ```
215
274
 
216
- > **주의** 디렉터리(`~`)에서 `npm install` 하지 마세요. 거기에 `node_modules` 생기면
217
- > 이후 모든 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`.
218
277
 
219
- ### 연결 정하기
278
+ ### Point it at a model
220
279
 
221
- PC 있는 로컬 서버를 훑어서 고르는 방법:
280
+ Scan this machine and pick one:
222
281
 
223
282
  ```bash
224
283
  deel scan --pick
225
284
  ```
226
285
 
227
- 주소를 직접 넣는 방법 (사내 게이트웨이는 이쪽):
286
+ Or enter an address directly (use this for a corporate gateway):
228
287
 
229
288
  ```bash
230
289
  deel setup
231
290
  ```
232
291
 
233
- ### 시작
292
+ ### Start
234
293
 
235
- 작업할 폴더에서 `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.**
236
296
 
237
297
  ```bash
238
298
  cd C:\work\myproject
@@ -241,376 +301,491 @@ deel
241
301
 
242
302
  ---
243
303
 
244
- ## 데이터가 나가는
304
+ ## Where your data can go
245
305
 
246
- 코딩 에이전트는 소스 코드를 통째로 모델에 보냅니다. **그 주소가 어디인지가 전부입니다.**
247
- 말로 보장하는 대신 코드가 막습니다 `src/safety/network.js` 요청마다 확인하고,
248
- 허용 목록에 없으면 요청을 만들지도 않습니다.
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.
249
309
 
250
310
  ```
251
- [A] 모델 게이트웨이 ─── 소스 코드가 나가는 유일한
252
- setup 에서 정한 자리만. 모델을 바꾸면 이전 자리는 닫힙니다.
311
+ [A] Model gateway ────── the only path your source travels
312
+ One address, set in `setup`. Switching models closes the previous one.
253
313
 
254
- [B] 읽기 (WebFetch) ─ 받아 오기만 하는 길
255
- GET 만. 본문 0바이트. 사내망·로컬 주소는 거절. 다녀온 곳은 전부 기록.
314
+ [B] Web read (WebFetch) ─ receive-only
315
+ GET only, zero-byte body. Private/loopback addresses refused. Every visit logged.
256
316
 
257
- [C] 플러그인 받기 ────── /plugin install 을 칠 때만 잠깐
317
+ [C] Plugin fetch ─────── open only while /plugin install runs
258
318
 
259
- [D] MCP 서버 ─────────── 자식 프로세스, 남의 프로그램
260
- .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.
261
321
  ```
262
322
 
263
- A·B·C deel 직접 만드는 요청이라 하나씩 걸러낼 있습니다. **[D] 는
264
- 다릅니다** — MCP 서버는 별도 프로세스라 안에서 무슨 소켓을 여는지 코드로
265
- 없습니다. 그래서 `--offline` 때는 요청을 거르는 대신 **그 서버
266
- 자체를 아예 띄우지 않습니다** 막을 없는 것을 막았다고 말하지 않습니다.
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.
267
328
 
268
- `--offline` 주면 **B·C·D 모두 막히고 컴퓨터 안으로만** 다닙니다.
329
+ Pass `--offline` and **B, C, and D are all closed** traffic stays on this machine.
269
330
 
270
331
  ```bash
271
332
  deel --offline
272
333
  ```
273
334
 
274
- 무엇이 어디로 있는지는 화면 위에 늘 적혀 있습니다.
335
+ The destination is printed at the top of every session:
275
336
 
276
337
  ```
277
- 보냄 이 컴퓨터 안 127.0.0.1:11434 여기 말고는 어디로도 안 갑니다
338
+ deel 1.8.0 inside
339
+ Sends to this machine 127.0.0.1:11434 ← nowhere else
278
340
  ```
279
341
 
280
- 수집·전송하는 것이 없습니다. 텔레메트리, 사용 통계, 오류 보고 전부 없습니다.
281
- 대화 기록·되돌리기 이력·설정은 작업 폴더의 `.deel/` 안에만 남습니다.
342
+ ### Three run modes
282
343
 
283
- > 검증: `npm test` network·web·mcp 검사 123항목. 허용되지 않은 서버에 실제로
284
- > 요청이 **한 건도 닿지 않는지**, `--offline` MCP 서버가 **한 번도 안
285
- > 뜨는지**까지 진짜 서버를 띄워서 확인합니다.
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.
347
+
348
+ | Mode | How | On an external address |
349
+ |---|---|---|
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) |
353
+
354
+ **Both the address and the permission are required.** Changing the address
355
+ alone does not get you out.
356
+
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."
360
+
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.
363
+
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`.
286
367
 
287
368
  ---
288
369
 
289
- ## 로컬 모델 여러 개 쓰기
370
+ ## Connecting a vendor API
290
371
 
291
- 로컬 런타임은 보통 하나만 쓰지 않습니다. Ollama 작은 모델을 돌리면서
292
- LM Studio 모델을 띄워 두기도 합니다. `deel scan` 알려진 자리 13곳을 동시에 두드려
293
- 전부 찾아냅니다.
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.**
294
375
 
376
+ ```bash
377
+ deel setup
378
+ ```
379
+
380
+ Instead of asking for a URL, it asks **where you're connecting**.
381
+
382
+ ```
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
295
389
  ```
296
- $ deel scan
297
390
 
298
- ── 로컬 모델 서버 훑기 ───────────────────────────────────────────────
299
- 127.0.0.1 의 알려진 자리 13곳을 두드립니다. 바깥으로는 나가지 않습니다.
391
+ Option 1 is the point — the key prefix decides which single vendor is asked.
300
392
 
301
- ✓ 3곳 찾음
393
+ ```
394
+ ❯ sk-ant-api03-••••
395
+ ✓ Looks like an Anthropic (Claude) key. (the key starts with sk-ant-)
396
+ It is not thrown at every vendor in turn.
397
+ ```
398
+
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.
402
+
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)).
406
+
407
+ ### Going outside masks secrets in file contents too
408
+
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.
412
+
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.
302
416
 
303
- Ollama 127.0.0.1:11434 Ollama 규격 36ms
417
+ ### You can see what it costs
418
+
419
+ ```
420
+ ❯ ─ 12.4s · 3 tools · ↑8.2k ↓1.1k · $0.0271
421
+ ```
422
+
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:
427
+
428
+ ```json
429
+ "요금": { "claude-opus-4-6": { "입력": 0, "출력": 0, "기준": "2026-09-01" } }
430
+ ```
431
+
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.
435
+
436
+ ---
437
+
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.
444
+
445
+ So write down *how to get a key* instead of the key:
446
+
447
+ ```json
448
+ "열쇠받기": {
449
+ "명령": "az account get-access-token --resource api://ai-gw --query accessToken -o tsv",
450
+ "수명": 3600
451
+ }
452
+ ```
453
+
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
+ ---
473
+
474
+ ## Multiple local runtimes
475
+
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
304
486
  · qwen2.5-coder:7b 7B · 4.4GB
305
487
  · llama3.2:1b 1B · 1.2GB
306
- ◆ LM Studio 127.0.0.1:1234 OpenAI 호환 7ms
488
+ ◆ LM Studio 127.0.0.1:1234 OpenAI-compat 7ms
307
489
  · devstral-small-2507
308
- ◆ llama.cpp 127.0.0.1:8080 OpenAI 호환 7ms
490
+ ◆ llama.cpp 127.0.0.1:8080 OpenAI-compat 7ms
309
491
  · gemma-3-4b-it
310
492
 
311
- 합계 서버 3곳 · 모델 6개
312
-
313
- 추천 Ollama · qwen2.5-coder:7b
314
- 코딩용 모델 · 도구 호출을 잘하는 계열
493
+ Recommended Ollama · qwen2.5-coder:7b
315
494
  ```
316
495
 
317
- 포트로 단정하지 않고 **응답을 보고** 런타임을 구분합니다 — Ollama 는 `/api/version`,
318
- LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추정)` 이라고 밝힙니다.
319
-
320
- | 명령 | 하는 일 |
496
+ | Command | What it does |
321
497
  |---|---|
322
- | `deel scan` | 찾아서 보여주기만 |
323
- | `deel scan --pick` | 목록에서 골라 등록 |
324
- | `deel scan --save` | 찾은 전부 등록 |
325
- | `deel scan --ports 9000,9100` | 기본 자리 말고 볼 포트 |
326
- | `deel scan --host <주소>` | 기본은 `127.0.0.1` |
327
- | `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` |
328
503
 
329
- 등록한 뒤에는 대화 중 `/model` 갈아탑니다. **대화 내용은 그대로 이어집니다.**
504
+ Switch with `/model` mid-conversation **the conversation carries over.**
330
505
 
331
- > **자세히**걸린 모델에 맞춰 스스로 바뀝니다 · 국산 모델은 겪기 전에 압니다 · 작은 창에서는 고정 몫을 줄입니다 · 폴더가 무슨 프로젝트인지 읽습니다
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
332
507
  >
333
- > **[모델 다루기 읽기 →](docs/ko/models.md#로컬-모델-여러-개-쓰기)**
508
+ > **[Models read →](docs/en/models.md#multiple-local-runtimes)**
334
509
 
335
510
  ---
336
511
 
337
- ## 대화 중 명령
512
+ ## Slash commands
338
513
 
339
- 이름은 Claude Code / Codex 관례에 맞췄습니다.
514
+ Names follow Claude Code / Codex conventions.
340
515
 
341
- | 명령 | 하는 |
516
+ | Command | What it does |
342
517
  |---|---|
343
- | `/help` | 명령 목록 |
344
- | `/bell [on|off]` | 됐을 때·물어볼 종소리와 제목 |
345
- | `/lang [ko|en|ja|zh] [시킬말]` | 화면 (한국어·English·日本語·中文 가지, 전부 채워져 있다). **시킬 말을 따로 줄 수 있다** `/lang ko en` 이면 모델에게는 영어로 시키고 답은 한국어로 받는다(8k 창에서 고정 몫 23% 감소). 코드는 그대로 |
346
- | `/keys` | 터미널이 무슨 키를 보내는지 눌러서 확인 줄바꿈이 |
347
- | `/consult <프로필> <질문>` | 다른 모델에게 물어보기 지금 쓰는 것은 바꿈 |
348
- | `/export` | 대화를 **보고서 장**(HTML)으로시킨 것·바뀐 것·확인한 것. 폐쇄망에서 여는 자기완결 파일 |
349
- | `/lsp [on\|off]` | 언어 서버무엇이 깔려 있고 `Def`·`Refs` 수 있는지. `off` 고친 진단만 |
350
- | `/context` | 무엇이 컨텍스트를 먹고 있는지 |
351
- | `/ctx [auto\|숫자\|자세히]` | 컨텍스트 **길이**모델에 맞춰 다시 재거나 직접 지정 |
352
- | `/out [숫자\|auto]` | 번에 받을 **답 길이** 상한 파일이 잘리면 여기를 올립니다 |
353
- | `/grade [작음\|보통\|큼\|auto]` | 모델 **급**얼마나 알아서 하나. `/ctx` 다른 축입니다 |
354
- | `/compact` | 앞선 대화를 요약해서 접기 |
355
- | `/clear` | 대화 비우기 (연결·규칙은 유지) |
356
- | `/thread [new\|fork\|close\|번호]` | 대화 갈래곁가지를 자리에서. 연결·되돌리기는 같이 씁니다 |
357
- | `/learned [지우기]` | 쓰면서 저절로 알게 되는 명령·이 모델의 버릇 |
358
- | `/pin <말>` | 박기접거나 요약해도 **안 지워지는** |
359
- | `/evidence [파일]` | 증거무엇을 바꿨고 무엇이 그걸 증명하나. **안 것도** 적습니다 |
360
- | `/commit [전부\|미리보기\|제목]` | 이번 대화가 바꾼 것만 담아 커밋. 메시지는 diff 증거에서. **push 안 합니다** |
361
- | `/model` | 연결·모델 바꾸기 |
362
- | `/model 카드` | 모델을 겪어 결과 그래서 deel 무엇을 바꿔 뒀는지 |
363
- | `/think <강도>` | 추론 강도 (`off·low·medium·high·max`) |
364
- | `/think 배분 <배분>` | 단계별 배분 (`균일·절약·깊게`) |
365
- | `/think 자세히` | 단계표어느 단계를 어떤 강도·상한으로 도는지 |
366
- | `/mode <모드>` | 승인 정책얼마나 물어보나 (`auto` · `confirm` · `strict`) |
367
- | `/work [모드]` | 작업 모드무슨 일을 하는 중인가 |
368
- | `/auto` | 다시 맡기기말을 보고 알맞은 모드로 저절로 옮겨 갑니다 |
369
- | `/code` `/plan` `/architect` `/debug` `/ask` `/orchestrator` | 작업 모드 바로 바꾸기 (그때부터 고정) |
370
- | `/level [수준]` | 화면에 무엇을 내놓을지 (`쉬움` · `개발자`) |
371
- | `/motion [기본\|기사\|동물\|사무실\|끔]` | 일하는 동안 뭐가 도나 자리에서 바뀌고 설정에 남습니다 |
372
- | `/undo [턴수]` | 파일 변경 되돌리기 |
373
- | `/diff [파일]` | 이번 대화에서 바뀐 파일 · 바뀐 자리 보기 |
374
- | `/preview [폴더\|파일\|off]` | 만든 웹을 자리에서 띄워 보기브라우저가 같이 열립니다 |
375
- | `/tools` | 있는 도구 |
376
- | `/skills [검색어\|all\|off]` | 스킬 보기·검색·골라 올리기 |
377
- | `/plugin [install\|remove\|pack]` | 플러그인 관리 |
378
- | `/cost` | 이번 세션 사용량 |
379
- | `/status` | 연결 상태 |
380
- | `/scan [save]` | PC 있는 로컬 모델 서버 훑기 (`save` 바로 등록) |
381
- | `/sessions` | 폴더의 지난 대화 목록 |
382
- | `/recall <말>` | 지난 대화에서 **내용으로** 찾기 |
383
- | `/memory` | 대화가 끝나도 남는 기억보기·적기·지우기 |
384
- | `/mcp` | 밖에서 붙인 도구(MCP) 서버 보기 |
385
- | `/init` | `DEEL.md` 규칙 파일 만들기 |
386
- | `/exit` | 끝내기 |
387
-
388
- `/scan` `/sessions` 나가지 않고도 씁니다. 로컬 서버를 새로 켰거나 모델을
389
- 바꿔 올렸을 때 `/scan save` → `/model` 두 번이면 대화를 이어둔 채로 갈아탑니다.
390
-
391
- **치지 않고 쓰는 것**
392
-
393
- | 키 | 무엇을 |
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 |
394
572
  |---|---|
395
- | `Tab` | 치던 `/` 명령을 채웁니다. 치는 도중에 후보가 상자 아래에 뜹니다 |
396
- | `Shift+Tab` | 승인 방식 (`⏵⏵ 자동` → `⏵ 위험만` → `⏸ 모두`) |
397
- | `Ctrl+O` | 작업 모드 (`종합` → `코드` → `계획` → …) |
398
- | `↑` `↓` | 지난 입력 이력 |
399
- | `Ctrl+C` | 답하는 중이면 답만 끊고, 줄에서 번이면 끝냅니다 |
400
- | 일하는 중에 그냥 치고 `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 |
401
579
 
402
- 한글 조합·붙여넣기·`Ctrl+A/E`·백스페이스는 전부 그대로 됩니다.
580
+ Korean IME composition, paste, `Ctrl+A/E` and backspace all keep working.
403
581
 
404
- > **자세히**@파일 바로 붙이기 · 도중에 멈추기 · 멈추지 않고 방향만 틀기
582
+ > **More**Attaching a file with @ · Interrupting · Steering without stopping
405
583
  >
406
- > **[화면과 조작 읽기 →](docs/ko/interface.md#대화-중-명령)**
584
+ > **[The screen read →](docs/en/interface.md#slash-commands)**
407
585
 
408
586
  ---
409
587
 
410
- ## 작업 모드
588
+ ## Work modes
411
589
 
412
- 무슨 일을 하는 중인지에 따라 **줄 있는 도구와 추론 설정이 같이 바뀝니다.**
413
- `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.
414
592
 
415
- | 모드 | 하는 | 파일을 고치나 | 추론 |
593
+ | Mode | For | Can edit files | Reasoning |
416
594
  |---|---|---|---|
417
- | `/auto` ◎ 종합 | **처음 값.** 말을 보고 알맞은 모드로 옮겨 간다 | | 보통 (`save`) |
418
- | `/code` ◆ 코드 | 고치고 만든다 | | 보통 (`save`) |
419
- | `/plan` ☰ 계획 | 먼저 계획만 세운다 | **아니오** | 깊게 (`deep`·high) |
420
- | `/architect` ◈ 설계 | 구조를 짠다 | **아니오** | 깊게 (`deep`·high) |
421
- | `/debug` ◉ 디버그 | 원인을 찾는다 | | 깊게 · 단계 많이 (32) |
422
- | `/ask` ◇ 묻기 | 설명만 한다 | **아니오** | 얕게 (`low`) |
423
- | `/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) |
424
602
 
425
- 읽기만 하는 모드에서는 `Write`·`Edit`·`Bash` **모델에게 아예 보내지 않습니다.**
426
- "고치지 마세요" 라고 부탁하지 않습니다모델은 부탁을 잊습니다. 없는 도구는 씁니다.
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.
427
605
 
428
- `/mode` 헷갈리지 마세요. 둘은 다른 축입니다.
606
+ Don't confuse this with `/mode`. They are separate axes:
429
607
 
430
- - `/mode` — **얼마나 물어보나** (auto · confirm · strict)
431
- - `/work` — **무슨 일을 하는 중인가** ( 일곱 가지)
608
+ - `/mode` — **how much it asks you** (auto · confirm · strict)
609
+ - `/work` — **what kind of work you are doing** (the seven above)
432
610
 
433
- `/think` `/mode` 직접 고른 적이 있으면 선택이 우선합니다.
434
- 모드가 사람이 고른 값을 덮어쓰지 않습니다.
611
+ If you have explicitly set `/think` or `/mode`, your choice wins. A work mode never
612
+ overrides something a person chose.
435
613
 
436
- > **자세히**저절로 옮겨 가기 (종합 모드)
614
+ > **More**Switching by itself (Auto mode)
437
615
  >
438
- > **[화면과 조작 읽기 →](docs/ko/interface.md#작업-모드)**
616
+ > **[The screen read →](docs/en/interface.md#work-modes)**
439
617
 
440
618
  ---
441
619
 
442
- ## 쉬움 · 개발자
620
+ ## Simple vs developer
443
621
 
444
- 처음 사람에게 명령 스무 개를 들이밀면 아무것도 고릅니다.
445
- 그렇다고 기능을 잠그면 만해졌을 막힙니다. 그래서 **보이는 것만** 나눕니다.
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.
446
624
 
447
- | | 쉬움 (기본) | 개발자 |
625
+ | | Simple (`쉬움`, default) | Developer (`개발자`) |
448
626
  |---|---|---|
449
- | `/help` 목록 | 자주 쓰는 것만 | 전부 |
450
- | 오류 문구 | 무엇을 하면 되는지 | 원래 문구 그대로 |
451
- | 안전 장치 | **똑같음** | **똑같음** |
627
+ | `/help` listing | Common commands only | Everything |
628
+ | Error messages | What to do about it | The original text |
629
+ | Safety | **Identical** | **Identical** |
452
630
 
453
- `/level 개발자` 바꾸면 설정에 남아 다음에 때도 이어집니다.
631
+ `/level 개발자` is saved to config and persists across sessions.
454
632
 
455
- 중요한 가지입니다.
633
+ Two things matter here:
456
634
 
457
- - **감춘 것도 그대로 먹습니다.** 쉬움에서 `/think high` 쳐도 됩니다. 목록에 띄울 뿐입니다.
458
- - **초보라고 승인을 받지 않습니다.** 되돌리기·작업 범위·위험 명령 차단은 수준이 같습니다.
459
- 초보일수록 되돌릴 있어야 합니다.
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.
460
638
 
461
- > **자세히**입력칸 · 명령은 쳐도 됩니다 · 일하는 중에는 상자가 그대로 있습니다 · 왼쪽 그림도 같이 움직입니다 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
462
640
  >
463
- > **[화면과 조작 읽기 →](docs/ko/interface.md#쉬움--개발자)**
641
+ > **[The screen read →](docs/en/interface.md#simple-vs-developer)**
464
642
 
465
643
  ---
466
644
 
467
- ## 도구
645
+ ## Tools
468
646
 
469
- 이름과 인자를 Claude Code 같게 맞췄습니다. 관례로 쓰인 스킬·명령이 그대로 먹습니다.
647
+ Names and arguments match Claude Code, so skills written for that convention work unchanged.
470
648
 
471
- | 도구 | 하는 |
649
+ | Tool | What it does |
472
650
  |---|---|
473
- | `Read` | 파일 읽기 ( 번호 · `offset`/`limit` 지원 · **엑셀은 CSV 로, hwpx·docx·pptx·PDF 글로 바꿔서**) |
474
- | `Write` | 파일 쓰기·덮어쓰기 (**여러 개는 `files` 배열로 한 번에**) |
475
- | `Append` | 파일 끝에 이어 붙이기**큰 파일을 나눠 쓰는 자리** |
476
- | `Edit` | 정확한 문자열 바꾸기 (`replace_all` · **여러 군데는 `edits` 배열로 한 번에**) |
477
- | `Move` | 파일·폴더 옮기기·이름 바꾸기**구조를 바꾸는 자리** (`moves` 배열로 번에 · 되돌리기에 잡힘) |
478
- | `Glob` | 이름 패턴으로 파일 찾기 |
479
- | `Grep` | 내용 정규식 검색 |
480
- | `Bash` | 명령 실행 (**끝나지 않는 것은 `background: true`**) |
481
- | `Skill` | 스킬 본문 펼쳐 읽기 (스킬이 있을 때만 모델에게 보임) |
482
- | `WebFetch` | 페이지 읽기 (읽기 전용 · `--offline` 이면 숨김) |
483
- | `Ask` | 갈림길에서 **사람에게 되묻기**고를 것을 주고 숫자 하나로 받는다 |
484
- | `Recall` | **지난 대화**에서 찾기"저번에 그거" 모델이 스스로 뒤진다 |
485
- | `Remember` | 대화가 끝나도 남길 다음에 처음부터 안다 |
486
- | `TodoWrite` | 목록 일을 쪼개서 어디까지 했는지 화면에 띄움 |
487
- | `Outline` | 폴더의 **뼈대만** 보기통째로 읽는 것보다 수십 분의 |
488
- | `Verify` | 만든 것이 **진짜 되는지** 확인 |
489
- | `Task` | 일의 덩이를 **따로 떨어진 창**에서 돌리기 |
490
- | `Jobs` | **뒤에서 도는 명령** 보기·읽기·끝내기 — `Bash` `background` 와 짝 |
491
- | `Def` | 이름이 **어디 정의됐는지**언어 서버가 깔려 있을 때만 보입니다 |
492
- | `Refs` | 이름을 **어디서 쓰는지** 전부언어 서버가 깔려 있을 때만 보입니다 |
493
-
494
- Claude Code 없는 것은 아홉입니다 — `Append` · `Move` · `Ask` · `Recall` ·
495
- `Remember` · `Outline` · `Verify` · `Task` · `Jobs`. 도구 하나가 스키마로 150~400토큰을 먹고
496
- 그게 **매 요청마다** 나가므로, 늘릴 때마다 검사에서 멈추게 뒀습니다
497
- (`test/loop.test.js`). 뒤의 넷은 값을 치르고도 넣을 만해서 넣은 것들이라,
498
- 아래에 왜인지를 적어 뒀습니다.
499
-
500
- > **자세히** — 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
501
678
  >
502
- > **[도구 자세히 읽기 →](docs/ko/tools.md#도구)**
679
+ > **[Tools in depth read →](docs/en/tools.md#tools)**
503
680
 
504
681
  ---
505
682
 
506
- ## 한글 문서와 엑셀
507
-
508
- **CP949 로 저장된 파일은 CP949 로 되돌려 씁니다.** 인코딩을 바꾸지 않습니다.
509
- 엑셀(`.xlsx`)은 CSV 로, 한글·워드·파워포인트(`.hwpx`/`.docx`/`.pptx`)와
510
- **PDF** 는 글로 바꿔서 읽습니다 — 전부 읽기 전용입니다.
683
+ ## Korean text and Excel
511
684
 
512
- PDF **못 읽은 쪽을 읽었다고 말합니다.** 스캔본·암호·글꼴 표가 없는 쪽은
513
- 글로 넘기지 않고 자리에 까닭을 적습니다 빈 글은 「그런 내용이 없다」로
514
- 읽히기 때문입니다.
685
+ **A file saved as CP949 is written back as CP949.** The encoding is never changed.
686
+ Excel (`.xlsx`) is read as CSVread-only.
515
687
 
516
- 형식(`.ppt`·`.doc`·`.xls`·`.rtf`) **이 PC 깔린 LibreOffice 를 빌려서**
517
- 읽습니다`rg` 빌려 쓰는 것과 같은 원칙으로, 아무것도 설치하지 않습니다.
518
- 없으면 **없다고 박고 끝냅니다**(무엇이 없어서 하는지, 무엇을 하면 되는지,
519
- 그리고 「다시 열지 말라」까지). 끄려면 `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`.
520
692
 
521
- > **자세히**인코딩 · 엑셀 · hwpx/docx/pptx · PDF · 변환기 빌려 쓰기
693
+ > **More**Encoding · Excel · borrowing a converter
522
694
  >
523
- > **[한글 문서와 엑셀 읽기 →](docs/ko/documents.md#한글-문서와-엑셀)**
695
+ > **[Korean documents and Excel read →](docs/en/documents.md#korean-text-and-excel)**
524
696
 
525
697
  ---
526
698
 
527
- ## 만든 웹을 자리에서 띄웁니다
699
+ ## Serving what you built
528
700
 
529
701
  ```
530
702
  ❯ /preview
531
703
 
532
- 띄웠습니다 http://127.0.0.1:56801/
533
- 보여 주는 것 .
534
- 파일을 고치면 화면이 저절로 새로 뜹니다.
535
- 컴퓨터에서만 열립니다(127.0.0.1). 다른 PC 에서는 보입니다.
536
- 끄려면 /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.
537
709
  ```
538
710
 
539
- 브라우저가 같이 열립니다. `/preview 폴더` 자리를 정하고, `/preview off` 끕니다.
711
+ A browser opens with it. `/preview <folder>` picks what to serve, `/preview off` stops it.
540
712
 
541
- **파일을 눌러 여는 (`file://`) 다릅니다.** `file://` 에서는 아래가 전부
542
- 막힙니다그런데 오류는 콘솔에만 나오고 화면은 그냥 희어서, 만든 사람은 코드를
543
- 의심하며 시간을 씁니다. 진짜 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:
544
716
 
545
717
  | | `file://` | `/preview` |
546
718
  |---|---|---|
547
- | `<script type="module">` · `import` | 막힘 (CORS) | **됨** |
548
- | `fetch('./자료.json')` | 막힘 | **됨** |
549
- | `new Worker(...)` | 막힘 | **됨** |
550
- | `WebAssembly.compileStreaming` | 막힘 (형식) | **됨** |
551
- | 텍스처·`getImageData` | 캔버스 오염 | **됨** |
552
- | `.glb` / `.gltf` (Three.js) | 형식 없음조용히 그려짐 | **됨** |
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** |
553
725
 
554
- 실제 크롬에서 일곱 가지를 돌려 **7/7** 을 확인했습니다.
726
+ All seven were run in a real Chrome and confirmed **7/7**.
555
727
 
556
- 라우터를 쓰는 (React Router ) 안쪽 주소에서 새로고침해도 장이 나옵니다.
557
- 다만 확장자가 있는 요청(`app.js`)에는 절대 안 그럽니다 없는 스크립트에 HTML
558
- 돌려주면 `Unexpected token '<'` 죽는데, 그게 진짜 원인(파일 이름 오타)을 가립니다.
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`) thoughreturning HTML for a
730
+ missing script dies with `Unexpected token '<'`, which hides the real cause (a typo in a filename).
559
731
 
560
- ### 열어 주는 만큼만 엽니다
732
+ ### It opens exactly as much as it says
561
733
 
562
- 서버를 띄운다는 것은 디스크를 남에게 열어 주는 일입니다.
734
+ Starting a server means opening your disk to somebody else.
563
735
 
564
- - **`127.0.0.1` 에만** 묶습니다. `0.0.0.0` 아예 씁니다같은 사무실 망에서
565
- 아무나 소스를 읽게 됩니다.
566
- - 포트는 **0**(커널이 것을 줍니다). 고정 포트는 남이 쓰던 것을 뺏습니다.
567
- - 경로는 작업 범위 밖으로 나갑니다. `../` · `%2e%2e` · 인코딩 · 절대 경로 ·
568
- 널바이트 · 심볼릭 링크 여덟 가지를 검사로 막아 뒀습니다.
569
- - **주기만 합니다.** `POST` · `PUT` · `DELETE` 405 거절합니다.
570
- - `deel` 을 끝내면 같이 꺼집니다.
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 · symlinkseight 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.
571
743
 
572
- ## 스킬·플러그인
573
-
574
- **남의 스킬은 품고 다니지 않습니다.** 켜질 때 그 PC 를 훑어 있는 것을 그대로 씁니다.
575
-
576
- **다만 일하는 방법 일곱 가지는 품고 다닙니다.** 사내에서 새로 받은 PC 에는
577
- `~/.claude/skills` 도 플러그인도 없습니다. 거기서는 방법론이 0개라 모델이 매번
578
- 제 나름대로 했고, 시킨 것만 겨우 하고 끝나는 얄팍한 결과가 거기서 나왔습니다.
744
+ ---
579
745
 
580
- | 스킬 | 언제 |
581
- |---|---|
582
- | `깊이있게-만들기` | 고도화·보고용·선포용 — 최소치만 내고 끝내지 않게 |
583
- | `끝까지-하기` | 시킨 것이 여러 조각일 때. 빼먹은 것은 말하게 |
584
- | `차근차근-디버깅` | 재현 → 좁히기 → 원인 → 고치기 → 증명 |
585
- | `검사-먼저` | 고치기 전에 실패하는 검사부터 |
586
- | `찔러보기` | 되는지 모를 때 시간 정해 작게 찔러 보고 버리기 |
587
- | `코드-줄이기` | 동작은 그대로 두고 읽기 쉽게 |
588
- | `스스로-검토` | 다 됐다고 말하기 전에. 못 잰 것까지 말하게 |
746
+ ## Skills and plugins
589
747
 
590
- 목록으로 나가는 몫은 354토큰입니다(8k 창의 4%). 본문은 `Skill` 부를 때만 나갑니다.
591
- 같은 이름을 직접 만들면 그쪽이 이깁니다 품고 다니는 것이 제일 낮은 자리입니다.
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.
592
750
 
593
751
  ```
594
- 품고 다님 (패키지 안) ← 제일 낮은 자리
595
- 프로젝트 ./.deel/skills ./.claude/skills ./.deel/commands ./.claude/commands
596
- 사용자 ~/.deel/skills ~/.claude/skills ~/.claude/commands
597
- 플러그인 ~/.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/**
598
755
  ```
599
756
 
600
- Claude Code 같은 형식(`SKILL.md` + YAML 앞머리, `commands/*.md`, `$ARGUMENTS`)을 읽습니다.
757
+ Reads the Claude Code format: `SKILL.md` with YAML front matter, `commands/*.md`, `$ARGUMENTS`.
601
758
 
602
- > **자세히**3단계로 나눠 올립니다 · 플러그인 받아 오기 · 넣은
759
+ > **More**Loaded in three stages · Fetching plugins · Deliberately not included
603
760
  >
604
- > **[늘려 쓰기 읽기 →](docs/ko/extend.md#스킬플러그인)**
761
+ > **[Extending read →](docs/en/extend.md#skills-and-plugins)**
605
762
 
606
763
  ---
607
764
 
608
- ## 추론 강도
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.
609
781
 
610
- 에이전트 번의 대답은 모델을 여러 번 부릅니다. **부를 때마다 필요한 생각의 양이 다릅니다.**
611
- 전부 세게 두면 느리고, 전부 얕게 두면 엉뚱한 길로 갑니다.
782
+ ## Reasoning effort
612
783
 
613
- 기본은 **한 줄**입니다. 알고 싶은 것은 '지금 얼마나 생각하나' 이지 단계표가 아닙니다.
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.
614
789
 
615
790
  ```
616
791
  $ /think
@@ -619,17 +794,17 @@ $ /think
619
794
  더 세게 /think high 더 빠르게 /think low
620
795
  ```
621
796
 
622
- | 배분 | 성격 |
797
+ | Profile | Character |
623
798
  |---|---|
624
- | `even` (균일) | 모든 단계 같은 강도 예측 가능한 대신 느림 |
625
- | `save` (절약, 기본) | 판단만 세게, 이어가기는 얕게 |
626
- | `deep` (깊게) | 단계 칸씩 위로 어려운 일에만 |
799
+ | `even` | Same effort everywherepredictable, slower |
800
+ | `save` (default) | Hard on the first decision only |
801
+ | `deep` | Everything one notch upfor hard work |
627
802
 
628
- 배분은 `/think 배분 절약` 정합니다. **강도와 배분은 다른 축이라 명령을 갈랐습니다** —
629
- 전에는 `/think high` `/think save` 같은 이름으로 다른 것을 정해서,
630
- 화면을 봐도 지금 무엇이 무엇인지 읽히지 않았습니다.
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.
631
806
 
632
- 단계표는 `/think 자세히` 로 뺐습니다(개발자 수준 기본).
807
+ The stage table moved to `/think 자세히` (the default at developer level).
633
808
 
634
809
  ```
635
810
  $ /think 자세히
@@ -646,373 +821,412 @@ $ /think 자세히
646
821
  컨텍스트 40,960 · 지금 찬 양 2,087
647
822
  ```
648
823
 
649
- 마지막에서 번째 줄이 있는 이유: **세 값이 같을 그게 고장인지 아닌지**
650
- 줄로 갈립니다. 아는 상한이 낮으면 셋이 같아지는 것이 맞습니다.
651
- 한동안 표는 줄이 `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.
652
827
 
653
- > **자세히**컨텍스트 길이는 모델에서 긁어옵니다 · /out · 잘린 도구 호출
828
+ > **More**Context length is read off the model · /out · Truncated tool calls
654
829
  >
655
- > **[속도와 씀씀이 읽기 →](docs/ko/tuning.md#추론-강도)**
830
+ > **[Speed and spend read →](docs/en/tuning.md#reasoning-effort)**
656
831
 
657
832
  ---
658
833
 
659
- ## 자동 압축
834
+ ## Auto-compaction
660
835
 
661
- 컨텍스트가 80% 차면 앞선 대화를 **요약해서 접고 계속 이어 갑니다.**
662
- 그냥 잘라내면 모델이 하던 일을 잊고, 파일을 다시 읽고, 이미 고친 곳을 고칩니다.
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.
663
838
 
664
839
  ```
665
- 대화 44개를 요약으로 접었습니다 — 10,399 → 3,170 토큰 (70% 줄어듦)
840
+ Folded 44 turns into a summary — 10,399 → 3,170 tokens (70% smaller)
666
841
  ```
667
842
 
668
- 요약은 목표 / / 알아낸 / 정한 / 남은 다섯 항목으로 남습니다.
669
- 접을 **도구 호출과 결과가 갈라지지 않는 자리**를 골라 자릅니다 갈라지면 서버가 400 을 냅니다.
670
- 요약 요청이 실패하면 방식(그냥 줄이기)으로 물러서고 멈추지 않습니다.
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.
671
846
 
672
- `/compact` 직접 접을 수도 있습니다.
847
+ `/compact` folds on demand.
673
848
 
674
849
  ---
675
850
 
676
- ## 대화 이어하기
851
+ ## Resuming a conversation
677
852
 
678
- 터미널을 실수로 닫거나 컴퓨터가 재부팅돼도 하던 대화를 그대로 이어 받습니다.
679
- 오간 내용은 **메시지 하나가 끝날 때마다 바로** `.deel/sessions/` 적히기 때문에,
680
- 도중에 죽어도 직전까지는 남습니다.
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.
681
856
 
682
857
  ```
683
858
  $ deel sessions
684
859
 
685
- ── 폴더의 대화 ──────────────────────────────────────────────
686
- ● 20260824-090200 방금 1devstral-small-2507
687
- 테스트 깨진 고쳐줘
688
- · 20260824-084500 2시간 전 2턴 qwen2.5-coder:7b
689
- 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
690
865
  ```
691
866
 
692
- | 명령 | 하는 |
867
+ | Command | What it does |
693
868
  |---|---|
694
- | `deel --continue` | 폴더에서 가장 최근 대화 이어하기 |
695
- | `deel --resume <id>` | 골라서 이어하기 |
696
- | `deel sessions` | 남아 있는 대화 목록 |
697
- | `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 |
873
+
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.
877
+
878
+ Everything lives in `.deel/sessions/` inside the working folder, and `.gitignore`
879
+ covers `.deel/` so it never reaches a repository.
880
+
881
+ ---
882
+
883
+ ## Starting over (`deel reset`)
698
884
 
699
- 줄에 메시지 하나씩 쓰는 `jsonl` 이라, 쓰다가 전원이 나가도 마지막 줄만 잃습니다.
700
- 이어받은 대화는 도구 호출과 결과의 짝까지 그대로 살아 있어 바로 이어서 일할 있습니다.
701
- 30일이 지나고 최근 30개 밖인 것은 자동으로 정리합니다.
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.
702
888
 
703
- 저장 위치는 작업 폴더의 `.deel/sessions/` 이고, `.gitignore` 에 `.deel/` 이 들어 있어
704
- 깃에 올라가지 않습니다.
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.
705
936
 
706
937
  ---
707
938
 
708
- ## 밖에서 도구 붙이기 (MCP)
939
+ ## Attaching tools from outside (MCP)
709
940
 
710
- 사내 위키 검색기, 이슈 트래커, DB 조회기 같은 것을 팀이 MCP 서버로 만들어 두면
711
- deel 그걸 **코드를 고치고** 도구로 씁니다.
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**.
712
943
 
713
- `.deel/mcp.json` 적습니다. Claude Code 설정을 그대로 복사해 붙일 있습니다:
944
+ Configure in `.deel/mcp.json`. A Claude Code config can be copied over verbatim:
714
945
 
715
946
  ```json
716
- { "mcpServers": { "사내위키": { "command": "node", "args": ["wiki-mcp.js"] } } }
947
+ { "mcpServers": { "wiki": { "command": "node", "args": ["wiki-mcp.js"] } } }
717
948
  ```
718
949
 
719
- 모델에게는 `mcp__사내위키__검색` 이라는 이름으로 보입니다. `/mcp` 무엇이 붙었는지 봅니다.
950
+ The model sees it as `mcp__wiki__search`. `/mcp` shows what is attached.
720
951
 
721
- **의존성은 그대로 0 입니다.** stdio 규격은 자식 프로세스의 stdin/stdout 줄 단위
722
- JSON-RPC 2.0 주고받는 것이 전부라, `child_process` `JSON` 이면 됩니다. SDK
723
- 필요 없습니다.
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.
724
954
 
725
- > **자세히**다만 이건 남의 프로그램입니다
955
+ > **More**But this is somebody else's program
726
956
  >
727
- > **[늘려 쓰기 읽기 →](docs/ko/extend.md#밖에서-도구-붙이기-mcp)**
957
+ > **[Extending read →](docs/en/extend.md#attaching-tools-from-outside-mcp)**
728
958
 
729
959
  ---
730
960
 
731
- ## 에디터 안에서 쓰기 (ACP)
961
+ ## Inside your editor (ACP)
732
962
 
733
- 터미널을 하나 띄우게 하는 도구는 주쯤 뒤에 씁니다. 개발자는 하루 종일
734
- IDE 안에 있습니다. 그래서 **ACP**(Agent Client Protocol) 지킵니다 — Zed ·
735
- 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**.
736
966
 
737
- 에디터 설정에 명령 하나만 적으면 됩니다.
967
+ One command in your editor's settings:
738
968
 
739
969
  ```
740
970
  deel acp
741
971
  ```
742
972
 
743
- 에디터가 이걸 자식 프로세스로 띄우고, 표준입출력으로 단위 JSON-RPC 2.0
744
- 주고받습니다. 사람이 직접 명령은 아닙니다.
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.
745
975
 
746
- **붙으면 이렇게 됩니다.**
976
+ **What you get once it is attached:**
747
977
 
748
- | 에디터 | deel |
978
+ | In the editor | From deel |
749
979
  |---|---|
750
- | 답이 흘러나오는 자리 | 모델이 흘리는 · 생각 |
751
- | 도구 목록 (아이콘·상태) | `Read` 읽기, `Edit` 고치기, `Bash` 실행**갈래를 붙여** 보냅니다 |
752
- | 파일 링크 | 고친 파일의 **절대 경로**. 눌러서 자리로 갑니다 |
753
- | 승인 | deel 안전망이 그대로 에디터 창으로 뜹니다 (`이번만` · `앞으로 묻지 않기` · `안 함`) |
754
- | 모드 고르개 | deel 작업 모드 7개 (`종합` · `코드` · `계획` · `설계` · `디버그` · `묻기` · `총괄`) |
755
- | 멈춤 단추 | 도중에 닿습니다 답을 기다리는 중에도 |
756
- | 지난 대화 | 껐다 켜도 그대로 열립니다. 터미널과 **같은 자리**에 남아서, 에디터에서 하던 것을 `deel --resume` 으로 이어받는 것도 됩니다 |
757
-
758
- **의존성은 그대로 0 입니다.** MCP 같은 이유입니다 단위 JSON-RPC 2.0
759
- 전부라 SDK 필요 없습니다.
760
-
761
- > **자세히**조용히 깨지는 자리들
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
762
992
  >
763
- > **[늘려 쓰기 읽기 →](docs/ko/extend.md#에디터-안에서-쓰기-acp)**
993
+ > **[Extending read →](docs/en/extend.md#inside-your-editor-acp)**
764
994
 
765
995
  ---
766
996
 
767
- ## 비밀이 새지 않게
997
+ ## Keeping secrets out of the conversation
768
998
 
769
- 사람이 열쇠를 붙여 넣는 일은 드뭅니다. 새는 자리는 거의 항상 **명령 출력**입니다.
999
+ People rarely paste a key. The leak is almost always **command output**.
770
1000
 
771
1001
  ```
772
1002
  env OPENAI_API_KEY=sk-proj-…
773
- git remote -v https://사람:토큰@github.com/…
1003
+ git remote -v https://user:token@github.com/…
774
1004
  curl -v > Authorization: Bearer eyJ…
775
- 검사 실패 로그 연결 문자열이 통째로
1005
+ a failing test log the whole connection string
776
1006
  ```
777
1007
 
778
- 글은 모델에게 실려 가고, **동시에** `.deel/sessions/*.jsonl` 디스크에
779
- 적힙니다. 파일은 나중에 `/recall` 다시 읽히고 `deel pack` 딸려 수도
780
- 있습니다. 새면 여러 벌이 됩니다.
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.
781
1011
 
782
- 그래서 도구 결과가 대화로 들어가는 **한 자리**에서 가립니다.
1012
+ So it is masked at the single point where tool output enters the conversation.
783
1013
 
784
1014
  ```
785
- ⏺ Bash(env | grep API) 완료
786
- 비밀로 보이는 2군데가 대화에 들어갔습니다 (openai · 환경변수) — 모델에 가려서 보냈습니다
1015
+ ⏺ Bash(env | grep API) done
1016
+ 2 secret-looking values entered the conversation (openai · env var) — masked before the model
787
1017
  ```
788
1018
 
789
- 찾는 것: 사설키 블록 · OpenAI/Anthropic 열쇠 · GitHub 토큰 · Slack 토큰 ·
790
- AWS · Google · JWT · 주소에 박힌 열쇠 · `Authorization` 계열 헤더 ·
791
- 이름이 `…KEY`/`…TOKEN`/`…SECRET`/`…PASSWORD` 환경변수. 그리고 **설정에
792
- 게이트웨이 열쇠는 모양과 상관없이**그건 짐작이 아니라 아는 값이니까요.
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.
793
1023
 
794
- ### 파일 내용은 일부러 가립니다
1024
+ ### File contents are deliberately not masked
795
1025
 
796
- 가리고 싶은 마음이 제일 드는 자리가 `.env` 인데, 거기를 가리면 이렇게 됩니다
797
- 모델이 가려진 글을 보고, 그걸 고쳐서 되돌려 씁니다. 그러면 진짜 열쇠가 있던
798
- 자리에 `«가림»` 적힙니다. **비밀을 지키려다 사람의 열쇠를 우리 손으로
799
- 지우는 셈입니다.**
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.**
800
1029
 
801
- 그래서 파일 쪽은 가리는 대신 **알립니다.**
1030
+ So on the file side it reports instead of rewriting.
802
1031
 
803
1032
  ```
804
- ⏺ Read(.env) 12
805
- ! 비밀로 보이는 3군데가 대화에 들어갔습니다 (환경변수)
806
- 파일 내용은 가리지 않습니다 (가리면 되돌려 지워집니다)
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)
807
1036
  ```
808
1037
 
809
- 무엇을 막는지 분명히 말하는 편이, 막았다고 놓고 파일을 망가뜨리는 것보다
810
- 언제나 낫습니다. 어느 쪽이든 감사기록에 남습니다.
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.
811
1040
 
812
1041
  ---
813
1042
 
814
- ## 안전망
1043
+ ## Safety
815
1044
 
816
- 승인 프롬프트 대신 **되돌릴 있게** 만들었습니다. 기본 모드 `auto` 는 묻지 않고 알아서 합니다.
1045
+ Instead of approval prompts, the design makes things **reversible**. The default `auto` mode
1046
+ does not ask.
817
1047
 
818
- | 장치 | 내용 |
1048
+ | Mechanism | Detail |
819
1049
  |---|---|
820
- | **되돌리기** | 파일을 고치기 항상 스냅샷. `/undo` 단위 복구. **`Bash` 옮기고 지우는 것도 포함** |
821
- | **바뀐 자리 보기** | 고칠 때마다 바뀐 줄을 화면에. 이번 대화 전체는 `/diff` |
822
- | **작업 범위** | 시작한 폴더 밖은 모델이 시켜도 거부 |
823
- | **위험 명령 차단** | 되돌릴 없는 것만 (디스크 포맷, 재귀 삭제, `--force` 푸시 등) |
824
- | **재실행 금지** | 변경성 명령은 실패해도 다시 실행하지 않음 번 돌면 사고 |
825
- | **중단** | Ctrl+C 도중에 끊어도 대화가 성한 채로 남음 |
826
- | **헛돌기 차단** | 같은 도구가 같은 이유로 3번 실패하면 턴을 멈추고 왜인지 말함 |
827
- | **안 읽는 자리** | 남의 도구 살림과 deel 자신의 기록·설정(열쇠) 거절 |
828
- | **감사 로그** | `.deel/audit.jsonl` 에 전부 기록 |
829
-
830
- | 모드 | 언제 물어보나 |
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 |
831
1061
  |---|---|
832
- | `auto` (기본) | 물어봄. 되돌리기가 안전망 |
833
- | `confirm` | 되돌릴 없는 명령만 |
834
- | `strict` | 파일 변경·명령 전부 |
1062
+ | `auto` (default) | Never undo is the safety net |
1063
+ | `confirm` | Irreversible commands only |
1064
+ | `strict` | All file changes and commands |
835
1065
 
836
- 되돌리기 이력은 파일 내용을 통째로 담기 때문에 파일을 여러 고치면 금방 커집니다.
837
- 32MB 넘으면 **최근 50턴만 남기고** 오래된 것을 버립니다. 방금 일은 언제나
838
- 되돌릴 있고, 지금 이력이 얼마나 되는지는 `/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.
839
1069
 
840
- > **자세히** — Bash 사라진 것도 되돌아갑니다 · 읽는 자리
1070
+ > **More**Files removed through Bash come back too · What it will not read
841
1071
  >
842
- > **[안전망과 사내 반입 읽기 →](docs/ko/safety.md#안전망)**
1072
+ > **[Safety and corporate review read →](docs/en/safety.md#safety)**
843
1073
 
844
1074
  ---
845
1075
 
846
- ## 사내 반입
847
-
848
- 심사서와 소스를 zip 하나로 묶습니다.
1076
+ ## Corporate review package
849
1077
 
850
1078
  ```bash
851
- deel pack --out deel-반입.zip
1079
+ deel pack --out deel-import.zip
852
1080
  ```
853
1081
 
854
1082
  ```
855
- ── 반입 묶음 ───────────────────────────────────────────────────
856
- deel-반입.zip
857
- 94개 파일 · 509.6KB
858
-
859
- 의존성 0개
860
- 설치 스크립트 없음
861
- 외부 import 0건
862
- 네트워크 호출 3곳 (설정한 주소로만)
863
- 포트 열기 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)
864
1091
  ```
865
1092
 
866
- zip 안에는 **사람이 읽을 장, 기계가 읽을 장**이 같이 들어갑니다.
867
- 반입 심사는 사람만 보는 절차가 아니기 때문입니다 보안팀은 SBOM 스캐너에
868
- 먹여 취약점 목록을 뽑고, 운영팀은 감사 사양을 보고 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.
869
1096
 
870
- | 파일 | 무엇 |
1097
+ | File | What |
871
1098
  |---|---|
872
- | `반입심사서.txt` | 의존성 · 설치 스크립트 · **소스를 훑어 찾은 네트워크·외부 명령 호출 자리 전부**(파일:줄) · 나가는 갈래 · 파일별 SHA-256 |
873
- | `sbom.cdx.json` | **SBOM (CycloneDX 1.5).** 스캐너에 그대로 넣습니다. 파일마다 부품 하나에 SHA-256, 의존성은 **빈 배열로 명시** 적어 것과 없는 것은 다릅니다 |
874
- | `심사명세.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 |
875
1102
 
876
1103
  ```bash
877
- deel audit # 사람이 읽는 심사서만 보기
878
- deel sbom # 기계가 읽는 장을 표준출력으로 (deel sbom | jq)
879
- deel sbom --out 심사.json # 파일로
880
- 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
881
1108
  ```
882
1109
 
883
- 손으로 적지 않고 코드가 소스를 훑어서 만듭니다손으로 적으면 언젠가
884
- 사실과 어긋나고, **어긋난 심사 서류는 없느니만 못합니다.** 담당자가 틀린
885
- 것을 발견하면 나머지도 믿습니다. 감사기록 사양만은 손으로 적혀 있어서,
886
- 그것이 진짜 기록과 어긋나지 않는지를 검사가 매번 대조합니다.
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.
887
1114
 
888
- > **자세히**사내 게이트웨이 진단
1115
+ > **More**Diagnosing a corporate gateway
889
1116
  >
890
- > **[안전망과 사내 반입 읽기 →](docs/ko/safety.md#사내-반입)**
1117
+ > **[Safety and corporate review read →](docs/en/safety.md#corporate-review-package)**
891
1118
 
892
1119
  ---
893
1120
 
894
- ## 설정
1121
+ ## Configuration
895
1122
 
896
- `~/.deel/config.json` 저장됩니다. 프로젝트 폴더에 `.deel/config.json` 있으면 그쪽이 우선입니다.
1123
+ Stored in `~/.deel/config.json`. A `.deel/config.json` in the project folder takes precedence.
897
1124
 
898
- > **자세히**붙는 서버 · 환경변수 · 실행 옵션 · 프로젝트 규칙
1125
+ > **More**Supported servers · Environment variables · Flags · Project rules
899
1126
  >
900
- > **[설정 읽기 →](docs/ko/config.md#설정)**
1127
+ > **[Configuration read →](docs/en/config.md#configuration)**
901
1128
 
902
1129
  ---
903
1130
 
904
- ## 문제 해결
1131
+ ## Troubleshooting
905
1132
 
906
- | 증상 | 확인할 |
1133
+ | Symptom | Check |
907
1134
  |---|---|
908
- | `주소를 찾을 없습니다` | 주소 오타, DNS, 사내망 접속 여부 |
909
- | `연결이 거부되었습니다` | 서버가 꺼져 있거나 포트가 다름 |
910
- | `인증서 문제` | `set NODE_EXTRA_CA_CERTS=C:\경로\사내CA.pem` |
911
- | 프록시를 거쳐야 | `set HTTPS_PROXY=http://프록시:포트` (인증은 `http://user:pw@프록시:포트`). 화면과 `/status` `프록시 …` 뜨면 거치는 것. 거칠 곳은 `NO_PROXY=.corp.com,10.1.2.3`, 아예 끄려면 설정에 `"proxy": "none"` |
912
- | 프록시가 407 | 프록시 주소에 `user:pw@` 넣으세요. NTLM · Negotiate 받는 프록시는 씁니다 담당자에게 Basic 이나 인증 없는 주소를 문의 |
913
- | 401 / 403 | 키가 틀렸거나 인증 헤더 형식이 다름 (4가지를 자동 시도합니다) |
914
- | `허용되지 않은 주소입니다` | 자물쇠가 막은 것. 정상입니다 — `/model` 로 연결을 고르세요 |
915
- | 도구 호출이 먹음 | `deel diagnose` 판정을 보세요. 작은 모델(1B~3B) 자주 합니다 |
916
- | 대답이 비어 있음 | 스트리밍을 무시하는 서버입니다. 번은 저절로 다시 부르고, 그래도 비면 대화에서는 스트리밍을 끕니다 |
917
- | 파일이 중간에 끊김 | `/out` 으로 지금 상한을 보고 올리세요. 상한을 몰라 16,384 있을 있습니다 |
918
- | `HTTP 400` | 서버가 보낸 문장을 그대로 보여 줍니다. 길이 문제면 숫자를 읽어 저절로 맞춥니다 |
919
- | `429` · `503` | 게이트웨이가 잠깐 막은 것입니다. 번까지 저절로 기다렸다 다시 부릅니다(`Retry-After` 를 지킵니다). 그래도 계속 뜨면 할당량을 보세요 |
920
- | `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` |
921
1148
 
922
1149
  ---
923
1150
 
924
- ## 개발
1151
+ ## Development
925
1152
 
926
1153
  ```bash
927
- npm test 전체 검증 (4,932항목)
928
- npm run coverage 검사가 소스의 어디를 밟았는지
929
- npm run verify 반입·통신 검증만
930
- npm run bench 편집 성공률 측정
931
- npm run demo 화면이 어떻게 보이는지 실제로 돌려 보기
932
- 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
933
1160
  ```
934
1161
 
935
- 검증은 **가짜 게이트웨이**를 띄워서 합니다. 실제 모델 없이 규격 그대로
936
- 루프·스트리밍·도구 실행·되돌리기·압축을 결정적으로 확인합니다.
937
- zip 은 진짜 `unzip` 으로, tar 진짜 `tar` 만든 것을 읽혀 교차 확인합니다.
938
-
939
- `npm test` 는 파일을 하나씩 돌리고 **파일별 종료코드**를 표로 남깁니다.
940
- 화면의 통과 표시가 아니라 종료코드가 CI 가 보는 값이기 때문입니다. 둘은
941
- 갈라질 수 있습니다 — 검사를 다 통과하고도 끝낼 때 죽으면 화면은 초록인데
942
- 종료코드는 1 입니다. 실제로 윈도우에서 그렇게 한 번 놓쳤습니다.
943
- 첫 실패에서 멈추지 않고 끝까지 돌기 때문에, 한 번 돌리면 전부 알 수 있습니다.
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`.
944
1165
 
945
- ```
946
- ────────────────────────────────────────────────────────────
947
- 검사 파일 종료코드 통과 실패 시간
948
- ────────────────────────────────────────────────────────────
949
- smoke.js 0 20 0 0.2초
950
- ✗ scan.test.js 1 19 0 0.2초
951
- ────────────────────────────────────────────────────────────
952
-
953
- ✗ scan.test.js — 종료코드 1
954
- 검사는 전부 통과했는데 종료코드만 1 입니다 —
955
- 끝낼 때 남은 핸들·처리 안 된 거절 때문입니다.
956
- ```
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.
957
1171
 
958
- | 검증 | 항목 | 무엇을 |
1172
+ | Suite | Checks | Covers |
959
1173
  |---|---|---|
960
- | `smoke` | 20 | 도구·작업범위·되돌리기·감사로그 |
961
- | `loop` | 16 | 에이전트 루프·스트리밍·도구 호출 |
962
- | `guard` | 24 | **안 하는 자리**거부·모르는 도구·두 실행·범위 |
963
- | `network` | 30 | 정해진 자리 밖으로 새지 않는가 |
964
- | `web` | 25 | 읽기가 읽기만 하는가 |
965
- | `abort` · `steer` | 16 · 15 | Ctrl+C 끊어도 대화가 성한가 · 도중에 말이 다음 부름에 실리는가 |
966
- | `parallel` | 23 | 읽기만 동시에 도는가 · 일 목록 |
967
- | `cli` | 75 | **진짜 `deel` 띄워** 끝까지 돌려 본다 |
968
- | `setup` | 42 | 실행 마법사 (가짜 TTY 사람처럼 입력) |
969
- | `detect` | 66 | 주소 줄로 규격·인증을 짚어내는가 |
970
- | `modes` · `route` | 89 · 33 | 작업 모드 · 종합에서 알맞은 모드로 옮겨 가는가 |
971
- | `ctxsize` | 43 | 모델에 걸린 컨텍스트 길이를 긁어오는가 |
972
- | `commands` · `commands-more` | 128 · 62 | 슬래시 명령 전부 |
973
- | `ui` · `ui2` | 60 · 40 | 암호 가림·한글 폭·상태줄·대화 목록·엑셀→글 |
974
- | `encoding` · `xlsx` | 68 · 72 | 한글 인코딩 판별 · 엑셀 읽기 |
975
- | `compact` | 21 | 요약 압축·짝 깨짐·실패 물러섬 |
976
- | `store` | 34 | 대화 저장·이어하기·중간에 죽어도 복구 |
977
- | `scan` | 29 | 여러 런타임을 구분해 찾는가 |
978
- | `plugins` | 38 | 플러그인 받기·묶기·ZIP/TAR |
979
- | `no-bundle` | 12 | 배포 묶음에 남의 것이 섞였는가 · 검사 파일 위생 |
980
- | `edit-bench` | 20 | 편집 성공률 |
981
-
982
- > **자세히**어디를 밟았는지 · 폴더 구조
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
983
1197
  >
984
- > **[개발 읽기 →](docs/ko/develop.md#개발)**
1198
+ > **[Development read →](docs/en/develop.md#development)**
985
1199
 
986
1200
  ---
987
1201
 
988
- ## 릴리스 노트
1202
+ ## Release notes
989
1203
 
990
- | | 무엇이 바뀌었나 |
1204
+ | Version | What changed |
991
1205
  |---|---|
992
- | **[1.6.3](docs/ko/releases.md#163)** | 일이 되고 있는데 헛돈다고 끊던 자리배열로 옮기면 무엇이 움직였는지가 사라졌다 |
993
- | **[1.6.2](docs/ko/releases.md#162)** | 누르면 멈추고, 시킨 대로 하고, 끊긴다 ESC · 되묻기 · 요청 누락 · 붙여넣기 접기 · 끊긴 자리 잇기 |
994
- | **[1.6.1](docs/ko/releases.md#161)** | 헛도는 턴을 만들던 자리들울타리가 `/dev/null` 까지 막던 · 문서를 읽던 것 · 파일에서 그림이 사라지던 |
995
- | **[1.6.0](docs/ko/releases.md#160)** | 사내망에서 되던 것들프록시 · 429 · 윈도우 · 5만 저장소 · PDF · 캡처 붙여넣기 · 에디터 이어하기 |
996
- | **[1.5.8](docs/ko/releases.md#158)** | 5MB 문서를 919줄 8줄만 보던 · 정규식을 경로로 읽어 명령을 막던 |
997
- | **[1.5.7](docs/ko/releases.md#157)** | 한글 폴더에서 파일이 「범위 밖」이던 · 붙여넣기 · ESC |
998
- | **[1.5.6](docs/ko/releases.md#156)** | 막히면 물어본다글로 묻고 턴을 끝내는 대신에 |
999
- | **[1.5.5](docs/ko/releases.md#155)** | 계획을 세우면 방이 찬다「한 명뿐」은 고정이 아니라 버그였다 |
1000
- | [1.5.4](docs/ko/releases.md#154) | 방에 하루가 흐른다아침·낮·노을·밤 · 벽시계 · 식은 커피 |
1001
- | [1.5.3](docs/ko/releases.md#153) | 맥에서 걸린 가지줄바꿈 안내 · 사무실이 사라짐 · `/motion` 하나로 |
1002
- | [1.5.2](docs/ko/releases.md#152) | 적대적 리뷰가 남긴 나머지를 전부 정리했다화면이 거짓말하던 자리들 |
1003
- | [1.5.1](docs/ko/releases.md#151) | 1.5.0 넣은 개가 망가진 채 나갔다. 그것을 고친다 |
1004
- | [1.5.0](docs/ko/releases.md#150) | 줄바꿈이 생겼고, 화면이 재미있어졌고, 그러면서 오히려 가벼워졌다 |
1005
- | [1.4.3](docs/ko/releases.md#143) | README 다른지 말하고, 심사서의 빠진 줄을 채운다 |
1006
- | [1.4.2](docs/ko/releases.md#142) | 1.4.1 보안 수정 전에 나갔다그걸 바로잡는 |
1007
- | [1.4.1](docs/ko/releases.md#141) | 기능 없이, 실제로 찾은 것만 고친다윈도우 abort·ReDoS·XSS |
1008
- | [1.4.0](docs/ko/releases.md#140) | deel 얼굴을 갖고, 영어로도 말하고, 뜻까지 본다열한 자리 |
1009
- | [1.3.0](docs/ko/releases.md#130) | 대신 증거, 터미널 대신 에디터여섯 자리 |
1010
- | [1.2.0](docs/ko/releases.md#120) | 대화가 끊기지 않게여섯 자리 |
1011
-
1012
- 무엇이 바뀌었는지는 **[릴리스 노트](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 meaningeleven 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 break six places |
1225
+
1226
+ What changed and why is in the **[release notes](docs/en/releases.md)**.
1013
1227
 
1014
1228
  ---
1015
1229
 
1016
- ## 라이선스
1230
+ ## Licence
1017
1231
 
1018
1232
  [MIT](LICENSE)