leerness 1.9.239 β 1.9.240
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 +32 -0
- package/README.md +3 -3
- package/bin/harness.js +47 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.240 β 2026-05-24
|
|
4
|
+
|
|
5
|
+
**π UR-0013 2λ¨κ³: handoff/session close/health --json pyFiles (9 νλ) + ν€λλΌμΈ μλ.**
|
|
6
|
+
|
|
7
|
+
### 1. handoff/session close/health --json 9λ²μ§Έ ν΅ν© νλ `pyFiles`
|
|
8
|
+
- Python νμΌ μλ detect (1.9.239 `_collectPyFiles` μ¬μ¬μ©)
|
|
9
|
+
- νμ: `{ total, analyzed, totalLOC, totalImports, totalFuncs, totalClasses }`
|
|
10
|
+
- 3 λͺ
λ Ή μΌκ΄μ± λ§€νΈλ¦μ€ μ§ν: 7 β 8 β **9 νλ** (3 Γ 9 = 27 ν΅ν© ν¬μΈνΈ)
|
|
11
|
+
- AI κ° λ€μ€ μΈμ΄ μν¬μ€νμ΄μ€ (.md + .py) μΈμ§
|
|
12
|
+
|
|
13
|
+
### 2. handoff ν€λλΌμΈ 18λ²μ§Έ μμ
|
|
14
|
+
- `.py` νμΌ β₯ 1 μ: `π py N` μλ λ
ΈμΆ
|
|
15
|
+
- 0κ°μΌ λ λ―Έλ
ΈμΆ (μ‘°μ©ν¨)
|
|
16
|
+
|
|
17
|
+
### 3. UR-0013 2λ¨κ³ μλ£
|
|
18
|
+
- 1.9.239 1λ¨κ³: py-check CLI + agent-mode CLI + MCP 67/68
|
|
19
|
+
- **1.9.240 2λ¨κ³**: JSON 9 νλ + ν€λλΌμΈ μλ
|
|
20
|
+
- λ€μ€ μΈμ΄ νλ©΄ (.md + .py) μλ κ°μν
|
|
21
|
+
|
|
22
|
+
### 4. λμ νκ· (1.9.207~239) β λͺ¨λ μ μ§
|
|
23
|
+
|
|
24
|
+
### 5. stress-v185 β 16/16 PASS
|
|
25
|
+
- 1.9.240 (7): VERSION + handoff/session close/health JSON + 9 νλ + ν€λλΌμΈ (μμ/μμ)
|
|
26
|
+
- μ±λ₯ (1): cold_start avg 386ms
|
|
27
|
+
- λμ νκ· (8): 1.9.207~239
|
|
28
|
+
|
|
29
|
+
### 6. μλ release (102 λΌμ΄λ main-push streak Β· 63 λΌμ΄λ npm publish streak)
|
|
30
|
+
|
|
31
|
+
π **λ€μ€ μΈμ΄ νλ©΄ κ°μν** β .md + .py μλ ν΅ν© (μΈλΆ AI κ° λ νλ©΄ λͺ¨λ νμ)
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
3
35
|
## 1.9.239 β 2026-05-24
|
|
4
36
|
|
|
5
37
|
**π leerness py-check + π€ agent-mode + MCP 67/68 (μ¬μ©μ λͺ
μ UR-0013).**
|
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.240 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β π
|
|
17
|
+
β π JSON 9 νλ (3 λͺ
λ Ή Γ 9 = 27 ν΅ν© β UR-0013 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.240';
|
|
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 μ²λ¦¬).
|
|
@@ -6390,6 +6390,19 @@ function handoff(root) {
|
|
|
6390
6390
|
try {
|
|
6391
6391
|
result.recentChanges = _computeRecentChanges(root, 5);
|
|
6392
6392
|
} catch {}
|
|
6393
|
+
// 1.9.240: pyFiles ν΅ν© (handoff JSON 9λ²μ§Έ ν΅ν© νλ) β Python λ€μ€ μΈμ΄ κ°μν (UR-0013 2λ¨κ³)
|
|
6394
|
+
try {
|
|
6395
|
+
const pyFiles = _collectPyFiles(root, 200);
|
|
6396
|
+
const analyses = pyFiles.slice(0, 200).map(f => _analyzePyFile(f)).filter(Boolean);
|
|
6397
|
+
result.pyFiles = {
|
|
6398
|
+
total: pyFiles.length,
|
|
6399
|
+
analyzed: analyses.length,
|
|
6400
|
+
totalLOC: analyses.reduce((s, a) => s + a.loc, 0),
|
|
6401
|
+
totalImports: analyses.reduce((s, a) => s + a.imports, 0),
|
|
6402
|
+
totalFuncs: analyses.reduce((s, a) => s + a.funcs, 0),
|
|
6403
|
+
totalClasses: analyses.reduce((s, a) => s + a.classes, 0)
|
|
6404
|
+
};
|
|
6405
|
+
} catch {}
|
|
6393
6406
|
} catch {}
|
|
6394
6407
|
try {
|
|
6395
6408
|
const pwState = _loadPreWakeReport(root);
|
|
@@ -6552,6 +6565,13 @@ function handoff(root) {
|
|
|
6552
6565
|
parts.push(`π official ${m.total}/${m.cacheTotal} (${ageStr}${status})`);
|
|
6553
6566
|
}
|
|
6554
6567
|
} catch {}
|
|
6568
|
+
// 18) 1.9.240: pyFiles ν€λλΌμΈ β Python λ€μ€ μΈμ΄ κ°μν (UR-0013 2λ¨κ³, .py νμΌ β₯ 1)
|
|
6569
|
+
try {
|
|
6570
|
+
const pyFiles = _collectPyFiles(root, 200);
|
|
6571
|
+
if (pyFiles.length > 0) {
|
|
6572
|
+
parts.push(`π py ${pyFiles.length}`);
|
|
6573
|
+
}
|
|
6574
|
+
} catch {}
|
|
6555
6575
|
// 17) 1.9.226: round-history ν€λλΌμΈ β μμ¨ λΌμ΄λ μΉ΄μ΄ν° + λ€μ λ§μΌμ€ν€ (5 λΌμ΄λ μ΄μ μλ§ νμ)
|
|
6556
6576
|
// 1.9.230: λ€μ λ§μΌμ€ν€ ETA (10R μ΄λ΄ + ETA 7μΌ μ΄λ΄μΌ λ κ°μ‘°)
|
|
6557
6577
|
try {
|
|
@@ -10572,6 +10592,19 @@ function sessionClose(root, opts = {}) {
|
|
|
10572
10592
|
try {
|
|
10573
10593
|
jsonResult.recentChanges = _computeRecentChanges(root, 5);
|
|
10574
10594
|
} catch {}
|
|
10595
|
+
// 1.9.240: pyFiles ν΅ν© (session close JSON 9λ²μ§Έ ν΅ν© νλ) β UR-0013 2λ¨κ³
|
|
10596
|
+
try {
|
|
10597
|
+
const pyFiles = _collectPyFiles(root, 200);
|
|
10598
|
+
const analyses = pyFiles.slice(0, 200).map(f => _analyzePyFile(f)).filter(Boolean);
|
|
10599
|
+
jsonResult.pyFiles = {
|
|
10600
|
+
total: pyFiles.length,
|
|
10601
|
+
analyzed: analyses.length,
|
|
10602
|
+
totalLOC: analyses.reduce((s, a) => s + a.loc, 0),
|
|
10603
|
+
totalImports: analyses.reduce((s, a) => s + a.imports, 0),
|
|
10604
|
+
totalFuncs: analyses.reduce((s, a) => s + a.funcs, 0),
|
|
10605
|
+
totalClasses: analyses.reduce((s, a) => s + a.classes, 0)
|
|
10606
|
+
};
|
|
10607
|
+
} catch {}
|
|
10575
10608
|
} catch {}
|
|
10576
10609
|
try {
|
|
10577
10610
|
// 1.9.209: pre-wake-audit μλ μ€ν + μ μ₯ (sleep μ μλ μ κ²)
|
|
@@ -17125,6 +17158,19 @@ function healthCmd(root) {
|
|
|
17125
17158
|
try {
|
|
17126
17159
|
out.recentChanges = _computeRecentChanges(root, 5);
|
|
17127
17160
|
} catch { out.recentChanges = { error: 'recentChanges μ κ² μ€ν¨' }; }
|
|
17161
|
+
// 1.9.240: health --json pyFiles ν΅ν© (3 λͺ
λ Ή 9 νλ β UR-0013 2λ¨κ³)
|
|
17162
|
+
try {
|
|
17163
|
+
const pyFiles = _collectPyFiles(root, 200);
|
|
17164
|
+
const analyses = pyFiles.slice(0, 200).map(f => _analyzePyFile(f)).filter(Boolean);
|
|
17165
|
+
out.pyFiles = {
|
|
17166
|
+
total: pyFiles.length,
|
|
17167
|
+
analyzed: analyses.length,
|
|
17168
|
+
totalLOC: analyses.reduce((s, a) => s + a.loc, 0),
|
|
17169
|
+
totalImports: analyses.reduce((s, a) => s + a.imports, 0),
|
|
17170
|
+
totalFuncs: analyses.reduce((s, a) => s + a.funcs, 0),
|
|
17171
|
+
totalClasses: analyses.reduce((s, a) => s + a.classes, 0)
|
|
17172
|
+
};
|
|
17173
|
+
} catch { out.pyFiles = { error: 'pyFiles μ κ² μ€ν¨' }; }
|
|
17128
17174
|
// 1.9.163: 5λ₯λ ₯ λ§€νΈλ¦μ€ μλ νκ° (1.9.155 sub-agent μ κ² β μ½λ κΈ°λ° μλν)
|
|
17129
17175
|
// κ° λ₯λ ₯μ μ½λ grep μΌλ‘ κ²μΆ β 0~100 μ μ. μ¬μ©μκ° λ§€ health νΈμΆ μ leerness μκΈ° νκ° νμΈ.
|
|
17130
17176
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.240",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|