leerness 1.9.128 → 1.9.129
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 +35 -0
- package/README.md +2 -2
- package/bin/harness.js +45 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,40 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.129 — 2026-05-20
|
|
4
|
+
|
|
5
|
+
**handoff 7번째 자동 회수 — 🗑 최근 24h archive 알림** — DELETE 5종 archive 활동을 매 세션 시작 시 자동 노출.
|
|
6
|
+
|
|
7
|
+
### Added — handoff archive 알림
|
|
8
|
+
- handoff 출력에 archive 활동 라인 추가:
|
|
9
|
+
```
|
|
10
|
+
🗑 최근 24h archive (1.9.129): D2/L1/P0 (3건 archived) — 복원 후보
|
|
11
|
+
→ 회수: leerness memory archive list --json
|
|
12
|
+
→ 복원: leerness memory restore <surface> <target>
|
|
13
|
+
```
|
|
14
|
+
- 3 archive 파일 (`decisions.archive.md`, `lessons.archive.md`, `plan.archive.md`) 의 mtime 24h 내 + entry date 24h 내만 카운트
|
|
15
|
+
- `--no-mem-delta` / `--compact` / `--quiet` / `LEERNESS_NO_MEM_DELTA=1` 로 끄기
|
|
16
|
+
|
|
17
|
+
### 7개 handoff 자동 회수
|
|
18
|
+
| # | 라운드 | 자동 회수 |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| 1 | (기존) | lessons matching |
|
|
21
|
+
| 2 | 1.9.45 | skill match 추천 |
|
|
22
|
+
| 3 | 1.9.69 | history hit |
|
|
23
|
+
| 4 | 1.9.88 | brainstorm hits |
|
|
24
|
+
| 5 | 1.9.81 | 통합 헤드라인 |
|
|
25
|
+
| 6 | 1.9.121 | 🆕 24h 메모리 변동 |
|
|
26
|
+
| **7** | **1.9.129** | **🗑 24h archive 알림** |
|
|
27
|
+
|
|
28
|
+
### 사용 시나리오
|
|
29
|
+
세션 시작 시 handoff:
|
|
30
|
+
```
|
|
31
|
+
🆕 최근 24h 메모리 변동 (1.9.121): task +3 · decision +1 · plan: 변경됨
|
|
32
|
+
🗑 최근 24h archive (1.9.129): D1/L0/P1 (2건 archived) — 복원 후보
|
|
33
|
+
→ 회수: leerness memory archive list --json
|
|
34
|
+
→ 복원: leerness memory restore <surface> <target>
|
|
35
|
+
```
|
|
36
|
+
AI 가 즉시 "어제 PostgreSQL 결정 취소했었네 — 다시 검토해야 할까?" 판단 가능.
|
|
37
|
+
|
|
3
38
|
## 1.9.128 — 2026-05-20
|
|
4
39
|
|
|
5
40
|
**`leerness memory restore` CLI + MCP 40번째 도구 `leerness_memory_restore`** 🎉 **MCP 40 도구 마일스톤** — DELETE→RESTORE cycle 완성.
|
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.129 AI Agent Reliability Harness ║
|
|
16
16
|
║ verify · remember · orchestrate · audit · prevent 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.129';
|
|
10
10
|
const MARK = '<!-- leerness:managed -->';
|
|
11
11
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
12
12
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -329,6 +329,7 @@ leerness audit . --fix # 누락 메타 자동 보강
|
|
|
329
329
|
- 1.9.126+ \`leerness plan remove <M-XXXX|title>\` + MCP **38 도구** (\`leerness_plan_remove\`) — milestone 영구 제거 (archive 보존). **Memory Surface DELETE 5종 완전 완성** 🎉.
|
|
330
330
|
- 1.9.127+ \`leerness memory archive list [--surface decisions|lessons|plan] [--json]\` + MCP **39 도구** (\`leerness_memory_archive_list\`) — DELETE 5종 archive 통합 조회 (복원 후보 회수).
|
|
331
331
|
- 1.9.128+ \`leerness memory restore <surface> <target>\` + MCP **40 도구 🎉** (\`leerness_memory_restore\`) — archive → active 복귀 (DELETE→RESTORE cycle 완성). **MCP 40 도구 마일스톤**.
|
|
332
|
+
- 1.9.129+ handoff **7번째 자동 회수** — \`🗑 최근 24h archive\` (D/L/P 카운트 + 복원 후보 안내). DELETE 활동 자동 인지.
|
|
332
333
|
|
|
333
334
|
---
|
|
334
335
|
|
|
@@ -2791,6 +2792,48 @@ function handoff(root) {
|
|
|
2791
2792
|
}
|
|
2792
2793
|
} catch {}
|
|
2793
2794
|
}
|
|
2795
|
+
// 1.9.129: handoff 7번째 자동 회수 — 🗑 최근 24h archive 알림
|
|
2796
|
+
// DELETE 5종 archive 파일 (.harness/decisions.archive.md, lessons.archive.md, plan.archive.md)
|
|
2797
|
+
// 에 최근 24h 내 추가된 entry 카운트를 노출. AI가 잘못 제거한 항목을 즉시 인지 + restore 후보 회수.
|
|
2798
|
+
// `leerness memory archive list` / `leerness memory restore <surface> <target>` 안내 포함.
|
|
2799
|
+
if (!has('--no-mem-delta') && !has('--compact') && !has('--quiet') && process.env.LEERNESS_NO_MEM_DELTA !== '1') {
|
|
2800
|
+
try {
|
|
2801
|
+
const isTtyArc = process.stdout && process.stdout.isTTY;
|
|
2802
|
+
const arcCy = s => isTtyArc ? `\x1b[36m${s}\x1b[0m` : s;
|
|
2803
|
+
const arcDim = s => isTtyArc ? `\x1b[2m${s}\x1b[0m` : s;
|
|
2804
|
+
const hd = path.join(root, '.harness');
|
|
2805
|
+
const cutoffArchive = Date.now() - 24 * 60 * 60 * 1000;
|
|
2806
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
2807
|
+
const yest = new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString().slice(0, 10);
|
|
2808
|
+
const surfaces = [
|
|
2809
|
+
{ key: 'D', label: 'decisions', file: 'decisions.archive.md' },
|
|
2810
|
+
{ key: 'L', label: 'lessons', file: 'lessons.archive.md' },
|
|
2811
|
+
{ key: 'P', label: 'plan', file: 'plan.archive.md' }
|
|
2812
|
+
];
|
|
2813
|
+
const archiveDeltas = [];
|
|
2814
|
+
let totalRecent = 0;
|
|
2815
|
+
for (const s of surfaces) {
|
|
2816
|
+
const fp = path.join(hd, s.file);
|
|
2817
|
+
if (!exists(fp)) continue;
|
|
2818
|
+
try {
|
|
2819
|
+
const stat = fs.statSync(fp);
|
|
2820
|
+
if (stat.mtimeMs < cutoffArchive) continue; // 파일 자체가 24h 외면 skip
|
|
2821
|
+
const entries = _parseArchiveBlocks(read(fp));
|
|
2822
|
+
const recent = entries.filter(e => e.date === today || e.date === yest).length;
|
|
2823
|
+
if (recent > 0) {
|
|
2824
|
+
archiveDeltas.push(`${s.key}${recent}`);
|
|
2825
|
+
totalRecent += recent;
|
|
2826
|
+
}
|
|
2827
|
+
} catch {}
|
|
2828
|
+
}
|
|
2829
|
+
if (totalRecent > 0) {
|
|
2830
|
+
log(arcCy(`🗑 최근 24h archive (1.9.129): ${archiveDeltas.join('/')} (${totalRecent}건 archived) — 복원 후보`));
|
|
2831
|
+
log(arcDim(` → 회수: leerness memory archive list --json`));
|
|
2832
|
+
log(arcDim(` → 복원: leerness memory restore <surface> <target>`));
|
|
2833
|
+
log('');
|
|
2834
|
+
}
|
|
2835
|
+
} catch {}
|
|
2836
|
+
}
|
|
2794
2837
|
// 1.9.76: handoff 보안 상태 요약 — .env vs .env.example + .gitignore 시크릿 패턴 1줄 요약
|
|
2795
2838
|
// 매 세션 시작 시 AI가 보안 위험을 즉시 인지. --no-security-summary 또는 --compact로 끄기
|
|
2796
2839
|
if (!has('--no-security-summary') && !has('--compact') && !has('--quiet')) {
|
|
@@ -4195,7 +4238,7 @@ function _banner(opts = {}) {
|
|
|
4195
4238
|
lines.push('');
|
|
4196
4239
|
for (const ln of lines) log(ln);
|
|
4197
4240
|
if (opts.quickStart) {
|
|
4198
|
-
log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.
|
|
4241
|
+
log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.129+ handoff 7 자동 회수 🗑 archive 알림 — 59 라운드 자율 누적)')));
|
|
4199
4242
|
log(' ' + C.green('npx leerness@latest init .') + C.dim(' # 신규 프로젝트 + 외부 AI CLI 설정'));
|
|
4200
4243
|
log(' ' + C.green('npx leerness handoff .') + C.dim(' # 컨텍스트 + lessons + 매칭 skill + history hit + brainstorm hits + 헤드라인'));
|
|
4201
4244
|
log(' ' + C.green('npx leerness handoff . --quiet') + C.dim(' # 자동화/CI 모드 (1.9.99) — 자동 회수 라인 비활성'));
|