leerness 1.9.161 → 1.9.162
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 +37 -0
- package/README.md +2 -2
- package/bin/harness.js +22 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,42 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.162 — 2026-05-20
|
|
4
|
+
|
|
5
|
+
**handoff 헤드라인 9번째 요소 — REPL slash 사용량 (24h) 노출.**
|
|
6
|
+
|
|
7
|
+
자율 모드 92 라운드. 1.9.149 observability `runs/*.jsonl` 의 실용화 — REPL 활용도 가시화.
|
|
8
|
+
|
|
9
|
+
### Added — 헤드라인 `🪄 slash 24h N회`
|
|
10
|
+
- 1.9.150/161 REPL slash 명령 8종 (`:verify` `:audit` `:handoff` `:health` `:lessons` `:brainstorm` `:tasks` `:plan`) 호출 빈도
|
|
11
|
+
- `.harness/runs/*.jsonl` 에서 `kind: 'agent_repl_slash'` + 24h 이내 entry 카운트
|
|
12
|
+
- 최근 200 파일만 스캔 (성능 보호)
|
|
13
|
+
- 슬래시 호출 없으면 노출 안 함 (노이즈 최소화)
|
|
14
|
+
|
|
15
|
+
### Headline 진화
|
|
16
|
+
| 요소 | 도입 |
|
|
17
|
+
|---|---|
|
|
18
|
+
| drift level | 1.9.81 |
|
|
19
|
+
| 🔒 보안 | 1.9.81 |
|
|
20
|
+
| 🔌 MCP N회 | 1.9.81 |
|
|
21
|
+
| 📒 skill query | 1.9.81 |
|
|
22
|
+
| 📚 N skills | 1.9.81 |
|
|
23
|
+
| ⚕ health | 1.9.93 |
|
|
24
|
+
| 🧠 mem T/D/R/P/L | 1.9.113 |
|
|
25
|
+
| 🤖 agents N | 1.9.152 |
|
|
26
|
+
| **🪄 slash 24h** | **1.9.162** |
|
|
27
|
+
|
|
28
|
+
### Use Cases
|
|
29
|
+
- 메인 에이전트가 매 세션 시작 시 "어제 REPL을 N회 사용했군 → 메모리 누적 신호" 즉시 인지
|
|
30
|
+
- 사용자가 leerness 도입 효과 추이 가시화
|
|
31
|
+
- observability lite (1.9.149) 의 첫 실용 application
|
|
32
|
+
|
|
33
|
+
### Verified
|
|
34
|
+
- e2e 217/217 ✓
|
|
35
|
+
- stress-v107: 13/13 (헤드라인 9번째 6종 + 누적 회귀 7종)
|
|
36
|
+
- VERSION = 1.9.162 / autonomous-rounds = 92
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
3
40
|
## 1.9.161 — 2026-05-20
|
|
4
41
|
|
|
5
42
|
**REPL Memory Slash 4종 추가 — Memory Surface 즉시 조회 (1.9.150 slash 패턴 확장).**
|
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,7 +12,7 @@
|
|
|
12
12
|
║ ██║ ██╔══╝ ██╔══╝ ██╔══██╗██║╚██╗██║██╔══╝ ╚════██║ ║
|
|
13
13
|
║ ███████╗███████╗███████╗██║ ██║██║ ╚████║███████╗███████║ ║
|
|
14
14
|
║ ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝ ║
|
|
15
|
-
║ v1.9.
|
|
15
|
+
║ v1.9.162 AI Agent Reliability Harness + Sandbox ║
|
|
16
16
|
║ verify · remember · orchestrate · audit · sandbox · drift ║
|
|
17
17
|
╚══════════════════════════════════════════════════════════════╝
|
|
18
18
|
```
|
package/bin/harness.js
CHANGED
|
@@ -6,7 +6,7 @@ const path = require('path');
|
|
|
6
6
|
const cp = require('child_process');
|
|
7
7
|
const readline = require('readline');
|
|
8
8
|
|
|
9
|
-
const VERSION = '1.9.
|
|
9
|
+
const VERSION = '1.9.162';
|
|
10
10
|
const MARK = '<!-- leerness:managed -->';
|
|
11
11
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
12
12
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -2965,10 +2965,30 @@ function handoff(root) {
|
|
|
2965
2965
|
parts.push(`🤖 agents ${ready.length} (${ready.map(c => c.id).join(',')})`);
|
|
2966
2966
|
}
|
|
2967
2967
|
} catch {}
|
|
2968
|
+
// 9) 1.9.162: REPL slash 사용량 (24h) — 1.9.149 observability runs/*.jsonl 활용
|
|
2969
|
+
// REPL slash 명령 (1.9.150 + 1.9.161 = 8종) 사용 빈도 노출 → 사용자가 REPL 활용도 인지
|
|
2970
|
+
try {
|
|
2971
|
+
const runsDir = _runsDir(root);
|
|
2972
|
+
if (exists(runsDir)) {
|
|
2973
|
+
const cutoff = Date.now() - 24 * 3600 * 1000;
|
|
2974
|
+
const files = fs.readdirSync(runsDir).filter(f => f.endsWith('.jsonl'));
|
|
2975
|
+
let slashCount = 0;
|
|
2976
|
+
for (const f of files.slice(-200)) { // 최근 200 파일만 (성능)
|
|
2977
|
+
try {
|
|
2978
|
+
const txt = read(path.join(runsDir, f));
|
|
2979
|
+
for (const line of txt.split('\n').filter(Boolean)) {
|
|
2980
|
+
const j = JSON.parse(line);
|
|
2981
|
+
if (j.kind === 'agent_repl_slash' && j.at && new Date(j.at).getTime() >= cutoff) slashCount++;
|
|
2982
|
+
}
|
|
2983
|
+
} catch {}
|
|
2984
|
+
}
|
|
2985
|
+
if (slashCount > 0) parts.push(`🪄 slash 24h ${slashCount}회`);
|
|
2986
|
+
}
|
|
2987
|
+
} catch {}
|
|
2968
2988
|
if (parts.length) {
|
|
2969
2989
|
const isTty = process.stdout && process.stdout.isTTY;
|
|
2970
2990
|
const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
2971
|
-
log(cy(`📊 헤드라인 (1.9.81/93/113/152): ${parts.join(' · ')}`));
|
|
2991
|
+
log(cy(`📊 헤드라인 (1.9.81/93/113/152/162): ${parts.join(' · ')}`));
|
|
2972
2992
|
}
|
|
2973
2993
|
} catch {}
|
|
2974
2994
|
}
|