deel-local-cli 1.20.13 → 2.0.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 +96 -78
- package/README.md +119 -81
- package/bin/deel.js +398 -32
- package/package.json +2 -1
- package/src/acp/jsonrpc.js +87 -7
- package/src/acp/map.js +23 -3
- package/src/acp/serve.js +333 -25
- package/src/agent/agents.js +110 -12
- package/src/agent/askcheck.js +50 -6
- package/src/agent/asks.js +59 -5
- package/src/agent/budget.js +9 -2
- package/src/agent/card.js +8 -2
- package/src/agent/commit.js +168 -16
- package/src/agent/compact.js +93 -21
- package/src/agent/{/354/213/240/353/242/260/353/217/204.js → confidence.js} +1 -1
- package/src/agent/effort.js +85 -15
- package/src/agent/evidence.js +63 -7
- package/src/agent/evolve.js +132 -24
- package/src/agent/grade.js +12 -3
- package/src/agent/loop.js +408 -81
- package/src/agent/memory.js +176 -29
- package/src/agent/mention.js +22 -5
- package/src/agent/models.js +31 -7
- package/src/agent/modes.js +25 -10
- package/src/agent/outschema.js +381 -56
- package/src/agent/pins.js +33 -2
- package/src/agent/project.js +73 -8
- package/src/agent/recall.js +40 -9
- package/src/agent/{/354/204/261/355/225/234/352/270/260/353/241/235.js → recordshape.js} +19 -8
- package/src/agent/review.js +143 -13
- package/src/agent/route.js +253 -26
- package/src/agent/salvage.js +2 -1
- package/src/agent/session.js +457 -31
- package/src/agent/store.js +232 -22
- package/src/agent/threads.js +52 -3
- package/src/backend/adapter.js +508 -85
- package/src/backend/azure.js +12 -1
- package/src/backend/cachemark.js +31 -5
- package/src/backend/clientcert.js +23 -1
- package/src/backend/ctxsize.js +56 -9
- package/src/backend/detect.js +252 -19
- package/src/backend/http.js +383 -42
- package/src/backend/learn.js +101 -11
- package/src/backend/mcp.js +333 -24
- package/src/backend/price.js +61 -13
- package/src/backend/probe.js +188 -36
- package/src/backend/proxy.js +108 -14
- package/src/backend/quota.js +226 -30
- package/src/backend/retry.js +46 -3
- package/src/backend/scan.js +47 -10
- package/src/backend/scanui.js +57 -7
- package/src/backend/toolfit.js +204 -22
- package/src/backend/vision.js +14 -1
- package/src/backend/wire.js +58 -10
- package/src/cmdnames.js +16 -0
- package/src/commands/common.js +70 -0
- package/src/commands/extend.js +300 -0
- package/src/commands/model.js +852 -0
- package/src/commands/view.js +328 -0
- package/src/commands/work.js +823 -0
- package/src/commands.js +193 -2082
- package/src/completion.js +45 -3
- package/src/config.js +452 -39
- package/src/configexplain.js +125 -14
- package/src/doctor.js +164 -26
- package/src/i18n/en.js +22 -0
- package/src/i18n/index.js +31 -1
- package/src/i18n/ja.js +25 -1
- package/src/i18n/ko.js +25 -2
- package/src/i18n/zh.js +25 -1
- package/src/lsp/client.js +111 -9
- package/src/lsp/servers.js +86 -22
- package/src/oneshot.js +325 -65
- package/src/pack/sbom.js +28 -5
- package/src/pack/selfpack.js +54 -5
- package/src/pack/sheet.en.js +24 -3
- package/src/pack/tar.js +45 -8
- package/src/pack/zip.js +103 -8
- package/src/plugins/manage.js +165 -14
- package/src/preview/serve.js +239 -23
- package/src/providers/bedrock.js +30 -5
- package/src/providers/gemini.js +8 -0
- package/src/providers/index.js +17 -1
- package/src/repl.js +254 -61
- package/src/report.js +7 -2
- package/src/reset.js +151 -25
- package/src/safety/audit.js +108 -8
- package/src/safety/authcmd.js +75 -5
- package/src/safety/guard.js +507 -15
- package/src/safety/hooks.js +172 -20
- package/src/safety/keystore.js +178 -18
- package/src/safety/network.js +209 -6
- package/src/safety/policy.js +377 -36
- package/src/safety/runmode.js +9 -2
- package/src/safety/secrets.js +243 -17
- package/src/safety/shellenv.js +64 -3
- package/src/safety/trust.js +298 -32
- package/src/safety/undo.js +409 -17
- package/src/setup.js +175 -17
- package/src/skills/discover.js +122 -19
- package/src/stats.js +57 -16
- package/src/tools/{/355/231/225/354/235/270/353/262/225.js → checkmethods.js} +26 -1
- package/src/tools/clipboard.js +53 -20
- package/src/tools/convert.js +118 -37
- package/src/tools/desc.en.js +48 -5
- package/src/tools/doc2md.js +11 -1
- package/src/tools/docs.js +94 -18
- package/src/tools/edit-match.js +212 -13
- package/src/tools/encoding.js +525 -28
- package/src/tools/excel-com.js +63 -15
- package/src/tools/excel.js +12 -7
- package/src/tools/fastgrep.js +444 -36
- package/src/tools/fig.js +21 -4
- package/src/tools/fsutil.js +235 -21
- package/src/tools/hwpxwrite.js +80 -19
- package/src/tools/ignore.js +55 -7
- package/src/tools/index.js +1029 -145
- package/src/tools/jobs.js +325 -50
- package/src/tools/kiwi.js +50 -5
- package/src/tools/lsp.js +164 -32
- package/src/tools/outline.js +52 -12
- package/src/tools/pdf.js +366 -56
- package/src/tools/shell.js +12 -4
- package/src/tools/spawn.js +203 -18
- package/src/tools/todo.js +73 -4
- package/src/tools/verify.js +312 -43
- package/src/tools/webfetch.js +184 -25
- package/src/tools/xlsx.js +232 -31
- package/src/ui/ansi.js +209 -15
- package/src/ui/banner.js +2 -1
- package/src/ui/complete.js +46 -4
- package/src/ui/diff.js +4 -2
- package/src/ui/export.js +91 -17
- package/src/ui/inputbox.js +58 -18
- package/src/ui/intro.js +9 -2
- package/src/ui/level.js +32 -7
- package/src/ui/md.js +101 -15
- package/src/ui/motion.js +5 -2
- package/src/ui/notify.js +7 -1
- package/src/ui/office.js +37 -5
- package/src/ui/pastechip.js +3 -2
- package/src/ui/pick.js +85 -12
- package/src/ui/prompt.js +176 -13
- package/src/ui/screen.js +2 -1
- package/src/ui/spinner.js +6 -1
- package/src/ui/status.js +80 -12
- package/src/ui/wrap.js +23 -37
- /package/src/agent/{/353/213/250/352/263/204.js" → phase.js} +0 -0
- /package/src/skills/builtin/{/352/271/212/354/235/264/354/236/210/352/262/214-/353/247/214/353/223/244/352/270/260/SKILL.md" → build-deep/SKILL.md} +0 -0
- /package/src/skills/builtin/{/354/260/250/352/267/274/354/260/250/352/267/274-/353/224/224/353/262/204/352/271/205/SKILL.md" → debug-step-by-step/SKILL.md} +0 -0
- /package/src/skills/builtin/{/353/201/235/352/271/214/354/247/200-/355/225/230/352/270/260/SKILL.md" → finish-all/SKILL.md} +0 -0
- /package/src/skills/builtin/{/354/212/244/354/212/244/353/241/234-/352/262/200/355/206/240/SKILL.md" → self-review/SKILL.md} +0 -0
- /package/src/skills/builtin/{/354/275/224/353/223/234-/354/244/204/354/235/264/352/270/260/SKILL.md" → simplify-code/SKILL.md} +0 -0
- /package/src/skills/builtin/{/354/260/224/353/237/254/353/263/264/352/270/260/SKILL.md" → spike/SKILL.md} +0 -0
- /package/src/skills/builtin/{/352/262/200/354/202/254-/353/250/274/354/240/200/SKILL.md" → test-first/SKILL.md} +0 -0
package/src/tools/excel-com.js
CHANGED
|
@@ -24,7 +24,12 @@ import { decode } from './encoding.js';
|
|
|
24
24
|
|
|
25
25
|
// 엑셀에게 시킬 일. 암호는 여기 없다 — 표준입력으로 들어온다.
|
|
26
26
|
// 경로도 명령줄이 아니라 환경변수로 준다. 따옴표 문제도 없고 남의 눈에도 안 띈다.
|
|
27
|
-
|
|
27
|
+
//
|
|
28
|
+
// 내보내는 까닭은 **검사 때문**이다(tools/clipboard.js 와 같은 규칙). 암호를 읽는
|
|
29
|
+
// 자리가 틀리면 맞는 암호를 넣은 사람이 제 파일에서 막히는데, 그걸 재려면 엑셀이
|
|
30
|
+
// 깔린 PC 와 암호 걸린 파일이 있어야 한다 — 그러면 그 자리는 영영 안 재진다.
|
|
31
|
+
// 스크립트를 내주면 앞부분(암호 읽기)만 떼어 파워셸로 돌려 볼 수 있다.
|
|
32
|
+
export const SCRIPT = `
|
|
28
33
|
$ErrorActionPreference = 'Stop'
|
|
29
34
|
[System.Threading.Thread]::CurrentThread.CurrentCulture = New-Object System.Globalization.CultureInfo 'en-US'
|
|
30
35
|
|
|
@@ -43,6 +48,11 @@ function Try-Com([scriptblock]$fn, [int]$tries = 12) {
|
|
|
43
48
|
|
|
44
49
|
$src = $env:DEEL_XL_IN
|
|
45
50
|
$dst = $env:DEEL_XL_OUT
|
|
51
|
+
# 들어오는 쪽도 UTF-8 로 맞춘다. 안 맞추면 [Console]::In 이 **이 PC 의 콘솔 코드페이지**로
|
|
52
|
+
# 읽어서, 우리가 UTF-8 로 써 보낸 한글 암호가 딴 글자가 된다 — 다섯 글자가 일곱 글자로.
|
|
53
|
+
# 그러면 맞는 암호를 넣은 사람이 「암호가 맞지 않습니다」 를 세 번 받고 끝난다. 나가는 쪽은
|
|
54
|
+
# 이미 decode() 로 콘솔 인코딩을 풀고 있는데(아래 받은글), 들어오는 쪽만 빠져 있었다.
|
|
55
|
+
try { [Console]::InputEncoding = New-Object System.Text.UTF8Encoding $false } catch { }
|
|
46
56
|
$pw = [Console]::In.ReadLine()
|
|
47
57
|
if ($null -eq $pw) { $pw = '' }
|
|
48
58
|
|
|
@@ -90,7 +100,14 @@ finally {
|
|
|
90
100
|
}
|
|
91
101
|
`;
|
|
92
102
|
|
|
93
|
-
/**
|
|
103
|
+
/**
|
|
104
|
+
* 이 **판**에서 엑셀을 시킬 길이 있나. 윈도우가 아니면 아예 없다.
|
|
105
|
+
*
|
|
106
|
+
* 「엑셀이 깔렸나」 를 여기서 답하지 않는다 — 그건 실제로 불러 봐야 안다.
|
|
107
|
+
* 등록만 되어 있고 실행이 안 되는 자리가 흔해서, 레지스트리를 읽어 봐야
|
|
108
|
+
* 「있다」 는 말이 거짓이 될 수 있다. 없다는 답은 아래 없는엑셀() 이 COM
|
|
109
|
+
* 번호(80040154·80080005)로 가려서 사람 말로 돌려준다.
|
|
110
|
+
*/
|
|
94
111
|
export function canUseExcel() {
|
|
95
112
|
return process.platform === 'win32';
|
|
96
113
|
}
|
|
@@ -103,7 +120,7 @@ export function canUseExcel() {
|
|
|
103
120
|
* 80080005 CO_E_SERVER_EXEC_FAILURE — 서버를 띄우지 못했다
|
|
104
121
|
* 이걸 그대로 사용자에게 내보내면 알아볼 수 없는 글자만 남는다.
|
|
105
122
|
*/
|
|
106
|
-
function 없는엑셀(s) {
|
|
123
|
+
export function 없는엑셀(s) {
|
|
107
124
|
return /80040154|80080005|REGDB_E_CLASSNOTREG|CO_E_SERVER_EXEC_FAILURE/i.test(String(s ?? ''));
|
|
108
125
|
}
|
|
109
126
|
|
|
@@ -115,6 +132,46 @@ function 없는엑셀(s) {
|
|
|
115
132
|
* password 는 메모리에만 있어야 한다. 어디에도 적지 말 것.
|
|
116
133
|
* @returns {Promise<{ ok: boolean, reason?: string, sheets?: Array<{name:string, rows:string[][]}> }>}
|
|
117
134
|
*/
|
|
135
|
+
/**
|
|
136
|
+
* 엑셀이 뽑아 둔 시트 파일들을 읽어 표로 만든다.
|
|
137
|
+
*
|
|
138
|
+
* 못 읽은 것을 **조용히 버리지 않는다.** 여기가 `catch { continue; }` 한 줄이라,
|
|
139
|
+
* 시트 하나가 통째로 빠진 표가 「다 읽었습니다」 로 올라갔다 — 사람에게도 모델에게도
|
|
140
|
+
* 「그런 시트 없다」 와 구별이 안 되는 고장이다. 이름을 남겨 부르는 쪽이 말하게 한다.
|
|
141
|
+
*/
|
|
142
|
+
/**
|
|
143
|
+
* 시트를 **하나도** 못 모았을 때의 답.
|
|
144
|
+
*
|
|
145
|
+
* 여기가 언제나 「엑셀이 열긴 했는데 뽑아낼 시트가 없습니다」 였다. 그 말은 통합문서가
|
|
146
|
+
* 원래 비었다는 뜻이라, 시트 셋을 하나도 **못 읽은** 판이 「빈 파일」 로 올라갔다 —
|
|
147
|
+
* 시트모으기 가 이름을 남기게 고쳐 놓고, 정작 그 이름이 제일 필요한 자리에서 버렸다.
|
|
148
|
+
* 위와 같은 규칙이다: 못 읽은 것을 조용히 버리지 않는다.
|
|
149
|
+
*/
|
|
150
|
+
export function 빈시트답(못읽은) {
|
|
151
|
+
if (못읽은?.length) {
|
|
152
|
+
return {
|
|
153
|
+
ok: false,
|
|
154
|
+
reason: 'unreadable',
|
|
155
|
+
못읽은,
|
|
156
|
+
message: `엑셀이 열긴 했는데 시트 ${못읽은.length}개를 하나도 못 읽었습니다: ${못읽은.join(' · ')}`,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
return { ok: false, reason: 'empty', message: '엑셀이 열긴 했는데 뽑아낼 시트가 없습니다' };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function 시트모으기(밖, 시트들) {
|
|
163
|
+
const sheets = [];
|
|
164
|
+
const 못읽은 = [];
|
|
165
|
+
for (const { i, name } of 시트들 ?? []) {
|
|
166
|
+
let buf;
|
|
167
|
+
// 엑셀이 UTF-16 으로 썼다. decode 가 앞머리 표식을 보고 알아서 푼다.
|
|
168
|
+
try { buf = readFileSync(join(밖, `${i}.txt`)); }
|
|
169
|
+
catch (탈) { 못읽은.push(`${name} (${탈?.code ?? 탈?.message ?? '못 읽음'})`); continue; }
|
|
170
|
+
sheets.push({ name, rows: tsv(decode(buf).text) });
|
|
171
|
+
}
|
|
172
|
+
return { sheets, 못읽은 };
|
|
173
|
+
}
|
|
174
|
+
|
|
118
175
|
export async function excelToTables(경로, { password = '', timeout = 90000 } = {}) {
|
|
119
176
|
if (!canUseExcel()) {
|
|
120
177
|
return { ok: false, reason: 'no-excel', message: '이 파일은 엑셀이 있어야 읽을 수 있는데, 윈도우가 아닙니다' };
|
|
@@ -125,18 +182,9 @@ export async function excelToTables(경로, { password = '', timeout = 90000 } =
|
|
|
125
182
|
const 결과 = await 돌리기(경로, 밖, password, timeout);
|
|
126
183
|
if (!결과.ok) return 결과;
|
|
127
184
|
|
|
128
|
-
const sheets =
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
let buf;
|
|
132
|
-
try { buf = readFileSync(p); } catch { continue; }
|
|
133
|
-
// 엑셀이 UTF-16 으로 썼다. decode 가 앞머리 표식을 보고 알아서 푼다.
|
|
134
|
-
sheets.push({ name, rows: tsv(decode(buf).text) });
|
|
135
|
-
}
|
|
136
|
-
if (!sheets.length) {
|
|
137
|
-
return { ok: false, reason: 'empty', message: '엑셀이 열긴 했는데 뽑아낼 시트가 없습니다' };
|
|
138
|
-
}
|
|
139
|
-
return { ok: true, sheets };
|
|
185
|
+
const { sheets, 못읽은 } = 시트모으기(밖, 결과.시트들);
|
|
186
|
+
if (!sheets.length) return 빈시트답(못읽은);
|
|
187
|
+
return { ok: true, sheets, 못읽은 };
|
|
140
188
|
} finally {
|
|
141
189
|
// 여기 들어 있던 것은 암호를 푼 내용이다. 반드시 지운다.
|
|
142
190
|
try { rmSync(밖, { recursive: true, force: true }); } catch { /* 임시 폴더다 */ }
|
package/src/tools/excel.js
CHANGED
|
@@ -37,7 +37,7 @@ export async function readExcel(abs, { askPassword = null, maxTries = 3 } = {})
|
|
|
37
37
|
// zip 이긴 한데 엑셀이 아니거나 모양이 다르다. 엑셀이 있으면 맡겨 본다.
|
|
38
38
|
if (!canUseExcel()) return { ok: false, error: `${err.message}` };
|
|
39
39
|
const r = await excelToTables(abs, { password: '' });
|
|
40
|
-
if (r.ok) return { ok: true, sheets: r.sheets, notes:
|
|
40
|
+
if (r.ok) return { ok: true, sheets: r.sheets, notes: 맡긴메모(r), how: '엑셀에게 맡겼습니다' };
|
|
41
41
|
return { ok: false, error: `${err.message} (엑셀에게도 맡겨 봤지만: ${r.message})` };
|
|
42
42
|
}
|
|
43
43
|
}
|
|
@@ -56,7 +56,7 @@ export async function readExcel(abs, { askPassword = null, maxTries = 3 } = {})
|
|
|
56
56
|
|
|
57
57
|
// 암호 없이 먼저 해 본다. 옛 .xls 는 암호가 없는 경우가 대부분이다.
|
|
58
58
|
let r = await excelToTables(abs, { password: '' });
|
|
59
|
-
if (r.ok) return { ok: true, sheets: r.sheets, notes:
|
|
59
|
+
if (r.ok) return { ok: true, sheets: r.sheets, notes: 맡긴메모(r), how: '엑셀에게 맡겼습니다' };
|
|
60
60
|
|
|
61
61
|
if (r.reason !== 'password') {
|
|
62
62
|
return { ok: false, error: 붙임(r) };
|
|
@@ -74,17 +74,22 @@ export async function readExcel(abs, { askPassword = null, maxTries = 3 } = {})
|
|
|
74
74
|
const pw = await askPassword(안내);
|
|
75
75
|
if (pw === null || pw === '') return { ok: false, error: '암호를 넣지 않아 열지 않았습니다.' };
|
|
76
76
|
r = await excelToTables(abs, { password: pw });
|
|
77
|
-
if (r.ok) return { ok: true, sheets: r.sheets, notes:
|
|
77
|
+
if (r.ok) return { ok: true, sheets: r.sheets, notes: 맡긴메모(r), how: '엑셀에게 맡겼습니다 (암호 씀)' };
|
|
78
78
|
if (r.reason !== 'password') return { ok: false, error: 붙임(r) };
|
|
79
79
|
}
|
|
80
80
|
return { ok: false, error: `암호가 ${maxTries}번 다 맞지 않았습니다.` };
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
+
// 엑셀에게 맡긴 판에서 **못 읽은 시트**가 있으면 말한다. 안 말하면 시트 하나가
|
|
84
|
+
// 통째로 빠진 표가 「다 읽었습니다」 로 올라간다 (excel-com.js 의 시트모으기).
|
|
85
|
+
const 맡긴메모 = (r) => (r?.못읽은?.length
|
|
86
|
+
? [`못 읽은 시트 ${r.못읽은.length}개: ${r.못읽은.join(' · ')}`]
|
|
87
|
+
: []);
|
|
88
|
+
|
|
83
89
|
function 붙임(r) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
return r.message ?? '엑셀 파일을 읽지 못했습니다';
|
|
90
|
+
// busy·timeout·no-excel 도 아래 한 줄과 똑같았다. 갈래마다 적어 두면 언젠가
|
|
91
|
+
// 한쪽만 고쳐지고, 그때 message 가 없는 갈래가 「undefined」 를 화면에 적는다.
|
|
92
|
+
return r?.message ?? '엑셀 파일을 읽지 못했습니다';
|
|
88
93
|
}
|
|
89
94
|
|
|
90
95
|
/**
|