leerness 1.36.177 → 1.36.178
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 +4 -0
- package/README.md +4 -4
- package/bin/leerness.js +1 -1
- package/package.json +1 -1
- package/scripts/e2e.js +14 -8
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.36.178 — 2026-08-29
|
|
4
|
+
|
|
5
|
+
- CI: env encoding-check --apply 전체 E2E를 Windows BOM 교체와 POSIX byte-exact no-op 계약으로 분기해 v1.36.177 Linux/Node 22의 466/467 실패를 수정.
|
|
6
|
+
|
|
3
7
|
## 1.36.177 — 2026-08-29
|
|
4
8
|
|
|
5
9
|
- T-0022 데이터 무결성: env/drift/session BOM 수정을 공용 CAS·Windows ReplaceFile 경계로 통합하고 CP949·모호 인코딩·손상 BOM·메타데이터·동시 writer/ADS·부분진행 복구를 실패-폐쇄 처리. auto-fix 전 단계 JSON/exit 정직화, 스캔 I/O 오류 및 unborn/실행불가 Git 구분, OS 매트릭스 mutation-integrity 회귀 추가.
|
package/README.md
CHANGED
|
@@ -138,7 +138,7 @@ MIT
|
|
|
138
138
|
<!-- leerness:project-readme:start -->
|
|
139
139
|
## Leerness Project Harness
|
|
140
140
|
|
|
141
|
-
이 프로젝트는 Leerness v1.36.
|
|
141
|
+
이 프로젝트는 Leerness v1.36.178 하네스를 사용합니다. AI 에이전트는 작업 전 `leerness handoff`로 컨텍스트를 적재하고, 작업 후 `leerness check`/`leerness audit`/`leerness session close`를 수행해야 합니다.
|
|
142
142
|
|
|
143
143
|
### 정체성 — AI 에이전트 운영 레이어 (UR-0030)
|
|
144
144
|
|
|
@@ -192,7 +192,7 @@ leerness memory restore decision <date|title>
|
|
|
192
192
|
|
|
193
193
|
### MCP server (외부 AI 통합)
|
|
194
194
|
|
|
195
|
-
Leerness v1.36.
|
|
195
|
+
Leerness v1.36.178는 stdio JSON-RPC MCP server를 내장합니다 — Claude Code · Cursor · Codex CLI 등 외부 AI에 **89개 도구**를 노출:
|
|
196
196
|
|
|
197
197
|
```jsonc
|
|
198
198
|
// 카테고리별
|
|
@@ -213,7 +213,7 @@ Leerness v1.36.177는 stdio JSON-RPC MCP server를 내장합니다 — Claude Co
|
|
|
213
213
|
`<<autonomous-loop-dynamic>>` 신호만 보내면 AI가:
|
|
214
214
|
1) 다음 라운드 후보 선정 → 2) 코드 변경 → 3) 회귀 테스트 갱신 → 4) 전체 e2e 스위트 통과 → 5) npm publish + git tag → 6) main push → 7) session close → 8) 다음 라운드 예약.
|
|
215
215
|
|
|
216
|
-
현재 누적: **v1.9.x → 1.36.
|
|
216
|
+
현재 누적: **v1.9.x → 1.36.178 릴리스 태그 이력** (수백 라운드) · _reports/는 비공개 보존.
|
|
217
217
|
|
|
218
218
|
### 성능 가이드
|
|
219
219
|
|
|
@@ -251,5 +251,5 @@ leerness release pack --close --auto-main-push
|
|
|
251
251
|
- `.leerness/session-handoff.md`: 다음 세션 인수인계 (자동 작성)
|
|
252
252
|
- `.leerness/lessons.md` / `decisions.md` / `rules.md`: 영구 메모리 (5 surface)
|
|
253
253
|
|
|
254
|
-
Last synced by Leerness v1.36.
|
|
254
|
+
Last synced by Leerness v1.36.178: 2026-08-29
|
|
255
255
|
<!-- leerness:project-readme:end -->
|
package/bin/leerness.js
CHANGED
|
@@ -49,7 +49,7 @@ const {
|
|
|
49
49
|
migrateLegacyWorkspace,
|
|
50
50
|
} = require('../lib/workspace-dir');
|
|
51
51
|
|
|
52
|
-
const VERSION = '1.36.
|
|
52
|
+
const VERSION = '1.36.178';
|
|
53
53
|
|
|
54
54
|
// MCP lifecycle 주소 표식은 현재 CLI 호출 한 번에만 유효하다. CLI bootstrap에서 즉시 env에서
|
|
55
55
|
// 떼어 두어 `--no-record`/hook처럼 presence 기록 함수에 도달하지 않는 경로도 후속 child에 유출하지 않는다.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.36.
|
|
3
|
+
"version": "1.36.178",
|
|
4
4
|
"description": "The AI-coding operations layer that makes \"done\" require evidence — persistent memory, evidence-gated completion checks, and clean handoffs for any AI agent (Claude Code, Codex, Cursor). State lives as plain files in your repo. CLI + MCP, 0 runtime dependencies.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|
package/scripts/e2e.js
CHANGED
|
@@ -6222,24 +6222,30 @@ total++;
|
|
|
6222
6222
|
if (!ok) failed++;
|
|
6223
6223
|
}
|
|
6224
6224
|
|
|
6225
|
-
// 1.9.409 회귀 (8번째 버그헌트, UR-0113): env encoding-check --apply
|
|
6225
|
+
// 1.9.409 회귀 (8번째 버그헌트, UR-0113): env encoding-check --apply 는 .sh/shebang 을 byte-exact 보존한다.
|
|
6226
|
+
// 1.36.177 데이터 무결성 계약: .ps1 BOM 교체는 Windows 에서만 메타데이터 보존 writer 로 수행하고,
|
|
6227
|
+
// POSIX 에서는 inode 교체가 ACL/xattr/ownership 을 잃을 수 있어 byte-exact no-op 한다.
|
|
6226
6228
|
total++;
|
|
6227
6229
|
{
|
|
6228
6230
|
let ok = false;
|
|
6229
6231
|
try {
|
|
6230
6232
|
const d = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-bomsh-'));
|
|
6231
6233
|
cp.spawnSync(process.execPath, [CLI, 'init', d, '--yes', '--language', 'ko'], { encoding: 'utf8', timeout: 30000 });
|
|
6232
|
-
|
|
6233
|
-
|
|
6234
|
-
|
|
6234
|
+
const shBefore = Buffer.from('#!/bin/bash\n# 한글 주석\necho hi\n', 'utf8');
|
|
6235
|
+
const psBefore = Buffer.from('# UTF-8 only 😀\nWrite-Host hi\n', 'utf8');
|
|
6236
|
+
fs.writeFileSync(path.join(d, 'script.sh'), shBefore);
|
|
6237
|
+
fs.writeFileSync(path.join(d, 'script.ps1'), psBefore);
|
|
6238
|
+
const applied = cp.spawnSync(process.execPath, [CLI, 'env', 'encoding-check', '--path', d, '--apply'], { encoding: 'utf8', timeout: 15000 });
|
|
6235
6239
|
const sh = fs.readFileSync(path.join(d, 'script.sh'));
|
|
6236
6240
|
const ps = fs.readFileSync(path.join(d, 'script.ps1'));
|
|
6237
|
-
const shOk = sh
|
|
6238
|
-
const psOk =
|
|
6241
|
+
const shOk = sh.equals(shBefore); // '#!' 및 전체 바이트 보존, BOM 없음
|
|
6242
|
+
const psOk = process.platform === 'win32'
|
|
6243
|
+
? ps.subarray(0, 3).equals(Buffer.from([0xEF, 0xBB, 0xBF])) && ps.subarray(3).equals(psBefore)
|
|
6244
|
+
: ps.equals(psBefore);
|
|
6239
6245
|
fs.rmSync(d, { recursive: true, force: true });
|
|
6240
|
-
ok = shOk && psOk;
|
|
6246
|
+
ok = applied.status === 0 && shOk && psOk;
|
|
6241
6247
|
} catch {}
|
|
6242
|
-
console.log(ok ? '✓ B(1.9.409)
|
|
6248
|
+
console.log(ok ? '✓ B(1.9.409/1.36.177) encoding-check --apply: .sh byte-exact + .ps1 platform-safe mutation contract (UR-0113/T-0022)' : '✗ encoding-check BOM platform contract 실패');
|
|
6243
6249
|
if (!ok) failed++;
|
|
6244
6250
|
}
|
|
6245
6251
|
|