leerness 1.9.249 → 1.9.251
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 +74 -0
- package/README.md +3 -3
- package/bin/harness.js +112 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,79 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.251 — 2026-05-29 — UR-0018 3단계 init 터미널 인코딩 점검 안내
|
|
4
|
+
|
|
5
|
+
**🌐 UR-0018 완성: 자동 회복(1.9.249/250)에 이어 `leerness init` 시 사용자 즉시 고지.**
|
|
6
|
+
|
|
7
|
+
### 배경
|
|
8
|
+
UR-0018 원문에 명시된 *"leerness init 시 터미널 인코딩 점검 안내"* 부분이 미구현 상태. 1.9.249(Windows chcp)/1.9.250(POSIX)는 자동 회복에 집중했으나, 설치 직후 사용자에게 현재 인코딩 상태를 보여주는 가시화는 빠져 있었음.
|
|
9
|
+
|
|
10
|
+
### 구현
|
|
11
|
+
1. **`_terminalEncodingNotice()` 재사용 헬퍼 신설**:
|
|
12
|
+
- Windows(CP949) + POSIX(Linux/macOS/WSL) 양방향 점검을 한 곳에 통합
|
|
13
|
+
- 반환 `{ ok, lines[] }` — 색상 적용된 출력 라인 (호출측이 `log()`)
|
|
14
|
+
- TTY 자동 감지 → 비-TTY 시 색상 코드 생략
|
|
15
|
+
2. **`leerness init` 완료 시 자동 호출** (`!opts.migration` 가드):
|
|
16
|
+
- `🌐 터미널 인코딩 점검 (1.9.251, UR-0018)` 헤더 + 상태 라인
|
|
17
|
+
- 위험 시 `상세: leerness env · 셸 스크립트 검사: leerness env encoding` 안내
|
|
18
|
+
- 안전(65001/UTF-8) 시 `✓` 초록 표시
|
|
19
|
+
3. migration(재설치)에서는 노이즈 방지를 위해 skip
|
|
20
|
+
|
|
21
|
+
### 영향 받지 않은 영역
|
|
22
|
+
- 1.9.249 chcp 65001 자동 회복 + 1.9.250 POSIX posixEncodingOk/isWSL 모두 유지
|
|
23
|
+
- JSON envInfo 4 필드 (terminalEncodingOk/autoChcpApplied/posixEncodingOk/isWSL) 유지
|
|
24
|
+
- env summary 인라인 인코딩 라인 (1.9.249/250) 유지 — 헬퍼와 독립
|
|
25
|
+
|
|
26
|
+
### stress-v196 — **21/21 PASS · 100%**
|
|
27
|
+
- 1.9.251 (8): VERSION + 헬퍼 + 반환구조 + install 호출 + Windows/POSIX 분기 + migration skip + 실제 init 출력
|
|
28
|
+
- 성능 (1): cold start avg 471ms
|
|
29
|
+
- 누적 회귀 (12): 1.9.207~250
|
|
30
|
+
|
|
31
|
+
### 자동 release (113 main-push streak · 74 npm publish streak · R207)
|
|
32
|
+
|
|
33
|
+
🌐 **UR-0018 3단계 완성** — 자동 회복 + 설치 시 가시화로 한국어 인코딩 보호 전체 사이클 완결.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 1.9.250 — 2026-05-28 — UR-0018 2단계 POSIX 인코딩 자동 회복 (Linux/macOS/WSL)
|
|
38
|
+
|
|
39
|
+
**🌐 UR-0018 후속: Windows + POSIX 양방향 인코딩 보호 완성.**
|
|
40
|
+
|
|
41
|
+
### 배경
|
|
42
|
+
1.9.249는 Windows (CP949 → 65001) 에 집중. POSIX (Linux/macOS) 한국어 환경 + WSL 사용자도 LANG/LC_ALL 미설정 시 동일한 한글 깨짐 발생.
|
|
43
|
+
|
|
44
|
+
### 구현
|
|
45
|
+
1. **`_collectRuntimeEnv` 확장** (locale 필드):
|
|
46
|
+
- `posixEncodingOk: boolean | null` — LANG/LC_ALL/LC_CTYPE 에 UTF-8 포함 여부
|
|
47
|
+
- `isWSL: boolean` — `/proc/version` "microsoft" 매칭 또는 `WSL_DISTRO_NAME` env
|
|
48
|
+
2. **env summary**:
|
|
49
|
+
- `✓ POSIX locale UTF-8 — Linux/macOS (WSL) 한국어 출력 안전`
|
|
50
|
+
- `⚠ POSIX locale에 UTF-8 없음 (LANG=…) — 한국어 출력 깨질 위험`
|
|
51
|
+
- `→ 권장: export LANG=ko_KR.UTF-8 (또는 export LC_ALL=C.UTF-8)`
|
|
52
|
+
3. **handoff body**:
|
|
53
|
+
- `## ⚠ 터미널 인코딩 — POSIX(WSL) locale에 UTF-8 없음 (1.9.250, UR-0018 2단계)`
|
|
54
|
+
- `~/.bashrc 또는 ~/.zshrc 에 추가` 영구 적용 안내
|
|
55
|
+
4. **JSON envInfo 4필드 propagate** (handoff/session close/health 3 명령 일관성):
|
|
56
|
+
- `terminalEncodingOk` (1.9.249) — 이전 라운드에서 handoff 만 적용 → session close/health 추가
|
|
57
|
+
- `autoChcpApplied` (1.9.249) — 동일 propagate
|
|
58
|
+
- `posixEncodingOk` (1.9.250 신규)
|
|
59
|
+
- `isWSL` (1.9.250 신규)
|
|
60
|
+
|
|
61
|
+
### 영향 받지 않은 영역
|
|
62
|
+
- Windows chcp 65001 자동 회복 (1.9.249) 유지
|
|
63
|
+
- 1.9.248 agy / 1.9.247 fallback / 1.9.246 status bar / 1.9.245 api-skill 모두 유지
|
|
64
|
+
- handoff JSON 11 필드 매트릭스 유지
|
|
65
|
+
|
|
66
|
+
### stress-v195 — **26/26 PASS · 100%**
|
|
67
|
+
- 1.9.250 (12): VERSION + IIFE + POSIX UTF-8 검사 + WSL 감지 + env summary + handoff body + JSON 3 명령 propagate (4 필드)
|
|
68
|
+
- 성능 (2): cold start avg 368ms · env summary --json avg 1120ms
|
|
69
|
+
- 누적 회귀 (12): 1.9.207~249
|
|
70
|
+
|
|
71
|
+
### 자동 release (112 main-push streak · 73 npm publish streak · R206)
|
|
72
|
+
|
|
73
|
+
🌐 **양방향 인코딩 보호 완성** — Windows + POSIX 모두 leerness 자체 출력 한글 깨짐 사전 차단.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
3
77
|
## 1.9.249 — 2026-05-28 — UR-0018 터미널 인코딩 자동 회복 (한국어 Windows)
|
|
4
78
|
|
|
5
79
|
**🌐 사용자 명시 (UR-0018): "leerness가 적용된 프로젝트에서 터미널 출력이 깨지지 않게, 하드웨어의 언어 등을 사전에 참고하여 진행".**
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **AI 코딩 에이전트의 거짓 완료·중복·망각·충돌을 막아주는 검수·기억·협업 CLI 하네스.**
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/leerness) [](https://www.npmjs.com/package/leerness) []() []() []() []() []() []() []() []() []() []() []() []()
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
╔══════════════════════════════════════════════════════════════╗
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
║ ██║ ██╔══╝ ██╔══╝ ██╔══██╗██║╚██╗██║██╔══╝ ╚════██║ ║
|
|
13
13
|
║ ███████╗███████╗███████╗██║ ██║██║ ╚████║███████╗███████║ ║
|
|
14
14
|
║ ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝ ║
|
|
15
|
-
║ v1.9.
|
|
15
|
+
║ v1.9.251 AI Agent Reliability Harness + Sandbox ║
|
|
16
16
|
║ verify · remember · orchestrate · audit · sandbox · drift ║
|
|
17
|
-
║ 🌐
|
|
17
|
+
║ 🌐 init 인코딩 점검 안내 (Windows+POSIX · UR-0018 3단계) ║
|
|
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.
|
|
10
|
+
const VERSION = '1.9.251';
|
|
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 처리).
|
|
@@ -1056,6 +1056,19 @@ async function install(root, opts = {}) {
|
|
|
1056
1056
|
}
|
|
1057
1057
|
} catch {}
|
|
1058
1058
|
}
|
|
1059
|
+
// 1.9.251 (UR-0018 3단계): init 완료 시 터미널 인코딩 점검 안내 — 사용자 명시 ("leerness init 시 터미널 인코딩 점검 안내")
|
|
1060
|
+
// Windows CP949 / POSIX non-UTF-8 환경에서 leerness 한국어 출력 깨짐을 설치 직후 사용자에게 즉시 고지.
|
|
1061
|
+
if (!opts.migration) {
|
|
1062
|
+
try {
|
|
1063
|
+
const enc = _terminalEncodingNotice();
|
|
1064
|
+
if (enc.lines.length > 0) {
|
|
1065
|
+
log('');
|
|
1066
|
+
log(`\x1b[36m🌐 터미널 인코딩 점검 (1.9.251, UR-0018)\x1b[0m`);
|
|
1067
|
+
enc.lines.forEach(l => log(l));
|
|
1068
|
+
if (!enc.ok) log(`\x1b[2m 상세: leerness env · 셸 스크립트 검사: leerness env encoding\x1b[0m`);
|
|
1069
|
+
}
|
|
1070
|
+
} catch {}
|
|
1071
|
+
}
|
|
1059
1072
|
// 1.9.1 P7: 디폴트 M-0001이 plan에 있고 progress에 row가 없으면 자동 추가
|
|
1060
1073
|
try {
|
|
1061
1074
|
const planText = exists(planPath(root)) ? read(planPath(root)) : '';
|
|
@@ -2420,7 +2433,10 @@ function _collectRuntimeEnv() {
|
|
|
2420
2433
|
LC_CTYPE: process.env.LC_CTYPE || null,
|
|
2421
2434
|
// Windows 한국어 환경 detect
|
|
2422
2435
|
OEMCP: process.env.OEMCP || null, // CP949 = 949
|
|
2423
|
-
isKoreanWindows: false
|
|
2436
|
+
isKoreanWindows: false,
|
|
2437
|
+
// 1.9.250 (UR-0018 2단계): POSIX (Linux/macOS/WSL) terminal encoding 점검
|
|
2438
|
+
isWSL: false,
|
|
2439
|
+
posixEncodingOk: null // POSIX 전용: LANG/LC_ALL 에 UTF-8 포함 시 true
|
|
2424
2440
|
},
|
|
2425
2441
|
hardware: {
|
|
2426
2442
|
cpus: os.cpus().length,
|
|
@@ -2448,6 +2464,22 @@ function _collectRuntimeEnv() {
|
|
|
2448
2464
|
}
|
|
2449
2465
|
}
|
|
2450
2466
|
} catch {}
|
|
2467
|
+
// 1.9.250 (UR-0018 2단계): POSIX (Linux/macOS) + WSL terminal encoding 점검
|
|
2468
|
+
// LANG/LC_ALL 에 UTF-8 포함 시 안전, 그렇지 않으면 macOS/Linux 한국어 터미널 깨질 위험
|
|
2469
|
+
try {
|
|
2470
|
+
if (env.os.platform === 'linux' || env.os.platform === 'darwin') {
|
|
2471
|
+
const langStr = (env.locale.LANG || '') + ' ' + (env.locale.LC_ALL || '') + ' ' + (env.locale.LC_CTYPE || '');
|
|
2472
|
+
env.locale.posixEncodingOk = /UTF-?8/i.test(langStr);
|
|
2473
|
+
// WSL 감지 (Linux 환경에서 /proc/version 에 microsoft 포함 시)
|
|
2474
|
+
if (env.os.platform === 'linux') {
|
|
2475
|
+
try {
|
|
2476
|
+
const procVer = fs.readFileSync('/proc/version', 'utf8');
|
|
2477
|
+
if (/microsoft|wsl/i.test(procVer)) env.locale.isWSL = true;
|
|
2478
|
+
} catch {}
|
|
2479
|
+
if (process.env.WSL_DISTRO_NAME) env.locale.isWSL = true;
|
|
2480
|
+
}
|
|
2481
|
+
}
|
|
2482
|
+
} catch {}
|
|
2451
2483
|
// PowerShell 감지
|
|
2452
2484
|
try {
|
|
2453
2485
|
if (env.os.platform === 'win32') {
|
|
@@ -2468,6 +2500,44 @@ function _collectRuntimeEnv() {
|
|
|
2468
2500
|
return env;
|
|
2469
2501
|
}
|
|
2470
2502
|
|
|
2503
|
+
// 1.9.251 (UR-0018 3단계): leerness init/명령 시 터미널 인코딩 점검 안내 (재사용 헬퍼)
|
|
2504
|
+
// Windows (CP949) + POSIX (Linux/macOS/WSL) 양방향 — leerness 한국어 출력 깨짐 사전 점검.
|
|
2505
|
+
// 반환: { ok, lines:[] } — lines 는 색상 적용된 출력 라인 배열 (호출측이 log() 로 출력).
|
|
2506
|
+
function _terminalEncodingNotice(opts = {}) {
|
|
2507
|
+
const isTty = opts.isTty != null ? opts.isTty : !!(process.stdout && process.stdout.isTTY);
|
|
2508
|
+
const gr = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
|
|
2509
|
+
const yl = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
2510
|
+
const dm = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
2511
|
+
const lines = [];
|
|
2512
|
+
let ok = true;
|
|
2513
|
+
let env;
|
|
2514
|
+
try { env = _collectRuntimeEnv(); } catch { return { ok: true, lines: [] }; }
|
|
2515
|
+
// Windows 한국어 + 비-65001 코드페이지
|
|
2516
|
+
if (env.locale.isKoreanWindows && env.locale.codepage !== 65001) {
|
|
2517
|
+
ok = false;
|
|
2518
|
+
lines.push(yl(` ⚠ 터미널 코드페이지 CP${env.locale.codepage} (CP949) — leerness 한국어 출력 깨짐 위험`));
|
|
2519
|
+
if (process.env._LEERNESS_AUTOCHCP_APPLIED) {
|
|
2520
|
+
lines.push(gr(` ✓ chcp 65001 자동 적용됨 (이전: ${process.env._LEERNESS_AUTOCHCP_APPLIED}, 1.9.249)`));
|
|
2521
|
+
} else {
|
|
2522
|
+
lines.push(dm(` → 수동: chcp 65001 (또는 자동: LEERNESS_NO_AUTOCHCP 미설정)`));
|
|
2523
|
+
}
|
|
2524
|
+
} else if (env.locale.codepage === 65001) {
|
|
2525
|
+
lines.push(gr(` ✓ 터미널 인코딩 UTF-8 (65001) — 한국어 출력 안전`));
|
|
2526
|
+
}
|
|
2527
|
+
// POSIX (Linux/macOS/WSL) locale UTF-8 점검
|
|
2528
|
+
if (env.locale.posixEncodingOk === false) {
|
|
2529
|
+
ok = false;
|
|
2530
|
+
const wslTag = env.locale.isWSL ? ' (WSL)' : '';
|
|
2531
|
+
lines.push(yl(` ⚠ POSIX${wslTag} locale에 UTF-8 없음 (LANG=${env.locale.LANG || 'unset'}) — 한국어 출력 깨질 위험`));
|
|
2532
|
+
lines.push(dm(` → 권장: export LANG=ko_KR.UTF-8 (또는 export LC_ALL=C.UTF-8)`));
|
|
2533
|
+
lines.push(dm(` → 영구: ~/.bashrc 또는 ~/.zshrc 에 추가`));
|
|
2534
|
+
} else if (env.locale.posixEncodingOk === true) {
|
|
2535
|
+
const wslTag = env.locale.isWSL ? ' (WSL)' : '';
|
|
2536
|
+
lines.push(gr(` ✓ POSIX locale UTF-8${wslTag} — 한국어 출력 안전`));
|
|
2537
|
+
}
|
|
2538
|
+
return { ok, lines };
|
|
2539
|
+
}
|
|
2540
|
+
|
|
2471
2541
|
// 셸 스크립트 (.ps1/.bat/.cmd/.sh) 인코딩 위험 감지
|
|
2472
2542
|
// 위험 시그널: 한국어 (또는 비-ASCII) 문자 + BOM 없음 + Windows 환경
|
|
2473
2543
|
function _scanShellScriptsEncoding(root) {
|
|
@@ -2618,6 +2688,16 @@ function envCmd(root, sub) {
|
|
|
2618
2688
|
} else if (env.locale.codepage === 65001) {
|
|
2619
2689
|
log(gr(` ✓ 터미널 인코딩 UTF-8 (65001) — 한국어 출력 안전`));
|
|
2620
2690
|
}
|
|
2691
|
+
// 1.9.250 (UR-0018 2단계): POSIX (Linux/macOS/WSL) terminal encoding 점검
|
|
2692
|
+
if (env.os.platform === 'linux' || env.os.platform === 'darwin') {
|
|
2693
|
+
const wslTag = env.locale.isWSL ? yl(' (WSL)') : '';
|
|
2694
|
+
if (env.locale.posixEncodingOk === true) {
|
|
2695
|
+
log(gr(` ✓ POSIX locale UTF-8 — ${env.os.platform === 'darwin' ? 'macOS' : 'Linux'}${wslTag} 한국어 출력 안전`));
|
|
2696
|
+
} else if (env.locale.posixEncodingOk === false) {
|
|
2697
|
+
log(yl(` ⚠ POSIX locale에 UTF-8 없음 (LANG=${env.locale.LANG || 'unset'}) — 한국어 출력 깨질 위험`));
|
|
2698
|
+
log(dm(` → 권장: export LANG=ko_KR.UTF-8 (또는 export LC_ALL=C.UTF-8)`));
|
|
2699
|
+
}
|
|
2700
|
+
}
|
|
2621
2701
|
log(` 🖥 Hardware: ${env.hardware.cpus} CPUs · ${env.hardware.memGB} GB RAM`);
|
|
2622
2702
|
log(` 🖱 Terminal: TTY=${env.terminal.isTTY}${env.terminal.powershell ? ` · PowerShell v${env.terminal.powershell}` : ''}`);
|
|
2623
2703
|
log(` 🔧 Tools:`);
|
|
@@ -7032,7 +7112,10 @@ function handoff(root) {
|
|
|
7032
7112
|
encodingRiskFiles: encScan.atRisk.slice(0, 5).map(r => r.file),
|
|
7033
7113
|
// 1.9.249 (UR-0018): 터미널 출력 인코딩 안전 여부 + 자동 회복 결과
|
|
7034
7114
|
terminalEncodingOk: runtimeEnv.locale.codepage === 65001 || !runtimeEnv.locale.isKoreanWindows,
|
|
7035
|
-
autoChcpApplied: process.env._LEERNESS_AUTOCHCP_APPLIED || null
|
|
7115
|
+
autoChcpApplied: process.env._LEERNESS_AUTOCHCP_APPLIED || null,
|
|
7116
|
+
// 1.9.250 (UR-0018 2단계): POSIX (Linux/macOS/WSL) terminal encoding 점검
|
|
7117
|
+
posixEncodingOk: runtimeEnv.locale.posixEncodingOk,
|
|
7118
|
+
isWSL: runtimeEnv.locale.isWSL || false
|
|
7036
7119
|
};
|
|
7037
7120
|
} catch {}
|
|
7038
7121
|
// 1.9.245: apiSkills 통합 (handoff JSON 11번째 통합 필드) — UR-0015 API 문서 캐시
|
|
@@ -7438,6 +7521,18 @@ function handoff(root) {
|
|
|
7438
7521
|
log(dm6(` → 수동: chcp 65001 + 새 터미널 또는 LEERNESS_NO_AUTOCHCP 미설정 시 다음 호출 자동 회복`));
|
|
7439
7522
|
}
|
|
7440
7523
|
}
|
|
7524
|
+
// 1.9.250 (UR-0018 2단계): POSIX (Linux/macOS/WSL) terminal encoding 경고
|
|
7525
|
+
if (runtimeEnv.locale.posixEncodingOk === false) {
|
|
7526
|
+
const isTty6 = process.stdout && process.stdout.isTTY;
|
|
7527
|
+
const yl7 = s => isTty6 ? `\x1b[33m${s}\x1b[0m` : s;
|
|
7528
|
+
const dm7 = s => isTty6 ? `\x1b[2m${s}\x1b[0m` : s;
|
|
7529
|
+
const wslTag = runtimeEnv.locale.isWSL ? ' (WSL)' : '';
|
|
7530
|
+
log('');
|
|
7531
|
+
log(yl7(`## ⚠ 터미널 인코딩 — POSIX${wslTag} locale에 UTF-8 없음 (1.9.250, UR-0018 2단계)`));
|
|
7532
|
+
log(dm7(` LANG=${runtimeEnv.locale.LANG || 'unset'} · LC_ALL=${runtimeEnv.locale.LC_ALL || 'unset'}`));
|
|
7533
|
+
log(dm7(` → 권장: export LANG=ko_KR.UTF-8 (또는 export LC_ALL=C.UTF-8)`));
|
|
7534
|
+
log(dm7(` → 영구 적용: ~/.bashrc 또는 ~/.zshrc 에 추가`));
|
|
7535
|
+
}
|
|
7441
7536
|
} catch {}
|
|
7442
7537
|
|
|
7443
7538
|
// 1.9.245: API skill cache 자동 참조 (사용자 명시 UR-0015)
|
|
@@ -11350,7 +11445,13 @@ function sessionClose(root, opts = {}) {
|
|
|
11350
11445
|
nodeVersion: runtimeEnv.node.version,
|
|
11351
11446
|
shellScriptsScanned: encScan.scanned,
|
|
11352
11447
|
encodingRiskCount: encScan.atRisk.length,
|
|
11353
|
-
encodingRiskFiles: encScan.atRisk.slice(0, 5).map(r => r.file)
|
|
11448
|
+
encodingRiskFiles: encScan.atRisk.slice(0, 5).map(r => r.file),
|
|
11449
|
+
// 1.9.249 (UR-0018): 터미널 출력 인코딩 안전 여부 + 자동 회복 결과
|
|
11450
|
+
terminalEncodingOk: runtimeEnv.locale.codepage === 65001 || !runtimeEnv.locale.isKoreanWindows,
|
|
11451
|
+
autoChcpApplied: process.env._LEERNESS_AUTOCHCP_APPLIED || null,
|
|
11452
|
+
// 1.9.250 (UR-0018 2단계): POSIX (Linux/macOS/WSL) terminal encoding 점검
|
|
11453
|
+
posixEncodingOk: runtimeEnv.locale.posixEncodingOk,
|
|
11454
|
+
isWSL: runtimeEnv.locale.isWSL || false
|
|
11354
11455
|
};
|
|
11355
11456
|
} catch {}
|
|
11356
11457
|
// 1.9.245: apiSkills 통합 (session close JSON 11번째 통합 필드) — UR-0015
|
|
@@ -18144,7 +18245,13 @@ function healthCmd(root) {
|
|
|
18144
18245
|
nodeVersion: runtimeEnv.node.version,
|
|
18145
18246
|
shellScriptsScanned: encScan.scanned,
|
|
18146
18247
|
encodingRiskCount: encScan.atRisk.length,
|
|
18147
|
-
encodingRiskFiles: encScan.atRisk.slice(0, 5).map(r => r.file)
|
|
18248
|
+
encodingRiskFiles: encScan.atRisk.slice(0, 5).map(r => r.file),
|
|
18249
|
+
// 1.9.249 (UR-0018): 터미널 출력 인코딩 안전 여부 + 자동 회복 결과
|
|
18250
|
+
terminalEncodingOk: runtimeEnv.locale.codepage === 65001 || !runtimeEnv.locale.isKoreanWindows,
|
|
18251
|
+
autoChcpApplied: process.env._LEERNESS_AUTOCHCP_APPLIED || null,
|
|
18252
|
+
// 1.9.250 (UR-0018 2단계): POSIX (Linux/macOS/WSL) terminal encoding 점검
|
|
18253
|
+
posixEncodingOk: runtimeEnv.locale.posixEncodingOk,
|
|
18254
|
+
isWSL: runtimeEnv.locale.isWSL || false
|
|
18148
18255
|
};
|
|
18149
18256
|
} catch { out.envInfo = { error: 'envInfo 점검 실패' }; }
|
|
18150
18257
|
// 1.9.245: health --json apiSkills 통합 (3 명령 11 필드 — UR-0015)
|