leerness 1.9.263 → 1.9.264
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 +17 -0
- package/README.md +3 -3
- package/bin/harness.js +49 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.264 — 2026-06-01 — shellGuard JSON 12번째 통합 필드 (handoff/session close/health) + session close 본문 셸 요약
|
|
4
|
+
|
|
5
|
+
**🐚 UR-0020 셸 실패 메모리를 `--json` 표면 3 명령에 일관되게 통합 — 외부 AI/자동화가 셸 호환성 상태를 구조적으로 소비.**
|
|
6
|
+
|
|
7
|
+
### 배경
|
|
8
|
+
1.9.263에서 셸 실패 메모리를 handoff *본문 텍스트*에 노출했으나, `--json` 표면에는 없어 외부 AI/CI 가 구조적으로 못 읽음. leerness JSON 표면은 handoff/session close/health 3 명령이 동일 필드를 carry 하는 일관성 패턴(1.9.227/230/234 등)이 확립돼 있음 — `shellGuard` 를 12번째 필드로 추가해 그 패턴을 완성.
|
|
9
|
+
|
|
10
|
+
### 구현
|
|
11
|
+
1. **`shellGuard` JSON 12번째 통합 필드** — handoff/session close/health 3 명령 모두 동일 스키마:
|
|
12
|
+
- `failureCount` · `recent`(최근 3건: cmd 50자/exitCode/shell/rules) · `envDriftChanges` · `envDrift`(node/PS 버전 변동 배열 또는 null)
|
|
13
|
+
2. **session close 본문 셸 요약** (1.9.217 통합 보고에 추가): 실패 누적 시 "🐚 셸 실패 누적 N건 — 다음 handoff 가 자동 노출" + env drift 경고, 깨끗하면 "✓ 셸 실패 기록 없음". `_loadShellFailures`/`_shellEnvDrift` 재사용 (1.9.263 export).
|
|
14
|
+
|
|
15
|
+
### stress-v209 — **22/22 PASS · 100%**
|
|
16
|
+
- 1.9.264 (9): shellGuard 스키마·실패 반영·3 명령 일관성·envDrift 반영·session close 본문 노출/비노출
|
|
17
|
+
- 성능 (2): cold start avg 403ms · handoff --json 1540ms
|
|
18
|
+
- 누적 회귀 (11): 1.9.207~263 (handoff 본문 셸 가드·JSON 12 필드·MCP 72·shell-guard·selftest 15·require.main·path-setup·CJK·_isSecretKey·posixEncoding)
|
|
19
|
+
|
|
3
20
|
## 1.9.263 — 2026-06-01 — UR-0020 3단계: handoff 셸 실패 메모리 + 환경 버전 변동 자동 노출
|
|
4
21
|
|
|
5
22
|
**🐚 과거 터미널 셸 실패 기록 + 환경 버전 변동을 매 세션 handoff 본문에 자동 표면화 (사용자 명시 UR-0020 완성).**
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
> **AI 코딩 에이전트의 거짓 완료·중복·망각·충돌을 막아주는 검수·기억·협업 CLI 하네스.**
|
|
4
4
|
|
|
5
|
-
[](https://www.npmjs.com/package/leerness) [](https://www.npmjs.com/package/leerness) []() []() []() []() []() []() []() []() []() []() []() []()
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
╔══════════════════════════════════════════════════════════════╗
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
║ ██║ ██╔══╝ ██╔══╝ ██╔══██╗██║╚██╗██║██╔══╝ ╚════██║ ║
|
|
13
13
|
║ ███████╗███████╗███████╗██║ ██║██║ ╚████║███████╗███████║ ║
|
|
14
14
|
║ ╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝ ║
|
|
15
|
-
║ v1.9.
|
|
15
|
+
║ v1.9.264 AI Agent Reliability Harness + Sandbox ║
|
|
16
16
|
║ verify · remember · orchestrate · audit · sandbox · drift ║
|
|
17
|
-
║ 🐚
|
|
17
|
+
║ 🐚 shellGuard JSON 12필드 통합 (3 명령 일관성 · R220) ║
|
|
18
18
|
╚══════════════════════════════════════════════════════════════╝
|
|
19
19
|
```
|
|
20
20
|
|
package/bin/harness.js
CHANGED
|
@@ -7,7 +7,7 @@ const cp = require('child_process');
|
|
|
7
7
|
const os = require('os'); // 1.9.178: _publishToNpm 에서 os.tmpdir() 사용 (전역 import)
|
|
8
8
|
const readline = require('readline');
|
|
9
9
|
|
|
10
|
-
const VERSION = '1.9.
|
|
10
|
+
const VERSION = '1.9.264';
|
|
11
11
|
|
|
12
12
|
// 1.9.184: DEP0190 (child_process shell: true) deprecation warning 억제 (사용자 명시).
|
|
13
13
|
// leerness 는 cross-platform PATH resolution 을 위해 shell: true 를 의도적으로 사용 (claude.cmd / ollama.cmd 등 Windows .cmd 처리).
|
|
@@ -7515,6 +7515,17 @@ function handoff(root) {
|
|
|
7515
7515
|
ids: allSkills.slice(0, 10).map(s => s.id)
|
|
7516
7516
|
};
|
|
7517
7517
|
} catch {}
|
|
7518
|
+
// 1.9.264: shellGuard 통합 (handoff JSON 12번째 통합 필드) — UR-0020 셸 실패 메모리 + 환경 변동 외부 회수
|
|
7519
|
+
try {
|
|
7520
|
+
const sf = _loadShellFailures(root);
|
|
7521
|
+
const drift = _shellEnvDrift(root);
|
|
7522
|
+
result.shellGuard = {
|
|
7523
|
+
failureCount: sf.failures.length,
|
|
7524
|
+
recent: sf.failures.slice(-3).map(f => ({ cmd: (f.cmd || '').slice(0, 50), exitCode: f.exitCode, shell: f.shell, rules: f.issues || [] })),
|
|
7525
|
+
envDriftChanges: drift && drift.changes ? drift.changes.length : 0,
|
|
7526
|
+
envDrift: drift ? drift.changes : null
|
|
7527
|
+
};
|
|
7528
|
+
} catch {}
|
|
7518
7529
|
} catch {}
|
|
7519
7530
|
try {
|
|
7520
7531
|
const pwState = _loadPreWakeReport(root);
|
|
@@ -11878,6 +11889,17 @@ function sessionClose(root, opts = {}) {
|
|
|
11878
11889
|
ids: allSkills.slice(0, 10).map(s => s.id)
|
|
11879
11890
|
};
|
|
11880
11891
|
} catch {}
|
|
11892
|
+
// 1.9.264: shellGuard 통합 (session close JSON 12번째 통합 필드) — UR-0020 셸 실패 메모리 + 환경 변동
|
|
11893
|
+
try {
|
|
11894
|
+
const sf = _loadShellFailures(root);
|
|
11895
|
+
const drift = _shellEnvDrift(root);
|
|
11896
|
+
jsonResult.shellGuard = {
|
|
11897
|
+
failureCount: sf.failures.length,
|
|
11898
|
+
recent: sf.failures.slice(-3).map(f => ({ cmd: (f.cmd || '').slice(0, 50), exitCode: f.exitCode, shell: f.shell, rules: f.issues || [] })),
|
|
11899
|
+
envDriftChanges: drift && drift.changes ? drift.changes.length : 0,
|
|
11900
|
+
envDrift: drift ? drift.changes : null
|
|
11901
|
+
};
|
|
11902
|
+
} catch {}
|
|
11881
11903
|
} catch {}
|
|
11882
11904
|
try {
|
|
11883
11905
|
// 1.9.209: pre-wake-audit 자동 실행 + 저장 (sleep 전 자동 점검)
|
|
@@ -11982,6 +12004,21 @@ function sessionClose(root, opts = {}) {
|
|
|
11982
12004
|
log(grn(` ✓ 멱등성 검사 통과 — verified ${idemp.summary.verifiedAreas} 영역`));
|
|
11983
12005
|
}
|
|
11984
12006
|
} catch {}
|
|
12007
|
+
// 1.9.264: 셸 실패 메모리 + 환경 변동 요약 (UR-0020) — 마감 시 이번 세션 셸 실패를 회고에 노출
|
|
12008
|
+
try {
|
|
12009
|
+
const sf = _loadShellFailures(root);
|
|
12010
|
+
const drift = _shellEnvDrift(root);
|
|
12011
|
+
const driftN = drift && drift.changes ? drift.changes.length : 0;
|
|
12012
|
+
if (sf.failures.length > 0 || driftN > 0) {
|
|
12013
|
+
if (driftN > 0) log(yel(` ⚠ 환경 버전 변동 ${driftN}건 — 다음 세션 셸 실패 기록 재검토 권장`));
|
|
12014
|
+
if (sf.failures.length > 0) {
|
|
12015
|
+
log(yel(` 🐚 셸 실패 누적 ${sf.failures.length}건 — 다음 handoff 가 자동 노출`));
|
|
12016
|
+
log(dim(` → 명령 실행 전 점검: leerness shell-guard "<command>"`));
|
|
12017
|
+
}
|
|
12018
|
+
} else {
|
|
12019
|
+
log(grn(` ✓ 셸 실패 기록 없음 (터미널 호환성 양호)`));
|
|
12020
|
+
}
|
|
12021
|
+
} catch {}
|
|
11985
12022
|
// 1.9.237: session close --auto-cleanup-branches — 50+ release/* branches 시 자동 정리
|
|
11986
12023
|
// 1.9.224 패턴 (--auto-apply-delivered) 확장 — 마감 시 운영 누적 폐기물 자동 정리
|
|
11987
12024
|
// 안전: keep 10, merged 만, 현재 branch 보호
|
|
@@ -18688,6 +18725,17 @@ function healthCmd(root) {
|
|
|
18688
18725
|
ids: allSkills.slice(0, 10).map(s => s.id)
|
|
18689
18726
|
};
|
|
18690
18727
|
} catch { out.apiSkills = { error: 'apiSkills 점검 실패' }; }
|
|
18728
|
+
// 1.9.264: shellGuard 통합 (health JSON 12번째 통합 필드 — handoff/session close 와 JSON 3 명령 일관성) — UR-0020
|
|
18729
|
+
try {
|
|
18730
|
+
const sf = _loadShellFailures(root);
|
|
18731
|
+
const drift = _shellEnvDrift(root);
|
|
18732
|
+
out.shellGuard = {
|
|
18733
|
+
failureCount: sf.failures.length,
|
|
18734
|
+
recent: sf.failures.slice(-3).map(f => ({ cmd: (f.cmd || '').slice(0, 50), exitCode: f.exitCode, shell: f.shell, rules: f.issues || [] })),
|
|
18735
|
+
envDriftChanges: drift && drift.changes ? drift.changes.length : 0,
|
|
18736
|
+
envDrift: drift ? drift.changes : null
|
|
18737
|
+
};
|
|
18738
|
+
} catch { out.shellGuard = { error: 'shellGuard 점검 실패' }; }
|
|
18691
18739
|
// 1.9.163: 5능력 매트릭스 자동 평가 (1.9.155 sub-agent 점검 → 코드 기반 자동화)
|
|
18692
18740
|
// 각 능력을 코드 grep 으로 검출 → 0~100 점수. 사용자가 매 health 호출 시 leerness 자기 평가 확인.
|
|
18693
18741
|
try {
|