deel-local-cli 1.8.0 → 1.12.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 (61) hide show
  1. package/README.ko.md +10 -25
  2. package/README.md +43 -51
  3. package/bin/deel.js +56 -13
  4. package/package.json +60 -60
  5. package/src/acp/serve.js +810 -732
  6. package/src/agent/budget.js +156 -153
  7. package/src/agent/compact.js +420 -296
  8. package/src/agent/effort.js +308 -177
  9. package/src/agent/evidence.js +2 -0
  10. package/src/agent/evolve.js +263 -213
  11. package/src/agent/filemem.js +155 -0
  12. package/src/agent/grade.js +51 -1
  13. package/src/agent/loop.js +1707 -1349
  14. package/src/agent/memory.js +156 -152
  15. package/src/agent/mention.js +210 -210
  16. package/src/agent/session.js +1049 -832
  17. package/src/agent/store.js +186 -9
  18. package/src/agent/threads.js +26 -1
  19. package/src/backend/adapter.js +1159 -615
  20. package/src/backend/cachemark.js +150 -0
  21. package/src/backend/detect.js +327 -288
  22. package/src/backend/learn.js +24 -0
  23. package/src/backend/mcp.js +96 -5
  24. package/src/backend/probe.js +131 -61
  25. package/src/backend/quota.js +250 -133
  26. package/src/backend/retry.js +30 -6
  27. package/src/backend/tokens.js +37 -0
  28. package/src/backend/toolfit.js +352 -0
  29. package/src/backend/wire.js +600 -0
  30. package/src/commands.js +3135 -2918
  31. package/src/config.js +47 -2
  32. package/src/i18n/en.js +544 -466
  33. package/src/i18n/index.js +18 -0
  34. package/src/i18n/ja.js +497 -417
  35. package/src/i18n/ko.js +591 -466
  36. package/src/i18n/zh.js +497 -417
  37. package/src/lsp/client.js +49 -5
  38. package/src/oneshot.js +620 -471
  39. package/src/pack/sbom.js +30 -4
  40. package/src/pack/selfpack.js +25 -9
  41. package/src/pack/sheet.en.js +288 -0
  42. package/src/pack/tar.js +65 -2
  43. package/src/plugins/manage.js +46 -9
  44. package/src/providers/bedrock.js +17 -0
  45. package/src/repl.js +2602 -2286
  46. package/src/safety/audit.js +92 -8
  47. package/src/safety/authcmd.js +14 -3
  48. package/src/safety/guard.js +143 -0
  49. package/src/safety/keystore.js +62 -39
  50. package/src/safety/undo.js +24 -6
  51. package/src/tools/fsutil.js +265 -250
  52. package/src/tools/index.js +239 -34
  53. package/src/tools/jobs.js +158 -29
  54. package/src/tools/verify.js +358 -328
  55. package/src/tools/webfetch.js +92 -9
  56. package/src/ui/md.js +201 -5
  57. package/src/ui/motion.js +0 -1
  58. package/src/ui/pastechip.js +50 -3
  59. package/src/ui/pick.js +115 -0
  60. package/src/ui/screen.js +23 -3
  61. package/src/ui/status.js +613 -610
package/README.ko.md CHANGED
@@ -94,7 +94,7 @@
94
94
  | [속도와 씀씀이](docs/ko/tuning.md) | 단계별 추론 강도 · 프리픽스 캐시 · 컨텍스트 길이 |
95
95
  | [안전망과 사내 반입](docs/ko/safety.md) | 되돌리기 · 작업 범위 · 감사기록 · 심사 서류 |
96
96
  | [설정](docs/ko/config.md) · [개발](docs/ko/develop.md) | 환경변수 · 실행 옵션 · 검사 돌리기 · 폴더 구조 |
97
- | [릴리스 노트](docs/ko/releases.md) | [1.7.x](docs/ko/releases/1.7.md) · [1.6.x](docs/ko/releases/1.6.md) · [1.5.x](docs/ko/releases/1.5.md) · [1.4.x](docs/ko/releases/1.4.md) · [1.3.x](docs/ko/releases/1.3.md) · [1.2.x](docs/ko/releases/1.2.md) |
97
+ | [릴리스 노트](docs/ko/releases.md) | [1.10.x](docs/ko/releases/1.10.md) · [1.9.x](docs/ko/releases/1.9.md) · [1.8.x](docs/ko/releases/1.8.md) · [1.7.x](docs/ko/releases/1.7.md) · [ ](docs/ko/releases.md) |
98
98
 
99
99
  ---
100
100
 
@@ -267,7 +267,7 @@ deel --offline
267
267
  무엇이 어디로 갈 수 있는지는 켤 때 화면 맨 위에 늘 적혀 있습니다.
268
268
 
269
269
  ```
270
- deel 1.8.0 ⌂ 이 안
270
+ deel 1.10.0 ⌂ 이 안
271
271
  보냄 이 컴퓨터 안 127.0.0.1:11434 ← 여기 말고는 어디로도 안 갑니다
272
272
  ```
273
273
 
@@ -475,7 +475,8 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
475
475
  | `/commit [전부\|미리보기\|제목]` | 이번 대화가 바꾼 것만 담아 커밋. 메시지는 diff 와 증거에서. **push 는 안 합니다** |
476
476
  | `/model` | 연결·모델 바꾸기 |
477
477
  | `/model 카드` | 이 모델을 겪어 본 결과 — 그래서 deel 이 무엇을 바꿔 뒀는지 |
478
- | `/think <강도>` | 추론 강도 (`off·low·medium·high·max`) |
478
+ | `/think <강도>` | 추론 강도 (`off·low·medium·high·xhigh·max`) — 창구가 안 받는 칸은 받는 값으로 낮춰 보냅니다 |
479
+ | `/think auto` | 시킨 말에 맞춰 강도를 고릅니다 — 정한 값이 **천장**이 됩니다 |
479
480
  | `/think 배분 <배분>` | 단계별 배분 (`균일·절약·깊게`) |
480
481
  | `/think 자세히` | 단계표 — 어느 단계를 어떤 강도·상한으로 도는지 |
481
482
  | `/mode <모드>` | 승인 정책 — 얼마나 물어보나 (`auto` · `confirm` · `strict`) |
@@ -1151,29 +1152,13 @@ zip 은 진짜 `unzip` 으로, tar 는 진짜 `tar` 가 만든 것을 읽혀 교
1151
1152
 
1152
1153
  | 판 | 무엇이 바뀌었나 |
1153
1154
  |---|---|
1155
+ | **[1.10.0](docs/ko/releases/1.10.md#1100)** | ESC 가 진짜로 멈춥니다 · 자리가 다 차도 그 턴 안에서 이어 갑니다 · 회사별 창구를 여덟 자리 전부 쟀습니다 |
1156
+ | [1.9.2](docs/ko/releases/1.9.md#192) | 막고 있다고 적어 둔 것이 실제로는 안 막고 있던 자리들 · 접히면 시킨 말과 남은 할 일이 사라지던 것 |
1157
+ | [1.9.1](docs/ko/releases/1.9.md#191) | 한글 이름을 쓴 MCP 도구가 모델 눈에 전부 같아 보이던 것 — 서로 다르고 판마다 같은 이름으로 |
1158
+ | **[1.9.0](docs/ko/releases/1.9.md#190)** | 표를 표로 그린다 · Claude·Bedrock 에 추론 강도가 실제로 걸린다 · 회사별 도구 규격 · 바뀐 자리만 다시 싣기 |
1154
1159
  | **[1.8.0](docs/ko/releases/1.8.md#180)** | 한 시간짜리 토큰을 쓰는 사내 게이트웨이에서 하루를 — 열쇠를 받아 오기 · `deel reset` · 영어 화면이 진짜 영어 |
1155
- | [1.7.0](docs/ko/releases/1.7.md#170) | 로컬은 그대로 두고, 말했을 때만 바깥으로 — 모드 셋 · 벤더 붙이기 · 자동 마스킹 · 돈 표시 |
1156
- | [1.6.3](docs/ko/releases/1.6.md#163) | 일이 되고 있는데 헛돈다고 끊던 자리 — 배열로 옮기면 무엇이 움직였는지가 사라졌다 |
1157
- | **[1.6.2](docs/ko/releases/1.6.md#162)** | 누르면 멈추고, 시킨 대로 하고, 안 끊긴다 — ESC · 되묻기 · 요청 누락 · 붙여넣기 접기 · 끊긴 자리 잇기 |
1158
- | **[1.6.1](docs/ko/releases/1.6.md#161)** | 헛도는 턴을 만들던 자리들 — 울타리가 `/dev/null` 까지 막던 것 · 옷 문서를 못 읽던 것 · 파일에서 그림이 사라지던 것 |
1159
- | **[1.6.0](docs/ko/releases/1.6.md#160)** | 사내망에서 안 되던 것들 — 프록시 · 429 · 윈도우 셸 · 5만 개 저장소 · PDF · 캡처 붙여넣기 · 에디터 이어하기 |
1160
- | **[1.5.8](docs/ko/releases/1.5.md#158)** | 5MB 문서를 919줄 중 8줄만 보던 것 · 정규식을 경로로 읽어 명령을 막던 것 |
1161
- | **[1.5.7](docs/ko/releases/1.5.md#157)** | 맥 한글 폴더에서 제 파일이 「범위 밖」이던 것 · 붙여넣기 · ESC |
1162
- | **[1.5.6](docs/ko/releases/1.5.md#156)** | 막히면 물어본다 — 글로 묻고 턴을 끝내는 대신에 |
1163
- | **[1.5.5](docs/ko/releases/1.5.md#155)** | 계획을 세우면 방이 찬다 — 「한 명뿐」은 고정이 아니라 버그였다 |
1164
- | [1.5.4](docs/ko/releases/1.5.md#154) | 방에 하루가 흐른다 — 아침·낮·노을·밤 · 벽시계 · 식은 커피 |
1165
- | [1.5.3](docs/ko/releases/1.5.md#153) | 맥에서 걸린 세 가지 — 줄바꿈 안내 · 사무실이 안 사라짐 · `/motion` 하나로 |
1166
- | [1.5.2](docs/ko/releases/1.5.md#152) | 적대적 리뷰가 남긴 나머지를 전부 정리했다 — 화면이 거짓말하던 자리들 |
1167
- | [1.5.1](docs/ko/releases/1.5.md#151) | 1.5.0 이 넣은 것 두 개가 망가진 채 나갔다. 그것을 고친다 |
1168
- | [1.5.0](docs/ko/releases/1.5.md#150) | 줄바꿈이 생겼고, 화면이 재미있어졌고, 그러면서 오히려 가벼워졌다 |
1169
- | [1.4.3](docs/ko/releases/1.4.md#143) | README 가 왜 다른지 말하고, 심사서의 빠진 한 줄을 채운다 |
1170
- | [1.4.2](docs/ko/releases/1.4.md#142) | 1.4.1 이 보안 수정 전에 나갔다 — 그걸 바로잡는 판 |
1171
- | [1.4.1](docs/ko/releases/1.4.md#141) | 새 기능 없이, 실제로 찾은 것만 고친다 — 윈도우 abort·ReDoS·XSS |
1172
- | [1.4.0](docs/ko/releases/1.4.md#140) | deel 이 제 얼굴을 갖고, 영어로도 말하고, 뜻까지 본다 — 열한 자리 |
1173
- | [1.3.0](docs/ko/releases/1.3.md#130) | 말 대신 증거, 터미널 대신 에디터 — 여섯 자리 |
1174
- | [1.2.0](docs/ko/releases/1.2.md#120) | 대화가 끊기지 않게 — 여섯 자리 |
1175
-
1176
- 무엇이 왜 바뀌었는지는 **[릴리스 노트](docs/ko/releases.md)** 에 있습니다.
1160
+
1161
+ 가까운 다섯 판만 적었습니다. 나머지 전부와 무엇이 왜 바뀌었는지는 **[릴리스 노트](docs/ko/releases.md)** 있습니다.
1177
1162
 
1178
1163
  ---
1179
1164
 
package/README.md CHANGED
@@ -119,7 +119,7 @@ This page is the **summary**. Each section links to the detail behind it.
119
119
  | [Speed and spend](docs/en/tuning.md) | Per-stage effort · the prefix cache · context length |
120
120
  | [Safety and corporate review](docs/en/safety.md) | Undo · working scope · audit log · the review package |
121
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) |
122
+ | [Release notes](docs/en/releases.md) | [1.10.x](docs/en/releases/1.10.md) · [1.9.x](docs/en/releases/1.9.md) · [1.8.x](docs/en/releases/1.8.md) · [1.7.x](docs/en/releases/1.7.md) · [older](docs/en/releases.md) |
123
123
 
124
124
  ---
125
125
 
@@ -256,8 +256,10 @@ English instead of Korean. That side is cheaper, too: the part of the window tha
256
256
  single request drops from about 4,900 tokens to about 3,450 — on a 32k model, from 15% of the
257
257
  window to 10.5%.
258
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.
259
+ Tool and argument names are ASCII in every language `Read(file_path)`, `Task(purpose)`.
260
+ Those are identifiers, not prose, and several vendors reject a non-ASCII name outright.
261
+ The Korean names some models learned earlier are still accepted on the way *in*, so a model
262
+ that sends `목적` instead of `purpose` still gets through.
261
263
 
262
264
  ### Install
263
265
 
@@ -335,7 +337,7 @@ deel --offline
335
337
  The destination is printed at the top of every session:
336
338
 
337
339
  ```
338
- deel 1.8.0 ⌂ inside
340
+ deel 1.10.0 ⌂ inside
339
341
  Sends to this machine 127.0.0.1:11434 ← nowhere else
340
342
  ```
341
343
 
@@ -426,7 +428,7 @@ amounts six months later. Write them in `.deel/config.json` — dollars per
426
428
  million tokens:
427
429
 
428
430
  ```json
429
- "요금": { "claude-opus-4-6": { "입력": 0, "출력": 0, "기준": "2026-09-01" } }
431
+ "pricing": { "claude-opus-4-6": { "input": 0, "output": 0, "asOf": "2026-09-01" } }
430
432
  ```
431
433
 
432
434
  The amount is shown with **where it came from and as of when**, and after six
@@ -445,9 +447,9 @@ never the problem.
445
447
  So write down *how to get a key* instead of the key:
446
448
 
447
449
  ```json
448
- "열쇠받기": {
449
- "명령": "az account get-access-token --resource api://ai-gw --query accessToken -o tsv",
450
- "수명": 3600
450
+ "authCommand": {
451
+ "command": "az account get-access-token --resource api://ai-gw --query accessToken -o tsv",
452
+ "ttl": 3600
451
453
  }
452
454
  ```
453
455
 
@@ -534,15 +536,16 @@ Names follow Claude Code / Codex conventions.
534
536
  | `/evidence [file]` | Evidence — what changed, and what proves it. **What is unproven is listed too** |
535
537
  | `/commit [all\|preview\|title]` | Commits only what this session changed; message from the diff and the evidence. **Never pushes** |
536
538
  | `/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 |
539
+ | `/model card` | Model card — what this model has actually done here, and what deel changed because of it |
540
+ | `/think <level>` | Reasoning level (`off·low·medium·high·xhigh·max`) — a rung this endpoint does not accept is lowered to one it does |
541
+ | `/think auto` | Effort follows the request — your setting becomes the **ceiling** |
542
+ | `/think profile <name>` | Per-stage profile (`even·save·deep`) |
543
+ | `/think detail` | Stage table — which stage runs at which level and cap |
541
544
  | `/mode <mode>` | Approval policy — how much it asks (`auto` · `confirm` · `strict`) |
542
545
  | `/work [mode]` | Work mode — what kind of work you are doing |
543
546
  | `/auto` | Hand the wheel back — it picks the mode from what you type |
544
547
  | `/code` `/plan` `/architect` `/debug` `/ask` `/orchestrator` | Switch work mode directly (pins it) |
545
- | `/level [level]` | How much to show (`쉬움` simple · `개발자` developer) |
548
+ | `/level [level]` | How much to show (`simple` · `developer`) |
546
549
  | `/motion [plain\|knight\|animal\|office\|off]` | What animates while it works — takes effect at once, and is saved |
547
550
  | `/undo [turns]` | Revert file changes |
548
551
  | `/diff [file]` | Files changed this session, and the changed lines |
@@ -572,7 +575,7 @@ the conversation.
572
575
  |---|---|
573
576
  | `Tab` | Completes the `/` command you are typing. Candidates appear under the box as you type |
574
577
  | `Shift+Tab` | Approval policy (`⏵⏵ auto` → `⏵ risky only` → `⏸ everything`) |
575
- | `Ctrl+O` | Work mode (`종합``코드``계획` → …) |
578
+ | `Ctrl+O` | Work mode (`Auto``Code``Plan` → …) |
576
579
  | `↑` `↓` | Input history |
577
580
  | `Ctrl+C` | Stops the answer in progress; twice on an empty line quits |
578
581
  | Typing while it works, then `Enter` | Steers without throwing anything away — takes effect from the next step |
@@ -622,13 +625,13 @@ overrides something a person chose.
622
625
  Twenty commands on first launch means nothing gets chosen. Locking features away means
623
626
  hitting a wall later. So only **what is shown** differs.
624
627
 
625
- | | Simple (`쉬움`, default) | Developer (`개발자`) |
628
+ | | Simple (default) | Developer |
626
629
  |---|---|---|
627
630
  | `/help` listing | Common commands only | Everything |
628
631
  | Error messages | What to do about it | The original text |
629
632
  | Safety | **Identical** | **Identical** |
630
633
 
631
- `/level 개발자` is saved to config and persists across sessions.
634
+ `/level developer` is saved to config and persists across sessions.
632
635
 
633
636
  Two things matter here:
634
637
 
@@ -790,8 +793,8 @@ not a stage table.
790
793
  ```
791
794
  $ /think
792
795
 
793
- 추론 강도 medium ( 판단 medium · 이어가기 low · 막혔을 high)
794
- 세게 /think high 빠르게 /think low
796
+ Effort medium (First call medium · Continue low · Stuck high)
797
+ harder /think high faster /think low
795
798
  ```
796
799
 
797
800
  | Profile | Character |
@@ -800,25 +803,25 @@ $ /think
800
803
  | `save` (default) | Hard on the first decision only |
801
804
  | `deep` | Everything one notch up — for hard work |
802
805
 
803
- Set the profile with `/think 배분 절약`. **Level and profile are different axes, so the
806
+ Set the profile with `/think profile save`. **Level and profile are different axes, so the
804
807
  commands were split** — `/think high` and `/think save` used to set different things under
805
808
  one name, which made the screen unreadable.
806
809
 
807
- The stage table moved to `/think 자세히` (the default at developer level).
810
+ The stage table moved to `/think detail` (the default at developer level).
808
811
 
809
812
  ```
810
- $ /think 자세히
813
+ $ /think detail
811
814
 
812
- 추론 강도 medium ( 판단 medium · 이어가기 low · 막혔을 high)
813
- 배분 절약 판단만 세게, 이어가기는 얕게 대개 이게 낫습니다
815
+ Effort medium (First call medium · Continue low · Stuck high)
816
+ Profile save Hard on the first call, shallow while continuing - usually the better trade
814
817
 
815
- 단계 강도 출력상한 언제
816
- 판단 · medium 15,549 무엇을 할지 정하는 자리
817
- 이어가기 ↓ low 13,605 도구 결과를 읽고 다음
818
- 막혔을 때 ↑ high 16,384 직전 도구가 오류를
818
+ Stage Effort Out cap When
819
+ First call · medium 14,069 Deciding what to do
820
+ Continue ↓ low 12,310 Reading a tool result, picking the next move
821
+ Stuck ↑ high 15,827 The last tool returned an error
819
822
 
820
- 출력 상한은 16,384 (모르는 값이라 기본값) 안에서 나눕니다 — /out
821
- 컨텍스트 40,960 · 지금 찬 양 2,087
823
+ Caps are shared inside 16,384 (unknown, so a default) — /out
824
+ Context 40,960 · used 5,787
822
825
  ```
823
826
 
824
827
  That second-to-last line exists for a reason: **when all three caps are equal, it is the
@@ -1096,9 +1099,9 @@ audit-log spec to write SIEM ingestion rules.
1096
1099
 
1097
1100
  | File | What |
1098
1101
  |---|---|
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 |
1102
+ | `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 |
1100
1103
  | `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 |
1104
+ | `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 |
1102
1105
 
1103
1106
  ```bash
1104
1107
  deel audit # the human-readable sheet only
@@ -1107,6 +1110,9 @@ deel sbom --out review.json # to a file
1107
1110
  deel sbom --only sbom # just the SBOM
1108
1111
  ```
1109
1112
 
1113
+ With the screen language set to English these three, and the `deel pack` archive itself,
1114
+ come out in English — file names included (`deel pack` writes `deel-import.zip`).
1115
+
1110
1116
  All three are generated by scanning the source, never written by hand — hand-written sheets
1111
1117
  drift, and **a review document that drifts is worse than none.** Find one wrong line and the
1112
1118
  reviewer stops trusting the rest. The audit-log spec is the one hand-written part, so a test
@@ -1203,27 +1209,13 @@ so one run tells you everything.
1203
1209
 
1204
1210
  | Version | What changed |
1205
1211
  |---|---|
1212
+ | **[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 |
1213
+ | [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 |
1214
+ | [1.9.1](docs/en/releases/1.9.md#191) | MCP tools with Korean names all looked the same to the model — names are now distinct and stable |
1215
+ | **[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 |
1206
1216
  | **[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)**.
1217
+
1218
+ The five most recent are listed here. Every version, and why each thing changed, is in the **[release notes](docs/en/releases.md)**.
1227
1219
 
1228
1220
  ---
1229
1221
 
package/bin/deel.js CHANGED
@@ -15,6 +15,8 @@ import { runSessions } from '../src/agent/sessionui.js';
15
15
  import { acp } from '../src/acp/serve.js';
16
16
  import { runCompletion } from '../src/completion.js';
17
17
  import { runReset } from '../src/reset.js';
18
+ import { 언어잡기, 언어 } from '../src/i18n/index.js';
19
+ import { load as 설정읽기 } from '../src/config.js';
18
20
 
19
21
  const MIN_NODE = 20;
20
22
 
@@ -35,25 +37,63 @@ function 판번호() {
35
37
  }
36
38
  }
37
39
 
40
+ /*
41
+ * 켤 때 말을 한 번 정한다.
42
+ *
43
+ * 여태 이 자리가 비어 있었다. 말을 정하는 곳이 repl.js 하나뿐이라서,
44
+ * `deel audit`·`deel pack`·`deel sbom` 은 **언제나 한국어**로 나왔다 —
45
+ * /lang en 으로 쓰던 사람이 심사에 낼 서류를 뽑으면 한글 문서가 나왔다는 뜻이다.
46
+ *
47
+ * 설정을 못 읽어도 죽지 않는다. 말 하나 때문에 `deel --version` 이 안 되면 안 된다.
48
+ */
49
+ function 말정하기() {
50
+ let cfg = null;
51
+ try { cfg = 설정읽기(); } catch { /* 설정이 없어도 기본 말로 돈다 */ }
52
+ return 언어잡기({ cfg });
53
+ }
54
+
38
55
  // 사내 반입용 묶음 만들기.
39
56
  function runPack(flags) {
40
- const out = flags.out ? String(flags.out) : join(process.cwd(), 'deel-반입.zip');
57
+ const 한국어 = 언어() === 'ko';
58
+ const out = flags.out ? String(flags.out) : join(process.cwd(), 한국어 ? 'deel-반입.zip' : 'deel-import.zip');
41
59
  const r = packSelf(out);
42
60
  const a = r.audit;
43
61
  say('');
44
- rule('반입 묶음', 70);
62
+ rule(한국어 ? '반입 묶음' : 'Review package', 70);
45
63
  say(` ${mark.ok} ${c.bold(r.out)}`);
46
- say(` ${c.gray(`${r.files}개 파일 · ${(r.bytes / 1024).toFixed(1)}KB`)}`);
64
+ say(` ${c.gray(한국어 ? `${r.files}개 파일 · ${(r.bytes / 1024).toFixed(1)}KB` : `${r.files} files · ${(r.bytes / 1024).toFixed(1)}KB`)}`);
47
65
  say('');
48
- say(` ${c.gray('의존성')} ${a.deps.length === 0 ? c.green('0개') : c.red(a.deps.length + '')}`);
49
- say(` ${c.gray('설치 스크립트')} ${a.lifecycle.length === 0 ? c.green('없음') : c.red(a.lifecycle.join(', '))}`);
50
- say(` ${c.gray('외부 import')} ${a.외부모듈.length === 0 ? c.green('0건') : c.red(a.외부모듈.length + '건')}`);
51
- say(` ${c.gray('네트워크 호출')} ${a.calls.net.length}곳 ${c.gray('(설정한 주소로만)')}`);
52
- say(` ${c.gray('포트 열기')} ${a.calls.listen.length === 0 ? c.green('없음') : c.red(a.calls.listen.length + '곳')}`);
66
+ const 없음 = 한국어 ? '없음' : 'none';
67
+ const 개 = (n, 단위) => (한국어 ? `${n}${단위}` : String(n));
68
+ /*
69
+ * 이름 칸을 손으로 띄우지 않는다.
70
+ *
71
+ * 한글은 한 글자가 두 칸이라 「의존성」 과 「Dependencies」 를 같은 수의
72
+ * 빈칸으로 맞출 수 없다. 손으로 맞춰 두면 말을 바꾸는 순간 줄이 어긋난다 —
73
+ * 실제로 영어판이 처음에 그렇게 어긋났다.
74
+ */
75
+ const 칸 = (ko, en) => (한국어 ? ko : en.padEnd(18));
76
+ say(` ${c.gray(칸('의존성 ', 'Dependencies'))}${a.deps.length === 0 ? c.green(개(0, '개')) : c.red(개(a.deps.length, '개'))}`);
77
+ say(` ${c.gray(칸('설치 스크립트 ', 'Install scripts'))}${a.lifecycle.length === 0 ? c.green(없음) : c.red(a.lifecycle.join(', '))}`);
78
+ say(` ${c.gray(칸('외부 import ', 'External imports'))}${a.외부모듈.length === 0 ? c.green(개(0, '건')) : c.red(개(a.외부모듈.length, '건'))}`);
79
+ say(` ${c.gray(칸('네트워크 호출 ', 'Network calls'))}${개(a.calls.net.length, '곳')} ${c.gray(한국어 ? '(설정한 주소로만)' : '(only to the configured address)')}`);
80
+ say(` ${c.gray(칸('포트 열기 ', 'Listening ports'))}${a.calls.listen.length === 0 ? c.green(없음) : c.red(개(a.calls.listen.length, '곳'))}`);
53
81
  say('');
54
- say(` ${c.gray('안에 반입심사서.txt · sbom.cdx.json · 심사명세.json 이 같이 들어 있습니다.')}`);
55
- say(` ${c.gray('사람이 읽을 장, 스캐너에 넣을 장입니다 — 그대로 제출하시면 됩니다.')}`);
56
- say(` ${c.gray('내용만 먼저 보시려면')} ${c.cyan('deel audit')}`);
82
+ /*
83
+ * 여기 적는 이름은 zip 안에 진짜로 이름이어야 한다.
84
+ *
85
+ * 안내 글과 실제 파일 이름이 어긋나면, 받은 사람은 없는 파일을 찾다가
86
+ * 묶음이 잘못 만들어진 줄 안다 — 서류를 못 믿게 되는 자리다.
87
+ */
88
+ if (한국어) {
89
+ say(` ${c.gray('안에 반입심사서.txt · sbom.cdx.json · 심사명세.json 이 같이 들어 있습니다.')}`);
90
+ say(` ${c.gray('사람이 읽을 것 한 장, 스캐너에 넣을 것 두 장입니다 — 그대로 제출하시면 됩니다.')}`);
91
+ say(` ${c.gray('내용만 먼저 보시려면')} ${c.cyan('deel audit')}`);
92
+ } else {
93
+ say(` ${c.gray('It contains import-review.txt · sbom.cdx.json · audit-spec.json.')}`);
94
+ say(` ${c.gray('One document to read, two to feed a scanner — submit them as they are.')}`);
95
+ say(` ${c.gray('To see the contents first:')} ${c.cyan('deel audit')}`);
96
+ }
57
97
  say('');
58
98
  return 0;
59
99
  }
@@ -187,7 +227,7 @@ function help() {
187
227
  say(` ${c.gray('--level <수준>')} 쉬움(기본) / 개발자`);
188
228
  say(` ${c.gray('--ctx <길이>')} 컨텍스트 길이 직접 지정 (655360 · 640k · 128k). 없으면 서버에 맞춤`);
189
229
  say(` ${c.gray('--max-tokens <길이>')} 한 번에 받을 답 길이 상한 (32k). 큰 파일이 잘리면 올린다 — /out 과 같은 값`);
190
- say(` ${c.gray('--think <수준>')} off / low / medium(기본) / high / max`);
230
+ say(` ${c.gray('--think <수준>')} off / low / medium(기본) / high / xhigh / max`);
191
231
  say(` ${c.gray('--effort <배분>')} even(균일) / save(절약, 기본) / deep(깊게)`);
192
232
  say(` ${c.gray('--no-tui')} 입력 상자 없이 줄 화면으로 (파이프·기록·좁은 터미널)`);
193
233
  // 실행 모드 셋. 기본이 잠겨 있다는 것을 여기서 분명히 말한다 —
@@ -208,7 +248,7 @@ function help() {
208
248
  say(` ${c.gray('--quiet')} 도구가 무엇을 했는지 안 적음 (오류는 그래도 적음)`);
209
249
  say(` ${c.gray('--yes')} 승인이 필요한 것도 그냥 실행. ${c.yellow('기본은 거부입니다')}`);
210
250
  say(` ${c.gray('답은 표준출력, 도구 기록은 표준오류로 나갑니다 — 파이프로 넘겨도 답만 넘어갑니다.')}`);
211
- say(` ${c.gray('끝난 까닭이 종료코드에 담깁니다:')} ${c.gray('0 끝냄 · 1 오류 · 2 걸음수상한 · 3 헛돎 · 4 중단')}`);
251
+ say(` ${c.gray('끝난 까닭이 종료코드에 담깁니다:')} ${c.gray('0 끝냄 · 1 오류 · 2 걸음수상한 · 3 헛돎 · 4 중단 · 5 말없이끊김')}`);
212
252
  say('');
213
253
  say(` ${c.bold('진단 직접 지정')} ${c.gray('— 설정을 남기지 않고 확인만 할 때')}`);
214
254
  say('');
@@ -231,6 +271,9 @@ async function main() {
231
271
 
232
272
  const { cmd: 친명령, args, flags } = parse(process.argv.slice(2));
233
273
 
274
+ // 서류를 뽑는 명령(audit·sbom·pack)이 어느 말로 나갈지를 여기서 정한다.
275
+ 말정하기();
276
+
234
277
  /*
235
278
  * `deel online` · `deel offline` 은 깃발의 별칭이다.
236
279
  *
package/package.json CHANGED
@@ -1,60 +1,60 @@
1
- {
2
- "name": "deel-local-cli",
3
- "version": "1.8.0",
4
- "description": "로컬 모델·사내 게이트웨이 전용 코딩 에이전트 CLI 외부 의존성 0개 / Zero-dependency coding agent CLI for local LLMs and private gateways",
5
- "type": "module",
6
- "license": "MIT",
7
- "bin": {
8
- "deel": "bin/deel.js"
9
- },
10
- "engines": {
11
- "node": ">=20"
12
- },
13
- "files": [
14
- "bin",
15
- "src",
16
- "README.md",
17
- "README.ko.md",
18
- "LICENSE"
19
- ],
20
- "keywords": [
21
- "cli",
22
- "coding-agent",
23
- "local-llm",
24
- "ollama",
25
- "lm-studio",
26
- "openai-compatible",
27
- "offline",
28
- "air-gapped",
29
- "zero-dependency",
30
- "agent",
31
- "acp",
32
- "agent-client-protocol",
33
- "zed",
34
- "korean"
35
- ],
36
- "repository": {
37
- "type": "git",
38
- "url": "git+https://github.com/jysvai/deel-local-cli.git"
39
- },
40
- "bugs": {
41
- "url": "https://github.com/jysvai/deel-local-cli/issues"
42
- },
43
- "homepage": "https://github.com/jysvai/deel-local-cli#readme",
44
- "scripts": {
45
- "start": "node bin/deel.js",
46
- "setup": "node bin/deel.js setup",
47
- "diagnose": "node bin/deel.js diagnose",
48
- "chat": "node bin/deel.js",
49
- "test": "node test/run.mjs",
50
- "docs": "node tools/check-docs.mjs",
51
- "verify": "node test/no-bundle.test.js && node test/network.test.js && node test/web.test.js",
52
- "bench": "node test/edit-bench.js",
53
- "demo": "node test/demo.js",
54
- "check": "node --check bin/deel.js && node --check src/repl.js && node --check src/oneshot.js && node --check src/commands.js && node --check src/agent/loop.js && node --check src/agent/session.js && node --check src/agent/effort.js && node --check src/agent/modes.js && node --check src/agent/route.js && node --check src/agent/askcheck.js && node --check src/agent/asks.js && node --check src/agent/models.js && node --check src/agent/grade.js && node --check src/agent/mention.js && node --check src/agent/project.js && node --check src/tools/encoding.js && node --check src/tools/excel-com.js && node --check src/tools/excel.js && node --check src/tools/xlsx.js && node --check src/tools/docs.js && node --check src/tools/convert.js && node --check src/tools/pdf.js && node --check src/tools/clipboard.js && node --check src/agent/compact.js && node --check src/agent/store.js && node --check src/agent/sessionui.js && node --check src/backend/adapter.js && node --check src/backend/ctxsize.js && node --check src/backend/probe.js && node --check src/backend/detect.js && node --check src/backend/http.js && node --check src/backend/retry.js && node --check src/backend/proxy.js && node --check src/backend/azure.js && node --check src/backend/vision.js && node --check src/backend/quota.js && node --check src/backend/price.js && node --check src/backend/scan.js && node --check src/backend/scanui.js && node --check src/tools/index.js && node --check src/tools/desc.en.js && node --check src/tools/lsp.js && node --check src/lsp/rpc.js && node --check src/lsp/servers.js && node --check src/lsp/client.js && node --check src/lsp/diag.js && node --check src/tools/fsutil.js && node --check src/tools/ignore.js && node --check src/tools/spawn.js && node --check src/tools/fastgrep.js && node --check src/tools/edit-match.js && node --check src/tools/webfetch.js && node --check src/tools/todo.js && node --check src/tools/jobs.js && node --check src/tools/shell.js && node --check src/skills/discover.js && node --check src/plugins/manage.js && node --check src/pack/zip.js && node --check src/pack/tar.js && node --check src/pack/selfpack.js && node --check src/safety/guard.js && node --check src/safety/undo.js && node --check src/safety/audit.js && node --check src/safety/keystore.js && node --check src/safety/authcmd.js && node --check src/safety/policy.js && node --check src/safety/network.js && node --check src/safety/runmode.js && node --check src/providers/index.js && node --check src/providers/openai.js && node --check src/providers/anthropic.js && node --check src/providers/gemini.js && node --check src/providers/bedrock.js && node --check src/providers/custom.js && node --check src/setup.js && node --check src/report.js && node --check src/config.js && node --check src/completion.js && node --check src/ui/diff.js && node --check src/ui/ansi.js && node --check src/ui/status.js && node --check src/ui/level.js && node --check src/ui/prompt.js && node --check src/ui/spinner.js && node --check src/ui/motion.js && node --check src/ui/office.js && node --check src/ui/notify.js && node --check src/ui/intro.js && node --check src/ui/banner.js && node --check src/ui/export.js && node --check src/i18n/index.js && node --check src/i18n/ko.js && node --check src/i18n/en.js && node --check src/i18n/ja.js && node --check src/i18n/zh.js && node --check src/preview/serve.js && node --check src/ui/working.js && node --check src/ui/inputbox.js && node --check src/ui/wrap.js && node --check src/ui/pastechip.js && node --check src/ui/histline.js && node --check src/ui/md.js && node --check src/agent/threads.js && node --check src/agent/evolve.js && node --check src/agent/pins.js && node --check src/agent/card.js && node --check src/agent/preset.js && node --check src/agent/evidence.js && node --check src/agent/commit.js && node --check src/agent/review.js && node --check src/acp/jsonrpc.js && node --check src/acp/map.js && node --check src/acp/serve.js && node --check src/pack/sbom.js && node --check src/safety/secrets.js && node --check src/version.js && node --check src/agent/budget.js && node --check src/agent/memory.js && node --check src/agent/recall.js && node --check src/agent/salvage.js && node --check src/backend/learn.js && node --check src/backend/mcp.js && node --check src/tools/task.js && node --check src/tools/outline.js && node --check src/tools/verify.js && node --check src/ui/approve.js && node --check src/ui/complete.js && node --check src/ui/screen.js && node --check src/reset.js && echo OK",
55
- "coverage": "node test/coverage.mjs",
56
- "prepublishOnly": "npm run check && npm test"
57
- },
58
- "dependencies": {},
59
- "devDependencies": {}
60
- }
1
+ {
2
+ "name": "deel-local-cli",
3
+ "version": "1.12.0",
4
+ "description": "A coding-agent CLI that runs on local models and private gateways. Zero dependencies, Node 20+.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "bin": {
8
+ "deel": "bin/deel.js"
9
+ },
10
+ "engines": {
11
+ "node": ">=20"
12
+ },
13
+ "files": [
14
+ "bin",
15
+ "src",
16
+ "README.md",
17
+ "README.ko.md",
18
+ "LICENSE"
19
+ ],
20
+ "keywords": [
21
+ "cli",
22
+ "coding-agent",
23
+ "local-llm",
24
+ "ollama",
25
+ "lm-studio",
26
+ "openai-compatible",
27
+ "offline",
28
+ "air-gapped",
29
+ "zero-dependency",
30
+ "agent",
31
+ "acp",
32
+ "agent-client-protocol",
33
+ "zed",
34
+ "korean"
35
+ ],
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "git+https://github.com/jysvai/deel-local-cli.git"
39
+ },
40
+ "bugs": {
41
+ "url": "https://github.com/jysvai/deel-local-cli/issues"
42
+ },
43
+ "homepage": "https://github.com/jysvai/deel-local-cli#readme",
44
+ "scripts": {
45
+ "start": "node bin/deel.js",
46
+ "setup": "node bin/deel.js setup",
47
+ "diagnose": "node bin/deel.js diagnose",
48
+ "chat": "node bin/deel.js",
49
+ "test": "node test/run.mjs",
50
+ "docs": "node tools/check-docs.mjs",
51
+ "verify": "node test/no-bundle.test.js && node test/network.test.js && node test/web.test.js",
52
+ "bench": "node test/edit-bench.js",
53
+ "demo": "node test/demo.js",
54
+ "check": "node --check bin/deel.js && node --check src/repl.js && node --check src/oneshot.js && node --check src/commands.js && node --check src/agent/loop.js && node --check src/agent/session.js && node --check src/agent/effort.js && node --check src/agent/modes.js && node --check src/agent/route.js && node --check src/agent/askcheck.js && node --check src/agent/asks.js && node --check src/agent/models.js && node --check src/agent/grade.js && node --check src/agent/mention.js && node --check src/agent/project.js && node --check src/tools/encoding.js && node --check src/tools/excel-com.js && node --check src/tools/excel.js && node --check src/tools/xlsx.js && node --check src/tools/docs.js && node --check src/tools/convert.js && node --check src/tools/pdf.js && node --check src/tools/clipboard.js && node --check src/agent/compact.js && node --check src/agent/store.js && node --check src/agent/sessionui.js && node --check src/backend/adapter.js && node --check src/backend/toolfit.js && node --check src/backend/ctxsize.js && node --check src/backend/probe.js && node --check src/backend/detect.js && node --check src/backend/http.js && node --check src/backend/retry.js && node --check src/backend/proxy.js && node --check src/backend/azure.js && node --check src/backend/vision.js && node --check src/backend/quota.js && node --check src/backend/wire.js && node --check src/backend/tokens.js && node --check src/backend/cachemark.js && node --check src/backend/price.js && node --check src/backend/scan.js && node --check src/backend/scanui.js && node --check src/tools/index.js && node --check src/tools/desc.en.js && node --check src/tools/lsp.js && node --check src/lsp/rpc.js && node --check src/lsp/servers.js && node --check src/lsp/client.js && node --check src/lsp/diag.js && node --check src/tools/fsutil.js && node --check src/tools/ignore.js && node --check src/tools/spawn.js && node --check src/tools/fastgrep.js && node --check src/tools/edit-match.js && node --check src/tools/webfetch.js && node --check src/tools/todo.js && node --check src/tools/jobs.js && node --check src/tools/shell.js && node --check src/skills/discover.js && node --check src/plugins/manage.js && node --check src/pack/zip.js && node --check src/pack/tar.js && node --check src/pack/selfpack.js && node --check src/safety/guard.js && node --check src/safety/undo.js && node --check src/safety/audit.js && node --check src/safety/keystore.js && node --check src/safety/authcmd.js && node --check src/safety/policy.js && node --check src/safety/network.js && node --check src/safety/runmode.js && node --check src/providers/index.js && node --check src/providers/openai.js && node --check src/providers/anthropic.js && node --check src/providers/gemini.js && node --check src/providers/bedrock.js && node --check src/providers/custom.js && node --check src/setup.js && node --check src/report.js && node --check src/config.js && node --check src/completion.js && node --check src/ui/diff.js && node --check src/ui/ansi.js && node --check src/ui/status.js && node --check src/ui/level.js && node --check src/ui/prompt.js && node --check src/ui/spinner.js && node --check src/ui/motion.js && node --check src/ui/office.js && node --check src/ui/notify.js && node --check src/ui/intro.js && node --check src/ui/banner.js && node --check src/ui/export.js && node --check src/i18n/index.js && node --check src/i18n/ko.js && node --check src/i18n/en.js && node --check src/i18n/ja.js && node --check src/i18n/zh.js && node --check src/preview/serve.js && node --check src/ui/working.js && node --check src/ui/inputbox.js && node --check src/ui/wrap.js && node --check src/ui/pastechip.js && node --check src/ui/pick.js && node --check src/ui/histline.js && node --check src/ui/md.js && node --check src/agent/threads.js && node --check src/agent/evolve.js && node --check src/agent/pins.js && node --check src/agent/card.js && node --check src/agent/preset.js && node --check src/agent/evidence.js && node --check src/agent/commit.js && node --check src/agent/review.js && node --check src/acp/jsonrpc.js && node --check src/acp/map.js && node --check src/acp/serve.js && node --check src/pack/sbom.js && node --check src/pack/sheet.en.js && node --check src/safety/secrets.js && node --check src/version.js && node --check src/agent/budget.js && node --check src/agent/filemem.js && node --check src/agent/memory.js && node --check src/agent/recall.js && node --check src/agent/salvage.js && node --check src/backend/learn.js && node --check src/backend/mcp.js && node --check src/tools/task.js && node --check src/tools/outline.js && node --check src/tools/verify.js && node --check src/ui/approve.js && node --check src/ui/complete.js && node --check src/ui/screen.js && node --check src/reset.js && echo OK",
55
+ "coverage": "node test/coverage.mjs",
56
+ "prepublishOnly": "npm run check && npm test"
57
+ },
58
+ "dependencies": {},
59
+ "devDependencies": {}
60
+ }