leerness 1.9.242 โ†’ 1.9.244

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/CHANGELOG.md CHANGED
@@ -1,5 +1,96 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.244 โ€” 2026-05-26 ๐ŸŽ‰ R200 + ๐Ÿšจ HOTFIX
4
+
5
+ **๐Ÿšจ HOTFIX: REPL agent ReferenceError `_lastCycleLines` (1.9.189 ํšŒ๊ท€ ๋ฒ„๊ทธ) + ๐ŸŽ‰ R200 ๋งˆ์ผ์Šคํ†ค ๋„๋‹ฌ.**
6
+
7
+ ### ๐Ÿšจ ์‚ฌ์šฉ์ž ๋ณด๊ณ  ๋ฒ„๊ทธ (์‹ค ํ™˜๊ฒฝ 1.9.243 npx ์„ค์น˜)
8
+
9
+ ```
10
+ agent[claude ยท sonnet-4-7/actor/โ–ถ]> ์›นํŽ˜์ด์ง€ ์ œ์ž‘ํ•ด์ค˜
11
+ .../leerness/bin/harness.js:16839
12
+ _lastCycleLines = 0; // 1.9.189: ์‚ฌ์šฉ์ž ์ž…๋ ฅ ์‹œ cycle overwrite ์ถ”์  reset
13
+ ^
14
+ ReferenceError: _lastCycleLines is not defined
15
+ at Interface.<anonymous> (.../harness.js:16839:23)
16
+ ```
17
+
18
+ **์›์ธ:** `let _lastCycleLines = 0;` ๋ณ€์ˆ˜๊ฐ€ `if (isTty) { try { ... } }` ๋ธ”๋ก ์Šค์ฝ”ํ”„ ๋‚ด๋ถ€์— ์„ ์–ธ๋˜์–ด ์žˆ์—ˆ์Œ (line 16418). `rl.on('line')` ํ•ธ๋“ค๋Ÿฌ๋Š” ์™ธ๋ถ€ ์Šค์ฝ”ํ”„ (line 16836+) ๋ผ์„œ ReferenceError.
19
+
20
+ **Fix (1.9.244):**
21
+ - `let _lastCycleLines = 0;` ๋ฅผ outer function ์Šค์ฝ”ํ”„ (line 16399) ๋กœ hoist
22
+ - ๋‘ ๊ณณ (cycleProvider/cycleModel + rl.on('line') ํ•ธ๋“ค๋Ÿฌ) ๋™์ผ closure ๊ณต์œ 
23
+ - ๊ฒ€์ฆ: stress-v189 A5 โ€” REPL agent ์ง„์ž… + stdin input โ†’ no ReferenceError ํ™•์ธ
24
+
25
+ ### ๐ŸŽ‰ R200 ๋งˆ์ผ์Šคํ†ค ๋„๋‹ฌ
26
+
27
+ - v1.9.6 baseline ~ v1.9.244 โ†’ **200 ๋ˆ„์  ๋ผ์šด๋“œ** (round-history JSON: `roundCount=200`)
28
+ - **106 main-push streak** (1.9.140~) ยท **๐ŸŽ‰ 67 npm publish streak** (1.9.178~)
29
+ - handoff/session close/health JSON **10 ํ•„๋“œ** ร— 3 = 30 ํ†ตํ•ฉ ํฌ์ธํŠธ
30
+ - MCP **69 ๋„๊ตฌ** ยท CLI **56 ๋ช…๋ น** ยท 9 ์นดํ…Œ๊ณ ๋ฆฌ
31
+ - 6 ๋Šฅ๋ ฅ ๋งคํŠธ๋ฆญ์Šค + 5์ถ• ๋งคํŠธ๋ฆญ์Šค 100/100
32
+
33
+ ### ๋ˆ„์  ํšŒ๊ท€ (1.9.207~243) โ€” ๋ชจ๋‘ ์œ ์ง€
34
+ - CJK ๋ถ„๋ฅ˜ (1.9.243) ยท env encoding --apply (1.9.242) ยท env summary (1.9.241) ยท py-check (1.9.239)
35
+ - ๋น„์ •์ƒ์ข…๋ฃŒ + delivered + release cleanup + round-history + milestones + recentChanges + ๋ชจ๋“  1.9.207~218 ์‚ฌ์šฉ์ž ๋ช…์‹œ ์‹ ๊ทœ 7์ข…
36
+
37
+ ### stress-v189 โ€” **20/20 PASS ยท 100%**
38
+ - 1.9.244 HOTFIX (6): VERSION + _lastCycleLines ๋‹จ์ผ ์„ ์–ธ + 15 refs + hotfix ์ฃผ์„ + agent input no-crash + agent --help no-crash
39
+ - R200 ๋งˆ์ผ์Šคํ†ค (1): roundCount=200 ํ™•์ธ
40
+ - ์„ฑ๋Šฅ (1): cold start avg 373ms
41
+ - ๋ˆ„์  ํšŒ๊ท€ (12): 1.9.170~243
42
+
43
+ ๐Ÿšจ **์‚ฌ์šฉ์ž ๋ณด๊ณ  ๋ฒ„๊ทธ ์ฆ‰์‹œ ํŒจ์น˜** โ€” ์‹ค ํ™˜๊ฒฝ 1.9.243 ์‚ฌ์šฉ ์ค‘ ๋ฐœ๊ฒฌ๋œ critical REPL ํฌ๋ž˜์‹œ ํšŒ๋ณต.
44
+ ๐ŸŽ‰ **R200 ์ž์œจ ๋ชจ๋“œ ๋งˆ์ผ์Šคํ†ค** โ€” 200 ๋ผ์šด๋“œ ๋™์•ˆ ๋‹จ ํ•œ ๋ฒˆ๋„ ์ž์œจ ํ๋ฆ„ ๋Š๊น€ ์—†์ด ์ง„ํ–‰.
45
+
46
+ ---
47
+
48
+ ## 1.9.243 โ€” 2026-05-26
49
+
50
+ **๐ŸŒ UR-0014 3๋‹จ๊ณ„: CJK ๋‹ค๊ตญ์–ด ๋ถ„๋ฅ˜ (ํ•œ๊ตญ์–ด/์ผ๋ณธ์–ด/์ค‘๊ตญ์–ด) + session close --auto-fix-encoding + handoff body --apply ์ง„์ž…์ .**
51
+
52
+ ### ์‚ฌ์šฉ์ž ๋ช…์‹œ (UR-0014) โ€” 3๋‹จ๊ณ„ ๋‹ค๊ตญ์–ด ๋ณด๊ฐ• + ๋งˆ๊ฐ ์ž๋™ํ™”
53
+
54
+ 1.9.241 (๊ฐ์ง€) โ†’ 1.9.242 (์ž๋™ ์ˆ˜์ •) โ†’ 1.9.243 (๋‹ค๊ตญ์–ด + ๋งˆ๊ฐ ์ž๋™ ํ†ตํ•ฉ):
55
+
56
+ ### 1. CJK ๋ถ„๋ฅ˜ โ€” Korean/Japanese/Chinese ์ž๋™ ์‹๋ณ„
57
+ - `_scanShellScriptsEncoding()` ์— `riskType` ํ•„๋“œ ์ถ”๊ฐ€
58
+ - UTF-8 byte range ๋ถ„๋ฅ˜:
59
+ - Korean (Hangul U+AC00-D7AF) โ†’ 0xEA-0xED ์‹œ์ž‘ โ†’ CP949 ์œ„ํ—˜
60
+ - Japanese (Hiragana/Katakana U+3040-30FF) โ†’ 0xE3 ์‹œ์ž‘ โ†’ CP932 (Shift-JIS) ์œ„ํ—˜
61
+ - Chinese (CJK Unified U+4E00-9FFF) โ†’ 0xE4-0xE9 ์‹œ์ž‘ โ†’ CP936 (GBK) ์œ„ํ—˜
62
+ - `atRisk[].cjk`: { korean, japanese, chinese, other } ์„ธ๋ถ€ ์นด์šดํŠธ
63
+ - `result.riskTypeCounts`: ๋ถ„๋ฅ˜๋ณ„ ์š”์•ฝ ํ†ต๊ณ„
64
+ - Locale ๋ณ„ ์ •ํ™•ํ•œ ์œ„ํ—˜ ๋ฉ”์‹œ์ง€ ("Windows ํ•œ๊ตญ์–ด/์ผ๋ณธ์–ด/์ค‘๊ตญ์–ด PowerShell ์—์„œ CPxxx ๋กœ ์˜ค์ธ์‹ ๊ฐ€๋Šฅ")
65
+
66
+ ### 2. session close --auto-fix-encoding ๋งˆ๊ฐ ์ž๋™ ํšŒ๋ณต
67
+ - 1.9.224 (--auto-apply-delivered) + 1.9.237 (--auto-cleanup-branches) ํŒจํ„ด ํ™•์žฅ
68
+ - ๋งˆ๊ฐ ์‹œ ์…ธ ์Šคํฌ๋ฆฝํŠธ ์ธ์ฝ”๋”ฉ ์œ„ํ—˜ ์ž๋™ BOM ์ถ”๊ฐ€
69
+ - ๊ธฐ๋ณธ: ์•ˆ๋‚ด๋งŒ (`์ž๋™ ํšŒ๋ณต ๊ฐ€๋Šฅ` hint) ยท `--auto-fix-encoding` ๋ช…์‹œ ์‹œ์—๋งŒ ๋ณ€๊ฒฝ
70
+ - agent-mode stop ํ๋ฆ„์— ์ž๋™ chain (`session close --auto-apply-delivered --auto-cleanup-branches --auto-fix-encoding`)
71
+
72
+ ### 3. handoff body --apply ์ง„์ž…์  ํ‘œ์‹œ
73
+ - ์ธ์ฝ”๋”ฉ ์œ„ํ—˜ ๋ฐœ๊ฒฌ ์‹œ ๋ณธ๋ฌธ์— ์ž๋™ ์•ˆ๋‚ด 2์ค„ ์ถ”๊ฐ€:
74
+ - `โ†’ ์ž๋™ ํšŒ๋ณต: leerness env encoding --apply (UTF-8 BOM ์ž๋™ ์ถ”๊ฐ€, 1.9.242)`
75
+ - `โ†’ ๋งˆ๊ฐ ์‹œ ์ž๋™: session close --auto-fix-encoding (1.9.243)`
76
+ - CJK ๋ถ„๋ฅ˜ ์š”์•ฝ ํ‘œ์‹œ: `๋ถ„๋ฅ˜: korean=N, japanese=M, chinese=K (1.9.243 CJK)`
77
+
78
+ ### 4. ๋ˆ„์  ํšŒ๊ท€ (1.9.207~242) โ€” ๋ชจ๋‘ ์œ ์ง€
79
+ - MCP 69 ๋„๊ตฌ ์œ ์ง€
80
+ - JSON ํ†ตํ•ฉ 10 ํ•„๋“œ (envInfo) ์œ ์ง€
81
+ - drift check --auto-fix env encoding ํ†ตํ•ฉ ์œ ์ง€
82
+
83
+ ### 5. stress-v188 โ€” **24/24 PASS ยท 100%**
84
+ - 1.9.243 (8): VERSION + CJK 3์ข… ๋ถ„๋ฅ˜ ์ •ํ™•๋„ + riskTypeCounts + atRisk[].cjk + session close ์ž๋™/๊ธฐ๋ณธ ๋ชจ๋“œ + handoff body ์ง„์ž…์  + agent-mode stop chain
85
+ - ์„ฑ๋Šฅ (2): cold_start avg 333ms ยท session close --auto-fix 438ms
86
+ - ๋ˆ„์  ํšŒ๊ท€ (14): 1.9.207~242 + ๋ณด์•ˆ + npm publish
87
+
88
+ ### 6. ์ž๋™ release (105 ๋ผ์šด๋“œ main-push streak ยท 66 ๋ผ์šด๋“œ npm publish streak)
89
+
90
+ ๐ŸŒ **๋‹ค๊ตญ์–ด CJK ์™„์ „ ์ž๋™ํ™”** โ€” Korean/Japanese/Chinese PowerShell ์ธ์ฝ”๋”ฉ ์˜ค์ธ์‹ ์‚ฌ์ „ ์ฐจ๋‹จ
91
+
92
+ ---
93
+
3
94
  ## 1.9.242 โ€” 2026-05-26
4
95
 
5
96
  **๐ŸŒ UR-0014 2๋‹จ๊ณ„: env encoding --apply (BOM ์ž๋™ ์ถ”๊ฐ€) + JSON 10 ํ•„๋“œ envInfo + drift --auto-fix ํ†ตํ•ฉ.**
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **AI ์ฝ”๋”ฉ ์—์ด์ „ํŠธ์˜ ๊ฑฐ์ง“ ์™„๋ฃŒยท์ค‘๋ณตยท๋ง๊ฐยท์ถฉ๋Œ์„ ๋ง‰์•„์ฃผ๋Š” ๊ฒ€์ˆ˜ยท๊ธฐ์–ตยทํ˜‘์—… CLI ํ•˜๋„ค์Šค.**
4
4
 
5
- [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.242-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v187-22%2F22-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-69-brightgreen)]() [![cli](https://img.shields.io/badge/CLI_commands-56-brightgreen)]() [![json-fields](https://img.shields.io/badge/JSON_ํ†ตํ•ฉ-10_ํ•„๋“œ-blueviolet)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-198-blueviolet)]() [![main-push](https://img.shields.io/badge/๐ŸŽ‰_main--push_streak-104_rounds-success)]() [![npm-streak](https://img.shields.io/badge/๐ŸŽ‰_npm--publish-65_streak-success)]() [![encoding](https://img.shields.io/badge/๐ŸŒ_env_encoding-BOM_์ž๋™์ถ”๊ฐ€-blueviolet)]() [![perf](https://img.shields.io/badge/cold_start-371ms-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
5
+ [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.244-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v189-20%2F20-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-69-brightgreen)]() [![cli](https://img.shields.io/badge/CLI_commands-56-brightgreen)]() [![json-fields](https://img.shields.io/badge/JSON_ํ†ตํ•ฉ-10_ํ•„๋“œ-blueviolet)]() [![rounds](https://img.shields.io/badge/๐ŸŽ‰_R200-๋งˆ์ผ์Šคํ†ค-success)]() [![main-push](https://img.shields.io/badge/๐ŸŽ‰_main--push_streak-106_rounds-success)]() [![npm-streak](https://img.shields.io/badge/๐ŸŽ‰_npm--publish-67_streak-success)]() [![hotfix](https://img.shields.io/badge/๐Ÿšจ_HOTFIX-REPL_ReferenceError-red)]() [![perf](https://img.shields.io/badge/cold_start-373ms-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
6
6
 
7
7
  ```
8
8
  โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
@@ -12,9 +12,9 @@
12
12
  โ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•”โ•โ•โ• โ–ˆโ–ˆโ•”โ•โ•โ• โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ• โ•šโ•โ•โ•โ•โ–ˆโ–ˆโ•‘ โ•‘
13
13
  โ•‘ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘ โ•‘
14
14
  โ•‘ โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ•โ•šโ•โ• โ•šโ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ• โ•‘
15
- โ•‘ v1.9.242 AI Agent Reliability Harness + Sandbox โ•‘
15
+ โ•‘ v1.9.244 AI Agent Reliability Harness + Sandbox โ•‘
16
16
  โ•‘ verify ยท remember ยท orchestrate ยท audit ยท sandbox ยท drift โ•‘
17
- โ•‘ ๐ŸŒ env encoding --apply BOM ์ž๋™ ์ถ”๊ฐ€ (UR-0014 2๋‹จ๊ณ„) โ•‘
17
+ โ•‘ ๐Ÿšจ HOTFIX REPL ReferenceError + ๐ŸŽ‰ R200 ์ž์œจ ๋งˆ์ผ์Šคํ†ค โ•‘
18
18
  โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
19
19
  ```
20
20
 
package/bin/harness.js CHANGED
@@ -7,7 +7,7 @@ const cp = require('child_process');
7
7
  const os = require('os'); // 1.9.178: _publishToNpm ์—์„œ os.tmpdir() ์‚ฌ์šฉ (์ „์—ญ import)
8
8
  const readline = require('readline');
9
9
 
10
- const VERSION = '1.9.242';
10
+ const VERSION = '1.9.244';
11
11
 
12
12
  // 1.9.184: DEP0190 (child_process shell: true) deprecation warning ์–ต์ œ (์‚ฌ์šฉ์ž ๋ช…์‹œ).
13
13
  // leerness ๋Š” cross-platform PATH resolution ์„ ์œ„ํ•ด shell: true ๋ฅผ ์˜๋„์ ์œผ๋กœ ์‚ฌ์šฉ (claude.cmd / ollama.cmd ๋“ฑ Windows .cmd ์ฒ˜๋ฆฌ).
@@ -2308,7 +2308,7 @@ function agentModeCmd(root, sub) {
2308
2308
  log('');
2309
2309
  log(` start ์ง„์ž… (handoff + drift --auto-fix + session-resume --auto-fix)`);
2310
2310
  log(` tick ๋งค ๋ผ์šด๋“œ (pulse + ํ•ต์‹ฌ ์‹ ํ˜ธ)`);
2311
- log(` stop ๋งˆ๊ฐ (session close --auto-apply-delivered --auto-cleanup-branches)`);
2311
+ log(` stop ๋งˆ๊ฐ (session close --auto-apply-delivered --auto-cleanup-branches --auto-fix-encoding)`);
2312
2312
  log('');
2313
2313
  log(dm(` ์‚ฌ์šฉ์ž ๋ช…์‹œ UR-0013 (Python + agent-mode ํšจ์œจํ™”)`));
2314
2314
  return;
@@ -2337,8 +2337,8 @@ function agentModeCmd(root, sub) {
2337
2337
  }
2338
2338
  if (sub === 'stop') {
2339
2339
  log(cy(`# leerness agent-mode stop (1.9.239) โ€” ํ†ตํ•ฉ ๋งˆ๊ฐ`));
2340
- log(dm(` โ†’ session close --auto-apply-delivered --auto-cleanup-branches`));
2341
- const r = spawnChild(['session', 'close', root, '--auto-apply-delivered', '--auto-cleanup-branches']);
2340
+ log(dm(` โ†’ session close --auto-apply-delivered --auto-cleanup-branches --auto-fix-encoding`));
2341
+ const r = spawnChild(['session', 'close', root, '--auto-apply-delivered', '--auto-cleanup-branches', '--auto-fix-encoding']);
2342
2342
  process.stdout.write(r.stdout || '');
2343
2343
  return;
2344
2344
  }
@@ -2442,6 +2442,35 @@ function _collectRuntimeEnv() {
2442
2442
  // ์œ„ํ—˜ ์‹œ๊ทธ๋„: ํ•œ๊ตญ์–ด (๋˜๋Š” ๋น„-ASCII) ๋ฌธ์ž + BOM ์—†์Œ + Windows ํ™˜๊ฒฝ
2443
2443
  function _scanShellScriptsEncoding(root) {
2444
2444
  const result = { scanned: 0, atRisk: [], notes: [] };
2445
+ // 1.9.243: CJK ๋ถ„๋ฅ˜ โ€” Korean/Japanese/Chinese ๋น„-ASCII ํŒจํ„ด ํ†ต๊ณ„ (UR-0014 3๋‹จ๊ณ„)
2446
+ function _classifyCJK(buf, len) {
2447
+ let korean = 0, japanese = 0, chinese = 0, other = 0;
2448
+ for (let i = 0; i < Math.min(buf.length, len); i++) {
2449
+ const b = buf[i];
2450
+ if (b < 0x80) continue;
2451
+ // UTF-8 3-byte ์‹œํ€€์Šค ์‹œ์ž‘ ๋ฐ”์ดํŠธ ๋ถ„๋ฅ˜
2452
+ // Korean Hangul Syllables U+AC00-D7AF โ†’ 3-byte: EA B0 80 ~ ED 9F BF
2453
+ if (b >= 0xEA && b <= 0xED) korean++;
2454
+ // Japanese Hiragana/Katakana U+3040-30FF โ†’ 3-byte: E3 81 80 ~ E3 83 BF
2455
+ else if (b === 0xE3) japanese++;
2456
+ // CJK Unified Ideographs U+4E00-9FFF โ†’ 3-byte: E4 B8 80 ~ E9 BF BF
2457
+ else if (b >= 0xE4 && b <= 0xE9) chinese++;
2458
+ else other++;
2459
+ }
2460
+ return { korean, japanese, chinese, other };
2461
+ }
2462
+ function _riskLabel(cjk) {
2463
+ if (cjk.korean >= cjk.japanese && cjk.korean >= cjk.chinese && cjk.korean > 0) {
2464
+ return { type: 'korean', risk: 'Windows ํ•œ๊ตญ์–ด PowerShell ์—์„œ CP949 ๋กœ ์˜ค์ธ์‹ ๊ฐ€๋Šฅ (BOM ์ถ”๊ฐ€ ๊ถŒ์žฅ)' };
2465
+ }
2466
+ if (cjk.japanese > cjk.korean && cjk.japanese >= cjk.chinese) {
2467
+ return { type: 'japanese', risk: 'Windows ์ผ๋ณธ์–ด PowerShell ์—์„œ CP932 (Shift-JIS) ๋กœ ์˜ค์ธ์‹ ๊ฐ€๋Šฅ (BOM ์ถ”๊ฐ€ ๊ถŒ์žฅ)' };
2468
+ }
2469
+ if (cjk.chinese > 0) {
2470
+ return { type: 'chinese', risk: 'Windows ์ค‘๊ตญ์–ด PowerShell ์—์„œ CP936 (GBK) ๋กœ ์˜ค์ธ์‹ ๊ฐ€๋Šฅ (BOM ์ถ”๊ฐ€ ๊ถŒ์žฅ)' };
2471
+ }
2472
+ return { type: 'non-ascii', risk: 'Windows ๋น„-ASCII ์…ธ ์Šคํฌ๋ฆฝํŠธ โ€” BOM ์—†๋Š” UTF-8 ์ธ์ฝ”๋”ฉ ์˜ค์ธ์‹ ๊ฐ€๋Šฅ (BOM ์ถ”๊ฐ€ ๊ถŒ์žฅ)' };
2473
+ }
2445
2474
  function walk(dir, depth = 0) {
2446
2475
  if (depth > 3) return; // ๋„ˆ๋ฌด ๊นŠ์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š์Œ
2447
2476
  let entries;
@@ -2462,12 +2491,17 @@ function _scanShellScriptsEncoding(root) {
2462
2491
  if (buf[i] >= 0x80) { nonAscii = true; break; }
2463
2492
  }
2464
2493
  if (nonAscii && !hasBOM) {
2494
+ // 1.9.243: CJK ๋ถ„๋ฅ˜ ์ถ”๊ฐ€
2495
+ const cjk = _classifyCJK(buf, 4096);
2496
+ const label = _riskLabel(cjk);
2465
2497
  result.atRisk.push({
2466
2498
  file: path.relative(root, fp),
2467
2499
  ext: path.extname(fp),
2468
2500
  hasBOM: false,
2469
2501
  nonAscii: true,
2470
- risk: 'Windows ํ•œ๊ตญ์–ด PowerShell ์—์„œ CP949 ๋กœ ์˜ค์ธ์‹ ๊ฐ€๋Šฅ (BOM ์ถ”๊ฐ€ ๊ถŒ์žฅ)'
2502
+ riskType: label.type,
2503
+ cjk,
2504
+ risk: label.risk
2471
2505
  });
2472
2506
  }
2473
2507
  } catch {}
@@ -2478,6 +2512,9 @@ function _scanShellScriptsEncoding(root) {
2478
2512
  if (result.atRisk.length > 0) {
2479
2513
  result.notes.push('ํ•ด๊ฒฐ: ํŒŒ์ผ ์‹œ์ž‘์— UTF-8 BOM ์ถ”๊ฐ€ (EF BB BF) ๋˜๋Š” .ps1 ์ฒซ ์ค„์— $OutputEncoding/[Console]::OutputEncoding ์„ค์ •');
2480
2514
  }
2515
+ // 1.9.243: ๋ถ„๋ฅ˜๋ณ„ ํ†ต๊ณ„ ์š”์•ฝ
2516
+ const types = result.atRisk.reduce((m, r) => { m[r.riskType] = (m[r.riskType] || 0) + 1; return m; }, {});
2517
+ result.riskTypeCounts = types;
2481
2518
  return result;
2482
2519
  }
2483
2520
 
@@ -6948,8 +6985,13 @@ function handoff(root) {
6948
6985
  log(dm5(` ${r.risk}`));
6949
6986
  });
6950
6987
  if (scan.atRisk.length > 3) log(dm5(` ... +${scan.atRisk.length - 3}๊ฑด ๋”`));
6988
+ // 1.9.243: CJK ๋ถ„๋ฅ˜ ์š”์•ฝ (UR-0014 3๋‹จ๊ณ„)
6989
+ const types = scan.riskTypeCounts || {};
6990
+ const tList = Object.entries(types).filter(([_, c]) => c > 0).map(([t, c]) => `${t}=${c}`);
6991
+ if (tList.length > 0) log(dm5(` ๋ถ„๋ฅ˜: ${tList.join(', ')} (1.9.243 CJK)`));
6951
6992
  log(dm5(` โ†’ ์ƒ์„ธ: leerness env encoding`));
6952
- log(dm5(` โ†’ ํ•ด๊ฒฐ: ํŒŒ์ผ ์‹œ์ž‘์— UTF-8 BOM (EF BB BF) ์ถ”๊ฐ€`));
6993
+ log(dm5(` โ†’ ์ž๋™ ํšŒ๋ณต: leerness env encoding --apply (UTF-8 BOM ์ž๋™ ์ถ”๊ฐ€, 1.9.242)`));
6994
+ log(dm5(` โ†’ ๋งˆ๊ฐ ์‹œ ์ž๋™: session close --auto-fix-encoding (1.9.243)`));
6953
6995
  }
6954
6996
  } catch {}
6955
6997
 
@@ -10967,6 +11009,31 @@ function sessionClose(root, opts = {}) {
10967
11009
  }
10968
11010
  }
10969
11011
  } catch {}
11012
+ // 1.9.243: session close --auto-fix-encoding โ€” ์…ธ ์Šคํฌ๋ฆฝํŠธ ์ธ์ฝ”๋”ฉ ์œ„ํ—˜ ์ž๋™ ํšŒ๋ณต (UR-0014 3๋‹จ๊ณ„)
11013
+ // 1.9.224 (--auto-apply-delivered) / 1.9.237 (--auto-cleanup-branches) ํŒจํ„ด ํ™•์žฅ
11014
+ // ๋งˆ๊ฐ ์‹œ ํ•œ๊ตญ์–ด/์ผ๋ณธ์–ด/์ค‘๊ตญ์–ด PowerShell ์ธ์ฝ”๋”ฉ ์œ„ํ—˜ ์ž๋™ BOM ์ถ”๊ฐ€
11015
+ try {
11016
+ const encScan = _scanShellScriptsEncoding(root);
11017
+ if (encScan.atRisk && encScan.atRisk.length > 0) {
11018
+ if (has('--auto-fix-encoding')) {
11019
+ let ok = 0;
11020
+ for (const r of encScan.atRisk) {
11021
+ try {
11022
+ const fullPath = path.join(root, r.file);
11023
+ const orig = fs.readFileSync(fullPath);
11024
+ const bom = Buffer.from([0xEF, 0xBB, 0xBF]);
11025
+ const fixed = Buffer.concat([bom, orig]);
11026
+ fs.writeFileSync(fullPath, fixed);
11027
+ ok++;
11028
+ } catch {}
11029
+ }
11030
+ log(grn(` โœ“ ์ธ์ฝ”๋”ฉ ์œ„ํ—˜ ${ok}/${encScan.atRisk.length}๊ฑด UTF-8 BOM ์ž๋™ ์ถ”๊ฐ€ (--auto-fix-encoding 1.9.243)`));
11031
+ } else {
11032
+ log(yel(` โš  ์…ธ ์Šคํฌ๋ฆฝํŠธ ์ธ์ฝ”๋”ฉ ์œ„ํ—˜ ${encScan.atRisk.length}๊ฑด (1.9.241) โ€” ์ž๋™ ํšŒ๋ณต ๊ฐ€๋Šฅ`));
11033
+ log(dim(` โ†’ leerness env encoding --apply (์ˆ˜๋™) ๋˜๋Š” session close --auto-fix-encoding (1.9.243 ์ž๋™)`));
11034
+ }
11035
+ }
11036
+ } catch {}
10970
11037
  // 1.9.232: ๋งˆ๊ฐ ์‹œ pulse ํ•œ ์ค„ ์ž๋™ ๋…ธ์ถœ โ€” ๋‹ค์Œ ๋ผ์šด๋“œ ์ง„์ž… ์‹œ ์ฆ‰์‹œ ์ƒํƒœ ์ธ์ง€
10971
11038
  try {
10972
11039
  const rh = _computeRoundHistory(root);
@@ -16326,6 +16393,11 @@ async function _agentRepl(root, opts) {
16326
16393
  };
16327
16394
  rl.setPrompt(prompt());
16328
16395
 
16396
+ // 1.9.244 HOTFIX: _lastCycleLines ๋ฅผ outer ์Šค์ฝ”ํ”„๋กœ hoist
16397
+ // 1.9.189 ํšŒ๊ท€ ๋ฒ„๊ทธ fix โ€” rl.on('line') ํ•ธ๋“ค๋Ÿฌ๊ฐ€ try ๋ธ”๋ก ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ ์‹œ ReferenceError ๋ฐœ์ƒํ–ˆ์Œ.
16398
+ // ์‚ฌ์šฉ์ž ๋ณด๊ณ : REPL agent ์ง„์ž… ํ›„ ์ฑ„ํŒ… ์ž…๋ ฅ ์‹œ "_lastCycleLines is not defined" ํฌ๋ž˜์‹œ.
16399
+ let _lastCycleLines = 0; // ์ง์ „ cycle ์ถœ๋ ฅ ๋ผ์ธ ์ˆ˜ (overwrite ์šฉ) โ€” 1.9.189/244
16400
+
16329
16401
  // 1.9.170: Tab cycle โ€” provider (Tab) / model within provider (Shift+Tab)
16330
16402
  // ์‚ฌ์šฉ์ž ๋ช…์‹œ ์š”์ฒญ: "ํƒญ ํ‚ค ๋“ฑ์œผ๋กœ provider/๋ชจ๋ธ ์…€๋ ‰๊ณผ ์„ ํƒ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ"
16331
16403
  // readline์˜ default tab=completion ๋™์ž‘์„ keypress ๋ฆฌ์Šค๋„ˆ๋กœ ๊ฐ€๋กœ์ฑ„์„œ cycle ์ˆ˜ํ–‰.
@@ -16348,7 +16420,7 @@ async function _agentRepl(root, opts) {
16348
16420
  // 1.9.180+1.9.189: cycleProvider/cycleModel โ€” ํ•œ ์ค„ ๊ฐฑ์‹  (in-place overwrite).
16349
16421
  // 1.9.180๊นŒ์ง€: ๋งค Tab ๋ˆ„๋ฆ„๋งˆ๋‹ค ์ƒˆ ์ค„ ์ถœ๋ ฅ โ†’ ์ฑ„ํŒ… ์ด๋ ฅ์œผ๋กœ ๋ˆ„์  (์‚ฌ์šฉ์ž ๋ช…์‹œ: "์ง€์ ธ๋ถ„ํ•ด๋ณด์—ฌ").
16350
16422
  // 1.9.189: ANSI cursor up + line clear ๋กœ ์ด์ „ cycle ๋ผ์ธ ๋ฎ์–ด์”€ โ†’ ๋งˆ์ง€๋ง‰ 1๊ฑด๋งŒ ํ‘œ์‹œ.
16351
- let _lastCycleLines = 0; // ์ง์ „ cycle ์ถœ๋ ฅ ๋ผ์ธ ์ˆ˜ (overwrite ์šฉ)
16423
+ // 1.9.244: _lastCycleLines ๋Š” outer ์Šค์ฝ”ํ”„ (์œ„)์—์„œ ์„ ์–ธ โ€” rl.on('line') ํ•ธ๋“ค๋Ÿฌ์™€ ๊ณต์œ .
16352
16424
  const _clearLastCycle = () => {
16353
16425
  if (!isTty || _lastCycleLines === 0) return;
16354
16426
  // ํ˜„์žฌ prompt ๋ผ์ธ + ์ด์ „ cycle ๋ผ์ธ๋“ค ํด๋ฆฌ์–ด
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.242",
3
+ "version": "1.9.244",
4
4
  "description": "Leerness: ๋น„ํŒŒ๊ดด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ์ž๋™ ๋ฒ„์ „ ๊ฐ์ง€ยท์—…๋ฐ์ดํŠธ, ๊ณ„ํš/์ง„ํ–‰/ํ•ธ๋“œ์˜คํ”„ ์ž๋™ํ™”, ๊ฒŒ์œผ๋ฆ„ยท์‹œํฌ๋ฆฟยท์ธ์ฝ”๋”ฉ ์ž๋™ ๊ฐ€๋“œ, Claude Code ์Šฌ๋ž˜์‹œ ํ†ตํ•ฉ์„ ๊ฐ–์ถ˜ ํ•œ๊ตญ์–ด ์šฐ์„  AI ๊ฐœ๋ฐœ ํ•˜๋„ค์Šค.",
5
5
  "keywords": [
6
6
  "leerness",