leerness 1.9.221 β 1.9.222
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 +35 -0
- package/README.md +3 -3
- package/bin/harness.js +77 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,40 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.222 β 2026-05-22
|
|
4
|
+
|
|
5
|
+
**π‘ session-resume --auto-fix μμ ν볡 + handoff λ³Έλ¬Έ λΉμ μ μ’
λ£ μλ λ
ΈμΆ.**
|
|
6
|
+
|
|
7
|
+
### 1. `leerness session-resume --auto-fix` β μμ ν μλ ν볡
|
|
8
|
+
- 1.9.220 detect / 1.9.221 MCP / 1.9.222 **auto-fix**
|
|
9
|
+
- `wakeup-missed` μ νΈ κ°μ§ μ β 30λΆ+ μ§λ pending wakeup μλ `superseded`
|
|
10
|
+
- `state.supersededReason: 'auto-fix-1.9.222-abnormal-shutdown'`
|
|
11
|
+
- μ¬μ©μ/AIκ° μλ μ 리ν νμ μμ΄ λ€μ wakeupμ΄ μ μ λμ
|
|
12
|
+
- `--auto-fix` μ΅μ
μ΄ μμΌλ©΄ κΈ°μ‘΄ λμ κ·Έλλ‘ (κ°μ§λ§, λ³κ²½ X)
|
|
13
|
+
|
|
14
|
+
### 2. handoff λ³Έλ¬Έ μλ λ
ΈμΆ β λΉμ μ μ’
λ£ μΉμ
|
|
15
|
+
- 1.9.220 ν€λλΌμΈ (`π λΉμ μμ’
λ£ <severity>`) + 1.9.222 **λ³Έλ¬Έ**
|
|
16
|
+
- `severity: high` β `## π¨ λΉμ μ μ’
λ£ κ°μ§ (1.9.220, severity: high)` λ³Έλ¬Έ μΉμ
μλ
|
|
17
|
+
- `severity: medium` β `## β λΉμ μ μ’
λ£ κ°μ§` λ³Έλ¬Έ μΉμ
μλ
|
|
18
|
+
- λ³Έλ¬Έ μΆλ ₯ μμΉ: pre-wake-audit μΉμ
λ€μ, νμ± λ£° μ΄μ
|
|
19
|
+
- top 3 μ νΈ + μ¬κ° κ°μ΄λ + auto-fix κ°μ΄λ ν λ²μ λ
ΈμΆ
|
|
20
|
+
|
|
21
|
+
### 3. CLAUDE.md / AGENTS.md 1.9.214~221 μ΄μ κ°ν 8 λΌμ΄λ ν΅ν©
|
|
22
|
+
- drift μ°¨λ¨μ μν `## μ΄μ κ°ν 8 λΌμ΄λ (1.9.214~221)` μΉμ
λμ
|
|
23
|
+
- 9 λΌμ΄λ (drift μ°¨λ¨ / handoff ν€λλΌμΈ / MCP 5μ’
/ session close / handoff JSON 4 ν΅ν© / 80 λΌμ΄λ / λΉμ μ μ’
λ£ / MCP 60 / auto-fix) λͺ¨λ λ¨μΌ μμΌ λ
ΈμΆ
|
|
24
|
+
|
|
25
|
+
### 4. λμ νκ· (1.9.207~221) β λͺ¨λ μ μ§
|
|
26
|
+
|
|
27
|
+
### 5. stress-v167 β 14/14 PASS
|
|
28
|
+
- 1.9.222 (6): VERSION + auto-fix (격리) + auto-fix λ―Έμ§μ μ λμ + handoff λ³Έλ¬Έ λ
ΈμΆ + handoff μ μ μ λ―Έλ
ΈμΆ + CLAUDE 8 λΌμ΄λ μΉμ
|
|
29
|
+
- μ±λ₯ (2): cold_start avg 408ms / MCP 60 λꡬ 413ms
|
|
30
|
+
- λμ νκ· (6): 1.9.207~221
|
|
31
|
+
|
|
32
|
+
### 6. μλ release (84 λΌμ΄λ main-push streak Β· 45 λΌμ΄λ npm publish streak)
|
|
33
|
+
|
|
34
|
+
π‘ **λΉμ μ μ’
λ£ μμ€ν
μμ±**: 1.9.220 detect β 1.9.221 MCP β 1.9.222 **auto-fix** + **λ³Έλ¬Έ μλ λ
ΈμΆ** (3 λΌμ΄λ λμ )
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
3
38
|
## 1.9.221 β 2026-05-22
|
|
4
39
|
|
|
5
40
|
**π MCP 60 λꡬ λ§μΌμ€ν€ + abnormalShutdown JSON ν΅ν© (handoff/session close).**
|
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) []() []() []() []() []() []() [-brightgreen)]() []() []() []() []() []()
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
β βββ ββββββ ββββββ ββββββββββββββββββββββββ ββββββββ β
|
|
13
13
|
β βββββββββββββββββββββββββββ ββββββ ββββββββββββββββββββββ β
|
|
14
14
|
β βββββββββββββββββββββββββββ ββββββ βββββββββββββββββββββ β
|
|
15
|
-
β v1.9.
|
|
15
|
+
β v1.9.222 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π‘ session-resume --auto-fix Β· handoff λ³Έλ¬Έ λΉμ μ μ’
λ£ μλ β
|
|
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.222';
|
|
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 μ²λ¦¬).
|
|
@@ -3055,6 +3055,7 @@ function requestsCmd(root, sub, ...rest) {
|
|
|
3055
3055
|
}
|
|
3056
3056
|
|
|
3057
3057
|
// 1.9.220: leerness session-resume β λΉμ μ μ’
λ£ κ°μ§ + μμ¨ μ¬κ° κ°μ΄λ (μ¬μ©μ λͺ
μ)
|
|
3058
|
+
// 1.9.222: --auto-fix μ΅μ
μΆκ° β μμ ν μλ ν볡 (wakeup supersede)
|
|
3058
3059
|
function sessionResumeCmd(root) {
|
|
3059
3060
|
root = absRoot(root);
|
|
3060
3061
|
const isTty = process.stdout && process.stdout.isTTY;
|
|
@@ -3065,6 +3066,45 @@ function sessionResumeCmd(root) {
|
|
|
3065
3066
|
const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
3066
3067
|
|
|
3067
3068
|
const result = _detectAbnormalShutdown(root);
|
|
3069
|
+
|
|
3070
|
+
// 1.9.222: --auto-fix β μμ ν μ νΈλ³ μλ ν볡
|
|
3071
|
+
const autoFix = has('--auto-fix');
|
|
3072
|
+
if (autoFix && result.abnormalShutdown) {
|
|
3073
|
+
result.autoFixed = [];
|
|
3074
|
+
// 1) wakeup-missed β μ€λλ pending wakeup supersede (μμ : λ¨μ μν λ³κ²½)
|
|
3075
|
+
if (result.signals.some(s => s.kind === 'wakeup-missed')) {
|
|
3076
|
+
try {
|
|
3077
|
+
const state = _loadActiveWakeups(root);
|
|
3078
|
+
let fixed = 0;
|
|
3079
|
+
state.wakeups = state.wakeups.map(w => {
|
|
3080
|
+
if (w.status === 'pending') {
|
|
3081
|
+
const expectedMs = new Date(w.expectedFireAt).getTime();
|
|
3082
|
+
const deltaMin = Math.floor((Date.now() - expectedMs) / 60000);
|
|
3083
|
+
if (deltaMin > 30) {
|
|
3084
|
+
w.status = 'superseded';
|
|
3085
|
+
w.supersededReason = 'auto-fix-1.9.222-abnormal-shutdown';
|
|
3086
|
+
w.supersededAt = new Date().toISOString();
|
|
3087
|
+
fixed++;
|
|
3088
|
+
}
|
|
3089
|
+
}
|
|
3090
|
+
return w;
|
|
3091
|
+
});
|
|
3092
|
+
if (fixed > 0) {
|
|
3093
|
+
_writeActiveWakeups(root, state.wakeups);
|
|
3094
|
+
result.autoFixed.push({ kind: 'wakeup-missed', action: 'superseded', count: fixed });
|
|
3095
|
+
}
|
|
3096
|
+
} catch {}
|
|
3097
|
+
}
|
|
3098
|
+
// 2) auto-resume-plan-unused β 60min+ λ―Έμ¬μ©μ μλ΄λ§ (μλ μμ X, μ¬μ©μκ° κ²ν ν΄μΌ ν¨)
|
|
3099
|
+
if (result.signals.some(s => s.kind === 'auto-resume-plan-unused')) {
|
|
3100
|
+
result.autoFixed.push({ kind: 'auto-resume-plan-unused', action: 'guidance-only', detail: 'leerness resume μΌλ‘ μ μ© κ²ν ' });
|
|
3101
|
+
}
|
|
3102
|
+
// 3) in-progress-stale β drop κ²°μ μ μ¬μ©μ μμ (μλ X)
|
|
3103
|
+
if (result.signals.some(s => s.kind === 'in-progress-stale')) {
|
|
3104
|
+
result.autoFixed.push({ kind: 'in-progress-stale', action: 'guidance-only', detail: 'leerness task list --status in-progress ν μ¬μ©μ κ²°μ νμ' });
|
|
3105
|
+
}
|
|
3106
|
+
}
|
|
3107
|
+
|
|
3068
3108
|
if (has('--json')) { log(JSON.stringify(result, null, 2)); return; }
|
|
3069
3109
|
log(cyan(`# leerness session-resume (1.9.220) β λΉμ μ μ’
λ£ κ°μ§ + μμ¨ μ¬κ°`));
|
|
3070
3110
|
log(` detected at: ${result.detectedAt}`);
|
|
@@ -3093,6 +3133,18 @@ function sessionResumeCmd(root) {
|
|
|
3093
3133
|
for (const g of result.resumeGuide) {
|
|
3094
3134
|
log(` ${g}`);
|
|
3095
3135
|
}
|
|
3136
|
+
// 1.9.222: --auto-fix κ²°κ³Ό λ
ΈμΆ
|
|
3137
|
+
if (result.autoFixed && result.autoFixed.length > 0) {
|
|
3138
|
+
log('');
|
|
3139
|
+
log(grn(`## π§ auto-fix κ²°κ³Ό (${result.autoFixed.length})`));
|
|
3140
|
+
for (const af of result.autoFixed) {
|
|
3141
|
+
const icon = af.action === 'superseded' ? 'β' : 'βΉ';
|
|
3142
|
+
log(` ${icon} [${af.kind}] ${af.action}${af.count ? ` (count: ${af.count})` : ''}`);
|
|
3143
|
+
if (af.detail) log(dim(` ${af.detail}`));
|
|
3144
|
+
}
|
|
3145
|
+
} else if (autoFix) {
|
|
3146
|
+
log(dim(` (auto-fix μ μ© λμ μμ)`));
|
|
3147
|
+
}
|
|
3096
3148
|
}
|
|
3097
3149
|
|
|
3098
3150
|
// 1.9.208: leerness constraints <list|check|add> β νλ«νΌ/API μ μ½ μ¬μ μ²΄ν¬ CLI (μ¬μ©μ λͺ
μ)
|
|
@@ -5956,6 +6008,30 @@ function handoff(root) {
|
|
|
5956
6008
|
}
|
|
5957
6009
|
}
|
|
5958
6010
|
} catch {}
|
|
6011
|
+
|
|
6012
|
+
// 1.9.222: λΉμ μ μ’
λ£ κ°μ§ λ³Έλ¬Έ μλ λ
ΈμΆ (handoff μ§ν β κ°μ₯ λ¨Όμ λ΄μΌ ν¨)
|
|
6013
|
+
// high/medium severity μ μ¦μ λ
ΈμΆ, low/none μ 무μ
|
|
6014
|
+
try {
|
|
6015
|
+
const ad = _detectAbnormalShutdown(root);
|
|
6016
|
+
if (ad.abnormalShutdown && (ad.severity === 'high' || ad.severity === 'medium')) {
|
|
6017
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
6018
|
+
const cy3 = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
6019
|
+
const rd3 = s => isTty ? `\x1b[31m${s}\x1b[0m` : s;
|
|
6020
|
+
const yl3 = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
6021
|
+
const dm3 = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
6022
|
+
log('');
|
|
6023
|
+
const sevIcon = ad.severity === 'high' ? 'π¨' : 'β ';
|
|
6024
|
+
const sevColor = ad.severity === 'high' ? rd3 : yl3;
|
|
6025
|
+
log(sevColor(`## ${sevIcon} λΉμ μ μ’
λ£ κ°μ§ (1.9.220, severity: ${ad.severity})`));
|
|
6026
|
+
ad.signals.slice(0, 3).forEach(s => {
|
|
6027
|
+
const ic = s.severity === 'high' ? 'π¨' : (s.severity === 'medium' ? 'β ' : 'βΉ');
|
|
6028
|
+
log(` ${ic} [${s.kind}] ${s.detail}`);
|
|
6029
|
+
});
|
|
6030
|
+
log(dm3(` β μ¬κ° κ°μ΄λ: leerness session-resume`));
|
|
6031
|
+
log(dm3(` β μλ ν볡: leerness session-resume --auto-fix (1.9.222)`));
|
|
6032
|
+
}
|
|
6033
|
+
} catch {}
|
|
6034
|
+
|
|
5959
6035
|
// 1.9.8: active rules μλ λ
ΈμΆ (λ§€ μΈμ
μμ μ AIμκ² λ³΄μ)
|
|
5960
6036
|
const activeRules = readRules(root).filter(r => r.status === 'active');
|
|
5961
6037
|
if (activeRules.length) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.222",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|