deel-local-cli 1.2.0 → 1.4.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 +481 -12
- package/README.md +460 -12
- package/bin/deel.js +73 -4
- package/package.json +7 -3
- package/src/acp/jsonrpc.js +230 -0
- package/src/acp/map.js +219 -0
- package/src/acp/serve.js +556 -0
- package/src/agent/card.js +110 -0
- package/src/agent/compact.js +10 -2
- package/src/agent/evidence.js +186 -0
- package/src/agent/grade.js +20 -0
- package/src/agent/loop.js +134 -13
- package/src/agent/models.js +169 -0
- package/src/agent/modes.js +47 -1
- package/src/agent/pins.js +140 -0
- package/src/agent/project.js +10 -4
- package/src/agent/session.js +214 -10
- package/src/agent/store.js +31 -0
- package/src/commands.js +586 -52
- package/src/i18n/en.js +244 -0
- package/src/i18n/index.js +126 -0
- package/src/i18n/ko.js +231 -0
- package/src/lsp/client.js +459 -0
- package/src/lsp/diag.js +112 -0
- package/src/lsp/rpc.js +84 -0
- package/src/lsp/servers.js +218 -0
- package/src/oneshot.js +19 -0
- package/src/pack/sbom.js +218 -0
- package/src/pack/selfpack.js +19 -3
- package/src/repl.js +193 -8
- package/src/safety/secrets.js +205 -0
- package/src/safety/undo.js +10 -3
- package/src/tools/desc.en.js +219 -0
- package/src/tools/index.js +148 -5
- package/src/tools/lsp.js +327 -0
- package/src/tools/task.js +30 -2
- package/src/ui/ansi.js +36 -0
- package/src/ui/approve.js +25 -21
- package/src/ui/inputbox.js +37 -7
- package/src/ui/intro.js +174 -0
- package/src/ui/level.js +11 -5
- package/src/ui/notify.js +101 -0
- package/src/ui/status.js +177 -34
package/README.md
CHANGED
|
@@ -60,6 +60,8 @@
|
|
|
60
60
|
- [자동 압축](#자동-압축)
|
|
61
61
|
- [대화 이어하기](#대화-이어하기)
|
|
62
62
|
- [밖에서 도구 붙이기 (MCP)](#밖에서-도구-붙이기-mcp)
|
|
63
|
+
- [에디터 안에서 쓰기 (ACP)](#에디터-안에서-쓰기-acp)
|
|
64
|
+
- [비밀이 새지 않게](#비밀이-새지-않게)
|
|
63
65
|
- [안전망](#안전망)
|
|
64
66
|
- [사내 반입](#사내-반입)
|
|
65
67
|
- [설정](#설정)
|
|
@@ -372,6 +374,10 @@ node 프로젝트 (deel-local-cli) · git main
|
|
|
372
374
|
| 명령 | 하는 일 |
|
|
373
375
|
|---|---|
|
|
374
376
|
| `/help` | 명령 목록 |
|
|
377
|
+
| `/bell [on|off]` | 다 됐을 때·물어볼 때 종소리와 창 제목 |
|
|
378
|
+
| `/lang [ko|en]` | 화면 말 — 영어권 사람이 쓸 때. 모델이 읽는 글도 같이 따라간다(영어 쪽이 1,400토큰 덜 먹는다). 코드는 그대로 |
|
|
379
|
+
| `/consult <프로필> <질문>` | 다른 모델에게 한 번 물어보기 — 지금 쓰는 것은 안 바꿈 |
|
|
380
|
+
| `/lsp [on\|off]` | 언어 서버 — 무엇이 깔려 있고 `Def`·`Refs` 를 쓸 수 있는지. `off` 는 고친 뒤 진단만 끔 |
|
|
375
381
|
| `/context` | 무엇이 컨텍스트를 먹고 있는지 |
|
|
376
382
|
| `/ctx [auto\|숫자\|자세히]` | 컨텍스트 **길이** — 모델에 맞춰 다시 재거나 직접 지정 |
|
|
377
383
|
| `/out [숫자\|auto]` | 한 번에 받을 **답 길이** 상한 — 큰 파일이 잘리면 여기를 올립니다 |
|
|
@@ -380,7 +386,10 @@ node 프로젝트 (deel-local-cli) · git main
|
|
|
380
386
|
| `/clear` | 대화 비우기 (연결·규칙은 유지) |
|
|
381
387
|
| `/thread [new\|fork\|close\|번호]` | 대화 갈래 — 곁가지를 딴 자리에서. 연결·되돌리기는 같이 씁니다 |
|
|
382
388
|
| `/learned [지우기]` | 쓰면서 저절로 알게 된 것 — 되는 명령·이 모델의 버릇 |
|
|
389
|
+
| `/pin <말>` | 못 박기 — 접거나 요약해도 **안 지워지는** 말 |
|
|
390
|
+
| `/evidence [파일]` | 증거 — 무엇을 바꿨고 무엇이 그걸 증명하나. **안 된 것도** 적습니다 |
|
|
383
391
|
| `/model` | 연결·모델 바꾸기 |
|
|
392
|
+
| `/model 카드` | 이 모델을 겪어 본 결과 — 그래서 deel 이 무엇을 바꿔 뒀는지 |
|
|
384
393
|
| `/think <강도>` | 추론 강도 (`off·low·medium·high·max`) |
|
|
385
394
|
| `/think 배분 <배분>` | 단계별 배분 (`균일·절약·깊게`) |
|
|
386
395
|
| `/think 자세히` | 단계표 — 어느 단계를 어떤 강도·상한으로 도는지 |
|
|
@@ -798,6 +807,8 @@ node 프로젝트 (deel-local-cli) · git main
|
|
|
798
807
|
| `Verify` | 만든 것이 **진짜 되는지** 확인 |
|
|
799
808
|
| `Task` | 큰 일의 한 덩이를 **따로 떨어진 창**에서 돌리기 |
|
|
800
809
|
| `Jobs` | **뒤에서 도는 명령** 보기·읽기·끝내기 — `Bash` 의 `background` 와 짝 |
|
|
810
|
+
| `Def` | 이름이 **어디 정의됐는지** — 언어 서버가 깔려 있을 때만 보입니다 |
|
|
811
|
+
| `Refs` | 이름을 **어디서 쓰는지** 전부 — 언어 서버가 깔려 있을 때만 보입니다 |
|
|
801
812
|
|
|
802
813
|
Claude Code 에 없는 것은 일곱입니다 — `Append` · `Recall` · `Remember` ·
|
|
803
814
|
`Outline` · `Verify` · `Task` · `Jobs`. 도구 하나가 스키마로 150~400토큰을 먹고
|
|
@@ -806,7 +817,7 @@ Claude Code 에 없는 것은 일곱입니다 — `Append` · `Recall` · `Remem
|
|
|
806
817
|
아래에 왜인지를 적어 뒀습니다.
|
|
807
818
|
|
|
808
819
|
<details>
|
|
809
|
-
<summary><b>자세히</b> — Outline · Verify · Task · 끝나지 않는 명령은 뒤에서 외 9개</summary>
|
|
820
|
+
<summary><b>자세히</b> — Outline · Verify · Task · Def · Refs · 끝나지 않는 명령은 뒤에서 외 9개</summary>
|
|
810
821
|
|
|
811
822
|
### 프로젝트 모양을 싸게 봅니다 — `Outline`
|
|
812
823
|
|
|
@@ -1220,6 +1231,112 @@ $ /diff
|
|
|
1220
1231
|
`/diff` 는 **쉬움 수준의 명령 목록에도 들어 있습니다.** `auto` 가 안 물어보고
|
|
1221
1232
|
고치는 이상, 초보일수록 '무엇이 바뀌었나' 를 볼 통로가 필요합니다.
|
|
1222
1233
|
|
|
1234
|
+
### 언어 서버가 있으면 뜻까지 봅니다 — `Def` · `Refs`
|
|
1235
|
+
|
|
1236
|
+
`Grep` 은 **글자**를 찾고 언어 서버는 **뜻**을 압니다. `run` 을 `Grep` 으로 찾으면
|
|
1237
|
+
주석에 든 run, 남의 라이브러리의 run, 문자열 안의 run 이 다 같이 나옵니다. 그중
|
|
1238
|
+
진짜 그 함수를 부르는 자리가 몇 개인지는 사람이 하나씩 열어 봐야 압니다. 모델은
|
|
1239
|
+
그 값을 못 치르니 앞의 몇 개만 보고 고치고, **놓친 자리는 돌려 본 뒤에야** 나옵니다.
|
|
1240
|
+
|
|
1241
|
+
```
|
|
1242
|
+
⏺ Refs(셈하기)
|
|
1243
|
+
셈하기 — 쓰는 자리 3곳 · 파일 2개
|
|
1244
|
+
|
|
1245
|
+
src/쓰는곳.py (2)
|
|
1246
|
+
4: return 셈하기(1, 2)
|
|
1247
|
+
9: return 셈하기(x, x)
|
|
1248
|
+
src/또다른곳.py (1)
|
|
1249
|
+
2: 값 = 셈하기(9, 9)
|
|
1250
|
+
```
|
|
1251
|
+
|
|
1252
|
+
`Grep` 은 그대로 남습니다. 오히려 이름을 통째로 바꿀 때는 `Grep` 쪽이 필요합니다 —
|
|
1253
|
+
언어 서버는 주석·설정·문서를 안 봅니다. 그래서 이 둘은 **더해 주는 것**이지
|
|
1254
|
+
갈아 끼우는 것이 아닙니다.
|
|
1255
|
+
|
|
1256
|
+
자리(줄·칸) 대신 **이름**을 받습니다. LSP 는 "이 파일 이 줄 이 칸" 을 묻는 규약인데
|
|
1257
|
+
모델은 칸 번호를 모릅니다. 알려면 파일을 먼저 `Read` 해야 하고, 그러면 이 도구를
|
|
1258
|
+
쓰는 값이 통째로 사라집니다. 그래서 `workspace/symbol` 로 자리를 먼저 찾고 그
|
|
1259
|
+
자리로 다시 묻습니다. 같은 이름이 여러 곳이면 **그 목록을 그대로 보여 줍니다** —
|
|
1260
|
+
하나를 골라 주고 아닌 척하지 않습니다.
|
|
1261
|
+
|
|
1262
|
+
### 고친 직후에 그 파일이 성한지 봅니다
|
|
1263
|
+
|
|
1264
|
+
`Verify` 도 그대로 남습니다. 하는 일이 다릅니다.
|
|
1265
|
+
|
|
1266
|
+
| | 언제 | 무엇을 |
|
|
1267
|
+
|---|---|---|
|
|
1268
|
+
| `Verify` | 일 다 끝내고 한 번 | **문법** (`node --check` · `py_compile`) |
|
|
1269
|
+
| 고친 뒤 진단 | 고친 직후 그 파일만 | **뜻** (없는 이름 · 안 맞는 타입 · 빠진 인자) |
|
|
1270
|
+
|
|
1271
|
+
문법은 맞는데 틀린 것들이 있습니다. `node --check` 는 다 통과시킵니다.
|
|
1272
|
+
|
|
1273
|
+
```
|
|
1274
|
+
⏺ Write(pkg/bad.py)
|
|
1275
|
+
3줄
|
|
1276
|
+
언어 서버 — pkg/bad.py: 오류 2개
|
|
1277
|
+
1줄 오류: Type "Literal['글자']" is not assignable to declared type "int"
|
|
1278
|
+
2줄 오류: "없는이름" is not defined
|
|
1279
|
+
```
|
|
1280
|
+
|
|
1281
|
+
지금까지는 이런 것이 **돌려 본 뒤에야** 나왔고, 돌려 보는 것은 사용자 승인을
|
|
1282
|
+
거치는 일이라 몇 걸음 뒤였습니다. 그 사이에 모델은 그 파일을 끝낸 것으로 치고
|
|
1283
|
+
다음 파일로 갑니다. 나중에 오류가 나오면 어디서부터 잘못됐는지를 되짚어야 하는데,
|
|
1284
|
+
되짚는 값이 고치는 값보다 큽니다.
|
|
1285
|
+
|
|
1286
|
+
성할 때는 **아무 말도 안 합니다.** 고칠 때마다 "오류 0개" 를 한 줄씩 붙이면 창이
|
|
1287
|
+
그만큼 찹니다. 그리고 진단을 못 받은 것과 오류가 없는 것은 다릅니다 — 못 받았으면
|
|
1288
|
+
아무 말도 안 합니다. 없는 말을 지어내지 않습니다.
|
|
1289
|
+
|
|
1290
|
+
### 아무것도 깔지 않습니다
|
|
1291
|
+
|
|
1292
|
+
**이 프로그램은 언어 서버를 깔아 주지 않습니다.** PATH 를 훑어보고, 있으면 쓰고
|
|
1293
|
+
없으면 `Grep`·`Outline` 으로 갑니다. 사내에 미승인 SW 를 못 들이는 자리가 이
|
|
1294
|
+
프로그램이 존재하는 이유라, 도구가 `npm i -g` 를 제 마음대로 부르면 안 됩니다.
|
|
1295
|
+
|
|
1296
|
+
없으면 `Def`·`Refs` 는 **모델 목록에 아예 안 나옵니다.** 오프라인일 때 웹 도구를
|
|
1297
|
+
숨기는 것과 같습니다 — 못 쓰는 도구를 세워 두면 모델은 그걸 부르고, "없습니다" 를
|
|
1298
|
+
받고, 또 부릅니다. 그 왕복이 도구 설명으로 나가는 자리보다 비쌉니다.
|
|
1299
|
+
|
|
1300
|
+
무엇이 있는지는 `/lsp` 로 봅니다.
|
|
1301
|
+
|
|
1302
|
+
```
|
|
1303
|
+
$ /lsp
|
|
1304
|
+
|
|
1305
|
+
◈ 이 PC 에 있는 언어 서버 2개
|
|
1306
|
+
✓ ts typescript-language-server
|
|
1307
|
+
✓ py pyright-langserver
|
|
1308
|
+
|
|
1309
|
+
이 폴더의 언어: py · 12개 파일
|
|
1310
|
+
도구: Def · Refs
|
|
1311
|
+
고친 뒤 진단: 켜짐
|
|
1312
|
+
고친 뒤 진단 켜고 끄기: /lsp on · /lsp off
|
|
1313
|
+
```
|
|
1314
|
+
|
|
1315
|
+
`ts` · `py` · `go` · `rs` · `java` · `cs` · `cpp` · `rb` · `php` · `lua` 를 찾습니다.
|
|
1316
|
+
없으면 깔 명령을 **글자로만** 보여 줍니다. 칠지 말지는 사람이 정합니다.
|
|
1317
|
+
|
|
1318
|
+
<details>
|
|
1319
|
+
<summary>붙이면서 진짜 서버(pyright)에게 배운 것 넷</summary>
|
|
1320
|
+
|
|
1321
|
+
흉내 서버로만 시험했으면 전부 초록이었을 것들입니다.
|
|
1322
|
+
|
|
1323
|
+
- **서버는 주소를 우리와 다르게 적습니다.** 우리는 `file:///C:/…`, pyright 은
|
|
1324
|
+
`file:///c%3A/…` — 드라이브 글자를 소문자로 쓰고 콜론을 퍼센트로 감쌉니다.
|
|
1325
|
+
글자로 견주면 영영 안 맞습니다. 진단은 제대로 오는데 표에서 못 찾아 '안 왔다' 가
|
|
1326
|
+
되고, **아무 말도 안 하는 것이 '성하다' 는 뜻이라** 틀린 것을 성하다고 말하게
|
|
1327
|
+
됩니다. 그래서 주소가 아니라 경로로 견줍니다.
|
|
1328
|
+
- **막 켠 서버는 빈손으로 답합니다.** 없어서가 아니라 아직 프로젝트를 다 못
|
|
1329
|
+
훑어서입니다. 켠 지 0.2초에 물었더니 없다고 했고 0.5초 뒤엔 나왔습니다. 이걸
|
|
1330
|
+
'없다' 로 잘라 말하면 모델은 그 말을 믿고 이미 있는 것을 새로 만듭니다. 켠 지
|
|
1331
|
+
얼마 안 됐을 때만 몇 번 더 물어봅니다.
|
|
1332
|
+
- **윈도우에서 npm 이 깐 것은 이름이 둘입니다.** 확장자 없는 sh 스크립트와 `.cmd`.
|
|
1333
|
+
앞엣것을 먼저 찾으면 파일은 분명히 있으니 '깔려 있다' 고 나오는데, 띄우면
|
|
1334
|
+
윈도우가 못 돌립니다. 있다고 해 놓고 안 되는, 제일 알아채기 어려운 꼴입니다.
|
|
1335
|
+
- **`cmd /s /c` 는 바깥 따옴표 한 쌍을 떼어 냅니다.** 한 쌍만 두르면 명령이 통째로
|
|
1336
|
+
깨지는데, 겉에서 보이는 것은 "언어 서버가 없습니다" 뿐입니다.
|
|
1337
|
+
|
|
1338
|
+
</details>
|
|
1339
|
+
|
|
1223
1340
|
</details>
|
|
1224
1341
|
|
|
1225
1342
|
---
|
|
@@ -1699,6 +1816,109 @@ JSON-RPC 2.0 을 주고받는 것이 전부라, `child_process` 와 `JSON` 이
|
|
|
1699
1816
|
|
|
1700
1817
|
---
|
|
1701
1818
|
|
|
1819
|
+
## 에디터 안에서 쓰기 (ACP)
|
|
1820
|
+
|
|
1821
|
+
터미널을 하나 더 띄우게 하는 도구는 두 주쯤 뒤에 안 씁니다. 개발자는 하루 종일
|
|
1822
|
+
IDE 안에 있습니다. 그래서 **ACP**(Agent Client Protocol)를 지킵니다 — Zed ·
|
|
1823
|
+
JetBrains · Neovim · Emacs 가 **저쪽을 한 줄도 안 고치고** deel 을 붙입니다.
|
|
1824
|
+
|
|
1825
|
+
에디터 설정에 이 명령 하나만 적으면 됩니다.
|
|
1826
|
+
|
|
1827
|
+
```
|
|
1828
|
+
deel acp
|
|
1829
|
+
```
|
|
1830
|
+
|
|
1831
|
+
에디터가 이걸 자식 프로세스로 띄우고, 표준입출력으로 줄 단위 JSON-RPC 2.0 을
|
|
1832
|
+
주고받습니다. 사람이 직접 칠 명령은 아닙니다.
|
|
1833
|
+
|
|
1834
|
+
**붙으면 이렇게 됩니다.**
|
|
1835
|
+
|
|
1836
|
+
| 에디터 쪽 | deel 쪽 |
|
|
1837
|
+
|---|---|
|
|
1838
|
+
| 답이 흘러나오는 자리 | 모델이 흘리는 글 · 생각 |
|
|
1839
|
+
| 도구 목록 (아이콘·상태) | `Read` 는 읽기, `Edit` 는 고치기, `Bash` 는 실행 — **갈래를 붙여** 보냅니다 |
|
|
1840
|
+
| 파일 링크 | 고친 파일의 **절대 경로**. 눌러서 그 자리로 갑니다 |
|
|
1841
|
+
| 승인 창 | deel 의 안전망이 그대로 에디터 창으로 뜹니다 (`이번만` · `앞으로 묻지 않기` · `안 함`) |
|
|
1842
|
+
| 모드 고르개 | deel 의 작업 모드 7개 (`종합` · `코드` · `계획` · `설계` · `디버그` · `묻기` · `총괄`) |
|
|
1843
|
+
| 멈춤 단추 | 도중에 닿습니다 — 답을 기다리는 중에도 |
|
|
1844
|
+
|
|
1845
|
+
**의존성은 그대로 0 입니다.** MCP 와 같은 이유입니다 — 줄 단위 JSON-RPC 2.0 이
|
|
1846
|
+
전부라 SDK 가 필요 없습니다.
|
|
1847
|
+
|
|
1848
|
+
<details>
|
|
1849
|
+
<summary><b>자세히</b> — 조용히 깨지는 자리들</summary>
|
|
1850
|
+
|
|
1851
|
+
이 프로토콜은 깨질 때 조용히 깨집니다. 에디터는 "에이전트가 응답하지 않습니다"
|
|
1852
|
+
만 띄우고, 왜 그런지는 어디에도 안 남습니다. 그래서 다음 자리들을 검사로 못
|
|
1853
|
+
박아 두었습니다 (`test/acp.test.js` — 진짜 프로세스를 띄우고 진짜 파이프로 잽니다).
|
|
1854
|
+
|
|
1855
|
+
| 자리 | 왜 |
|
|
1856
|
+
|---|---|
|
|
1857
|
+
| **표준출력에는 ACP 말고 아무것도** | 규격이 `MUST NOT` 이라 적은 것입니다. deel 안에는 화면에 적는 자리가 수십 군데인데, 그 중 하나만 이 모드에서 불려도 관이 깨집니다. 부르는 자리를 하나씩 막는 대신 **통로 자체를 바꿔 끼웠습니다** — 앞으로 새로 쓰는 코드까지 저절로 안전합니다. 적힌 글은 버리지 않고 표준오류로 보냅니다 |
|
|
1858
|
+
| **한글이 덩이 경계에 걸칠 때** | 파이프는 글자가 아니라 바이트로 끊깁니다. 덩이마다 따로 디코딩하면 `안녕` 이 `안<?>하` 가 되는데 **JSON 은 그대로 파싱되므로 오류도 안 납니다.** 글자만 조용히 뭉개집니다 |
|
|
1859
|
+
| **`id` 가 0 인 요청** | ACP 클라이언트는 0번부터 셉니다. `if (msg.id)` 로 보면 첫 `initialize` 를 알림으로 오해하고 답을 안 보냅니다 — 붙자마자 멈춥니다 |
|
|
1860
|
+
| **취소가 도중에 닿는가** | 취소는 늘 무언가가 돌고 있는 중에 옵니다. 들어온 줄을 하나씩 기다렸다 처리하면 취소는 **영영 안 닿습니다** |
|
|
1861
|
+
| **승인을 못 물어봤을 때** | 여기서 '그냥 실행' 을 고르고 싶어집니다 — 안 그러면 승인 창을 아직 안 만든 클라이언트에서 아무것도 안 도니까. 그런데 그건 "물어볼 수 없으면 마음대로 한다" 는 뜻입니다. **안 합니다** |
|
|
1862
|
+
|
|
1863
|
+
**아직 안 하는 것도 적어 둡니다.**
|
|
1864
|
+
|
|
1865
|
+
| | |
|
|
1866
|
+
|---|---|
|
|
1867
|
+
| `session/load` | 지난 대화 되살리기. 오간 말을 전부 다시 흘려야 하는데, 반쯤 만들어 두면 에디터가 빈 대화를 열고 사용자는 기록이 날아간 줄 압니다. **`loadSession: false` 라고 분명히 말합니다** |
|
|
1868
|
+
| 그림·소리 붙임 | 로컬 모델 대부분이 못 읽습니다. 조용히 버리지 않고 "못 읽습니다" 라고 적어 모델에게 넘깁니다 |
|
|
1869
|
+
| 에디터가 넘긴 MCP 서버 | 띄우지 않습니다. 그러면 **에디터 설정에 적힌 프로세스를 deel 이 대신 띄우는** 셈이 됩니다. 반입 심사에서 제일 먼저 묻는 것이 "이 도구가 무엇을 띄우는가" 인데, 그 답이 '에디터가 시키는 대로' 가 되면 안 됩니다. `.deel/mcp.json` 에 사람이 직접 적은 것만 띄웁니다 |
|
|
1870
|
+
|
|
1871
|
+
</details>
|
|
1872
|
+
|
|
1873
|
+
---
|
|
1874
|
+
|
|
1875
|
+
## 비밀이 새지 않게
|
|
1876
|
+
|
|
1877
|
+
사람이 열쇠를 붙여 넣는 일은 드뭅니다. 새는 자리는 거의 항상 **명령 출력**입니다.
|
|
1878
|
+
|
|
1879
|
+
```
|
|
1880
|
+
env OPENAI_API_KEY=sk-proj-…
|
|
1881
|
+
git remote -v https://사람:토큰@github.com/…
|
|
1882
|
+
curl -v > Authorization: Bearer eyJ…
|
|
1883
|
+
검사 실패 로그 연결 문자열이 통째로
|
|
1884
|
+
```
|
|
1885
|
+
|
|
1886
|
+
그 글은 모델에게 실려 가고, **동시에** `.deel/sessions/*.jsonl` 로 디스크에
|
|
1887
|
+
적힙니다. 그 파일은 나중에 `/recall` 로 다시 읽히고 `deel pack` 에 딸려 갈 수도
|
|
1888
|
+
있습니다. 한 번 새면 여러 벌이 됩니다.
|
|
1889
|
+
|
|
1890
|
+
그래서 도구 결과가 대화로 들어가는 **한 자리**에서 가립니다.
|
|
1891
|
+
|
|
1892
|
+
```
|
|
1893
|
+
⏺ Bash(env | grep API) 완료
|
|
1894
|
+
⊘ 비밀로 보이는 값 2군데가 대화에 들어갔습니다 (openai · 환경변수) — 모델에 가려서 보냈습니다
|
|
1895
|
+
```
|
|
1896
|
+
|
|
1897
|
+
찾는 것: 사설키 블록 · OpenAI/Anthropic 열쇠 · GitHub 토큰 · Slack 토큰 ·
|
|
1898
|
+
AWS 키 · Google 키 · JWT · 주소에 박힌 열쇠 · `Authorization` 계열 헤더 ·
|
|
1899
|
+
이름이 `…KEY`/`…TOKEN`/`…SECRET`/`…PASSWORD` 인 환경변수. 그리고 **설정에 든
|
|
1900
|
+
게이트웨이 열쇠는 모양과 상관없이** — 그건 짐작이 아니라 아는 값이니까요.
|
|
1901
|
+
|
|
1902
|
+
### 파일 내용은 일부러 안 가립니다
|
|
1903
|
+
|
|
1904
|
+
가리고 싶은 마음이 제일 드는 자리가 `.env` 인데, 거기를 가리면 이렇게 됩니다 —
|
|
1905
|
+
모델이 가려진 글을 보고, 그걸 고쳐서 되돌려 씁니다. 그러면 진짜 열쇠가 있던
|
|
1906
|
+
자리에 `«가림»` 이 적힙니다. **비밀을 지키려다 사람의 열쇠를 우리 손으로
|
|
1907
|
+
지우는 셈입니다.**
|
|
1908
|
+
|
|
1909
|
+
그래서 파일 쪽은 가리는 대신 **알립니다.**
|
|
1910
|
+
|
|
1911
|
+
```
|
|
1912
|
+
⏺ Read(.env) 12줄
|
|
1913
|
+
! 비밀로 보이는 값 3군데가 대화에 들어갔습니다 (환경변수)
|
|
1914
|
+
— 파일 내용은 가리지 않습니다 (가리면 되돌려 쓸 때 지워집니다)
|
|
1915
|
+
```
|
|
1916
|
+
|
|
1917
|
+
무엇을 못 막는지 분명히 말하는 편이, 막았다고 해 놓고 파일을 망가뜨리는 것보다
|
|
1918
|
+
언제나 낫습니다. 어느 쪽이든 감사기록에 남습니다.
|
|
1919
|
+
|
|
1920
|
+
---
|
|
1921
|
+
|
|
1702
1922
|
## 안전망
|
|
1703
1923
|
|
|
1704
1924
|
승인 프롬프트 대신 **되돌릴 수 있게** 만들었습니다. 기본 모드 `auto` 는 묻지 않고 알아서 합니다.
|
|
@@ -1809,25 +2029,36 @@ deel pack --out deel-반입.zip
|
|
|
1809
2029
|
```
|
|
1810
2030
|
── 반입 묶음 ───────────────────────────────────────────────────
|
|
1811
2031
|
✓ deel-반입.zip
|
|
1812
|
-
|
|
2032
|
+
94개 파일 · 509.6KB
|
|
1813
2033
|
|
|
1814
2034
|
의존성 0개
|
|
1815
2035
|
설치 스크립트 없음
|
|
1816
2036
|
외부 import 0건
|
|
1817
2037
|
네트워크 호출 3곳 (설정한 주소로만)
|
|
1818
|
-
포트 열기
|
|
2038
|
+
포트 열기 1곳 (/preview 만)
|
|
1819
2039
|
```
|
|
1820
2040
|
|
|
1821
|
-
zip
|
|
2041
|
+
zip 안에는 **사람이 읽을 것 한 장, 기계가 읽을 것 두 장**이 같이 들어갑니다.
|
|
2042
|
+
반입 심사는 사람만 보는 절차가 아니기 때문입니다 — 보안팀은 SBOM 을 스캐너에
|
|
2043
|
+
먹여 취약점 목록을 뽑고, 운영팀은 감사 사양을 보고 SIEM 수집 규칙을 짭니다.
|
|
2044
|
+
|
|
2045
|
+
| 파일 | 무엇 |
|
|
2046
|
+
|---|---|
|
|
2047
|
+
| `반입심사서.txt` | 의존성 · 설치 스크립트 · **소스를 훑어 찾은 네트워크·외부 명령 호출 자리 전부**(파일:줄) · 나가는 길 세 갈래 · 파일별 SHA-256 |
|
|
2048
|
+
| `sbom.cdx.json` | **SBOM (CycloneDX 1.5).** 스캐너에 그대로 넣습니다. 파일마다 부품 하나에 SHA-256, 의존성은 **빈 배열로 명시** — 안 적어 낸 것과 없는 것은 다릅니다 |
|
|
2049
|
+
| `심사명세.json` | 통신 목록(갈래마다 언제·어디로·무엇이·막는법·소스 자리) · **감사기록 사양**(칸 이름과 뜻, 안 남기는 것) · 파일 해시 |
|
|
1822
2050
|
|
|
1823
|
-
|
|
1824
|
-
|
|
1825
|
-
|
|
1826
|
-
|
|
1827
|
-
|
|
2051
|
+
```bash
|
|
2052
|
+
deel audit # 사람이 읽는 심사서만 보기
|
|
2053
|
+
deel sbom # 기계가 읽는 두 장을 표준출력으로 (deel sbom | jq)
|
|
2054
|
+
deel sbom --out 심사.json # 파일로
|
|
2055
|
+
deel sbom --only sbom # SBOM 한 장만
|
|
2056
|
+
```
|
|
1828
2057
|
|
|
1829
|
-
손으로 적지 않고 코드가 소스를 훑어서 만듭니다 — 손으로 적으면 언젠가
|
|
1830
|
-
|
|
2058
|
+
셋 다 손으로 적지 않고 코드가 소스를 훑어서 만듭니다 — 손으로 적으면 언젠가
|
|
2059
|
+
사실과 어긋나고, **어긋난 심사 서류는 없느니만 못합니다.** 담당자가 한 번 틀린
|
|
2060
|
+
것을 발견하면 나머지도 안 믿습니다. 감사기록 사양만은 손으로 적혀 있어서,
|
|
2061
|
+
그것이 진짜 기록과 어긋나지 않는지를 검사가 매번 대조합니다.
|
|
1831
2062
|
|
|
1832
2063
|
<details>
|
|
1833
2064
|
<summary><b>자세히</b> — 사내 게이트웨이 진단</summary>
|
|
@@ -2058,7 +2289,7 @@ src/
|
|
|
2058
2289
|
backend/scan.js 로컬 서버 훑기
|
|
2059
2290
|
backend/mcp.js 밖에서 도구 붙이기 (MCP, stdio)
|
|
2060
2291
|
|
|
2061
|
-
tools/index.js 도구
|
|
2292
|
+
tools/index.js 도구 17종
|
|
2062
2293
|
tools/edit-match.js 단계별 완화 편집 매칭
|
|
2063
2294
|
tools/outline.js 파일 모양만 싸게 보기
|
|
2064
2295
|
tools/verify.js 만든 것 확인
|
|
@@ -2068,6 +2299,12 @@ src/
|
|
|
2068
2299
|
tools/webfetch.js 웹 읽기 (읽기 전용)
|
|
2069
2300
|
tools/encoding.js 읽은 인코딩 그대로 되돌려 쓰기
|
|
2070
2301
|
tools/xlsx.js 엑셀 → CSV (직접 구현)
|
|
2302
|
+
tools/lsp.js Def · Refs — 언어 서버에게 묻기
|
|
2303
|
+
|
|
2304
|
+
lsp/rpc.js LSP 말틀 (Content-Length + JSON-RPC, 직접 구현)
|
|
2305
|
+
lsp/servers.js 깔린 언어 서버 찾기 (안 깔아 준다)
|
|
2306
|
+
lsp/client.js 서버 하나 띄워 놓고 주고받기 · 시한 · 정리
|
|
2307
|
+
lsp/diag.js 고친 직후 그 파일이 성한지
|
|
2071
2308
|
|
|
2072
2309
|
preview/serve.js 만든 웹 띄우기 (127.0.0.1 에만)
|
|
2073
2310
|
skills/discover.js 그 PC 의 스킬·명령·플러그인 찾기
|
|
@@ -2089,6 +2326,217 @@ test/ 검증 (배포 묶음에서 뺀다)
|
|
|
2089
2326
|
|
|
2090
2327
|
## 릴리스 노트
|
|
2091
2328
|
|
|
2329
|
+
<details>
|
|
2330
|
+
<summary><b>▸ 1.4.0 — deel 이 제 얼굴을 갖고, 영어로도 말하고, 뜻까지 본다</b> · 일곱 자리가 어떻게 바뀌었나</summary>
|
|
2331
|
+
|
|
2332
|
+
<br>
|
|
2333
|
+
|
|
2334
|
+
| | 전 | 후 |
|
|
2335
|
+
|---|---|---|
|
|
2336
|
+
| `/undo` | 파일만 되돌렸다 — 대화는 그 일이 있었다고 믿는 채로 | **대화까지** 같이 되감는다 |
|
|
2337
|
+
| 몇 분 걸리는 턴 | 화면만 보고 앉아 있어야 했다 | 종소리와 창 제목 — 다른 창에 가 있어도 안다 |
|
|
2338
|
+
| 켤 때 · 상태줄 | 어느 CLI 나 같아 보였다 | 글자가 자라는 시작 모션, 경계를 말하는 상태줄 |
|
|
2339
|
+
| 영어권 사람 | 화면이 온통 못 읽는 말이었다 | `/lang en` — 화면도 **모델이 읽는 글도** 영어로 |
|
|
2340
|
+
| 한 세션의 모델 | 하나 | 덩이마다 다른 모델 — 잔일은 작은 모델에게 |
|
|
2341
|
+
| 이름 찾기 | `Grep` 뿐 — 주석·문자열까지 섞여 나왔다 | `Def`·`Refs` — 언어 서버가 있으면 **뜻**으로 |
|
|
2342
|
+
| 고친 파일 | 돌려 봐야 성한지 알았다 | 고친 **직후에** 그 파일만 본다 |
|
|
2343
|
+
|
|
2344
|
+
<br>
|
|
2345
|
+
|
|
2346
|
+
#### 1. `/undo` 가 대화까지 되감습니다
|
|
2347
|
+
|
|
2348
|
+
파일만 되돌리면 대화는 그 일이 있었던 채로 남습니다. 모델은 방금 고쳤다고 믿고
|
|
2349
|
+
다음 걸음을 그 위에 쌓습니다 — 화면에는 아무 일도 안 일어납니다. 이제 되돌린
|
|
2350
|
+
만큼 오간 말도 같이 접습니다. 접다가 도구 호출 짝이 깨지면 서버가 400을 내므로,
|
|
2351
|
+
`repairToolPairs` 를 그대로 태워 짝을 맞춥니다.
|
|
2352
|
+
|
|
2353
|
+
#### 2. 다 됐을 때 알려 줍니다 — `/bell`
|
|
2354
|
+
|
|
2355
|
+
로컬 모델은 한 턴이 몇 분씩 갑니다. 종소리와 창 제목으로 알립니다. 종은
|
|
2356
|
+
`` 이지만 **파이프로는 한 글자도 안 흘립니다** — TTY 가 아니면 아무 데도
|
|
2357
|
+
안 씁니다. 창 제목은 ST 로 끝냅니다. BEL 로 끝내면 제목을 갱신할 때마다 종이
|
|
2358
|
+
울립니다.
|
|
2359
|
+
|
|
2360
|
+
#### 3. deel 만의 화면
|
|
2361
|
+
|
|
2362
|
+
켤 때 `deel` 에서 `deel-local` 로 글자가 자랍니다. 상태줄은 지금 어느 경계에
|
|
2363
|
+
있는지를 한 글자로 말합니다(`⌂` 이 폴더 · `↗` 밖 · `?` 모름). 애니메이션은
|
|
2364
|
+
점자와 괘선만 씁니다 — 이모지와 도형은 East Asian Ambiguous 라 폭이 자리마다
|
|
2365
|
+
달라서, 한 칸씩 밀린 화면이 됩니다.
|
|
2366
|
+
|
|
2367
|
+
#### 4·5. 영어권에서도, 그리고 모델이 읽는 글까지
|
|
2368
|
+
|
|
2369
|
+
`/lang en` 이면 화면 말이 영어로 갑니다. 안 옮긴 마디는 빈칸 대신 한국어를 그대로
|
|
2370
|
+
내고, `/lang` 이 몇 개가 남았는지 정직하게 셉니다.
|
|
2371
|
+
|
|
2372
|
+
그런데 화면만 바꾸면 모델은 계속 한국어로 답합니다 — 규칙 안에 그렇게 적혀
|
|
2373
|
+
있어서입니다. 그래서 모델이 읽는 글(뼈대 규칙·모드 지시문·도구 설명 열여섯 개)도
|
|
2374
|
+
같이 갑니다. 덤이 하나 붙습니다: 한글은 글자당 약 1토큰이고 영문은 약 3.6자당
|
|
2375
|
+
1토큰이라, 32k 창 고정 몫이 **4,910 → 3,446 토큰**으로 줄었습니다.
|
|
2376
|
+
|
|
2377
|
+
도구 이름과 인자 이름은 **안 옮깁니다.** 그건 식별자입니다.
|
|
2378
|
+
|
|
2379
|
+
#### 6. 한 세션 안에서 여러 모델 — `Task` 의 `모델`
|
|
2380
|
+
|
|
2381
|
+
8GB 램에서도 큰 모델과 작은 모델을 같이 씁니다. 잔일(형식 맞추기·되풀이 편집·
|
|
2382
|
+
짧은 요약)은 작은 모델에게 떼어 주고 판단이 필요한 것만 직접 합니다. 하위가
|
|
2383
|
+
쓰는 자리는 `allowTemporarily` 로 열고 **`finally` 에서 반드시 닫습니다** —
|
|
2384
|
+
끝나고 나면 열린 자리가 정확히 하나로 돌아옵니다.
|
|
2385
|
+
|
|
2386
|
+
#### 7. 언어 서버 — `Def` · `Refs` · 고친 뒤 진단
|
|
2387
|
+
|
|
2388
|
+
위 "언어 서버가 있으면 뜻까지 봅니다" 를 보세요. **아무것도 깔지 않습니다.**
|
|
2389
|
+
|
|
2390
|
+
</details>
|
|
2391
|
+
|
|
2392
|
+
<details>
|
|
2393
|
+
<summary><b>▸ 1.3.0 — 말 대신 증거, 터미널 대신 에디터</b> · 여섯 자리가 어떻게 바뀌었나</summary>
|
|
2394
|
+
|
|
2395
|
+
<br>
|
|
2396
|
+
|
|
2397
|
+
| | 전 | 후 |
|
|
2398
|
+
|---|---|---|
|
|
2399
|
+
| 꼭 지켜야 할 말 | 접히거나 요약되면 **사라졌다** | 프롬프트 밖에 두어 손이 못 닿는다 |
|
|
2400
|
+
| 이 모델의 버릇 | 프롬프트에 "이렇게 해라" 고 **부탁**했다 | 하네스 설정을 바꾼다 — 모델 협조가 필요 없다 |
|
|
2401
|
+
| 끝맺음 | "다 됐습니다" | 무엇을 바꿨고 무엇이 그걸 증명하나. **안 된 것도** |
|
|
2402
|
+
| 쓰는 자리 | 터미널을 하나 더 | 에디터 안에서 (Zed · JetBrains · Neovim · Emacs) |
|
|
2403
|
+
| 심사 서류 | 사람이 읽는 글 한 장 | SBOM · 통신 목록 · 감사 사양 — **스캐너에 그대로** |
|
|
2404
|
+
| 열쇠 | `env` 한 번이면 대화에도 디스크에도 남았다 | 들어가는 한 자리에서 가린다. 파일은 **일부러** 안 가린다 |
|
|
2405
|
+
|
|
2406
|
+
<br>
|
|
2407
|
+
|
|
2408
|
+
#### 1. 꼭 지켜야 할 말이 접히면서 사라지던 것 — `/pin`
|
|
2409
|
+
|
|
2410
|
+
긴 대화에서는 자리를 비우려고 앞선 말을 접거나 요약합니다. 그런데 2026년 재기로는
|
|
2411
|
+
**요약이 안전 제약을 50% 밖에 안 남깁니다.** "이 파일은 절대 건드리지 마세요" 가
|
|
2412
|
+
그 50% 에 안 들면, 모델은 그 말을 들은 적이 없는 상태가 됩니다. 화면에는 아무 일도
|
|
2413
|
+
안 일어납니다.
|
|
2414
|
+
|
|
2415
|
+
못 박은 말은 **오간 말 쪽에 안 둡니다.** 시스템 프롬프트 끝에 붙입니다 — 접기도
|
|
2416
|
+
요약도 오간 말만 만지므로, 구조적으로 손이 닿지 않습니다. 조심해서 안 지우는 것이
|
|
2417
|
+
아니라 **지울 수가 없습니다.**
|
|
2418
|
+
|
|
2419
|
+
```
|
|
2420
|
+
/pin src/legacy 폴더는 건드리지 마세요
|
|
2421
|
+
|
|
2422
|
+
✓ 못 박았습니다 — 지금 2개 (78 토큰)
|
|
2423
|
+
```
|
|
2424
|
+
|
|
2425
|
+
12개 · 240 토큰까지입니다. 넘으면 넘었다고 말하고 최근 것부터 싣습니다 — 조용히
|
|
2426
|
+
빠뜨리면 못 박은 뜻이 없어집니다.
|
|
2427
|
+
|
|
2428
|
+
#### 2. 겪어 본 버릇이 말로만 남던 것 — `/model 카드`
|
|
2429
|
+
|
|
2430
|
+
deel 은 이미 모델의 버릇을 지켜보고 있었습니다. 그런데 지켜보기만 하고 **프롬프트에
|
|
2431
|
+
적는 것**이 전부였습니다 — "인자를 자주 잘라 먹었으니 Append 를 써라" 하고. 작은
|
|
2432
|
+
모델은 그 말을 잘 안 듣습니다. 그게 작은 모델입니다.
|
|
2433
|
+
|
|
2434
|
+
이제 겪은 것이 **하네스 설정**으로 바뀝니다. 모델에게 부탁하는 대신 deel 이 제
|
|
2435
|
+
행동을 바꿉니다.
|
|
2436
|
+
|
|
2437
|
+
| 겪은 것 | 바뀌는 것 |
|
|
2438
|
+
|---|---|
|
|
2439
|
+
| 인자가 자주 잘린다 (15% 넘게) | 처음부터 상한을 높여 부릅니다 — 한 번 버리고 다시 부르지 않게 |
|
|
2440
|
+
| 같은 것을 되풀이한다 | 세 번까지 봐 주던 것을 두 번에서 끊습니다 |
|
|
2441
|
+
| 편집이 자주 빗나간다 | 빗나갔을 때 보여 주는 앞뒤 줄을 늘립니다 |
|
|
2442
|
+
|
|
2443
|
+
12걸음을 걸어 보기 전에는 **아무것도 안 바꿉니다.** 우연히 한 번 잘린 것 때문에
|
|
2444
|
+
멀쩡한 모델을 붙들어 매면 안 배우느니만 못합니다.
|
|
2445
|
+
|
|
2446
|
+
#### 3. "다 됐습니다" 대신 검토할 수 있는 것 — `/evidence`
|
|
2447
|
+
|
|
2448
|
+
2026년 조사로는 개발자의 **96%가 AI 가 쓴 코드를 온전히 믿지 않는데, 매번 확인하는
|
|
2449
|
+
사람은 48%** 입니다. 38%는 "사람 코드보다 리뷰가 더 힘들다"고 답했습니다.
|
|
2450
|
+
|
|
2451
|
+
왜 더 힘든가. 사람이 낸 코드는 "왜 이렇게 했나" 를 물으면 답이 옵니다. 에이전트가
|
|
2452
|
+
낸 코드는 **"끝났습니다" 한 줄**과 함께 옵니다. 그 한 줄은 검토할 수가 없습니다.
|
|
2453
|
+
|
|
2454
|
+
```
|
|
2455
|
+
/evidence
|
|
2456
|
+
|
|
2457
|
+
바꾼 것 3개 파일 · +142 −38
|
|
2458
|
+
돌린 것 5개 (실패 1)
|
|
2459
|
+
증명 안 된 것 1개
|
|
2460
|
+
|
|
2461
|
+
✗ src/worker.js — 마지막으로 돌린 `npm test` 가 실패했습니다 —
|
|
2462
|
+
그 앞이 통과했어도 지금 상태를 증명하지 못합니다.
|
|
2463
|
+
```
|
|
2464
|
+
|
|
2465
|
+
바꾼 것을 늘어놓는 일은 `/diff` 도 합니다. 여기서만 하는 것은 **증명 안 된 것을
|
|
2466
|
+
증명 안 됐다고 말하는 것**입니다. 셋을 거릅니다 —
|
|
2467
|
+
|
|
2468
|
+
- 고쳐 놓고 아무것도 안 돌렸으면 아무것도 증명되지 않았습니다
|
|
2469
|
+
- 검사가 빨간데 돌리기는 했다고 초록으로 치면 **빨간 검사를 증거로 내미는** 셈입니다
|
|
2470
|
+
- 고치기 **전에** 돌린 검사는 고친 것을 증명하지 못합니다 — "아까 돌렸으니 됐다" 가
|
|
2471
|
+
제일 흔한 자기기만입니다
|
|
2472
|
+
|
|
2473
|
+
빌드가 통과하고 그 **뒤에** 검사가 깨졌으면, 앞의 초록은 증거가 아닙니다. 마지막에
|
|
2474
|
+
돌린 것이 빨간데 확인됐을 리가 없습니다.
|
|
2475
|
+
|
|
2476
|
+
`/evidence 파일이름` 이면 `.deel/증거/` 아래에 마크다운으로 남깁니다. 화면은
|
|
2477
|
+
스크롤로 사라지고, 검토는 나중에 다른 사람이 합니다.
|
|
2478
|
+
|
|
2479
|
+
#### 4. 터미널을 하나 더 띄우게 하던 것 — `deel acp`
|
|
2480
|
+
|
|
2481
|
+
개발자는 하루 종일 IDE 안에 있습니다. 창을 옮겨 다녀야 하는 도구는 두 주쯤 뒤에
|
|
2482
|
+
안 씁니다. 반입 심사를 통과한 판이 아무도 안 쓰는 판이 되는 것이 제일 아까운
|
|
2483
|
+
결말입니다.
|
|
2484
|
+
|
|
2485
|
+
**ACP**(Agent Client Protocol)를 지킵니다. 에디터 설정에 `deel acp` 한 줄이면
|
|
2486
|
+
Zed · JetBrains · Neovim · Emacs 가 **저쪽을 한 줄도 안 고치고** 붙습니다.
|
|
2487
|
+
|
|
2488
|
+
붙이는 일은 관을 잇는 것이 아니라 **에디터가 무엇을 보여 줄 수 있게 하는가** 입니다.
|
|
2489
|
+
갈래·자리·상태는 안 줘도 규격에 안 걸려서, 대충 붙인 구현은 죄다 안 줍니다 —
|
|
2490
|
+
그러면 도구가 전부 똑같은 회색 점이고, 고친 파일을 눌러도 안 열립니다.
|
|
2491
|
+
|
|
2492
|
+
승인 창도 그대로 나갑니다. deel 의 안전망이 에디터 제 창으로 뜨고, "앞으로 묻지
|
|
2493
|
+
않기" 도 그 세션 동안 기억합니다. 못 물어보는 클라이언트에서는 **실행하지 않습니다** —
|
|
2494
|
+
"물어볼 수 없으면 마음대로 한다" 가 되면 안 됩니다.
|
|
2495
|
+
|
|
2496
|
+
**의존성은 그대로 0 입니다.** 줄 단위 JSON-RPC 2.0 이 전부라 SDK 가 필요 없습니다.
|
|
2497
|
+
|
|
2498
|
+
#### 5. 심사 서류가 사람만 읽을 수 있던 것 — `deel sbom`
|
|
2499
|
+
|
|
2500
|
+
2026년 4월 20일 전자금융감독규정 시행세칙 개정으로 금융권 망분리 예외가
|
|
2501
|
+
열렸습니다. 그 문 앞에서 요구되는 서류는 사람이 읽는 글이 아닙니다 — 보안팀은
|
|
2502
|
+
SBOM 을 **스캐너에 먹여** 취약점 목록을 뽑고, 운영팀은 감사 사양을 보고 SIEM
|
|
2503
|
+
수집 규칙을 짭니다.
|
|
2504
|
+
|
|
2505
|
+
이제 `deel pack` 이 세 장을 냅니다.
|
|
2506
|
+
|
|
2507
|
+
| | |
|
|
2508
|
+
|---|---|
|
|
2509
|
+
| `반입심사서.txt` | 전과 같은, 사람이 읽는 글 |
|
|
2510
|
+
| `sbom.cdx.json` | CycloneDX 1.5. 파일마다 부품 하나에 SHA-256. **의존성은 빈 배열로 명시** — 안 적어 낸 것과 없는 것은 다릅니다 |
|
|
2511
|
+
| `심사명세.json` | 통신 목록(갈래마다 언제·어디로·무엇이·막는법·소스 자리) · 감사기록 사양 · 파일 해시 |
|
|
2512
|
+
|
|
2513
|
+
셋 다 소스를 훑어 만듭니다. 감사 사양만은 손으로 적혀 있어서, **그것이 진짜
|
|
2514
|
+
기록과 어긋나지 않는지를 검사가 매번 대조합니다** — 어긋난 심사 서류는 없느니만
|
|
2515
|
+
못하고, 담당자가 한 번 틀린 것을 발견하면 나머지도 안 믿습니다.
|
|
2516
|
+
|
|
2517
|
+
#### 6. `env` 한 번이면 열쇠가 대화에도 디스크에도 남던 것
|
|
2518
|
+
|
|
2519
|
+
사람이 열쇠를 붙여 넣는 일은 드뭅니다. 새는 자리는 거의 항상 명령 출력입니다 —
|
|
2520
|
+
`env` · `git remote -v` · `curl -v` · 검사 실패 로그. 그 글은 모델에게 실려 가고,
|
|
2521
|
+
**동시에** `.deel/sessions/*.jsonl` 로 디스크에 적힙니다. 한 번 새면 여러 벌이
|
|
2522
|
+
됩니다.
|
|
2523
|
+
|
|
2524
|
+
도구 결과가 대화로 들어가는 **한 자리**에서 가립니다. 사설키 블록 · OpenAI ·
|
|
2525
|
+
Anthropic · GitHub · Slack · AWS · Google · JWT · 주소에 박힌 열쇠 ·
|
|
2526
|
+
`Authorization` 계열 헤더 · 이름이 `…KEY`/`…TOKEN`/`…SECRET`/`…PASSWORD` 인
|
|
2527
|
+
환경변수. 설정에 든 게이트웨이 열쇠는 모양과 상관없이 지웁니다 — 그건 짐작이
|
|
2528
|
+
아니라 아는 값이니까요.
|
|
2529
|
+
|
|
2530
|
+
**파일 내용은 일부러 안 가립니다.** `.env` 를 가리면 모델이 가려진 글을 보고
|
|
2531
|
+
되돌려 써서, 진짜 열쇠가 있던 자리에 표가 적힙니다 — 비밀을 지키려다 사람의
|
|
2532
|
+
열쇠를 우리 손으로 지우는 셈입니다. 그래서 파일 쪽은 가리는 대신 알립니다.
|
|
2533
|
+
|
|
2534
|
+
<br>
|
|
2535
|
+
|
|
2536
|
+
검사 2,578 → **2,860개** · 54/54 파일. 지난 판들은 [태그](https://github.com/jysvai/deel-local-cli/tags)에서 봅니다.
|
|
2537
|
+
|
|
2538
|
+
</details>
|
|
2539
|
+
|
|
2092
2540
|
<details>
|
|
2093
2541
|
<summary><b>▸ 1.2.0 — 대화가 끊기지 않게</b> · 여섯 자리가 어떻게 바뀌었나</summary>
|
|
2094
2542
|
|