leerness 1.9.74 → 1.9.75

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,24 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.75 — 2026-05-20
4
+
5
+ **`leerness audit` 보안 강화 — `.gitignore` 시크릿 패턴 자동 검증** (사용자 글로벌 룰 ".gitignore 보안 체크리스트" 정책 자동화).
6
+
7
+ ### Added — audit `.gitignore` 보안 검증
8
+ - `.env` 파일이 존재할 때 다음 패턴이 `.gitignore`에 포함되는지 자동 검증:
9
+ - `.env`, `.env.local`, `.env.production`, `.env.*.local`
10
+ - `*.pem` (private keys)
11
+ - `credentials.json`
12
+ - 누락 시 warning + `--fix`로 자동 추가 (1.9.75 안내 코멘트 동반).
13
+ - `--no-gitignore-check`로 비활성화.
14
+ - `audit --strict` 와 결합 시 보안 누락이 failure로 승격됨 (CI 친화).
15
+
16
+ ### Verified
17
+ - stress-v21 — gitignore 검증 + --fix 추가 + 1.9.43~74 누적 회귀.
18
+ - e2e 219/219 PASS 유지.
19
+
20
+ ---
21
+
3
22
  ## 1.9.74 — 2026-05-20
4
23
 
5
24
  **`session close` 마감 시 누적 회고 통계 강화** (1.9.70 MCP + 1.9.68 history 결합).
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.74-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.75-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.74 AI Agent Reliability Harness ║
15
+ ║ v1.9.75 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.75** — **`leerness audit` 보안 강화** — `.env` 존재 시 `.gitignore`에 시크릿 패턴 (`.env`/`.env.local`/`.env.production`/`*.pem`/`credentials.json`) 자동 검증, `--fix`로 자동 추가.
436
437
  - **1.9.74** — **`session close` 마감 시 누적 회고 통계 강화** — MCP tools/call 카운트 + skill match query top + drift 통계를 자동 요약 (1.9.70 + 1.9.68 결합).
437
438
  - **1.9.73** — **MCP server 14번째 도구 `leerness_env_check`** — 1.9.71 env 보안 검사를 외부 AI에 노출 (외부 워크스페이스 .env/.env.example 동기화 자동 점검).
438
439
  - **1.9.72** — **`leerness brainstorm`에 skill-suggestions.md history + task-log 실패 라인 통합** — 누적 컨텍스트 기반 brainstorm 강화 (이전 매칭 이력 + task-log 실패 회수).
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.74';
9
+ const VERSION = '1.9.75';
10
10
  const MARK = '<!-- leerness:managed -->';
11
11
  const README_START = '<!-- leerness:project-readme:start -->';
12
12
  const README_END = '<!-- leerness:project-readme:end -->';
@@ -1480,6 +1480,39 @@ function audit(root) {
1480
1480
  }
1481
1481
  } catch {}
1482
1482
  }
1483
+ // 1.9.75: .gitignore 보안 검증 — .env / 시크릿 파일이 .gitignore에 포함되는지 (--no-gitignore-check로 끄기)
1484
+ if (!has('--no-gitignore-check')) {
1485
+ try {
1486
+ const gi = path.join(root, '.gitignore');
1487
+ const envPath = path.join(root, '.env');
1488
+ if (exists(envPath)) {
1489
+ // .env가 존재하면 .gitignore가 반드시 있어야 하고, .env가 포함되어야 함
1490
+ const giText = exists(gi) ? read(gi) : '';
1491
+ const giLines = giText.split('\n').map(l => l.trim());
1492
+ // 필수 보안 패턴 (글로벌 룰 .gitignore 보안 체크리스트)
1493
+ const SECRET_PATTERNS = ['.env', '.env.local', '.env.production', '.env.*.local', '*.pem', 'credentials.json'];
1494
+ const missing = SECRET_PATTERNS.filter(p => !giLines.some(l => l === p || l === '/' + p));
1495
+ if (missing.length) {
1496
+ warnings++;
1497
+ warn(`.gitignore에 시크릿 패턴 ${missing.length}건 누락: ${missing.slice(0, 4).join(', ')}${missing.length > 4 ? ' …' : ''}`);
1498
+ if (fix) {
1499
+ // 자동 추가
1500
+ let newGi = giText;
1501
+ if (newGi && !newGi.endsWith('\n')) newGi += '\n';
1502
+ newGi += `\n# 1.9.75 audit --fix: 시크릿 파일 보안 패턴 자동 추가 (사용자 글로벌 룰)\n`;
1503
+ for (const p of missing) newGi += `${p}\n`;
1504
+ writeUtf8(gi, newGi);
1505
+ ok(` ↳ fixed: .gitignore에 ${missing.length}건 자동 추가 (시크릿 보안 1.9.75)`);
1506
+ fixed++;
1507
+ } else {
1508
+ log(` → 자동 추가: leerness audit --fix`);
1509
+ }
1510
+ } else {
1511
+ ok('.gitignore 시크릿 패턴 OK (1.9.75)');
1512
+ }
1513
+ }
1514
+ } catch {}
1515
+ }
1483
1516
  // 1.9.71: .env / .env.example 동기화 감사 (--no-env-check로 끄기)
1484
1517
  if (!has('--no-env-check')) {
1485
1518
  try {
@@ -3242,7 +3275,7 @@ function _banner(opts = {}) {
3242
3275
  lines.push('');
3243
3276
  for (const ln of lines) log(ln);
3244
3277
  if (opts.quickStart) {
3245
- log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.74+ 워크플로)')));
3278
+ log(C.bold(C.cyan(' ✨ 빠른 시작 (1.9.75+ 워크플로)')));
3246
3279
  log(' ' + C.green('npx leerness@latest init .') + C.dim(' # 신규 프로젝트 + 외부 AI CLI 설정'));
3247
3280
  log(' ' + C.green('npx leerness handoff .') + C.dim(' # 컨텍스트 + lessons + 매칭 skill + 이전 history hit (1.9.69)'));
3248
3281
  log(' ' + C.green('npx leerness skill match "<query>"') + C.dim(' # 매칭 skill + rolling history 자동 누적 (1.9.68)'));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.74",
3
+ "version": "1.9.75",
4
4
  "description": "Leerness: 비파괴 마이그레이션, 자동 버전 감지·업데이트, 계획/진행/핸드오프 자동화, 게으름·시크릿·인코딩 자동 가드, Claude Code 슬래시 통합을 갖춘 한국어 우선 AI 개발 하네스.",
5
5
  "keywords": [
6
6
  "leerness",