leerness 1.9.215 β 1.9.217
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 +79 -0
- package/README.md +3 -3
- package/bin/harness.js +118 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,84 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.217 β 2026-05-22
|
|
4
|
+
|
|
5
|
+
**π session close μλ ν΅ν© β 1.9.207/209/212 μλ νΈμΆ.**
|
|
6
|
+
|
|
7
|
+
### 1. session close μλ νΈμΆ 3μ’
(λ§κ° μ)
|
|
8
|
+
| μμ | μΆμ² | λμ |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| `userRequestsAudit` | 1.9.207 | open/in-progress μμ² β missing/tracked/stale λΆλ₯ |
|
|
11
|
+
| `preWakeAudit` | 1.9.209 | sleep μ 6 μμ audit + .harness/pre-wake-report.json μλ μ μ₯ |
|
|
12
|
+
| `idempotencyAudit` | 1.9.212 | 4μμ λ©±λ±μ± κ²μ¬ (rule/task/user-requests/wakeups) |
|
|
13
|
+
|
|
14
|
+
### 2. JSON λͺ¨λ (`--json`) ν΅ν© νλ μΆκ°
|
|
15
|
+
- `userRequestsAudit: { total, open, missing, tracked, stale }`
|
|
16
|
+
- `preWakeAudit: { auditedAt, critical, warning, info, needsAttention }`
|
|
17
|
+
- `idempotencyAudit: { violations, high, medium, low, verified, overall }`
|
|
18
|
+
|
|
19
|
+
### 3. human μΆλ ₯ μλ μΉμ
|
|
20
|
+
```
|
|
21
|
+
## π session close μλ ν΅ν© λ³΄κ³ (1.9.217)
|
|
22
|
+
β λ―Έλ΅ μ¬μ©μ μμ² N건 (task-log/plan/decisions λ§€μΉ μ λ¨)
|
|
23
|
+
π¨ pre-wake-audit: critical N (λ€μ κΉ¨μ΄λ¨ μ μ κ² νμ)
|
|
24
|
+
β λ©±λ±μ± κ²μ¬ ν΅κ³Ό β verified 4 μμ
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 4. opt-out μ΅μ
|
|
28
|
+
- `--no-pre-wake` β pre-wake audit μ€ν΅
|
|
29
|
+
- μ΅μ
μΈ λ€λ₯Έ ν΅ν©μ νμ μ€ν (κ°λ²Όμ)
|
|
30
|
+
|
|
31
|
+
### 5. λμ νκ· (1.9.207~216) β λͺ¨λ μ μ§
|
|
32
|
+
|
|
33
|
+
### 6. stress-v162 β 18/18 PASS
|
|
34
|
+
- 1.9.217 (7): VERSION + JSON νλ + human μΉμ
+ μλ μ μ₯ + opt-out + νλ ꡬ쑰 + clean
|
|
35
|
+
- μ±λ₯ (2): cold_start 489ms / MCP 59 λꡬ 785ms
|
|
36
|
+
- λμ νκ· (9)
|
|
37
|
+
|
|
38
|
+
### 7. μλ release (79 λΌμ΄λ main-push streak Β· 40 λΌμ΄λ npm publish streak)
|
|
39
|
+
|
|
40
|
+
π **session close κ°ν** β λ§€ λ§κ° μ μ΄μ μμ μλ μ κ²
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 1.9.216 β 2026-05-22
|
|
45
|
+
|
|
46
|
+
**π MCP 5μ’
μΆκ° β 1.9.207~213 μΈλΆ AI λ
ΈμΆ (54 β 59 λꡬ).**
|
|
47
|
+
|
|
48
|
+
> λ°±λ‘κ·Έ μμ§ ν μΈλΆ AI ν΅ν© κ°μΉ κ°ν β Claude/Codex/Gemini λ±μ΄ μ κ· 7 λΌμ΄λ κΈ°λ₯μ μ§μ νΈμΆ κ°λ₯
|
|
49
|
+
|
|
50
|
+
### 1. MCP μ κ· 5μ’
(1.9.216 λΌλ²¨)
|
|
51
|
+
| λꡬ | μΆμ² | μΈμ |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `leerness_requests_audit` | 1.9.207 | `{ path? }` β missing/tracked/stale νμ |
|
|
54
|
+
| `leerness_constraints_check` | 1.9.208 | `{ request, path? }` β νλ«νΌ alias λ§€μΉ |
|
|
55
|
+
| `leerness_pre_wake_audit` | 1.9.209 | `{ path? }` β 6μμ audit |
|
|
56
|
+
| `leerness_intent_classify` | 1.9.213 | `{ request, path? }` β intent + λλ©μΈ + dry-run νμ₯ |
|
|
57
|
+
| `leerness_idempotency_audit` | 1.9.212 | `{ path? }` β 4μμ λ©±λ±μ± κ²μ¬ |
|
|
58
|
+
|
|
59
|
+
### 2. 5μΆ λ§€νΈλ¦μ€ BμΆ (λ©ν° Sub-Agent) κ°μΉ κ°ν
|
|
60
|
+
- μΈλΆ AI κ° leerness μ 7 λΌμ΄λ μ κ· κΈ°λ₯μ MCP λ‘ μ§μ νΈμΆ
|
|
61
|
+
- Claude Desktop / Cursor / Codex CLI λ±μμ leerness MCP server λ±λ‘ β μ¦μ μ¬μ© κ°λ₯
|
|
62
|
+
- "μ¬μ©μκ° νλ μμ² μ€ λλ½λ κ² μλ?" "μ΄ κΈ°λ₯ ꡬν μ μ΄λ€ API κ·μ ?" "μ΄ μμ²μ μ νν κ·Έκ²λ§ / ν¬κ΄μ ?" λ±μ μΈλΆ AIκ° νμ
|
|
63
|
+
|
|
64
|
+
### 3. λμ νκ· (1.9.207~215) β λͺ¨λ μ μ§
|
|
65
|
+
|
|
66
|
+
### 4. stress-v161 β 19/19 PASS
|
|
67
|
+
- 1.9.216 (8): VERSION + tools/list 59κ° + 5μ’
λ±λ‘ + 4μ’
μ€ νΈμΆ κ²μ¦
|
|
68
|
+
- leerness_intent_classify("λ§΅+μΊλ¦ν°+κ²μ κΈ°λ₯") β broad/game/8 candidates β
|
|
69
|
+
- leerness_constraints_check("Stripe API") β stripe matched β
|
|
70
|
+
- leerness_pre_wake_audit β audited 0 β
|
|
71
|
+
- leerness_idempotency_audit β clean β
|
|
72
|
+
- leerness_requests_audit β total=0 β
|
|
73
|
+
- μ±λ₯ (2): cold_start 544ms / MCP 59λꡬ 541ms
|
|
74
|
+
- λμ νκ· (9): 1.9.207~215
|
|
75
|
+
|
|
76
|
+
### 5. μλ release (78 λΌμ΄λ main-push streak Β· 39 λΌμ΄λ npm publish streak)
|
|
77
|
+
|
|
78
|
+
π **MCP 58 λꡬ λ§μΌμ€ν€** (μ΄μ 53 β 59, +6 in 1.9.158/159/168/216)
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
3
82
|
## 1.9.215 β 2026-05-22
|
|
4
83
|
|
|
5
84
|
**π― handoff ν€λλΌμΈμ constraints/intent μλ ν΅ν© + AGENTS.md 7 λΌμ΄λ λμ .**
|
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.217 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π session close μλ ν΅ν© (requests/pre-wake/idempotency) β
|
|
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.217';
|
|
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 μ²λ¦¬).
|
|
@@ -9465,7 +9465,98 @@ function sessionClose(root, opts = {}) {
|
|
|
9465
9465
|
};
|
|
9466
9466
|
} catch {}
|
|
9467
9467
|
} catch {}
|
|
9468
|
+
|
|
9469
|
+
// 1.9.217: session close μλ ν΅ν© β 1.9.207 + 1.9.209 + 1.9.212
|
|
9470
|
+
// λ§κ° μ λ―Έλ΅ μμ² / pre-wake audit / λ©±λ±μ± κ²μ¬ μλ μ€ν + JSON ν΅ν©
|
|
9471
|
+
try {
|
|
9472
|
+
// 1.9.207: λ―Έλ΅ μ¬μ©μ μμ² audit
|
|
9473
|
+
const reqAudit = _auditUserRequests(root);
|
|
9474
|
+
jsonResult.userRequestsAudit = {
|
|
9475
|
+
total: reqAudit.total,
|
|
9476
|
+
open: reqAudit.open,
|
|
9477
|
+
missing: reqAudit.missing ? reqAudit.missing.length : 0,
|
|
9478
|
+
tracked: reqAudit.tracked ? reqAudit.tracked.length : 0,
|
|
9479
|
+
stale: reqAudit.stale ? reqAudit.stale.length : 0
|
|
9480
|
+
};
|
|
9481
|
+
} catch {}
|
|
9482
|
+
try {
|
|
9483
|
+
// 1.9.209: pre-wake-audit μλ μ€ν + μ μ₯ (sleep μ μλ μ κ²)
|
|
9484
|
+
if (!opts.noPreWake && !has('--no-pre-wake')) {
|
|
9485
|
+
const audit = _runPreWakeAudit(root);
|
|
9486
|
+
_saveAndAppendPreWakeReport(root, audit);
|
|
9487
|
+
jsonResult.preWakeAudit = {
|
|
9488
|
+
auditedAt: audit.auditedAt,
|
|
9489
|
+
critical: audit.summary.criticalCount,
|
|
9490
|
+
warning: audit.summary.warningCount,
|
|
9491
|
+
info: audit.summary.infoCount,
|
|
9492
|
+
needsAttention: audit.summary.needsAttention
|
|
9493
|
+
};
|
|
9494
|
+
}
|
|
9495
|
+
} catch {}
|
|
9496
|
+
try {
|
|
9497
|
+
// 1.9.212: λ©±λ±μ± κ²μ¬ μλ μ€ν (rule/task/user-requests/wakeups 4μμ)
|
|
9498
|
+
const idemp = _runIdempotencyAudit(root);
|
|
9499
|
+
jsonResult.idempotencyAudit = {
|
|
9500
|
+
violations: idemp.summary.totalViolations,
|
|
9501
|
+
high: idemp.summary.highSeverity,
|
|
9502
|
+
medium: idemp.summary.mediumSeverity,
|
|
9503
|
+
low: idemp.summary.lowSeverity,
|
|
9504
|
+
verified: idemp.summary.verifiedAreas,
|
|
9505
|
+
overall: idemp.summary.overall
|
|
9506
|
+
};
|
|
9507
|
+
} catch {}
|
|
9508
|
+
|
|
9468
9509
|
process.stdout.write(JSON.stringify(jsonResult, null, 2) + '\n');
|
|
9510
|
+
} else {
|
|
9511
|
+
// 1.9.217: human μΆλ ₯ λͺ¨λμμλ ν΅ν© λ³΄κ³ λ
ΈμΆ (λ§κ° μ§μ )
|
|
9512
|
+
try {
|
|
9513
|
+
const isTty = process.stdout.isTTY;
|
|
9514
|
+
const grn = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
|
|
9515
|
+
const yel = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
9516
|
+
const red = s => isTty ? `\x1b[31m${s}\x1b[0m` : s;
|
|
9517
|
+
const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
9518
|
+
|
|
9519
|
+
log('');
|
|
9520
|
+
log(`## π session close μλ ν΅ν© λ³΄κ³ (1.9.217)`);
|
|
9521
|
+
// 1.9.207
|
|
9522
|
+
try {
|
|
9523
|
+
const reqAudit = _auditUserRequests(root);
|
|
9524
|
+
const missCnt = reqAudit.missing ? reqAudit.missing.length : 0;
|
|
9525
|
+
if (missCnt > 0) {
|
|
9526
|
+
log(red(` β λ―Έλ΅ μ¬μ©μ μμ² ${missCnt}건 (task-log/plan/decisions λ§€μΉ μ λ¨)`));
|
|
9527
|
+
} else if (reqAudit.open > 0) {
|
|
9528
|
+
log(grn(` β μ¬μ©μ μμ² ${reqAudit.open}건 λͺ¨λ tracked`));
|
|
9529
|
+
} else {
|
|
9530
|
+
log(dim(` βΉ μ¬μ©μ μμ² μμ (UR λ°±λ‘κ·Έ λΉμ΄μμ)`));
|
|
9531
|
+
}
|
|
9532
|
+
} catch {}
|
|
9533
|
+
// 1.9.209
|
|
9534
|
+
try {
|
|
9535
|
+
if (!opts.noPreWake && !has('--no-pre-wake')) {
|
|
9536
|
+
const audit = _runPreWakeAudit(root);
|
|
9537
|
+
_saveAndAppendPreWakeReport(root, audit);
|
|
9538
|
+
const sum = audit.summary;
|
|
9539
|
+
if (sum.criticalCount > 0) {
|
|
9540
|
+
log(red(` π¨ pre-wake-audit: critical ${sum.criticalCount} (λ€μ κΉ¨μ΄λ¨ μ μ κ² νμ)`));
|
|
9541
|
+
} else if (sum.warningCount > 0) {
|
|
9542
|
+
log(yel(` β pre-wake-audit: warning ${sum.warningCount}`));
|
|
9543
|
+
} else {
|
|
9544
|
+
log(grn(` β pre-wake-audit: clean (sleep μμ )`));
|
|
9545
|
+
}
|
|
9546
|
+
}
|
|
9547
|
+
} catch {}
|
|
9548
|
+
// 1.9.212
|
|
9549
|
+
try {
|
|
9550
|
+
const idemp = _runIdempotencyAudit(root);
|
|
9551
|
+
const v = idemp.summary.totalViolations;
|
|
9552
|
+
if (v > 0) {
|
|
9553
|
+
log(red(` β λ©±λ±μ± μλ° ${v}건 (high: ${idemp.summary.highSeverity})`));
|
|
9554
|
+
log(dim(` β leerness idempotency audit μΌλ‘ μμΈ νμΈ`));
|
|
9555
|
+
} else {
|
|
9556
|
+
log(grn(` β λ©±λ±μ± κ²μ¬ ν΅κ³Ό β verified ${idemp.summary.verifiedAreas} μμ`));
|
|
9557
|
+
}
|
|
9558
|
+
} catch {}
|
|
9559
|
+
} catch {}
|
|
9469
9560
|
}
|
|
9470
9561
|
}
|
|
9471
9562
|
|
|
@@ -13284,7 +13375,12 @@ function mcpServeCmd(root) {
|
|
|
13284
13375
|
{ name: 'leerness_web', description: '1.9.168 β Web Bridge (1.9.165 playwright opt-in). sub: check (μ€μΉ + permissions.browser νμΈ) | screenshot (URL β PNG) | extract (URL + CSS selector β DOM ν
μ€νΈ). μΈλΆ AIκ° leerness μ μΉ μλν λ₯λ ₯μ μ§μ νΈμΆ. playwright λ―Έμ€μΉ μ μΉμ μλ΄ (graceful). μΈμ: { sub (required), url?, out?, selector?, path? }', inputSchema: { type: 'object', properties: { sub: { type: 'string', enum: ['check', 'screenshot', 'extract'] }, url: { type: 'string' }, out: { type: 'string' }, selector: { type: 'string' }, path: { type: 'string' } }, required: ['sub'] } },
|
|
13285
13376
|
{ name: 'leerness_pc', description: '1.9.168 β PC Bridge (1.9.166 robotjs/nut-tree opt-in). sub: check (μ€μΉ + permissions.mouse/keyboard) | click (x,y) | type (text) | screenshot (out). β full permissions κΆμ₯ (mouse/keyboard μ κ·Ό). μΈλΆ AIκ° λ°μ€ν¬ν μλν λ₯λ ₯μ μ§μ νΈμΆ. μΈμ: { sub (required), x?, y?, text?, out?, path? }', inputSchema: { type: 'object', properties: { sub: { type: 'string', enum: ['check', 'click', 'type', 'screenshot'] }, x: { type: 'number' }, y: { type: 'number' }, text: { type: 'string' }, out: { type: 'string' }, path: { type: 'string' } }, required: ['sub'] } },
|
|
13286
13377
|
{ name: 'leerness_lsp', description: '1.9.168 β LSP Bridge (1.9.167 typescript opt-in + regex fallback). sub: check (μ€μΉ μ¬λΆ) | symbols (file β function/class/interface/type/enum λͺ©λ‘) | references (name + in λλ ν 리 β νΈμΆ μμΉ). μΈλΆ AIκ° μ½λ μΈν
리μ μ€λ₯Ό μ§μ νΈμΆ (μμ‘΄μ± 0 fallback λμ). π MCP 53 λꡬ λ§μΌμ€ν€. μΈμ: { sub (required), file?, name?, in?, path? }', inputSchema: { type: 'object', properties: { sub: { type: 'string', enum: ['check', 'symbols', 'references'] }, file: { type: 'string' }, name: { type: 'string' }, in: { type: 'string' }, path: { type: 'string' } }, required: ['sub'] } },
|
|
13287
|
-
{ name: 'leerness_review_request', description: '1.9.176 β μ¬μ©μ μμ² μ¬μ κ²ν (μ¬μ©μ λͺ
μ μμ²). AI μμ΄μ νΈκ° μ¬μ©μ μꡬλ₯Ό **무쑰건 ꡬν μ **μ νΈμΆ. λΆμ: 1) estimatedType (route μΆμ ), 2) conflicts (lesson μ€ν¨/μ§νμ€ task), 3) reuseCandidates (skill/reuse-map λ§€μΉ), 4) lessonsRecall (κ³Όκ±° κ²°μ ), 5) planConflicts (μ§νμ€ milestone), 6) featureConflicts (feature graph μμ κ²ΉμΉ¨), 7) recommendedSteps (μμ
μ νλ³ 3-5 λ¨κ³), 8) efficiencyHints, 9) proceed (true/false). μ¬μ©μ κ²°μ λμ. μΈμ: { request (required), path? }', inputSchema: { type: 'object', properties: { request: { type: 'string' }, path: { type: 'string' } }, required: ['request'] } }
|
|
13378
|
+
{ name: 'leerness_review_request', description: '1.9.176 β μ¬μ©μ μμ² μ¬μ κ²ν (μ¬μ©μ λͺ
μ μμ²). AI μμ΄μ νΈκ° μ¬μ©μ μꡬλ₯Ό **무쑰건 ꡬν μ **μ νΈμΆ. λΆμ: 1) estimatedType (route μΆμ ), 2) conflicts (lesson μ€ν¨/μ§νμ€ task), 3) reuseCandidates (skill/reuse-map λ§€μΉ), 4) lessonsRecall (κ³Όκ±° κ²°μ ), 5) planConflicts (μ§νμ€ milestone), 6) featureConflicts (feature graph μμ κ²ΉμΉ¨), 7) recommendedSteps (μμ
μ νλ³ 3-5 λ¨κ³), 8) efficiencyHints, 9) proceed (true/false). μ¬μ©μ κ²°μ λμ. μΈμ: { request (required), path? }', inputSchema: { type: 'object', properties: { request: { type: 'string' }, path: { type: 'string' } }, required: ['request'] } },
|
|
13379
|
+
{ name: 'leerness_requests_audit', description: '1.9.216 (1.9.207 μ¬μ©μ λͺ
μ) β μ¬μ©μ λͺ
μ μμ² λλ½ νμΈ μ μ°¨. .harness/user-requests.json μ open/in-progress μμ²μ task-log/plan/decisions μ λ§€μΉ β missing/tracked/stale λΆλ₯. μΈλΆ AIκ° "μ¬μ©μκ° νλ μμ² μ€ λλ½λ κ² μλ?"λ₯Ό μ§μ νμ. μλ΅: { total, open, missing[], tracked[], stale[], completed, dropped }. μΈμ: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
|
|
13380
|
+
{ name: 'leerness_constraints_check', description: '1.9.216 (1.9.208 μ¬μ©μ λͺ
μ) β νλ«νΌ/API μ μ½ μ¬μ 체ν¬. μ¬μ©μ μμ² ν
μ€νΈμμ νλ«νΌ alias λ§€μΉ (stripe/openai/anthropic/github/discord/twitter 6μ’
+ μ¬μ©μ μ μ) β κ° νλ«νΌμ rate-limit / idempotency / auth / cost μ μ½ λ
ΈμΆ. μΈλΆ AIκ° "μ΄ κΈ°λ₯ ꡬν μ μ΄λ€ κ·μ μ λ΄μΌ νλ?"λ₯Ό μ§μ νμ. μΈμ: { request (required), path? }', inputSchema: { type: 'object', properties: { request: { type: 'string' }, path: { type: 'string' } }, required: ['request'] } },
|
|
13381
|
+
{ 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' } } } },
|
|
13382
|
+
{ 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'] } },
|
|
13383
|
+
{ 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' } } } }
|
|
13288
13384
|
];
|
|
13289
13385
|
|
|
13290
13386
|
function send(obj) {
|
|
@@ -13416,6 +13512,26 @@ function mcpServeCmd(root) {
|
|
|
13416
13512
|
// 1.9.176: μ¬μ©μ μμ² μ¬μ κ²ν (μ¬μ©μ λͺ
μ μμ²)
|
|
13417
13513
|
cliArgs = ['review-request', String(args.request || ''), '--path', targetPath, '--json'];
|
|
13418
13514
|
break;
|
|
13515
|
+
case 'leerness_requests_audit':
|
|
13516
|
+
// 1.9.216 (1.9.207): μ¬μ©μ μμ² λλ½ νμΈ μ μ°¨
|
|
13517
|
+
cliArgs = ['requests', 'audit', '--path', targetPath, '--json'];
|
|
13518
|
+
break;
|
|
13519
|
+
case 'leerness_constraints_check':
|
|
13520
|
+
// 1.9.216 (1.9.208): νλ«νΌ/API μ μ½ μ¬μ 체ν¬
|
|
13521
|
+
cliArgs = ['constraints', 'check', String(args.request || ''), '--path', targetPath, '--json'];
|
|
13522
|
+
break;
|
|
13523
|
+
case 'leerness_pre_wake_audit':
|
|
13524
|
+
// 1.9.216 (1.9.209): pre-wake sub-agent audit
|
|
13525
|
+
cliArgs = ['pre-wake-audit', '--path', targetPath, '--json'];
|
|
13526
|
+
break;
|
|
13527
|
+
case 'leerness_intent_classify':
|
|
13528
|
+
// 1.9.216 (1.9.213): intent inference + scope expansion (dry-run)
|
|
13529
|
+
cliArgs = ['intent', 'expand', String(args.request || ''), '--path', targetPath, '--json'];
|
|
13530
|
+
break;
|
|
13531
|
+
case 'leerness_idempotency_audit':
|
|
13532
|
+
// 1.9.216 (1.9.212): λ©±λ±μ± κ°μ¬ (rule/task/user-requests/wakeups 4μμ)
|
|
13533
|
+
cliArgs = ['idempotency', 'audit', '--path', targetPath, '--json'];
|
|
13534
|
+
break;
|
|
13419
13535
|
default:
|
|
13420
13536
|
return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
|
|
13421
13537
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.217",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|