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