deel-local-cli 1.1.0 → 1.2.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 (43) hide show
  1. package/README.en.md +347 -9
  2. package/README.md +317 -6
  3. package/package.json +2 -2
  4. package/src/agent/budget.js +0 -14
  5. package/src/agent/compact.js +87 -0
  6. package/src/agent/evolve.js +213 -0
  7. package/src/agent/loop.js +38 -1
  8. package/src/agent/modes.js +2 -0
  9. package/src/agent/route.js +55 -3
  10. package/src/agent/session.js +145 -1
  11. package/src/agent/threads.js +154 -0
  12. package/src/backend/http.js +41 -4
  13. package/src/commands.js +268 -4
  14. package/src/config.js +10 -1
  15. package/src/oneshot.js +4 -0
  16. package/src/preview/serve.js +326 -0
  17. package/src/repl.js +210 -34
  18. package/src/safety/guard.js +37 -2
  19. package/src/safety/undo.js +1 -1
  20. package/src/setup.js +2 -2
  21. package/src/skills/builtin//352/262/200/354/202/254-/353/250/274/354/240/200/SKILL.md +64 -0
  22. 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 +78 -0
  23. package/src/skills/builtin//353/201/235/352/271/214/354/247/200-/355/225/230/352/270/260/SKILL.md +65 -0
  24. package/src/skills/builtin//354/212/244/354/212/244/353/241/234-/352/262/200/355/206/240/SKILL.md +74 -0
  25. package/src/skills/builtin//354/260/224/353/237/254/353/263/264/352/270/260/SKILL.md +59 -0
  26. 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 +73 -0
  27. package/src/skills/builtin//354/275/224/353/223/234-/354/244/204/354/235/264/352/270/260/SKILL.md +66 -0
  28. package/src/skills/discover.js +18 -3
  29. package/src/tools/edit-match.js +16 -5
  30. package/src/tools/excel-com.js +1 -1
  31. package/src/tools/excel.js +1 -1
  32. package/src/tools/fsutil.js +0 -8
  33. package/src/tools/index.js +1 -1
  34. package/src/tools/todo.js +19 -3
  35. package/src/ui/ansi.js +6 -2
  36. package/src/ui/inputbox.js +37 -8
  37. package/src/ui/md.js +227 -0
  38. package/src/ui/motion.js +212 -0
  39. package/src/ui/prompt.js +1 -1
  40. package/src/ui/screen.js +1 -1
  41. package/src/ui/status.js +14 -1
  42. package/src/ui/working.js +0 -3
  43. package/src/ui/wrap.js +1 -8
package/README.en.md CHANGED
@@ -53,6 +53,7 @@ Zero dependencies · Node 20+ · Exactly one place your source can go
53
53
  - [Simple vs developer](#simple-vs-developer)
54
54
  - [Tools](#tools)
55
55
  - [Korean text and Excel](#korean-text-and-excel)
56
+ - [Serving what you built](#serving-what-you-built)
56
57
  - [Skills and plugins](#skills-and-plugins)
57
58
  - [Reasoning effort](#reasoning-effort)
58
59
  - [Auto-compaction](#auto-compaction)
@@ -63,6 +64,9 @@ Zero dependencies · Node 20+ · Exactly one place your source can go
63
64
  - [Configuration](#configuration)
64
65
  - [Troubleshooting](#troubleshooting)
65
66
  - [Development](#development)
67
+ - [Release notes](#release-notes)
68
+
69
+ Each section is open at the summary. Click **▸ More** to unfold the detail behind it.
66
70
 
67
71
  ---
68
72
 
@@ -203,6 +207,9 @@ $ deel scan
203
207
 
204
208
  Switch with `/model` mid-conversation — **the conversation carries over.**
205
209
 
210
+ <details>
211
+ <summary><b>More</b> — It adapts to whatever model is attached · Small windows get a smaller fixed share · On startup it reads what kind of project this folder is</summary>
212
+
206
213
  ### It adapts to whatever model is attached
207
214
 
208
215
  If you move between models, any number tuned for one of them is wrong for all the others.
@@ -333,6 +340,8 @@ can be recovered with one `Glob`; "tests run with `npm test`" requires opening
333
340
 
334
341
  7ms on a folder with 600 files (`test/project.test.js`).
335
342
 
343
+ </details>
344
+
336
345
  ---
337
346
 
338
347
  ## Slash commands
@@ -348,6 +357,8 @@ Names follow Claude Code / Codex conventions.
348
357
  | `/out [number\|auto]` | Cap on a **single reply** — raise it when large files get cut |
349
358
  | `/compact` | Summarise and fold older turns |
350
359
  | `/clear` | Clear the conversation (keeps link and rules) |
360
+ | `/thread [new\|fork\|close\|n]` | Conversation threads — side work in its own context. Link and undo stay shared |
361
+ | `/learned [clear]` | What deel has picked up on its own — commands that work here, this model's habits |
351
362
  | `/model` | Switch connection / model |
352
363
  | `/think <level>` | Reasoning level (`off·low·medium·high·max`) |
353
364
  | `/think 배분 <profile>` | Per-stage profile (`even·save·deep`) |
@@ -359,6 +370,7 @@ Names follow Claude Code / Codex conventions.
359
370
  | `/level [level]` | How much to show (`쉬움` simple · `개발자` developer) |
360
371
  | `/undo [turns]` | Revert file changes |
361
372
  | `/diff [file]` | Files changed this session, and the changed lines |
373
+ | `/preview [folder\|file\|off]` | Serve what you built, right here — a browser opens with it |
362
374
  | `/tools` | Available tools |
363
375
  | `/skills [query\|all\|off]` | Browse, search, load skills |
364
376
  | `/plugin [install\|remove\|pack]` | Manage plugins |
@@ -390,6 +402,9 @@ the conversation.
390
402
 
391
403
  Korean IME composition, paste, `Ctrl+A/E` and backspace all keep working.
392
404
 
405
+ <details>
406
+ <summary><b>More</b> — Attaching a file with @ · Interrupting</summary>
407
+
393
408
  ### Attaching a file with `@`
394
409
 
395
410
  Write `@` followed by a path and that file is sent along with your message.
@@ -448,6 +463,8 @@ session. Tools already running finish; **tools not yet started never run.**
448
463
 
449
464
  Pressing Ctrl+C again on an empty line quits.
450
465
 
466
+ </details>
467
+
451
468
  ---
452
469
 
453
470
  ## Work modes
@@ -476,6 +493,9 @@ Don't confuse this with `/mode`. They are separate axes:
476
493
  If you have explicitly set `/think` or `/mode`, your choice wins. A work mode never
477
494
  overrides something a person chose.
478
495
 
496
+ <details>
497
+ <summary><b>More</b> — Switching by itself (Auto mode)</summary>
498
+
479
499
  ### Switching by itself (Auto mode)
480
500
 
481
501
  You start in **Auto**. Nothing has been decided about what kind of work is coming.
@@ -518,6 +538,8 @@ A `~` in the status line means it switched by itself; no `~` means you chose it.
518
538
 
519
539
  Choosing a mode yourself **pins** it. `/auto` (or `/work auto`) hands the wheel back.
520
540
 
541
+ </details>
542
+
521
543
  ---
522
544
 
523
545
  ## Simple vs developer
@@ -539,6 +561,9 @@ Two things matter here:
539
561
  - **Beginners do not get fewer safeguards.** Undo, workspace scope and dangerous-command
540
562
  blocking are identical. A beginner needs the undo more, not less.
541
563
 
564
+ <details>
565
+ <summary><b>More</b> — 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</summary>
566
+
542
567
  ### The input box
543
568
 
544
569
  Launched in a terminal, **the conversation scrolls normally and an input box is pinned at
@@ -652,21 +677,46 @@ more than a blank screen. One turn reads like this:
652
677
  (turning it over) (looking at files) (writing code) (writing the answer)
653
678
  ```
654
679
 
655
- | Activity | Phrases |
656
- |---|---|
657
- | Thinking | 머리 굴리는 · 어떻게 할지 궁리하는 중 · 수 읽는 중 · 따져 보는 중 |
658
- | `Read` `Grep` `Glob` | 파일 들여다보는 중 · 코드 훑는 중 · 어디 있나 뒤지는 중 · 단서 찾는 중 |
659
- | `Write` `Edit` `Append` | 코드 짜는 중 · 고쳐 넣는 중 · 손보는 중 · 줄씩 옮기는 |
660
- | `Bash` | 명령 돌리는 중 · 터미널 두드리는 중 · 결과 기다리는 중 |
661
- | `WebFetch` | 문서 찾아보는 중 · 읽어 오는 중 |
662
- | Answering | 쓰는 중 · 정리해서 말하는 중 |
663
- | **Past 45 seconds** | 아직 하는 중 · 조금만 · 생각보다 오래 걸리는 |
680
+ The phrases are Korean, because the interface is. Here is what each set means:
681
+
682
+ | Activity | On screen | Roughly |
683
+ |---|---|---|
684
+ | Thinking | 머리 굴리는 · 어떻게 할지 궁리하는 중 · 읽는 중 · 따져 보는 | turning it over · working out how · reading ahead · weighing it up |
685
+ | `Read` `Grep` `Glob` | 파일 들여다보는 중 · 코드 훑는 중 · 어디 있나 뒤지는 · 단서 찾는 중 | looking at files · skimming code · hunting for where it is · looking for a clue |
686
+ | `Write` `Edit` `Append` | 코드 짜는 중 · 고쳐 넣는· 손보는 중 · 한 줄씩 옮기는 중 | writing code · patching it in · touching it up · moving it a line at a time |
687
+ | `Bash` | 명령 돌리는 중 · 터미널 두드리는· 결과 기다리는 중 | running a command · at the terminal · waiting on output |
688
+ | `WebFetch` | 문서 찾아보는 중 · 읽어 오는 | looking up docs · fetching |
689
+ | Answering | 답 쓰는 중 · 정리해서 말하는 중 | writing the answer · putting it together |
690
+ | **Past 45 seconds** | 아직 하는 중 · 조금만 더 · 생각보다 오래 걸리는 중 | still going · nearly there · taking longer than expected |
664
691
 
665
692
  Within a category the phrase advances every 4 seconds — text frozen for 30 seconds reads as
666
693
  hung too. On the right: **elapsed time**, and while the model is reasoning, **how many
667
694
  characters of thinking have arrived**. One number that genuinely increases is what turns
668
695
  "still alive" from a claim into a fact.
669
696
 
697
+ ### The picture on the left moves too
698
+
699
+ What spins next to the phrase is not a spinner — it is **a small drawing of the work being
700
+ done right now**.
701
+
702
+ | Doing | One cycle | The picture |
703
+ |---|---|---|
704
+ | Thinking | `⠀⠶⠀` `⠰⣿⠆` `⢾⣿⡷` `⠰⣿⠆` | swells and shrinks |
705
+ | Reading | `⠉⠉⠉` `⠒⠒⠒` `⠤⠤⠤` `⣀⣀⣀` | a scanning line travels down |
706
+ | Writing | `⡼⠭⠧` `⠼⡯⠧` `⠼⠿⡧` `⠼⡭⠧` | **a laptop typing** |
707
+ | Commands | `⠉⠀⠀` `⠉⠈⠀` `⠛⠊⠀` `⠿⠮⠄` | output piles up a line at a time |
708
+ | Answering | `⠉⠀⠀` `⠛⠉⠀` `⠿⠛⠉` `⣿⠿⠛` | text fills up |
709
+ | Web | `⣀⣀⣀` `⣤⣀⣀` `⣶⣤⣀` `⣿⣶⣤` | signal bars grow |
710
+ | Compacting | `⣿⣿⣿` `⣶⣶⣶` `⣤⣤⣤` `⣀⣀⣀` | pressed down into one line |
711
+ | Past 45 seconds | `⠶⠀⠀` `⠰⠆⠀` `⠀⠶⠀` `⠀⠰⠆` | back and forth — "waiting" |
712
+
713
+ Braille only. One braille cell is **2 wide by 4 dots tall**, so three cells make a 6×4 grid
714
+ that is exactly three columns in any terminal. Emoji and `●` `▪` include glyphs that East
715
+ Asian locales measure as two columns, which knocks the border out of line every 90ms.
716
+
717
+ If the drawing does not render, or you use a screen reader, `DEEL_NO_MOTION=1` turns it off
718
+ and you get the old single-cell spinner.
719
+
670
720
  ### What gets asked, and what just happens
671
721
 
672
722
  Whether your files change **with or without being asked** is the one thing that has to be
@@ -706,6 +756,8 @@ press only makes it ask more; it never drops you into "changes files unasked" in
706
756
  > approval indicator off the line entirely. Now **the model name shortens first** — you
707
757
  > already know what you are running; whether your files change unasked is what you need now.
708
758
 
759
+ </details>
760
+
709
761
  ---
710
762
 
711
763
  ## Tools
@@ -736,6 +788,9 @@ Seven tools here are not in Claude Code — `Append`, `Recall`, `Remember`, `Out
736
788
  so a test stops you every time the list grows (`test/loop.test.js`). The last four earned
737
789
  their cost; here is why.
738
790
 
791
+ <details>
792
+ <summary><b>More</b> — Outline · Verify · Task · Commands that never finish and 9 more</summary>
793
+
739
794
  ### Seeing a project's shape cheaply — `Outline`
740
795
 
741
796
  There used to be only two ways to understand someone else's code. `Glob` gives you paths;
@@ -1126,10 +1181,18 @@ last edit did. That original state comes from the earliest undo snapshot.
1126
1181
  `/diff` is **in the simple level's command list.** As long as `auto` edits without asking,
1127
1182
  a beginner needs a way to see what changed more than anyone.
1128
1183
 
1184
+ </details>
1185
+
1129
1186
  ---
1130
1187
 
1131
1188
  ## Korean text and Excel
1132
1189
 
1190
+ **A file saved as CP949 is written back as CP949.** The encoding is never changed.
1191
+ Excel (`.xlsx`) is read as CSV — read-only.
1192
+
1193
+ <details>
1194
+ <summary><b>More</b> — Encoding · Excel</summary>
1195
+
1133
1196
  ### Encoding — written back the way it was read
1134
1197
 
1135
1198
  Corporate documents are often not UTF-8. Files saved by old Windows Notepad in a legacy
@@ -1200,6 +1263,55 @@ Extracted intermediate files are deleted after use.
1200
1263
  > to do instead. Round-tripping a file with formatting, formulas and charts through CSV
1201
1264
  > always loses something. Better not to write than to write knowing you'll lose data.
1202
1265
 
1266
+ </details>
1267
+
1268
+ ---
1269
+
1270
+ ## Serving what you built
1271
+
1272
+ ```
1273
+ ❯ /preview
1274
+
1275
+ ▶ Serving http://127.0.0.1:56801/
1276
+ showing .
1277
+ Edit a file and the page reloads by itself.
1278
+ Only this machine can open it (127.0.0.1). No other PC can see it.
1279
+ Stop with /preview off · it shuts down when deel exits.
1280
+ ```
1281
+
1282
+ A browser opens with it. `/preview <folder>` picks what to serve, `/preview off` stops it.
1283
+
1284
+ **This is not the same as double-clicking the file (`file://`).** Under `file://` everything
1285
+ below is blocked — and the error only shows up in the console while the page stays blank, so
1286
+ you end up suspecting your own code. This is a real HTTP server, so it all works:
1287
+
1288
+ | | `file://` | `/preview` |
1289
+ |---|---|---|
1290
+ | `<script type="module">` · `import` | blocked (CORS) | **works** |
1291
+ | `fetch('./data.json')` | blocked | **works** |
1292
+ | `new Worker(...)` | blocked | **works** |
1293
+ | `WebAssembly.compileStreaming` | blocked (MIME) | **works** |
1294
+ | textures · `getImageData` | tainted canvas | **works** |
1295
+ | `.glb` / `.gltf` (Three.js) | no MIME type → silently not drawn | **works** |
1296
+
1297
+ All seven were run in a real Chrome and confirmed **7/7**.
1298
+
1299
+ Apps with a router (React Router and friends) get the first page back when you reload on a
1300
+ deep link. Never for requests with an extension (`app.js`) though — returning HTML for a
1301
+ missing script dies with `Unexpected token '<'`, which hides the real cause (a typo in a filename).
1302
+
1303
+ ### It opens exactly as much as it says
1304
+
1305
+ Starting a server means opening your disk to somebody else.
1306
+
1307
+ - Bound to **`127.0.0.1` only**. `0.0.0.0` is not available at all — on an office network
1308
+ that would let anyone read your source.
1309
+ - Port **0** (the kernel hands out a free one). A fixed port steals someone else's.
1310
+ - Paths cannot leave the working scope. `../` · `%2e%2e` · double encoding · absolute paths ·
1311
+ null bytes · symlinks — eight of these are held shut by tests.
1312
+ - **It only serves.** `POST` · `PUT` · `DELETE` are refused with 405.
1313
+ - It shuts down when `deel` exits.
1314
+
1203
1315
  ---
1204
1316
 
1205
1317
  ## Skills and plugins
@@ -1215,6 +1327,9 @@ plugins ~/.claude/plugins/** ~/.deel/plugins/**
1215
1327
 
1216
1328
  Reads the Claude Code format: `SKILL.md` with YAML front matter, `commands/*.md`, `$ARGUMENTS`.
1217
1329
 
1330
+ <details>
1331
+ <summary><b>More</b> — Loaded in three stages · Fetching plugins · Deliberately not included</summary>
1332
+
1218
1333
  ### Loaded in three stages
1219
1334
 
1220
1335
  Loading everything would blow the context window.
@@ -1247,6 +1362,8 @@ with a licence table — ready to hand to a security reviewer.
1247
1362
  | sub-agents | Doubles model calls against a gateway quota |
1248
1363
  | MCP | A separate protocol; a project of its own |
1249
1364
 
1365
+ </details>
1366
+
1250
1367
  ---
1251
1368
 
1252
1369
  ## Reasoning effort
@@ -1295,6 +1412,9 @@ That second-to-last line exists for a reason: **when all three caps are equal, i
1295
1412
  only thing that says whether that is correct.** A low known cap makes them equal, and that
1296
1413
  is fine. For a while all three read `16,384` always — which meant the table said nothing.
1297
1414
 
1415
+ <details>
1416
+ <summary><b>More</b> — Context length is read off the model · /out · Truncated tool calls</summary>
1417
+
1298
1418
  ### Context length is read off the model
1299
1419
 
1300
1420
  This one number sizes the whole program: how many files fit in one read, when the
@@ -1428,6 +1548,8 @@ One silently swallowed value produced all of that. What happens now:
1428
1548
  spinning one. What is counted here is not steps but **how many times the same tool failed for
1429
1549
  the same reason.**
1430
1550
 
1551
+ </details>
1552
+
1431
1553
  ---
1432
1554
 
1433
1555
  ## Auto-compaction
@@ -1495,6 +1617,9 @@ The model sees it as `mcp__wiki__search`. `/mcp` shows what is attached.
1495
1617
  **Dependencies stay at zero.** The stdio transport is nothing but newline-delimited JSON-RPC
1496
1618
  2.0 over a child process's stdin/stdout, so `child_process` and `JSON` cover it. No SDK.
1497
1619
 
1620
+ <details>
1621
+ <summary><b>More</b> — But this is somebody else's program</summary>
1622
+
1498
1623
  ### But this is somebody else's program
1499
1624
 
1500
1625
  This project exists because unapproved software is blocked. Turning on MCP carelessly would
@@ -1514,6 +1639,8 @@ One server crashing, hanging, or talking nonsense does not affect the others. Fa
1514
1639
  swallowed — the reason appears in the header, because a silent drop leaves "why is that tool
1515
1640
  missing?" unanswerable.
1516
1641
 
1642
+ </details>
1643
+
1517
1644
  ---
1518
1645
 
1519
1646
  ## Safety
@@ -1543,6 +1670,9 @@ Undo history stores whole file contents, so repeated edits to large files add up
1543
1670
  it keeps the **most recent 50 turns** and drops the rest. What you just did is always
1544
1671
  undoable; `/status` shows how large the history currently is.
1545
1672
 
1673
+ <details>
1674
+ <summary><b>More</b> — Files removed through Bash come back too · What it will not read</summary>
1675
+
1546
1676
  ### Files removed through `Bash` come back too
1547
1677
 
1548
1678
  The safety net covered `Write` and `Edit` only. But a model moving a file reaches for
@@ -1611,6 +1741,8 @@ the read guard look at the same set. They used to be two copies, and two copies
1611
1741
  comes when only one of them learns a new name — a folder that is skipped while walking but
1612
1742
  readable if you name it directly, which is very hard to explain.
1613
1743
 
1744
+ </details>
1745
+
1614
1746
  ---
1615
1747
 
1616
1748
  ## Corporate review package
@@ -1641,6 +1773,9 @@ The bundled review sheet contains:
1641
1773
  It is generated by scanning the source, not written by hand — hand-written sheets drift from reality.
1642
1774
  Use `deel audit` to read it without building a zip.
1643
1775
 
1776
+ <details>
1777
+ <summary><b>More</b> — Diagnosing a corporate gateway</summary>
1778
+
1644
1779
  ### Diagnosing a corporate gateway
1645
1780
 
1646
1781
  ```bash
@@ -1662,12 +1797,17 @@ Hand over `report.txt` alone — plain text, no colour codes.
1662
1797
 
1663
1798
  Verdict is one of **ready · limited · blocked · unreachable**.
1664
1799
 
1800
+ </details>
1801
+
1665
1802
  ---
1666
1803
 
1667
1804
  ## Configuration
1668
1805
 
1669
1806
  Stored in `~/.deel/config.json`. A `.deel/config.json` in the project folder takes precedence.
1670
1807
 
1808
+ <details>
1809
+ <summary><b>More</b> — Supported servers · Environment variables · Flags · Project rules</summary>
1810
+
1671
1811
  ### Supported servers
1672
1812
 
1673
1813
  | | Example address |
@@ -1712,6 +1852,8 @@ deel --no-tui Turn the input box off; plain scrolling view (see below
1712
1852
  If the working folder has `DEEL.md`, `CLAUDE.md` or `AGENTS.md`, it is loaded as project rules.
1713
1853
  `/init` scaffolds one.
1714
1854
 
1855
+ </details>
1856
+
1715
1857
  ---
1716
1858
 
1717
1859
  ## Troubleshooting
@@ -1777,6 +1919,9 @@ so one run tells you everything.
1777
1919
  | `no-bundle` | 12 | Nothing foreign in the published package; test-file hygiene |
1778
1920
  | `edit-bench` | 20 cases | Edit success rate |
1779
1921
 
1922
+ <details>
1923
+ <summary><b>More</b> — Coverage · Layout</summary>
1924
+
1780
1925
  ### Coverage
1781
1926
 
1782
1927
  ```bash
@@ -1797,6 +1942,199 @@ Currently **92% overall** (7,056 of 7,646 lines). Three files are deliberately l
1797
1942
  | `repl.js` | 77% | The keypress paths — Shift+Tab, Ctrl+C, password entry, paste. Reaching them needs a pty, and a pty is a dependency. What the screen *prints* is measured instead, as a value (`ui` and `tui` suites) |
1798
1943
  | `plugins/manage.js` | 79% | The GitHub download path. **Tests not reaching the network** matters more. Folder installs are covered |
1799
1944
 
1945
+ ### Layout
1946
+
1947
+ ```
1948
+ bin/deel.js entry point
1949
+ src/
1950
+ repl.js the conversation screen — what a person faces
1951
+ oneshot.js run once and exit (-p)
1952
+ commands.js 35 slash commands
1953
+ setup.js first-run connection setup
1954
+ config.js reading and writing config
1955
+
1956
+ ui/ansi.js colour · East Asian width
1957
+ ui/screen.js picking a screen (line mode / box mode)
1958
+ ui/inputbox.js the box at the bottom — overwrite-in-place, cursor position
1959
+ ui/status.js status line — model, context, mode, approvals
1960
+ ui/working.js working phrases — they follow what is happening
1961
+ ui/motion.js the braille drawing next to the phrase
1962
+ ui/approve.js approval mode display (auto / risky only / everything)
1963
+ ui/diff.js showing what changed, where it changed
1964
+ ui/wrap.js wrapping to width without breaking colour
1965
+ ui/level.js simple vs developer
1966
+
1967
+ agent/loop.js the agent loop
1968
+ agent/session.js conversation state + context accounting
1969
+ agent/modes.js work modes (auto · code · plan · architect · debug · ask · orchestrator)
1970
+ agent/route.js picking the mode from what was said
1971
+ agent/effort.js per-stage reasoning effort
1972
+ agent/budget.js shares that follow the window — lines read, description length, steps
1973
+ agent/project.js working out what kind of project this folder is
1974
+ agent/compact.js summarising compaction
1975
+ agent/store.js saving and resuming conversations
1976
+ agent/recall.js searching past conversations (no index, within budget)
1977
+ agent/memory.js what outlives the conversation
1978
+ agent/mention.js attaching files with `@`
1979
+
1980
+ backend/http.js the single HTTP layer (the only door out)
1981
+ backend/detect.js protocol and auth detection
1982
+ backend/adapter.js absorbing OpenAI/Ollama differences + streaming parser
1983
+ backend/ctxsize.js reading context length off the model
1984
+ backend/probe.js 8 diagnostic checks
1985
+ backend/scan.js scanning for local servers
1986
+ backend/mcp.js attaching outside tools (MCP, stdio)
1987
+
1988
+ tools/index.js 15 tools
1989
+ tools/edit-match.js staged-relaxation edit matching
1990
+ tools/outline.js a file's shape, cheaply
1991
+ tools/verify.js checking what was built
1992
+ tools/task.js splitting big work off
1993
+ tools/jobs.js commands that run in the background
1994
+ tools/todo.js checklists
1995
+ tools/webfetch.js reading the web (read-only)
1996
+ tools/encoding.js writing back in the encoding it was read in
1997
+ tools/xlsx.js Excel → CSV (written here)
1998
+
1999
+ preview/serve.js serving what you built (127.0.0.1 only)
2000
+ skills/discover.js finding skills, commands and plugins on the machine
2001
+ plugins/manage.js installing, removing and packing plugins
2002
+ pack/zip.js ZIP writing (written here, keeps non-ASCII names)
2003
+ pack/tar.js TAR reading (written here)
2004
+ pack/selfpack.js review dossier + source bundle
2005
+
2006
+ safety/network.js the lock on the way out
2007
+ safety/guard.js working scope + dangerous-command blocking
2008
+ safety/undo.js snapshots and undo
2009
+ safety/audit.js recording what happened, and when
2010
+ test/ tests (excluded from the published package)
2011
+ ```
2012
+
2013
+ </details>
2014
+
2015
+ ---
2016
+
2017
+ ## Release notes
2018
+
2019
+ <details>
2020
+ <summary><b>▸ 1.2.0 — so the conversation doesn't break</b> · what changed in six places</summary>
2021
+
2022
+ <br>
2023
+
2024
+ | | Before | After |
2025
+ |---|---|---|
2026
+ | Resuming | a conversation cut mid-tool-call **would not reopen** | unmatched calls are cleared, then it opens |
2027
+ | Counting tokens | it guessed, and stayed wrong | it corrects itself against the server |
2028
+ | Making room | summarising arrived at turn 49 | it holds out to turn **102** |
2029
+ | Side questions | piled up in the main context | live in their own thread |
2030
+ | Yesterday's lesson | vanished when you quit | carries over to the next session |
2031
+ | The answer on screen | `**bold**` showed up as characters | it is drawn |
2032
+
2033
+ <br>
2034
+
2035
+ #### 1. A conversation cut mid-tool-call would not reopen
2036
+
2037
+ Close the window or hit <kbd>Ctrl</kbd>+<kbd>C</kbd> while a tool is running and the saved conversation keeps **a call with no result under it**. Reopen it with `--resume` and the server rejects the mismatch with a 400 — the conversation was written down perfectly well, and you still could not carry on.
2038
+
2039
+ Now the pairs are checked before it opens. Calls with no result go, results with no parent go, and **whatever the model said stays.**
2040
+
2041
+ ```
2042
+ $ deel --resume 20260826-140217
2043
+
2044
+ ✓ 20260826-140217 — 메시지 48개를 이어 받았습니다.
2045
+ 중단된 도구 호출 2개를 걷어냈습니다 — 그때 하던 일은 다시 시켜 주세요.
2046
+ ```
2047
+
2048
+ #### 2. It misjudged the room left
2049
+
2050
+ Token counts are estimated from character counts. Mix Korean, code and JSON and that estimate drifts from the truth — so deel folded early with room to spare, or did not fold when there was none and the server refused.
2051
+
2052
+ It now **corrects the multiplier against what the server actually reports** with every answer. One line at the foot of `/context`:
2053
+
2054
+ ```
2055
+ 서버가 알려 준 실제값에 맞춰 +12% 보정했습니다 (7번 재봄).
2056
+ ```
2057
+
2058
+ The multiplier is kept per model, so **the next session starts from it** instead of measuring again from scratch.
2059
+
2060
+ #### 3. Summarising arrived too early
2061
+
2062
+ At 80% of the window, earlier turns get folded into a summary. That **cannot be undone**, and the file contents the reasoning rested on are gone with it.
2063
+
2064
+ There is now a step before it. At 55%, **only older tool results** are folded — the four most recent are left alone, and nothing the model or you said is touched at all.
2065
+
2066
+ ```
2067
+ ◲ 오래된 도구 결과 6개를 접었습니다 (2,148 토큰을 비움)
2068
+ ```
2069
+
2070
+ What was there is left in its place:
2071
+
2072
+ ```
2073
+ (접힘) Read(src/runner.js) — 61줄. 자리를 비우려고 내용을 접었습니다. 필요하면 다시 읽으세요.
2074
+ ```
2075
+
2076
+ Measured by streaming the same conversation through: summarising is pushed from **turn 49 to turn 102 — 2.1×**.
2077
+
2078
+ #### 4. Side questions polluted the main line
2079
+
2080
+ "Just check this one thing" piles into the main context and stays there long after the checking is done.
2081
+
2082
+ ```
2083
+ /thread new 로그확인
2084
+ ⑂ 로그확인 갈래로 왔습니다. 빈 대화입니다
2085
+ 본줄기로 돌아가려면 /thread 1
2086
+ ```
2087
+
2088
+ `fork` carries the conversation so far with you. What threads **keep apart is the messages, the token count and the checklist**; what they **share is the connection, undo and the audit log** — a file changed inside a thread still comes back with `/undo`. The `⑂` marker appears in the status line only once there is more than one thread.
2089
+
2090
+ #### 5. Yesterday's lesson vanished when you quit
2091
+
2092
+ deel could work out that `pnpm` is not on this machine, and lose it the moment you quit. Tomorrow it calls it again, fails again, works around it again.
2093
+
2094
+ ```
2095
+ /learned
2096
+ ── 겪어 본 것 ──────────────────────────────────────
2097
+
2098
+ 이 폴더에서 돌려 본 명령
2099
+ ✓ npm test 됨 12 · 안 됨 0
2100
+ ✗ pnpm 됨 0 · 안 됨 3
2101
+
2102
+ 이 모델에 대해 qwen2.5-coder:7b
2103
+ 같이 걸어 본 걸음 86
2104
+ 인자가 잘림 14 (16%)
2105
+ 토큰 추정 보정 ×1.12
2106
+
2107
+ 이 중 프롬프트에 실리는 것
2108
+ - 여기서 되는 명령: `npm test`
2109
+ - 이 PC 에서 안 되는 명령(다시 부르지 마라): `pnpm`
2110
+ ```
2111
+
2112
+ **This is not training.** It does not touch the model and it does not hoard conversations — that would only eat context. It counts, and it carries over **only what it has seen twice**, all of it **within 220 tokens**. Something seen once may be a coincidence, and writing a coincidence down as fact sends the model around a road that actually works.
2113
+
2114
+ Commands that work live with the folder (`.deel/배운것.json`); the model's habits live in the config folder. So **move the folder and what it learned about the model comes along.** `/learned 지우기` empties it whenever you want.
2115
+
2116
+ #### 6. The answer showed up as raw characters
2117
+
2118
+ The model speaks Markdown and the screen did not know it, so asterisks, backticks and hashes came through mixed into the prose. You had to re-read it in your head to see what was a heading and what was code.
2119
+
2120
+ ```
2121
+ before after
2122
+ ▌ ## 고친 것 ▌ ▍ 고친 것
2123
+ ▌ **src/runner.js** 의 `console.log` ▌ src/runner.js 의 console.log
2124
+ ▌ - [ ] 남은 것: `src/worker.js` ▌ ☐ 남은 것: src/worker.js
2125
+ ▌ ```js ▌ ┌──────────────── js
2126
+ ▌ log.info('시작', { id }) ▌ │ log.info('시작', { id })
2127
+ ▌ |---|---| ▌ ┼────────┼─────────┼
2128
+ ```
2129
+
2130
+ Answers arrive in fragments, so a line can only be drawn **once it ends**. But a whole paragraph on one line would leave the screen still for seconds — so once a line grows past the screen width, everything up to there is **streamed raw**. Looking alive comes before looking neat.
2131
+
2132
+ <br>
2133
+
2134
+ Tests 2,532 → **2,578** · 48/48 files. Earlier releases are in the [tags](https://github.com/jysvai/deel-local-cli/tags).
2135
+
2136
+ </details>
2137
+
1800
2138
  ---
1801
2139
 
1802
2140
  ## Licence