leerness 1.9.222 β 1.9.224
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 +78 -0
- package/README.md +3 -3
- package/bin/harness.js +169 -10
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,83 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.224 β 2026-05-22
|
|
4
|
+
|
|
5
|
+
**π MCP 61 λꡬ (leerness_requests_auto_complete) + handoff λ³Έλ¬Έ + session close --auto-apply-delivered.**
|
|
6
|
+
|
|
7
|
+
### 1. MCP 61λ²μ§Έ λꡬ β `leerness_requests_auto_complete`
|
|
8
|
+
- 1.9.223 delivered ν¨ν΄ μλ κ°μ§λ₯Ό μΈλΆ AIμ λ
ΈμΆ
|
|
9
|
+
- μΈμ: `{ path?, apply? (default false) }`
|
|
10
|
+
- μλ΅: `{ total, candidates: [{id, text, claimedVersion, currentVersion, deliveredKeyword, recordedAt}], currentVersion, applied, completedIds[] }`
|
|
11
|
+
- MCP 60 (1.9.221) β 61 λꡬ (+1)
|
|
12
|
+
|
|
13
|
+
### 2. handoff λ³Έλ¬Έ μλ λ
ΈμΆ
|
|
14
|
+
- delivered ν보 β₯ 1건 μ: `## π₯ μ¬μ©μ μμ² μλ μλ£ κ°λ₯ (1.9.224, N건)` λ³Έλ¬Έ μΉμ
|
|
15
|
+
- top 5 ν보 λ
ΈμΆ (overflowλ `... +N건 λ`)
|
|
16
|
+
- μλ κΆμ₯: `β leerness requests auto-complete --apply`
|
|
17
|
+
- 1.9.222 λΉμ μ μ’
λ£ λ³Έλ¬Έ λ€μ, νμ± λ£° μ΄μ μμΉ
|
|
18
|
+
|
|
19
|
+
### 3. `session close --auto-apply-delivered` νλκ·Έ
|
|
20
|
+
- λ§κ° μ delivered ν보 μλ μλ£ (μμ : ν¨ν΄ λ§€μΉ + λ²μ κ°λ)
|
|
21
|
+
- `autoCompleteReason: 'session-close-auto-apply-1.9.224'` μΆμ
|
|
22
|
+
- νλκ·Έ μμΌλ©΄ κΈ°μ‘΄ λμ (μλ΄λ§)
|
|
23
|
+
|
|
24
|
+
### 4. λμ νκ· (1.9.207~223) β λͺ¨λ μ μ§
|
|
25
|
+
|
|
26
|
+
### 5. stress-v169 β 16/16 PASS
|
|
27
|
+
- 1.9.224 (7): VERSION + MCP 61 + μ€ νΈμΆ + handoff λ³Έλ¬Έ + λ³Έλ¬Έ λ―Έλ
ΈμΆ + session close auto-apply + κΈ°λ³Έ 보쑴
|
|
28
|
+
- μ±λ₯ (2): cold_start avg 556ms / MCP 61 tools/list 417ms
|
|
29
|
+
- λμ νκ· (7): 1.9.207~223
|
|
30
|
+
|
|
31
|
+
### 6. μλ release (86 λΌμ΄λ main-push streak Β· 47 λΌμ΄λ npm publish streak)
|
|
32
|
+
|
|
33
|
+
π **μ¬μ©μ μμ² μλ μλ£ μμ€ν
μμ±** (3 λΌμ΄λ λμ ):
|
|
34
|
+
- 1.9.223 CLI auto-complete
|
|
35
|
+
- 1.9.224 MCP 61 + handoff λ³Έλ¬Έ + session close μλ μ μ©
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 1.9.223 β 2026-05-22
|
|
40
|
+
|
|
41
|
+
**π₯ μ¬μ©μ μμ² auto-complete (delivered ν¨ν΄ μλ κ°μ§) + handoff/session close ν΅ν©.**
|
|
42
|
+
|
|
43
|
+
### 1. `leerness requests auto-complete` β delivered ν¨ν΄ μλ μ 리
|
|
44
|
+
- 1.9.207 μμ€ν
μ΄μ μ€ λμ λ "Round X.Y.Z β ꡬν μλ£" ν¨ν΄μ μκΈ°-κΈ°λ‘ μμ²μ μλ κ°μ§
|
|
45
|
+
- μ κ·μ: `(Round\s+)?\d+\.\d+\.\d+` + `(ꡬν μλ£|implemented|delivered|shipped|λ°°ν¬ μλ£)`
|
|
46
|
+
- νμ¬ package.json λ²μ μ΄νλ§ ν보 (λ―Έλ λ²μ 무μ) β μμ κ°λ
|
|
47
|
+
- κΈ°λ³Έ dry-run (λͺ©λ‘λ§), `--apply` λͺ
μ μμλ§ μ€μ μν λ³κ²½
|
|
48
|
+
- μν λ³κ²½ μ `autoCompletedAt` + `autoCompleteReason: 'delivered-pattern-1.9.223'` μΆμ κΈ°λ‘
|
|
49
|
+
|
|
50
|
+
### 2. handoff ν€λλΌμΈ μλ λ
ΈμΆ
|
|
51
|
+
- delivered ν보 β₯ 1건 μ: `π₯ μλμλ£κ°λ₯ N건 (1.9.223)` β λ―Έλ΅ μμ² μ νΈ λμ μ°μ λ
ΈμΆ
|
|
52
|
+
- μ΄μ μ€ λμ λ κ°μ§ λ―Έλ΅ μ νΈ (μ€μ λ λͺ¨λ μ²λ¦¬λ¨) μλ μ 리 κΆμ₯
|
|
53
|
+
|
|
54
|
+
### 3. handoff/session close JSON 5λ²μ§Έ ν΅ν© νλ β `deliveredRequests`
|
|
55
|
+
- `{ candidates, currentVersion, autoCompleteAvailable, ids[] }`
|
|
56
|
+
- 1.9.218 4 νλ (userRequests/preWake/idempotency/abnormalShutdown) β **5 νλ μμ±**
|
|
57
|
+
- μΈλΆ λͺ¨λν°λ§/CI μλ κ°μ§
|
|
58
|
+
|
|
59
|
+
### 4. session close μλ ν΅ν© λ³Έλ¬Έ λ
ΈμΆ
|
|
60
|
+
- 1.9.207/209/212/220 ν΅ν© ν¨ν΄μ 1.9.223 μΆκ°
|
|
61
|
+
- delivered ν보 μ: `π₯ delivered ν¨ν΄ N건 (1.9.223) β μλ μλ£ κ°λ₯`
|
|
62
|
+
- `β leerness requests auto-complete --apply` κ°μ΄λ μλ
|
|
63
|
+
|
|
64
|
+
### 5. μ€ μ΄μ κ²μ¦ β λμ 8건 μ 리 μλ£
|
|
65
|
+
- UR-0004~UR-0011 (1.9.208~213 λΌμ΄λ μκΈ°-κΈ°λ‘) β λͺ¨λ μλ μ 리 μλ£
|
|
66
|
+
- 1.9.223 μμ€ν
μ ν₯ν μ¬λ° μ 1μ€ λͺ
λ ΉμΌλ‘ μ¦μ μ 리
|
|
67
|
+
|
|
68
|
+
### 6. λμ νκ· (1.9.207~222) β λͺ¨λ μ μ§
|
|
69
|
+
|
|
70
|
+
### 7. stress-v168 β 15/15 PASS
|
|
71
|
+
- 1.9.223 (6): VERSION + μλ κ°μ§ + --apply + dry-run + handoff JSON + session close JSON
|
|
72
|
+
- μ±λ₯ (2): cold_start avg 401ms / auto-complete 432ms
|
|
73
|
+
- λμ νκ· (7): 1.9.207~222
|
|
74
|
+
|
|
75
|
+
### 8. μλ release (85 λΌμ΄λ main-push streak Β· 46 λΌμ΄λ npm publish streak)
|
|
76
|
+
|
|
77
|
+
π₯ **μ¬μ©μ μμ² λΌμ΄νμ¬μ΄ν΄ μμ±**: 1.9.207 (μλ audit) β 1.9.217 (λ§κ° μλ) β **1.9.223 (μλ μλ£)** β 3 λΌμ΄λ λμ
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
3
81
|
## 1.9.222 β 2026-05-22
|
|
4
82
|
|
|
5
83
|
**π‘ session-resume --auto-fix μμ ν볡 + handoff λ³Έλ¬Έ λΉμ μ μ’
λ£ μλ λ
ΈμΆ.**
|
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.224 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π MCP 61 Β· handoff λ³Έλ¬Έ + session close --auto-apply β
|
|
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.224';
|
|
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 μ²λ¦¬).
|
|
@@ -2006,6 +2006,54 @@ function _auditUserRequests(root) {
|
|
|
2006
2006
|
};
|
|
2007
2007
|
}
|
|
2008
2008
|
|
|
2009
|
+
// 1.9.223: delivered-by-pattern κ°μ§ β μ¬μ©μ μμ² λ³Έλ¬Έμ "Round X.Y.Z β ꡬν μλ£" κ°μ μκΈ°-κΈ°λ‘ ν¨ν΄μ΄ μκ³
|
|
2010
|
+
// ν΄λΉ λ²μ μ΄ μ΄λ―Έ μΆμλ κ²½μ°, μλ μλ£ νλ³΄λ‘ λΆλ₯. μ΄μ μ€ λμ λ β― μ νΈ μ 리μ©.
|
|
2011
|
+
// μμ μμΉ: κΈ°λ³Έ dry-run (λͺ©λ‘λ§), --apply μμλ§ μ€μ μν λ³κ²½.
|
|
2012
|
+
function _detectDeliveredRequests(root) {
|
|
2013
|
+
const state = _loadUserRequests(root);
|
|
2014
|
+
const open = state.requests.filter(r => r.status === 'open' || r.status === 'in-progress');
|
|
2015
|
+
// ν¨ν΄: "Round 1.9.123" λλ "1.9.123" + ("ꡬν μλ£" | "implemented" | "delivered" | "shipped" | "ROUND β¦ μλ£")
|
|
2016
|
+
const versionRe = /(?:Round\s+)?(\d+\.\d+\.\d+)/i;
|
|
2017
|
+
const doneRe = /(ꡬν\s*μλ£|ꡬνμλ£|implemented|delivered|shipped|ship\s*μλ£|λ°°ν¬\s*μλ£)/i;
|
|
2018
|
+
let currentMajor = '0.0.0';
|
|
2019
|
+
try {
|
|
2020
|
+
const pkg = JSON.parse(read(path.join(root, 'package.json')));
|
|
2021
|
+
if (pkg && pkg.version) currentMajor = pkg.version;
|
|
2022
|
+
} catch {}
|
|
2023
|
+
const candidates = [];
|
|
2024
|
+
open.forEach(req => {
|
|
2025
|
+
const text = req.text || '';
|
|
2026
|
+
const vMatch = text.match(versionRe);
|
|
2027
|
+
const dMatch = text.match(doneRe);
|
|
2028
|
+
if (vMatch && dMatch) {
|
|
2029
|
+
const claimedVer = vMatch[1];
|
|
2030
|
+
// νμ¬ λ²μ μ΄νμΈμ§ (μκΈ°-κΈ°λ‘ μμ μ λ²μ μ΄ μ΄λ―Έ μΆμλ¨)
|
|
2031
|
+
const cmp = _compareSemver(claimedVer, currentMajor);
|
|
2032
|
+
if (cmp <= 0) {
|
|
2033
|
+
candidates.push({
|
|
2034
|
+
id: req.id,
|
|
2035
|
+
text: text.slice(0, 120),
|
|
2036
|
+
claimedVersion: claimedVer,
|
|
2037
|
+
currentVersion: currentMajor,
|
|
2038
|
+
deliveredKeyword: dMatch[0],
|
|
2039
|
+
recordedAt: req.recordedAt
|
|
2040
|
+
});
|
|
2041
|
+
}
|
|
2042
|
+
}
|
|
2043
|
+
});
|
|
2044
|
+
return { total: open.length, candidates, currentVersion: currentMajor };
|
|
2045
|
+
}
|
|
2046
|
+
|
|
2047
|
+
function _compareSemver(a, b) {
|
|
2048
|
+
const pa = String(a).split('.').map(n => parseInt(n, 10) || 0);
|
|
2049
|
+
const pb = String(b).split('.').map(n => parseInt(n, 10) || 0);
|
|
2050
|
+
for (let i = 0; i < 3; i++) {
|
|
2051
|
+
if ((pa[i] || 0) < (pb[i] || 0)) return -1;
|
|
2052
|
+
if ((pa[i] || 0) > (pb[i] || 0)) return 1;
|
|
2053
|
+
}
|
|
2054
|
+
return 0;
|
|
2055
|
+
}
|
|
2056
|
+
|
|
2009
2057
|
// 1.9.208: νλ«νΌ/API μ μ½ μ¬μ μ²΄ν¬ (μ¬μ©μ λͺ
μ)
|
|
2010
2058
|
// "μ¬μ©μμ λͺ
λ Ήμ λ°μΌλ©΄, κ³ λ €ν΄μΌνλ λΆλΆμ λ¨Όμ νμΈνκ³ μ§ννκ² νλ©΄ μ΄λ¨μ§"
|
|
2011
2059
|
// "νΉμ νλ«νΌμ API ... νΈμΆμλκ° μ΄λΉ 5ν μ΄νλ‘λ§ ν΄μΌνλ€λ κ·μ μ λ¨Όμ νμΈ"
|
|
@@ -2956,11 +3004,55 @@ function requestsCmd(root, sub, ...rest) {
|
|
|
2956
3004
|
if (!sub || sub === 'help' || sub === '--help') {
|
|
2957
3005
|
log(`# leerness requests (1.9.207) β μ¬μ©μ μμ² λλ½ νμΈ μ μ°¨`);
|
|
2958
3006
|
log('');
|
|
2959
|
-
log(` audit
|
|
2960
|
-
log(` add "<text>"
|
|
2961
|
-
log(` list
|
|
2962
|
-
log(` complete <id>
|
|
2963
|
-
log(` drop <id>
|
|
3007
|
+
log(` audit β λλ½ ν보 + tracked + stale λ³΄κ³ (--json κ°λ₯)`);
|
|
3008
|
+
log(` add "<text>" β μ¬μ©μ μμ² μλ κΈ°λ‘`);
|
|
3009
|
+
log(` list β μ 체 μμ² μΆλ ₯ (--json κ°λ₯, --status open|completed|dropped)`);
|
|
3010
|
+
log(` complete <id> β μμ² μλ£ νμ (μ: UR-0003)`);
|
|
3011
|
+
log(` drop <id> β μμ² λλ‘ νμ`);
|
|
3012
|
+
log(` auto-complete β "Round X.Y.Z β ꡬν μλ£" ν¨ν΄ μλ κ°μ§ (default: dry-run, --apply μ μ μ©) [1.9.223]`);
|
|
3013
|
+
return;
|
|
3014
|
+
}
|
|
3015
|
+
|
|
3016
|
+
// 1.9.223: auto-complete β μκΈ°-κΈ°λ‘λ "ꡬν μλ£" ν¨ν΄ μλ μ 리 (default dry-run)
|
|
3017
|
+
if (sub === 'auto-complete') {
|
|
3018
|
+
const apply = has('--apply');
|
|
3019
|
+
const detected = _detectDeliveredRequests(root);
|
|
3020
|
+
if (has('--json')) {
|
|
3021
|
+
const result = { ...detected, applied: false, completedIds: [] };
|
|
3022
|
+
if (apply) {
|
|
3023
|
+
for (const c of detected.candidates) {
|
|
3024
|
+
const u = _updateUserRequest(root, c.id, { status: 'completed', autoCompletedAt: new Date().toISOString(), autoCompleteReason: 'delivered-pattern-1.9.223' });
|
|
3025
|
+
if (u) result.completedIds.push(c.id);
|
|
3026
|
+
}
|
|
3027
|
+
result.applied = true;
|
|
3028
|
+
}
|
|
3029
|
+
log(JSON.stringify(result, null, 2));
|
|
3030
|
+
return;
|
|
3031
|
+
}
|
|
3032
|
+
log(cyan(`# leerness requests auto-complete (1.9.223) β delivered pattern μλ κ°μ§`));
|
|
3033
|
+
log('');
|
|
3034
|
+
log(` νμ¬ λ²μ : ${detected.currentVersion} Β· open ${detected.total} Β· ν보 ${detected.candidates.length}건`);
|
|
3035
|
+
log('');
|
|
3036
|
+
if (detected.candidates.length === 0) {
|
|
3037
|
+
log(grn(` β delivered ν¨ν΄ ν보 μμ β open μμ²μ λͺ¨λ μλ‘μ΄ μμ
`));
|
|
3038
|
+
return;
|
|
3039
|
+
}
|
|
3040
|
+
log(yel(` π₯ delivered ν¨ν΄ ν보 ${detected.candidates.length}건:`));
|
|
3041
|
+
detected.candidates.forEach(c => {
|
|
3042
|
+
log(` β’ [${c.id}] v${c.claimedVersion} (${c.deliveredKeyword}) β ${c.text.slice(0, 80)}β¦`);
|
|
3043
|
+
});
|
|
3044
|
+
log('');
|
|
3045
|
+
if (apply) {
|
|
3046
|
+
let ok = 0;
|
|
3047
|
+
for (const c of detected.candidates) {
|
|
3048
|
+
const u = _updateUserRequest(root, c.id, { status: 'completed', autoCompletedAt: new Date().toISOString(), autoCompleteReason: 'delivered-pattern-1.9.223' });
|
|
3049
|
+
if (u) ok++;
|
|
3050
|
+
}
|
|
3051
|
+
log(grn(` β μλ μλ£ ${ok}/${detected.candidates.length}건`));
|
|
3052
|
+
} else {
|
|
3053
|
+
log(dim(` β μ μ©νλ €λ©΄: leerness requests auto-complete --apply`));
|
|
3054
|
+
log(dim(` β μμ μμΉ: κΈ°λ³Έ dry-run (λ³κ²½ X), --apply λͺ
μ μμλ§ μ μ©`));
|
|
3055
|
+
}
|
|
2964
3056
|
return;
|
|
2965
3057
|
}
|
|
2966
3058
|
|
|
@@ -5723,6 +5815,16 @@ function handoff(root) {
|
|
|
5723
5815
|
tracked: reqAudit.tracked ? reqAudit.tracked.length : 0,
|
|
5724
5816
|
stale: reqAudit.stale ? reqAudit.stale.length : 0
|
|
5725
5817
|
};
|
|
5818
|
+
// 1.9.223: delivered ν¨ν΄ μλ κ°μ§ ν΅ν© (handoff JSON 5λ²μ§Έ ν΅ν© νλ)
|
|
5819
|
+
try {
|
|
5820
|
+
const delivered = _detectDeliveredRequests(root);
|
|
5821
|
+
result.deliveredRequests = {
|
|
5822
|
+
candidates: delivered.candidates.length,
|
|
5823
|
+
currentVersion: delivered.currentVersion,
|
|
5824
|
+
autoCompleteAvailable: delivered.candidates.length > 0,
|
|
5825
|
+
ids: delivered.candidates.map(c => c.id)
|
|
5826
|
+
};
|
|
5827
|
+
} catch {}
|
|
5726
5828
|
} catch {}
|
|
5727
5829
|
try {
|
|
5728
5830
|
const pwState = _loadPreWakeReport(root);
|
|
@@ -5912,9 +6014,14 @@ function handoff(root) {
|
|
|
5912
6014
|
}
|
|
5913
6015
|
} catch {}
|
|
5914
6016
|
// 13) 1.9.207: μ¬μ©μ μμ² λλ½ νμΈ μ μ°¨ (μ¬μ©μ λͺ
μ) β λλ½ ν보 β₯ 1 μ ν€λλΌμΈ λ
ΈμΆ
|
|
6017
|
+
// 1.9.223: delivered ν¨ν΄ ν보 μ `π₯ μλμλ£κ°λ₯ N건` μ°μ λ
ΈμΆ (μλ μ 리 λΆλ΄ κ°μ)
|
|
5915
6018
|
try {
|
|
5916
6019
|
const audit = _auditUserRequests(root);
|
|
5917
|
-
|
|
6020
|
+
let detected = { candidates: [] };
|
|
6021
|
+
try { detected = _detectDeliveredRequests(root); } catch {}
|
|
6022
|
+
if (detected.candidates && detected.candidates.length > 0) {
|
|
6023
|
+
parts.push(`π₯ μλμλ£κ°λ₯ ${detected.candidates.length}건 (1.9.223)`);
|
|
6024
|
+
} else if (audit.missing && audit.missing.length > 0) {
|
|
5918
6025
|
parts.push(`π₯ λ―Έλ΅ μμ² ${audit.missing.length}건`);
|
|
5919
6026
|
} else if (audit.open > 0) {
|
|
5920
6027
|
parts.push(`π₯ μμ² ${audit.open} (tracked)`);
|
|
@@ -6032,6 +6139,28 @@ function handoff(root) {
|
|
|
6032
6139
|
}
|
|
6033
6140
|
} catch {}
|
|
6034
6141
|
|
|
6142
|
+
// 1.9.224: handoff λ³Έλ¬Έ μλ λ
ΈμΆ β delivered ν¨ν΄ ν보 β₯ 1건 μ (1.9.223 νμ₯)
|
|
6143
|
+
// "Round X.Y.Z β ꡬν μλ£" ν¨ν΄μ΄ λμ λλ©΄ λ³Έλ¬Έ μΉμ
μΌλ‘ μλ μλ΄ (ν€λλΌμΈλ§μΌλ‘λ λμΉκΈ° μ¬μ)
|
|
6144
|
+
try {
|
|
6145
|
+
const delivered = _detectDeliveredRequests(root);
|
|
6146
|
+
if (delivered.candidates && delivered.candidates.length > 0) {
|
|
6147
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
6148
|
+
const cy4 = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
6149
|
+
const yl4 = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
6150
|
+
const dm4 = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
6151
|
+
log('');
|
|
6152
|
+
log(yl4(`## π₯ μ¬μ©μ μμ² μλ μλ£ κ°λ₯ (1.9.224, ${delivered.candidates.length}건)`));
|
|
6153
|
+
delivered.candidates.slice(0, 5).forEach(c => {
|
|
6154
|
+
log(` β’ [${c.id}] v${c.claimedVersion} (${c.deliveredKeyword}) β ${c.text.slice(0, 70)}${c.text.length > 70 ? 'β¦' : ''}`);
|
|
6155
|
+
});
|
|
6156
|
+
if (delivered.candidates.length > 5) {
|
|
6157
|
+
log(dm4(` ... +${delivered.candidates.length - 5}건 λ`));
|
|
6158
|
+
}
|
|
6159
|
+
log(dm4(` β κ²ν : leerness requests auto-complete`));
|
|
6160
|
+
log(dm4(` β μ μ©: leerness requests auto-complete --apply (μμ μ 리)`));
|
|
6161
|
+
}
|
|
6162
|
+
} catch {}
|
|
6163
|
+
|
|
6035
6164
|
// 1.9.8: active rules μλ λ
ΈμΆ (λ§€ μΈμ
μμ μ AIμκ² λ³΄μ)
|
|
6036
6165
|
const activeRules = readRules(root).filter(r => r.status === 'active');
|
|
6037
6166
|
if (activeRules.length) {
|
|
@@ -9783,6 +9912,15 @@ function sessionClose(root, opts = {}) {
|
|
|
9783
9912
|
tracked: reqAudit.tracked ? reqAudit.tracked.length : 0,
|
|
9784
9913
|
stale: reqAudit.stale ? reqAudit.stale.length : 0
|
|
9785
9914
|
};
|
|
9915
|
+
// 1.9.223: delivered ν¨ν΄ μλ κ°μ§ ν΅ν©
|
|
9916
|
+
try {
|
|
9917
|
+
const delivered = _detectDeliveredRequests(root);
|
|
9918
|
+
jsonResult.deliveredRequests = {
|
|
9919
|
+
candidates: delivered.candidates.length,
|
|
9920
|
+
currentVersion: delivered.currentVersion,
|
|
9921
|
+
autoCompleteAvailable: delivered.candidates.length > 0
|
|
9922
|
+
};
|
|
9923
|
+
} catch {}
|
|
9786
9924
|
} catch {}
|
|
9787
9925
|
try {
|
|
9788
9926
|
// 1.9.209: pre-wake-audit μλ μ€ν + μ μ₯ (sleep μ μλ μ κ²)
|
|
@@ -9834,11 +9972,26 @@ function sessionClose(root, opts = {}) {
|
|
|
9834
9972
|
|
|
9835
9973
|
log('');
|
|
9836
9974
|
log(`## π session close μλ ν΅ν© λ³΄κ³ (1.9.217)`);
|
|
9837
|
-
// 1.9.207
|
|
9975
|
+
// 1.9.207 + 1.9.223 (delivered ν¨ν΄ μλ κΆμ₯) + 1.9.224 (--auto-apply-delivered μ΅μ
)
|
|
9838
9976
|
try {
|
|
9839
9977
|
const reqAudit = _auditUserRequests(root);
|
|
9840
9978
|
const missCnt = reqAudit.missing ? reqAudit.missing.length : 0;
|
|
9841
|
-
|
|
9979
|
+
let delivered = { candidates: [] };
|
|
9980
|
+
try { delivered = _detectDeliveredRequests(root); } catch {}
|
|
9981
|
+
if (delivered.candidates && delivered.candidates.length > 0) {
|
|
9982
|
+
if (has('--auto-apply-delivered')) {
|
|
9983
|
+
// 1.9.224: μλ μ 리 (λ§κ° μ νΈμΆ β μμ : ν¨ν΄ λ§€μΉ + λ²μ κ°λ)
|
|
9984
|
+
let ok = 0;
|
|
9985
|
+
for (const c of delivered.candidates) {
|
|
9986
|
+
const u = _updateUserRequest(root, c.id, { status: 'completed', autoCompletedAt: new Date().toISOString(), autoCompleteReason: 'session-close-auto-apply-1.9.224' });
|
|
9987
|
+
if (u) ok++;
|
|
9988
|
+
}
|
|
9989
|
+
log(grn(` β delivered ν¨ν΄ ${ok}건 μλ μλ£ (--auto-apply-delivered 1.9.224)`));
|
|
9990
|
+
} else {
|
|
9991
|
+
log(yel(` π₯ delivered ν¨ν΄ ${delivered.candidates.length}건 (1.9.223) β μλ μλ£ κ°λ₯`));
|
|
9992
|
+
log(dim(` β leerness requests auto-complete --apply (μλ) λλ session close --auto-apply-delivered (1.9.224)`));
|
|
9993
|
+
}
|
|
9994
|
+
} else if (missCnt > 0) {
|
|
9842
9995
|
log(red(` β λ―Έλ΅ μ¬μ©μ μμ² ${missCnt}건 (task-log/plan/decisions λ§€μΉ μ λ¨)`));
|
|
9843
9996
|
} else if (reqAudit.open > 0) {
|
|
9844
9997
|
log(grn(` β μ¬μ©μ μμ² ${reqAudit.open}건 λͺ¨λ tracked`));
|
|
@@ -13697,7 +13850,8 @@ function mcpServeCmd(root) {
|
|
|
13697
13850
|
{ name: 'leerness_pre_wake_audit', description: '1.9.216 (1.9.209 μ¬μ©μ λͺ
μ) β sleep μ sub-agent audit. 6 μμ μ κ²: missing-user-requests / stale-in-progress / drift-handoff-stale / wakeup-missed / next-action-pending / auto-resume-plan. μΈλΆ AIκ° "κΉ¨μ΄λκΈ° μ μ κ²ν λΆλΆ"μ νμ. μλ΅: { auditedAt, findings: {critical, warning, info}, summary }. μΈμ: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
|
|
13698
13851
|
{ name: 'leerness_intent_classify', description: '1.9.216 (1.9.213 μ¬μ©μ λͺ
μ) β μ¬μ©μ μλ νμ
+ scope expansion κ²μ΄νΈ. μλ΅: { intent: precise|broad|default, signals, domain, explicitMentions, expansionCandidates, mode: dry-run }. 3μμΉ μμ : (1) Always-Off Opt-In, (2) Dry-run κΈ°λ³Έ (μ€ν X), (3) λͺ
μ vs μΆλ‘ λΆλ¦¬ λΌλ²¨λ§. 5 λλ©μΈ (game/web/api/cli/data). μΈλΆ AIκ° "μ΄ μμ²μ μ νν κ·Έκ²λ§ / ν¬κ΄μ / κΈ°λ³ΈμΈκ°?"λ₯Ό νμ. μΈμ: { request (required), path? }', inputSchema: { type: 'object', properties: { request: { type: 'string' }, path: { type: 'string' } }, required: ['request'] } },
|
|
13699
13852
|
{ name: 'leerness_idempotency_audit', description: '1.9.216 (1.9.212 μ¬μ©μ λͺ
μ) β λ©±λ±μ± μλ° νμ§. 4μμ μ κ²: rule-duplicate (medium) / task-duplicate-request (medium) / user-request-duplicate (low) / wakeup-duplicate (high). μλ΅: { violations[], verified[], summary: {totalViolations, high/medium/low, overall} }. μΈλΆ AIκ° "μν¬μ€νμ΄μ€μ μ€λ³΅/μΆ©λμ΄ μλ?"λ₯Ό νμ. π MCP 58 λꡬ λ§μΌμ€ν€ (50β58). μΈμ: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
|
|
13700
|
-
{ name: 'leerness_session_resume', description: '1.9.221 (1.9.220 μ¬μ©μ λͺ
μ) β λΉμ μ μ’
λ£ κ°μ§ + μμ¨ μ¬κ°. 5μ νΈ λΆμ: last-handoff-stale / wakeup-missed / in-progress-stale / auto-resume-plan-unused / release-branch-pending. μλ΅: { abnormalShutdown, severity (none/low/medium/high), signals[], resumeGuide[] }. μΈλΆ AIκ° "μ μ /μμ€ν
μ’
λ£/μΈμ
μ’
λ£ ν leerness μνκ° μ μμΈκ°? μ΄λ»κ² μ¬κ°?"λ₯Ό νμ. π MCP 60 λꡬ λ§μΌμ€ν€ (53β60, +7 in 1.9.168/216/221). μΈμ: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
|
|
13853
|
+
{ name: 'leerness_session_resume', description: '1.9.221 (1.9.220 μ¬μ©μ λͺ
μ) β λΉμ μ μ’
λ£ κ°μ§ + μμ¨ μ¬κ°. 5μ νΈ λΆμ: last-handoff-stale / wakeup-missed / in-progress-stale / auto-resume-plan-unused / release-branch-pending. μλ΅: { abnormalShutdown, severity (none/low/medium/high), signals[], resumeGuide[] }. μΈλΆ AIκ° "μ μ /μμ€ν
μ’
λ£/μΈμ
μ’
λ£ ν leerness μνκ° μ μμΈκ°? μ΄λ»κ² μ¬κ°?"λ₯Ό νμ. π MCP 60 λꡬ λ§μΌμ€ν€ (53β60, +7 in 1.9.168/216/221). μΈμ: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
|
|
13854
|
+
{ name: 'leerness_requests_auto_complete', description: '1.9.224 (1.9.223 μλ νμ) β delivered ν¨ν΄ μλ κ°μ§ + μλ μλ£. "Round X.Y.Z β ꡬν μλ£" / "implemented" / "delivered" ν¨ν΄μ΄ μλ open μμ² μ€ νμ¬ λ²μ μ΄νμΈ κ²μ νλ³΄λ‘ λΆλ₯. μλ΅: { total, candidates: [{id, text, claimedVersion, currentVersion, deliveredKeyword, recordedAt}], currentVersion, applied (apply=true μ), completedIds[] }. μΈλΆ AIκ° "μ΄μ λμ λ κ°μ§ λ―Έλ΅ μ νΈ μ 리 κ°λ₯νκ°?"λ₯Ό νμ. κΈ°λ³Έ dry-run, apply: true λͺ
μ μμλ§ μ€ μ μ©. μΈμ: { path?, apply? (default false) }', inputSchema: { type: 'object', properties: { path: { type: 'string' }, apply: { type: 'boolean' } } } }
|
|
13701
13855
|
];
|
|
13702
13856
|
|
|
13703
13857
|
function send(obj) {
|
|
@@ -13853,6 +14007,11 @@ function mcpServeCmd(root) {
|
|
|
13853
14007
|
// 1.9.221 (1.9.220): λΉμ μ μ’
λ£ κ°μ§ + μμ¨ μ¬κ°
|
|
13854
14008
|
cliArgs = ['session-resume', '--path', targetPath, '--json'];
|
|
13855
14009
|
break;
|
|
14010
|
+
case 'leerness_requests_auto_complete':
|
|
14011
|
+
// 1.9.224 (1.9.223): delivered ν¨ν΄ μλ κ°μ§ + μλ μλ£
|
|
14012
|
+
cliArgs = ['requests', 'auto-complete', '--path', targetPath, '--json'];
|
|
14013
|
+
if (args.apply === true) cliArgs.push('--apply');
|
|
14014
|
+
break;
|
|
13856
14015
|
default:
|
|
13857
14016
|
return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
|
|
13858
14017
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.224",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|