deel-local-cli 1.20.12 → 2.0.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 (155) hide show
  1. package/README.ko.md +96 -77
  2. package/README.md +119 -80
  3. package/bin/deel.js +398 -32
  4. package/package.json +2 -1
  5. package/src/acp/jsonrpc.js +87 -7
  6. package/src/acp/map.js +62 -13
  7. package/src/acp/serve.js +338 -30
  8. package/src/agent/agents.js +110 -12
  9. package/src/agent/askcheck.js +50 -6
  10. package/src/agent/asks.js +59 -5
  11. package/src/agent/budget.js +9 -2
  12. package/src/agent/card.js +8 -2
  13. package/src/agent/commit.js +168 -16
  14. package/src/agent/compact.js +93 -21
  15. package/src/agent/{/354/213/240/353/242/260/353/217/204.js → confidence.js} +1 -1
  16. package/src/agent/effort.js +85 -15
  17. package/src/agent/evidence.js +63 -7
  18. package/src/agent/evolve.js +132 -24
  19. package/src/agent/grade.js +12 -3
  20. package/src/agent/loop.js +408 -81
  21. package/src/agent/memory.js +176 -29
  22. package/src/agent/mention.js +22 -5
  23. package/src/agent/models.js +31 -7
  24. package/src/agent/modes.js +25 -10
  25. package/src/agent/outschema.js +381 -56
  26. package/src/agent/pins.js +33 -2
  27. package/src/agent/project.js +73 -8
  28. package/src/agent/recall.js +40 -9
  29. package/src/agent/{/354/204/261/355/225/234/352/270/260/353/241/235.js → recordshape.js} +19 -8
  30. package/src/agent/review.js +143 -13
  31. package/src/agent/route.js +506 -32
  32. package/src/agent/salvage.js +2 -1
  33. package/src/agent/session.js +457 -31
  34. package/src/agent/store.js +232 -22
  35. package/src/agent/threads.js +52 -3
  36. package/src/backend/adapter.js +508 -85
  37. package/src/backend/azure.js +12 -1
  38. package/src/backend/cachemark.js +31 -5
  39. package/src/backend/clientcert.js +23 -1
  40. package/src/backend/ctxsize.js +56 -9
  41. package/src/backend/detect.js +252 -19
  42. package/src/backend/http.js +383 -42
  43. package/src/backend/learn.js +101 -11
  44. package/src/backend/mcp.js +333 -24
  45. package/src/backend/price.js +61 -13
  46. package/src/backend/probe.js +188 -36
  47. package/src/backend/proxy.js +108 -14
  48. package/src/backend/quota.js +226 -30
  49. package/src/backend/retry.js +46 -3
  50. package/src/backend/scan.js +47 -10
  51. package/src/backend/scanui.js +57 -7
  52. package/src/backend/toolfit.js +204 -22
  53. package/src/backend/vision.js +14 -1
  54. package/src/backend/wire.js +58 -10
  55. package/src/cmdnames.js +16 -0
  56. package/src/commands/common.js +70 -0
  57. package/src/commands/extend.js +300 -0
  58. package/src/commands/model.js +852 -0
  59. package/src/commands/view.js +328 -0
  60. package/src/commands/work.js +823 -0
  61. package/src/commands.js +193 -2082
  62. package/src/completion.js +45 -3
  63. package/src/config.js +452 -39
  64. package/src/configexplain.js +125 -14
  65. package/src/doctor.js +164 -26
  66. package/src/i18n/en.js +22 -0
  67. package/src/i18n/index.js +31 -1
  68. package/src/i18n/ja.js +25 -1
  69. package/src/i18n/ko.js +25 -2
  70. package/src/i18n/zh.js +25 -1
  71. package/src/lsp/client.js +111 -9
  72. package/src/lsp/servers.js +86 -22
  73. package/src/oneshot.js +325 -65
  74. package/src/pack/sbom.js +28 -5
  75. package/src/pack/selfpack.js +54 -5
  76. package/src/pack/sheet.en.js +24 -3
  77. package/src/pack/tar.js +45 -8
  78. package/src/pack/zip.js +103 -8
  79. package/src/plugins/manage.js +165 -14
  80. package/src/preview/serve.js +239 -23
  81. package/src/providers/bedrock.js +30 -5
  82. package/src/providers/gemini.js +8 -0
  83. package/src/providers/index.js +17 -1
  84. package/src/repl.js +254 -61
  85. package/src/report.js +7 -2
  86. package/src/reset.js +151 -25
  87. package/src/safety/audit.js +108 -8
  88. package/src/safety/authcmd.js +75 -5
  89. package/src/safety/guard.js +507 -15
  90. package/src/safety/hooks.js +172 -20
  91. package/src/safety/keystore.js +178 -18
  92. package/src/safety/network.js +209 -6
  93. package/src/safety/policy.js +377 -36
  94. package/src/safety/runmode.js +9 -2
  95. package/src/safety/secrets.js +243 -17
  96. package/src/safety/shellenv.js +64 -3
  97. package/src/safety/trust.js +298 -32
  98. package/src/safety/undo.js +409 -17
  99. package/src/setup.js +175 -17
  100. package/src/skills/discover.js +122 -19
  101. package/src/stats.js +57 -16
  102. package/src/tools/{/355/231/225/354/235/270/353/262/225.js → checkmethods.js} +26 -1
  103. package/src/tools/clipboard.js +53 -20
  104. package/src/tools/convert.js +118 -37
  105. package/src/tools/desc.en.js +48 -5
  106. package/src/tools/doc2md.js +11 -1
  107. package/src/tools/docs.js +94 -18
  108. package/src/tools/edit-match.js +212 -13
  109. package/src/tools/encoding.js +525 -28
  110. package/src/tools/excel-com.js +63 -15
  111. package/src/tools/excel.js +12 -7
  112. package/src/tools/fastgrep.js +444 -36
  113. package/src/tools/fig.js +40 -9
  114. package/src/tools/fsutil.js +235 -21
  115. package/src/tools/hwpxwrite.js +80 -19
  116. package/src/tools/ignore.js +55 -7
  117. package/src/tools/index.js +1029 -145
  118. package/src/tools/jobs.js +325 -50
  119. package/src/tools/kiwi.js +50 -5
  120. package/src/tools/lsp.js +164 -32
  121. package/src/tools/outline.js +52 -12
  122. package/src/tools/pdf.js +366 -56
  123. package/src/tools/shell.js +12 -4
  124. package/src/tools/spawn.js +203 -18
  125. package/src/tools/todo.js +73 -4
  126. package/src/tools/verify.js +312 -43
  127. package/src/tools/webfetch.js +184 -25
  128. package/src/tools/xlsx.js +232 -31
  129. package/src/ui/ansi.js +209 -15
  130. package/src/ui/banner.js +2 -1
  131. package/src/ui/complete.js +46 -4
  132. package/src/ui/diff.js +4 -2
  133. package/src/ui/export.js +91 -17
  134. package/src/ui/inputbox.js +58 -18
  135. package/src/ui/intro.js +9 -2
  136. package/src/ui/level.js +32 -7
  137. package/src/ui/md.js +101 -15
  138. package/src/ui/motion.js +5 -2
  139. package/src/ui/notify.js +7 -1
  140. package/src/ui/office.js +37 -5
  141. package/src/ui/pastechip.js +3 -2
  142. package/src/ui/pick.js +85 -12
  143. package/src/ui/prompt.js +176 -13
  144. package/src/ui/screen.js +2 -1
  145. package/src/ui/spinner.js +6 -1
  146. package/src/ui/status.js +80 -12
  147. package/src/ui/wrap.js +23 -37
  148. /package/src/agent/{/353/213/250/352/263/204.js" → phase.js} +0 -0
  149. /package/src/skills/builtin/{/352/271/212/354/235/264/354/236/210/352/262/214-/353/247/214/353/223/244/352/270/260/SKILL.md" → build-deep/SKILL.md} +0 -0
  150. /package/src/skills/builtin/{/354/260/250/352/267/274/354/260/250/352/267/274-/353/224/224/353/262/204/352/271/205/SKILL.md" → debug-step-by-step/SKILL.md} +0 -0
  151. /package/src/skills/builtin/{/353/201/235/352/271/214/354/247/200-/355/225/230/352/270/260/SKILL.md" → finish-all/SKILL.md} +0 -0
  152. /package/src/skills/builtin/{/354/212/244/354/212/244/353/241/234-/352/262/200/355/206/240/SKILL.md" → self-review/SKILL.md} +0 -0
  153. /package/src/skills/builtin/{/354/275/224/353/223/234-/354/244/204/354/235/264/352/270/260/SKILL.md" → simplify-code/SKILL.md} +0 -0
  154. /package/src/skills/builtin/{/354/260/224/353/237/254/353/263/264/352/270/260/SKILL.md" → spike/SKILL.md} +0 -0
  155. /package/src/skills/builtin/{/352/262/200/354/202/254-/353/250/274/354/240/200/SKILL.md" → test-first/SKILL.md} +0 -0
package/README.md CHANGED
@@ -20,7 +20,7 @@ Vendor APIs connect too — **only when you say so**
20
20
 
21
21
  [![Node.js CI](https://img.shields.io/github/actions/workflow/status/jysvai/deel-local-cli/test.yml?branch=main&logo=github&logoColor=white&label=Node.js%20CI)](https://github.com/jysvai/deel-local-cli/actions/workflows/test.yml)
22
22
  [![CodeQL](https://img.shields.io/github/actions/workflow/status/jysvai/deel-local-cli/codeql.yml?branch=main&logo=github&logoColor=white&label=CodeQL)](https://github.com/jysvai/deel-local-cli/actions/workflows/codeql.yml)
23
- [![tests](https://img.shields.io/badge/tests-10%2C125%20passing-1a7f37?logo=checkmarx&logoColor=white)](docs/en/develop.md)
23
+ [![tests](https://img.shields.io/badge/tests-13%2C900%20passing-1a7f37?logo=checkmarx&logoColor=white)](docs/en/develop.md)
24
24
 
25
25
  [![dependencies](https://img.shields.io/badge/dependencies-0-1a7f37)](https://www.npmjs.com/package/deel-local-cli?activeTab=dependencies)
26
26
  [![ESM](https://img.shields.io/badge/ESM-Node%2020%2B-5FA04E?logo=javascript&logoColor=white)](package.json)
@@ -106,6 +106,14 @@ deel # start working in the current folder
106
106
  No account, no sign-up, no telemetry. If you already run Ollama or LM Studio,
107
107
  `deel setup` finds it — `deel scan` lists every local runtime and model on the machine.
108
108
 
109
+ Routing picks the mode, the mode decides which tools the model is even shown, and every
110
+ tool call has to pass the mode gate and the approval gate before anything happens:
111
+
112
+ <picture>
113
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/fig-flow-en-dark.svg">
114
+ <img alt="How one message travels through deel: what you type, routing, the mode's tool list, the model, then the mode gate and the approval gate, the tool run, Verify, and the answer — with results looping back to the model up to the step ceiling" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/fig-flow-en-light.svg" width="760">
115
+ </picture>
116
+
109
117
  ---
110
118
 
111
119
  <details>
@@ -155,7 +163,7 @@ This page is the **summary**. Each section links to the detail behind it.
155
163
  | [Speed and spend](docs/en/tuning.md) | Per-stage effort · the prefix cache · context length |
156
164
  | [Safety and corporate review](docs/en/safety.md) | Undo · working scope · audit log · the review package |
157
165
  | [Configuration](docs/en/config.md) · [Development](docs/en/develop.md) | Env vars · run flags · running the tests · folder layout |
158
- | [Release notes](docs/en/releases.md) | [1.16.x](docs/en/releases/1.16.md) · [1.15.x](docs/en/releases/1.15.md) · [1.14.x](docs/en/releases/1.14.md) · [1.13.x](docs/en/releases/1.13.md) · [1.12.x](docs/en/releases/1.12.md) · [1.10.x](docs/en/releases/1.10.md) · [1.9.x](docs/en/releases/1.9.md) · [older](docs/en/releases.md) |
166
+ | [Release notes](docs/en/releases.md) | [1.16.x](docs/en/releases/1.x.md#116x) · [1.15.x](docs/en/releases/1.x.md#115x) · [1.14.x](docs/en/releases/1.x.md#114x) · [1.13.x](docs/en/releases/1.x.md#113x) · [1.12.x](docs/en/releases/1.x.md#112x) · [1.10.x](docs/en/releases/1.x.md#110x) · [1.9.x](docs/en/releases/1.x.md#19x) · [older](docs/en/releases.md) |
159
167
 
160
168
  ---
161
169
 
@@ -272,8 +280,10 @@ What you see on screen does not have to. Four screen languages ship: **한국어
272
280
  > strings that made it *into* the table, and for a long time the tool result summaries and the
273
281
  > thinking indicator never did. So a test starts deel in each language and reads the screen:
274
282
  > `test/langleak.test.js` starts deel on ten screens — six inside the chat REPL and four that
275
- > argv reaches on its own (`--help`, `status`, `sessions`, `reset`) — and fails if a Korean
276
- > character shows up on an English one. It also fails on `1 files`, and on a stray `·` left dangling at the end of a line.
283
+ > argv reaches on its own (`--help`, `status`, `sessions`, `reset`). On the six chat screens a
284
+ > single Korean character fails the test. The four outside the chat still have Korean left, so
285
+ > they are pinned to a number that may only go down — 95 lines today, and `--help` is 73 of them.
286
+ > It also fails on `1 files`, and on a stray `·` left dangling at the end of a line.
277
287
 
278
288
  ```bash
279
289
  DEEL_LANG=en deel # this run only (also ja, zh)
@@ -346,6 +356,11 @@ A coding agent ships your whole source to a model. **The address is everything.*
346
356
  Rather than promising in prose, the code enforces it: `src/safety/network.js` checks every request
347
357
  and never builds one for an address that is not on the allow-list.
348
358
 
359
+ <picture>
360
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/fig-trust-en-dark.svg">
361
+ <img alt="Where your text can go: your working folder and .deel/ stay inside this machine, and only four paths cross the line — the model gateway, WebFetch, plugin downloads and MCP servers. The key, the audit log, the undo history and your conversations never cross it, and sealed mode locks the last three" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/fig-trust-en-light.svg" width="900">
362
+ </picture>
363
+
349
364
  ```
350
365
  [A] Model gateway ────── the only path your source travels
351
366
  One address, set in `setup`. Switching models closes the previous one.
@@ -374,7 +389,7 @@ deel --offline
374
389
  The destination is printed at the top of every session:
375
390
 
376
391
  ```
377
- deel 1.20.12 ⌂ inside
392
+ deel 2.0.0 ⌂ inside
378
393
  Sends to this machine 127.0.0.1:11434 ← nowhere else
379
394
  ```
380
395
 
@@ -400,7 +415,7 @@ leaves the company."
400
415
  Nothing is collected or transmitted. No telemetry, no usage stats, no crash reporting.
401
416
  Conversation history, undo snapshots and config live only in `.deel/` inside your working folder.
402
417
 
403
- > Verified by 186 checks in `npm test` (network + web + mcp), including bringing up a real
418
+ > Verified by 350 checks in `npm test` (network + web + mcp), including bringing up a real
404
419
  > server and confirming that **not a single request reaches it** when it is not allow-listed,
405
420
  > and that an MCP server **never starts** under `--offline`.
406
421
 
@@ -441,7 +456,7 @@ So an unrecognized key is never guessed at; you are asked.
441
456
 
442
457
  Bedrock asks for a region — five including Seoul (`ap-northeast-2`), plus
443
458
  "enter it yourself." Claude has a different wire shape, absorbed in six places
444
- ([1.7.0 release notes](docs/en/releases/1.7.md#170)).
459
+ ([1.7.0 release notes](docs/en/releases/1.x.md#170)).
445
460
 
446
461
  ### Going outside masks secrets in file contents too
447
462
 
@@ -539,6 +554,7 @@ $ deel scan
539
554
  | `deel scan --save` | Register everything found |
540
555
  | `deel scan --ports 9000,9100` | Extra ports to probe |
541
556
  | `deel scan --host <addr>` | Defaults to `127.0.0.1` |
557
+ | `deel scan --key <key>` | For a local server that wants a key |
542
558
 
543
559
  Switch with `/model` mid-conversation — **the conversation carries over.**
544
560
 
@@ -656,6 +672,11 @@ Hand a small model 400 steps and it just runs on past the point where its window
656
672
  In read-only modes, `Write`, `Edit` and `Bash` are **never sent to the model at all.**
657
673
  It is not asked politely not to edit — models forget requests. A tool that isn't there can't be used.
658
674
 
675
+ <picture>
676
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/fig-modes-en-dark.svg">
677
+ <img alt="All eight work modes on one sheet: each mode's glyph and name, whether it can change files, its thinking depth and effort, its step ceiling on a 128k model, and what it is for" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/fig-modes-en-light.svg" width="800">
678
+ </picture>
679
+
659
680
  Don't confuse this with `/mode`. They are separate axes:
660
681
 
661
682
  - `/mode` — **how much it asks you** (auto · confirm · strict)
@@ -835,10 +856,28 @@ Starting a server means opening your disk to somebody else.
835
856
 
836
857
  ## Skills and plugins
837
858
 
838
- **deel does not carry skills with it.** On startup it scans the machine it is running on and uses
839
- whatever is there. On a clean PC: zero. On a PC with skills installed: those skills.
859
+ **deel does not carry anybody else's skills.** On startup it scans the machine it is running on
860
+ and uses whatever is there.
861
+
862
+ **It does carry seven ways of working.** A freshly issued corporate PC has no
863
+ `~/.claude/skills` and no plugins. With zero methodology there the model made its own up every
864
+ time, and that is where the thin, did-only-what-was-asked answers came from.
865
+
866
+ | Skill | When |
867
+ |---|---|
868
+ | `깊이있게-만들기` (build deep) | Hardening, a report, an announcement — so it does not stop at the minimum |
869
+ | `끝까지-하기` (finish all) | When the task is several pieces. What was skipped gets said |
870
+ | `차근차근-디버깅` (debug step by step) | Reproduce → narrow → cause → fix → prove |
871
+ | `검사-먼저` (test first) | A failing test before the fix |
872
+ | `찔러보기` (spike) | When it is unclear whether something works: timebox a small probe, then throw it away |
873
+ | `코드-줄이기` (simplify code) | Same behaviour, easier to read |
874
+ | `스스로-검토` (self review) | Before saying it is done. What could not be measured gets said too |
875
+
876
+ The list costs 404 tokens on every request (5% of an 8k window). Bodies go out only when `Skill`
877
+ asks for one. Write your own under the same name and yours wins — what is carried sits lowest.
840
878
 
841
879
  ```
880
+ carried (inside the package) ← lowest
842
881
  project ./.deel/skills ./.claude/skills ./.deel/commands ./.claude/commands
843
882
  user ~/.deel/skills ~/.claude/skills ~/.claude/commands
844
883
  plugins ~/.claude/plugins/** ~/.deel/plugins/**
@@ -1219,12 +1258,12 @@ deel pack --out deel-import.zip
1219
1258
 
1220
1259
  ```
1221
1260
  ✓ deel-import.zip
1222
- 94 files · 509.6KB
1261
+ 175 files · 1605.9KB
1223
1262
 
1224
1263
  Dependencies 0
1225
1264
  Install scripts none
1226
1265
  External imports 0
1227
- Network calls 3 sites (configured address only)
1266
+ Network calls 8 sites (configured address only)
1228
1267
  Ports opened 1 site (/preview only)
1229
1268
  ```
1230
1269
 
@@ -1234,7 +1273,7 @@ audit-log spec to write SIEM ingestion rules.
1234
1273
 
1235
1274
  | File | What |
1236
1275
  |---|---|
1237
- | `import-review.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 |
1276
+ | `import-review.txt` | Dependencies · install scripts · **every network and process-spawn call site found by scanning the source** (file:line) · the four outbound lanes · SHA-256 per file |
1238
1277
  | `sbom.cdx.json` | **SBOM (CycloneDX 1.7).** Feed it straight to a scanner. One component per file with SHA-256 and a license; dependencies stated as an **explicit empty array** — "not declared" and "none" are different claims. All four CISA 2026 minimum elements (hash algorithm, component license, generating tool, generation context) are filled in |
1239
1278
  | `audit-spec.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 |
1240
1279
 
@@ -1295,12 +1334,13 @@ Stored in `~/.deel/config.json`. A `.deel/config.json` in the project folder tak
1295
1334
  ## Development
1296
1335
 
1297
1336
  ```bash
1298
- npm test Full suite (8,140 checks; a few are TTY-dependent)
1337
+ npm test Full suite (13,905 checks; a few are TTY-dependent)
1299
1338
  npm run coverage Which lines the tests actually execute
1300
1339
  npm run verify Import + network checks only
1301
1340
  npm run bench Edit success rate
1302
1341
  npm run demo See what the UI actually looks like
1303
- npm run check Syntax check every file
1342
+ npm run check Syntax check every file · line endings in the published package
1343
+ npm run mutate Whether the tests actually guard (break a line on purpose)
1304
1344
  ```
1305
1345
 
1306
1346
  Tests run against a **fake gateway**, so the loop, streaming, tool execution, undo and compaction
@@ -1315,30 +1355,30 @@ so one run tells you everything.
1315
1355
 
1316
1356
  | Suite | Checks | Covers |
1317
1357
  |---|---|---|
1318
- | `smoke` | 24 | Tools, scope, undo, audit log |
1319
- | `loop` | 28 | Agent loop, streaming, tool calls |
1320
- | `guard` | 113 | **What it refuses to do** — denied edits, unknown tools, repeated mutations, out-of-scope writes, the `.deel` fence |
1321
- | `network` | 70 | Nothing escapes the configured address |
1322
- | `web` | 56 | Web reads stay read-only |
1323
- | `abort` · `steer` | 22 · 15 | Ctrl+C leaves the conversation valid · a line typed mid-turn rides the next call |
1324
- | `parallel` | 23 | Read-only tools run together; checklists |
1325
- | `cli` · `oneshot` | 84 · 82 | **Spawns the real `deel`** and drives it to completion · batch mode and exit codes |
1326
- | `setup` | 60 | First-run wizard, driven through a fake TTY |
1327
- | `detect` | 85 | Identifying shape and auth from one address |
1328
- | `modes` · `route` | 120 · 72 | Work modes; auto-switching from Auto |
1329
- | `ctxsize` | 56 | Reading context length off the model |
1330
- | `commands` · `commands-more` | 221 · 93 | Every slash command |
1331
- | `ui` · `ui2` | 89 · 40 | Password masking, CJK width, status line, session list, Excel→text |
1332
- | `encoding` · `xlsx` | 77 · 72 | Legacy-encoding detection; Excel reading |
1333
- | `compact` | 101 | Summary folding, pairing intact, graceful fallback |
1334
- | `stuck` · `undo` | 48 · 58 | Telling spinning apart from real progress · shell-written files are undoable too |
1335
- | `store` | 75 | Session persistence, resume, crash recovery |
1336
- | `scan` | 30 | Distinguishing multiple runtimes |
1337
- | `plugins` | 79 | Plugin fetch/pack, ZIP/TAR |
1338
- | `exitcode` · `doorparity` | 7 · 7 | The printed exit-code table is real · all **four** doors hand out the same thing |
1339
- | `no-bundle` | 21 | Nothing foreign in the published package; test-file hygiene |
1340
- | `edit-bench` | 20 cases | Edit success rate |
1341
- | `mutate` | 12 mutants | **Whether the tests actually guard** — break the line on purpose, check it turns red |
1358
+ | `smoke` | 25 | Tools, scope, undo, audit log |
1359
+ | `loop` | 85 | Agent loop, streaming, tool calls |
1360
+ | `guard` | 323 | **What it refuses to do** — denied edits, unknown tools, repeated mutations, out-of-scope writes, the `.deel` fence |
1361
+ | `network` | 110 | Nothing escapes the configured address |
1362
+ | `web` | 99 | Web reads stay read-only |
1363
+ | `abort` · `steer` | 22 · 18 | Ctrl+C leaves the conversation valid · a line typed mid-turn rides the next call |
1364
+ | `parallel` | 41 | Read-only tools run together; checklists |
1365
+ | `cli` · `oneshot` | 124 · 220 | **Spawns the real `deel`** and drives it to completion · batch mode and exit codes |
1366
+ | `setup` | 109 | First-run wizard, driven through a fake TTY |
1367
+ | `detect` | 123 | Identifying shape and auth from one address |
1368
+ | `modes` · `route` | 207 · 221 | Work modes; auto-switching from Auto |
1369
+ | `ctxsize` | 71 | Reading context length off the model |
1370
+ | `commands` · `commands-more` | 274 · 195 | Every slash command |
1371
+ | `ui` · `ui2` | 126 · 40 | Password masking, CJK width, status line, session list, Excel→text |
1372
+ | `encoding` · `xlsx` | 159 · 106 | Legacy-encoding detection; Excel reading |
1373
+ | `compact` | 153 | Summary folding, pairing intact, graceful fallback |
1374
+ | `stuck` · `undo` | 76 · 138 | Telling spinning apart from real progress · shell-written files are undoable too |
1375
+ | `store` | 135 | Session persistence, resume, crash recovery |
1376
+ | `scan` | 66 | Distinguishing multiple runtimes |
1377
+ | `plugins` | 197 | Plugin fetch/pack, ZIP/TAR |
1378
+ | `exitcode` · `doorparity` | 7 · 19 | The printed exit-code table is real · all **four** doors hand out the same thing |
1379
+ | `no-bundle` | 28 | Nothing foreign in the published package; test-file hygiene |
1380
+ | `edit-bench` | 15 cases | Edit success rate |
1381
+ | `mutate` | 1,656 mutants | **Whether the tests actually guard** — break the line on purpose, check it turns red |
1342
1382
 
1343
1383
  > **More** — Coverage · Layout
1344
1384
  >
@@ -1350,48 +1390,47 @@ so one run tells you everything.
1350
1390
 
1351
1391
  | Version | What changed |
1352
1392
  |---|---|
1353
- | [1.20.12](docs/en/releases/1.20.md#12012) | The lock we said was on was not attached to anything |
1354
- | [1.20.11](docs/en/releases/1.20.md#12011) | The safety net said it was there when it wasn't |
1355
- | [1.20.10](docs/en/releases/1.20.md#12010) | Nobody answered, yet an answer had been given |
1356
- | [1.20.9](docs/en/releases/1.20.md#1209) | Nothing was missing from the screen — something else was on it |
1357
- | [1.20.8](docs/en/releases/1.20.md#1208) | We were writing down "can't" where the truth was "couldn't measure" |
1358
- | [1.20.7](docs/en/releases/1.20.md#1207) | We were learning the opposite of what the server said |
1359
- | [1.20.6](docs/en/releases/1.20.md#1206) | The second review was losing rounds silently |
1360
- | [1.20.5](docs/en/releases/1.20.md#1205) | `aws_access_token` was not being caught |
1361
- | [1.20.4](docs/en/releases/1.20.md#1204) | Only one hyphen segment was being counted |
1362
- | [1.20.3](docs/en/releases/1.20.md#1203) | How far a moved fence shook is now visible in one run |
1363
- | [1.20.2](docs/en/releases/1.20.md#1202) | The previous release was blocking the very thing it meant to allow |
1364
- | [1.20.1](docs/en/releases/1.20.md#1201) | `PASSWORD=` was never once caught |
1365
- | [1.20.0](docs/en/releases/1.20.md#1200) | A key not written in capitals was going out as it was |
1366
- | [1.19.5](docs/en/releases/1.19.md#1195) | On Windows line endings the previous release's fix did nothing at all |
1367
- | [1.19.4](docs/en/releases/1.19.md#1194) | Secrets leaked again wherever a comment was written |
1368
- | [1.19.3](docs/en/releases/1.19.md#1193) | Secrets written in YAML were going out in plaintext |
1369
- | [1.19.2](docs/en/releases/1.19.md#1192) | A gap appeared where the fence was moved — closing the hole 1.19.1 opened |
1370
- | [1.19.1](docs/en/releases/1.19.md#1191) | What the twelfth pair of eyes found, and the fourteen false alarms — 13 of 27 findings survived |
1371
- | [1.19.0](docs/en/releases/1.19.md#1190) | Getting one side right broke the other — 9,093 checks that measure both sides |
1372
- | [1.18.0](docs/en/releases/1.18.md#1180) | Having a rule is not the same as the rule firing — what was open while 8,404 checks stayed green |
1373
- | [1.17.9](docs/en/releases/1.17.md#1179) | Rate-limited, and knocking again one second later |
1374
- | [1.17.8](docs/en/releases/1.17.md#1178) | A long brief got the opposite of what it asked for — and one network blip threw the turn away |
1375
- | [1.17.7](docs/en/releases/1.17.md#1177) | We measured it side by side, and fixed the row we lost |
1376
- | [1.17.6](docs/en/releases/1.17.md#1176) | Only keep-alive and no content used to mean waiting forever |
1377
- | [1.17.5](docs/en/releases/1.17.md#1175) | The phase now follows the work inside a turn — and four read tools had been queueing up |
1378
- | [1.17.4](docs/en/releases/1.17.md#1174) | The places that sent the same request twice — and where what it learned sealed itself in |
1379
- | [1.17.3](docs/en/releases/1.17.md#1173) | No standard name for "same conversation" — it sends every name it knows |
1380
- | [1.17.2](docs/en/releases/1.17.md#1172) | A second pair of eyes — an hwpx Hancom cannot open · two requests going out unnamed |
1381
- | [1.17.1](docs/en/releases/1.17.md#1171) | Two things only green on one machine — writing into a deleted directory · raw NUL in the source |
1382
- | **[1.17.0](docs/en/releases/1.17.md#1170)** | What blocked it from getting inside a company · trusted folders · mTLS · `doctor` · hooks · subagents · writing hwpx |
1383
- | **[1.16.0](docs/en/releases/1.16.md#1160)** | A deep request no longer lands in a shallow mode · gateway cache · `doc2md` · Figma `.fig` |
1384
- | **[1.15.1](docs/en/releases/1.15.md#1151)** | Telling the editor how we get authenticated — ACP Registry listing requirement |
1385
- | **[1.15.0](docs/en/releases/1.15.md#1150)** | Stop doing the same thing twice — nine quietly expensive places that broke the prefix cache |
1386
- | **[1.14.0](docs/en/releases/1.14.md#1140)** | A machine now checks that what we wrote down is true — green does not mean guarded |
1387
- | [1.13.1](docs/en/releases/1.13.md#1131) | What shipped was not what the source said — 47 of 148 files went out with CRLF line endings |
1388
- | **[1.13.0](docs/en/releases/1.13.md#1130)** | Every place deel touches someone else's endpoint, re-examined — three independent reviewers, four findings they shared |
1389
- | **[1.12.0](docs/en/releases/1.12.md#1120)** | The same prefix was being sent again on every step |
1390
- | **[1.10.0](docs/en/releases/1.10.md#1100)** | ESC actually stops · a full context carries on inside the same turn · every vendor endpoint measured |
1391
- | [1.9.2](docs/en/releases/1.9.md#192) | Guards that said they were blocking were not blocking · folding lost the request and the outstanding work |
1392
- | **[1.9.0](docs/en/releases/1.9.md#190)** | Tables are drawn as tables · reasoning effort reaches Claude and Bedrock · tool schemas shaped per vendor · only the changed part of a file is re-sent |
1393
-
1394
- The five most recent are listed here. Every version, and why each thing changed, is in the **[release notes](docs/en/releases.md)**.
1393
+ | **[2.0.0](docs/en/releases/2.0.md#200)** | Every fence we said was there, checked for whether it actually holds — everything that changed, where and how it was fixed, and how it was found (CHA) |
1394
+
1395
+ <p align="center">
1396
+ <picture>
1397
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/fig-cha-en-dark.svg">
1398
+ <img alt="The nine steps of one CHA round, animated: hunt, brief, second eyes, adjudicate, red test first, fix, mutate, gate, record — a marker walks them one at a time and step 9 returns to step 1. Three models stand at step 3: Claude writes, Gemini and codex only read. With reduced motion it falls back to a still frame" src="https://raw.githubusercontent.com/jysvai/deel-local-cli/main/docs/assets/fig-cha-en-light.svg" width="860">
1399
+ </picture>
1400
+ </p>
1401
+
1402
+ The 2.0.0 fixes did not come from reading the code. They came from repeating one
1403
+ procedure — **CHA, Cyclic Hostile Harnessing** — eighteen times. One lap of this ring
1404
+ is one round, and three models take turns at step 3.
1405
+
1406
+ 2.0.0 is the large release where the name changed. Everything before it — 1.2.0 through 1.20.13 —
1407
+ is in the **[1.x archive](docs/en/releases/1.x.md)**, one line per release.
1408
+
1409
+ <details>
1410
+ <summary>The 1.x lines at a glance (18 lines)</summary>
1411
+
1412
+ | Line | What changed |
1413
+ |---|---|
1414
+ | [1.20.x](docs/en/releases/1.x.md#120x) | One space hid the whole instruction |
1415
+ | [1.19.x](docs/en/releases/1.x.md#119x) | Getting one side right broke the other — thirteen rounds of second review, and the gap left where a fence moved |
1416
+ | [1.18.x](docs/en/releases/1.x.md#118x) | Having a rule is not the same as the rule firing — what green was not guarding, and a second reviewer |
1417
+ | [1.17.x](docs/en/releases/1.x.md#117x) | The things that blocked it from getting inside a company — and the company writes what to do |
1418
+ | [1.16.x](docs/en/releases/1.x.md#116x) | A deep request no longer lands in a shallow mode — and designs and documents open as they are |
1419
+ | [1.15.x](docs/en/releases/1.x.md#115x) | Stop doing the same thing twice — nine quietly expensive places |
1420
+ | [1.14.x](docs/en/releases/1.x.md#114x) | A machine now checks that what we wrote down is true |
1421
+ | [1.13.x](docs/en/releases/1.x.md#113x) | Every place deel touches someone else's endpoint, re-examined |
1422
+ | [1.12.x](docs/en/releases/1.x.md#112x) | The same head was going out on every single request |
1423
+ | [1.10.x](docs/en/releases/1.x.md#110x) | ESC actually stops, and a full context carries on |
1424
+ | [1.9.x](docs/en/releases/1.x.md#19x) | The screen reads, and vendor APIs understand what you set |
1425
+ | [1.8.x](docs/en/releases/1.x.md#18x) | A full day against a gateway that hands out one-hour tokens |
1426
+ | [1.7.x](docs/en/releases/1.x.md#17x) | Local stays local; it goes out only when you say so |
1427
+ | [1.6.x](docs/en/releases/1.x.md#16x) | The places that made a turn spin in circles |
1428
+ | [1.5.x](docs/en/releases/1.x.md#15x) | A 5MB document showed 8 lines out of 919 |
1429
+ | [1.4.x](docs/en/releases/1.x.md#14x) | The README explains what's different, and the review report gets its missing line |
1430
+ | [1.3.x](docs/en/releases/1.x.md#13x) | evidence instead of claims, the editor instead of a terminal |
1431
+ | [1.2.x](docs/en/releases/1.x.md#12x) | so the conversation doesn't break |
1432
+
1433
+ </details>
1395
1434
 
1396
1435
  ---
1397
1436