deel-local-cli 1.5.4 → 1.5.5

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 CHANGED
@@ -100,7 +100,7 @@ This page is the **summary**. Each section links to the detail behind it.
100
100
  | [Speed and spend](docs/en/tuning.md) | Per-stage effort · the prefix cache · context length |
101
101
  | [Safety and corporate review](docs/en/safety.md) | Undo · working scope · audit log · the review package |
102
102
  | [Configuration](docs/en/config.md) · [Development](docs/en/develop.md) | Env vars · run flags · running the tests · folder layout |
103
- | [Release notes](docs/en/releases.md) | [1.5.4](docs/en/releases.md#154) · [1.5.3](docs/en/releases.md#153) · [1.5.2](docs/en/releases.md#152) · [1.5.1](docs/en/releases.md#151) · [1.5.0](docs/en/releases.md#150) · [1.4.3](docs/en/releases.md#143) · [1.4.2](docs/en/releases.md#142) · [1.4.1](docs/en/releases.md#141) · [1.4.0](docs/en/releases.md#140) · [1.3.0](docs/en/releases.md#130) · [1.2.0](docs/en/releases.md#120) |
103
+ | [Release notes](docs/en/releases.md) | [1.5.5](docs/en/releases.md#155) · [1.5.4](docs/en/releases.md#154) · [1.5.3](docs/en/releases.md#153) · [1.5.2](docs/en/releases.md#152) · [1.5.1](docs/en/releases.md#151) · [1.5.0](docs/en/releases.md#150) · [1.4.3](docs/en/releases.md#143) · [1.4.2](docs/en/releases.md#142) · [1.4.1](docs/en/releases.md#141) · [1.4.0](docs/en/releases.md#140) · [1.3.0](docs/en/releases.md#130) · [1.2.0](docs/en/releases.md#120) |
104
104
 
105
105
  ---
106
106
 
@@ -929,7 +929,7 @@ Stored in `~/.deel/config.json`. A `.deel/config.json` in the project folder tak
929
929
  ## Development
930
930
 
931
931
  ```bash
932
- npm test Full suite (3,681 checks)
932
+ npm test Full suite (3,693 checks)
933
933
  npm run coverage Which lines the tests actually execute
934
934
  npm run verify Import + network checks only
935
935
  npm run bench Edit success rate
@@ -981,7 +981,8 @@ so one run tells you everything.
981
981
 
982
982
  | Version | What changed |
983
983
  |---|---|
984
- | **[1.5.4](docs/en/releases.md#154)** | The office fills up and a day passes in it — "only one person" was a bug, not a design |
984
+ | **[1.5.5](docs/en/releases.md#155)** | A plan fills the room — "only one person" was a bug, not a design |
985
+ | [1.5.4](docs/en/releases.md#154) | A day passes in the room — morning to night, a wall clock, a cold coffee |
985
986
  | [1.5.3](docs/en/releases.md#153) | Three things a Mac user tripped over — newline hint, office stays put, one `/motion` |
986
987
  | [1.5.2](docs/en/releases.md#152) | Everything else the adversarial reviews turned up — where the screen was lying |
987
988
  | [1.5.1](docs/en/releases.md#151) | Two of the things 1.5.0 added shipped broken. This fixes them |
package/README.md CHANGED
@@ -101,7 +101,7 @@
101
101
  | [속도와 씀씀이](docs/ko/tuning.md) | 단계별 추론 강도 · 프리픽스 캐시 · 컨텍스트 길이 |
102
102
  | [안전망과 사내 반입](docs/ko/safety.md) | 되돌리기 · 작업 범위 · 감사기록 · 심사 서류 |
103
103
  | [설정](docs/ko/config.md) · [개발](docs/ko/develop.md) | 환경변수 · 실행 옵션 · 검사 돌리기 · 폴더 구조 |
104
- | [릴리스 노트](docs/ko/releases.md) | [1.5.4](docs/ko/releases.md#154) · [1.5.3](docs/ko/releases.md#153) · [1.5.2](docs/ko/releases.md#152) · [1.5.1](docs/ko/releases.md#151) · [1.5.0](docs/ko/releases.md#150) · [1.4.3](docs/ko/releases.md#143) · [1.4.2](docs/ko/releases.md#142) · [1.4.1](docs/ko/releases.md#141) · [1.4.0](docs/ko/releases.md#140) · [1.3.0](docs/ko/releases.md#130) · [1.2.0](docs/ko/releases.md#120) |
104
+ | [릴리스 노트](docs/ko/releases.md) | [1.5.5](docs/ko/releases.md#155) · [1.5.4](docs/ko/releases.md#154) · [1.5.3](docs/ko/releases.md#153) · [1.5.2](docs/ko/releases.md#152) · [1.5.1](docs/ko/releases.md#151) · [1.5.0](docs/ko/releases.md#150) · [1.4.3](docs/ko/releases.md#143) · [1.4.2](docs/ko/releases.md#142) · [1.4.1](docs/ko/releases.md#141) · [1.4.0](docs/ko/releases.md#140) · [1.3.0](docs/ko/releases.md#130) · [1.2.0](docs/ko/releases.md#120) |
105
105
 
106
106
  ---
107
107
 
@@ -907,7 +907,7 @@ deel sbom --only sbom # SBOM 한 장만
907
907
  ## 개발
908
908
 
909
909
  ```bash
910
- npm test 전체 검증 (3,681항목)
910
+ npm test 전체 검증 (3,693항목)
911
911
  npm run coverage 검사가 소스의 어디를 밟았는지
912
912
  npm run verify 반입·통신 검증만
913
913
  npm run bench 편집 성공률 측정
@@ -972,7 +972,8 @@ zip 은 진짜 `unzip` 으로, tar 는 진짜 `tar` 가 만든 것을 읽혀 교
972
972
 
973
973
  | 판 | 무엇이 바뀌었나 |
974
974
  |---|---|
975
- | **[1.5.4](docs/ko/releases.md#154)** | 사무실에 사람이 차고, 방에 하루가 흐른다 — 「한 명뿐」은 고정이 아니라 버그였다 |
975
+ | **[1.5.5](docs/ko/releases.md#155)** | 계획을 세우면 방이 찬다 — 「한 명뿐」은 고정이 아니라 버그였다 |
976
+ | [1.5.4](docs/ko/releases.md#154) | 방에 하루가 흐른다 — 아침·낮·노을·밤 · 벽시계 · 식은 커피 |
976
977
  | [1.5.3](docs/ko/releases.md#153) | 맥에서 걸린 세 가지 — 줄바꿈 안내 · 사무실이 안 사라짐 · `/motion` 하나로 |
977
978
  | [1.5.2](docs/ko/releases.md#152) | 적대적 리뷰가 남긴 나머지를 전부 정리했다 — 화면이 거짓말하던 자리들 |
978
979
  | [1.5.1](docs/ko/releases.md#151) | 1.5.0 이 넣은 것 두 개가 망가진 채 나갔다. 그것을 고친다 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "deel-local-cli",
3
- "version": "1.5.4",
3
+ "version": "1.5.5",
4
4
  "description": "로컬 모델·사내 게이트웨이 전용 코딩 에이전트 CLI — 외부 의존성 0개 / Zero-dependency coding agent CLI for local LLMs and private gateways",
5
5
  "type": "module",
6
6
  "license": "MIT",
package/src/ui/office.js CHANGED
@@ -76,6 +76,7 @@ const C = {
76
76
  나무: 137, 나무어둠: 94, 나무진: 58,
77
77
  쇠: 145, 쇠어둠: 102, 쇠진: 59, 검정: 235,
78
78
  화면: 45, 화면꺼짐: 239, 화면글: 123, 살: 223,
79
+ 화면쉼: 24, 화면글쉼: 66,
79
80
  머리: [52, 240, 94, 130], 옷: [67, 131, 71, 97],
80
81
  밤: 17, 별: 226, 낮: 111, 구름: 255,
81
82
  새벽: 153, 노을: 173, 노을구름: 217, 별흐림: 250,
@@ -173,17 +174,34 @@ const 자세들 = {
173
174
  졸기: 자리짜기([빈, 빈, 빈, ' hhhhhh ', ' hhffffffhh ', ' ffffff '],
174
175
  ['SSSSSSSSSS', 'SSSSSSSSSS']),
175
176
  대기: 자리짜기(사람, ['SSSSSSSSSS', 'SSSSSSSSSS']),
177
+ /*
178
+ * 아직 차례가 안 온 일.
179
+ *
180
+ * 처음에는 화면을 아예 꺼 뒀다. "다섯이 동시에 도는 것처럼 보이면 거짓말"
181
+ * 이라는 이유였는데, 결과는 **꺼진 모니터 앞에 넷이 굳어 앉아 있는 방**
182
+ * 이었다. 정직하려다 이 화면을 켠 이유를 죽인 셈이다.
183
+ *
184
+ * 그래서 이 사람들도 움직인다 — 다만 화면이 **흐리다.** 밝은 화면이
185
+ * 지금 도는 것, 흐린 화면이 맡았지만 아직 차례가 안 온 것이다. 구분은
186
+ * 남기고 방은 살린다.
187
+ */
188
+ 쉬기A: 자리짜기([빈, ...사람.slice(0, 5)], ['GGGGGGGGGG', 'SSSSSSSSSS']),
189
+ 쉬기B: 자리짜기([빈, 빈, ...사람.slice(0, 4)], ['SSSSSSSSSS', 'GGGGGGGGGG']),
176
190
  빈자리: 자리짜기([빈, 빈, 빈, 빈, 빈, 빈], ['SSSSSSSSSS', 'SSSSSSSSSS']),
177
191
  };
178
192
  const 자리폭 = 18;
179
193
  const 자리높이 = 14;
180
194
 
181
195
  function 자리색(자세, 머리, 옷) {
182
- const 꺼짐 = 자세 === '빈자리';
196
+ const 빈것 = 자세 === '빈자리';
197
+ // 차례를 기다리는 자리는 사람도 책상도 멀쩡하다. 흐린 것은 화면뿐이다.
198
+ const 쉼 = 자세 === '쉬기A' || 자세 === '쉬기B';
183
199
  return {
184
200
  h: 머리, f: C.살, b: 옷,
185
- M: C.검정, S: 꺼짐 ? C.화면꺼짐 : C.화면, G: C.화면글,
186
- D: 꺼짐 ? C.나무어둠 : C.나무, d: 꺼짐 ? C.나무진 : C.나무어둠,
201
+ M: C.검정,
202
+ S: 빈것 ? C.화면꺼짐 : ? C.화면쉼 : C.화면,
203
+ G: 쉼 ? C.화면글쉼 : C.화면글,
204
+ D: 빈것 ? C.나무어둠 : C.나무, d: 빈것 ? C.나무진 : C.나무어둠,
187
205
  };
188
206
  }
189
207
 
@@ -383,23 +401,54 @@ export function 사무실줄들(상태, 폭) {
383
401
  const 왼쪽 = 15;
384
402
  const 자리수 = Math.max(1, Math.floor((가로 - 왼쪽 - 2) / (자리폭 + 1)));
385
403
  /*
386
- * 자리보다 사람이 많으면 그냥 잘려 나갔다 좁은 화면에서 둘이 도는 것과
387
- * 셋이 도는 것이 **똑같은 그림**이 됐다. 이 화면의 규칙이 '전부 진짜 숫자'
388
- * 인데 그러면 자리 수만 거짓이 된다.
404
+ * 자리보다 사람이 많으면 앉히지 못한다. 예전에는 그냥 잘려 나가서, 좁은
405
+ * 화면에서 둘이 도는 것과 셋이 도는 것이 **똑같은 그림**이 됐다.
406
+ *
407
+ * 이제 못 앉은 사람은 **방을 돌아다닌다.** 자리가 모자라 서 있는 것이
408
+ * 실제로 일어나는 일이고, 화면에서도 그렇게 보이는 편이 낫다. 마지막 자리
409
+ * 책상의 넘침 표시는 그대로 둔다 — 걷는 사람도 다 못 그릴 만큼 많을 때가
410
+ * 있어서다.
411
+ */
412
+ /*
413
+ * 몇은 앉고 몇은 서성인다.
389
414
  *
390
- * 그리는 것을 억지로 그릴 수는 없으니, 대신 마지막 자리의 책상 불을
391
- * 넘침 색으로 바꿔 '여기 뒤로 있다' 남긴다.
415
+ * 자리가 모자라면 당연히 앉는다. 그런데 자리가 남아도 이상이면
416
+ * 명은 일어나 있게 둔다 앉아만 있으면 사무실이 아니라 독서실이다.
417
+ * 사람 수는 그대로고, 그중 하나가 자리에 없을 뿐이다.
418
+ *
419
+ * 앞에서부터 앉힌다. 맨 앞이 **지금 도는 일**이라 그 사람은 늘 자리에
420
+ * 있어야 한다 — 일하는 중인 사람이 방을 돌아다니면 그게 거짓말이다.
392
421
  */
393
- const 넘친자리 = 일꾼들.length > 자리수;
394
- const = Math.floor(틱 / 5) % 2 === 0;
422
+ const 걷는수 = Math.min(4, Math.max(
423
+ 일꾼들.length - 자리수,
424
+ 일꾼들.length >= 3 ? 1 : 0));
425
+ const 앉는것 = 일꾼들.slice(0, Math.max(1, 일꾼들.length - 걷는수));
426
+ const 넘친자리 = 앉는것.length > 자리수;
395
427
  for (let i = 0; i < 자리수; i++) {
396
428
  const x = 왼쪽 + i * (자리폭 + 1);
397
429
  const y = 세로 - 자리높이;
398
- const 그사람 = 일꾼들[i];
430
+ const 그사람 = 앉는것[i];
431
+ /*
432
+ * 자리마다 박자를 어긋나게 둔다.
433
+ *
434
+ * 예전에는 `틱/5` 하나를 온 방이 같이 봤다. 그래서 세 사람이 **한 몸처럼**
435
+ * 동시에 자판을 두드렸다 — 사람 셋이 아니라 톱니 셋으로 보인다. 자리
436
+ * 번호만큼 박자를 밀어 주면 그 자리에서 사무실이 된다.
437
+ */
438
+ const 짝 = Math.floor((틱 + i * 4) / 5) % 2 === 0;
439
+ /*
440
+ * 차례를 기다리는 사람은 **더 느리게** 움직인다.
441
+ *
442
+ * 보기에도 그편이 맞고(바쁜 사람과 한가한 사람이 같은 박자로 움직이면
443
+ * 누가 바쁜지 안 보인다), 값도 싸다. 사람 하나가 1픽셀 움직이면 그 자리
444
+ * 세 줄이 통째로 다시 나가므로, 박자를 늦추는 것이 곧 나가는 양이다.
445
+ */
446
+ const 쉬는짝 = Math.floor((틱 + i * 7) / 9) % 2 === 0;
399
447
  const 자세 = !그사람 ? '빈자리'
400
448
  : 그사람.갈래 === '쓰기' ? (짝 ? '치기A' : '치기B')
401
449
  : 그사람.갈래 === '읽기' ? (짝 ? '읽기A' : '읽기B')
402
- : 그사람.갈래 === '졸기' ? '졸기' : '대기';
450
+ : 그사람.갈래 === '졸기' ? '졸기'
451
+ : 그사람.갈래 === '기다림' ? (쉬는짝 ? '쉬기A' : '쉬기B') : '대기';
403
452
  p.올리기(x, y, 자세들[자세], 자리색(자세, C.머리[i % 4], C.옷[i % 4]));
404
453
  // 마지막 자리인데 뒤에 더 있으면, 책상 모서리에 넘침 표시를 남긴다.
405
454
  if (넘친자리 && i === 자리수 - 1) p.칠하기(x + 자리폭 - 2, y + 자리높이 - 3, 2, 2, C.넘침);
@@ -427,6 +476,30 @@ export function 사무실줄들(상태, 폭) {
427
476
  for (let n = 0; n < 종이몫; n++) p.칠하기(x + 13 - n * 4, y + 9, 3, 1, C.종이);
428
477
  }
429
478
 
479
+ /*
480
+ * ── 자리를 못 잡은 사람은 방을 돌아다닌다 ───────────────────────────────
481
+ *
482
+ * 예전에는 자리보다 사람이 많으면 그냥 잘려 나갔다 — 넷이 도는 것과 여덟이
483
+ * 도는 것이 똑같은 그림이었다. 앉을 자리가 없으면 서 있는 것이 실제로
484
+ * 일어나는 일이니, 화면에서도 그렇게 보이는 편이 낫다.
485
+ *
486
+ * 사람마다 걸음이 다르다. 다 같은 속도로 가면 줄지어 행진하는 것처럼
487
+ * 보여서, 사람이 아니라 눈금자로 읽힌다.
488
+ */
489
+ {
490
+ for (let j = 0; j < 걷는수; j++) {
491
+ const 속도 = 2 + (j % 3);
492
+ const 걸음 = Math.floor((틱 + j * 17) / 속도);
493
+ // 벽 밖에서 들어왔다 반대쪽으로 나간다. 화면 안에서 뿅 사라지면
494
+ // 걷는 것이 아니라 깜빡이는 것으로 보인다.
495
+ const 나아간것 = (걸음 + j * 23) % (가로 + 6) - 3;
496
+ const x = j % 2 === 0 ? 나아간것 : 가로 - 3 - 나아간것;
497
+ const 발 = 걸음 % 2 === 0 ? 'l l' : ' l ';
498
+ p.올리기(x, 벽 + 1, [' h ', 'bbb', 발],
499
+ { h: C.살, b: C.옷[j % 4], l: C.머리[j % 4] });
500
+ }
501
+ }
502
+
430
503
 
431
504
  return p.줄들();
432
505
  }
@@ -561,6 +634,21 @@ export function 상태만들기(session, 일감, 틱 = 0, 할일들 = [], 도는
561
634
  for (let i = 0; i < Math.max(0, 도는하위); i++) 일꾼들.push({ 갈래: '대기' });
562
635
  }
563
636
 
637
+ /*
638
+ * 남은 할 일도 이 방의 사람이다.
639
+ *
640
+ * 「계획을 세웠는데도 한 명뿐이냐」는 말을 들었다. 맞는 말이었다 — 자리는
641
+ * '지금 도는 일' 만 셌는데 deel 은 한 번에 하나씩 하므로 늘 하나였고,
642
+ * 계획 다섯 개는 화이트보드 쪽지로만 있고 방은 텅 비어 있었다.
643
+ *
644
+ * 남은 할 일은 이 방이 **떠맡은 일감**이다. 사람으로 앉힌다. 대신 화면은
645
+ * 꺼 둔다 — 다섯이 동시에 돌고 있다고 말하면 그건 거짓말이라서다.
646
+ * 켜진 화면이 지금 도는 것, 꺼진 화면이 아직 차례가 안 온 것이다.
647
+ */
648
+ for (let i = 0; i < Math.max(0, 할일들.filter((t) => t.state !== 'done').length); i++) {
649
+ 일꾼들.push({ 갈래: '기다림' });
650
+ }
651
+
564
652
  return {
565
653
  일꾼들,
566
654
  걸린초,