leerness 1.15.0 → 1.16.0
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 +32 -0
- package/README.md +5 -5
- package/bin/leerness.js +13 -6
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.16.0 — 2026-06-09 — 🛡️ [안정화/Stable] 16번째 버그헌트 안정 minor
|
|
4
|
+
|
|
5
|
+
**🛡️ 안정화(Stable) minor.** 16번째 멀티에이전트 버그헌트(8건 발굴·전부 직접 재현)의 코어 수정(1.15.1)을 검증·통합해 npm 공개. R-0011 정책의 7번째 minor. **이 릴리스 영상부터 개선된 "문제→해소" 디자인**(짧은 인트로 + 이전/이제 모션 + 의미 보존 하이라이트)으로 제작됩니다.
|
|
6
|
+
|
|
7
|
+
### 이번 minor 통합 (1.15.1 — 전부 재현 검증)
|
|
8
|
+
- **🔴 시크릿 스캐너 FN 차단**: 한 파일에 같은 패턴 시크릿이 2개 이상이면 첫 번째만 보고하고 나머지를 놓치던 문제(루프 break) 수정 → 모두 탐지.
|
|
9
|
+
- **🟠 task/rule list 표 정렬**: 제목에 파이프(`|`)가 있으면 마크다운 표 칼럼이 깨지던 표시 버그 → `_cellSafe` 적용.
|
|
10
|
+
- **📖 문서 정합**: `encoding check` 도움말이 실제 미검사 항목(CRLF)을 광고하던 것 정정.
|
|
11
|
+
- (사이트 영상 파이프라인 4버그 — 큐 키/빈 제목/빈 WAV 통과/check-only 부작용 — 도 동시 수정.)
|
|
12
|
+
|
|
13
|
+
### 검증 (회귀 0)
|
|
14
|
+
- **selftest 214 PASS** · **E2E 365/365 PASS** · npm gate=minor_bump. 시크릿 멀티매치·표 파이프·도움말 정합 행위 재현.
|
|
15
|
+
|
|
16
|
+
### 안정화 표시 (R-0006)
|
|
17
|
+
CHANGELOG [안정화/Stable] · git tag annotation (Stable) · GitHub release (Stable) · npm dist-tag `stable` 시도.
|
|
18
|
+
|
|
19
|
+
## 1.15.1 — 2026-06-09 — 16번째 버그헌트: 시크릿 스캐너 FN + 표 파이프 + 문서정합
|
|
20
|
+
|
|
21
|
+
**🔬 멀티에이전트 버그헌트(신규코드 0건·코어 4건·사이트 4건 발굴) → 8건 전부 직접 재현 후 진짜만 수정.** 맹신 X: 각 지적을 temp 에서 직접 재현하고, 의도된 동작은 수정 제외.
|
|
22
|
+
|
|
23
|
+
### 수정 (코어 3건 — 전부 재현 검증)
|
|
24
|
+
- **🔴 시크릿 스캐너 FN (F1)**: 한 파일에 같은 패턴의 시크릿이 2개 이상(예: `secret:` 와 `api_key:` 둘 다 'Hardcoded password' 패턴)이면 **첫 번째만 잡고 나머지 누락**(루프 `break`). break 제거 + zero-width 가드 → 모두 탐지.
|
|
25
|
+
- **🟠 task/rule list 표 깨짐 (F2)**: 항목 제목에 파이프(`|`)가 있으면 마크다운 표 칼럼이 어긋남(저장은 안전했으나 list **표시**가 raw). 표시도 `_cellSafe` 적용(`\|`).
|
|
26
|
+
- **문서정합 (F3)**: `encoding check` 도움말이 'CRLF 검사'를 광고했으나 실제 미검사(정책은 BOM/NUL/.bat/roundtrip). 도움말을 실제 동작과 일치하게 정정.
|
|
27
|
+
|
|
28
|
+
### 의도된 동작(수정 안 함 — 맹신 X)
|
|
29
|
+
- `status --json` 가 `healthy:false` 여도 exit 0: **설계상 정보성 명령**(`scope:'install'` + `healthyMeaning` 명시, 게이트는 `verify`/`gate`). 버그 아님.
|
|
30
|
+
|
|
31
|
+
### 검증 (회귀 0)
|
|
32
|
+
- **selftest 213→214** · **E2E 365/365** · F1(2건 탐지)·F2(파이프 `\|` 이스케이프)·F3(help CRLF 제거) 행위 재현. (사이트 파이프라인 4건은 leerness-site 에서 별도 수정.)
|
|
33
|
+
- patch(1.15.1) — npm 미배포(R-0011, GitHub).
|
|
34
|
+
|
|
3
35
|
## 1.15.0 — 2026-06-09 — 🛡️ [안정화/Stable] Karpathy 가이드라인 정렬 3부작 안정 minor
|
|
4
36
|
|
|
5
37
|
**🛡️ 안정화(Stable) minor.** Andrej Karpathy 코딩 가이드라인(생각하고 코딩 / 단순성 / 외과적 변경 / 목표 주도) 대비 외부 에이전트 검토에서 도출한 정렬 작업(1.14.1~1.14.3)을 검증·통합해 npm 공개. R-0011 정책의 6번째 minor. 영상은 HyperFrames 파이프라인 제작.
|
package/README.md
CHANGED
|
@@ -186,7 +186,7 @@ MIT
|
|
|
186
186
|
<!-- leerness:project-readme:start -->
|
|
187
187
|
## Leerness Project Harness
|
|
188
188
|
|
|
189
|
-
이 프로젝트는 Leerness v1.
|
|
189
|
+
이 프로젝트는 Leerness v1.16.0 하네스를 사용합니다. AI 에이전트는 작업 전 `leerness handoff`로 컨텍스트를 적재하고, 작업 후 `leerness check`/`leerness audit`/`leerness session close`를 수행해야 합니다.
|
|
190
190
|
|
|
191
191
|
### 정체성 — AI 에이전트 운영 레이어 (UR-0030)
|
|
192
192
|
|
|
@@ -208,7 +208,7 @@ leerness status . # 설치 상태
|
|
|
208
208
|
leerness verify . # 필수 파일 검증
|
|
209
209
|
leerness audit . # 일관성·계획-진행 정렬 감사
|
|
210
210
|
leerness scan secrets . # 시크릿 패턴 스캔
|
|
211
|
-
leerness encoding check . # UTF-8 / BOM /
|
|
211
|
+
leerness encoding check . # UTF-8 / BOM / NUL / .bat 인코딩 검사
|
|
212
212
|
leerness lazy detect . # 게으름 방지 자동 평가
|
|
213
213
|
leerness memory search "키" # 결정/이력 검색
|
|
214
214
|
leerness session close . # 세션 종료 + handoff 자동 작성
|
|
@@ -240,7 +240,7 @@ leerness memory restore decision <date|title>
|
|
|
240
240
|
|
|
241
241
|
### MCP server (외부 AI 통합)
|
|
242
242
|
|
|
243
|
-
Leerness v1.
|
|
243
|
+
Leerness v1.16.0는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code · Cursor · Codex CLI 등 외부 AI에 **85개 도구**를 노출:
|
|
244
244
|
|
|
245
245
|
```jsonc
|
|
246
246
|
// 카테고리별
|
|
@@ -261,7 +261,7 @@ Leerness v1.15.0는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code
|
|
|
261
261
|
`<<autonomous-loop-dynamic>>` 신호만 보내면 AI가:
|
|
262
262
|
1) 다음 라운드 후보 선정 → 2) 코드 변경 → 3) stress-v* 신규 작성 + 누적 회귀 → 4) e2e 219/219 → 5) npm pack + git tag + GitHub release → 6) main 자동 push (1.9.140+) → 7) session close → 8) 다음 라운드 예약.
|
|
263
263
|
|
|
264
|
-
현재 누적: **70 라운드 (1.9.40 → 1.
|
|
264
|
+
현재 누적: **70 라운드 (1.9.40 → 1.16.0)** · 매 라운드 GitHub release/태그 생성 · _reports/는 비공개 보존.
|
|
265
265
|
|
|
266
266
|
### 성능 가이드 (1.9.140 측정)
|
|
267
267
|
|
|
@@ -299,6 +299,6 @@ leerness release pack --close --auto-main-push
|
|
|
299
299
|
- `.harness/session-handoff.md`: 다음 세션 인수인계 (자동 작성)
|
|
300
300
|
- `.harness/lessons.md` / `decisions.md` / `rules.md`: 영구 메모리 (5 surface)
|
|
301
301
|
|
|
302
|
-
Last synced by Leerness v1.
|
|
302
|
+
Last synced by Leerness v1.16.0: 2026-06-09
|
|
303
303
|
<!-- leerness:project-readme:end -->
|
|
304
304
|
|
package/bin/leerness.js
CHANGED
|
@@ -32,7 +32,7 @@ const { _evidenceQuality, _parseEvidenceStats, _shellGuardAnalyze, _claimFileInG
|
|
|
32
32
|
// 1.9.295 (UR-0025 4단계): 정적 데이터 카탈로그 모듈 분리 (비파괴, require-based).
|
|
33
33
|
const { CAPABILITY_SURFACE, POWERFUL_COMMANDS, ADAPTERS, REUSE_CATEGORIES, REUSE_CHECKLIST, _DEFAULT_PLATFORM_CONSTRAINTS, _DEFAULT_DOMAIN_CATALOG, _TOOL_CATALOG, _LSP_LANG_PATTERNS, OPTIMISM_PATTERNS, BUILT_IN_PERSONAS, STRINGS, BUILTIN_CATALOG, ROADMAP_STATUS_LABEL, ROADMAP_STATUS_COLOR, SECRET_PATTERNS, MERGE_OVERWRITE_FILES, MINIMAL_SKIP_KEYS, REQUIRED_WORKSPACE_FILES, KEYWORD_STOPWORDS, SKILL_CATALOG_PRESETS } = require('../lib/catalogs'); // 1.9.344/368/369 (UR-0025): catalog 분리 · 1.11.4 (UR-0007): _TOOL_CATALOG
|
|
34
34
|
|
|
35
|
-
const VERSION = '1.
|
|
35
|
+
const VERSION = '1.16.0';
|
|
36
36
|
|
|
37
37
|
// 1.9.290 (UR-0037, Codex gpt-5.5 #4 수렴): CLI 전용 부작용은 require 시 실행하지 않는다.
|
|
38
38
|
// 이전: warning listener 제거 / NODE_OPTIONS 변경 / chcp IIFE 가 top-level 즉시 실행 → require('harness') 시 호스트 프로세스 오염.
|
|
@@ -297,7 +297,7 @@ function managedReadmeBlock(project) {
|
|
|
297
297
|
'leerness verify . # 필수 파일 검증',
|
|
298
298
|
'leerness audit . # 일관성·계획-진행 정렬 감사',
|
|
299
299
|
'leerness scan secrets . # 시크릿 패턴 스캔',
|
|
300
|
-
'leerness encoding check . # UTF-8 / BOM /
|
|
300
|
+
'leerness encoding check . # UTF-8 / BOM / NUL / .bat 인코딩 검사',
|
|
301
301
|
'leerness lazy detect . # 게으름 방지 자동 평가',
|
|
302
302
|
'leerness memory search "키" # 결정/이력 검색',
|
|
303
303
|
'leerness session close . # 세션 종료 + handoff 자동 작성',
|
|
@@ -624,7 +624,7 @@ leerness memory restore <surface> <target> # archive → active 복귀 (DELETE
|
|
|
624
624
|
'.claude/commands/audit.md': `# /audit\n\n계획-진행 정렬, 디자인/재사용 일관성, 시크릿/인코딩을 일괄 점검합니다.\n\n\`\`\`\n!leerness audit .\n!leerness scan secrets .\n!leerness encoding check .\n\`\`\`\n`,
|
|
625
625
|
'.claude/commands/lazy-detect.md': `# /lazy-detect\n\n게으름 방지 자동 평가를 실행합니다.\n\n\`\`\`\n!leerness lazy detect .\n\`\`\`\n`,
|
|
626
626
|
'.claude/commands/update.md': `# /update\n\nleerness 자동 업데이트를 실행합니다 (감지 → 마이그레이션 → 검증).\n\n\`\`\`\n!leerness update --yes\n\`\`\`\n`,
|
|
627
|
-
'.claude/skills/leerness.md': `---\nname: leerness\ndescription: Leerness harness commands - handoff, audit, scan secrets, encoding check, lazy detect, session close, update. Use when the user asks to load project context, verify work quality, scan secrets, check encoding, or end a session.\n---\n\n# leerness skill\n\n## When to use\n- 사용자가 프로젝트 컨텍스트를 로드해달라고 할 때\n- 완료 선언 전 자기 검증을 요청할 때\n- 세션을 종료하거나 인수인계를 요청할 때\n- 시크릿/한글 인코딩 점검을 요청할 때\n- 새 leerness 버전 적용을 요청할 때\n\n## Commands\n\n\`\`\`bash\nleerness handoff . # 컨텍스트 로드\nleerness check . # pre-action 체크\nleerness audit . # 일관성/계획 정렬 감사\nleerness scan secrets . # 시크릿 패턴 스캔\nleerness encoding check . # UTF-8/BOM/
|
|
627
|
+
'.claude/skills/leerness.md': `---\nname: leerness\ndescription: Leerness harness commands - handoff, audit, scan secrets, encoding check, lazy detect, session close, update. Use when the user asks to load project context, verify work quality, scan secrets, check encoding, or end a session.\n---\n\n# leerness skill\n\n## When to use\n- 사용자가 프로젝트 컨텍스트를 로드해달라고 할 때\n- 완료 선언 전 자기 검증을 요청할 때\n- 세션을 종료하거나 인수인계를 요청할 때\n- 시크릿/한글 인코딩 점검을 요청할 때\n- 새 leerness 버전 적용을 요청할 때\n\n## Commands\n\n\`\`\`bash\nleerness handoff . # 컨텍스트 로드\nleerness check . # pre-action 체크\nleerness audit . # 일관성/계획 정렬 감사\nleerness scan secrets . # 시크릿 패턴 스캔\nleerness encoding check . # UTF-8/BOM/NUL\nleerness lazy detect . # 게으름 평가\nleerness memory search "key" # 결정/이력 검색\nleerness session close . # 종료 보고 + handoff 자동 생성\nleerness update --yes # 자동 업데이트\n\`\`\`\n`,
|
|
628
628
|
};
|
|
629
629
|
// 1.9.276: minimal 모드 — 코어가 요구하지 않는 파일 제외 (verify 필수 파일은 유지).
|
|
630
630
|
if (opts.minimal) { for (const k of MINIMAL_SKIP_KEYS) delete _files[k]; }
|
|
@@ -3539,6 +3539,12 @@ function _selfTestCases() {
|
|
|
3539
3539
|
const dw = (b.match(/^Done-When:\s*(.+)$/m) || [])[1];
|
|
3540
3540
|
return wired && dw === '로그인 e2e 테스트 통과';
|
|
3541
3541
|
} },
|
|
3542
|
+
{ name: '16th 버그헌트 F1/F2: scan secrets 패턴당 멀티매치(break 제거) + task/rule list 파이프 셀안전 (1.15.1)', run: () => {
|
|
3543
|
+
const src = read(__filename);
|
|
3544
|
+
const f1 = src.includes('같은 패턴이 한 파일에 여러 번') && src.includes('if (re.lastIndex === m.index) re.lastIndex++;');
|
|
3545
|
+
const f2 = src.includes('_cellSafe(r.request)') && src.includes('_cellSafe(r.rule)');
|
|
3546
|
+
return f1 && f2;
|
|
3547
|
+
} },
|
|
3542
3548
|
{ name: 'VERSION 형식 (x.y.z)', run: () => /^\d+\.\d+\.\d+$/.test(VERSION) }
|
|
3543
3549
|
];
|
|
3544
3550
|
}
|
|
@@ -6589,7 +6595,7 @@ function taskList(root) {
|
|
|
6589
6595
|
if (!filtered.length) return log('(no tasks)');
|
|
6590
6596
|
log('| ID | Status | Request | Evidence | Next Action | Updated |');
|
|
6591
6597
|
log('|---|---|---|---|---|---|');
|
|
6592
|
-
for (const r of filtered) log(`| ${r.id} | ${r.status} | ${r.request} | ${r.evidence} | ${r.nextAction} | ${r.updated} |`);
|
|
6598
|
+
for (const r of filtered) log(`| ${r.id} | ${r.status} | ${_cellSafe(r.request)} | ${_cellSafe(r.evidence)} | ${_cellSafe(r.nextAction)} | ${r.updated} |`); // 16th 버그헌트 F2: 표시도 _cellSafe — 파이프(|)가 칼럼 깨던 것 차단(저장은 안전했으나 list 표시가 raw)
|
|
6593
6599
|
}
|
|
6594
6600
|
// 1.9.310 (UR-0046, 설치리뷰 3중수렴): CLI/MCP 입력 스키마 검증 — 무효 status/trigger 거부(--force 우회).
|
|
6595
6601
|
// 이전: task --status nonsense / rule --trigger 오타가 그대로 등록돼 상태/정책 신뢰성 훼손.
|
|
@@ -7394,7 +7400,8 @@ function _collectSecretFindings(root) {
|
|
|
7394
7400
|
if (valueGroup != null && requireSecretLike && !_looksSecretLike(val)) { if (re.lastIndex === m.index) re.lastIndex++; continue; }
|
|
7395
7401
|
const line = text.slice(0, m.index).split('\n').length;
|
|
7396
7402
|
findings.push({ file: fileRel, line, name, snippet: m[0].slice(0, 32), gitignored });
|
|
7397
|
-
break
|
|
7403
|
+
// 16th 버그헌트 F1: break 제거 — 같은 패턴이 한 파일에 여러 번(예: secret: + api_key: 둘 다 'Hardcoded password') 나오면 모두 보고(보안 FN 차단). zero-width 매치는 lastIndex 전진으로 무한루프 방지.
|
|
7404
|
+
if (re.lastIndex === m.index) re.lastIndex++;
|
|
7398
7405
|
}
|
|
7399
7406
|
}
|
|
7400
7407
|
}
|
|
@@ -12937,7 +12944,7 @@ function ruleList(root) {
|
|
|
12937
12944
|
if (!rules.length) return ok('등록된 룰 없음');
|
|
12938
12945
|
log('| ID | Trigger | Rule | Status | Last Verified |');
|
|
12939
12946
|
log('|---|---|---|---|---|');
|
|
12940
|
-
for (const r of rules) log(`| ${r.id} | ${r.trigger} | ${r.rule} | ${r.status} | ${r.lastVerified} |`);
|
|
12947
|
+
for (const r of rules) log(`| ${r.id} | ${_cellSafe(r.trigger)} | ${_cellSafe(r.rule)} | ${r.status} | ${r.lastVerified} |`); // 16th 버그헌트 F2: 파이프 칼럼 깨짐 차단(표시 _cellSafe)
|
|
12941
12948
|
}
|
|
12942
12949
|
|
|
12943
12950
|
function ruleRemove(root, id) {
|