leerness 1.9.73 → 1.9.74
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 +17 -0
- package/README.md +3 -2
- package/bin/harness.js +33 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.74 — 2026-05-20
|
|
4
|
+
|
|
5
|
+
**`session close` 마감 시 누적 회고 통계 강화** (1.9.70 MCP + 1.9.68 history 결합).
|
|
6
|
+
|
|
7
|
+
### Improved — session close --suggest 블록 확장
|
|
8
|
+
- 기존: skill suggest 후보 / drift 상태 / 가장 많이 쓴 명령 top 3.
|
|
9
|
+
- **신규** 라인:
|
|
10
|
+
- `🔌 MCP 호출 (1.9.74): 총 N회, top: tool(n), ...` + `💡 드물게 호출된 MCP: ...` (1.9.70 통계 연동).
|
|
11
|
+
- `📒 skill match query 누적 (1.9.74): 총 N회 / 종류 M개` + top 3 query 표시 (1.9.68 rolling history 집계).
|
|
12
|
+
- AI 에이전트가 한 세션의 사용 패턴을 한눈에 파악 가능.
|
|
13
|
+
|
|
14
|
+
### Verified
|
|
15
|
+
- stress-v20 — session close 회고 통계 + 1.9.43~73 누적 회귀.
|
|
16
|
+
- e2e 219/219 PASS 유지.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
3
20
|
## 1.9.73 — 2026-05-20
|
|
4
21
|
|
|
5
22
|
**MCP server 14번째 도구 `leerness_env_check` 추가 (1.9.71 env 보안을 외부 AI에 노출)**.
|
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.74 AI Agent Reliability Harness ║
|
|
16
16
|
║ verify · remember · orchestrate · audit · prevent drift ║
|
|
17
17
|
╚══════════════════════════════════════════════════════════════╝
|
|
18
18
|
```
|
|
@@ -433,6 +433,7 @@ npm test # = node ./scripts/e2e.js
|
|
|
433
433
|
|
|
434
434
|
## 변경 이력 (최근)
|
|
435
435
|
|
|
436
|
+
- **1.9.74** — **`session close` 마감 시 누적 회고 통계 강화** — MCP tools/call 카운트 + skill match query top + drift 통계를 자동 요약 (1.9.70 + 1.9.68 결합).
|
|
436
437
|
- **1.9.73** — **MCP server 14번째 도구 `leerness_env_check`** — 1.9.71 env 보안 검사를 외부 AI에 노출 (외부 워크스페이스 .env/.env.example 동기화 자동 점검).
|
|
437
438
|
- **1.9.72** — **`leerness brainstorm`에 skill-suggestions.md history + task-log 실패 라인 통합** — 누적 컨텍스트 기반 brainstorm 강화 (이전 매칭 이력 + task-log 실패 회수).
|
|
438
439
|
- **1.9.71** — **`.env` / `.env.example` 자동 동기화** — `leerness env check` / `env sync` 명령 + `audit` 통합 (`--fix`로 누락 키 자동 추가). 보안 정책: 실제 값 절대 노출 안 함 (키만 추가, 값은 빈 문자열).
|
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.74';
|
|
10
10
|
const MARK = '<!-- leerness:managed -->';
|
|
11
11
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
12
12
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -3242,7 +3242,7 @@ function _banner(opts = {}) {
|
|
|
3242
3242
|
lines.push('');
|
|
3243
3243
|
for (const ln of lines) log(ln);
|
|
3244
3244
|
if (opts.quickStart) {
|
|
3245
|
-
log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.
|
|
3245
|
+
log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.74+ 워크플로)')));
|
|
3246
3246
|
log(' ' + C.green('npx leerness@latest init .') + C.dim(' # 신규 프로젝트 + 외부 AI CLI 설정'));
|
|
3247
3247
|
log(' ' + C.green('npx leerness handoff .') + C.dim(' # 컨텍스트 + lessons + 매칭 skill + 이전 history hit (1.9.69)'));
|
|
3248
3248
|
log(' ' + C.green('npx leerness skill match "<query>"') + C.dim(' # 매칭 skill + rolling history 자동 누적 (1.9.68)'));
|
|
@@ -4036,6 +4036,37 @@ function sessionClose(root) {
|
|
|
4036
4036
|
if (entries.length) {
|
|
4037
4037
|
log(dim(` 📊 가장 많이 쓴 명령: ${entries.map(([c, n]) => `${c}(${n})`).join(', ')}`));
|
|
4038
4038
|
}
|
|
4039
|
+
// 1.9.74: MCP tools/call 통계 + rare 도구 노출
|
|
4040
|
+
if (stats.mcp && stats.mcp.tools) {
|
|
4041
|
+
const mcpEntries = Object.entries(stats.mcp.tools).sort((a, b) => b[1] - a[1]);
|
|
4042
|
+
if (mcpEntries.length) {
|
|
4043
|
+
const mcpTotal = mcpEntries.reduce((s, [, n]) => s + n, 0);
|
|
4044
|
+
log(dim(` 🔌 MCP 호출 (1.9.74): 총 ${mcpTotal}회, top: ${mcpEntries.slice(0, 3).map(([t, n]) => `${t}(${n})`).join(', ')}`));
|
|
4045
|
+
const threshold = Math.max(1, Math.floor(mcpTotal * 0.05));
|
|
4046
|
+
const rare = mcpEntries.filter(([, n]) => n <= threshold).map(([t]) => t);
|
|
4047
|
+
if (rare.length && mcpTotal >= 5) log(dim(` 💡 드물게 호출된 MCP: ${rare.slice(0, 4).join(', ')}`));
|
|
4048
|
+
}
|
|
4049
|
+
}
|
|
4050
|
+
} catch {}
|
|
4051
|
+
// 1.9.74: skill match query top (skill-suggestions.md 누적)
|
|
4052
|
+
try {
|
|
4053
|
+
const histPath = path.join(root, '.harness', 'skill-suggestions.md');
|
|
4054
|
+
if (exists(histPath)) {
|
|
4055
|
+
const histTxt = read(histPath);
|
|
4056
|
+
const queries = [];
|
|
4057
|
+
for (const block of histTxt.split(/\n(?=## )/)) {
|
|
4058
|
+
const h = block.match(/^## ([\d-]+ [\d:]+) — query "([^"]+)"/);
|
|
4059
|
+
if (h) queries.push(h[2]);
|
|
4060
|
+
}
|
|
4061
|
+
if (queries.length) {
|
|
4062
|
+
// 같은 query 개수 카운트
|
|
4063
|
+
const counts = {};
|
|
4064
|
+
for (const q of queries) counts[q] = (counts[q] || 0) + 1;
|
|
4065
|
+
const topQueries = Object.entries(counts).sort((a, b) => b[1] - a[1]).slice(0, 3);
|
|
4066
|
+
log(dim(` 📒 skill match query 누적 (1.9.74): 총 ${queries.length}회 / 종류 ${Object.keys(counts).length}개`));
|
|
4067
|
+
for (const [q, n] of topQueries) log(dim(` • "${q.slice(0, 50)}"${n > 1 ? ` (${n}회)` : ''}`));
|
|
4068
|
+
}
|
|
4069
|
+
}
|
|
4039
4070
|
} catch {}
|
|
4040
4071
|
log('');
|
|
4041
4072
|
}
|