deel-local-cli 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +520 -11
- package/README.md +548 -11
- package/bin/deel.js +266 -234
- package/package.json +4 -3
- package/src/agent/budget.js +167 -0
- package/src/agent/grade.js +207 -0
- package/src/agent/loop.js +778 -574
- package/src/agent/modes.js +110 -29
- package/src/agent/project.js +171 -0
- package/src/agent/session.js +131 -12
- package/src/backend/learn.js +46 -4
- package/src/commands.js +102 -4
- package/src/oneshot.js +390 -327
- package/src/repl.js +1074 -787
- package/src/safety/audit.js +3 -1
- package/src/tools/index.js +500 -107
- package/src/tools/jobs.js +670 -0
- package/src/tools/outline.js +331 -0
- package/src/tools/task.js +153 -0
- package/src/tools/verify.js +306 -0
- package/src/tools/webfetch.js +152 -16
- package/src/ui/approve.js +66 -0
- package/src/ui/complete.js +89 -0
- package/src/ui/inputbox.js +221 -4
- package/src/ui/screen.js +108 -10
- package/src/ui/status.js +98 -10
- package/src/ui/working.js +125 -0
package/README.md
CHANGED
|
@@ -20,11 +20,13 @@
|
|
|
20
20
|
│ 보냄 이 컴퓨터 안 127.0.0.1:11434 ← 여기 말고는 어디로도 안 갑니다 │
|
|
21
21
|
│ 연결 스트리밍 · 도구 · 추론 조절 │
|
|
22
22
|
│ 폴더 C:\work\myproject │
|
|
23
|
+
│ 승인 ⏵⏵ 자동 승인 — 안 묻고 고칩니다. 되돌리기(/undo)가 안전망입니다 │
|
|
24
|
+
│ Shift+Tab 으로 바꿉니다 · Tab 은 치던 / 명령을 채웁니다 │
|
|
23
25
|
│ 이 PC 스킬 337 · 명령 127 · 플러그인 42 │
|
|
24
26
|
╰──────────────────────────────────────────────────────────────╯
|
|
25
27
|
/help 명령 목록 /think 추론 강도 Ctrl+C 중단·끝내기
|
|
26
28
|
|
|
27
|
-
▏myproject · qwen2.5-coder:7b ▏ ▰▰▱▱▱▱▱▱▱▱ 22% 28k/128k ▏ ◎ 종합 · ◇ medium·절약 ·
|
|
29
|
+
▏myproject · qwen2.5-coder:7b ▏ ▰▰▱▱▱▱▱▱▱▱ 22% 28k/128k ▏ ◎ 종합 · ◇ medium·절약 · ⏵⏵ 자동
|
|
28
30
|
❯ 로그 형식 통일해줘
|
|
29
31
|
|
|
30
32
|
❊ Grep(console.log)
|
|
@@ -210,6 +212,148 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
210
212
|
|
|
211
213
|
등록한 뒤에는 대화 중 `/model` 로 갈아탑니다. **대화 내용은 그대로 이어집니다.**
|
|
212
214
|
|
|
215
|
+
### 걸린 모델에 맞춰 스스로 바뀝니다
|
|
216
|
+
|
|
217
|
+
여러 모델을 왔다 갔다 쓰면, 어느 한 모델에 맞춰 박아 둔 숫자는 나머지 전부에서
|
|
218
|
+
틀립니다. 그래서 **아무 숫자도 안 박아 뒀습니다.**
|
|
219
|
+
|
|
220
|
+
축이 둘입니다. 헷갈리기 쉬워서 명령도 따로 뒀습니다.
|
|
221
|
+
|
|
222
|
+
| | 무엇을 재나 | 명령 |
|
|
223
|
+
|---|---|---|
|
|
224
|
+
| **창 크기** | 얼마나 담나 | `/ctx` |
|
|
225
|
+
| **모델 급** | 얼마나 알아서 하나 | `/grade` |
|
|
226
|
+
|
|
227
|
+
둘은 같이 안 갑니다. 창이 128k 인 3B 모델이 있고, 창이 32k 인 아주 좋은 모델도
|
|
228
|
+
있습니다. 하나로 다루면 하나는 붙들려 있고 하나는 놓쳐집니다.
|
|
229
|
+
|
|
230
|
+
**창 크기에서 뽑는 것** (`src/agent/budget.js`):
|
|
231
|
+
|
|
232
|
+
| | 8k | 32k | 131k | 655k |
|
|
233
|
+
|---|---|---|---|---|
|
|
234
|
+
| 한 턴 걸음 수 (코드) | 16 | 48 | 192 | 200 |
|
|
235
|
+
| `Read` 줄 수 | 200 | 384 | 1,536 | 4,000 |
|
|
236
|
+
| `Glob` 개수 | 50 | 192 | 768 | 1,000 |
|
|
237
|
+
| `Outline` 줄 수 | 120 | 480 | 1,920 | 2,500 |
|
|
238
|
+
| `WebFetch` 글자 수 | 4,000 | 12,800 | 51,200 | 120,000 |
|
|
239
|
+
| 하위 작업 요약 | 400자 | 1,600자 | 4,000자 | 4,000자 |
|
|
240
|
+
|
|
241
|
+
**모델 급에서 뽑는 것** (`src/agent/grade.js`):
|
|
242
|
+
|
|
243
|
+
| | 작음 | 보통 | 큼 |
|
|
244
|
+
|---|---|---|---|
|
|
245
|
+
| 한 번에 만들 파일 | 3개 | 6개 | 12개 |
|
|
246
|
+
| 나눠 쓰기 기준 | 200줄 | 400줄 | 800줄 |
|
|
247
|
+
| 절차를 못 박나 | 예 | 예 | **아니오 — 목표만 준다** |
|
|
248
|
+
| 확인을 시키나 | 예 | 예 | **예** (급과 상관없다) |
|
|
249
|
+
|
|
250
|
+
급은 이렇게 정해집니다.
|
|
251
|
+
|
|
252
|
+
1. **이름으로 첫 어림.** `qwen2.5-coder-7b` → 작음, `llama-3.3-70b` → 큼.
|
|
253
|
+
판 번호(`2.5`)나 양자화 표시(`q4_k_m`)를 크기로 오해하지 않습니다.
|
|
254
|
+
이름을 못 읽으면 **보통**입니다 — 작음이 아닙니다. 사내 게이트웨이가 딱 그
|
|
255
|
+
자리인데, 거기 붙는 모델은 대개 크기 때문입니다. 작다고 잡으면 좋은 모델을
|
|
256
|
+
붙들어 매게 됩니다.
|
|
257
|
+
2. **실제로 본 것으로 고쳐 잡음.** 인자 잘림 · 빈 답 · 편집 실패 · 되풀이를 셉니다.
|
|
258
|
+
70B 라고 적혀 있어도 걸음마다 잘리면 **작음**으로 내리고, 7B 라도 열 걸음을
|
|
259
|
+
사고 없이 돌면 한 단 **올립니다.** 이름은 짐작이고, 겪은 것이 사실입니다.
|
|
260
|
+
3. **사람이 정하면 그것이 이깁니다.** `/grade 큼` · 되돌리려면 `/grade auto`.
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
모델 급 작음 (짐작)
|
|
264
|
+
이름에 7B 라고 적혀 있습니다
|
|
265
|
+
|
|
266
|
+
이 급에서 쓰는 값
|
|
267
|
+
한 번에 만들 파일 3개
|
|
268
|
+
나눠 쓰기 기준 200줄
|
|
269
|
+
절차를 못 박나 예
|
|
270
|
+
하위 작업 권함 아니오
|
|
271
|
+
|
|
272
|
+
이번 대화에서 실제로 본 것 (12걸음)
|
|
273
|
+
인자 잘림 0 · 빈 답 0 · 편집 실패 1 · 되풀이 0 · 도구 성공 14
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
상태줄에는 `◈ 작음?` 처럼 뜹니다. 물음표는 **아직 짐작** 이라는 뜻입니다 —
|
|
277
|
+
알아낸 사실과 같은 낯으로 내밀지 않습니다.
|
|
278
|
+
|
|
279
|
+
급이 바꾸는 것은 **얼마나 붙들어 주나** 뿐입니다. 작업 범위 · 승인 방식 ·
|
|
280
|
+
되돌리기 · 감사기록은 모든 급에서 똑같습니다. "좋은 모델이니 확인 안 해도 된다"
|
|
281
|
+
같은 것도 없습니다 — 그건 잘하는 모델이 잘못 만들었을 때 아무도 모르게 만듭니다.
|
|
282
|
+
|
|
283
|
+
### 작은 창에서는 고정 몫을 줄입니다
|
|
284
|
+
|
|
285
|
+
시스템 프롬프트와 도구 정의는 **매 요청에 통째로 다시 나갑니다.** 대화를 접어도
|
|
286
|
+
(`/compact`) 이건 안 줄어듭니다. 이 몫이 창의 절반을 넘으면 아무리 잘 접어도
|
|
287
|
+
남는 자리가 없고, 사람 눈에는 "모델이 갑자기 멍청해졌다" 로 보입니다.
|
|
288
|
+
|
|
289
|
+
도구를 셋(`Outline` · `Verify` · `Task`) 늘리면서 8k 기준 **49%** 까지 갔습니다.
|
|
290
|
+
도구를 뺄까 하다가 **안 뺐습니다** — 빼면 작은 모델만 할 수 있는 일이 달라져서,
|
|
291
|
+
"환경마다 다르게 동작" 하게 됩니다. 대신 창에 맞춰 줄였습니다.
|
|
292
|
+
|
|
293
|
+
| | 8k | 16k | 32k 이상 |
|
|
294
|
+
|---|---|---|---|
|
|
295
|
+
| 기본 규칙 | 짧은 판 | 짧은 판 | 원래 판 |
|
|
296
|
+
| 모드 설명 | 짧은 판 | 짧은 판 | 원래 판 |
|
|
297
|
+
| 도구 설명 | 90자까지 | 140자까지 | 220자 / 통째로 |
|
|
298
|
+
| 뻔한 인자 설명 | 뺌 | 남김 | 남김 |
|
|
299
|
+
| 배열 안쪽 인자 설명 | 뺌 | 뺌 | 남김 |
|
|
300
|
+
| **고정 몫** | **2,712토큰 (33%)** | 3,290 (21%) | 4,745 (131k 기준 4%) |
|
|
301
|
+
|
|
302
|
+
여기에 **폴더 지문**이 8k 에서 80토큰쯤 더 붙습니다(바로 아래). 그건 폴더마다
|
|
303
|
+
달라지는 값이라 위 표에는 안 넣었습니다.
|
|
304
|
+
|
|
305
|
+
**도구 이름과 인자는 그대로 남습니다.** 할 수 있는 일은 어느 창에서나 똑같고,
|
|
306
|
+
없어지는 것은 '왜 이걸 쓰는지' 하는 설득뿐입니다. 큰 창에서는 그 설득이 실제로
|
|
307
|
+
값을 하기 때문에 그대로 둡니다 — `Outline` 을 `Read` 앞에 부르게 만드는 것이
|
|
308
|
+
바로 그 두 문장입니다.
|
|
309
|
+
|
|
310
|
+
이 값은 검사로 못 박혀 있습니다(`test/compact.test.js`). 프롬프트를 늘리면
|
|
311
|
+
거기가 먼저 빨개집니다.
|
|
312
|
+
|
|
313
|
+
### 켤 때 이 폴더가 무슨 프로젝트인지 읽습니다
|
|
314
|
+
|
|
315
|
+
남의 코드가 있는 폴더에서 켜면 모델은 아무것도 모르는 채로 시작했습니다.
|
|
316
|
+
그래서 매번 같은 세 걸음을 다시 밟습니다 — 위쪽을 훑고, `package.json` 을 읽고,
|
|
317
|
+
검사를 어떻게 돌리는지 찾습니다. **로컬 모델은 한 걸음이 20~40초라, 일을
|
|
318
|
+
시작하기도 전에 2분이 갑니다.**
|
|
319
|
+
|
|
320
|
+
더 나쁜 쪽도 있습니다. 그 세 걸음을 **안 밟고** 그냥 시작하는 경우입니다.
|
|
321
|
+
그러면 이 프로젝트가 이미 쓰는 것을 모른 채 제 관례로 파일을 만듭니다 —
|
|
322
|
+
npm 프로젝트에 `requirements.txt` 를 만들어 놓는 식입니다.
|
|
323
|
+
|
|
324
|
+
그 세 걸음의 답은 켤 때 이미 다 알 수 있는 것이라, 한 번 읽어 프롬프트에 넣습니다.
|
|
325
|
+
|
|
326
|
+
```
|
|
327
|
+
--- 이 폴더 ---
|
|
328
|
+
node 프로젝트 (deel-local-cli) · git main
|
|
329
|
+
돌릴 수 있는 것: npm start · npm test · npm run bench · npm run chat · npm run check ·
|
|
330
|
+
npm run coverage · npm run demo · npm run diagnose
|
|
331
|
+
위쪽: bin/ src/ test/ LICENSE README.en.md README.md package.json report.txt
|
|
332
|
+
위쪽 한 겹만 본 것이다. 안을 알아야 하면 Outline 을 불러라.
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
(deel 자신의 폴더에서 켠 것입니다. 실제로는 한 줄로 나갑니다.)
|
|
336
|
+
|
|
337
|
+
**이름을 지어내지 않습니다.** 돌릴 수 있는 명령은 `package.json` 의 `scripts` 에
|
|
338
|
+
적힌 것만 그대로 옮깁니다. 없는 명령을 알려 주면 모델이 그걸 부르고, 실패하고,
|
|
339
|
+
다시 찾느라 아껴 준 걸음을 도로 씁니다.
|
|
340
|
+
|
|
341
|
+
**마지막 한 줄이 중요합니다.** 여기 적힌 것은 위쪽 한 겹과 `package.json` 뿐이고
|
|
342
|
+
하위 폴더 안은 아무것도 안 봤습니다. 그 사실을 안 적으면 모델은 이걸 프로젝트
|
|
343
|
+
전체 지도로 여기고 `Outline` 을 안 부릅니다 — 그러면 이 토막이 오히려 손해가 됩니다.
|
|
344
|
+
|
|
345
|
+
| 안 하는 것 | 왜 |
|
|
346
|
+
|---|---|
|
|
347
|
+
| `git` 을 띄우지 않음 | `.git/HEAD` 를 그냥 읽습니다. 큰 저장소에서 켜는 순간 몇 초가 멈춥니다 |
|
|
348
|
+
| 폴더를 훑지 않음 | 위쪽 **한 겹**만. 하위까지 내려가면 느려지고, 넣을 양은 어차피 한 줄입니다 |
|
|
349
|
+
| 매 턴 다시 읽지 않음 | 켤 때 한 번입니다. 대화 도중에 프롬프트가 바뀌면 무엇 때문에 답이 달라졌는지 알 길이 없어집니다 |
|
|
350
|
+
|
|
351
|
+
창 크기에 맞춥니다 — 8k 에서는 위쪽 10개·명령 4개까지, 큰 창에서는 24개·8개까지.
|
|
352
|
+
좁은 창에서 하나만 남긴다면 그건 **명령**입니다. 위쪽 생김새는 `Glob` 한 번이면
|
|
353
|
+
다시 알 수 있지만, "`npm test` 로 검사를 돌린다" 는 `package.json` 을 열어야 압니다.
|
|
354
|
+
|
|
355
|
+
파일 600개짜리 폴더에서 7ms 입니다(`test/project.test.js`).
|
|
356
|
+
|
|
213
357
|
---
|
|
214
358
|
|
|
215
359
|
## 대화 중 명령
|
|
@@ -222,6 +366,7 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
222
366
|
| `/context` | 무엇이 컨텍스트를 먹고 있는지 |
|
|
223
367
|
| `/ctx [auto\|숫자\|자세히]` | 컨텍스트 **길이** — 모델에 맞춰 다시 재거나 직접 지정 |
|
|
224
368
|
| `/out [숫자\|auto]` | 한 번에 받을 **답 길이** 상한 — 큰 파일이 잘리면 여기를 올립니다 |
|
|
369
|
+
| `/grade [작음\|보통\|큼\|auto]` | 모델 **급** — 얼마나 알아서 하나. `/ctx` 와 다른 축입니다 |
|
|
225
370
|
| `/compact` | 앞선 대화를 요약해서 접기 |
|
|
226
371
|
| `/clear` | 대화 비우기 (연결·규칙은 유지) |
|
|
227
372
|
| `/model` | 연결·모델 바꾸기 |
|
|
@@ -251,6 +396,18 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
251
396
|
`/scan` 과 `/sessions` 는 나가지 않고도 씁니다. 로컬 서버를 새로 켰거나 모델을
|
|
252
397
|
바꿔 올렸을 때 `/scan save` → `/model` 두 번이면 대화를 이어둔 채로 갈아탑니다.
|
|
253
398
|
|
|
399
|
+
**치지 않고 쓰는 것**
|
|
400
|
+
|
|
401
|
+
| 키 | 무엇을 |
|
|
402
|
+
|---|---|
|
|
403
|
+
| `Tab` | 치던 `/` 명령을 채웁니다. 치는 도중에 후보가 상자 아래에 뜹니다 |
|
|
404
|
+
| `Shift+Tab` | 승인 방식 (`⏵⏵ 자동` → `⏵ 위험만` → `⏸ 모두`) |
|
|
405
|
+
| `Ctrl+O` | 작업 모드 (`종합` → `코드` → `계획` → …) |
|
|
406
|
+
| `↑` `↓` | 지난 입력 이력 |
|
|
407
|
+
| `Ctrl+C` | 답하는 중이면 그 답만 끊고, 빈 줄에서 두 번이면 끝냅니다 |
|
|
408
|
+
|
|
409
|
+
한글 조합·붙여넣기·`Ctrl+A/E`·백스페이스는 전부 그대로 됩니다.
|
|
410
|
+
|
|
254
411
|
### `@파일` 로 바로 붙이기
|
|
255
412
|
|
|
256
413
|
말 속에 `@` 뒤로 경로를 쓰면 그 파일을 말과 함께 바로 보냅니다.
|
|
@@ -418,7 +575,7 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
418
575
|
|
|
419
576
|
── 4.2초 · 도구 3회 · ↑3,900 ↓180
|
|
420
577
|
|
|
421
|
-
▏myproject · qwen2.5-coder:7b ▏ ▰▰▱▱▱▱▱▱ 22% ▏ ◎ 종합 · ◇ medium ·
|
|
578
|
+
▏myproject · qwen2.5-coder:7b ▏ ▰▰▱▱▱▱▱▱ 22% ▏ ◎ 종합 · ◇ medium · ⏵⏵ 자동
|
|
422
579
|
╭─────────────────────────────────────────────────────────────────────────────╮
|
|
423
580
|
│ ❯ 집계 함수도 줄여줘 │
|
|
424
581
|
╰─────────────────────────────────────────────────────────────────────────────╯
|
|
@@ -449,6 +606,127 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
449
606
|
|
|
450
607
|
---
|
|
451
608
|
|
|
609
|
+
### 명령은 다 안 쳐도 됩니다
|
|
610
|
+
|
|
611
|
+
명령이 서른 개가 넘습니다. 다 외우고 있는 사람은 만든 사람뿐이고, 그마저도
|
|
612
|
+
`/mem…` 까지 치고 "이게 memory 였나 memo 였나" 하고 멈춥니다. 그때 할 수 있는
|
|
613
|
+
것이 `/help` 를 쳐서 서른 줄을 받아 눈으로 훑는 것뿐이면, 그건 명령이 아니라
|
|
614
|
+
시험입니다.
|
|
615
|
+
|
|
616
|
+
그래서 **치는 도중에 보여 줍니다.**
|
|
617
|
+
|
|
618
|
+
```
|
|
619
|
+
╭─────────────────────────────────────────────────────────────────────────────╮
|
|
620
|
+
│ ❯ /mo │
|
|
621
|
+
╰─────────────────────────────────────────────────────────────────────────────╯
|
|
622
|
+
› /model [이름|list|models] 연결·모델 바꾸기 (이름 일부 · list · models)
|
|
623
|
+
/mode <모드> 승인 정책 — 얼마나 물어보나
|
|
624
|
+
/memory [지우기 <번호>|…] 대화가 끝나도 남는 기억 — 보기·지우기
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
`Tab` 을 누르면 채워집니다. 하나만 맞으면 끝까지, 여럿이면 **다 같이 가진
|
|
628
|
+
앞부분까지만** 채웁니다(`/mo` + Tab → `/mode`). 하나를 골라 박아 넣지 않는
|
|
629
|
+
것은, 사람이 원한 것이 아닐 때 지우는 수고가 더 들기 때문입니다. 인자를 받는
|
|
630
|
+
명령이면 빈칸까지 붙여 바로 이어 칠 수 있게 합니다.
|
|
631
|
+
|
|
632
|
+
앞에서 맞는 것을 먼저 보여 주고, **가운데 맞는 것도 뒤에 붙입니다** — 오타는
|
|
633
|
+
앞글자에서 제일 많이 나므로, `/emo` 라고 잘못 쳐도 `/memory` 가 나옵니다.
|
|
634
|
+
빈칸을 치는 순간(`/mode auto`) 목록은 접힙니다. 명령이 이미 정해졌기 때문입니다.
|
|
635
|
+
|
|
636
|
+
목록은 **상자 아래**에 붙습니다. 안에 넣으면 치던 글이 밀려 올라가서 무엇을
|
|
637
|
+
치고 있었는지가 안 보입니다.
|
|
638
|
+
|
|
639
|
+
> 위아래 화살표로 고르게 하지 않습니다. 그러면 **지난 입력 이력**(위 화살표)을
|
|
640
|
+
> 뺏어야 하는데, 그건 훨씬 자주 쓰는 기능입니다. 여기서 필요한 것은 고르는
|
|
641
|
+
> 것이 아니라 **알아보는 것**이고, 알아보고 나면 Tab 한 번이면 됩니다.
|
|
642
|
+
>
|
|
643
|
+
> `쉬움` 수준에서 감춰 둔 명령도 앞글자를 치면 나옵니다. 감춘 것은 '못 쓰는
|
|
644
|
+
> 것' 이 아닙니다 — `/recall` 을 아는 사람이 수준 설정 때문에 "그런 명령
|
|
645
|
+
> 없다" 는 화면을 보면 안 됩니다.
|
|
646
|
+
|
|
647
|
+
---
|
|
648
|
+
|
|
649
|
+
### 일하는 중에는 상자가 그대로 있습니다
|
|
650
|
+
|
|
651
|
+
로컬 모델은 느립니다. 한 걸음에 수십 초가 걸리는데 그 동안 화면 아래가 텅 비면
|
|
652
|
+
**멈춘 줄 알고 Ctrl+C 를 누르게 됩니다** — 다 되어 가던 일이 그렇게 날아갑니다.
|
|
653
|
+
그래서 테두리는 그대로 두고 안엣것만 바꿉니다.
|
|
654
|
+
|
|
655
|
+
```
|
|
656
|
+
◧ Read(집계.py)
|
|
657
|
+
└ 6줄
|
|
658
|
+
|
|
659
|
+
▏myproject · qwen2.5-coder:7b ▏ ▰▱▱▱▱▱▱▱▱▱ 2% ▏ ◎ 종합 · ◇ medium · ⏵⏵ 자동 ▏ ↑3.8k ↓180
|
|
660
|
+
╭─────────────────────────────────────────────────────────────────────────────╮
|
|
661
|
+
│ ⠹ 파일 들여다보는 중… 12초 · 생각 1,240자 · Ctrl+C 중단 │
|
|
662
|
+
╰─────────────────────────────────────────────────────────────────────────────╯
|
|
663
|
+
```
|
|
664
|
+
|
|
665
|
+
문구는 **지금 진짜로 하는 일**을 따라갑니다. 재미로 넣은 것이 아닙니다 —
|
|
666
|
+
아무 말이나 돌려 대면 두 번째부터 아무도 안 읽고, 그때부터는 화면이 조용한 것과
|
|
667
|
+
같아집니다. 한 턴을 돌리면 이렇게 지나갑니다:
|
|
668
|
+
|
|
669
|
+
```
|
|
670
|
+
머리 굴리는 중 → 파일 들여다보는 중 → 코드 짜는 중 → 답 쓰는 중
|
|
671
|
+
```
|
|
672
|
+
|
|
673
|
+
| 하는 일 | 문구 |
|
|
674
|
+
|---|---|
|
|
675
|
+
| 생각 | 머리 굴리는 중 · 어떻게 할지 궁리하는 중 · 수 읽는 중 · 따져 보는 중 |
|
|
676
|
+
| `Read` `Grep` `Glob` | 파일 들여다보는 중 · 코드 훑는 중 · 어디 있나 뒤지는 중 · 단서 찾는 중 |
|
|
677
|
+
| `Write` `Edit` `Append` | 코드 짜는 중 · 고쳐 넣는 중 · 손보는 중 · 한 줄씩 옮기는 중 |
|
|
678
|
+
| `Bash` | 명령 돌리는 중 · 터미널 두드리는 중 · 결과 기다리는 중 |
|
|
679
|
+
| `WebFetch` | 문서 찾아보는 중 · 읽어 오는 중 |
|
|
680
|
+
| 답하는 중 | 답 쓰는 중 · 정리해서 말하는 중 |
|
|
681
|
+
| **45초가 넘으면** | 아직 하는 중 · 조금만 더 · 생각보다 오래 걸리는 중 |
|
|
682
|
+
|
|
683
|
+
같은 갈래 안에서도 4초마다 다른 문구로 넘어갑니다. 같은 글자가 30초 동안 그대로
|
|
684
|
+
있으면 그것도 멈춘 것처럼 보이기 때문입니다. 오른쪽에는 **걸린 시간**과, 모델이
|
|
685
|
+
추론 중이면 **지금까지 생각한 글자 수**가 같이 뜹니다 — 진짜로 늘어나는 숫자가
|
|
686
|
+
하나 있어야 '살아 있다' 가 표시가 아니라 사실이 됩니다.
|
|
687
|
+
|
|
688
|
+
### 무엇을 물어보고 무엇을 그냥 할지
|
|
689
|
+
|
|
690
|
+
내 파일이 **물어보고 바뀌는지, 안 물어보고 바뀌는지**는 흘깃 봐서 바로 알아야
|
|
691
|
+
하는 한 가지입니다. 상태줄 오른쪽에 늘 떠 있습니다.
|
|
692
|
+
|
|
693
|
+
| 표시 | 명령 | 무엇을 물어보나 |
|
|
694
|
+
|---|---|---|
|
|
695
|
+
| `⏵⏵ 자동 승인` | `/mode auto` | 안 묻고 고칩니다. 되돌리기(`/undo`)가 안전망입니다 |
|
|
696
|
+
| `⏵ 위험만 확인` | `/mode confirm` | 되돌릴 수 없는 명령만 물어봅니다. 파일은 안 묻고 고칩니다 |
|
|
697
|
+
| `⏸ 모두 확인` | `/mode strict` | 파일을 고치거나 명령을 돌리기 전에 매번 물어봅니다 |
|
|
698
|
+
|
|
699
|
+
`/mode` 만 치면 셋을 나란히 보여 주고 지금 것에 ● 를 찍습니다.
|
|
700
|
+
켤 때 머리말에도 사람 말로 한 줄 나옵니다 — 한 번 읽고 나면 그 다음부터는
|
|
701
|
+
글자만 봐도 압니다.
|
|
702
|
+
|
|
703
|
+
**`Shift+Tab` 으로 치지 않고 바꿉니다.** 누를 때마다 차례로 돌고, 무엇에서
|
|
704
|
+
무엇으로 갔는지 한 줄이 남습니다. 치던 글은 그대로 있습니다.
|
|
705
|
+
|
|
706
|
+
```
|
|
707
|
+
⏵ 위험만 확인 되돌릴 수 없는 명령만 물어봅니다. 파일은 안 묻고 고칩니다
|
|
708
|
+
자동 승인 → 위험만 확인 · Shift+Tab 으로 계속 바꿉니다
|
|
709
|
+
```
|
|
710
|
+
|
|
711
|
+
차례는 **느슨한 쪽 → 조이는 쪽**입니다(자동 → 위험만 → 모두 → 자동). 잘못
|
|
712
|
+
눌러도 더 물어보게 될 뿐, 한 번에 '안 묻고 고침' 으로 떨어지지 않습니다.
|
|
713
|
+
|
|
714
|
+
> 이 자리는 원래 작업 모드(`종합`·`코드`…)가 쓰고 있었습니다. 바꾼 이유는
|
|
715
|
+
> **누가 더 자주 손대느냐**입니다. 작업 모드는 요청을 보고 저절로 옮겨 가지만,
|
|
716
|
+
> 승인 방식은 "이번 건은 좀 봐야겠다" 싶을 때 일하는 도중에 바꾸고 싶어집니다.
|
|
717
|
+
> 작업 모드는 `Ctrl+O` 로 옮겼고 `/work` 도 그대로 됩니다.
|
|
718
|
+
|
|
719
|
+
> 전에는 `auto` 라는 영문 한 낱말이었습니다. 옆에 `종합`·`medium·절약` 이 나란히
|
|
720
|
+
> 있으니 셋 다 그냥 '모드' 로 보였고, 그중 하나가 **묻지 않고 파일을 고친다**는
|
|
721
|
+
> 뜻이라는 것은 화면 어디에도 없었습니다.
|
|
722
|
+
>
|
|
723
|
+
> 자리가 모자랄 때 무엇을 접는지도 그래서 바꿨습니다. 사내 게이트웨이 모델 이름은
|
|
724
|
+
> `databricks-gpt-5-6-luna` 처럼 스물세 칸을 그냥 먹는데, 그것 하나 때문에 승인
|
|
725
|
+
> 방식이 화면에서 통째로 사라지고 있었습니다. 지금은 **모델 이름을 먼저 줄입니다** —
|
|
726
|
+
> 무엇으로 도는지는 이미 알지만, 내 파일이 안 물어보고 바뀌는지는 지금 봐야 압니다.
|
|
727
|
+
|
|
728
|
+
---
|
|
729
|
+
|
|
452
730
|
## 도구
|
|
453
731
|
|
|
454
732
|
이름과 인자를 Claude Code 와 같게 맞췄습니다. 그 관례로 쓰인 스킬·명령이 그대로 먹습니다.
|
|
@@ -456,21 +734,245 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
456
734
|
| 도구 | 하는 일 |
|
|
457
735
|
|---|---|
|
|
458
736
|
| `Read` | 파일 읽기 (줄 번호 · `offset`/`limit` 지원 · **엑셀은 CSV 로 바꿔서**) |
|
|
459
|
-
| `Write` | 파일 쓰기·덮어쓰기 |
|
|
737
|
+
| `Write` | 파일 쓰기·덮어쓰기 (**여러 개는 `files` 배열로 한 번에**) |
|
|
460
738
|
| `Append` | 파일 끝에 이어 붙이기 — **큰 파일을 나눠 쓰는 자리** |
|
|
461
|
-
| `Edit` | 정확한 문자열 바꾸기 (`replace_all`
|
|
739
|
+
| `Edit` | 정확한 문자열 바꾸기 (`replace_all` · **여러 군데는 `edits` 배열로 한 번에**) |
|
|
462
740
|
| `Glob` | 이름 패턴으로 파일 찾기 |
|
|
463
741
|
| `Grep` | 내용 정규식 검색 |
|
|
464
|
-
| `Bash` | 명령 실행 |
|
|
742
|
+
| `Bash` | 명령 실행 (**끝나지 않는 것은 `background: true`**) |
|
|
465
743
|
| `Skill` | 스킬 본문 펼쳐 읽기 (스킬이 있을 때만 모델에게 보임) |
|
|
466
744
|
| `WebFetch` | 웹 페이지 읽기 (읽기 전용 · `--offline` 이면 숨김) |
|
|
467
745
|
| `Recall` | **지난 대화**에서 찾기 — "저번에 그거" 를 모델이 스스로 뒤진다 |
|
|
468
746
|
| `Remember` | 대화가 끝나도 남길 것 한 줄 — 다음에 켤 때 처음부터 안다 |
|
|
469
747
|
| `TodoWrite` | 할 일 목록 — 긴 일을 쪼개서 어디까지 했는지 화면에 띄움 |
|
|
748
|
+
| `Outline` | 폴더의 **뼈대만** 보기 — 통째로 읽는 것보다 수십 분의 일 |
|
|
749
|
+
| `Verify` | 만든 것이 **진짜 되는지** 확인 |
|
|
750
|
+
| `Task` | 큰 일의 한 덩이를 **따로 떨어진 창**에서 돌리기 |
|
|
751
|
+
| `Jobs` | **뒤에서 도는 명령** 보기·읽기·끝내기 — `Bash` 의 `background` 와 짝 |
|
|
470
752
|
|
|
471
|
-
Claude Code 에 없는 것은
|
|
472
|
-
|
|
473
|
-
검사에서 한 번 멈추게 해 뒀습니다
|
|
753
|
+
Claude Code 에 없는 것은 일곱입니다 — `Append` · `Recall` · `Remember` ·
|
|
754
|
+
`Outline` · `Verify` · `Task` · `Jobs`. 도구 하나가 스키마로 150~400토큰을 먹고
|
|
755
|
+
그게 **매 요청마다** 나가므로, 늘릴 때마다 검사에서 한 번 멈추게 해 뒀습니다
|
|
756
|
+
(`test/loop.test.js`). 뒤의 넷은 그 값을 치르고도 넣을 만해서 넣은 것들이라,
|
|
757
|
+
아래에 왜인지를 적어 뒀습니다.
|
|
758
|
+
|
|
759
|
+
### 프로젝트 모양을 싸게 봅니다 — `Outline`
|
|
760
|
+
|
|
761
|
+
전에는 남의 코드를 이해하는 길이 둘뿐이었습니다. `Glob` 은 경로만 주고,
|
|
762
|
+
`Read` 는 파일을 통째로 읽어 창을 채웁니다. **가운데가 비어 있었습니다.**
|
|
763
|
+
|
|
764
|
+
그래서 모델은 "무엇이 어디 있는지" 를 모른 채로 고치기 시작하고, 이미 있는
|
|
765
|
+
함수를 엉뚱한 파일에 또 만들었습니다. 못 본 것이지 모르는 게 아니었습니다.
|
|
766
|
+
|
|
767
|
+
```
|
|
768
|
+
❉ Outline(src/ui) 12개 파일 · 122곳
|
|
769
|
+
|
|
770
|
+
src/ui/screen.js (304줄)
|
|
771
|
+
46 fn 상자쓸까
|
|
772
|
+
65 class LineScreen
|
|
773
|
+
92 method 줄
|
|
774
|
+
198 class BoxScreen
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
이 폴더를 `Read` 로 통째로 읽으면 **25,612토큰**, `Outline` 은 **857토큰** 입니다
|
|
778
|
+
— 30배입니다. 8k 모델도 프로젝트 전체 모양을 볼 수 있습니다.
|
|
779
|
+
|
|
780
|
+
js/ts · py · java/kotlin · go · rust · c# · md · html · css · sh · json 을 읽습니다.
|
|
781
|
+
파서 없이 정규식으로 뽑습니다(의존성 0개라서). 그래서 **못 읽는 것은 못 읽는다고
|
|
782
|
+
말합니다** — 조용히 빼면 모델은 그 파일이 없는 줄 알고, 있는 설정을 다시 만듭니다.
|
|
783
|
+
|
|
784
|
+
```
|
|
785
|
+
여기 있지만 뼈대는 못 뽑은 것 (필요하면 Read 로 직접 읽어라):
|
|
786
|
+
[YAML 설정 — 뼈대 없음] 설정.yml
|
|
787
|
+
```
|
|
788
|
+
|
|
789
|
+
### 만든 것을 확인합니다 — `Verify`
|
|
790
|
+
|
|
791
|
+
턴 끝에 이렇게 떴습니다.
|
|
792
|
+
|
|
793
|
+
```
|
|
794
|
+
✓ index.html · 410줄 · 18.2KB
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
이건 파일이 **있다**는 증명이지 **된다**는 증명이 아닙니다. `<div>` 를 안 닫아
|
|
798
|
+
놨어도, `src="app.js"` 가 없는 파일을 가리켜도, JS 에 괄호가 하나 모자라도
|
|
799
|
+
똑같이 초록으로 떴습니다.
|
|
800
|
+
|
|
801
|
+
돌려 볼 수 있는 것은 돌려 보고(`node --check` · `py_compile`), 못 돌리는 것은
|
|
802
|
+
읽어서 봅니다(HTML 태그 짝 · 빠진 참조 · CSS 중괄호 · JSON).
|
|
803
|
+
|
|
804
|
+
```
|
|
805
|
+
⏺ Verify 탈 1개 · 확인 3개
|
|
806
|
+
```
|
|
807
|
+
|
|
808
|
+
그리고 제일 중요한 것 — **확인 못 한 것은 못 했다고 말합니다.**
|
|
809
|
+
|
|
810
|
+
```
|
|
811
|
+
확인 못 한 것 2개 (**됐다고 말하면 안 된다**):
|
|
812
|
+
? 문서.hwp — 바이너리 — 돌려 볼 수 없습니다
|
|
813
|
+
```
|
|
814
|
+
|
|
815
|
+
검사·빌드 같은 임의 명령은 여기서 **안 돌립니다.** 그 길은 `Bash` 하나여야 합니다
|
|
816
|
+
— 승인 관문과 안전 검사가 거기에만 걸려 있어서, 여기서 몰래 돌리면 엄격 모드의
|
|
817
|
+
약속이 이 자리에서만 깨집니다. 대신 "이 프로젝트엔 `npm test` 가 있다" 고
|
|
818
|
+
알려만 줍니다.
|
|
819
|
+
|
|
820
|
+
### 큰 일은 떼어서 따로 돌립니다 — `Task`
|
|
821
|
+
|
|
822
|
+
파일 여덟 개짜리 일을 한 창에서 하면 여덟 개 파일 내용이 전부 그 창에 쌓입니다.
|
|
823
|
+
32k 모델이면 서너 개째에 창이 차고, 차면 앞엣말이 접혀 나갑니다. 그때부터 모델은
|
|
824
|
+
자기가 무엇을 만들던 중이었는지 잊습니다 — **오류는 안 뜨고 결과만 이상해집니다.**
|
|
825
|
+
"대시보드 만들어줘" 가 계획표 한 장으로 끝나던 일의 뿌리가 이것이었습니다.
|
|
826
|
+
|
|
827
|
+
`Task` 는 그 덩이를 **새 대화**에서 돌리고, 부모에게는 요약 한 덩이만 돌려줍니다.
|
|
828
|
+
|
|
829
|
+
```
|
|
830
|
+
⌥ 하위 작업 화면 뼈대 만들기 따로 떨어진 대화 · 최대 8걸음
|
|
831
|
+
│ ◆ Write(index.html 외 1개) 2개 · 24줄
|
|
832
|
+
✓ 하위 작업 화면 뼈대 만들기 끝냄 · 파일 2개 · 2걸음
|
|
833
|
+
```
|
|
834
|
+
|
|
835
|
+
같은 파일 넷을 만들 때 **한 창에 제일 많이 쌓인 양** (시스템 프롬프트 제외):
|
|
836
|
+
|
|
837
|
+
| | 쌓인 양 |
|
|
838
|
+
|---|---|
|
|
839
|
+
| 통째로 | 4,181자 |
|
|
840
|
+
| `Task` 로 쪼개서 | **2,113자** |
|
|
841
|
+
|
|
842
|
+
파일이 늘수록 왼쪽은 계속 커지고 오른쪽은 그대로입니다.
|
|
843
|
+
|
|
844
|
+
**울타리는 그대로 걸립니다.** 하위 작업도 같은 작업 폴더 안에서만 돌고, 같은
|
|
845
|
+
승인 방식을 따르고, `/undo` 한 번에 부모 것과 **같이** 되돌아가고, 감사기록에
|
|
846
|
+
그대로 남습니다. 읽기만 하는 모드(설계·계획·묻기)에서 하위가 파일을 고치는 길은
|
|
847
|
+
없습니다 — 모드 쪽과 도구 목록 쪽에서 두 겹으로 막았습니다. 깊이는 2단까지입니다.
|
|
848
|
+
|
|
849
|
+
### 끝나지 않는 명령은 뒤에서 — `Bash` 의 `background` 와 `Jobs`
|
|
850
|
+
|
|
851
|
+
`Bash` 는 명령이 **끝나야** 결과를 줍니다. 그래서 끝나지 않는 것을 못 돌렸습니다 —
|
|
852
|
+
`npm run dev`, `python -m http.server`, `vite`, `npm run watch` 가 전부 그렇습니다.
|
|
853
|
+
전에는 이걸 시키면 120초를 기다렸다가 시간 초과로 죽였고, 화면에는 이 한 줄만
|
|
854
|
+
남았습니다.
|
|
855
|
+
|
|
856
|
+
```
|
|
857
|
+
▶ Bash(npm run dev)
|
|
858
|
+
└ 시간 초과로 중단됨 (120000ms) 2분 0.0초
|
|
859
|
+
```
|
|
860
|
+
|
|
861
|
+
모델은 서버를 못 띄운 것으로 알고 포기하거나, 더 나쁘게는 `timeout` 을 늘려서
|
|
862
|
+
다시 부릅니다 — 그러면 그 턴이 통째로 멈춥니다. **만든 것을 띄워서 확인하는
|
|
863
|
+
길이 아예 없었습니다.** `Verify` 가 "문법은 맞다" 까지 봐 주지만, 진짜로 뜨는지는
|
|
864
|
+
띄워 봐야 압니다.
|
|
865
|
+
|
|
866
|
+
```
|
|
867
|
+
▶ Bash(npm run dev)
|
|
868
|
+
└ 1번으로 띄움
|
|
869
|
+
|
|
870
|
+
◈ Edit(src/App.jsx)
|
|
871
|
+
└ 1군데
|
|
872
|
+
|
|
873
|
+
◐ Jobs(1번)
|
|
874
|
+
└ 도는중 · 24초
|
|
875
|
+
|
|
876
|
+
◐ Jobs(1번 · 끝내기)
|
|
877
|
+
└ 끝냄 · 41초
|
|
878
|
+
```
|
|
879
|
+
|
|
880
|
+
띄우고 **바로 돌아옵니다.** 출력은 쌓아 두고 `Jobs` 로 읽어 갑니다 — 모델은
|
|
881
|
+
뜬 주소와 오류를 그 자리에서 보고, 고치고, 다시 읽습니다.
|
|
882
|
+
|
|
883
|
+
**안 뜬 것을 떴다고 하지 않습니다.** 띄운 직후 잠깐 지켜보고, 그 사이에 죽으면
|
|
884
|
+
실패로 못 박습니다. 제일 흔한 실패가 '포트가 이미 물려 있음' 인데, 그걸
|
|
885
|
+
"띄웠습니다" 로 넘기면 모델은 다음 단계로 가고 사람은 뜨지도 않은 서버를
|
|
886
|
+
새로고침하며 찾아다닙니다.
|
|
887
|
+
|
|
888
|
+
```
|
|
889
|
+
▶ Bash(npm run dev)
|
|
890
|
+
└ 띄우자마자 끝났습니다 (종료코드 1).
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
모델에게는 그 아래 나온 말까지 그대로 갑니다 —
|
|
894
|
+
`Error: listen EADDRINUSE: address already in use :::5173`.
|
|
895
|
+
대개 답은 그 몇 줄에 다 있습니다.
|
|
896
|
+
|
|
897
|
+
| 지키는 선 | 내용 |
|
|
898
|
+
|---|---|
|
|
899
|
+
| 안전 검사 | `Bash` 와 **똑같이** 거칩니다. 여기가 뒷문이 되면 안 됩니다 |
|
|
900
|
+
| 거두기 | deel 이 끝나면 전부 죽입니다 — **손자까지**, 몇 개를 껐는지 말하고 |
|
|
901
|
+
| 들고 있는 양 | 256KB. 넘으면 앞을 버리고 뒤를 남기며, **버렸다고 적습니다** |
|
|
902
|
+
| 한 번에 건네는 양 | 4,000자. 위엣것과 **다른 값이어야 합니다** |
|
|
903
|
+
| 끝낼 때 | 죽는 순간 뱉은 말을 기다렸다 거둡니다. 그리고 **정말 죽은 뒤에** 돌아옵니다 |
|
|
904
|
+
| 인자 이름 | 한글·영문 둘 다 받습니다 (`번호`/`job`, `끝내기`/`stop`). 못 알아들으면 **못 알아들었다고 말합니다** |
|
|
905
|
+
| 개수 | 도는 것 8개까지. 끝난 것은 최근 8개만 남기고, 지웠으면 **지웠다고 적습니다** |
|
|
906
|
+
|
|
907
|
+
두 상한이 왜 다른 값이냐면 — 같게 두면 watch 하나가 넘칠 때마다 `Jobs` 읽기
|
|
908
|
+
한 번이 256KB 를 창에 쏟습니다. 8k 모델이면 그 한 번으로 창이 끝납니다.
|
|
909
|
+
|
|
910
|
+
**끝낼 때 곧장 파이프를 끊지 않습니다.** 죽이라고 말한 그 순간 파이프에는 아직
|
|
911
|
+
안 읽힌 것이 남아 있고, 하필 **죽기 직전에 나온 몇 줄이 제일 중요합니다** —
|
|
912
|
+
서버가 뻗으면서 남긴 스택 트레이스가 거기 있습니다. `마지막 출력:` 이라고
|
|
913
|
+
적어 놓고 정작 마지막을 안 주면 안 적느니만 못합니다. 그리고 **정말 죽은
|
|
914
|
+
것을 확인한 뒤에** 목록에서 지웁니다. 안 죽은 채로 지우면 그놈을 다시는
|
|
915
|
+
가리킬 수 없게 되는데, 그게 바로 이 기능이 없애려던 상태입니다.
|
|
916
|
+
|
|
917
|
+
끝난 일감은 바로 안 지웁니다 — 마지막 출력을 읽으라고 남겨 두는 것입니다.
|
|
918
|
+
다만 최근 여덟만 남깁니다. 안 그러면 짧은 명령 서른 개에 항목 서른 개가 쌓이고,
|
|
919
|
+
하나가 최대 256KB 를 들고 있어 몇 MB 가 됩니다.
|
|
920
|
+
|
|
921
|
+
**인자 이름은 한글·영문을 둘 다 받습니다.** 모델은 한글 인자 이름을 자주 영어로
|
|
922
|
+
바꿔 보냅니다 — 추정이 아니라 이 저장소가 겪은 일입니다(`Task` 는 이미
|
|
923
|
+
`목적`/`purpose` 를 둘 다 받습니다). `Jobs` 에는 그게 없어서 이런 일이 있었습니다.
|
|
924
|
+
|
|
925
|
+
```
|
|
926
|
+
Jobs({job: 1, stop: true}) → 목록이 돌아온다. 서버는 그대로 돈다
|
|
927
|
+
```
|
|
928
|
+
|
|
929
|
+
모델은 **끄라고 시켰고 성공처럼 보이는 답을 받았는데** 포트는 계속 물려 있습니다.
|
|
930
|
+
그래서 둘 다 받고, 하나도 못 알아들었으면 목록으로 얼버무리지 않고 무엇을
|
|
931
|
+
받는지 말해 줍니다. 이름 고르기는 **한 군데에만** 둡니다 — 화면 이름표도 같은
|
|
932
|
+
것을 봅니다. 두 벌이 되면 도구는 제대로 도는데 화면만 빈 괄호가 됩니다.
|
|
933
|
+
|
|
934
|
+
**손자까지 죽이는 것이 이 기능에서 제일 조용히 어긋나는 자리입니다.**
|
|
935
|
+
`npm run dev` 는 npm → node → vite 로 내려가고, 포트를 무는 것은 맨 아래입니다.
|
|
936
|
+
윈도우는 `taskkill /t` 가 나무를 훑어 주지만 유닉스에는 그런 게 없어서,
|
|
937
|
+
**띄울 때 무리(process group)를 만들어 둡니다** — 나중에는 손자를 가리킬
|
|
938
|
+
방법이 아예 없습니다. 이걸 빠뜨리면 "3개를 껐습니다" 라고 말해 놓고 서버는
|
|
939
|
+
그대로 도는 상태가 됩니다.
|
|
940
|
+
|
|
941
|
+
거두기가 이 기능에서 제일 조용히 다치는 자리입니다. 안 거두면 사람이 안 띄운
|
|
942
|
+
프로세스가 계속 돕니다. 다음에 켜서 dev 서버를 띄우면 "포트가 이미 쓰이는 중" 이
|
|
943
|
+
뜨는데, **무엇이 물고 있는지 알 길이 없습니다.** 그래서 `test/jobs.test.js` 가
|
|
944
|
+
자국 파일로 진짜 죽었는지까지 확인합니다.
|
|
945
|
+
|
|
946
|
+
`deel run` (한 번에 끝내는 모드)도 같습니다. 배치가 이걸 빠뜨리면 제일 크게
|
|
947
|
+
다칩니다 — 잡이 끝났다고 표시된 뒤에도 서버가 돌고, 다음 잡이 같은 포트를
|
|
948
|
+
잡으려다 실패합니다. 그 원인은 로그 어디에도 안 남습니다.
|
|
949
|
+
|
|
950
|
+
### 한 번에 여러 개 — `Write` 의 `files`, `Edit` 의 `edits`
|
|
951
|
+
|
|
952
|
+
로컬 모델은 왕복 한 번이 20~40초입니다. 파일 다섯 개를 만들면서 `Write` 를
|
|
953
|
+
다섯 번 부르면 그것만으로 2~3분입니다. 그래서 배열로 한 번에 보냅니다.
|
|
954
|
+
|
|
955
|
+
```
|
|
956
|
+
◈ Edit(src/app.js 외 2군데)
|
|
957
|
+
└ 2개 파일 · 3군데
|
|
958
|
+
✓ src/app.js · 2군데
|
|
959
|
+
✓ src/style.css · 1군데
|
|
960
|
+
```
|
|
961
|
+
|
|
962
|
+
**고치는 쪽이 값이 더 큽니다.** 파일을 새로 만드는 일은 한 번이지만, 고치는 일은
|
|
963
|
+
계속 있습니다. 여섯 군데짜리 손질에 왕복이 여섯 번이면 몇 분이 그냥 갑니다.
|
|
964
|
+
|
|
965
|
+
| | 지키는 것 |
|
|
966
|
+
|---|---|
|
|
967
|
+
| 차례로 적용 | 같은 파일을 두 번 고치는 것이 흔합니다. 매번 다시 읽어 뒤엣것이 앞엣것의 결과를 봅니다 |
|
|
968
|
+
| 하나가 실패해도 | 나머지는 갑니다. 첫 실패에서 멈추면 왕복을 줄이려던 것이 도로 늡니다 |
|
|
969
|
+
| 실패했을 때 | "실패한 것만 다시 보내세요 — **파일을 다시 `Read` 해서**" 라고 알려 줍니다 |
|
|
970
|
+
| 되돌리기 | 그대로 **한 턴**입니다. 같은 파일을 여섯 군데 고쳐도 `/undo` 한 번 |
|
|
971
|
+
| 한 개일 때 | 결과 모양이 한 글자도 안 바뀝니다 |
|
|
972
|
+
|
|
973
|
+
`2개 파일 · 3군데` 처럼 파일 수와 군데 수를 갈라 적습니다. 한 파일을 여섯 군데
|
|
974
|
+
고치는 것이 보통이라 '3개 파일' 이라고 적으면 거짓이 되고, 사람이 화면에서 세는
|
|
975
|
+
것과 말이 어긋나기 시작하면 그때부터는 화면을 안 믿게 됩니다.
|
|
474
976
|
|
|
475
977
|
### 지난 대화를 찾고, 정한 것을 기억합니다
|
|
476
978
|
|
|
@@ -876,6 +1378,9 @@ $ /think 자세히
|
|
|
876
1378
|
| `/ctx 자세히` | 어디를 두드려서 어떤 값을 얻었는지 — 안 가져와질 때 원인을 봅니다 |
|
|
877
1379
|
| `deel --ctx 655360` | 켤 때부터 이 값으로 (긁어오기를 건너뜁니다) |
|
|
878
1380
|
|
|
1381
|
+
`/ctx` 는 **얼마나 담나**를 정합니다. **얼마나 알아서 하나**는 `/grade` 입니다 —
|
|
1382
|
+
다른 축이고, 위의 「걸린 모델에 맞춰 스스로 바뀝니다」 에 같이 적어 뒀습니다.
|
|
1383
|
+
|
|
879
1384
|
**`k` 는 1024 입니다.** 컨텍스트 길이는 전부 2의 거듭제곱이라 그래야 아귀가 맞습니다 —
|
|
880
1385
|
655,360 은 `655k` 가 아니라 `640k`, 131,072 는 `131k` 가 아니라 `128k` 입니다.
|
|
881
1386
|
화면에 뜨는 표기와 `/ctx` 가 받는 단위가 같아서, 보이는 대로 쳐도 같은 값이 됩니다.
|
|
@@ -1061,7 +1566,7 @@ JSON-RPC 2.0 을 주고받는 것이 전부라, `child_process` 와 `JSON` 이
|
|
|
1061
1566
|
|
|
1062
1567
|
| 장치 | 내용 |
|
|
1063
1568
|
|---|---|
|
|
1064
|
-
| **되돌리기** | 파일을 고치기 전 항상 스냅샷. `/undo` 로 턴 단위
|
|
1569
|
+
| **되돌리기** | 파일을 고치기 전 항상 스냅샷. `/undo` 로 턴 단위 복구. **`Bash` 로 옮기고 지우는 것도 포함** |
|
|
1065
1570
|
| **바뀐 자리 보기** | 고칠 때마다 바뀐 줄을 화면에. 이번 대화 전체는 `/diff` |
|
|
1066
1571
|
| **작업 범위** | 시작한 폴더 밖은 모델이 시켜도 거부 |
|
|
1067
1572
|
| **위험 명령 차단** | 되돌릴 수 없는 것만 (디스크 포맷, 재귀 삭제, `--force` 푸시 등) |
|
|
@@ -1081,6 +1586,36 @@ JSON-RPC 2.0 을 주고받는 것이 전부라, `child_process` 와 `JSON` 이
|
|
|
1081
1586
|
32MB 를 넘으면 **최근 50턴만 남기고** 오래된 것을 버립니다. 방금 한 일은 언제나
|
|
1082
1587
|
되돌릴 수 있고, 지금 이력이 얼마나 되는지는 `/status` 에서 봅니다.
|
|
1083
1588
|
|
|
1589
|
+
### `Bash` 로 사라진 것도 되돌아갑니다
|
|
1590
|
+
|
|
1591
|
+
안전망이 `Write` · `Edit` 만 지키고 있었습니다. 그런데 모델은 파일을 옮길 때
|
|
1592
|
+
당연히 `Bash` 를 씁니다 — `mv 옛것.js 새것.js`, `rm 임시.txt`. 그 순간 파일이
|
|
1593
|
+
사라지는데 `/undo` 는 아무것도 못 했습니다. 절반짜리 안전망이었습니다.
|
|
1594
|
+
|
|
1595
|
+
이제 파일을 바꾸는 명령이면 손대기 전 내용을 떠 두고, **무엇을 떠 뒀는지
|
|
1596
|
+
그 자리에서 적습니다.**
|
|
1597
|
+
|
|
1598
|
+
```
|
|
1599
|
+
▶ Bash(mv src/old.js src/new.js)
|
|
1600
|
+
└ 성공
|
|
1601
|
+
↩ src/old.js 는 떠 뒀습니다 — /undo 로 되돌아갑니다
|
|
1602
|
+
```
|
|
1603
|
+
|
|
1604
|
+
`mv` 나 `rm` 은 화면에 '성공' 한 줄만 남습니다. 그 줄만 보면 되돌릴 수 있는지
|
|
1605
|
+
없는지 알 길이 없어서, 사람은 되돌릴 수 있는 줄 알고 넘어가거나 반대로 못
|
|
1606
|
+
되돌리는 줄 알고 겁을 냅니다. 그래서 사실을 적습니다.
|
|
1607
|
+
|
|
1608
|
+
**못 뜨는 것이 있다는 사실을 숨기지 않습니다.** 셸이 풀어 주는 와일드카드
|
|
1609
|
+
(`rm *.tmp`), 스크립트 안에서 지우는 것, 폴더 통째는 여기서 안 보입니다.
|
|
1610
|
+
그럴 때는 위의 `↩` 줄이 아예 안 나옵니다 — **'전부 되돌아간다' 고 말하지
|
|
1611
|
+
않습니다.** 거짓 안심을 주면 사람은 확인 없이 넘어갑니다.
|
|
1612
|
+
|
|
1613
|
+
떠 두는 쪽은 막는 쪽보다 **넓게** 잡습니다. 울타리(`checkPaths`)는 슬래시가 든
|
|
1614
|
+
낱말만 경로로 보는데 — 안 걸린 것을 막아 버리면 멀쩡한 명령이 막히니까요 —
|
|
1615
|
+
`del 지울것.txt` 처럼 슬래시 없는 이름이 실제로 제일 흔합니다. 여기는 막는 자리가
|
|
1616
|
+
아니라 읽는 자리라 넓게 훑고, 실제로 그 자리에 파일이 있을 때만 뜹니다.
|
|
1617
|
+
헛다리를 짚어도 손해가 없습니다. 한 번에 24개까지입니다.
|
|
1618
|
+
|
|
1084
1619
|
### 안 읽는 자리
|
|
1085
1620
|
|
|
1086
1621
|
폴더를 훑다 보면 프로젝트 파일이 아닌 것이 걸려 나옵니다. 다른 코딩 도구가 제 살림을
|
|
@@ -1248,7 +1783,7 @@ deel --no-tui 입력 상자를 끄고 줄 화면으로 (아래 참고
|
|
|
1248
1783
|
## 개발
|
|
1249
1784
|
|
|
1250
1785
|
```bash
|
|
1251
|
-
npm test 전체 검증 (1,
|
|
1786
|
+
npm test 전체 검증 (1,832항목)
|
|
1252
1787
|
npm run coverage 검사가 소스의 어디를 밟았는지
|
|
1253
1788
|
npm run verify 반입·통신 검증만
|
|
1254
1789
|
npm run bench 편집 성공률 측정
|
|
@@ -1315,7 +1850,7 @@ node test/coverage.mjs --json 기계가 읽을 형태로
|
|
|
1315
1850
|
`NODE_V8_COVERAGE` 를 읽습니다 — 새로 반입 심사할 것이 하나도 안 늡니다.
|
|
1316
1851
|
자식 프로세스까지 잡히므로 `deel` 을 띄워 보는 `cli` 검사도 그대로 집계됩니다.
|
|
1317
1852
|
|
|
1318
|
-
지금 **전체 92%** (7,
|
|
1853
|
+
지금 **전체 92%** (7,646줄 중 7,056줄). 일부러 못 채운 곳이 셋 있습니다.
|
|
1319
1854
|
|
|
1320
1855
|
| 파일 | 지금 | 왜 못 채우나 |
|
|
1321
1856
|
|---|---|---|
|
|
@@ -1331,6 +1866,8 @@ src/
|
|
|
1331
1866
|
ui/ 색·한글 폭·상자·상태줄·입력
|
|
1332
1867
|
ui/screen.js 화면 고르기 (줄 화면 / 상자 화면)
|
|
1333
1868
|
ui/inputbox.js 맨 아래 입력 상자 — 그리기·지우기·커서 자리
|
|
1869
|
+
ui/working.js 일하는 중 문구 — 지금 하는 일을 따라간다
|
|
1870
|
+
ui/approve.js 승인 방식 표시 (자동/위험만/모두)
|
|
1334
1871
|
ui/wrap.js 색을 지키며 폭에 맞춰 접기
|
|
1335
1872
|
agent/loop.js 에이전트 루프
|
|
1336
1873
|
agent/session.js 대화 상태 + 컨텍스트 셈
|