leerness 1.9.78 → 1.9.79

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,27 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.79 — 2026-05-20
4
+
5
+ **`leerness skill suggest` 알고리즘 강화** (1.9.68 rolling history 빈도 활용 — Hermes-style 학습 신호 보강).
6
+
7
+ ### Improved — skill suggest 학습 신호 확장
8
+ - 기존 신호 (1.9.53): task-log.md / progress-tracker.md / usage-stats.commands.
9
+ - **추가 신호 (1.9.79)**: `.harness/skill-suggestions.md` rolling history 빈도.
10
+ - 같은 키워드를 2회 이상 `skill match`로 검색했다면 **학습 신호로 가중** (×2).
11
+ - 예: 사용자가 "payment 결제 자동화" 를 3번 검색 → keyword "payment" 의 score `+6`.
12
+ - 출처: `progress+history` 로 표시 + `historyHits` 필드 노출.
13
+ - 후보 점수 = task-log 매치 + progress 토큰 매치 + usage 카운트 + **history 빈도 × 2**.
14
+
15
+ ### Use Case
16
+ - AI 에이전트가 반복적으로 같은 주제를 검색했다면 → **이 주제는 신규 skill로 등록할 가치가 큼** 자동 식별.
17
+ - Hermes-style 자동 학습 강화 (`leerness skill learn` 권장 정확도 향상).
18
+
19
+ ### Verified
20
+ - stress-v25 — history 가중 + 누적 회귀 + 성능.
21
+ - e2e 219/219 PASS 유지.
22
+
23
+ ---
24
+
3
25
  ## 1.9.78 — 2026-05-20
4
26
 
5
27
  **`drift check`에 5번째 신호 추가 — 보안 누락이 drift score 가중** (1.9.75/76 보안 검사 통합).
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.78-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.79-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.78 AI Agent Reliability Harness ║
15
+ ║ v1.9.79 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.79** — **`leerness skill suggest` 알고리즘 강화** — 1.9.68 rolling history 빈도 (×2 가중) 추가. 반복 검색된 키워드를 신규 skill 후보로 자동 식별 (Hermes-style 학습).
436
437
  - **1.9.78** — **`drift check` 5번째 신호** — `.env` + `.gitignore` 보안 누락을 drift score에 가중 (`.env` 자체 누락 시 +30, 동기화 누락 +15). 보안 위험이 drift critical 승격 가능.
437
438
  - **1.9.77** — **MCP server 15번째 도구 `leerness_brainstorm`** — 1.9.72 brainstorm (decisions + skills + tasks + rules + evidence + lessons + skillHistory + taskLogFails)을 외부 AI에 노출. AI가 새 작업 시작 전 누적 컨텍스트 자동 회수.
438
439
  - **1.9.76** — **`leerness handoff`에 보안 상태 요약 자동 표시** — `.env→.env.example` 누락 + `.gitignore` 시크릿 패턴 누락을 매 handoff에 1-2 line 자동 노출. AI가 세션 시작 즉시 보안 위험 인지.
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.78';
9
+ const VERSION = '1.9.79';
10
10
  const MARK = '<!-- leerness:managed -->';
11
11
  const README_START = '<!-- leerness:project-readme:start -->';
12
12
  const README_END = '<!-- leerness:project-readme:end -->';
@@ -3309,7 +3309,7 @@ function _banner(opts = {}) {
3309
3309
  lines.push('');
3310
3310
  for (const ln of lines) log(ln);
3311
3311
  if (opts.quickStart) {
3312
- log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.78+ 워크플로)')));
3312
+ log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.79+ 워크플로)')));
3313
3313
  log(' ' + C.green('npx leerness@latest init .') + C.dim(' # 신규 프로젝트 + 외부 AI CLI 설정'));
3314
3314
  log(' ' + C.green('npx leerness handoff .') + C.dim(' # 컨텍스트 + lessons + 매칭 skill + 이전 history hit (1.9.69)'));
3315
3315
  log(' ' + C.green('npx leerness skill match "<query>"') + C.dim(' # 매칭 skill + rolling history 자동 누적 (1.9.68)'));
@@ -6973,6 +6973,36 @@ function skillSuggestCmd(root) {
6973
6973
  }
6974
6974
  }
6975
6975
  } catch {}
6976
+ // 4) 1.9.79: skill-suggestions.md rolling history 빈도 — 반복 검색된 키워드는 학습 신호로 강화
6977
+ try {
6978
+ const histPath = path.join(root, '.harness', 'skill-suggestions.md');
6979
+ if (exists(histPath)) {
6980
+ const histTxt = read(histPath);
6981
+ const queryFreq = {};
6982
+ for (const block of histTxt.split(/\n(?=## )/)) {
6983
+ const h = block.match(/^## ([\d-]+ [\d:]+) — query "([^"]+)"/);
6984
+ if (!h) continue;
6985
+ const query = h[2];
6986
+ // query에서 도메인 키워드 추출 (4자 이상)
6987
+ for (const m of query.toLowerCase().matchAll(/[\w가-힣]{4,}/g)) {
6988
+ const kw = m[0];
6989
+ if (/^\d+$/.test(kw)) continue;
6990
+ if (['이런','저런','하다','하고','있는','작업','구현','추가','진행','수정','변경','검토','확인','프로젝트','관리','기능','시스템','코드','파일','버전','정리','계획','next','action','task','todo','work'].includes(kw)) continue;
6991
+ queryFreq[kw] = (queryFreq[kw] || 0) + 1;
6992
+ }
6993
+ }
6994
+ // history에서 N회 이상 등장한 키워드 → 가중 (×2)
6995
+ for (const [kw, n] of Object.entries(queryFreq)) {
6996
+ if (n >= 2) { // history 빈도는 1회만 등장해도 의미 작음, 2회 이상부터 신호
6997
+ seen[kw] = seen[kw] || { count: 0, samples: [], source: 'progress' };
6998
+ // history 빈도 × 가중 (2배)
6999
+ seen[kw].count += n * 2;
7000
+ seen[kw].historyHits = n;
7001
+ if (seen[kw].source === 'progress') seen[kw].source = 'progress+history';
7002
+ }
7003
+ }
7004
+ }
7005
+ } catch {}
6976
7006
  // 4) 임계 이상 + 기존 skill에 없는 키워드만 필터
6977
7007
  const existing = new Set(Object.keys(listAllSkills(root)));
6978
7008
  const installed = _readInstalledSkills(root);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.78",
3
+ "version": "1.9.79",
4
4
  "description": "Leerness: 비파괴 마이그레이션, 자동 버전 감지·업데이트, 계획/진행/핸드오프 자동화, 게으름·시크릿·인코딩 자동 가드, Claude Code 슬래시 통합을 갖춘 한국어 우선 AI 개발 하네스.",
5
5
  "keywords": [
6
6
  "leerness",