leerness 1.9.82 → 1.9.84

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,45 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.84 — 2026-05-20
4
+
5
+ **MCP server 17번째 도구 `leerness_skill_list` 추가** (외부 AI에 skill 목록 조회 노출).
6
+
7
+ ### Added — MCP 17번째 도구
8
+ - `leerness_skill_list` — 워크스페이스에 설치된 skill 목록 조회.
9
+ - inputSchema: `{ path: string }`
10
+ - 응답: `skill list --json` 결과 (skillpack 출처 + items 배열: id/displayNameKo/source/capabilities/usageCount/lastUsed/lastUpdated)
11
+ - 외부 AI가 사용 가능한 skill을 즉시 인지하여 적절한 능력 활용.
12
+ - `skill list --json` 옵션 신규 추가 (CI 친화).
13
+ - MCP server 도구 카운트: **16 → 17**.
14
+
15
+ ### Use Case
16
+ - Claude Code / Cursor 가 작업 시작 시 → `leerness_skill_list` 호출 → 사용 가능한 skill 카탈로그 파악 → 적절한 능력 활용.
17
+ - skill_match와 결합: "이 task에 매칭되는 skill (skill_match) + 전체 skill 카탈로그 (skill_list)" 양방향 활용.
18
+
19
+ ### Verified
20
+ - stress-v30 — MCP 17 도구 + skill_list 호출 + 누적 회귀.
21
+ - e2e 219/219 PASS 유지.
22
+
23
+ ---
24
+
25
+ ## 1.9.83 — 2026-05-20
26
+
27
+ **MCP server 16번째 도구 `leerness_skill_match` 추가** (1.9.45/50/68 skill match 외부 노출).
28
+
29
+ ### Added — MCP 16번째 도구
30
+ - `leerness_skill_match` — 사용자 task 키워드에 매칭되는 설치된 skill 추천.
31
+ - inputSchema: `{ query: string (required), path: string, useEmbedding: boolean }`
32
+ - 응답: `skill match --json` 결과 (query / total / matched / top[].id/name/description/score)
33
+ - 1.9.68 rolling history 자동 누적 (`.harness/skill-suggestions.md`)
34
+ - 1.9.79 skill suggest 알고리즘에 자동 누적된 query 반영 가능
35
+ - MCP server 도구 카운트: **15 → 16**.
36
+
37
+ ### Verified
38
+ - stress-v29 — MCP 16 도구 + skill_match 호출 + rolling history 누적 + 누적 회귀.
39
+ - e2e 219/219 PASS 유지.
40
+
41
+ ---
42
+
3
43
  ## 1.9.82 — 2026-05-20
4
44
 
5
45
  **`drift check --auto-fix` 에 보안 회복 통합** (1.9.78 + 1.9.75 audit --fix 결합).
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.82-green)]() [![tests](https://img.shields.io/badge/e2e-219%2F219-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.84-green)]() [![tests](https://img.shields.io/badge/e2e-219%2F219-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.82 AI Agent Reliability Harness ║
15
+ ║ v1.9.84 AI Agent Reliability Harness ║
16
16
  ║ verify · remember · orchestrate · audit · prevent drift ║
17
17
  ╚══════════════════════════════════════════════════════════════╝
18
18
  ```
@@ -433,6 +433,8 @@ npm test # = node ./scripts/e2e.js
433
433
 
434
434
  ## 변경 이력 (최근)
435
435
 
436
+ - **1.9.84** — **MCP server 17번째 도구 `leerness_skill_list`** — 외부 AI에 skill 카탈로그 (id/이름/출처/능력/사용 횟수) 조회 노출. `skill list --json` 옵션도 함께 추가.
437
+ - **1.9.83** — **MCP server 16번째 도구 `leerness_skill_match`** — 1.9.45/50/68 skill match를 외부 AI에 노출. rolling history 자동 누적.
436
438
  - **1.9.82** — **`drift check --auto-fix` 보안 회복 통합** — 1.9.78 보안 신호 발견 시 `audit --fix` 자동 실행 → `.gitignore` + `.env.example` 동기화 후 재검사. 보안 + 세션 마감 한 번에 자동 회복.
437
439
  - **1.9.81** — **`handoff` 통합 헤드라인** — drift level + 보안 상태 + MCP 활동 + skill query + 설치 skill 수를 한 줄로 압축. AI가 세션 시작 즉시 워크스페이스 상태 인지.
438
440
  - **1.9.80** — **handoff 보안 critical 자동 회복** — `.env` 가 `.gitignore` 에 없으면 🚨 CRITICAL 경고 + `LEERNESS_AUTO_SECURITY_FIX=1` 시 `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.82';
9
+ const VERSION = '1.9.84';
10
10
  const MARK = '<!-- leerness:managed -->';
11
11
  const README_START = '<!-- leerness:project-readme:start -->';
12
12
  const README_END = '<!-- leerness:project-readme:end -->';
@@ -769,6 +769,20 @@ function _invalidateSkillsCache(root) {
769
769
 
770
770
  function skillList(root) {
771
771
  const all = listAllSkills(root);
772
+ // 1.9.84: --json 옵션 (MCP 통합용)
773
+ if (has('--json')) {
774
+ const items = Object.entries(all).map(([id, v]) => ({
775
+ id,
776
+ displayNameKo: v.displayNameKo || id,
777
+ source: v._source,
778
+ capabilities: v.capabilities || [],
779
+ usageCount: v.usage?.count || 0,
780
+ lastUsed: v.usage?.lastUsed || null,
781
+ lastUpdated: v.lastUpdated || null
782
+ }));
783
+ log(JSON.stringify({ skillpack: SKILLPACK_SOURCE, total: items.length, items }, null, 2));
784
+ return;
785
+ }
772
786
  if (SKILLPACK_SOURCE !== 'builtin') log(`# skillpack 출처: ${SKILLPACK_SOURCE}${SKILLPACK_META ? ` (${SKILLPACK_META.name} v${SKILLPACK_META.version})` : ''}`);
773
787
  else log('# skillpack 미설치 — builtin fallback 사용 (leerness 본 패키지 내장 카탈로그)');
774
788
  log('| ID | 한글명 | 출처 | 능력(요약) | 사용횟수 | 최종 |');
@@ -3384,7 +3398,7 @@ function _banner(opts = {}) {
3384
3398
  lines.push('');
3385
3399
  for (const ln of lines) log(ln);
3386
3400
  if (opts.quickStart) {
3387
- log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.82+ 워크플로)')));
3401
+ log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.84+ 워크플로)')));
3388
3402
  log(' ' + C.green('npx leerness@latest init .') + C.dim(' # 신규 프로젝트 + 외부 AI CLI 설정'));
3389
3403
  log(' ' + C.green('npx leerness handoff .') + C.dim(' # 컨텍스트 + lessons + 매칭 skill + 이전 history hit (1.9.69)'));
3390
3404
  log(' ' + C.green('npx leerness skill match "<query>"') + C.dim(' # 매칭 skill + rolling history 자동 누적 (1.9.68)'));
@@ -3393,7 +3407,7 @@ function _banner(opts = {}) {
3393
3407
  log(' ' + C.green('npx leerness session close .') + C.dim(' # 마감 + 다음 라운드 추천 (default)'));
3394
3408
  log('');
3395
3409
  log(C.bold(C.cyan(' 🤖 메인 에이전트 (Claude/Cursor/Copilot)용')));
3396
- log(' ' + C.green('npx leerness mcp serve') + C.dim(' # MCP 서버 — 15 도구 (brainstorm 포함, 1.9.77)'));
3410
+ log(' ' + C.green('npx leerness mcp serve') + C.dim(' # MCP 서버 — 17 도구 (skill_list 포함, 1.9.84)'));
3397
3411
  log(' ' + C.green('npx leerness agents bench "<task>"') + C.dim(' # 3 CLI 동시 비교'));
3398
3412
  log('');
3399
3413
  }
@@ -7335,7 +7349,9 @@ function mcpServeCmd(root) {
7335
7349
  { name: 'leerness_lessons', description: '1.9.7/54 — 과거 결정·실수 자동 회수 (--auto: 현재 task 키워드 자동 추출)', inputSchema: { type: 'object', properties: { path: { type: 'string' }, query: { type: 'string' }, auto: { type: 'boolean' }, limit: { type: 'number' } } } },
7336
7350
  { name: 'leerness_task_export', description: '1.9.60/66 — leerness task → Claude Code TodoWrite 호환 JSON (외부 AI 양방향 sync)', inputSchema: { type: 'object', properties: { path: { type: 'string' }, to: { type: 'string' } } } },
7337
7351
  { name: 'leerness_env_check', description: '1.9.71/73 — .env vs .env.example 동기화 검사 (보안: 키만, 값 미노출). exit 1 if 누락 키 있음', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
7338
- { name: 'leerness_brainstorm', description: '1.9.16/72/77 — 누적 컨텍스트(decisions+skills+tasks+rules+evidence+lessons+skillHistory+taskLogFails) 자원 회수. 외부 AI가 새 작업 시작 전 호출', inputSchema: { type: 'object', properties: { topic: { type: 'string' }, path: { type: 'string' }, allApps: { type: 'boolean' } }, required: ['topic'] } }
7352
+ { name: 'leerness_brainstorm', description: '1.9.16/72/77 — 누적 컨텍스트(decisions+skills+tasks+rules+evidence+lessons+skillHistory+taskLogFails) 자원 회수. 외부 AI가 새 작업 시작 전 호출', inputSchema: { type: 'object', properties: { topic: { type: 'string' }, path: { type: 'string' }, allApps: { type: 'boolean' } }, required: ['topic'] } },
7353
+ { name: 'leerness_skill_match', description: '1.9.45/50/83 — 사용자 task 키워드에 매칭되는 설치된 skill 추천 (jaccard 또는 embedding). 1.9.68 rolling history 자동 누적', inputSchema: { type: 'object', properties: { query: { type: 'string' }, path: { type: 'string' }, useEmbedding: { type: 'boolean' } }, required: ['query'] } },
7354
+ { name: 'leerness_skill_list', description: '1.9.84 — 워크스페이스에 설치된 skill 목록 + 사용 횟수 + 출처 (catalog/user). 외부 AI가 사용 가능한 skill 조회', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
7339
7355
  ];
7340
7356
 
7341
7357
  function send(obj) {
@@ -7382,6 +7398,8 @@ function mcpServeCmd(root) {
7382
7398
  case 'leerness_task_export': cliArgs = ['task', 'export', '--path', targetPath, ...(args.to ? ['--to', args.to] : ['--json'])]; break;
7383
7399
  case 'leerness_env_check': cliArgs = ['env', 'check', targetPath, '--json']; break;
7384
7400
  case 'leerness_brainstorm': cliArgs = ['brainstorm', args.topic || '', '--path', targetPath, '--json', ...(args.allApps ? ['--all-apps'] : [])]; break;
7401
+ case 'leerness_skill_match': cliArgs = ['skill', 'match', args.query || '', '--path', targetPath, '--json', ...(args.useEmbedding ? ['--embedding'] : [])]; break;
7402
+ case 'leerness_skill_list': cliArgs = ['skill', 'list', targetPath, '--json']; break;
7385
7403
  default:
7386
7404
  return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
7387
7405
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.82",
3
+ "version": "1.9.84",
4
4
  "description": "Leerness: 비파괴 마이그레이션, 자동 버전 감지·업데이트, 계획/진행/핸드오프 자동화, 게으름·시크릿·인코딩 자동 가드, Claude Code 슬래시 통합을 갖춘 한국어 우선 AI 개발 하네스.",
5
5
  "keywords": [
6
6
  "leerness",