leerness 1.9.160 → 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 +76 -0
- package/README.md +2 -2
- package/bin/harness.js +43 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,81 @@
|
|
|
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
|
+
|
|
40
|
+
## 1.9.161 — 2026-05-20
|
|
41
|
+
|
|
42
|
+
**REPL Memory Slash 4종 추가 — Memory Surface 즉시 조회 (1.9.150 slash 패턴 확장).**
|
|
43
|
+
|
|
44
|
+
자율 모드 91 라운드. REPL 안에서 leerness 메모리 (lessons / brainstorm / tasks / plan) 즉시 조회 가능 → 대화 중 컨텍스트 회수 마찰 0.
|
|
45
|
+
|
|
46
|
+
### Added — REPL `:lessons` / `:brainstorm` / `:tasks` / `:plan`
|
|
47
|
+
- `:lessons [query]` — `leerness lessons --query <q>` 또는 인자 없이 전체 회수
|
|
48
|
+
- `:brainstorm <topic>` — `leerness brainstorm "topic"` (키워드 필수, 누락 시 안내)
|
|
49
|
+
- `:tasks` — `leerness task list` (현재 task 상태)
|
|
50
|
+
- `:plan` — `leerness plan show` (현재 milestone)
|
|
51
|
+
|
|
52
|
+
### 동작 방식
|
|
53
|
+
- 1.9.150 slash 패턴 재사용 — `runCommandSafe` 경유 (sandbox 자동 적용)
|
|
54
|
+
- `_recordRun` observability — `kind: 'agent_repl_slash'` 자동 기록
|
|
55
|
+
- 출력 30줄로 제한 (REPL 화면 보호)
|
|
56
|
+
- 60초 timeout
|
|
57
|
+
|
|
58
|
+
### REPL Slash 명령 카탈로그 갱신
|
|
59
|
+
| 1.9.150 (검수) | 1.9.161 (메모리) |
|
|
60
|
+
|---|---|
|
|
61
|
+
| `:verify` | `:lessons` |
|
|
62
|
+
| `:audit` | `:brainstorm` |
|
|
63
|
+
| `:handoff` | `:tasks` |
|
|
64
|
+
| `:health` | `:plan` |
|
|
65
|
+
|
|
66
|
+
### Use Cases
|
|
67
|
+
- 메인 에이전트가 새 task 시작 전 `:lessons "auth"` 로 과거 실수 회수
|
|
68
|
+
- `:brainstorm "deployment"` 로 관련 task-log / decisions / lessons 통합 검색
|
|
69
|
+
- `:tasks` 로 진행 중 task 즉시 확인 후 :provider claude 로 sub-agent 분배
|
|
70
|
+
- `:plan` 으로 현재 milestone 진행률 확인
|
|
71
|
+
|
|
72
|
+
### Verified
|
|
73
|
+
- e2e 217/217 ✓
|
|
74
|
+
- stress-v106: 13/13 (handleMeta 분기 4종 + REPL 시작 배너/help 안내 2종 + 누적 회귀 7종)
|
|
75
|
+
- VERSION = 1.9.161 / autonomous-rounds = 91
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
3
79
|
## 1.9.160 — 2026-05-20
|
|
4
80
|
|
|
5
81
|
**🎉 자율 모드 90 라운드 마일스톤 + `provider sync` (외부 catalog 자동 동기화).**
|
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
|
}
|
|
@@ -10757,6 +10777,7 @@ async function _agentRepl(root, opts) {
|
|
|
10757
10777
|
log('');
|
|
10758
10778
|
log(C.dim(' 메타 명령: :help | :model <m> | :role <r> | :provider <p> | :status | :clear | :save | :history | :quit'));
|
|
10759
10779
|
log(C.dim(' Slash 명령 (1.9.150): :verify | :audit | :handoff | :health'));
|
|
10780
|
+
log(C.dim(' Memory Slash (1.9.161): :lessons | :brainstorm <topic> | :tasks | :plan'));
|
|
10760
10781
|
log(C.dim(` 현재 — provider=${state.provider} model=${state.model || '(기본)'} role=${state.role} permissions=${_readPermissions(root).mode}`));
|
|
10761
10782
|
// 1.9.155: REPL 진입 시 handoff 컨텍스트 자동 노출 (UX 개선 — 사용자가 매번 :handoff 안 해도 컨텍스트 인지)
|
|
10762
10783
|
try {
|
|
@@ -10802,6 +10823,11 @@ async function _agentRepl(root, opts) {
|
|
|
10802
10823
|
log(' :audit — leerness audit (보안 + drift + lazy)');
|
|
10803
10824
|
log(' :handoff — leerness handoff --quiet (현재 컨텍스트 요약)');
|
|
10804
10825
|
log(' :health — leerness health --json (종합 헬스 체크)');
|
|
10826
|
+
log(C.bold('\n Memory Slash (1.9.161) — Memory Surface 즉시 조회:'));
|
|
10827
|
+
log(' :lessons [query] — leerness lessons (과거 결정/실수 회수)');
|
|
10828
|
+
log(' :brainstorm <topic> — leerness brainstorm "topic" (관련 컨텍스트 회수)');
|
|
10829
|
+
log(' :tasks — leerness task list (현재 task 상태)');
|
|
10830
|
+
log(' :plan — leerness plan show (현재 milestone)');
|
|
10805
10831
|
return false;
|
|
10806
10832
|
}
|
|
10807
10833
|
if (op === 'model') {
|
|
@@ -10899,13 +10925,26 @@ async function _agentRepl(root, opts) {
|
|
|
10899
10925
|
return false;
|
|
10900
10926
|
}
|
|
10901
10927
|
// 1.9.150: leerness 내부 명령 slash-commands — :verify / :audit / :handoff / :health
|
|
10902
|
-
|
|
10928
|
+
// 1.9.161: Memory Surface 조회 slash 추가 — :lessons / :brainstorm / :tasks / :plan
|
|
10929
|
+
if (op === 'verify' || op === 'audit' || op === 'handoff' || op === 'health'
|
|
10930
|
+
|| op === 'lessons' || op === 'brainstorm' || op === 'tasks' || op === 'plan') {
|
|
10931
|
+
const query = rest.join(' ').trim();
|
|
10903
10932
|
const subArgs = {
|
|
10904
10933
|
verify: ['verify-code', root],
|
|
10905
10934
|
audit: ['audit', root],
|
|
10906
10935
|
handoff: ['handoff', root, '--quiet', '--no-drift-check'],
|
|
10907
|
-
health: ['health', root, '--json']
|
|
10936
|
+
health: ['health', root, '--json'],
|
|
10937
|
+
// 1.9.161 Memory Surface slash 4종
|
|
10938
|
+
lessons: query ? ['lessons', '--query', query, '--path', root] : ['lessons', '--path', root],
|
|
10939
|
+
brainstorm: query ? ['brainstorm', query, '--path', root] : ['brainstorm', '--path', root],
|
|
10940
|
+
tasks: ['task', 'list', '--path', root],
|
|
10941
|
+
plan: ['plan', 'show', '--path', root]
|
|
10908
10942
|
}[op];
|
|
10943
|
+
// 인자 필요한데 누락 시 안내 (brainstorm 은 인자 필수)
|
|
10944
|
+
if (op === 'brainstorm' && !query) {
|
|
10945
|
+
log(C.yel(` ⚠ :brainstorm 은 키워드 필요 — 예: :brainstorm "auth bug"`));
|
|
10946
|
+
return false;
|
|
10947
|
+
}
|
|
10909
10948
|
log(C.dim(` → leerness ${subArgs.join(' ')}`));
|
|
10910
10949
|
const t0 = Date.now();
|
|
10911
10950
|
const r = runCommandSafe(process.execPath, [__filename, ...subArgs], {
|