leerness 1.9.134 → 1.9.136
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 +38 -0
- package/README.md +2 -2
- package/bin/harness.js +9 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.136 — 2026-05-20
|
|
4
|
+
|
|
5
|
+
**MCP `leerness_drift_check` JSON 응답 fix** — drift check CLI 는 `--json` 옵션을 지원하지만 MCP 라우팅이 plain 텍스트를 반환하던 버그 fix.
|
|
6
|
+
|
|
7
|
+
### Fixed — leerness_drift_check JSON 응답
|
|
8
|
+
- MCP 라우팅에 `--json` 플래그 자동 추가
|
|
9
|
+
- 응답 schema: `{ root, score, level, signals[], healthy }`
|
|
10
|
+
- 외부 AI 가 drift 상태를 정확한 구조화 데이터로 회수
|
|
11
|
+
|
|
12
|
+
### MCP 도구 JSON 일관성
|
|
13
|
+
이제 모든 MCP 도구가 plain 텍스트 대신 JSON 응답:
|
|
14
|
+
- handoff, health, audit, session_close, lazy_detect, benchmark, retro, lessons, memory_status, brainstorm, **drift_check (1.9.136 fix)**, 외 listing 도구 다수
|
|
15
|
+
|
|
16
|
+
## 1.9.135 — 2026-05-20
|
|
17
|
+
|
|
18
|
+
**MCP 42번째 도구 `leerness_rule_remove`** — Rule surface CRUD MCP 완전 완성.
|
|
19
|
+
|
|
20
|
+
### Added — MCP leerness_rule_remove
|
|
21
|
+
- 인자: `{ id (required), path? }`
|
|
22
|
+
- rules.md 에서 특정 rule 제거 + `.harness/rules.archive.md` 자동 보존
|
|
23
|
+
- 외부 AI 가 직접 rule 제거
|
|
24
|
+
|
|
25
|
+
### Rule surface CRUD MCP 완전 완성
|
|
26
|
+
| Op | MCP |
|
|
27
|
+
|---|---|
|
|
28
|
+
| CREATE | leerness_rule_add (1.9.109) |
|
|
29
|
+
| READ | leerness_rule_list (1.9.109) |
|
|
30
|
+
| **DELETE** | **leerness_rule_remove (1.9.135) ✓** |
|
|
31
|
+
|
|
32
|
+
### MCP CRUD 완성 surface 확장
|
|
33
|
+
- task: add/list/update/drop (1.9.105/134/106/107) ✓
|
|
34
|
+
- decision: add/list/drop (1.9.108/118/125) ✓
|
|
35
|
+
- lesson: save/list/drop (1.9.112/117/124) ✓
|
|
36
|
+
- plan: add/list/remove (1.9.110/119/126) ✓
|
|
37
|
+
- **rule: add/list/remove (1.9.109/109/135) ✓**
|
|
38
|
+
|
|
39
|
+
### MCP 도구 누계: 42 (1.9.134: 41 → 1.9.135: 42)
|
|
40
|
+
|
|
3
41
|
## 1.9.134 — 2026-05-20
|
|
4
42
|
|
|
5
43
|
**`leerness task list --json` + MCP 41번째 도구 `leerness_task_list`** — progress-tracker.md 전체 task JSON 조회.
|
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.136 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.136';
|
|
10
10
|
const MARK = '<!-- leerness:managed -->';
|
|
11
11
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
12
12
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -335,6 +335,8 @@ leerness audit . --fix # 누락 메타 자동 보강
|
|
|
335
335
|
- 1.9.132+ \`session close\` 텍스트 모드에 archive 누적 라인 추가 — 마감 시점 DELETE 활동 가시화 (handoff 7번째 회수와 symmetric). archive 가시성 6 surface 완성.
|
|
336
336
|
- 1.9.133+ \`brainstorm\` 텍스트 모드 lessonsExplicit / planMilestones display 추가 — 1.9.116에서 데이터 수집은 했지만 display 누락된 pre-existing gap fix.
|
|
337
337
|
- 1.9.134+ \`leerness task list --json\` + MCP **41 도구** (\`leerness_task_list\`) — progress-tracker.md task 전체 JSON 조회 + \`--status\` 필터. Task surface CRUD MCP 완전 완성 (add/list/update/drop).
|
|
338
|
+
- 1.9.135+ MCP **42 도구** (\`leerness_rule_remove\`) — rules.md 에서 특정 rule 제거 + archive 보존. **5 surface CRUD MCP 완전 완성** (task/decision/lesson/plan/rule 모두 add/list/delete MCP 노출).
|
|
339
|
+
- 1.9.136+ MCP \`leerness_drift_check\` JSON 응답 fix — \`--json\` 플래그 자동 추가하여 외부 AI가 구조화된 drift 신호 회수 (score, level, signals[], healthy).
|
|
338
340
|
|
|
339
341
|
---
|
|
340
342
|
|
|
@@ -4293,7 +4295,7 @@ function _banner(opts = {}) {
|
|
|
4293
4295
|
lines.push('');
|
|
4294
4296
|
for (const ln of lines) log(ln);
|
|
4295
4297
|
if (opts.quickStart) {
|
|
4296
|
-
log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.
|
|
4298
|
+
log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.136+ MCP drift_check JSON fix — 66 라운드 자율 누적)')));
|
|
4297
4299
|
log(' ' + C.green('npx leerness@latest init .') + C.dim(' # 신규 프로젝트 + 외부 AI CLI 설정'));
|
|
4298
4300
|
log(' ' + C.green('npx leerness handoff .') + C.dim(' # 컨텍스트 + lessons + 매칭 skill + history hit + brainstorm hits + 헤드라인'));
|
|
4299
4301
|
log(' ' + C.green('npx leerness handoff . --quiet') + C.dim(' # 자동화/CI 모드 (1.9.99) — 자동 회수 라인 비활성'));
|
|
@@ -8572,7 +8574,7 @@ function mcpServeCmd(root) {
|
|
|
8572
8574
|
// 노출할 leerness 도구 목록
|
|
8573
8575
|
const TOOLS = [
|
|
8574
8576
|
{ name: 'leerness_handoff', description: '워크스페이스 컨텍스트(plan/progress/decisions) 적재', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
|
|
8575
|
-
{ name: 'leerness_drift_check', description: 'AI 에이전트 leerness 미사용 drift 자동 감지 (
|
|
8577
|
+
{ name: 'leerness_drift_check', description: '1.9.136 — AI 에이전트 leerness 미사용 drift 자동 감지 JSON ({ root, score, level, signals[], healthy }). 5+ 신호 + 4단계 레벨 (🟢 healthy / 🟡 warning / 🟠 caution / 🔴 critical). 보안 신호 통합 (1.9.78)', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
|
|
8576
8578
|
{ name: 'leerness_audit', description: '1.9.102 — 워크스페이스 일관성 감사 JSON (warnings/failures/fixed/healthy + findings[]. kind 11종: design_dup/design_system_default/reuse_map_empty/milestone_unlinked/handoff_not_generated/current_state_stale/readme_version_mismatch/npm_cve/gitignore_missing_secrets/env_keys_missing/strict_promoted)', inputSchema: { type: 'object', properties: { path: { type: 'string' }, fix: { type: 'boolean' }, strict: { type: 'boolean' } } } },
|
|
8577
8579
|
{ name: 'leerness_verify_claim', description: 'AI 거짓 완료 자동 검증 (evidence 파일 + 실 테스트 실행)', inputSchema: { type: 'object', properties: { taskId: { type: 'string' }, path: { type: 'string' }, runTests: { type: 'boolean' }, strictClaims: { type: 'boolean' } }, required: ['taskId'] } },
|
|
8578
8580
|
{ name: 'leerness_contract_verify', description: '명세 ↔ 구현 함수/필드 일치 자동 검사', inputSchema: { type: 'object', properties: { spec: { type: 'string' }, impl: { type: 'string' } }, required: ['spec', 'impl'] } },
|
|
@@ -8611,7 +8613,8 @@ function mcpServeCmd(root) {
|
|
|
8611
8613
|
{ name: 'leerness_plan_remove', description: '1.9.126 — plan.md 에서 특정 milestone 블록 (### M-XXXX) 제거 (target: M-XXXX 또는 title substring). 제거된 블록은 .harness/plan.archive.md 에 자동 보존. Memory Surface DELETE 5종 완전 완성', inputSchema: { type: 'object', properties: { target: { type: 'string' }, path: { type: 'string' } }, required: ['target'] } },
|
|
8612
8614
|
{ name: 'leerness_memory_archive_list', description: '1.9.127 — DELETE 5종 archive 파일 통합 조회 JSON ({ decisions: [], lessons: [], plan: [], totals: { decisions, lessons, plan, all } }). 외부 AI가 과거에 제거된 항목을 회수/복원 후보로 참조. --surface 필터: decisions|lessons|plan', inputSchema: { type: 'object', properties: { surface: { type: 'string' }, path: { type: 'string' } } } },
|
|
8613
8615
|
{ name: 'leerness_memory_restore', description: '1.9.128 — archive 의 항목을 active 파일로 복귀 (DELETE→RESTORE cycle). surface: decisions|lessons|plan. target: date YYYY-MM-DD 또는 target substring 매칭. 복원된 블록은 archive 에서 제거됨. 🎉 MCP 40 도구 마일스톤', inputSchema: { type: 'object', properties: { surface: { type: 'string', enum: ['decisions', 'lessons', 'plan'] }, target: { type: 'string' }, path: { type: 'string' } }, required: ['surface', 'target'] } },
|
|
8614
|
-
{ name: 'leerness_task_list', description: '1.9.134 — progress-tracker.md 전체 task 조회 JSON ({ total, tasks: [{ id, status, request, evidence, nextAction, updated }] }). --status 필터 지원 (planned|in-progress|done 등). 외부 AI가 task 상태 회수', inputSchema: { type: 'object', properties: { path: { type: 'string' }, status: { type: 'string' } } } }
|
|
8616
|
+
{ name: 'leerness_task_list', description: '1.9.134 — progress-tracker.md 전체 task 조회 JSON ({ total, tasks: [{ id, status, request, evidence, nextAction, updated }] }). --status 필터 지원 (planned|in-progress|done 등). 외부 AI가 task 상태 회수', inputSchema: { type: 'object', properties: { path: { type: 'string' }, status: { type: 'string' } } } },
|
|
8617
|
+
{ name: 'leerness_rule_remove', description: '1.9.135 — rules.md 에서 특정 rule 제거 (id: R-XXXX). 제거된 rule 은 .harness/rules.archive.md 에 자동 보존 (복구 가능). Rule surface CRUD MCP 완성 (add/list/remove)', inputSchema: { type: 'object', properties: { id: { type: 'string' }, path: { type: 'string' } }, required: ['id'] } }
|
|
8615
8618
|
];
|
|
8616
8619
|
|
|
8617
8620
|
function send(obj) {
|
|
@@ -8644,7 +8647,7 @@ function mcpServeCmd(root) {
|
|
|
8644
8647
|
try {
|
|
8645
8648
|
switch (name) {
|
|
8646
8649
|
case 'leerness_handoff': cliArgs = ['handoff', targetPath, '--compact', '--no-drift-check']; break;
|
|
8647
|
-
case 'leerness_drift_check': cliArgs = ['drift', 'check', targetPath]; break;
|
|
8650
|
+
case 'leerness_drift_check': cliArgs = ['drift', 'check', targetPath, '--json']; break;
|
|
8648
8651
|
case 'leerness_audit': cliArgs = ['audit', targetPath, '--json', ...(args.fix ? ['--fix'] : []), ...(args.strict ? ['--strict'] : [])]; break;
|
|
8649
8652
|
case 'leerness_verify_claim': cliArgs = ['verify-claim', args.taskId, '--path', targetPath, ...(args.runTests ? ['--run-tests'] : []), ...(args.strictClaims ? ['--strict-claims'] : [])]; break;
|
|
8650
8653
|
case 'leerness_contract_verify': cliArgs = ['contract', 'verify', args.spec, args.impl]; break;
|
|
@@ -8684,6 +8687,7 @@ function mcpServeCmd(root) {
|
|
|
8684
8687
|
case 'leerness_memory_archive_list': cliArgs = ['memory', 'archive', 'list', '--path', targetPath, '--json', ...(args.surface ? ['--surface', args.surface] : [])]; break;
|
|
8685
8688
|
case 'leerness_memory_restore': cliArgs = ['memory', 'restore', String(args.surface || ''), String(args.target || ''), '--path', targetPath]; break;
|
|
8686
8689
|
case 'leerness_task_list': cliArgs = ['task', 'list', '--path', targetPath, '--json', ...(args.status ? ['--status', args.status] : [])]; break;
|
|
8690
|
+
case 'leerness_rule_remove': cliArgs = ['rule', 'remove', String(args.id || ''), '--path', targetPath]; break;
|
|
8687
8691
|
default:
|
|
8688
8692
|
return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
|
|
8689
8693
|
}
|