leerness 1.9.132 → 1.9.134

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,51 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.134 — 2026-05-20
4
+
5
+ **`leerness task list --json` + MCP 41번째 도구 `leerness_task_list`** — progress-tracker.md 전체 task JSON 조회.
6
+
7
+ ### Added — `task list --json`
8
+ - `--json` 옵션: `{ version, root, total, tasks: [{ id, status, request, evidence, nextAction, updated }] }`
9
+ - `--status` 필터: planned/requested/in-progress/done/dropped/incomplete/blocked
10
+ - 필터 적용 시 `statusFilter` 필드 포함
11
+
12
+ ### Added — MCP 41번째 도구 `leerness_task_list`
13
+ - 외부 AI 가 task 전체 상태 회수 (memory_status 보다 task 전용 + 필터 지원)
14
+ - 인자: `{ path?, status? }`
15
+
16
+ ### Task surface JSON 명령 매트릭스
17
+ | Op | CLI | MCP |
18
+ |---|---|---|
19
+ | CREATE | task add | leerness_task_add (1.9.105) |
20
+ | READ | **task list --json** | **leerness_task_list (1.9.134)** ✓ |
21
+ | UPDATE | task update | leerness_task_update (1.9.106) |
22
+ | DELETE | task drop | leerness_task_drop (1.9.107) |
23
+
24
+ ### MCP 도구 누계: 41 (1.9.128: 40 → 1.9.134: 41)
25
+
26
+ ## 1.9.133 — 2026-05-20
27
+
28
+ **brainstorm 텍스트 모드에 lessonsExplicit / planMilestones display 추가** — 1.9.116에서 데이터 수집은 했지만 display는 누락된 pre-existing gap fix.
29
+
30
+ ### Fixed
31
+ - `brainstorm` 텍스트 모드에 두 섹션 추가:
32
+ ```
33
+ 💡 관련 lessons (N) — Memory Surface lessons.md 직접 매칭
34
+ - .harness/lessons.md:L — <title>
35
+ 🗺 관련 plan milestones (N) — plan.md 매칭
36
+ - .harness/plan.md:L — M-XXXX <title>
37
+ ```
38
+ - 1.9.116에서 lessons/plan 데이터는 수집했지만 출력 누락 → 1.9.133에서 fix
39
+
40
+ ### brainstorm 텍스트 display 완성 매트릭스
41
+ | 섹션 | 라운드 |
42
+ |---|---|
43
+ | decisions / skills / tasks / rules / evidence / lessons (legacy) | (기존) |
44
+ | skillHistory / taskLogFails | 1.9.72 |
45
+ | **lessonsExplicit** | **1.9.133 ✓** |
46
+ | **planMilestones** | **1.9.133 ✓** |
47
+ | archive (D/L/P) | 1.9.131 |
48
+
3
49
  ## 1.9.132 — 2026-05-20
4
50
 
5
51
  **session close 텍스트 모드에 archive 누적 라인 추가** — 마감 시점 DELETE 활동 가시화 (handoff archive 알림과 symmetric).
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.132-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-62-blueviolet)]() [![archive](https://img.shields.io/badge/archive--visibility-6_surfaces-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.134-green)]() [![tests](https://img.shields.io/badge/e2e-219%2F219-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-41-blue)]() [![json](https://img.shields.io/badge/--json-20_commands-blueviolet)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-64-blueviolet)]() [![task-crud](https://img.shields.io/badge/task--CRUD--MCP-complete-success)]() [![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.132 AI Agent Reliability Harness ║
15
+ ║ v1.9.134 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.132';
9
+ const VERSION = '1.9.134';
10
10
  const MARK = '<!-- leerness:managed -->';
11
11
  const README_START = '<!-- leerness:project-readme:start -->';
12
12
  const README_END = '<!-- leerness:project-readme:end -->';
@@ -333,6 +333,8 @@ leerness audit . --fix # 누락 메타 자동 보강
333
333
  - 1.9.130+ 🎉 **60 라운드 자율 모드 마일스톤** — JSON 4종 (handoff/memory status/session close/health) \`memorySurface.archive\` 필드 통합. MCP 40 / handoff auto-recovery 7 / DELETE-RESTORE cycle 완성.
334
334
  - 1.9.131+ \`brainstorm\` 회수 범위에 3 archive 파일 (decisions/lessons/plan archive) 통합 — 과거 제거된 ideas 가 새 brainstorm 시 다시 후보로 노출. \`hits.archive\` 필드 + 복원 안내 라인.
335
335
  - 1.9.132+ \`session close\` 텍스트 모드에 archive 누적 라인 추가 — 마감 시점 DELETE 활동 가시화 (handoff 7번째 회수와 symmetric). archive 가시성 6 surface 완성.
336
+ - 1.9.133+ \`brainstorm\` 텍스트 모드 lessonsExplicit / planMilestones display 추가 — 1.9.116에서 데이터 수집은 했지만 display 누락된 pre-existing gap fix.
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).
336
338
 
337
339
  ---
338
340
 
@@ -1364,11 +1366,32 @@ function planRemoveCmd(root, target) {
1364
1366
  function planSync(root) { append(taskLogPath(root), `\n## ${today()}\n- Synced plan.md and progress-tracker.md.\n`); ok('plan/progress sync noted'); }
1365
1367
 
1366
1368
  function taskList(root) {
1369
+ // 1.9.134: --json 옵션 추가 + --status 필터
1367
1370
  const rows = readProgressRows(root);
1368
- if (!rows.length) return log('(no tasks)');
1371
+ const statusFilter = arg('--status', '');
1372
+ const filtered = statusFilter ? rows.filter(r => r.status === statusFilter) : rows;
1373
+ if (has('--json')) {
1374
+ const payload = {
1375
+ version: VERSION,
1376
+ root: absRoot(root),
1377
+ total: filtered.length,
1378
+ tasks: filtered.map(r => ({
1379
+ id: r.id,
1380
+ status: r.status,
1381
+ request: r.request,
1382
+ evidence: r.evidence,
1383
+ nextAction: r.nextAction,
1384
+ updated: r.updated
1385
+ }))
1386
+ };
1387
+ if (statusFilter) payload.statusFilter = statusFilter;
1388
+ process.stdout.write(JSON.stringify(payload, null, 2) + '\n');
1389
+ return;
1390
+ }
1391
+ if (!filtered.length) return log('(no tasks)');
1369
1392
  log('| ID | Status | Request | Evidence | Next Action | Updated |');
1370
1393
  log('|---|---|---|---|---|---|');
1371
- for (const r of rows) log(`| ${r.id} | ${r.status} | ${r.request} | ${r.evidence} | ${r.nextAction} | ${r.updated} |`);
1394
+ for (const r of filtered) log(`| ${r.id} | ${r.status} | ${r.request} | ${r.evidence} | ${r.nextAction} | ${r.updated} |`);
1372
1395
  }
1373
1396
  function taskAdd(root, text) {
1374
1397
  const id = nextId(root, 'T');
@@ -4270,7 +4293,7 @@ function _banner(opts = {}) {
4270
4293
  lines.push('');
4271
4294
  for (const ln of lines) log(ln);
4272
4295
  if (opts.quickStart) {
4273
- log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.132+ session close archive 라인62 라운드 자율 누적)')));
4296
+ log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.134+ task list --json + MCP 41 64 라운드 자율 누적)')));
4274
4297
  log(' ' + C.green('npx leerness@latest init .') + C.dim(' # 신규 프로젝트 + 외부 AI CLI 설정'));
4275
4298
  log(' ' + C.green('npx leerness handoff .') + C.dim(' # 컨텍스트 + lessons + 매칭 skill + history hit + brainstorm hits + 헤드라인'));
4276
4299
  log(' ' + C.green('npx leerness handoff . --quiet') + C.dim(' # 자동화/CI 모드 (1.9.99) — 자동 회수 라인 비활성'));
@@ -6053,6 +6076,16 @@ function brainstormCmd(root, topic) {
6053
6076
  log(`\n## 📜 task-log 실패 라인 (${hits.taskLogFails.length}) — 1.9.67 인덱스 + brainstorm`);
6054
6077
  hits.taskLogFails.slice(0, 5).forEach(t => log(` - .harness/task-log.md:${t.line || '?'} — ${t.title}`));
6055
6078
  }
6079
+ // 1.9.133: lessonsExplicit display (데이터는 1.9.116에서 수집, display 누락 fix)
6080
+ if (hits.lessonsExplicit && hits.lessonsExplicit.length) {
6081
+ log(`\n## 💡 관련 lessons (${hits.lessonsExplicit.length}) — Memory Surface lessons.md 직접 매칭 (1.9.116)`);
6082
+ hits.lessonsExplicit.slice(0, 5).forEach(l => log(` - .harness/lessons.md:${l.line || '?'} — ${l.title}`));
6083
+ }
6084
+ // 1.9.133: planMilestones display (데이터는 1.9.116에서 수집, display 누락 fix)
6085
+ if (hits.planMilestones && hits.planMilestones.length) {
6086
+ log(`\n## 🗺 관련 plan milestones (${hits.planMilestones.length}) — plan.md 매칭 (1.9.116)`);
6087
+ hits.planMilestones.slice(0, 5).forEach(m => log(` - .harness/plan.md:${m.line || '?'} — ${m.id} ${m.title}`));
6088
+ }
6056
6089
  // 1.9.131: 3 archive 파일 hits — DELETE 5종 archive 도 brainstorm 후보
6057
6090
  if (hits.archive) {
6058
6091
  const archiveTotal = (hits.archive.decisions?.length || 0) + (hits.archive.lessons?.length || 0) + (hits.archive.plan?.length || 0);
@@ -8577,7 +8610,8 @@ function mcpServeCmd(root) {
8577
8610
  { name: 'leerness_decision_drop', description: '1.9.125 — decisions.md 에서 특정 결정 제거 (target: date YYYY-MM-DD 또는 title substring). 제거된 블록은 .harness/decisions.archive.md 에 자동 보존', inputSchema: { type: 'object', properties: { target: { type: 'string' }, path: { type: 'string' } }, required: ['target'] } },
8578
8611
  { 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'] } },
8579
8612
  { 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' } } } },
8580
- { 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'] } }
8613
+ { 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' } } } }
8581
8615
  ];
8582
8616
 
8583
8617
  function send(obj) {
@@ -8649,6 +8683,7 @@ function mcpServeCmd(root) {
8649
8683
  case 'leerness_plan_remove': cliArgs = ['plan', 'remove', String(args.target || ''), '--path', targetPath]; break;
8650
8684
  case 'leerness_memory_archive_list': cliArgs = ['memory', 'archive', 'list', '--path', targetPath, '--json', ...(args.surface ? ['--surface', args.surface] : [])]; break;
8651
8685
  case 'leerness_memory_restore': cliArgs = ['memory', 'restore', String(args.surface || ''), String(args.target || ''), '--path', targetPath]; break;
8686
+ case 'leerness_task_list': cliArgs = ['task', 'list', '--path', targetPath, '--json', ...(args.status ? ['--status', args.status] : [])]; break;
8652
8687
  default:
8653
8688
  return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
8654
8689
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.132",
3
+ "version": "1.9.134",
4
4
  "description": "Leerness: 비파괴 마이그레이션, 자동 버전 감지·업데이트, 계획/진행/핸드오프 자동화, 게으름·시크릿·인코딩 자동 가드, Claude Code 슬래시 통합을 갖춘 한국어 우선 AI 개발 하네스.",
5
5
  "keywords": [
6
6
  "leerness",