deel-local-cli 2.0.1 → 2.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.ko.md +34 -7
- package/README.md +35 -7
- package/bin/deel.js +34 -1
- package/package.json +1 -1
- package/src/acp/serve.js +83 -17
- package/src/agent/commit.js +2 -2
- package/src/agent/compact.js +4 -4
- package/src/agent/donecheck.js +97 -0
- package/src/agent/grade.js +1 -1
- package/src/agent/loop.js +176 -13
- package/src/agent/memory.js +1 -1
- package/src/agent/models.js +1 -1
- package/src/agent/modes.js +3 -0
- package/src/agent/outschema.js +1 -1
- package/src/agent/pins.js +7 -2
- package/src/agent/project.js +1 -1
- package/src/agent/recall.js +1 -1
- package/src/agent/session.js +15 -0
- package/src/agent/store.js +13 -26
- package/src/backend/ctxsize.js +2 -2
- package/src/backend/http.js +1 -1
- package/src/backend/learn.js +27 -1
- package/src/backend/mcp.js +97 -16
- package/src/backend/proxy.js +1 -1
- package/src/backend/quota.js +2 -2
- package/src/commands.js +24 -2
- package/src/completion.js +16 -3
- package/src/config.js +33 -11
- package/src/configexplain.js +1 -1
- package/src/doctor.js +11 -1
- package/src/eval/run.js +432 -0
- package/src/eval/starter.js +95 -0
- package/src/i18n/en.js +20 -0
- package/src/i18n/ja.js +20 -0
- package/src/i18n/ko.js +20 -0
- package/src/i18n/zh.js +20 -0
- package/src/jsonl.js +42 -0
- package/src/lsp/client.js +6 -46
- package/src/oneshot.js +85 -3
- package/src/pack/selfpack.js +2 -2
- package/src/pack/zip.js +18 -1
- package/src/plugins/manage.js +81 -14
- package/src/reap.js +70 -0
- package/src/repl.js +85 -11
- package/src/report.js +1 -1
- package/src/safety/audit.js +4 -19
- package/src/safety/authcmd.js +1 -1
- package/src/safety/guard.js +56 -6
- package/src/safety/hooks.js +1 -1
- package/src/safety/keystore.js +18 -3
- package/src/safety/policy.js +38 -0
- package/src/safety/shellenv.js +1 -1
- package/src/safety/undo.js +44 -20
- package/src/skills/discover.js +1 -1
- package/src/tools/docs.js +3 -3
- package/src/tools/edit-match.js +1 -1
- package/src/tools/encoding.js +1 -1
- package/src/tools/excel-com.js +56 -30
- package/src/tools/fastgrep.js +1 -1
- package/src/tools/fsutil.js +8 -4
- package/src/tools/ignore.js +21 -1
- package/src/tools/index.js +122 -11
- package/src/tools/jobs.js +23 -4
- package/src/tools/shell.js +27 -0
- package/src/tools/todo.js +1 -1
- package/src/tools/webfetch.js +1 -1
- package/src/tools/xlsx.js +4 -4
- package/src/ui/approve.js +57 -3
- package/src/ui/banner.js +1 -1
- package/src/ui/inputbox.js +1 -1
- package/src/ui/md.js +1 -1
- package/src/ui/motion.js +1 -1
package/src/ui/approve.js
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* 그래서 세 가지를 준다 — 눈에 띄는 글자, 사람 말 이름, 무엇을 묻는지 한 줄.
|
|
14
14
|
*/
|
|
15
15
|
import { c } from './ansi.js';
|
|
16
|
+
import { diffLines, renderDiff, shortStat } from './diff.js';
|
|
16
17
|
import { 말 } from '../i18n/index.js';
|
|
17
18
|
|
|
18
19
|
/*
|
|
@@ -56,11 +57,64 @@ export function 고르기(이름) {
|
|
|
56
57
|
* 한 번 누를 때마다 더 많이 물어보게 되니, 잘못 눌러도 위험해지지 않는다.
|
|
57
58
|
* 반대로 돌면 Shift+Tab 한 번에 '안 묻고 고침' 으로 떨어진다.
|
|
58
59
|
*/
|
|
59
|
-
export function 다음(
|
|
60
|
+
export function 다음(이름, 바닥 = 'auto') {
|
|
61
|
+
// 관리 정책이 바닥을 걸었으면 그 위에서만 돈다 (safety/policy.js 의 승인바닥).
|
|
62
|
+
// 전부 돌게 두면 바닥 아래 칸에 들어갔다가 다시 끌어올려져, 눌러도 안 바뀐 것처럼 보인다.
|
|
63
|
+
const 돌칸 = 차례.slice(Math.max(0, 차례.indexOf(바닥)));
|
|
60
64
|
// 모르는 값이면 화면에 떠 있는 것(고르기가 내주는 기본)을 기준으로 삼는다.
|
|
61
65
|
// 안 그러면 보이는 것과 한 칸 어긋나서, 눌러도 안 바뀐 것처럼 보인다.
|
|
62
|
-
const i =
|
|
63
|
-
return
|
|
66
|
+
const i = 돌칸.indexOf(승인[이름] ? 이름 : 기본);
|
|
67
|
+
return 돌칸[(i + 1) % 돌칸.length];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 자율(auto) 모드에서 사람 답을 **얼마나** 기다리나 — 초. 설정의 `askWait`, 기본 60.
|
|
72
|
+
*
|
|
73
|
+
* auto 는 「다 맡긴다」 는 모드다. 그런데 그 안에서도 사람 답을 끝없이 기다리는 자리가
|
|
74
|
+
* 둘 남아 있었다 — 모델이 되묻는 것(Ask 도구)과, 「계획하고 만들어줘」 에 뜨는 계획 승인.
|
|
75
|
+
* 맡겨 두고 자리를 뜬 사람에게 그건 멈춘 것과 같다. 그래서 auto 에서만 시한을 둔다.
|
|
76
|
+
* 시한이 지나면 되묻기는 「스스로 판단하라」 로, 계획은 「그대로 진행」 으로 간다.
|
|
77
|
+
*
|
|
78
|
+
* 0 이면 아예 안 묻고 간다. 도구 승인(confirm·strict 의 「실행할까요?」)에는 **안 건다** —
|
|
79
|
+
* 그 모드를 고른 사람은 답을 기다리라고 고른 것이다. 관리 정책이 승인 바닥을 걸면 모드가
|
|
80
|
+
* auto 가 아니므로 여기도 안 걸린다.
|
|
81
|
+
*/
|
|
82
|
+
export const 자율대기기본 = 60;
|
|
83
|
+
export function 자율대기(cfg) {
|
|
84
|
+
/*
|
|
85
|
+
* 숫자와 숫자 글만 받는다. Number() 에 통째로 넘기면 true 가 1초, false 와 빈칸(' ')이
|
|
86
|
+
* 0 — 「안 묻고 간다」 — 가 된다. 그렇게 적은 사람이 바란 것이 무엇이든 그건 아니다 (2차 눈 판정).
|
|
87
|
+
*/
|
|
88
|
+
const v = cfg?.askWait;
|
|
89
|
+
const n = typeof v === 'number' ? v : typeof v === 'string' && v.trim() ? Number(v) : NaN;
|
|
90
|
+
if (!Number.isFinite(n) || n < 0) return 자율대기기본;
|
|
91
|
+
return Math.min(3600, Math.floor(n));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* 승인 물음 밑에 그릴 「바뀔 내용」 (tools/index.js 의 바뀔내용).
|
|
96
|
+
*
|
|
97
|
+
* 무엇이 바뀌는지 모르고 누르는 y 는 확인이 아니라 습관이다. 그래서 물음 밑에 파일마다
|
|
98
|
+
* 머리 한 줄과 바뀐 자리를 그린다. 여러 파일이면 줄 수를 나눠 쓴다 — 한 파일이 다 먹으면
|
|
99
|
+
* 뒤 파일은 이름조차 안 보이고, 사람은 한 파일만 바뀌는 줄 알고 허락한다.
|
|
100
|
+
*/
|
|
101
|
+
export function 미리보기줄들(미리보기, { 줄수 = 40 } = {}) {
|
|
102
|
+
if (!Array.isArray(미리보기) || !미리보기.length) return [];
|
|
103
|
+
/*
|
|
104
|
+
* 파일 이름 줄은 **다 그린다**(위 머리말). 바뀐 줄은 한도를 나눠 쓰되, 한 파일 몫이 3줄도 안
|
|
105
|
+
* 되면 이름 줄과 셈(+3 -1)만 그린다. 여태 몫에 하한 6 을 두어 파일 50개면 400줄이 나왔다 —
|
|
106
|
+
* 물음이 화면 밖으로 밀려 사람은 무엇에 y 를 치는지 못 본다 (2차 눈 판정).
|
|
107
|
+
*/
|
|
108
|
+
const 몫 = Math.floor(줄수 / 미리보기.length);
|
|
109
|
+
const out = [];
|
|
110
|
+
for (const 것 of 미리보기) {
|
|
111
|
+
let d = null;
|
|
112
|
+
try { d = diffLines(것.전, 것.후); } catch { d = null; }
|
|
113
|
+
const 셈 = d ? shortStat(d) : '';
|
|
114
|
+
out.push(` ${c.white(것.보일경로)}${것.전 === null ? c.gray(` (${말('approve.newFile')})`) : ''}${셈 ? ` ${셈}` : ''}`);
|
|
115
|
+
if (d && 몫 >= 3) out.push(...renderDiff(d, { maxLines: 몫, indent: ' ' }));
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
64
118
|
}
|
|
65
119
|
|
|
66
120
|
/** 상태줄에 넣을 조각. 짧게=true 면 좁은 창용. */
|
package/src/ui/banner.js
CHANGED
|
@@ -95,7 +95,7 @@ const 들여 = ' ';
|
|
|
95
95
|
const 채움 = '█';
|
|
96
96
|
|
|
97
97
|
/** 글자 하나가 몇 칸인가 (한 배 기준). */
|
|
98
|
-
|
|
98
|
+
const 글자폭 = (ch) => (글꼴[ch]?.[0]?.length ?? 0);
|
|
99
99
|
|
|
100
100
|
/** 이름 전체가 몇 칸인가. @param 배 가로 배율(1 또는 2) */
|
|
101
101
|
export function 이름폭(배 = 1, 글자수 = 이름.length) {
|
package/src/ui/inputbox.js
CHANGED
package/src/ui/md.js
CHANGED
|
@@ -304,7 +304,7 @@ export function 표그리기(줄들, 폭 = 80, 어떻게 = {}) {
|
|
|
304
304
|
* 상한에 걸려 표를 나눠 그릴 때, 뒤 묶음에 앞 묶음의 너비를 그대로 물려 주려고
|
|
305
305
|
* 쓴다. 묶음마다 제 폭을 다시 재면 같은 표인데 위아래의 세로줄이 안 맞는다.
|
|
306
306
|
*/
|
|
307
|
-
|
|
307
|
+
function 표칸너비(줄들, 폭 = 80) {
|
|
308
308
|
return 짜기(줄들, 폭)?.너비 ?? null;
|
|
309
309
|
}
|
|
310
310
|
|
package/src/ui/motion.js
CHANGED
|
@@ -231,7 +231,7 @@ export const 틀 = Object.fromEntries(
|
|
|
231
231
|
* 상자 높이와 커서 셈이 통째로 달라진다. 그래서 **가로로 누운 옆모습**으로
|
|
232
232
|
* 그린다 — 세로로 선 정면 모습은 4점 안에서 절대 안 읽힌다.
|
|
233
233
|
*/
|
|
234
|
-
|
|
234
|
+
const 넓은칸수 = 6; // 점자 여섯 칸
|
|
235
235
|
|
|
236
236
|
/*
|
|
237
237
|
* 중세 기사 — 옆모습. 왼쪽에 몸이 서 있고 오른쪽에서 칼이 움직인다.
|