leerness 1.18.0 → 1.19.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 +79 -0
- package/README.ko.md +187 -0
- package/README.md +50 -134
- package/SECURITY.md +66 -56
- package/bin/leerness.js +253 -52
- package/lib/audit.js +336 -322
- package/package.json +1 -1
- package/scripts/e2e.js +11 -11
package/package.json
CHANGED
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
|