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/agent/route.js
CHANGED
|
@@ -255,7 +255,36 @@
|
|
|
255
255
|
* 세 갈래에 같은 「띄운 줄표」 잣대를 넣어 맞춘다.
|
|
256
256
|
*/
|
|
257
257
|
const 영어시킴말 =
|
|
258
|
-
/(?:^\s*|(?<!\b(?:e\.g|i\.e|vs|cf|approx|Fig|Dr|Mr|Mrs|Ms|St|Jr|Sr))[.!?]\s+|\n\s*|^\s*\d+[.)]\s*|^\s*[-*]\s*)(?:(?:first|then|next|after\s+that|also|now|finally|second|third|lastly|afterwards?)\s*,?\s+)?(?:please\s*,?\s+)?(?:(?:could|can|would|will)\s+(?:you|we)\s*,?\s+)?(?:please\s*,?\s+)?(?:(?:build|make|create|update|write|migrate|generate|set\s*up)\b(?![\s:-]+(?:(?:failed|failing|fails|errored|broke|crashed|succeeded|succeeds|timed[\s-]+out)\b(?=\s*(?:[.,:;!?()\[\]-]|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b)|(?:failures?|errors?|broken|crash|crashes|timeouts?)\b(?=(?:[ \t]*[([][^)\]\n]*[)\]])?(?:\s*(?:[,:;!?)\]]|$)|\s*\.(?!\w)|\s+-{1,2}(?:\s|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b))))(?!(?:[ \t]+[\w'-]+){0,3}[ \t]+(?:[\w']+-)*(?:plans?|roadmaps?|strateg(?:y|ies)|outlines?)(?=[ \t]*(?:[!?,;:)]|\.(?!\w)|$)|[ \t]+-{1,2}(?:[ \t]|$)|[ \t]+(?:now|today|tonight|tomorrow|first|soon|asap|again)\b|[ \t]+(?:for|to|of|on|about|around|that|which|we|with|before|after|regarding|covering)\b))|(?:modify|change|develop|rewrite)\b(?![\s:-]+(?:(?:failed|failing|fails|errored|broke|crashed|succeeded|succeeds|timed[\s-]+out)\b(?=\s*(?:[.,:;!?()\[\]-]|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b)|broken\b(?=(?:[ \t]*[([][^)\]\n]*[)\]])?(?:\s*(?:[,:;!?)\]]|$)|\s*\.(?!\w)|\s+-{1,2}(?:\s|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b))|(?:failures?|errors?|crash|crashes|timeouts?)\b(?:\s*[:(]|\s+-{1,2}(?:\s|$))))(?!(?:[ \t]+[\w'-]+){0,3}[ \t]+(?:[\w']+-)*(?:plans?|roadmaps?|strateg(?:y|ies)|outlines?)(?=[ \t]*(?:[!?,;:)]|\.(?!\w)|$)|[ \t]+-{1,2}(?:[ \t]|$)|[ \t]+(?:now|today|tonight|tomorrow|first|soon|asap|again)\b|[ \t]+(?:for|to|of|on|about|around|that|which|we|with|before|after|regarding|covering)\b))|(?:implement|add|fix|refactor|remove|delete|rename|scaffold)\b(?![\s:-]+(?:(?:failed|failing|fails|errored|broke|crashed|succeeded|succeeds|timed[\s-]+out)\b(?=\s*(?:[.,:;!?()\[\]-]|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b)|broken\b(?=(?:[ \t]*[([][^)\]\n]*[)\]])?(?:\s*(?:[,:;!?)\]]|$)|\s*\.(?!\w)|\s+-{1,2}(?:\s|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b))|(?:failures?|errors?|crash|crashes|timeouts?)\b(?:\s*[:(]|\s+-{1,2}(?:\s|$)))))(?!\()(?![-\w]*[ \t]*:)(?![ \t]+[\w.-]+[ \t]*:[ \t])(?!(?<=\bdelete)\s+from\s+[\w."`]+\s*(?:where\b|order\s+by\b|limit\b|;|$))(?!(?<=\bupdate)\s+[\w."`]+\s+set\b)/im;
|
|
258
|
+
/(?:^\s*|(?<!\b(?:e\.g|i\.e|vs|cf|approx|Fig|Dr|Mr|Mrs|Ms|St|Jr|Sr))[.!?]\s+|\n\s*|^\s*\d+[.)]\s*|^\s*[-*]\s*)(?:(?:first|then|next|after\s+that|also|now|finally|second|third|lastly|afterwards?)\s*,?\s+)?(?:please\s*,?\s+)?(?:(?:could|can|would|will)\s+(?:you|we)\s*,?\s+)?(?:please\s*,?\s+)?(?:(?:build|make|create|update|write|migrate|generate|set\s*up)\b(?![\s:-]+(?:(?:failed|failing|fails|errored|broke|crashed|succeeded|succeeds|timed[\s-]+out)\b(?=\s*(?:[.,:;!?()\[\]-]|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b)|(?:failures?|errors?|broken|crash|crashes|timeouts?)\b(?=(?:[ \t]*[([][^)\]\n]*[)\]])?(?:\s*(?:[,:;!?)\]]|$)|\s*\.(?!\w)|\s+-{1,2}(?:\s|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b))))(?!(?:[ \t]+[\w'-]+){0,3}[ \t]+(?:[\w']+-)*(?:plans?|roadmaps?|strateg(?:y|ies)|outlines?)(?=[ \t]*(?:[!?,;:)]|\.(?!\w)|$)|[ \t]+-{1,2}(?:[ \t]|$)|[ \t]+(?:now|today|tonight|tomorrow|first|soon|asap|again)\b|[ \t]+(?:for|to|of|on|about|around|that|which|we|with|before|after|regarding|covering)\b))|(?:modify|change|develop|rewrite)\b(?![\s:-]+(?:(?:failed|failing|fails|errored|broke|crashed|succeeded|succeeds|timed[\s-]+out)\b(?=\s*(?:[.,:;!?()\[\]-]|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b)|broken\b(?=(?:[ \t]*[([][^)\]\n]*[)\]])?(?:\s*(?:[,:;!?)\]]|$)|\s*\.(?!\w)|\s+-{1,2}(?:\s|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b))|(?:failures?|errors?|crash|crashes|timeouts?)\b(?:\s*[:(]|\s+-{1,2}(?:\s|$))))(?!(?:[ \t]+[\w'-]+){0,3}[ \t]+(?:[\w']+-)*(?:plans?|roadmaps?|strateg(?:y|ies)|outlines?)(?=[ \t]*(?:[!?,;:)]|\.(?!\w)|$)|[ \t]+-{1,2}(?:[ \t]|$)|[ \t]+(?:now|today|tonight|tomorrow|first|soon|asap|again)\b|[ \t]+(?:for|to|of|on|about|around|that|which|we|with|before|after|regarding|covering)\b))|(?:implement|add|fix|refactor|remove|delete|rename|scaffold)\b(?![\s:-]+(?:(?:failed|failing|fails|errored|broke|crashed|succeeded|succeeds|timed[\s-]+out)\b(?=\s*(?:[.,:;!?()\[\]-]|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b)|broken\b(?=(?:[ \t]*[([][^)\]\n]*[)\]])?(?:\s*(?:[,:;!?)\]]|$)|\s*\.(?!\w)|\s+-{1,2}(?:\s|$)|\s+(?:with|at|after|in|on|to|before|during|because|due|while|when|for|since|from)\b))|(?:failures?|errors?|crash|crashes|timeouts?)\b(?:\s*[:(]|\s+-{1,2}(?:\s|$)))))(?!\.\w)(?!\()(?![-\w]*[ \t]*:)(?![ \t]+[\w.-]+[ \t]*:[ \t])(?!(?<=\bdelete)\s+from\s+[\w."`]+\s*(?:where\b|order\s+by\b|limit\b|;|$))(?!(?<=\bupdate)\s+[\w."`]+\s+set\b)/im;
|
|
259
|
+
|
|
260
|
+
/*
|
|
261
|
+
* 「그 계획을 **따라 하라**」 는 말. 계획을 달라는 말이 아니다.
|
|
262
|
+
*
|
|
263
|
+
* 한 자리에 모아 두어야 계획·플랜·로드맵 셋에 똑같이 걸린다. 흩어 적었더니
|
|
264
|
+
* 한글에만 붙고 영어에는 안 붙는 자리가 났다(아래 plan 표 머리말).
|
|
265
|
+
*
|
|
266
|
+
* 토씨는 있어도 없어도 된다 — 「계획 따라」 · 「계획을 따라」 · 「계획에 따라」
|
|
267
|
+
* 가 다 같은 말이다.
|
|
268
|
+
*/
|
|
269
|
+
const 계획말고 = '(?!\\s*(?:대로|처럼|[을를에]?\\s*따라))';
|
|
270
|
+
/*
|
|
271
|
+
* ── 「그 계획은 **이미 승인됐다**」 도 계획을 달라는 말이 아니다 ──────────
|
|
272
|
+
*
|
|
273
|
+
* 아래 영어겹침 이 같은 잣대를 이미 쓴다 — 뒤에 is·was 가 오면 그 낱말은 시킴이
|
|
274
|
+
* 아니라 이미 있는 것을 가리키는 말이다. 그런데 그 잣대가 **겹침 갈래에만** 붙어
|
|
275
|
+
* 있었다. 점수표의 `plan` 5점은 그대로라, 승인 창만 안 뜨고 모드는 여전히 계획이었다:
|
|
276
|
+
*
|
|
277
|
+
* "Our plan is approved. Open the file and make the change." → 계획 모드
|
|
278
|
+
*
|
|
279
|
+
* 계획 모드에는 파일을 바꾸는 도구가 없다. 게다가 겹침을 끄면서 승인 뒤에 code 로
|
|
280
|
+
* 잇는 길(repl.js 의 이어갈모드)까지 없어져, 사람은 이미 승인됐다고 적어 놓고
|
|
281
|
+
* 계획서 한 장을 다시 받고 끝난다 — 고치기 전보다 나빠진 자리다.
|
|
282
|
+
*
|
|
283
|
+
* 한글 낱말에는 안 건다. 영어 낱말 뒤에는 한글 토씨가 붙어 오므로(`plan대로` ·
|
|
284
|
+
* `roadmap에 따라`) 위 토씨 갈래는 그대로 같이 쓴다.
|
|
285
|
+
*/
|
|
286
|
+
const 이름씨꼴영어 = '(?!\\s+(?:is|was|are|were|has|have|had|looks?|seems?|got)\\b)';
|
|
287
|
+
const 계획말고영어 = `${계획말고}${이름씨꼴영어}`;
|
|
259
288
|
|
|
260
289
|
export const 표 = {
|
|
261
290
|
debug: [
|
|
@@ -282,11 +311,45 @@ export const 표 = {
|
|
|
282
311
|
|
|
283
312
|
plan: [
|
|
284
313
|
// '먼저' 와 붙어야 계획이다. 그냥 '어떻게' 는 설명일 수도 있다.
|
|
285
|
-
|
|
314
|
+
/*
|
|
315
|
+
* ── 「계획대로」 는 계획을 달라는 말이 아니다 ──────────────────────
|
|
316
|
+
*
|
|
317
|
+
* 계획을 받아 본 사람이 다음에 치는 말이 「위 계획대로 진행해줘」 다.
|
|
318
|
+
* 그런데 그 말에 '계획' 이 들어 있어서 **또 계획 모드로** 갔다. 계획
|
|
319
|
+
* 모드는 파일을 고치는 도구가 없으니, 사람은 계획을 두 장 받고 파일은
|
|
320
|
+
* 그대로다. 승인한 값이 통째로 사라진다.
|
|
321
|
+
*
|
|
322
|
+
* 대화 화면은 승인 창 바로 뒤에만 이 자리를 피한다(`이어갈모드`). 그
|
|
323
|
+
* 자리를 벗어나면 대화 화면에서도 갇히고, 에디터·`deel run` 에는 그
|
|
324
|
+
* 장치가 아예 없다.
|
|
325
|
+
*
|
|
326
|
+
* '-대로' 는 「그것에 따라 하라」 는 뜻이다. 계획을 달라는 말과 정반대다.
|
|
327
|
+
*
|
|
328
|
+
* ── 그런데 두 군데가 새고 있었다 ──────────────────────────────────
|
|
329
|
+
*
|
|
330
|
+
* 하나는 **갈래 나누기의 힘 차이**다. `플랜(?!…)|\bplan\b` 는 「(플랜에
|
|
331
|
+
* 뒤보기) 또는 (plan)」 으로 읽힌다 — `|` 가 뒤보기보다 넓게 갈라서
|
|
332
|
+
* 영어 낱말에는 뒤보기가 안 붙었다. 그래서 이랬다:
|
|
333
|
+
*
|
|
334
|
+
* 위 계획대로 진행해줘 종합 (맞다)
|
|
335
|
+
* plan대로 진행해줘 계획 ← 5점이 그대로 붙는다
|
|
336
|
+
* roadmap대로 진행해줘 계획 ←
|
|
337
|
+
*
|
|
338
|
+
* 다른 하나는 **적어 둔 토씨만 막은 것**이다. 뒤보기에 `에\s*따라` 만
|
|
339
|
+
* 적어 뒀는데, 사람은 토씨를 흔히 뺀다:
|
|
340
|
+
*
|
|
341
|
+
* 위 계획 따라 진행해줘 계획 ←
|
|
342
|
+
* 세운 계획을 따라 만들어줘 계획 5점 (실행 낱말 덕에 겨우 code 로 감)
|
|
343
|
+
*
|
|
344
|
+
* 뒤보기를 한 자리에 모아 두 낱말에 똑같이 씌운다. '따라' 앞에 오는
|
|
345
|
+
* 토씨는 없거나 `에`·`을`·`를`·`대로` 다.
|
|
346
|
+
*/
|
|
347
|
+
[new RegExp(`계획${계획말고}`), 5],
|
|
348
|
+
[new RegExp(`플랜${계획말고}|\\bplan\\b${계획말고영어}`, 'i'), 5],
|
|
286
349
|
[/먼저\s*(정리|생각|살펴|파악|검토|짜|세)/, 4],
|
|
287
350
|
[/어떤\s*순서/, 4], [/순서(를|대로)?\s*(정|짜|잡)/, 3],
|
|
288
351
|
[/단계(를|로)?\s*(나눠|쪼개|정리)/, 3],
|
|
289
|
-
[
|
|
352
|
+
[new RegExp(`로드맵${계획말고}|\\broadmap\\b${계획말고영어}`, 'i'), 5],
|
|
290
353
|
[/방향(을|만)?\s*(잡|정)/, 3],
|
|
291
354
|
[/하기\s*전에\s*(정리|살펴|검토)/, 3],
|
|
292
355
|
[/무엇부터|뭐부터/, 3],
|
|
@@ -327,8 +390,20 @@ export const 표 = {
|
|
|
327
390
|
*
|
|
328
391
|
* 앞에 「원인」 이 붙으면 뺀다. 그건 고장을 쫓는 말이라 debug 자리고,
|
|
329
392
|
* 여기로 보내면 파일을 못 고치는 모드에서 원인만 듣고 끝난다.
|
|
393
|
+
*
|
|
394
|
+
* ── 토씨 목록에 한 짝의 절반만 적었다 ──────────────────────────
|
|
395
|
+
*
|
|
396
|
+
* `[을이은는]` 이라 「이유를」 「이유가」 가 빠졌다. 목적격·주격 토씨는
|
|
397
|
+
* 받침 있는 말에 을·이, 없는 말에 를·가 가 붙는 **한 짝**인데 앞짝만
|
|
398
|
+
* 적었다. '이유' 는 받침이 없어서 사람이 쓰는 꼴이 언제나 뒷짝이다 —
|
|
399
|
+
*
|
|
400
|
+
* "원인을 살펴봐줘" → debug (빠진다)
|
|
401
|
+
* "이유를 살펴봐줘" → inspect (안 빠진다)
|
|
402
|
+
*
|
|
403
|
+
* 같은 말인데 낱말 하나로 갈렸고, 하필 더 흔한 쪽이 **파일을 못 고치는**
|
|
404
|
+
* 모드로 갔다.
|
|
330
405
|
*/
|
|
331
|
-
[/(?<!(?:원인|까닭|이유)[
|
|
406
|
+
[/(?<!(?:원인|까닭|이유)[을를이가은는]?\s{0,2}(?:좀\s{0,2})?)살펴\s*(봐|보고|보자|봐야|주)/, 5],
|
|
332
407
|
[/취약(점|한|성)/, 5], [/보안\s*(점검|검토|문제|취약|구멍)/, 5],
|
|
333
408
|
[/경합|레이스\s*컨디션|race\s*condition/i, 5],
|
|
334
409
|
[/데이터\s*(손실|유실)|덮어쓰(기|면)|유실/, 4],
|
|
@@ -367,7 +442,8 @@ export const 표 = {
|
|
|
367
442
|
[/\breview(?:s|ing|ed)?\b|\binspect(?:s|ing|ion|ions|ed)?\b/i, 5],
|
|
368
443
|
[/\banaly[sz]e(?:s|d)?\b|\banaly[sz]ing\b|\banalysis\b/i, 5],
|
|
369
444
|
[/\bvulnerab/i, 5],
|
|
370
|
-
|
|
445
|
+
// `npm audit fix` · `yarn audit fix` 는 고치라는 명령이다. 읽기 전용 점검으로 보내면 못 돌린다 (6회차 Gemini 길고르기6 b1).
|
|
446
|
+
[/\baudit(?:s|ing|ed)?\b(?!\s+fix\b)/i, 5],
|
|
371
447
|
[/\bdata\s*loss\b|\bdeadlock\b|\blost\s*update\b/i, 4],
|
|
372
448
|
],
|
|
373
449
|
|
|
@@ -401,7 +477,8 @@ export const 표 = {
|
|
|
401
477
|
*/
|
|
402
478
|
[/뭐\s*하는\s*(파일|함수|코드|모듈|클래스|녀석|건|거|것)/, 5],
|
|
403
479
|
[/뭐\s*하(는|나|니|냐)/, 3], [/무슨\s*(일|역할)/, 3],
|
|
404
|
-
|
|
480
|
+
// 「설명만 해줘」 — 설명 뒤 「만」 을 안 받아 0점이었다. 설명만 달라는 말은 가장 뚜렷한 묻기다 (6회차 Gemini 길고르기6 b4).
|
|
481
|
+
[/설명(해|\s*좀|을|만)/, 5], [/알려\s*(줘|주세요|줄래)/, 3],
|
|
405
482
|
[/어떻게\s*(동작|작동|돌아가)/, 5],
|
|
406
483
|
/*
|
|
407
484
|
* 「어떻게 …?」 는 영어 `how to` 와 같은 물음인데 '동작·작동·돌아가'
|
|
@@ -529,9 +606,23 @@ export const 표 = {
|
|
|
529
606
|
* `and`·`then` 으로 이은 시킴 마디가 같은 문장에 있으면 이 규칙을 끈다.
|
|
530
607
|
* 「and why」 「and how it works」 처럼 움직씨가 아닌 것은 안 건드린다.
|
|
531
608
|
*/
|
|
532
|
-
[/(?:\bexplain(?:s|ing|ed)?\b|(?:^\s*|[.!?]\s+|\n\s*)(?:(?:please|pls)\s*,?\s+)?(?:(?:could|can|would|will)\s+you\s+)?(?:please\s*,?\s+)?(?:(?:tell|show)\s+(?:me|us)\b|walk\s+(?:me|us)\s+through\b))(?![^.!?\n]*\b(?:and|then)\s+(?:also\s+)?(?:implement|add|fix|write|rename|update|delete|remove|create|build|make|refactor|rewrite)\b)/im, 5],
|
|
533
|
-
|
|
534
|
-
|
|
609
|
+
[/(?:\bexplain(?:s|ing|ed)?\b|(?:^\s*|[.!?]\s+|\n\s*)(?:(?:please|pls)\s*,?\s+)?(?:(?:could|can|would|will)\s+you\s+)?(?:please\s*,?\s+)?(?:(?:tell|show)\s+(?:me|us)\b|walk\s+(?:me|us)\s+through\b))(?!(?:[^.!?\n]|\.(?=[\w/]))*\b(?:and|then)\s+(?:also\s+)?(?:implement|add|fix|write|rename|update|delete|remove|create|build|make|refactor|rewrite)\b)/im, 5],
|
|
610
|
+
/*
|
|
611
|
+
* ── 물음표를 삼킨 뒤에서는 이미 지나온 자리를 못 본다 ────────────────
|
|
612
|
+
*
|
|
613
|
+
* 위 explain 과 같은 문을 `what`·`how` 에도 달아 뒀는데, 물음표까지 삼키는
|
|
614
|
+
* 갈래가 이기면 그 문이 **삼킨 자리 뒤**에서 열린다 — 이미 지나온
|
|
615
|
+
* 「and fix」 에 닿을 수가 없었다. 물음표 하나로 이렇게 갈렸다 —
|
|
616
|
+
*
|
|
617
|
+
* "What is broken and fix it." → 막힌다
|
|
618
|
+
* "What is broken and fix it?" → 묻기 5점, 묻기 모드
|
|
619
|
+
*
|
|
620
|
+
* 그래서 낱말 바로 뒤에도 같은 문을 단다. 뒤의 문도 그대로 둔다 —
|
|
621
|
+
* 「What is this? Then fix it.」 은 앞의 문이 물음표에서 멈춰 못 보는
|
|
622
|
+
* 자리라, 둘이 서로 다른 데를 지킨다.
|
|
623
|
+
*/
|
|
624
|
+
[/(?:^\s*|[.!?]\s+|\n\s*)(?:(?:please|pls)\s*,?\s+)?what\b(?!(?:[^.!?\n]|\.(?=[\w/]))*\b(?:and|then)\s+(?:also\s+)?(?:implement|add|fix|write|rename|update|delete|remove|create|build|make|refactor|rewrite)\b)(?:(?:[^.!?\n]|\.(?=[\w/]))*\?|(?:'s|(?:\s+\w+){0,3}\s+(?:is|are|was|were|does|do|did|can|should)|\s+to)\b)(?!(?:[^.!?\n]|\.(?=[\w/]))*\b(?:and|then)\s+(?:also\s+)?(?:implement|add|fix|write|rename|update|delete|remove|create|build|make|refactor|rewrite)\b)/im, 5],
|
|
625
|
+
[/(?:^\s*|[.!?]\s+|\n\s*)(?:(?:please|pls)\s*,?\s+)?how\b(?!(?:[^.!?\n]|\.(?=[\w/]))*\b(?:and|then)\s+(?:also\s+)?(?:implement|add|fix|write|rename|update|delete|remove|create|build|make|refactor|rewrite)\b)(?:(?:[^.!?\n]|\.(?=[\w/]))*\?|'s\b|\s+(?:to\b|does|do|did|is|are|was|were|can|should)\b)(?!(?:[^.!?\n]|\.(?=[\w/]))*\b(?:and|then)\s+(?:also\s+)?(?:implement|add|fix|write|rename|update|delete|remove|create|build|make|refactor|rewrite)\b)/im, 5],
|
|
535
626
|
[/읽어(만)?\s*보고\s*(설명|알려)/, 4],
|
|
536
627
|
],
|
|
537
628
|
|
|
@@ -551,8 +642,21 @@ export const 표 = {
|
|
|
551
642
|
],
|
|
552
643
|
|
|
553
644
|
code: [
|
|
554
|
-
|
|
555
|
-
[
|
|
645
|
+
// 「고쳐주지 마」(부정) · 「고쳐지지 않는」(입음)은 고치라는 말이 아니다 — 여태 4점으로 code 문턱을 넘었다 (6회차 Gemini 길고르기6 c1).
|
|
646
|
+
[/고쳐(?!지|\s*주?지\s*(?:마|말|않))|수정(해|\s*좀)/, 4],
|
|
647
|
+
/*
|
|
648
|
+
* ── 도움움직씨 앞은 띄어 쓴다 ──────────────────────────────────
|
|
649
|
+
*
|
|
650
|
+
* 「넣어 주세요」 「써 줘」 는 맞춤법대로 띄어 쓴 꼴인데 붙여 쓴 것만
|
|
651
|
+
* 봤다. 그래서 같은 부탁이 이렇게 갈렸다 —
|
|
652
|
+
*
|
|
653
|
+
* "로그 한 줄 넣어줘" → code
|
|
654
|
+
* "로그 한 줄 넣어 줘" → 종합 (0점)
|
|
655
|
+
*
|
|
656
|
+
* 아래 손대라는말 이 「수정해 줘」 에서 이미 배운 것인데, 점수표만
|
|
657
|
+
* 그대로 남아 있었다. 띄어 쓴 사람만 시킨 것이 안 읽혔다.
|
|
658
|
+
*/
|
|
659
|
+
[/만들어|추가(해|\s*좀)|넣어\s*(줘|주세요)/, 4],
|
|
556
660
|
[/구현(해|\s*좀)/, 5],
|
|
557
661
|
[/바꿔(줘|주세요)?|변경(해|\s*좀)/, 3],
|
|
558
662
|
[/지워(줘)?|삭제(해|\s*좀)/, 3],
|
|
@@ -593,7 +697,7 @@ export const 표 = {
|
|
|
593
697
|
* 겹침을 막는 자리는 겹치는 쪽과 **같은 꼴**을 봐야 한다.
|
|
594
698
|
*/
|
|
595
699
|
[/(?<=[a-z,;:)\]]\s{1,3})(?<!\b(?:could|can|would|will)\s{1,3}(?:you|we)[\s,]{1,4})(?<!\bplease[\s,]{1,4})(?:implement|add|fix|write|rename)\b/i, 2],
|
|
596
|
-
[
|
|
700
|
+
[/써\s*(줘|주세요)/, 3],
|
|
597
701
|
/*
|
|
598
702
|
* 「짜다」 는 코드·검사를 만들라는 한국어에서 제일 흔한 말인데
|
|
599
703
|
* '써 줘' 만 있었다. 계획·순서·구조를 짜는 것은 각각 plan·architect
|
|
@@ -680,7 +784,13 @@ const 이름씨아님 = '(?![서를가에의는도만까와과])';
|
|
|
680
784
|
const 잇는말 = '해\\s*주고|해\\s*놓고|하고\\s*나서|하고서|한\\s*다음|한\\s*뒤|한\\s*후|하고|해서|잡고|짜고|세우고|낸\\s*뒤|낸\\s*다음'
|
|
681
785
|
+ `|(?<=(?:살펴|알아)\\s{0,1})보고|해\\s*보고${이름씨아님}`
|
|
682
786
|
+ '|(?<=(?:살펴|알아)\\s{0,1})본\\s*(?:다음|뒤|후)|해\\s*본\\s*(?:다음|뒤|후)';
|
|
683
|
-
|
|
787
|
+
/*
|
|
788
|
+
* 이름씨 뿌리(구현·작성·생성·세팅·설치·배포)는 **해·하·좀** 이 붙어야 실행말이다. 맨 뿌리로 두었더니
|
|
789
|
+
* 「살펴보고 작성자 확인해줘」 의 작성자, 「검토하고 설치 경로 알려줘」 의 설치 가 걸려 조회가 겹친 요청
|
|
790
|
+
* (계획 모드 + 승인 창)이 됐다 (6회차 Gemini 길고르기6 c3). 사이에 토씨 하나(을·은·도·까지·만)는 넘는다 —
|
|
791
|
+
* 「구현은 해줘」 「배포까지 해줘」.
|
|
792
|
+
*/
|
|
793
|
+
const 실행말 = /만들어|만들자|만들어라|(?:구현|작성|생성|세팅|설치|배포)(?=\s*(?:을|를|은|는|도|까지|만)?\s*(?:해|하|좀))|추가(해|하)|써\s*(줘|주세요)|짜\s*(줘|주세요)|고쳐/;
|
|
684
794
|
const 계획먼저 = new RegExp(`(${계획말})\\s*(?:을|를)?\\s*(?:${잇는말})`);
|
|
685
795
|
/*
|
|
686
796
|
* 영어도 같이 본다 — "plan and then build it" 처럼 붙여 넣는 일이 있다.
|
|
@@ -726,6 +836,17 @@ const 계획먼저 = new RegExp(`(${계획말})\\s*(?:을|를)?\\s*(?:${잇는
|
|
|
726
836
|
* 흔해서다. 열거와 갈리는 자리는 **쉼표가 몇 개냐** 다 — 열거는 `and` 에
|
|
727
837
|
* 닿기까지 쉼표를 여러 번 넘어야 하고, 차례는 많아야 한 번이다.
|
|
728
838
|
*
|
|
839
|
+
* ── 차례말 **뒤**에도 쉼표가 붙는다 ────────────────────────────────────
|
|
840
|
+
*
|
|
841
|
+
* 위는 차례말 **앞**의 쉼표 이야기였다. 정작 흔한 것은 뒤에 붙는 쪽이다 —
|
|
842
|
+
*
|
|
843
|
+
* "Plan the migration. After approval, implement it."
|
|
844
|
+
* "Draft the schema. Then, write the migration."
|
|
845
|
+
*
|
|
846
|
+
* 차례말 다음을 `\s+` 로만 받아서, 쉼표 하나에 겹침이 아니게 됐다. 사람이
|
|
847
|
+
* 「승인 뒤에」 라고 **적어 둔** 자리인데 계획을 보여 달라는 절반이 통째로
|
|
848
|
+
* 사라진다. 앞에서 받아 준 것과 같은 쉼표라 같이 받는다.
|
|
849
|
+
*
|
|
729
850
|
* ── `the design` 은 계획을 세우라는 말이 아니다 ─────────────────────────
|
|
730
851
|
*
|
|
731
852
|
* 이 네 낱말은 움직씨이기도 하고 이름씨이기도 하다. 앞에 관사가 붙으면
|
|
@@ -741,7 +862,16 @@ const 계획먼저 = new RegExp(`(${계획말})\\s*(?:을|를)?\\s*(?:${잇는
|
|
|
741
862
|
* 마침표·물음표·줄바꿈을 다 지나갔다. 그리고 `\s*` 는 상한이 없어서 예순 자
|
|
742
863
|
* 잣대가 빈칸으로 뚫렸다 — `[ \t]*` 로 좁힌다.
|
|
743
864
|
*/
|
|
744
|
-
|
|
865
|
+
/*
|
|
866
|
+
* ── 건너뛰라는 말 · 이미 끝났다는 말 ─────────────────────────────────────
|
|
867
|
+
*
|
|
868
|
+
* 「Skip design and write the code」 · 「Plan is approved, then implement it」 이 겹침으로 잡혀 계획 모드
|
|
869
|
+
* (읽기 전용 + 승인 창)로 갔다. 앞은 설계를 **하지 말라**는 말이고, 뒤는 계획이 **이미 승인됐다**는
|
|
870
|
+
* 말이다 — 둘 다 곧장 만들라는 말인데 계획서를 또 내고 또 물었다 (6회차 Gemini 길고르기6 c4).
|
|
871
|
+
* 관사를 막은 것과 같은 까닭이다: 앞에 skip·no·without 이 오거나 뒤에 is·was·has 가 오면 그 낱말은
|
|
872
|
+
* 시킴이 아니다.
|
|
873
|
+
*/
|
|
874
|
+
const 영어겹침 = /(?<!\b(?:the|a|an|this|that|our|your|my|its|their)\s)(?<!\b(?:skip|skipping|skipped|no|without|forget|drop)\s+)\b(plan|design|outline|draft)\b(?!\s+(?:is|was|are|were|has|have|had|looks?|seems?|got)\b)(?:[\s\S]{0,60}?\b(?:and\s+then|then|after\s+(?:that|approval)|before\s+you)|[^,.!?\n]{0,60}?,?[ \t]{0,2}\band)\s*,?\s+(?:then\s+)?\b(build|implement|create|write|make|code)\b/i;
|
|
745
875
|
|
|
746
876
|
/*
|
|
747
877
|
* ── 두 말이 **얼마나 붙어 있어야** 겹침인가 ─────────────────────────────
|
|
@@ -807,6 +937,30 @@ export function 겹친요청(text) {
|
|
|
807
937
|
const 남은것 = s.slice(앞.index + 앞[0].length, 앞.index + 앞[0].length + 겹침거리);
|
|
808
938
|
const 뒤 = 남은것.match(실행말);
|
|
809
939
|
if (!뒤) return { 겹침: false, why: '' };
|
|
940
|
+
/*
|
|
941
|
+
* 실행말 **바로 뒤에 부정**이 붙으면 실행하라는 말이 아니다. 「설계하고 구현은 하지 마」 「정리하고
|
|
942
|
+
* 추가하지 마」 가 겹침으로 잡혀 계획 모드 + 승인 창으로 갔다 — 하지 말라는 것을 할지 물었다
|
|
943
|
+
* (6회차 Gemini 길고르기6 c2).
|
|
944
|
+
*
|
|
945
|
+
* ── 부정은 **잘린 토막**이 아니라 글 전체에서 읽는다 ──────────────────────────
|
|
946
|
+
*
|
|
947
|
+
* 실행말은 예순 자 안에서 찾는 것이 맞다(위 겹침거리 머리말). 그런데 그 뒤에 오는
|
|
948
|
+
* 부정까지 같은 토막 안에서만 찾았다. 실행말이 토막 가장자리에 걸리면 「하지 마」 가
|
|
949
|
+
* 통째로 잘려 나가고, 하지 말라는 것을 할지 묻는 승인 창이 떴다 —
|
|
950
|
+
*
|
|
951
|
+
* "설계하고 … 정리해 두되 구현은 하지 마" ← 구현이 쉰아홉 자째
|
|
952
|
+
*
|
|
953
|
+
* 거리를 재는 것은 **두 말이 한 문장 안인가**를 보려는 것이고, 부정은 이미 찾은
|
|
954
|
+
* 실행말에 바로 붙은 것만 본다 — 잣대가 다르니 재는 자리도 다르다. 글 전체에서 읽는다.
|
|
955
|
+
*
|
|
956
|
+
* ── 「하지는 마」 · 「하진 마」 · 「하지도 마」 ─────────────────────────────────
|
|
957
|
+
*
|
|
958
|
+
* '지' 와 '마' 사이에 토씨가 끼거나(하지는·하지도) 줄어들면(하진) 못 읽었다. 하지
|
|
959
|
+
* 말라는 말이 하라는 말이 되는 자리라 뒤집힘이 제일 크다. 「하지만」 은 그대로 안
|
|
960
|
+
* 걸린다 — 뒤에 오는 것이 마·말·않 일 때만 부정이다.
|
|
961
|
+
*/
|
|
962
|
+
const 실행말뒤 = s.slice(앞.index + 앞[0].length + 뒤.index + 뒤[0].length);
|
|
963
|
+
if (/^\s*(?:(?:은|는|을|를|도)\s*)?(?:(?:해\s*주|해|하|주)\s*)?(?:지[는도를은]?|진)\s*(?:마|말|않)/.test(실행말뒤)) return { 겹침: false, why: '' };
|
|
810
964
|
return { 겹침: true, why: `'${앞[0].trim()}' 뒤에 '${뒤[0].trim()}'` };
|
|
811
965
|
}
|
|
812
966
|
|
|
@@ -989,6 +1143,38 @@ const 손대라는말 = new RegExp(`(?:${[
|
|
|
989
1143
|
계획도손대는동사 && `${계획거리뒤}(?:${계획도손대는동사})`,
|
|
990
1144
|
].filter(Boolean).join('|')})${하지마}(?:\\S{0,3}(?:${붙는끝})|[^\\n]{0,3}(?:${띄는끝}))`);
|
|
991
1145
|
|
|
1146
|
+
/*
|
|
1147
|
+
* ── 반말로 시킨 말이 통째로 빠져 있었다 ─────────────────────────────────
|
|
1148
|
+
*
|
|
1149
|
+
* 끝맺음 목록에 해라체(해라·어라)와 부탁(줘·주세요)은 있는데, 제일 흔한
|
|
1150
|
+
* **반말 시킴꼴**(「수정해」 「고쳐」 「만들어」)이 없었다. 그래서 같은 말이
|
|
1151
|
+
* 이렇게 갈렸다 —
|
|
1152
|
+
*
|
|
1153
|
+
* "리뷰 결과 반영해서 정리해" → inspect (읽기 전용 — 고칠 수가 없다)
|
|
1154
|
+
* "보안 점검 결과대로 수정해" → 종합 ("…수정해줘" 는 code)
|
|
1155
|
+
* "리뷰 결과대로 고쳐" → 종합 (inspect 5 · code 4 비슷함)
|
|
1156
|
+
*
|
|
1157
|
+
* 반말은 서술·물음과 꼴이 같아서 넓게 열면 안 된다. 그래서 세 겹으로 좁힌다 —
|
|
1158
|
+
* (1) 동사 바로 뒤에 반말꼴이 **정확히** 붙고(「수정해」 「고쳐」), 그 뒤가
|
|
1159
|
+
* 글 끝·줄 끝·마침표뿐일 때만 — 「고쳐졌어」 「수정해도」 「구현해 본 적」
|
|
1160
|
+
* 「수정해?」 는 안 걸린다.
|
|
1161
|
+
* (2) 바로 앞이 「안·못」 이면 아니다 — 「안 고쳐」 는 안 고친다는 말이다.
|
|
1162
|
+
* (3) 같은 문장 앞쪽에 물음말(어떻게·왜·뭘…)이 있으면 아니다 — 「이 에러
|
|
1163
|
+
* 어떻게 수정해」 는 물음표를 안 쳤을 뿐 묻는 말이다.
|
|
1164
|
+
* 계획거리 예외(「계획 좀 수정해」)는 위 무늬와 같은 자리에 같이 건다.
|
|
1165
|
+
* (6회차 Gemini 길고르기6d 지적을 실행으로 확인.)
|
|
1166
|
+
*/
|
|
1167
|
+
const 반말꼴 = (v) => (해붙는동사.has(v) ? `${v}해` : v === '만들' ? '만들어' : /[어아워쳐꿔겨눠봐]$/.test(v) ? v : null);
|
|
1168
|
+
const 반말로 = (목록) => 목록.map(반말꼴).filter(Boolean).join('|');
|
|
1169
|
+
const 계획말고반말 = 반말로(동사들.filter((v) => !계획손질.has(v)));
|
|
1170
|
+
const 계획도반말 = 반말로(동사들.filter((v) => 계획손질.has(v)));
|
|
1171
|
+
const 반말앞 = '(?<!(?:안|못)\\s?)(?<!(?:어떻게|왜|뭘|뭐|무엇을|어디를?|언제|어느)[^.!?\\n]{0,20})';
|
|
1172
|
+
const 반말끝맺음 = '(?=[.!~]*[ \\t]*(?:\\n|$)|[.!~]+\\s)';
|
|
1173
|
+
const 반말시킴 = new RegExp(`${반말앞}(?:${[
|
|
1174
|
+
계획말고반말 && `(?:${계획말고반말})`,
|
|
1175
|
+
계획도반말 && `${계획거리뒤}(?:${계획도반말})`,
|
|
1176
|
+
].filter(Boolean).join('|')})${반말끝맺음}`);
|
|
1177
|
+
|
|
992
1178
|
// 파일을 못 고치는 모드. modes.js 에서 쓰기 도구를 안 주는 것들과 같아야 한다.
|
|
993
1179
|
export const 읽기만하는모드 = new Set(['architect', 'plan', 'ask', 'inspect']);
|
|
994
1180
|
|
|
@@ -1021,24 +1207,45 @@ const 영어손대라 = 영어시킴말;
|
|
|
1021
1207
|
/** 파일을 손대라는 말이 들었나. */
|
|
1022
1208
|
export function 손대라했나(text) {
|
|
1023
1209
|
const s = String(text ?? '');
|
|
1024
|
-
return 손대라는말.test(s) || 영어손대라.test(s);
|
|
1210
|
+
return 손대라는말.test(s) || 반말시킴.test(s) || 영어손대라.test(s);
|
|
1025
1211
|
}
|
|
1026
1212
|
|
|
1213
|
+
/*
|
|
1214
|
+
* ── 승인받을 사람이 없는 자리 ───────────────────────────────────────────
|
|
1215
|
+
*
|
|
1216
|
+
* 겹침의 값은 「계획을 보여 주고 **승인을 받아** 그대로 잇는다」 다. 그 값은
|
|
1217
|
+
* 승인할 사람이 있어야 생긴다.
|
|
1218
|
+
*
|
|
1219
|
+
* `deel run` 은 물어볼 사람이 없는 자리다(그 검사 파일의 머리글이 바로 「물어볼
|
|
1220
|
+
* 사람이 없는 자리에서 서지 않고 끝나는가」 다). 거기서 겹침을 계획 모드로
|
|
1221
|
+
* 보내면 계획을 한 장 찍고 끝난다 — 계획 모드는 파일을 고치는 도구가 없다.
|
|
1222
|
+
* 승인 창은 뜰 자리가 없고, 이어 갈 턴도 없다. 시킨 일의 절반도 못 준다.
|
|
1223
|
+
*
|
|
1224
|
+
* 그래서 부르는 쪽이 「여기는 승인받을 수 있는 자리인가」 를 말한다. 없다고
|
|
1225
|
+
* 하면 겹침 갈래를 건너뛰고 점수표대로 고른다 — 「정리해서 만들어줘」 는
|
|
1226
|
+
* 코드 모드로 가서 정리도 하고 만들기도 한다.
|
|
1227
|
+
*
|
|
1228
|
+
* 겹쳤다는 사실 자체는 그대로 돌려준다. 부르는 쪽이 「계획도 같이 달라는
|
|
1229
|
+
* 말이었다」 고 한 줄 적을 수 있어야 한다.
|
|
1230
|
+
*/
|
|
1231
|
+
|
|
1027
1232
|
/**
|
|
1028
1233
|
* 이 한마디가 무슨 일인지 고른다.
|
|
1029
1234
|
*
|
|
1030
1235
|
* @param {string} text 사용자가 친 말
|
|
1236
|
+
* @param {{승인받을수있나?: boolean}} [어떻게] 승인받을수있나 가 false 면
|
|
1237
|
+
* 겹친 요청을 계획 모드로 안 보낸다 (물어볼 사람이 없는 자리).
|
|
1031
1238
|
* @returns {{ mode: string|null, score: number, why: string, 겹침: boolean, 점수들: object }}
|
|
1032
1239
|
* mode 가 null 이면 '모르겠다' 는 뜻이다 — 종합 모드에 그대로 둔다.
|
|
1033
1240
|
* 겹침이 true 면 계획을 내고 승인을 받아 실행까지 이어야 한다는 뜻이다.
|
|
1034
1241
|
*/
|
|
1035
|
-
export function route(text) {
|
|
1242
|
+
export function route(text, { 승인받을수있나 = true } = {}) {
|
|
1036
1243
|
const s = String(text ?? '');
|
|
1037
1244
|
|
|
1038
1245
|
// 겹친 요청은 점수표보다 먼저 본다. 점수표에 맡기면 '만들어' 가 이겨서
|
|
1039
1246
|
// 계획을 건너뛴다 — 그게 바로 이 길을 만든 이유다.
|
|
1040
1247
|
const 겹 = 겹친요청(s);
|
|
1041
|
-
if (겹.겹침) return { mode: 'plan', score: 0, why: 겹.why, 겹침: true, 점수들: {} };
|
|
1248
|
+
if (겹.겹침 && 승인받을수있나) return { mode: 'plan', score: 0, why: 겹.why, 겹침: true, 점수들: {} };
|
|
1042
1249
|
|
|
1043
1250
|
const 점수들 = {};
|
|
1044
1251
|
const 근거 = {};
|
|
@@ -1063,7 +1270,20 @@ export function route(text) {
|
|
|
1063
1270
|
* 되고, 그 눈금은 아무도 못 지킨다. 여기서 가르는 것은 정도의 문제가 아니라
|
|
1064
1271
|
* 종류의 문제다 — 고칠 수 있는 자리인가 아닌가.
|
|
1065
1272
|
*/
|
|
1066
|
-
|
|
1273
|
+
/*
|
|
1274
|
+
* 승인받을 자리가 없는데 겹친 요청이면 여기서도 뺀다.
|
|
1275
|
+
*
|
|
1276
|
+
* 겹쳤다는 것은 「실행하라는 절반이 분명히 있다」 는 뜻이다. 그런데 물어볼
|
|
1277
|
+
* 사람이 없으면 계획 모드는 계획 한 장으로 끝난다. 「plan and then build
|
|
1278
|
+
* it」 이 그랬다 — 겹침 갈래를 건너뛰어도 점수표의 `plan` 5점이 이겨서
|
|
1279
|
+
* 그대로 읽기 전용 모드로 갔다. 건너뛰는 것만으로는 모자란다.
|
|
1280
|
+
*/
|
|
1281
|
+
const 손대라했다 = 손대라했나(s);
|
|
1282
|
+
const 승인자리없다 = 겹.겹침 && !승인받을수있나;
|
|
1283
|
+
const 손대라 = 손대라했다 || 승인자리없다;
|
|
1284
|
+
// 왜 뺐는지는 화면에 그대로 뜬다. 두 까닭은 사람에게 아주 다른 말이라,
|
|
1285
|
+
// 하나로 뭉뚱그리면 「고치라고 한 적 없는데」 하고 막힌다.
|
|
1286
|
+
const 뺀까닭 = 손대라했다 ? '고치라는 말이라' : '승인받을 자리가 없어서';
|
|
1067
1287
|
const 뺀것 = [];
|
|
1068
1288
|
let 순위 = Object.entries(점수들).sort((a, b) => b[1] - a[1]);
|
|
1069
1289
|
if (손대라) {
|
|
@@ -1086,7 +1306,7 @@ export function route(text) {
|
|
|
1086
1306
|
*
|
|
1087
1307
|
* 그래서 글이 길면 **더 뚜렷할 때만** 고른다. 못 고르면 종합에 그대로
|
|
1088
1308
|
* 두는데, 긴 명세에는 그게 오히려 맞는 답이다 — 종합은 걸음마다 단계를
|
|
1089
|
-
* 따라가므로(agent
|
|
1309
|
+
* 따라가므로(agent/phase.js) 계획에서 시작해 만들기로 알아서 넘어간다.
|
|
1090
1310
|
*/
|
|
1091
1311
|
const 긴글 = s.length >= 1500;
|
|
1092
1312
|
const 더줘야 = 긴글 ? 2 : 0;
|
|
@@ -1114,12 +1334,19 @@ export function route(text) {
|
|
|
1114
1334
|
* 안 보낸다」 는 그대로 맞다 — 그런데 그것은 **설계로 보내지 말라**는 말
|
|
1115
1335
|
* 이지, 그 글이 디버그라는 말이 아니다. 뺀 것이 남은 으뜸보다 세다면 이
|
|
1116
1336
|
* 글이 무엇인지는 아직 안 정해진 것이다. 종합에 둔다 — 종합은 걸음마다
|
|
1117
|
-
* 단계를 따라가므로(agent
|
|
1337
|
+
* 단계를 따라가므로(agent/phase.js) 계획에서 시작해 만들기로 넘어간다.
|
|
1118
1338
|
*
|
|
1119
1339
|
* 짧은 말에는 안 건다. 짧은 말에서는 낱말 하나가 곧 뜻이다.
|
|
1120
1340
|
*/
|
|
1121
1341
|
const 뺀최고 = Math.max(0, ...뺀것.map((m) => 점수들[m] ?? 0));
|
|
1122
|
-
|
|
1342
|
+
/*
|
|
1343
|
+
* 동점도 지나가는 말이다. 「뺀 것이 남은 으뜸보다 세면 안 정해진 것」 이라 적어 놓고 `<` 로 재서, 설계 10 ·
|
|
1344
|
+
* 디버그 10 인 긴 글이 디버그로 갔다 — 같은 세기면 더더욱 안 정해진 것이다. 그리고 남은 으뜸이 **0점**이면
|
|
1345
|
+
* 그건 으뜸이 아니다: 화면이 「architect(10점) 가 debug(0점) 보다 세서 debug 로 안 봄」 이라고, 신호가
|
|
1346
|
+
* 하나도 없던 모드를 견준 것처럼 적었다 (6회차 Gemini 길고르기6 e3·e4). 0점이면 아래 「신호가 있었지만
|
|
1347
|
+
* 고치라는 말이라」 갈래로 간다.
|
|
1348
|
+
*/
|
|
1349
|
+
const 지나가는말 = 긴글 && Boolean(으뜸) && 점수 > 0 && 점수 <= 뺀최고;
|
|
1123
1350
|
|
|
1124
1351
|
// 골랐어야 할 만한 신호가 있었는데 일부러 안 보낸 자리인가.
|
|
1125
1352
|
const 일부러 = Boolean(지나가는말 || 뺀것.length
|
|
@@ -1134,7 +1361,7 @@ export function route(text) {
|
|
|
1134
1361
|
: 긴글 && 으뜸 && 점수 >= (문턱[으뜸] ?? 4)
|
|
1135
1362
|
? `글이 길어 ${으뜸} 신호 하나로는 안 정함 — 종합에서 단계를 따라갑니다`
|
|
1136
1363
|
: 뺀것.length
|
|
1137
|
-
? `${뺀것.join('·')} 신호가 있었지만
|
|
1364
|
+
? `${뺀것.join('·')} 신호가 있었지만 ${뺀까닭} 읽기 전용 모드로 안 보냄`
|
|
1138
1365
|
: '무슨 일인지 뚜렷하지 않음';
|
|
1139
1366
|
/*
|
|
1140
1367
|
* ── 「일부러 안 골랐다」 와 「그냥 모르겠다」 는 다른 말이다 ─────────
|
|
@@ -1149,7 +1376,7 @@ export function route(text) {
|
|
|
1149
1376
|
* 그래서 **가르는 일을 여기서 한다.** 부르는 쪽이 `뺀것.length` 니
|
|
1150
1377
|
* `글이 길` 이니를 다시 헤아리게 두면 두 자리에서 따로 어긋난다.
|
|
1151
1378
|
*/
|
|
1152
|
-
return { mode: null, score: 점수, why: 왜, 겹침:
|
|
1379
|
+
return { mode: null, score: 점수, why: 왜, 겹침: 겹.겹침, 점수들, 뺀것, 일부러 };
|
|
1153
1380
|
}
|
|
1154
1381
|
|
|
1155
1382
|
// 1·2등이 붙으면 고르지 않는다. 반반인 것을 억지로 정하면 절반은 틀린다.
|
|
@@ -1157,7 +1384,7 @@ export function route(text) {
|
|
|
1157
1384
|
if (점수 - 둘째 < 2 && 둘째 >= (문턱[순위[1][0]] ?? 4)) {
|
|
1158
1385
|
return {
|
|
1159
1386
|
mode: null, score: 점수, why: `${으뜸} 과 ${순위[1][0]} 가 비슷함`,
|
|
1160
|
-
겹침:
|
|
1387
|
+
겹침: 겹.겹침, 점수들, 뺀것, 일부러: true,
|
|
1161
1388
|
};
|
|
1162
1389
|
}
|
|
1163
1390
|
|
|
@@ -1165,8 +1392,8 @@ export function route(text) {
|
|
|
1165
1392
|
mode: 으뜸,
|
|
1166
1393
|
score: 점수,
|
|
1167
1394
|
why: [근거[으뜸].slice(0, 2).map((x) => `'${x}'`).join(', '),
|
|
1168
|
-
뺀것.length ? `(${뺀것.join('·')} 는
|
|
1169
|
-
겹침:
|
|
1395
|
+
뺀것.length ? `(${뺀것.join('·')} 는 ${뺀까닭} 뺐습니다)` : ''].filter(Boolean).join(' '),
|
|
1396
|
+
겹침: 겹.겹침,
|
|
1170
1397
|
점수들,
|
|
1171
1398
|
};
|
|
1172
1399
|
}
|
package/src/agent/salvage.js
CHANGED
|
@@ -151,7 +151,8 @@ export function 살린쓰기(raw) {
|
|
|
151
151
|
if (typeof path !== 'string' || !path.trim()) return null;
|
|
152
152
|
if (typeof body !== 'string' || !body) return null;
|
|
153
153
|
// 경로 자체가 잘렸으면 엉뚱한 자리에 쓴다. 그건 안 건진다.
|
|
154
|
-
|
|
154
|
+
// 위에서 경로로 받는 이름 셋을 **다** 본다 — filePath 를 빠뜨려 「src/inde」 에 쓸 뻔했다 (6회차 L1).
|
|
155
|
+
if (r.truncatedKey === 'file_path' || r.truncatedKey === 'path' || r.truncatedKey === 'filePath') return null;
|
|
155
156
|
|
|
156
157
|
// 내용이 온전히 다 왔는데도 JSON 이 깨진 것이라면(뒤쪽 다른 인자에서 잘림)
|
|
157
158
|
// 마지막 줄을 버릴 이유가 없다.
|