deel-local-cli 1.17.8 → 1.18.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 +8 -4
- package/README.md +8 -4
- package/package.json +2 -1
- package/src/acp/serve.js +2 -2
- package/src/agent/loop.js +7 -3
- package/src/agent/route.js +63 -15
- package/src/backend/adapter.js +13 -14
- package/src/backend/cachemark.js +139 -13
- package/src/backend/http.js +49 -2
- package/src/backend/mcp.js +36 -0
- package/src/backend/probe.js +2 -2
- package/src/backend/quota.js +79 -9
- package/src/backend/retry.js +61 -6
- package/src/backend/vision.js +110 -1
- package/src/backend/wire.js +53 -3
- package/src/commands.js +24 -10
- package/src/i18n/en.js +3 -6
- package/src/i18n/ja.js +3 -6
- package/src/i18n/ko.js +3 -6
- package/src/i18n/zh.js +3 -6
- package/src/oneshot.js +2 -2
- package/src/repl.js +34 -4
- package/src/safety/guard.js +106 -3
- package/src/skills/discover.js +79 -3
- package/src/tools/clipboard.js +29 -2
- package/src/tools/fsutil.js +25 -4
- package/src/tools/index.js +18 -1
package/src/tools/fsutil.js
CHANGED
|
@@ -85,7 +85,7 @@ export const SKIP_DIRS = new Set([
|
|
|
85
85
|
export function 내부살림(abs) {
|
|
86
86
|
const 편 = String(abs ?? '').replace(/\\/g, '/');
|
|
87
87
|
const 조각 = 편.split('/');
|
|
88
|
-
const 이름 = 조각[조각.length - 1] ?? '';
|
|
88
|
+
const 이름 = (조각[조각.length - 1] ?? '').toLowerCase();
|
|
89
89
|
/*
|
|
90
90
|
* 살림 자리를 `.deel` 이라는 **글자**로 찾고 있었다.
|
|
91
91
|
*
|
|
@@ -99,7 +99,24 @@ export function 내부살림(abs) {
|
|
|
99
99
|
* 기본 이름도 계속 본다. 옮겨 쓰다가 되돌린 사람, 프로젝트 안에 둔 `.deel`,
|
|
100
100
|
* 남의 PC 에서 옮겨 온 폴더가 다 그 이름이다.
|
|
101
101
|
*/
|
|
102
|
-
|
|
102
|
+
/*
|
|
103
|
+
* ── 대소문자를 가려서는 안 된다 ─────────────────────────────────────
|
|
104
|
+
*
|
|
105
|
+
* `조각.lastIndexOf('.deel')` 는 **정확히 소문자**일 때만 찾았다. 그런데
|
|
106
|
+
* 이 프로그램이 주로 도는 윈도우(NTFS)와 맥(APFS 기본)은 파일 이름의
|
|
107
|
+
* 대소문자를 **안 가린다.** 즉 이름은 안 맞는데 파일은 열린다.
|
|
108
|
+
*
|
|
109
|
+
* .deel/config.json 막힘
|
|
110
|
+
* .DEEL/config.json 통과 ← 같은 파일이 열린다 (열쇠가 그대로 나온다)
|
|
111
|
+
*
|
|
112
|
+
* 실제로 재 봤다. Read 도 Bash 의 checkPaths 도 둘 다 통과였다. 열쇠는
|
|
113
|
+
* 대화에 실려 게이트웨이로 나가고 세션 기록으로 디스크에도 남는다 —
|
|
114
|
+
* 「나가는 문은 하나」 라는 약속이 그 문으로 열쇠를 내보내는 꼴이다.
|
|
115
|
+
*
|
|
116
|
+
* 리눅스에서는 `.DEEL` 이 진짜 다른 폴더지만, 그 이름을 쓰는 사람은
|
|
117
|
+
* 사실상 없다. 막아서 잃는 것보다 안 막아서 잃는 것이 비교가 안 된다.
|
|
118
|
+
*/
|
|
119
|
+
let i = 조각.map((x) => x.toLowerCase()).lastIndexOf('.deel');
|
|
103
120
|
if (i < 0) {
|
|
104
121
|
try {
|
|
105
122
|
const 집 = String(homeDir()).replace(/\\/g, '/').replace(/[/]+$/, '');
|
|
@@ -111,7 +128,9 @@ export function 내부살림(abs) {
|
|
|
111
128
|
} catch { /* 집을 못 물어봐도 아래 이름 검사는 그대로 돈다 */ }
|
|
112
129
|
}
|
|
113
130
|
if (i >= 0) {
|
|
114
|
-
|
|
131
|
+
// 폴더 이름과 같은 까닭으로 **안쪽 이름도** 대소문자를 안 가린다.
|
|
132
|
+
// `.deel/CONFIG.JSON` 은 윈도우·맥에서 같은 파일이다.
|
|
133
|
+
const 안 = 조각.slice(i + 1).map((x) => x.toLowerCase());
|
|
115
134
|
/*
|
|
116
135
|
* ── 폴더 **자체**를 가리키면 그것도 막는다 ──────────────────────────
|
|
117
136
|
*
|
|
@@ -158,7 +177,9 @@ export function 내부살림(abs) {
|
|
|
158
177
|
}
|
|
159
178
|
}
|
|
160
179
|
// 남의 도구 살림. 목록은 남의도구살림 한 곳에만 있다 — 훑는 쪽과 같은 것을 본다.
|
|
161
|
-
|
|
180
|
+
// 여기도 대소문자를 안 가린다 — `.CLAUDE/history.jsonl` 은 윈도우·맥에서 같은 파일이다.
|
|
181
|
+
const 걸린것 = 조각.find((seg) => 남의도구살림.has(String(seg).toLowerCase()))
|
|
182
|
+
?? (남의도구파일.test(이름) ? 이름 : null);
|
|
162
183
|
if (걸린것) {
|
|
163
184
|
return `${걸린것} 은 다른 코딩 도구가 제 기록을 넣어 두는 자리입니다.`
|
|
164
185
|
+ ' 지난 대화·명령 이력·열쇠 같은 것이라 이 작업과 상관이 없고, 읽으면 컨텍스트만 찹니다.'
|
package/src/tools/index.js
CHANGED
|
@@ -877,7 +877,24 @@ function 한파일쓰기(args, ctx) {
|
|
|
877
877
|
*
|
|
878
878
|
* 있는 파일이면 그대로 아래 거절로 내려간다 — 덮어쓰기는 여전히 안 된다.
|
|
879
879
|
*/
|
|
880
|
-
if (isHwpxPath(abs) && !existsSync(abs))
|
|
880
|
+
if (isHwpxPath(abs) && !existsSync(abs)) {
|
|
881
|
+
/*
|
|
882
|
+
* ── 가린 비밀 검사가 이 갈래만 빠져 있었다 ────────────────────────
|
|
883
|
+
*
|
|
884
|
+
* 아래 평범한 쓰기 길은 쓰기 직전에 `가린표되돌리나` 로 «가림:…» 표식이
|
|
885
|
+
* 새 내용에 섞였는지 본다. 그런데 hwpx 를 **새로 만드는** 이 갈래는 그
|
|
886
|
+
* 검사보다 위에서 돌아서 통째로 건너뛰었다.
|
|
887
|
+
*
|
|
888
|
+
* 모델이 Bash 로 환경변수를 읽으면 값이 가려진 채로 온다. 그 표식을
|
|
889
|
+
* 진짜 값으로 알고 보고서에 옮겨 적으면, 다른 형식은 그 자리에서
|
|
890
|
+
* 막히는데 hwpx 만 「새로 만듦」 이라고 답하고 조용히 만들어졌다.
|
|
891
|
+
* 사내 보고서를 만드는 것이 이 도구의 주된 쓰임이라 하필 제일 나쁜
|
|
892
|
+
* 자리다 — 사람은 문서를 열어 보기 전까지 모른다.
|
|
893
|
+
*/
|
|
894
|
+
const 표막기 = 가린표되돌리나(ctx.scope.show(abs), args.content);
|
|
895
|
+
if (표막기) return { error: 표막기 };
|
|
896
|
+
return hwpx새로만들기(args, ctx, abs);
|
|
897
|
+
}
|
|
881
898
|
// 문서(hwpx·docx·pptx)도 같은 이유로 또렷하게 거절한다. 일반 '바이너리'
|
|
882
899
|
// 오류로 넘기면 왜 안 되는지가 안 실려서, 모델이 우회로를 찾는다.
|
|
883
900
|
if (isDocPath(abs)) return { error: 문서는못고침(args.file_path) };
|