leerness 1.24.0 β 1.26.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 +96 -0
- package/README.md +4 -4
- package/bin/leerness.js +100 -23
- package/lib/health.js +355 -354
- package/lib/session-close.js +2 -2
- package/package.json +1 -1
- package/scripts/e2e.js +35 -0
package/lib/session-close.js
CHANGED
|
@@ -54,7 +54,7 @@ function sessionClose(root, opts = {}, deps = {}) {
|
|
|
54
54
|
if (_closeSecrets) log(t(` π¨ λ§κ° 보μ: μ»€λ° λμ μν¬λ¦Ώ ${_closeSecrets}건 λ―Έν΄μ β clean μλ, leerness scan secrets νμΈ ν λ§κ° κΆμ₯`, ` π¨ close security: ${_closeSecrets} committed secret(s) unresolved β not clean, run leerness scan secrets before closing`));
|
|
55
55
|
|
|
56
56
|
function rowsToList(arr) {
|
|
57
|
-
if (!arr || !arr.length) return '- μμ';
|
|
57
|
+
if (!arr || !arr.length) return t('- μμ', '- none'); // 1.24.1 (UR-0010): en λ³΄κ³ λ³Έλ¬Έ μ ν©(ν€λλ μ΄λ―Έ μμ΄)
|
|
58
58
|
return arr.map(r => `- ${r.id} ${r.request} β next: ${r.nextAction}`).join('\n');
|
|
59
59
|
}
|
|
60
60
|
|
|
@@ -215,7 +215,7 @@ function sessionClose(root, opts = {}, deps = {}) {
|
|
|
215
215
|
writeSessionCounter(root, sc);
|
|
216
216
|
const agg = _retroAggregate(root);
|
|
217
217
|
log(t(`\n## π μ§ν μμ½ (session #${sc.count})`, `\n## π Progress summary (session #${sc.count})`));
|
|
218
|
-
log(` ${_retroOneLine(agg)}`);
|
|
218
|
+
log(` ${_retroOneLine(agg, uiLang)}`); // 1.24.1 (UR-0010): μ§ν μμ½ ν μ€ en
|
|
219
219
|
// 1.9.132: archive νλ 1μ€ μμ½ β λ§κ° μμ μ DELETE νλ κ°μν (handoff 7λ²μ§Έ νμμ symmetric)
|
|
220
220
|
try {
|
|
221
221
|
const hdSC = path.join(root, '.harness');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.26.0",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|
package/scripts/e2e.js
CHANGED
|
@@ -6202,5 +6202,40 @@ total++;
|
|
|
6202
6202
|
if (!ok) failed++;
|
|
6203
6203
|
}
|
|
6204
6204
|
|
|
6205
|
+
// 1.25.1 (22nd λ²κ·ΈννΈ β i18n νμ νκ· κ°λ, UR-0010): --language en λ°νμ λ λκ° μ€μ λ‘ μμ΄μΈμ§ + ko κΈ°λ³Έ 보쑴 + --language κ°μ΄ positional λ‘ λμΆ μ λλμ§ νμλ‘ κ²μ¦.
|
|
6206
|
+
// μμ€κ°λ(λ¬Έμμ΄ μ‘΄μ¬)λ§μΌλ‘λ 1.23.0 "session close μμ μμ΄" κ³Όμ₯(λ°νμ νκΈ λμΆ)μ λͺ» μ‘μλ 곡백μ e2e λ‘ λ³΄κ°(defense-in-depth).
|
|
6207
|
+
total++;
|
|
6208
|
+
{
|
|
6209
|
+
let ok = false;
|
|
6210
|
+
try {
|
|
6211
|
+
const d = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-i18n-'));
|
|
6212
|
+
cp.spawnSync(process.execPath, [CLI, 'init', d, '--yes', '--language', 'ko'], { encoding: 'utf8', timeout: 30000 });
|
|
6213
|
+
const H = /[κ°-ν£]/;
|
|
6214
|
+
const out = (r) => (r.stdout || '') + (r.stderr || '');
|
|
6215
|
+
// β κΈ°λ³Έ(ko νλ‘μ νΈ, νλκ·Έ μμ): lens νκΈ λ³΄μ‘΄
|
|
6216
|
+
const lensKo = out(cp.spawnSync(process.execPath, [CLI, 'lens', '--path', d], { encoding: 'utf8', timeout: 15000 }));
|
|
6217
|
+
const lensKoOk = /λΆμΌλ³ μκΈ°μ§λ¬Έ νμ§ λ μ¦/.test(lensKo);
|
|
6218
|
+
// β‘ μμ΄ opt-in(ko νλ‘μ νΈλΌλ flag κ° manifest λ₯Ό μ΄κΉ): lens μμ΄ λ λ + νκΈ 0
|
|
6219
|
+
const lensEn = out(cp.spawnSync(process.execPath, [CLI, 'lens', '--language', 'en', '--path', d], { encoding: 'utf8', timeout: 15000 }));
|
|
6220
|
+
const lensEnOk = /quality self-question lenses/.test(lensEn) && !H.test(lensEn);
|
|
6221
|
+
// β’ --language en κ°μ΄ positional λ‘ λμΆ μ λ¨: task add ν
μ€νΈ 보쑴, request="en" μΈ task μμ
|
|
6222
|
+
cp.spawnSync(process.execPath, [CLI, 'task', 'add', 'I18N_TASK_E2E', '--language', 'en', '--path', d], { encoding: 'utf8', timeout: 15000 });
|
|
6223
|
+
const tl = out(cp.spawnSync(process.execPath, [CLI, 'task', 'list', '--json', '--path', d], { encoding: 'utf8', timeout: 15000 }));
|
|
6224
|
+
const noLeak = tl.includes('I18N_TASK_E2E') && !/"request"\s*:\s*"en"/.test(tl);
|
|
6225
|
+
// β£ status path-not-found μλ¬: en μμ΄ / ko νκΈ (failJson λΆκΈ°)
|
|
6226
|
+
const stEn = out(cp.spawnSync(process.execPath, [CLI, 'status', path.join(d, 'nope'), '--language', 'en', '--json'], { encoding: 'utf8', timeout: 15000 }));
|
|
6227
|
+
const stKo = out(cp.spawnSync(process.execPath, [CLI, 'status', path.join(d, 'nope'), '--json'], { encoding: 'utf8', timeout: 15000 }));
|
|
6228
|
+
const stOk = /path not found/.test(stEn) && /κ²½λ‘ μμ/.test(stKo);
|
|
6229
|
+
// β€ (1.25.2 Phase 9) health: en λ λ μμ΄(νκΈ 0) + ko κΈ°λ³Έ νκΈ λ³΄μ‘΄
|
|
6230
|
+
const hEn = out(cp.spawnSync(process.execPath, [CLI, 'health', '--language', 'en', '--path', d], { encoding: 'utf8', timeout: 20000 }));
|
|
6231
|
+
const hKo = out(cp.spawnSync(process.execPath, [CLI, 'health', '--path', d], { encoding: 'utf8', timeout: 20000 }));
|
|
6232
|
+
const healthOk = /## Security/.test(hEn) && !H.test(hEn) && /## 보μ/.test(hKo);
|
|
6233
|
+
fs.rmSync(d, { recursive: true, force: true });
|
|
6234
|
+
ok = lensKoOk && lensEnOk && noLeak && stOk && healthOk;
|
|
6235
|
+
} catch {}
|
|
6236
|
+
console.log(ok ? 'β B(1.25.1/1.25.2) i18n νμ: --language en λ°νμ μμ΄(lens/health) + ko κΈ°λ³Έ 보쑴 + --language positional 무λμΆ + status μλ¬ en/ko (UR-0010)' : 'β i18n νμ νκ· κ°λ μ€ν¨');
|
|
6237
|
+
if (!ok) failed++;
|
|
6238
|
+
}
|
|
6239
|
+
|
|
6205
6240
|
console.log(`\nE2E result: ${total - failed}/${total} passed Β· ${((Date.now() - _e2eStart) / 1000).toFixed(0)}s`);
|
|
6206
6241
|
if (failed > 0) process.exit(1);
|