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 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
- [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.128-green)]() [![tests](https://img.shields.io/badge/e2e-219%2F219-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-40_🎉-blue)]() [![json](https://img.shields.io/badge/--json-19_commands-blueviolet)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-58-blueviolet)]() [![cycle](https://img.shields.io/badge/DELETE--RESTORE-complete-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
5
+ [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.129-green)]() [![tests](https://img.shields.io/badge/e2e-219%2F219-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-40_🎉-blue)]() [![json](https://img.shields.io/badge/--json-19_commands-blueviolet)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-59-blueviolet)]() [![handoff](https://img.shields.io/badge/handoff--auto--recovery-7-blueviolet)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
6
6
 
7
7
  ```
8
8
  ╔══════════════════════════════════════════════════════════════╗
@@ -12,7 +12,7 @@
12
12
  ║ ██║ ██╔══╝ ██╔══╝ ██╔══██╗██║╚██╗██║██╔══╝ ╚════██║ ║
13
13
  ║ ███████╗███████╗███████╗██║ ██║██║ ╚████║███████╗███████║ ║
14
14
  ║ ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝ ║
15
- ║ v1.9.128 AI Agent Reliability Harness ║
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.128';
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.128+ MCP 40 도구 🎉 DELETE→RESTORE cycle58 라운드 자율 누적)')));
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) — 자동 회수 라인 비활성'));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.128",
3
+ "version": "1.9.129",
4
4
  "description": "Leerness: 비파괴 마이그레이션, 자동 버전 감지·업데이트, 계획/진행/핸드오프 자동화, 게으름·시크릿·인코딩 자동 가드, Claude Code 슬래시 통합을 갖춘 한국어 우선 AI 개발 하네스.",
5
5
  "keywords": [
6
6
  "leerness",