leerness 1.18.0 → 1.20.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.18.0",
3
+ "version": "1.20.0",
4
4
  "description": "Leerness: 비파괴 마이그레이션, 자동 버전 감지·업데이트, 계획/진행/핸드오프 자동화, 게으름·시크릿·인코딩 자동 가드, Claude Code 슬래시 통합을 갖춘 한국어 우선 AI 개발 하네스.",
5
5
  "keywords": [
6
6
  "leerness",
package/scripts/e2e.js CHANGED
@@ -448,7 +448,7 @@ total++;
448
448
  // 실제 src 파일 + 테스트 파일 생성 (5개 check)
449
449
  fs.mkdirSync(path.join(tmpV, 'src'), { recursive: true });
450
450
  fs.mkdirSync(path.join(tmpV, 'tests'), { recursive: true });
451
- fs.writeFileSync(path.join(tmpV, 'src/myMod.js'), 'module.exports = {};\n');
451
+ fs.writeFileSync(path.join(tmpV, 'src/myMod.js'), 'module.exports = { ok: true };\n');
452
452
  fs.writeFileSync(path.join(tmpV, 'tests/test.js'), 'check(1); check(2); check(3); check(4); check(5);\n');
453
453
  // T-row를 evidence와 함께 추가
454
454
  // 1.17.4 (UR-0047): evidence 에 명시적 개수 주장(테스트 5개) 포함 — 카운트 검증이 실제로 수행되는 경로를 테스트.
@@ -484,7 +484,7 @@ total++;
484
484
  }));
485
485
  fs.mkdirSync(path.join(tmpR, 'src'), { recursive: true });
486
486
  fs.mkdirSync(path.join(tmpR, 'tests'), { recursive: true });
487
- fs.writeFileSync(path.join(tmpR, 'src/mod.js'), 'module.exports={};\n');
487
+ fs.writeFileSync(path.join(tmpR, 'src/mod.js'), 'module.exports = { ok: true };\n');
488
488
  // 5 check 호출 + "5/5 passed" 직접 출력 (간단한 fixture)
489
489
  fs.writeFileSync(path.join(tmpR, 'tests/test.js'),
490
490
  "let p=0;function check(c){if(c)p++;}check(1);check(1);check(1);check(1);check(1);console.log(p+'/5 passed');if(p!==5)process.exit(1);\n");
@@ -508,7 +508,7 @@ total++;
508
508
  fs.writeFileSync(path.join(tmpF, 'package.json'), JSON.stringify({ name: 'rtf', version: '0.0.1', scripts: { test: 'node tests/test.js' } }));
509
509
  fs.mkdirSync(path.join(tmpF, 'src'), { recursive: true });
510
510
  fs.mkdirSync(path.join(tmpF, 'tests'), { recursive: true });
511
- fs.writeFileSync(path.join(tmpF, 'src/mod.js'), 'module.exports={};\n');
511
+ fs.writeFileSync(path.join(tmpF, 'src/mod.js'), 'module.exports = { ok: true };\n');
512
512
  fs.writeFileSync(path.join(tmpF, 'tests/test.js'),
513
513
  "console.log('3/5 passed'); process.exit(1);\n");
514
514
  fs.appendFileSync(path.join(tmpF, '.harness/progress-tracker.md'),
@@ -652,7 +652,7 @@ total++;
652
652
  const tmpS = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-stct-'));
653
653
  cp.spawnSync(process.execPath, [CLI, 'init', tmpS, '--yes', '--language', 'ko', '--skills', 'recommended'], { stdio: 'ignore', timeout: 30000 });
654
654
  fs.mkdirSync(path.join(tmpS, 'src'), { recursive: true });
655
- fs.writeFileSync(path.join(tmpS, 'src/x.js'), 'module.exports={};\n');
655
+ fs.writeFileSync(path.join(tmpS, 'src/x.js'), 'module.exports = { ok: true };\n');
656
656
  fs.appendFileSync(path.join(tmpS, '.harness/progress-tracker.md'),
657
657
  '| T-0050 | done | DB 마이그레이션 | 사용자 데이터 DB에 저장, 1000건 insert 성공 | (완료) | 2026-05-15 |\n');
658
658
  const r = cp.spawnSync(process.execPath, [CLI, 'verify-claim', 'T-0050', '--path', tmpS, '--strict-claims'], { encoding: 'utf8', timeout: 10000 });
@@ -688,7 +688,7 @@ total++;
688
688
  const tmpN = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-notify-'));
689
689
  cp.spawnSync(process.execPath, [CLI, 'init', tmpN, '--yes', '--language', 'ko', '--skills', 'recommended'], { stdio: 'ignore', timeout: 30000 });
690
690
  fs.mkdirSync(path.join(tmpN, 'src'), { recursive: true });
691
- fs.writeFileSync(path.join(tmpN, 'src/x.js'), 'module.exports={};\n');
691
+ fs.writeFileSync(path.join(tmpN, 'src/x.js'), 'module.exports = { ok: true };\n');
692
692
  fs.appendFileSync(path.join(tmpN, '.harness/progress-tracker.md'),
693
693
  '| T-9100 | done | Slack 알림 | 슬랙 알림 발송 완료, #general 채널에 통보 | next | 2026-05-15 |\n');
694
694
  const r = cp.spawnSync(process.execPath, [CLI, 'optimism-check', 'T-9100', '--path', tmpN], { encoding: 'utf8', timeout: 10000 });
@@ -703,7 +703,7 @@ total++;
703
703
  const tmpC = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-conf-'));
704
704
  cp.spawnSync(process.execPath, [CLI, 'init', tmpC, '--yes', '--language', 'ko', '--skills', 'recommended'], { stdio: 'ignore', timeout: 30000 });
705
705
  fs.mkdirSync(path.join(tmpC, 'src'), { recursive: true });
706
- fs.writeFileSync(path.join(tmpC, 'src/x.js'), 'module.exports={};\n');
706
+ fs.writeFileSync(path.join(tmpC, 'src/x.js'), 'module.exports = { ok: true };\n');
707
707
  fs.appendFileSync(path.join(tmpC, '.harness/progress-tracker.md'),
708
708
  '| T-9200 | done | pure compute | src/x.js 모듈 추가 | next | 2026-05-15 |\n');
709
709
  const r = cp.spawnSync(process.execPath, [CLI, 'optimism-check', 'T-9200', '--path', tmpC, '--json'], { encoding: 'utf8', timeout: 10000 });
@@ -720,7 +720,7 @@ total++;
720
720
  const tmpK = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-kpay-'));
721
721
  cp.spawnSync(process.execPath, [CLI, 'init', tmpK, '--yes', '--language', 'ko', '--skills', 'recommended'], { stdio: 'ignore', timeout: 30000 });
722
722
  fs.mkdirSync(path.join(tmpK, 'src'), { recursive: true });
723
- fs.writeFileSync(path.join(tmpK, 'src/x.js'), 'module.exports={};\n');
723
+ fs.writeFileSync(path.join(tmpK, 'src/x.js'), 'module.exports = { ok: true };\n');
724
724
  fs.appendFileSync(path.join(tmpK, '.harness/progress-tracker.md'),
725
725
  '| T-9100 | done | 결제 | 카카오페이 결제 승인 완료 | next | 2026-05-15 |\n');
726
726
  const r = cp.spawnSync(process.execPath, [CLI, 'optimism-check', 'T-9100', '--path', tmpK, '--json'], { encoding: 'utf8', timeout: 10000 });
@@ -2007,7 +2007,7 @@ total++;
2007
2007
  fs.writeFileSync(path.join(tmpJ, 'package.json'), JSON.stringify({ name: 'tp', version: '0.0.1', scripts: { test: 'node tests/test.js' } }));
2008
2008
  fs.mkdirSync(path.join(tmpJ, 'src'), { recursive: true });
2009
2009
  fs.mkdirSync(path.join(tmpJ, 'tests'), { recursive: true });
2010
- fs.writeFileSync(path.join(tmpJ, 'src/foo.js'), 'module.exports={};\n');
2010
+ fs.writeFileSync(path.join(tmpJ, 'src/foo.js'), 'module.exports = { ok: true };\n');
2011
2011
  fs.writeFileSync(path.join(tmpJ, 'tests/test.js'), "console.log('Tests: 12 passed, 12 total');\n");
2012
2012
  fs.appendFileSync(path.join(tmpJ, '.harness/progress-tracker.md'),
2013
2013
  '| T-0021 | done | jest 스타일 | src/foo.js + Tests: 12 passed, 12 total | next | 2026-05-14 |\n');
@@ -2027,7 +2027,7 @@ total++;
2027
2027
  fs.writeFileSync(path.join(tmpM, 'package.json'), JSON.stringify({ name: 'mc', version: '0.0.1', scripts: { test: 'node tests/test.js' } }));
2028
2028
  fs.mkdirSync(path.join(tmpM, 'src'), { recursive: true });
2029
2029
  fs.mkdirSync(path.join(tmpM, 'tests'), { recursive: true });
2030
- fs.writeFileSync(path.join(tmpM, 'src/x.js'), 'module.exports={};\n');
2030
+ fs.writeFileSync(path.join(tmpM, 'src/x.js'), 'module.exports = { ok: true };\n');
2031
2031
  fs.writeFileSync(path.join(tmpM, 'tests/test.js'), "console.log(' 7 passing (12ms)');\n");
2032
2032
  fs.appendFileSync(path.join(tmpM, '.harness/progress-tracker.md'),
2033
2033
  '| T-0022 | done | mocha | src/x.js + 7 passing | next | 2026-05-14 |\n');
@@ -3019,7 +3019,7 @@ total++;
3019
3019
  const fakeBlocked = rFake.status === 1 && /evidence 완전성.*FAIL/.test(rFake.stdout);
3020
3020
  // 완전한 evidence(파일+테스트) + 실제 파일 존재 → pass (exit 0)
3021
3021
  fs.mkdirSync(path.join(cDir, 'src'), { recursive: true });
3022
- fs.writeFileSync(path.join(cDir, 'src', 'api.js'), 'module.exports = {};\n');
3022
+ fs.writeFileSync(path.join(cDir, 'src', 'api.js'), 'module.exports = { ok: true };\n');
3023
3023
  cp.spawnSync(process.execPath, [CLI, 'task', 'update', 'T-0002', '--evidence', 'src/api.js 구현, npm test 5/5 통과 (Exit: 0)', '--path', cDir], { encoding: 'utf8', timeout: 15000, env });
3024
3024
  const rGood = cp.spawnSync(process.execPath, [CLI, 'verify-claim', 'T-0002', '--require-evidence', '--path', cDir], { encoding: 'utf8', timeout: 20000, env });
3025
3025
  const goodPass = rGood.status === 0 && /evidence 완전성.*pass/.test(rGood.stdout);
@@ -3575,7 +3575,7 @@ total++;
3575
3575
  try {
3576
3576
  const vc = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-vc48-'));
3577
3577
  cp.spawnSync(process.execPath, [CLI, 'init', vc, '--yes', '--language', 'ko', '--skills', 'recommended'], { encoding: 'utf8', timeout: 30000 });
3578
- fs.mkdirSync(path.join(vc, 'src'), { recursive: true }); fs.writeFileSync(path.join(vc, 'src', 'api.js'), 'module.exports={};');
3578
+ fs.mkdirSync(path.join(vc, 'src'), { recursive: true }); fs.writeFileSync(path.join(vc, 'src', 'api.js'), 'module.exports = { ok: true };');
3579
3579
  const ex = (...a) => cp.spawnSync(process.execPath, [CLI, ...a], { cwd: vc, encoding: 'utf8', timeout: 20000 });
3580
3580
  ex('task', 'add', '증거없는완료', '--path', vc, '--status', 'done'); // T-0002: 증거 0
3581
3581
  ex('task', 'add', '증거있는완료', '--path', vc, '--status', 'done', '--evidence', 'src/api.js 수정, 8 tests 통과 (Exit: 0)'); // T-0003