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.
@@ -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.24.0",
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);