leerness 1.9.241 β 1.9.242
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 +39 -0
- package/README.md +3 -3
- package/bin/harness.js +94 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,44 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.242 β 2026-05-26
|
|
4
|
+
|
|
5
|
+
**π UR-0014 2λ¨κ³: env encoding --apply (BOM μλ μΆκ°) + JSON 10 νλ envInfo + drift --auto-fix ν΅ν©.**
|
|
6
|
+
|
|
7
|
+
### μ¬μ©μ λͺ
μ (UR-0014) β 2λ¨κ³ μλ ν볡
|
|
8
|
+
|
|
9
|
+
1.9.241 μμ κ°μ§λ§ μ 곡νλ μνμ 1.9.242 κ° **μ€μ μλ μμ **μΌλ‘ νμ₯:
|
|
10
|
+
|
|
11
|
+
### 1. `leerness env encoding --apply` μλ BOM μΆκ°
|
|
12
|
+
- `.ps1` / `.bat` / `.cmd` / `.sh` μ μν νμΌμ UTF-8 BOM (`EF BB BF`) μλ prepend
|
|
13
|
+
- `--auto-fix-bom` λ³μΉ λμΌ λμ
|
|
14
|
+
- κΈ°λ³Έ dry-run μ μ§ (--apply λͺ
μ μμλ§ λ³κ²½) β μμ μμΉ
|
|
15
|
+
- μ μ© κ²°κ³Ό `result.applied` λ°°μ΄λ‘ λ
ΈμΆ (file/action: utf8-bom-added | failed)
|
|
16
|
+
|
|
17
|
+
### 2. handoff/session close/health --json **10 νλ** envInfo ν΅ν©
|
|
18
|
+
- JSON ν΅ν© λ§€νΈλ¦μ€ 9 β **10 νλ** μ§ν (3 λͺ
λ Ή Γ 10 = 30 ν΅ν© ν¬μΈνΈ)
|
|
19
|
+
- `envInfo`: os / isKoreanWindows / codepage / nodeVersion / shellScriptsScanned / encodingRiskCount / encodingRiskFiles[0..5]
|
|
20
|
+
- μΈλΆ AI κ° νκ²½ 컨ν
μ€νΈ + μΈμ½λ© μνμ λ¨μΌ νΈμΆμμ νμ
|
|
21
|
+
|
|
22
|
+
### 3. drift check --auto-fix env encoding BOM ν΅ν©
|
|
23
|
+
- 1.9.82 보μ ν볡 + 1.9.225 delivered + 1.9.236 release cleanup μλ ν볡 ν¨ν΄ νμ₯
|
|
24
|
+
- `drift check --auto-fix` μ μ
Έ μ€ν¬λ¦½νΈ μν μλ BOM μΆκ°
|
|
25
|
+
- log: `π --auto-fix νμ± (1.9.242) β μ
Έ μ€ν¬λ¦½νΈ μΈμ½λ© μν N건 BOM μλ μΆκ° μ€...`
|
|
26
|
+
|
|
27
|
+
### 4. λμ νκ· (1.9.207~241) β λͺ¨λ μ μ§
|
|
28
|
+
- MCP 69 λꡬ μ μ§ (1.9.242 λ μ κ· CLI μ΅μ
+ ν΅ν©, λꡬ μ¦κ° X)
|
|
29
|
+
- handoff JSON: userRequestsAudit + preWakeAudit + idempotencyAudit + abnormalShutdown + deliveredRequests + roundHistory + milestones + recentChanges + pyFiles + **envInfo** (10)
|
|
30
|
+
|
|
31
|
+
### 5. stress-v187 β **22/22 PASS Β· 100%**
|
|
32
|
+
- 1.9.242 (8): VERSION + env --apply (격리) + --auto-fix-bom λ³μΉ + handoff/session close/health 10νλ envInfo + drift --auto-fix BOM ν΅ν© + envInfo μ€ν€λ§
|
|
33
|
+
- μ±λ₯ (2): cold_start avg 371ms Β· env --apply 372ms
|
|
34
|
+
- λμ νκ· (12): 1.9.207~241
|
|
35
|
+
|
|
36
|
+
### 6. μλ release (104 λΌμ΄λ main-push streak Β· 65 λΌμ΄λ npm publish streak)
|
|
37
|
+
|
|
38
|
+
π **UR-0014 μμ μλν** β κ°μ§ (1.9.241) β μλ μμ (1.9.242)
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
3
42
|
## 1.9.241 β 2026-05-24
|
|
4
43
|
|
|
5
44
|
**π leerness env + νκ΅μ΄ PowerShell μΈμ½λ© μν μ¬μ κ°μ§ (μ¬μ©μ λͺ
μ UR-0014).**
|
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.242 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β π env encoding
|
|
17
|
+
β π env encoding --apply BOM μλ μΆκ° (UR-0014 2λ¨κ³) β
|
|
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.242';
|
|
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 μ²λ¦¬).
|
|
@@ -2491,8 +2491,25 @@ function envCmd(root, sub) {
|
|
|
2491
2491
|
const dm = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
2492
2492
|
if (sub === 'encoding-check') {
|
|
2493
2493
|
const result = _scanShellScriptsEncoding(root);
|
|
2494
|
+
// 1.9.242: --apply μ΅μ
β μν νμΌμ UTF-8 BOM μλ μΆκ° (μ¬μ©μ λͺ
μ UR-0014 2λ¨κ³)
|
|
2495
|
+
const apply = has('--apply') || has('--auto-fix-bom');
|
|
2496
|
+
if (apply) result.applied = [];
|
|
2497
|
+
if (apply && result.atRisk.length > 0) {
|
|
2498
|
+
for (const r of result.atRisk) {
|
|
2499
|
+
try {
|
|
2500
|
+
const fullPath = path.join(root, r.file);
|
|
2501
|
+
const orig = fs.readFileSync(fullPath);
|
|
2502
|
+
const bom = Buffer.from([0xEF, 0xBB, 0xBF]);
|
|
2503
|
+
const fixed = Buffer.concat([bom, orig]);
|
|
2504
|
+
fs.writeFileSync(fullPath, fixed);
|
|
2505
|
+
result.applied.push({ file: r.file, action: 'utf8-bom-added' });
|
|
2506
|
+
} catch (e) {
|
|
2507
|
+
result.applied.push({ file: r.file, action: 'failed', error: e.message });
|
|
2508
|
+
}
|
|
2509
|
+
}
|
|
2510
|
+
}
|
|
2494
2511
|
if (has('--json')) { log(JSON.stringify(result, null, 2)); return; }
|
|
2495
|
-
log(cy(`# leerness env encoding-check (1.9.241, UR-0014) β μ
Έ μ€ν¬λ¦½νΈ μΈμ½λ© μν κ°μ§`));
|
|
2512
|
+
log(cy(`# leerness env encoding-check (1.9.241/242, UR-0014) β μ
Έ μ€ν¬λ¦½νΈ μΈμ½λ© μν κ°μ§`));
|
|
2496
2513
|
log('');
|
|
2497
2514
|
log(` μ€μΊ: ${gr(String(result.scanned))} νμΌ (.ps1/.bat/.cmd/.sh)`);
|
|
2498
2515
|
if (result.atRisk.length === 0) {
|
|
@@ -2504,7 +2521,14 @@ function envCmd(root, sub) {
|
|
|
2504
2521
|
log(dm(` ${r.risk}`));
|
|
2505
2522
|
});
|
|
2506
2523
|
log('');
|
|
2507
|
-
|
|
2524
|
+
if (apply) {
|
|
2525
|
+
const okCnt = (result.applied || []).filter(a => a.action === 'utf8-bom-added').length;
|
|
2526
|
+
const failCnt = (result.applied || []).filter(a => a.action === 'failed').length;
|
|
2527
|
+
log(gr(` β UTF-8 BOM μΆκ° ${okCnt}건${failCnt > 0 ? ` (μ€ν¨ ${failCnt}건)` : ''} (1.9.242 --apply)`));
|
|
2528
|
+
} else {
|
|
2529
|
+
result.notes.forEach(n => log(yl(` π‘ ${n}`)));
|
|
2530
|
+
log(dm(` β μλ μμ : leerness env encoding --apply (BOM μλ μΆκ°)`));
|
|
2531
|
+
}
|
|
2508
2532
|
}
|
|
2509
2533
|
return;
|
|
2510
2534
|
}
|
|
@@ -6554,6 +6578,20 @@ function handoff(root) {
|
|
|
6554
6578
|
totalClasses: analyses.reduce((s, a) => s + a.classes, 0)
|
|
6555
6579
|
};
|
|
6556
6580
|
} catch {}
|
|
6581
|
+
// 1.9.242: envInfo ν΅ν© (handoff JSON 10λ²μ§Έ ν΅ν© νλ) β νκ²½ + μΈμ½λ© μν (UR-0014 2λ¨κ³)
|
|
6582
|
+
try {
|
|
6583
|
+
const runtimeEnv = _collectRuntimeEnv();
|
|
6584
|
+
const encScan = _scanShellScriptsEncoding(root);
|
|
6585
|
+
result.envInfo = {
|
|
6586
|
+
os: runtimeEnv.os.platform,
|
|
6587
|
+
isKoreanWindows: runtimeEnv.locale.isKoreanWindows || false,
|
|
6588
|
+
codepage: runtimeEnv.locale.codepage || null,
|
|
6589
|
+
nodeVersion: runtimeEnv.node.version,
|
|
6590
|
+
shellScriptsScanned: encScan.scanned,
|
|
6591
|
+
encodingRiskCount: encScan.atRisk.length,
|
|
6592
|
+
encodingRiskFiles: encScan.atRisk.slice(0, 5).map(r => r.file)
|
|
6593
|
+
};
|
|
6594
|
+
} catch {}
|
|
6557
6595
|
} catch {}
|
|
6558
6596
|
try {
|
|
6559
6597
|
const pwState = _loadPreWakeReport(root);
|
|
@@ -10777,6 +10815,20 @@ function sessionClose(root, opts = {}) {
|
|
|
10777
10815
|
totalClasses: analyses.reduce((s, a) => s + a.classes, 0)
|
|
10778
10816
|
};
|
|
10779
10817
|
} catch {}
|
|
10818
|
+
// 1.9.242: envInfo ν΅ν© (session close JSON 10λ²μ§Έ ν΅ν© νλ) β UR-0014 2λ¨κ³
|
|
10819
|
+
try {
|
|
10820
|
+
const runtimeEnv = _collectRuntimeEnv();
|
|
10821
|
+
const encScan = _scanShellScriptsEncoding(root);
|
|
10822
|
+
jsonResult.envInfo = {
|
|
10823
|
+
os: runtimeEnv.os.platform,
|
|
10824
|
+
isKoreanWindows: runtimeEnv.locale.isKoreanWindows || false,
|
|
10825
|
+
codepage: runtimeEnv.locale.codepage || null,
|
|
10826
|
+
nodeVersion: runtimeEnv.node.version,
|
|
10827
|
+
shellScriptsScanned: encScan.scanned,
|
|
10828
|
+
encodingRiskCount: encScan.atRisk.length,
|
|
10829
|
+
encodingRiskFiles: encScan.atRisk.slice(0, 5).map(r => r.file)
|
|
10830
|
+
};
|
|
10831
|
+
} catch {}
|
|
10780
10832
|
} catch {}
|
|
10781
10833
|
try {
|
|
10782
10834
|
// 1.9.209: pre-wake-audit μλ μ€ν + μ μ₯ (sleep μ μλ μ κ²)
|
|
@@ -13868,6 +13920,31 @@ function driftCheckCmd(root, opts = {}) {
|
|
|
13868
13920
|
log(`β auto-fix 보μ ν볡 μ€λ₯: ${e.message}`);
|
|
13869
13921
|
}
|
|
13870
13922
|
}
|
|
13923
|
+
// 1.9.242: drift check --auto-fix μ env encoding BOM μλ μΆκ° ν΅ν© (μ¬μ©μ λͺ
μ UR-0014 2λ¨κ³)
|
|
13924
|
+
// 1.9.82 ν¨ν΄ νμ₯ β drift ν볡 μ μ
Έ μ€ν¬λ¦½νΈ μΈμ½λ© μνλ μλ ν΄κ²°
|
|
13925
|
+
if (autoFix) {
|
|
13926
|
+
try {
|
|
13927
|
+
const encScan = _scanShellScriptsEncoding(root);
|
|
13928
|
+
if (encScan.atRisk && encScan.atRisk.length > 0) {
|
|
13929
|
+
log('');
|
|
13930
|
+
log(`π --auto-fix νμ± (1.9.242) β μ
Έ μ€ν¬λ¦½νΈ μΈμ½λ© μν ${encScan.atRisk.length}건 BOM μλ μΆκ° μ€...`);
|
|
13931
|
+
let ok = 0;
|
|
13932
|
+
for (const r of encScan.atRisk) {
|
|
13933
|
+
try {
|
|
13934
|
+
const fullPath = path.join(root, r.file);
|
|
13935
|
+
const orig = fs.readFileSync(fullPath);
|
|
13936
|
+
const bom = Buffer.from([0xEF, 0xBB, 0xBF]);
|
|
13937
|
+
const fixed = Buffer.concat([bom, orig]);
|
|
13938
|
+
fs.writeFileSync(fullPath, fixed);
|
|
13939
|
+
ok++;
|
|
13940
|
+
} catch {}
|
|
13941
|
+
}
|
|
13942
|
+
log(`β UTF-8 BOM μΆκ° ${ok}/${encScan.atRisk.length}건 (1.9.242 UR-0014)`);
|
|
13943
|
+
}
|
|
13944
|
+
} catch (e) {
|
|
13945
|
+
log(`β env encoding auto-fix μ€λ₯ (1.9.242): ${e.message}`);
|
|
13946
|
+
}
|
|
13947
|
+
}
|
|
13871
13948
|
// 1.9.225: drift check --auto-fix μ delivered ν¨ν΄ μλ μ μ© ν΅ν© (1.9.223/224 μμ€ν
νμ)
|
|
13872
13949
|
// μ¬μ©μ μμ²μ "ꡬν μλ£" ν¨ν΄μ΄ λμ λλ©΄ κ°μ§ λ―Έλ΅ μ νΈκ° drift score λ₯Ό κ°μ€μν¬ μ μμ β μλ μ 리.
|
|
13873
13950
|
// 1.9.82 audit --fix ν¨ν΄κ³Ό λμΌ: --auto-fix μ μ¦μ μ μ©, μ μ© ν μ¬κ²μ¬.
|
|
@@ -17348,6 +17425,20 @@ function healthCmd(root) {
|
|
|
17348
17425
|
totalClasses: analyses.reduce((s, a) => s + a.classes, 0)
|
|
17349
17426
|
};
|
|
17350
17427
|
} catch { out.pyFiles = { error: 'pyFiles μ κ² μ€ν¨' }; }
|
|
17428
|
+
// 1.9.242: health --json envInfo ν΅ν© (3 λͺ
λ Ή 10 νλ β UR-0014 2λ¨κ³)
|
|
17429
|
+
try {
|
|
17430
|
+
const runtimeEnv = _collectRuntimeEnv();
|
|
17431
|
+
const encScan = _scanShellScriptsEncoding(root);
|
|
17432
|
+
out.envInfo = {
|
|
17433
|
+
os: runtimeEnv.os.platform,
|
|
17434
|
+
isKoreanWindows: runtimeEnv.locale.isKoreanWindows || false,
|
|
17435
|
+
codepage: runtimeEnv.locale.codepage || null,
|
|
17436
|
+
nodeVersion: runtimeEnv.node.version,
|
|
17437
|
+
shellScriptsScanned: encScan.scanned,
|
|
17438
|
+
encodingRiskCount: encScan.atRisk.length,
|
|
17439
|
+
encodingRiskFiles: encScan.atRisk.slice(0, 5).map(r => r.file)
|
|
17440
|
+
};
|
|
17441
|
+
} catch { out.envInfo = { error: 'envInfo μ κ² μ€ν¨' }; }
|
|
17351
17442
|
// 1.9.163: 5λ₯λ ₯ λ§€νΈλ¦μ€ μλ νκ° (1.9.155 sub-agent μ κ² β μ½λ κΈ°λ° μλν)
|
|
17352
17443
|
// κ° λ₯λ ₯μ μ½λ grep μΌλ‘ κ²μΆ β 0~100 μ μ. μ¬μ©μκ° λ§€ health νΈμΆ μ leerness μκΈ° νκ° νμΈ.
|
|
17353
17444
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.242",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|