leerness 1.9.223 β 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 +36 -0
- package/README.md +3 -3
- package/bin/harness.js +43 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,41 @@
|
|
|
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
|
+
|
|
3
39
|
## 1.9.223 β 2026-05-22
|
|
4
40
|
|
|
5
41
|
**π₯ μ¬μ©μ μμ² auto-complete (delivered ν¨ν΄ μλ κ°μ§) + 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.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 μ²λ¦¬).
|
|
@@ -6139,6 +6139,28 @@ function handoff(root) {
|
|
|
6139
6139
|
}
|
|
6140
6140
|
} catch {}
|
|
6141
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
|
+
|
|
6142
6164
|
// 1.9.8: active rules μλ λ
ΈμΆ (λ§€ μΈμ
μμ μ AIμκ² λ³΄μ)
|
|
6143
6165
|
const activeRules = readRules(root).filter(r => r.status === 'active');
|
|
6144
6166
|
if (activeRules.length) {
|
|
@@ -9950,15 +9972,25 @@ function sessionClose(root, opts = {}) {
|
|
|
9950
9972
|
|
|
9951
9973
|
log('');
|
|
9952
9974
|
log(`## π session close μλ ν΅ν© λ³΄κ³ (1.9.217)`);
|
|
9953
|
-
// 1.9.207 + 1.9.223 (delivered ν¨ν΄ μλ κΆμ₯)
|
|
9975
|
+
// 1.9.207 + 1.9.223 (delivered ν¨ν΄ μλ κΆμ₯) + 1.9.224 (--auto-apply-delivered μ΅μ
)
|
|
9954
9976
|
try {
|
|
9955
9977
|
const reqAudit = _auditUserRequests(root);
|
|
9956
9978
|
const missCnt = reqAudit.missing ? reqAudit.missing.length : 0;
|
|
9957
9979
|
let delivered = { candidates: [] };
|
|
9958
9980
|
try { delivered = _detectDeliveredRequests(root); } catch {}
|
|
9959
9981
|
if (delivered.candidates && delivered.candidates.length > 0) {
|
|
9960
|
-
|
|
9961
|
-
|
|
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
|
+
}
|
|
9962
9994
|
} else if (missCnt > 0) {
|
|
9963
9995
|
log(red(` β λ―Έλ΅ μ¬μ©μ μμ² ${missCnt}건 (task-log/plan/decisions λ§€μΉ μ λ¨)`));
|
|
9964
9996
|
} else if (reqAudit.open > 0) {
|
|
@@ -13818,7 +13850,8 @@ function mcpServeCmd(root) {
|
|
|
13818
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' } } } },
|
|
13819
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'] } },
|
|
13820
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' } } } },
|
|
13821
|
-
{ 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' } } } }
|
|
13822
13855
|
];
|
|
13823
13856
|
|
|
13824
13857
|
function send(obj) {
|
|
@@ -13974,6 +14007,11 @@ function mcpServeCmd(root) {
|
|
|
13974
14007
|
// 1.9.221 (1.9.220): λΉμ μ μ’
λ£ κ°μ§ + μμ¨ μ¬κ°
|
|
13975
14008
|
cliArgs = ['session-resume', '--path', targetPath, '--json'];
|
|
13976
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;
|
|
13977
14015
|
default:
|
|
13978
14016
|
return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
|
|
13979
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",
|