deel-local-cli 2.1.6 → 2.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.ko.md CHANGED
@@ -323,7 +323,7 @@ deel --offline
323
323
  무엇이 어디로 갈 수 있는지는 켤 때 화면 맨 위에 늘 적혀 있습니다.
324
324
 
325
325
  ```
326
- deel 2.1.6 ⌂ 이 안
326
+ deel 2.1.7 ⌂ 이 안
327
327
  보냄 이 컴퓨터 안 127.0.0.1:11434 ← 여기 말고는 어디로도 안 갑니다
328
328
  ```
329
329
 
@@ -1341,7 +1341,8 @@ zip 은 진짜 `unzip` 으로, tar 는 진짜 `tar` 가 만든 것을 읽혀 교
1341
1341
 
1342
1342
  | 판 | 무엇이 바뀌었나 |
1343
1343
  |---|---|
1344
- | **[2.1.6](docs/ko/releases/2.1.md#216)** | 맥에서 제대로 돌게 — 길거나 손으로 바꾼 키체인 열쇠 · 잠긴 키체인, `/tmp` · `/var`(`/private` 링크) 아래 믿은 폴더를 알아봄, 파이프가 늦게 읽어도 64KB 넘는 출력이 안 잘림(맥 · 리눅스). 관문 CI 에 맥이 들어갔습니다 |
1344
+ | **[2.1.7](docs/ko/releases/2.1.md#217)** | 맥 기본 셸 zsh 에서 파일 이름 Tab 이 됩니다(`bad substitution` 오류였음) · 12MB 넘는 클립보드 그림은 osascript 탓이 아니라 「너무 큽니다」 · 자모로 풀린(NFD) 한글 프로필 이름이 키체인에 주인 없는 항목을 안 남김 |
1345
+ | [2.1.6](docs/ko/releases/2.1.md#216) | 맥에서 제대로 돌게 — 길거나 손으로 바꾼 키체인 열쇠 · 잠긴 키체인, `/tmp` · `/var`(`/private` 링크) 아래 믿은 폴더를 알아봄, 파이프가 늦게 읽어도 64KB 넘는 출력이 안 잘림(맥 · 리눅스). 관문 CI 에 맥이 들어갔습니다 |
1345
1346
  | [2.1.5](docs/ko/releases/2.1.md#215) | 급한 보안 수정 — 셸 명령이 작업 폴더 밖으로 새던 자리를 막았습니다. 빗금 없는 `..`(`find .. -delete` · `rd /s /q ..`) · `$PWD` · `%CD%` · `$OLDPWD` · 먼저 옮긴 적 없는 `cd -` · `C:..` · 파워셸의 다른 이름(`ri` · `del` …) |
1346
1347
  | [2.1.4](docs/ko/releases/2.1.md#214) | 브라우저로 로그인 — `deel setup` 3번이 열쇠 없이 OpenRouter 계정 로그인(OAuth PKCE)으로 붙습니다. 열쇠 하나로 Claude · GPT · Grok · Kimi. SSH 는 `--no-browser`, `sk-or-` 열쇠를 알아보고, 긴 모델 목록은 이름으로 좁힙니다 |
1347
1348
  | [2.1.3](docs/ko/releases/2.1.md#213) | 제품 기능 — 도구를 글로 부르는 모델도 알아듣고, `deel run --continue`·`--resume`·`--events` 와 결과의 바뀐 파일(`files`)이 생겼고, git 저장소면 스크립트가 바꾼 것도 `/undo` 로 돌아가고, 언어 서버 없이도 문법을 보고, Outline 이 많이 불리는 파일부터 싣고, MCP 가 주소로 붙어 자료 · 프롬프트까지 씁니다 |
package/README.md CHANGED
@@ -396,7 +396,7 @@ deel --offline
396
396
  The destination is printed at the top of every session:
397
397
 
398
398
  ```
399
- deel 2.1.6 ⌂ inside
399
+ deel 2.1.7 ⌂ inside
400
400
  Sends to this machine 127.0.0.1:11434 ← nowhere else
401
401
  ```
402
402
 
@@ -1424,7 +1424,8 @@ so one run tells you everything.
1424
1424
 
1425
1425
  | Version | What changed |
1426
1426
  |---|---|
1427
- | **[2.1.6](docs/en/releases/2.1.md#216)** | Works properly on macOS — long or hand-edited keychain keys, a locked keychain, folders under `/tmp` · `/var` (links to `/private`) recognized as trusted, and output over 64 KB no longer cut off when a pipe reads slowly (macOS and Linux). macOS joins the gate CI |
1427
+ | **[2.1.7](docs/en/releases/2.1.md#217)** | Tab completion for file names works in zsh, the default shell on macOS (it printed `bad substitution`); a clipboard image over 12 MB says it is too big instead of blaming osascript; a decomposed (NFD) Korean profile name no longer leaves orphaned keychain items |
1428
+ | [2.1.6](docs/en/releases/2.1.md#216) | Works properly on macOS — long or hand-edited keychain keys, a locked keychain, folders under `/tmp` · `/var` (links to `/private`) recognized as trusted, and output over 64 KB no longer cut off when a pipe reads slowly (macOS and Linux). macOS joins the gate CI |
1428
1429
  | [2.1.5](docs/en/releases/2.1.md#215) | Urgent security fix — shell commands could reach outside the working folder. Now blocked: a bare `..` (`find .. -delete`, `rd /s /q ..`), `$PWD`, `%CD%`, `$OLDPWD`, a `cd -` with no earlier move, `C:..`, and PowerShell aliases (`ri`, `del` …) |
1429
1430
  | [2.1.4](docs/en/releases/2.1.md#214) | Log in with a browser — `deel setup` option 3 connects to OpenRouter by logging in (OAuth PKCE), no key to paste; one key for Claude, GPT, Grok and Kimi. `--no-browser` for SSH, `sk-or-` keys recognized, and long model lists narrow by name |
1430
1431
  | [2.1.3](docs/en/releases/2.1.md#213) | Product features — models that write tool calls as text are understood, `deel run --continue`/`--resume`/`--events` and changed `files` in the result, `/undo` brings back what a script changed in a git repository, a syntax check without a language server, Outline loads the most imported files first, and MCP attaches by URL with resources and prompts |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deel-local-cli",
3
- "version": "2.1.6",
3
+ "version": "2.1.7",
4
4
  "description": "A coding-agent CLI that runs on local models and private gateways. Zero dependencies, Node 20+.",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/completion.js CHANGED
@@ -179,8 +179,11 @@ _deel_paths() {
179
179
  if type compopt >/dev/null 2>&1; then
180
180
  compopt -o filenames 2>/dev/null
181
181
  elif [[ -z "$_deel_q" ]]; then
182
- local _deel_i
183
- for _deel_i in "\${!COMPREPLY[@]}"; do COMPREPLY[$_deel_i]=$(printf '%q' "\${COMPREPLY[$_deel_i]}"); done
182
+ local _deel_x
183
+ local -a _deel_t
184
+ _deel_t=()
185
+ for _deel_x in "\${COMPREPLY[@]}"; do _deel_t+=("$(printf '%q' "$_deel_x")"); done
186
+ COMPREPLY=("\${_deel_t[@]}")
184
187
  fi
185
188
  return 0
186
189
  }
@@ -96,7 +96,12 @@ export const 기본키체인이름 = 'deel-gateway-key';
96
96
  export function 키체인이름(프로필id = null) {
97
97
  const 정한것 = process.env.DEEL_KEYCHAIN_NAME;
98
98
  if (정한것) return 정한것;
99
- const 원래 = String(프로필id ?? '');
99
+ /*
100
+ * 글자 모양을 NFC 로 맞춘다. 맥은 파일 이름 따위에서 한글을 자모로 푼 꼴(NFD)로 주기도 해서, 눈에는 같은
101
+ * `회사` 가 한 번은 `deel-gateway-key-회사`, 한 번은 해시 붙은 딴 자리로 갔다 — 다시 잠그면 옛 자리가
102
+ * 주인 없이 남았다(39회차 맥 실측). 읽기는 설정에 적힌 이름표로 하므로 이미 넣어 둔 열쇠는 그대로 풀린다.
103
+ */
104
+ const 원래 = String(프로필id ?? '').normalize('NFC');
100
105
  const id = 원래.trim().toLowerCase().replace(/[^a-z0-9가-힣._-]+/g, '-');
101
106
  if (!id) return 기본키체인이름;
102
107
  if (id === 원래) return `${기본키체인이름}-${id}`;
@@ -93,10 +93,21 @@ function 윈도우에서(방, 부르기) {
93
93
  * PNG 512KB 만 넘어도 ENOBUFS 로 끊겼다 — 레티나 화면 캡처는 대개 그보다 커서
94
94
  * 맥에서는 보통 캡처가 안 붙었다. 그림 한도의 두 배에 여유를 더해 잡는다.
95
95
  */
96
+ /*
97
+ * 받을 자리(maxBuffer)가 넘친 것은 「못 불렀다」 가 아니라 **그림이 크다** 는 뜻이다. 맥에서 12.5MB 캡처를
98
+ * 붙이면 「osascript 를 못 불렀습니다: spawnSync osascript ENOBUFS」 가 나왔다(42회차 맥 실측) — 사람은
99
+ * osascript 가 고장 난 줄 안다. 한도 넘침과 같은 말로 맞춘다.
100
+ */
101
+ function 넘쳤나(r) { return r?.error?.code === 'ENOBUFS'; }
102
+ function 너무큰그림말() {
103
+ return `그림이 너무 큽니다 (한도 ${그림한도 / 1048576}MB 넘음) — 필요한 부분만 잘라서 다시 찍어 주세요.`;
104
+ }
105
+
96
106
  function 맥에서(부르기) {
97
107
  const r = 부르기('osascript', ['-e', 'the clipboard as «class PNGf»'], {
98
108
  encoding: 'utf8', timeout: 20000, maxBuffer: 그림한도 * 2 + 1024 * 1024,
99
109
  });
110
+ if (넘쳤나(r)) return { ok: false, 왜: 너무큰그림말() };
100
111
  if (r.error) return { ok: false, 왜: `osascript 를 못 불렀습니다: ${r.error.message}` };
101
112
  const 낸말 = String(r.stdout ?? '');
102
113
  const m = /«data PNGf([0-9A-Fa-f]+)»/.exec(낸말);
@@ -150,6 +161,7 @@ function 리눅스에서(부르기) {
150
161
  const 종류 = 부르기(x.이름, x.볼것, { encoding: 'utf8', timeout: 10000 });
151
162
  if (!/image\/png/i.test(String(종류.stdout ?? ''))) continue;
152
163
  const r = 부르기(x.이름, x.꺼내기, { timeout: 20000, maxBuffer: 64 * 1024 * 1024 });
164
+ if (넘쳤나(r)) return { ok: false, 왜: 너무큰그림말() };
153
165
  if (r.error || !r.stdout?.length) {
154
166
  const 탈 = r.error?.message || String(r.stderr ?? '').split('\n').find((l) => l.trim())?.trim() || '빈 응답';
155
167
  못꺼냄 ??= `${x.이름}: ${탈}`;