deel-local-cli 1.20.12 → 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 -77
- package/README.md +119 -80
- package/bin/deel.js +398 -32
- package/package.json +2 -1
- package/src/acp/jsonrpc.js +87 -7
- package/src/acp/map.js +62 -13
- package/src/acp/serve.js +338 -30
- 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 +506 -32
- 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 +40 -9
- 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,13 +442,30 @@ 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
|
|
|
374
450
|
ask: [
|
|
375
451
|
// 설명은 아무것도 안 바꾸는 모드라 잘못 고르면 답답해진다. 신호를 엄격히 본다.
|
|
376
|
-
|
|
452
|
+
/*
|
|
453
|
+
* ── 물음표 **뒤에** 한마디를 더 붙이면 물음이 아니게 됐다 ─────────
|
|
454
|
+
*
|
|
455
|
+
* 줄 끝(`$`)에 못박혀 있었다. 그런데 사람은 물음표로 말을 안 끝낸다 —
|
|
456
|
+
*
|
|
457
|
+
* "이거 뭐야?" → ask 5점 → 설명 모드
|
|
458
|
+
* "이거 뭐야? 알려줘" → ask 3점 → 종합 모드
|
|
459
|
+
*
|
|
460
|
+
* 「알려줘」 를 붙였더니 물음이 아닌 것이 됐다. 붙인 말은 **더 설명해
|
|
461
|
+
* 달라는 말**인데 점수가 되레 깎였다(5 → 3). 남은 '알려 줘' 3점은
|
|
462
|
+
* 문턱 5에 모자라서 종합으로 떨어졌다.
|
|
463
|
+
*
|
|
464
|
+
* 물음표가 있으면 그 자리가 문장 끝이다. 줄 끝이 아니어도 된다.
|
|
465
|
+
* 물음표가 없을 때만 줄 끝을 따진다 — "뭐야 이게" 같은 말을 아무 데서나
|
|
466
|
+
* 줍지 않으려는 것이 원래 못의 뜻이었고, 그건 그대로 둔다.
|
|
467
|
+
*/
|
|
468
|
+
[/뭐(야|예요|입니까|지)\s*(?:\?|$)/m, 5], [/무엇(인가|입니까|이야)/, 5],
|
|
377
469
|
/*
|
|
378
470
|
* 「뭐 하는 파일이야?」 — 터미널에서 돌려 보다 걸린 자리다.
|
|
379
471
|
*
|
|
@@ -385,7 +477,8 @@ export const 표 = {
|
|
|
385
477
|
*/
|
|
386
478
|
[/뭐\s*하는\s*(파일|함수|코드|모듈|클래스|녀석|건|거|것)/, 5],
|
|
387
479
|
[/뭐\s*하(는|나|니|냐)/, 3], [/무슨\s*(일|역할)/, 3],
|
|
388
|
-
|
|
480
|
+
// 「설명만 해줘」 — 설명 뒤 「만」 을 안 받아 0점이었다. 설명만 달라는 말은 가장 뚜렷한 묻기다 (6회차 Gemini 길고르기6 b4).
|
|
481
|
+
[/설명(해|\s*좀|을|만)/, 5], [/알려\s*(줘|주세요|줄래)/, 3],
|
|
389
482
|
[/어떻게\s*(동작|작동|돌아가)/, 5],
|
|
390
483
|
/*
|
|
391
484
|
* 「어떻게 …?」 는 영어 `how to` 와 같은 물음인데 '동작·작동·돌아가'
|
|
@@ -476,10 +569,60 @@ export const 표 = {
|
|
|
476
569
|
* 문제가 아니라 **낱말 문제**다. 「말해 줘」 는 `explain` 과 같은 부류의
|
|
477
570
|
* 물음 시킴말이라 그쪽에 넣는다 — 못을 뽑으면 위의 `Rewrite how to` 가
|
|
478
571
|
* 도로 열린다.
|
|
572
|
+
*
|
|
573
|
+
* ── 공손한 한마디가 못 앞에 끼어들었다 ──────────────────────────────
|
|
574
|
+
*
|
|
575
|
+
* 첫머리 못을 `^\s*` 로 박아 놓으니 **빈칸 말고는 아무것도** 앞에 못
|
|
576
|
+
* 온다. 그런데 영어로 묻는 사람은 그 자리에 거의 항상 한마디를 붙인다 —
|
|
577
|
+
*
|
|
578
|
+
* "tell me what this does" → ask 5점
|
|
579
|
+
* "Please tell me what this does" → 전부 0점 → 종합 모드
|
|
580
|
+
* "Could you tell me what this does" → 전부 0점 → 종합 모드
|
|
581
|
+
*
|
|
582
|
+
* 공손하게 물을수록 물음으로 안 읽혔다. 답만 하면 되는 턴이 파일을
|
|
583
|
+
* 고칠 수 있는 모드로 돌았다는 뜻이다.
|
|
584
|
+
*
|
|
585
|
+
* 그래서 못 바로 뒤에 **공손말 한 마디**를 허락한다. 못을 뽑는 것이
|
|
586
|
+
* 아니다 — "Rewrite this function to show me the result." 은 여전히
|
|
587
|
+
* 0점이다. 그 자리의 `to show` 앞에는 공손말이 아니라 딴 말이 있다.
|
|
588
|
+
*
|
|
589
|
+
* 한 마디가 아니라 **두 마디**가 붙기도 한다. "Please could you tell
|
|
590
|
+
* me …" 는 실제로 흔한데, 세로줄로 갈라 놓으면 둘 중 하나만 먹고
|
|
591
|
+
* 나머지가 남아 통째로 0점이 됐다. 그래서 갈래가 아니라 차례로 둔다.
|
|
592
|
+
*
|
|
593
|
+
* `what` · `how` 쪽에는 `please` 만 준다. 「Could you what …」 은 영어에
|
|
594
|
+
* 없는 꼴이라 받아 봐야 걸릴 자리가 없다.
|
|
595
|
+
*
|
|
596
|
+
* ── 물어보고 **나서 고치라**는 한 문장 ───────────────────────────
|
|
597
|
+
*
|
|
598
|
+
* "Please show me the config and rename it to config.json."
|
|
599
|
+
* "Could you tell me what changed and update the changelog?"
|
|
600
|
+
*
|
|
601
|
+
* 공손말을 받아 주자 이것들이 5점을 꽉 채워 **묻기 모드**로 갔다. 묻기는
|
|
602
|
+
* 파일을 못 고치는 모드라, 사람은 설명만 받고 이름은 그대로다. 공손말을
|
|
603
|
+
* 받기 전에는 0점이라 종합(고칠 수 있는 자리)에 남아 있었으니, 이 변경이
|
|
604
|
+
* 없던 자리를 만든 셈이다.
|
|
605
|
+
*
|
|
606
|
+
* `and`·`then` 으로 이은 시킴 마디가 같은 문장에 있으면 이 규칙을 끈다.
|
|
607
|
+
* 「and why」 「and how it works」 처럼 움직씨가 아닌 것은 안 건드린다.
|
|
608
|
+
*/
|
|
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
|
+
* 자리라, 둘이 서로 다른 데를 지킨다.
|
|
479
623
|
*/
|
|
480
|
-
[
|
|
481
|
-
[/(?:^\s*|[.!?]\s+|\n\s*)
|
|
482
|
-
[/(?:^\s*|[.!?]\s+|\n\s*)how\b(?:(?:[^.!?\n]|\.(?=[\w/]))*\?|'s\b|\s+(?:to\b|does|do|did|is|are|was|were|can|should)\b)/im, 5],
|
|
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],
|
|
483
626
|
[/읽어(만)?\s*보고\s*(설명|알려)/, 4],
|
|
484
627
|
],
|
|
485
628
|
|
|
@@ -499,8 +642,21 @@ export const 표 = {
|
|
|
499
642
|
],
|
|
500
643
|
|
|
501
644
|
code: [
|
|
502
|
-
|
|
503
|
-
[
|
|
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],
|
|
504
660
|
[/구현(해|\s*좀)/, 5],
|
|
505
661
|
[/바꿔(줘|주세요)?|변경(해|\s*좀)/, 3],
|
|
506
662
|
[/지워(줘)?|삭제(해|\s*좀)/, 3],
|
|
@@ -541,7 +697,7 @@ export const 표 = {
|
|
|
541
697
|
* 겹침을 막는 자리는 겹치는 쪽과 **같은 꼴**을 봐야 한다.
|
|
542
698
|
*/
|
|
543
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],
|
|
544
|
-
[
|
|
700
|
+
[/써\s*(줘|주세요)/, 3],
|
|
545
701
|
/*
|
|
546
702
|
* 「짜다」 는 코드·검사를 만들라는 한국어에서 제일 흔한 말인데
|
|
547
703
|
* '써 줘' 만 있었다. 계획·순서·구조를 짜는 것은 각각 plan·architect
|
|
@@ -581,11 +737,60 @@ const 문턱 = {
|
|
|
581
737
|
* 쪽이다. '고쳐줘' 한마디에 창이 뜨면 그게 더 나쁘다.
|
|
582
738
|
* 그래서 **계획말 + 잇는말** 이 앞에 있고 그 **뒤에** 실행말이 와야만 겹침이다.
|
|
583
739
|
*/
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
740
|
+
/*
|
|
741
|
+
* '알아보' 가 아니라 '알아' 다. 「알아보고」 는 '알아' + '보고' 로 갈라야
|
|
742
|
+
* 아래 잇는말의 '보고' 와 이어진다. '알아보' 로 묶어 두면 남는 것이 '고'
|
|
743
|
+
* 하나뿐이라 어떤 잇는말과도 안 맞았다 — 아래 머리말 참고.
|
|
744
|
+
*/
|
|
745
|
+
const 계획말 = '계획|플랜|설계|구상|기획|정리|검토|조사|파악|살펴|알아|분석|로드맵|방향|순서|밑그림|초안';
|
|
746
|
+
/*
|
|
747
|
+
* '정리하고' 처럼 잇는 꼴이어야 한다. 그냥 '정리' 하나로는 겹침이 아니다 —
|
|
748
|
+
* "코드 정리해줘" 는 계획이 아니라 그 자체가 할 일이다.
|
|
749
|
+
*
|
|
750
|
+
* ── 한국말에서 가장 흔한 이음꼴이 빠져 있었다 ───────────────────────────
|
|
751
|
+
*
|
|
752
|
+
* 「…해 보고」 다. 「살펴보고」 「알아보고」 「검토해 보고」 — 계획을 먼저
|
|
753
|
+
* 하고 그다음에 하라는 말을 사람들이 실제로 제일 많이 쓰는 꼴인데, 목록에
|
|
754
|
+
* 없었다. 그래서 이 규칙이 잡으라고 만들어진 바로 그 문장이 안 잡혔다 —
|
|
755
|
+
*
|
|
756
|
+
* "살펴보고 만들어줘" → 겹침 아님 → code 모드 → 계획 한 줄 없이 파일부터
|
|
757
|
+
* "정리하고 만들어줘" → 겹침 → 계획을 보여 주고 승인을 받음
|
|
758
|
+
*
|
|
759
|
+
* 같은 말인데 이음꼴 하나로 갈렸다. 앞의 사람은 「먼저 보고 나서」 라고
|
|
760
|
+
* 적어 놓고도 계획을 못 봤다.
|
|
761
|
+
*
|
|
762
|
+
* ── 「보고」 를 이름씨와 가르는 자리 ────────────────────────────────────
|
|
763
|
+
*
|
|
764
|
+
* 처음엔 `보고(?![서를가])` 하나로 막았다. 「검토 보고서를 만들어줘」 는
|
|
765
|
+
* 겹침이 아니라 그냥 할 일이니 맞는 방향이었는데, **가르는 자리가 틀렸다.**
|
|
766
|
+
* 「살펴보고서 만들어줘」 의 '-고서' 는 이름씨가 아니라 멀쩡한 이음씨끝인데
|
|
767
|
+
* 같이 막혔다. 뒤에 뭐가 오느냐만 봐서는 둘을 못 가른다.
|
|
768
|
+
*
|
|
769
|
+
* 앞을 봐야 갈린다 — 그런데 「빈칸이 있나」 가 아니라 **앞말이 무엇이냐** 다.
|
|
770
|
+
*
|
|
771
|
+
* "살펴보고서 만들어줘" — 앞이 움직씨 줄기(살펴) → 이음말
|
|
772
|
+
* "검토보고서 작성해줘" — 앞이 이름씨(검토) → '보고서' 라는 한 낱말
|
|
773
|
+
*
|
|
774
|
+
* 처음엔 빈칸만 보고 갈랐다. 붙어 있으면 이음말로 쳤더니 「검토보고서」
|
|
775
|
+
* 「분석보고서」 가 통째로 겹침이 됐다 — 보고서를 써 달라는 말이 계획 모드로
|
|
776
|
+
* 가서 계획만 내고 멈춘다. 빈칸은 우연이고, 갈리는 것은 앞말의 품사다.
|
|
777
|
+
*
|
|
778
|
+
* '살펴·알아' 는 움직씨 줄기라 뒤에 오는 '보고' 가 언제나 도움움직씨다.
|
|
779
|
+
* '검토·분석·조사' 는 이름씨라 '보고' 가 붙으면 한 낱말이 된다. 이름씨 쪽은
|
|
780
|
+
* '해' 를 끼워야 도움움직씨가 된다 — 「검토해 보고」. 그 꼴에는 뒷말을
|
|
781
|
+
* 따진다(「검토해 보고서를」 은 다시 이름씨다).
|
|
782
|
+
*/
|
|
783
|
+
const 이름씨아님 = '(?![서를가에의는도만까와과])';
|
|
784
|
+
const 잇는말 = '해\\s*주고|해\\s*놓고|하고\\s*나서|하고서|한\\s*다음|한\\s*뒤|한\\s*후|하고|해서|잡고|짜고|세우고|낸\\s*뒤|낸\\s*다음'
|
|
785
|
+
+ `|(?<=(?:살펴|알아)\\s{0,1})보고|해\\s*보고${이름씨아님}`
|
|
786
|
+
+ '|(?<=(?:살펴|알아)\\s{0,1})본\\s*(?:다음|뒤|후)|해\\s*본\\s*(?:다음|뒤|후)';
|
|
787
|
+
/*
|
|
788
|
+
* 이름씨 뿌리(구현·작성·생성·세팅·설치·배포)는 **해·하·좀** 이 붙어야 실행말이다. 맨 뿌리로 두었더니
|
|
789
|
+
* 「살펴보고 작성자 확인해줘」 의 작성자, 「검토하고 설치 경로 알려줘」 의 설치 가 걸려 조회가 겹친 요청
|
|
790
|
+
* (계획 모드 + 승인 창)이 됐다 (6회차 Gemini 길고르기6 c3). 사이에 토씨 하나(을·은·도·까지·만)는 넘는다 —
|
|
791
|
+
* 「구현은 해줘」 「배포까지 해줘」.
|
|
792
|
+
*/
|
|
793
|
+
const 실행말 = /만들어|만들자|만들어라|(?:구현|작성|생성|세팅|설치|배포)(?=\s*(?:을|를|은|는|도|까지|만)?\s*(?:해|하|좀))|추가(해|하)|써\s*(줘|주세요)|짜\s*(줘|주세요)|고쳐/;
|
|
589
794
|
const 계획먼저 = new RegExp(`(${계획말})\\s*(?:을|를)?\\s*(?:${잇는말})`);
|
|
590
795
|
/*
|
|
591
796
|
* 영어도 같이 본다 — "plan and then build it" 처럼 붙여 넣는 일이 있다.
|
|
@@ -606,8 +811,67 @@ const 계획먼저 = new RegExp(`(${계획말})\\s*(?:을|를)?\\s*(?:${잇는
|
|
|
606
811
|
*
|
|
607
812
|
* 그래서 쉼표를 뺀다. 차례를 뜻하는 말이 있을 때만 겹침이다. 한국어 쪽은
|
|
608
813
|
* 처음부터 잇는말 목록으로 이렇게 하고 있었고, 영어 쪽만 헐거웠다.
|
|
814
|
+
*
|
|
815
|
+
* ── 쉼표를 목록에서만 뺐지, 지나가는 길은 안 막았다 ─────────────────────
|
|
816
|
+
*
|
|
817
|
+
* 위를 그렇게 고쳐 놓고도 **바로 그 예문이 여전히 겹침으로 잡혔다.**
|
|
818
|
+
*
|
|
819
|
+
* "independently design, implement, test, and build the feature"
|
|
820
|
+
*
|
|
821
|
+
* 이음말 목록에서 `,` 를 뺀 것은 맞다. 그런데 목록에 남아 있던 맨 `and` 가
|
|
822
|
+
* `design` 에서 예순 자 떨어진 **맨 끝의 `, and build`** 와 짝지어졌다.
|
|
823
|
+
* 사이의 쉼표들은 `[\s\S]{0,60}?` 가 그냥 지나갔다. 열거를 차례로 읽는
|
|
824
|
+
* 결과는 처음과 똑같았다 — 계획 모드로 가서 계획만 내고 멈춘다.
|
|
825
|
+
*
|
|
826
|
+
* 그래서 길을 나눈다.
|
|
827
|
+
*
|
|
828
|
+
* - `and then` · `then` · `after that` · `before you` 처럼 **차례를 적어
|
|
829
|
+
* 둔 말**이면 사이에 쉼표가 있어도 겹침이다 ("Plan the migration,
|
|
830
|
+
* then implement it" — 사람이 차례라고 썼다).
|
|
831
|
+
* - 맨 `and` 하나로 잇는 것은 **쉼표를 하나까지만 넘는다** ("Design and
|
|
832
|
+
* implement" 과 "Plan the migration, and implement it" 은 겹침,
|
|
833
|
+
* "design, implement, test, and build" 는 열거).
|
|
834
|
+
*
|
|
835
|
+
* 쉼표 하나를 남겨 둔 까닭은, 영어에서 `and` 앞에 쉼표를 찍는 것이 그냥
|
|
836
|
+
* 흔해서다. 열거와 갈리는 자리는 **쉼표가 몇 개냐** 다 — 열거는 `and` 에
|
|
837
|
+
* 닿기까지 쉼표를 여러 번 넘어야 하고, 차례는 많아야 한 번이다.
|
|
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
|
+
*
|
|
850
|
+
* ── `the design` 은 계획을 세우라는 말이 아니다 ─────────────────────────
|
|
851
|
+
*
|
|
852
|
+
* 이 네 낱말은 움직씨이기도 하고 이름씨이기도 하다. 앞에 관사가 붙으면
|
|
853
|
+
* 이름씨다 — 그때는 계획을 세우라는 말이 아니라 그냥 무엇을 가리키는 말이다.
|
|
854
|
+
*
|
|
855
|
+
* "The design is fine. Run the linter and write the changelog."
|
|
856
|
+
* "Our plan is approved. Open the file and make the change."
|
|
857
|
+
*
|
|
858
|
+
* 둘 다 겹침으로 잡혀 계획 모드로 갔다. 뒤의 것은 사람이 **이미 승인됐다고
|
|
859
|
+
* 적어 놨는데** 또 계획을 내고 승인을 물었다.
|
|
860
|
+
*
|
|
861
|
+
* 맨 `and` 갈래는 문장 끝도 못 넘게 한다. 쉼표보다 센 구분자인데 `[^,]` 가
|
|
862
|
+
* 마침표·물음표·줄바꿈을 다 지나갔다. 그리고 `\s*` 는 상한이 없어서 예순 자
|
|
863
|
+
* 잣대가 빈칸으로 뚫렸다 — `[ \t]*` 로 좁힌다.
|
|
609
864
|
*/
|
|
610
|
-
|
|
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;
|
|
611
875
|
|
|
612
876
|
/*
|
|
613
877
|
* ── 두 말이 **얼마나 붙어 있어야** 겹침인가 ─────────────────────────────
|
|
@@ -673,6 +937,30 @@ export function 겹친요청(text) {
|
|
|
673
937
|
const 남은것 = s.slice(앞.index + 앞[0].length, 앞.index + 앞[0].length + 겹침거리);
|
|
674
938
|
const 뒤 = 남은것.match(실행말);
|
|
675
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: '' };
|
|
676
964
|
return { 겹침: true, why: `'${앞[0].trim()}' 뒤에 '${뒤[0].trim()}'` };
|
|
677
965
|
}
|
|
678
966
|
|
|
@@ -740,7 +1028,152 @@ export const 손대는동사 = '만들|고쳐|고치|바꿔|바꾸|추가|넣어
|
|
|
740
1028
|
* (`\\S{0,3}` 는 처음부터 두 개라 멀쩡했다. 한 무늬 안에서 한쪽만 틀렸으니
|
|
741
1029
|
* 눈으로는 더 안 보인다.)
|
|
742
1030
|
*/
|
|
743
|
-
|
|
1031
|
+
/*
|
|
1032
|
+
* ── 띄어쓰기 한 칸이 시킴말을 통째로 숨겼다 ─────────────────────────────
|
|
1033
|
+
*
|
|
1034
|
+
* 사이를 `\S{0,3}` 로 적어서 **빈칸을 하나도 못 넘었다.** 그런데 「수정해 줘」
|
|
1035
|
+
* 「고쳐 줘」 는 맞춤법대로 띄어 쓴 꼴이다. 그래서 같은 말이 이렇게 갈렸다 —
|
|
1036
|
+
*
|
|
1037
|
+
* "이 구조를 살펴보고 코드 수정해줘" → code 모드
|
|
1038
|
+
* "이 구조를 살펴보고 코드 수정해 줘" → 종합 (손대라는 말이 아닌 것으로 읽힘)
|
|
1039
|
+
*
|
|
1040
|
+
* 모드만 갈린 것이 아니다. 이 검사는 「하라고 한 일을 두고 무슨 일을 할지
|
|
1041
|
+
* 되묻지 않는다」 는 자리(askcheck.js)에도 쓰인다. 띄어 쓴 사람은 그 그물이
|
|
1042
|
+
* 통째로 안 걸려서, 시켜 놓고도 「무슨 일을 할까요?」 를 다시 받았다.
|
|
1043
|
+
*
|
|
1044
|
+
* 세 글자 상한은 그대로다. 그래서 "나누는 설계만 봐줘" 는 여전히 안 걸린다 —
|
|
1045
|
+
* 「나누」 와 「줘」 사이가 일곱 자다.
|
|
1046
|
+
*/
|
|
1047
|
+
/*
|
|
1048
|
+
* ── 「계획 정리해 줘」 는 계획을 다시 세워 달라는 말이다 ────────────────
|
|
1049
|
+
*
|
|
1050
|
+
* 영어 쪽에는 이 예외가 처음부터 있었다. `Update the plan.` 은 시킴말로 안
|
|
1051
|
+
* 센다 — 고칠 파일 이름이 아니라 **계획 그 자체**가 목적어라서, 계획 모드로
|
|
1052
|
+
* 가는 것이 맞다. 그런데 한국어 쪽에는 그 예외가 없었다.
|
|
1053
|
+
*
|
|
1054
|
+
* "이전 계획 정리해 줘" → 종합
|
|
1055
|
+
* "Update the plan." → 계획
|
|
1056
|
+
*
|
|
1057
|
+
* 같은 말이 언어에 따라 다른 데로 갔다. 한국어로 물은 사람만 계획을 못 받았다.
|
|
1058
|
+
*
|
|
1059
|
+
* 목적어가 계획거리일 때만, 그리고 **계획을 손질하는 뜻의 동사**일 때만
|
|
1060
|
+
* 뺀다. 영어가 그은 선과 같은 자리다 — `Implement the plan we agreed on.`
|
|
1061
|
+
* 은 영어에서도 시킴말이다. 계획을 실행하라는 말은 손대라는 말이 맞다.
|
|
1062
|
+
* 그래서 '구현·추가·삭제…' 는 그대로 두고 '만들·작성·바꾸·정리·수정' 만 뺀다.
|
|
1063
|
+
*
|
|
1064
|
+
* 「계획서」 「plan.md」 는 안 걸린다. 그건 계획거리가 아니라 **파일**이고,
|
|
1065
|
+
* 파일을 고치라는 말은 고치라는 말이다. 영어가 `plan.md` 를 가르는 방법
|
|
1066
|
+
* (`\.(?!\w)`)과 같은 뜻이다.
|
|
1067
|
+
*
|
|
1068
|
+
* 목록을 손대는동사 에서 갈라 내므로, 새 동사를 넣으면 자동으로 「예외 없는」
|
|
1069
|
+
* 쪽에 들어간다 — 예외로 뺀 것은 '만들·작성·바꾸(바꿔)·정리·수정' 다섯 뜻이다.
|
|
1070
|
+
*
|
|
1071
|
+
* 계획거리와 동사 사이에 '좀' 이 끼는 것도 받는다. 「계획 좀 수정해 줘」 는
|
|
1072
|
+
* 「계획 수정해 줘」 와 같은 말인데, 한 글자 때문에 딴 데로 가면 안 된다.
|
|
1073
|
+
*/
|
|
1074
|
+
/*
|
|
1075
|
+
* 계획거리는 plan 점수표에 있는 것만 적는다. '기획' 을 넣어 봤더니 예외는
|
|
1076
|
+
* 걸리는데 갈 데가 없었다 — plan 점수가 0이라 「손대라는 말이 아니다」 까지만
|
|
1077
|
+
* 가고 결국 종합이나 코드로 떨어졌다. 빼는 자리와 보내는 자리가 다르면
|
|
1078
|
+
* 어느 쪽도 제 일을 못 한다.
|
|
1079
|
+
*
|
|
1080
|
+
* 사이에 끼는 말도 받는다. 「계획 다시 정리해 줘」 「계획 좀 더 정리해줘」 는
|
|
1081
|
+
* 「계획 정리해 줘」 와 같은 말이다. 아무 말이나 받으면 「계획 파일 수정해 줘」
|
|
1082
|
+
* 까지 빠지므로, 끼워도 되는 것은 **어찌씨 몇 개**로 못박는다.
|
|
1083
|
+
*/
|
|
1084
|
+
const 계획거리 = '계획|플랜|로드맵';
|
|
1085
|
+
const 끼는말 = '좀|더|다시|새로|전체|모두|싹|한번';
|
|
1086
|
+
const 계획손질 = new Set(['만들', '작성', '바꿔', '바꾸', '정리', '수정']);
|
|
1087
|
+
const 동사들 = 손대는동사.split('|');
|
|
1088
|
+
const 계획도손대는동사 = 동사들.filter((v) => 계획손질.has(v)).join('|');
|
|
1089
|
+
const 계획말고손대는동사 = 동사들.filter((v) => !계획손질.has(v)).join('|');
|
|
1090
|
+
const 계획거리뒤 = `(?<!(?:${계획거리})[을를]?\\s{0,3}(?:(?:${끼는말})\\s{0,3}){0,2})`;
|
|
1091
|
+
/*
|
|
1092
|
+
* ── 빈칸을 넘어도 되는 어미와 안 되는 어미 ──────────────────────────────
|
|
1093
|
+
*
|
|
1094
|
+
* 「빈칸을 하나도 못 넘는다」 를 고치면서 사이를 `[^\n]{0,3}` 으로 열었다.
|
|
1095
|
+
* 그런데 **어미마다 빈칸 사정이 다르다.**
|
|
1096
|
+
*
|
|
1097
|
+
* 빈칸을 넘어야 하는 것은 도움움직씨 '주다' 뿐이다 — 「고쳐 줘」 「고쳐
|
|
1098
|
+
* 주세요」 는 맞춤법대로 띄어 쓴 꼴이다. '하자·해라·어라' 같은 씨끝은
|
|
1099
|
+
* 줄기에서 절대 안 떨어진다.
|
|
1100
|
+
*
|
|
1101
|
+
* 그래서 전부에 빈칸을 열어 줬더니 이런 것이 걸렸다 —
|
|
1102
|
+
*
|
|
1103
|
+
* "추가 하자 있는 부분 알려줘" → 손대라는 말
|
|
1104
|
+
*
|
|
1105
|
+
* '하자' 가 씨끝이 아니라 **이름씨(결함)** 인데, 앞의 '추가' 와 빈칸으로만
|
|
1106
|
+
* 떨어져 있어서 「추가하자」 로 읽혔다. 묻는 말이 고치라는 말이 됐다.
|
|
1107
|
+
*
|
|
1108
|
+
* ── 「고치지 마라」 는 고치라는 말이 아니다 ─────────────────────────────
|
|
1109
|
+
*
|
|
1110
|
+
* 이건 빈칸을 열기 **전부터** 있던 구멍이다(붙여 쓴 「고치지마라」 가 그때도
|
|
1111
|
+
* 걸렸다). 사이가 세 글자라 '지 마' 가 통째로 들어앉고, 남은 '라' 가 시킴꼴
|
|
1112
|
+
* 로 읽힌다. 하지 말라는 말이 하라는 말이 되는 것이라 뒤집힘이 제일 크다.
|
|
1113
|
+
*/
|
|
1114
|
+
/*
|
|
1115
|
+
* ── 맨 「라」 는 시킴꼴이기도 하고 서술격조사이기도 하다 ─────────────────
|
|
1116
|
+
*
|
|
1117
|
+
* "임시 파일 지워라" — 해라체 시킴꼴
|
|
1118
|
+
* "이걸 개선이라 볼 수 있는지 검토해 줘" — 「개선이다」 의 '-이라'
|
|
1119
|
+
*
|
|
1120
|
+
* 뒤엣것이 시킴말로 읽혀서, 검토해 달라는 물음이 「고치라는 말」 이 됐다.
|
|
1121
|
+
* 그러면 점검 모드가 후보에서 빠지고 화면에는 **거꾸로 된 까닭**이 뜬다 —
|
|
1122
|
+
* 「고치라는 말이라 읽기 전용 모드로 안 보냄」. 고치라고 한 적이 없는데.
|
|
1123
|
+
*
|
|
1124
|
+
* 가르는 자리는 줄기의 종류다. '개선·구현·배포' 같은 한자어는 시킴꼴이
|
|
1125
|
+
* 언제나 '…해라' 라 맨 '라' 가 붙을 일이 없다 — 붙었으면 그건 '-이라' 다.
|
|
1126
|
+
* '지워·바꿔·고쳐' 같은 토박이 줄기만 맨 '라' 를 쓴다.
|
|
1127
|
+
*/
|
|
1128
|
+
const 해붙는동사 = new Set(['추가', '삭제', '정리', '개선', '구현', '작성', '적용',
|
|
1129
|
+
'설치', '배포', '리팩터링', '리팩터', '분리', '통일', '세팅', '수정']);
|
|
1130
|
+
const 해붙는것 = 동사들.filter((v) => 해붙는동사.has(v)).join('|');
|
|
1131
|
+
const 맨라 = `${해붙는것 ? `(?<!(?:${해붙는것})이?)` : ''}라(?=[\\s.!?~,]|$)`;
|
|
1132
|
+
const 붙는끝 = `해라|하라|하자|해다오|할래|어라|아라|여라|${맨라}`;
|
|
1133
|
+
const 띄는끝 = '줘|주세요|주라|줄래';
|
|
1134
|
+
const 하지마 = '(?!\\S{0,2}지\\s*마|\\S{0,2}지\\s*말)';
|
|
1135
|
+
/*
|
|
1136
|
+
* 빈 갈래를 안 만든다. 위 두 목록은 손대는동사 를 갈라 낸 것이라, 목록을
|
|
1137
|
+
* 손대다가 한쪽이 비면 `(?:)` 가 되고 **빈 글에 걸린다** — 그러면 모든 말이
|
|
1138
|
+
* 손대라는 말이 되어 읽기 전용 모드가 통째로 사라진다. 아무 데서도 안 터지고
|
|
1139
|
+
* 화면에도 안 나오는 꼴이라, 만들지 않는 쪽으로 막아 둔다.
|
|
1140
|
+
*/
|
|
1141
|
+
const 손대라는말 = new RegExp(`(?:${[
|
|
1142
|
+
계획말고손대는동사 && `(?:${계획말고손대는동사})`,
|
|
1143
|
+
계획도손대는동사 && `${계획거리뒤}(?:${계획도손대는동사})`,
|
|
1144
|
+
].filter(Boolean).join('|')})${하지마}(?:\\S{0,3}(?:${붙는끝})|[^\\n]{0,3}(?:${띄는끝}))`);
|
|
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('|')})${반말끝맺음}`);
|
|
744
1177
|
|
|
745
1178
|
// 파일을 못 고치는 모드. modes.js 에서 쓰기 도구를 안 주는 것들과 같아야 한다.
|
|
746
1179
|
export const 읽기만하는모드 = new Set(['architect', 'plan', 'ask', 'inspect']);
|
|
@@ -774,24 +1207,45 @@ const 영어손대라 = 영어시킴말;
|
|
|
774
1207
|
/** 파일을 손대라는 말이 들었나. */
|
|
775
1208
|
export function 손대라했나(text) {
|
|
776
1209
|
const s = String(text ?? '');
|
|
777
|
-
return 손대라는말.test(s) || 영어손대라.test(s);
|
|
1210
|
+
return 손대라는말.test(s) || 반말시킴.test(s) || 영어손대라.test(s);
|
|
778
1211
|
}
|
|
779
1212
|
|
|
1213
|
+
/*
|
|
1214
|
+
* ── 승인받을 사람이 없는 자리 ───────────────────────────────────────────
|
|
1215
|
+
*
|
|
1216
|
+
* 겹침의 값은 「계획을 보여 주고 **승인을 받아** 그대로 잇는다」 다. 그 값은
|
|
1217
|
+
* 승인할 사람이 있어야 생긴다.
|
|
1218
|
+
*
|
|
1219
|
+
* `deel run` 은 물어볼 사람이 없는 자리다(그 검사 파일의 머리글이 바로 「물어볼
|
|
1220
|
+
* 사람이 없는 자리에서 서지 않고 끝나는가」 다). 거기서 겹침을 계획 모드로
|
|
1221
|
+
* 보내면 계획을 한 장 찍고 끝난다 — 계획 모드는 파일을 고치는 도구가 없다.
|
|
1222
|
+
* 승인 창은 뜰 자리가 없고, 이어 갈 턴도 없다. 시킨 일의 절반도 못 준다.
|
|
1223
|
+
*
|
|
1224
|
+
* 그래서 부르는 쪽이 「여기는 승인받을 수 있는 자리인가」 를 말한다. 없다고
|
|
1225
|
+
* 하면 겹침 갈래를 건너뛰고 점수표대로 고른다 — 「정리해서 만들어줘」 는
|
|
1226
|
+
* 코드 모드로 가서 정리도 하고 만들기도 한다.
|
|
1227
|
+
*
|
|
1228
|
+
* 겹쳤다는 사실 자체는 그대로 돌려준다. 부르는 쪽이 「계획도 같이 달라는
|
|
1229
|
+
* 말이었다」 고 한 줄 적을 수 있어야 한다.
|
|
1230
|
+
*/
|
|
1231
|
+
|
|
780
1232
|
/**
|
|
781
1233
|
* 이 한마디가 무슨 일인지 고른다.
|
|
782
1234
|
*
|
|
783
1235
|
* @param {string} text 사용자가 친 말
|
|
1236
|
+
* @param {{승인받을수있나?: boolean}} [어떻게] 승인받을수있나 가 false 면
|
|
1237
|
+
* 겹친 요청을 계획 모드로 안 보낸다 (물어볼 사람이 없는 자리).
|
|
784
1238
|
* @returns {{ mode: string|null, score: number, why: string, 겹침: boolean, 점수들: object }}
|
|
785
1239
|
* mode 가 null 이면 '모르겠다' 는 뜻이다 — 종합 모드에 그대로 둔다.
|
|
786
1240
|
* 겹침이 true 면 계획을 내고 승인을 받아 실행까지 이어야 한다는 뜻이다.
|
|
787
1241
|
*/
|
|
788
|
-
export function route(text) {
|
|
1242
|
+
export function route(text, { 승인받을수있나 = true } = {}) {
|
|
789
1243
|
const s = String(text ?? '');
|
|
790
1244
|
|
|
791
1245
|
// 겹친 요청은 점수표보다 먼저 본다. 점수표에 맡기면 '만들어' 가 이겨서
|
|
792
1246
|
// 계획을 건너뛴다 — 그게 바로 이 길을 만든 이유다.
|
|
793
1247
|
const 겹 = 겹친요청(s);
|
|
794
|
-
if (겹.겹침) return { mode: 'plan', score: 0, why: 겹.why, 겹침: true, 점수들: {} };
|
|
1248
|
+
if (겹.겹침 && 승인받을수있나) return { mode: 'plan', score: 0, why: 겹.why, 겹침: true, 점수들: {} };
|
|
795
1249
|
|
|
796
1250
|
const 점수들 = {};
|
|
797
1251
|
const 근거 = {};
|
|
@@ -816,7 +1270,20 @@ export function route(text) {
|
|
|
816
1270
|
* 되고, 그 눈금은 아무도 못 지킨다. 여기서 가르는 것은 정도의 문제가 아니라
|
|
817
1271
|
* 종류의 문제다 — 고칠 수 있는 자리인가 아닌가.
|
|
818
1272
|
*/
|
|
819
|
-
|
|
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 뺀까닭 = 손대라했다 ? '고치라는 말이라' : '승인받을 자리가 없어서';
|
|
820
1287
|
const 뺀것 = [];
|
|
821
1288
|
let 순위 = Object.entries(점수들).sort((a, b) => b[1] - a[1]);
|
|
822
1289
|
if (손대라) {
|
|
@@ -839,7 +1306,7 @@ export function route(text) {
|
|
|
839
1306
|
*
|
|
840
1307
|
* 그래서 글이 길면 **더 뚜렷할 때만** 고른다. 못 고르면 종합에 그대로
|
|
841
1308
|
* 두는데, 긴 명세에는 그게 오히려 맞는 답이다 — 종합은 걸음마다 단계를
|
|
842
|
-
* 따라가므로(agent
|
|
1309
|
+
* 따라가므로(agent/phase.js) 계획에서 시작해 만들기로 알아서 넘어간다.
|
|
843
1310
|
*/
|
|
844
1311
|
const 긴글 = s.length >= 1500;
|
|
845
1312
|
const 더줘야 = 긴글 ? 2 : 0;
|
|
@@ -867,12 +1334,19 @@ export function route(text) {
|
|
|
867
1334
|
* 안 보낸다」 는 그대로 맞다 — 그런데 그것은 **설계로 보내지 말라**는 말
|
|
868
1335
|
* 이지, 그 글이 디버그라는 말이 아니다. 뺀 것이 남은 으뜸보다 세다면 이
|
|
869
1336
|
* 글이 무엇인지는 아직 안 정해진 것이다. 종합에 둔다 — 종합은 걸음마다
|
|
870
|
-
* 단계를 따라가므로(agent
|
|
1337
|
+
* 단계를 따라가므로(agent/phase.js) 계획에서 시작해 만들기로 넘어간다.
|
|
871
1338
|
*
|
|
872
1339
|
* 짧은 말에는 안 건다. 짧은 말에서는 낱말 하나가 곧 뜻이다.
|
|
873
1340
|
*/
|
|
874
1341
|
const 뺀최고 = Math.max(0, ...뺀것.map((m) => 점수들[m] ?? 0));
|
|
875
|
-
|
|
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 && 점수 <= 뺀최고;
|
|
876
1350
|
|
|
877
1351
|
// 골랐어야 할 만한 신호가 있었는데 일부러 안 보낸 자리인가.
|
|
878
1352
|
const 일부러 = Boolean(지나가는말 || 뺀것.length
|
|
@@ -887,7 +1361,7 @@ export function route(text) {
|
|
|
887
1361
|
: 긴글 && 으뜸 && 점수 >= (문턱[으뜸] ?? 4)
|
|
888
1362
|
? `글이 길어 ${으뜸} 신호 하나로는 안 정함 — 종합에서 단계를 따라갑니다`
|
|
889
1363
|
: 뺀것.length
|
|
890
|
-
? `${뺀것.join('·')} 신호가 있었지만
|
|
1364
|
+
? `${뺀것.join('·')} 신호가 있었지만 ${뺀까닭} 읽기 전용 모드로 안 보냄`
|
|
891
1365
|
: '무슨 일인지 뚜렷하지 않음';
|
|
892
1366
|
/*
|
|
893
1367
|
* ── 「일부러 안 골랐다」 와 「그냥 모르겠다」 는 다른 말이다 ─────────
|
|
@@ -902,7 +1376,7 @@ export function route(text) {
|
|
|
902
1376
|
* 그래서 **가르는 일을 여기서 한다.** 부르는 쪽이 `뺀것.length` 니
|
|
903
1377
|
* `글이 길` 이니를 다시 헤아리게 두면 두 자리에서 따로 어긋난다.
|
|
904
1378
|
*/
|
|
905
|
-
return { mode: null, score: 점수, why: 왜, 겹침:
|
|
1379
|
+
return { mode: null, score: 점수, why: 왜, 겹침: 겹.겹침, 점수들, 뺀것, 일부러 };
|
|
906
1380
|
}
|
|
907
1381
|
|
|
908
1382
|
// 1·2등이 붙으면 고르지 않는다. 반반인 것을 억지로 정하면 절반은 틀린다.
|
|
@@ -910,7 +1384,7 @@ export function route(text) {
|
|
|
910
1384
|
if (점수 - 둘째 < 2 && 둘째 >= (문턱[순위[1][0]] ?? 4)) {
|
|
911
1385
|
return {
|
|
912
1386
|
mode: null, score: 점수, why: `${으뜸} 과 ${순위[1][0]} 가 비슷함`,
|
|
913
|
-
겹침:
|
|
1387
|
+
겹침: 겹.겹침, 점수들, 뺀것, 일부러: true,
|
|
914
1388
|
};
|
|
915
1389
|
}
|
|
916
1390
|
|
|
@@ -918,8 +1392,8 @@ export function route(text) {
|
|
|
918
1392
|
mode: 으뜸,
|
|
919
1393
|
score: 점수,
|
|
920
1394
|
why: [근거[으뜸].slice(0, 2).map((x) => `'${x}'`).join(', '),
|
|
921
|
-
뺀것.length ? `(${뺀것.join('·')} 는
|
|
922
|
-
겹침:
|
|
1395
|
+
뺀것.length ? `(${뺀것.join('·')} 는 ${뺀까닭} 뺐습니다)` : ''].filter(Boolean).join(' '),
|
|
1396
|
+
겹침: 겹.겹침,
|
|
923
1397
|
점수들,
|
|
924
1398
|
};
|
|
925
1399
|
}
|