leerness 1.9.67 → 1.9.68

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,36 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.68 — 2026-05-19
4
+
5
+ **`skill match` rolling history 자동 누적 + 종합 회귀**.
6
+
7
+ ### Added — skill match rolling history (default ON)
8
+ - `leerness skill match <query>` 호출 시 결과를 `.harness/skill-suggestions.md`에 append 누적.
9
+ - frontmatter: `leernessRole: skill-suggestions`, `readWhen: ['skill 결정 전', '세션 시작']`.
10
+ - 형식:
11
+ ```
12
+ ## YYYY-MM-DD HH:MM:SS — query "<keyword>"
13
+ - Algorithm: jaccard|embedding
14
+ - Top N matches:
15
+ - [점수] skill-id — description
16
+ ```
17
+ - AI 에이전트가 같은 키워드를 반복 검색하지 않고 이력 참조 가능.
18
+ - 끄기: `--no-save` 또는 `LEERNESS_NO_SKILL_HISTORY=1`.
19
+
20
+ ### Updated
21
+ - `_banner` quickStart: 1.9.68 안내 라인 추가.
22
+
23
+ ### Verified — 종합 회귀 + 성능 측정
24
+ - stress-v14 (1.9.68 + 1.9.43~67 누적 회귀 + 성능 벤치마크) — 모든 시나리오 PASS.
25
+ - 이전 중요 기능 12종 정상 동작 검증:
26
+ - MCP 13 도구 / drift check / benchmark scenario / skill suggest / lessons --auto
27
+ - session close --suggest default / audit --strict / install 별칭 / task export
28
+ - handoff 자동 skill 추천 (1.9.67) / listAllSkills 캐시 (1.9.66) / usage-stats 캐시 (1.9.65)
29
+ - 성능 (warm-up 적용): status / handoff / drift / audit / skill list / skill match.
30
+ - e2e 회귀: 219/219 PASS 유지.
31
+
32
+ ---
33
+
3
34
  ## 1.9.67 — 2026-05-19
4
35
 
5
36
  **handoff 자동 skill 추천 default ON + lessons 인덱스에 task-log 통합**.
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.67-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.68-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.67 AI Agent Reliability Harness ║
15
+ ║ v1.9.68 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.68** — **`skill match` 결과 → `.harness/skill-suggestions.md` rolling history 자동 누적** (AI가 다음 세션에 이전 추천 참조 가능). `--no-save` / `LEERNESS_NO_SKILL_HISTORY=1`로 끄기.
436
437
  - **1.9.67** — **handoff 자동 skill 추천 default ON** (jaccard 매칭) + lessons 인덱스에 task-log.md 실패 라인 통합 (회수 범위 확장).
437
438
  - **1.9.66** — **성능 최적화 2차 + MCP 13번째 도구**. `listAllSkills` 메모리 캐시 (skill list/info/match/discover/suggest 공유) + MCP `leerness_task_export` 추가 (TodoWrite 양방향 sync 외부 노출).
438
439
  - **1.9.65** — **성능 최적화 1차** — usage-stats 메모리 캐시 + lessons 인덱스 캐시 (mtime invalidation). handoff -37% · drift -19% · audit -29% · skill list -17% · 100-task handoff -42% · status -48% (vs 1.9.64).
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.67';
9
+ const VERSION = '1.9.68';
10
10
  const MARK = '<!-- leerness:managed -->';
11
11
  const README_START = '<!-- leerness:project-readme:start -->';
12
12
  const README_END = '<!-- leerness:project-readme:end -->';
@@ -3196,9 +3196,10 @@ function _banner(opts = {}) {
3196
3196
  lines.push('');
3197
3197
  for (const ln of lines) log(ln);
3198
3198
  if (opts.quickStart) {
3199
- log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.67+ 워크플로)')));
3199
+ log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.68+ 워크플로)')));
3200
3200
  log(' ' + C.green('npx leerness@latest init .') + C.dim(' # 신규 프로젝트 + 외부 AI CLI 설정'));
3201
3201
  log(' ' + C.green('npx leerness handoff .') + C.dim(' # 컨텍스트 + lessons 재상기 + 매칭 skill 자동 추천'));
3202
+ log(' ' + C.green('npx leerness skill match "<query>"') + C.dim(' # 매칭 skill + rolling history 자동 누적 (1.9.68)'));
3202
3203
  log(' ' + C.green('npx leerness verify-claim T-0001 --run-tests') + C.dim(' # AI 거짓 완료 자동 검증'));
3203
3204
  log(' ' + C.green('npx leerness session close .') + C.dim(' # 마감 + 다음 라운드 추천 (default)'));
3204
3205
  log('');
@@ -6820,6 +6821,13 @@ async function skillMatchCmd(root, query) {
6820
6821
  })).sort((a, b) => b.score - a.score);
6821
6822
  }
6822
6823
  const top = ranked.filter(r => r.score > 0).slice(0, 5);
6824
+ // 1.9.68: rolling history 자동 누적 (.harness/skill-suggestions.md) — default ON
6825
+ // 끄기: --no-save 또는 LEERNESS_NO_SKILL_HISTORY=1
6826
+ if (!has('--no-save') && process.env.LEERNESS_NO_SKILL_HISTORY !== '1') {
6827
+ try {
6828
+ _appendSkillSuggestion(root, { query, useEmbedding, top });
6829
+ } catch {}
6830
+ }
6823
6831
  if (has('--json')) {
6824
6832
  log(JSON.stringify({ query, total: skills.length, matched: top.length, top: top.map(({ dir, ...rest }) => rest) }, null, 2));
6825
6833
  return;
@@ -6839,6 +6847,32 @@ async function skillMatchCmd(root, query) {
6839
6847
  }
6840
6848
  log('');
6841
6849
  log(`💡 사용: \`cat ${rel(root, top[0].dir)}/SKILL.md\` 또는 메인 에이전트가 이 skill 본문을 참고`);
6850
+ log(`📒 자동 누적: .harness/skill-suggestions.md (--no-save로 끄기)`);
6851
+ }
6852
+
6853
+ // 1.9.68: skill match rolling history append (.harness/skill-suggestions.md)
6854
+ // AI가 다음 세션에 이전 추천을 참조 가능 — readWhen: '세션 시작', 'skill 결정 전'
6855
+ function _appendSkillSuggestion(root, { query, useEmbedding, top }) {
6856
+ const p = path.join(absRoot(root), '.harness', 'skill-suggestions.md');
6857
+ if (!exists(p)) {
6858
+ // 신규 파일 — frontmatter + 안내
6859
+ const fm = `---\nleernessRole: skill-suggestions\nreadWhen:\n - skill 결정 전\n - 세션 시작\nupdateWhen:\n - leerness skill match 호출 시 자동 누적 (1.9.68)\ndoNotStore:\n - 실제 토큰\n - 비밀번호\n - 운영 쿠키\n - 민감한 개인정보 원문\n---\n<!-- leerness:managed -->\n# Skill Suggestions (Rolling History)\n\n매 \`leerness skill match\` 호출이 여기 누적됩니다. AI 에이전트는 다음 세션에 같은 키워드를 다시 검색하지 말고 이력을 먼저 참조하세요.\n\n`;
6860
+ mkdirp(path.dirname(p));
6861
+ writeUtf8(p, fm);
6862
+ }
6863
+ const algo = useEmbedding ? 'embedding' : 'jaccard';
6864
+ const ts = new Date().toISOString();
6865
+ let block = `\n## ${ts.slice(0, 19).replace('T', ' ')} — query "${(query || '').slice(0, 80)}"\n`;
6866
+ block += `- Algorithm: ${algo}\n`;
6867
+ if (!top.length) {
6868
+ block += `- Matched: 0 — 다른 키워드 또는 \`leerness skill discover\` 권장\n`;
6869
+ } else {
6870
+ block += `- Top ${top.length} matches:\n`;
6871
+ for (const r of top) {
6872
+ block += ` - [${r.score.toFixed(2)}] ${r.id} — ${(r.description || '').slice(0, 80)}\n`;
6873
+ }
6874
+ }
6875
+ append(p, block);
6842
6876
  }
6843
6877
 
6844
6878
  // 1.9.43: skill export-all — 모든 자체 skill을 agentskills.io 표준 SKILL.md로 일괄 export
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.67",
3
+ "version": "1.9.68",
4
4
  "description": "Leerness: 비파괴 마이그레이션, 자동 버전 감지·업데이트, 계획/진행/핸드오프 자동화, 게으름·시크릿·인코딩 자동 가드, Claude Code 슬래시 통합을 갖춘 한국어 우선 AI 개발 하네스.",
5
5
  "keywords": [
6
6
  "leerness",