deel-local-cli 1.0.2 → 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 +381 -7
- package/README.md +407 -7
- 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 +109 -28
- 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 +73 -0
- package/src/oneshot.js +390 -327
- package/src/repl.js +1074 -887
- 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/inputbox.js +97 -5
- package/src/ui/screen.js +51 -3
- package/src/ui/status.js +69 -4
- package/src/ui/working.js +8 -1
package/README.md
CHANGED
|
@@ -212,6 +212,148 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
212
212
|
|
|
213
213
|
등록한 뒤에는 대화 중 `/model` 로 갈아탑니다. **대화 내용은 그대로 이어집니다.**
|
|
214
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
|
+
|
|
215
357
|
---
|
|
216
358
|
|
|
217
359
|
## 대화 중 명령
|
|
@@ -224,6 +366,7 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
224
366
|
| `/context` | 무엇이 컨텍스트를 먹고 있는지 |
|
|
225
367
|
| `/ctx [auto\|숫자\|자세히]` | 컨텍스트 **길이** — 모델에 맞춰 다시 재거나 직접 지정 |
|
|
226
368
|
| `/out [숫자\|auto]` | 한 번에 받을 **답 길이** 상한 — 큰 파일이 잘리면 여기를 올립니다 |
|
|
369
|
+
| `/grade [작음\|보통\|큼\|auto]` | 모델 **급** — 얼마나 알아서 하나. `/ctx` 와 다른 축입니다 |
|
|
227
370
|
| `/compact` | 앞선 대화를 요약해서 접기 |
|
|
228
371
|
| `/clear` | 대화 비우기 (연결·규칙은 유지) |
|
|
229
372
|
| `/model` | 연결·모델 바꾸기 |
|
|
@@ -591,21 +734,245 @@ LM Studio 는 `/api/v0/models`, llama.cpp 는 `/props`. 못 알아보면 `(추
|
|
|
591
734
|
| 도구 | 하는 일 |
|
|
592
735
|
|---|---|
|
|
593
736
|
| `Read` | 파일 읽기 (줄 번호 · `offset`/`limit` 지원 · **엑셀은 CSV 로 바꿔서**) |
|
|
594
|
-
| `Write` | 파일 쓰기·덮어쓰기 |
|
|
737
|
+
| `Write` | 파일 쓰기·덮어쓰기 (**여러 개는 `files` 배열로 한 번에**) |
|
|
595
738
|
| `Append` | 파일 끝에 이어 붙이기 — **큰 파일을 나눠 쓰는 자리** |
|
|
596
|
-
| `Edit` | 정확한 문자열 바꾸기 (`replace_all`
|
|
739
|
+
| `Edit` | 정확한 문자열 바꾸기 (`replace_all` · **여러 군데는 `edits` 배열로 한 번에**) |
|
|
597
740
|
| `Glob` | 이름 패턴으로 파일 찾기 |
|
|
598
741
|
| `Grep` | 내용 정규식 검색 |
|
|
599
|
-
| `Bash` | 명령 실행 |
|
|
742
|
+
| `Bash` | 명령 실행 (**끝나지 않는 것은 `background: true`**) |
|
|
600
743
|
| `Skill` | 스킬 본문 펼쳐 읽기 (스킬이 있을 때만 모델에게 보임) |
|
|
601
744
|
| `WebFetch` | 웹 페이지 읽기 (읽기 전용 · `--offline` 이면 숨김) |
|
|
602
745
|
| `Recall` | **지난 대화**에서 찾기 — "저번에 그거" 를 모델이 스스로 뒤진다 |
|
|
603
746
|
| `Remember` | 대화가 끝나도 남길 것 한 줄 — 다음에 켤 때 처음부터 안다 |
|
|
604
747
|
| `TodoWrite` | 할 일 목록 — 긴 일을 쪼개서 어디까지 했는지 화면에 띄움 |
|
|
748
|
+
| `Outline` | 폴더의 **뼈대만** 보기 — 통째로 읽는 것보다 수십 분의 일 |
|
|
749
|
+
| `Verify` | 만든 것이 **진짜 되는지** 확인 |
|
|
750
|
+
| `Task` | 큰 일의 한 덩이를 **따로 떨어진 창**에서 돌리기 |
|
|
751
|
+
| `Jobs` | **뒤에서 도는 명령** 보기·읽기·끝내기 — `Bash` 의 `background` 와 짝 |
|
|
752
|
+
|
|
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
|
+
```
|
|
605
807
|
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
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
|
+
것과 말이 어긋나기 시작하면 그때부터는 화면을 안 믿게 됩니다.
|
|
609
976
|
|
|
610
977
|
### 지난 대화를 찾고, 정한 것을 기억합니다
|
|
611
978
|
|
|
@@ -1011,6 +1378,9 @@ $ /think 자세히
|
|
|
1011
1378
|
| `/ctx 자세히` | 어디를 두드려서 어떤 값을 얻었는지 — 안 가져와질 때 원인을 봅니다 |
|
|
1012
1379
|
| `deel --ctx 655360` | 켤 때부터 이 값으로 (긁어오기를 건너뜁니다) |
|
|
1013
1380
|
|
|
1381
|
+
`/ctx` 는 **얼마나 담나**를 정합니다. **얼마나 알아서 하나**는 `/grade` 입니다 —
|
|
1382
|
+
다른 축이고, 위의 「걸린 모델에 맞춰 스스로 바뀝니다」 에 같이 적어 뒀습니다.
|
|
1383
|
+
|
|
1014
1384
|
**`k` 는 1024 입니다.** 컨텍스트 길이는 전부 2의 거듭제곱이라 그래야 아귀가 맞습니다 —
|
|
1015
1385
|
655,360 은 `655k` 가 아니라 `640k`, 131,072 는 `131k` 가 아니라 `128k` 입니다.
|
|
1016
1386
|
화면에 뜨는 표기와 `/ctx` 가 받는 단위가 같아서, 보이는 대로 쳐도 같은 값이 됩니다.
|
|
@@ -1196,7 +1566,7 @@ JSON-RPC 2.0 을 주고받는 것이 전부라, `child_process` 와 `JSON` 이
|
|
|
1196
1566
|
|
|
1197
1567
|
| 장치 | 내용 |
|
|
1198
1568
|
|---|---|
|
|
1199
|
-
| **되돌리기** | 파일을 고치기 전 항상 스냅샷. `/undo` 로 턴 단위
|
|
1569
|
+
| **되돌리기** | 파일을 고치기 전 항상 스냅샷. `/undo` 로 턴 단위 복구. **`Bash` 로 옮기고 지우는 것도 포함** |
|
|
1200
1570
|
| **바뀐 자리 보기** | 고칠 때마다 바뀐 줄을 화면에. 이번 대화 전체는 `/diff` |
|
|
1201
1571
|
| **작업 범위** | 시작한 폴더 밖은 모델이 시켜도 거부 |
|
|
1202
1572
|
| **위험 명령 차단** | 되돌릴 수 없는 것만 (디스크 포맷, 재귀 삭제, `--force` 푸시 등) |
|
|
@@ -1216,6 +1586,36 @@ JSON-RPC 2.0 을 주고받는 것이 전부라, `child_process` 와 `JSON` 이
|
|
|
1216
1586
|
32MB 를 넘으면 **최근 50턴만 남기고** 오래된 것을 버립니다. 방금 한 일은 언제나
|
|
1217
1587
|
되돌릴 수 있고, 지금 이력이 얼마나 되는지는 `/status` 에서 봅니다.
|
|
1218
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
|
+
|
|
1219
1619
|
### 안 읽는 자리
|
|
1220
1620
|
|
|
1221
1621
|
폴더를 훑다 보면 프로젝트 파일이 아닌 것이 걸려 나옵니다. 다른 코딩 도구가 제 살림을
|