leerness 1.9.229 β 1.9.231
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 +62 -0
- package/README.md +3 -3
- package/bin/harness.js +121 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,67 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.231 β 2026-05-23
|
|
4
|
+
|
|
5
|
+
**π leerness pulse μ λͺ
λ Ή (ν μ€ μ’
ν© μμ½) + MCP 64λ²μ§Έ λꡬ.**
|
|
6
|
+
|
|
7
|
+
### 1. `leerness pulse` μ λͺ
λ Ή β ν μ€ μ’
ν© μμ½
|
|
8
|
+
- 10 ν΅μ¬ μ§νλ₯Ό 1 lineμΌλ‘: `π v1.9.231 Β· π R187 Β· π MCP 64 Β· π§ T0/D0/R0/P0/L0 Β· π― R200 (1d) Β· π abnormal:medium`
|
|
9
|
+
- `--json` μ΅μ
: `{ version, roundCount, mcpTools, memorySurface, security, health, driftScore, nextMilestone, etaDays, abnormalShutdown }`
|
|
10
|
+
- **handoff λ³΄λ€ κ°λ²Όμ**: drift/health κ³μ° skip β λ λΉ λ¦
|
|
11
|
+
|
|
12
|
+
### 2. MCP 64λ²μ§Έ λꡬ β `leerness_pulse`
|
|
13
|
+
- μΈλΆ AIκ° κ°λ²Όμ΄ λ¨μΌ νΈμΆλ‘ leerness μ 체 μν νμ
|
|
14
|
+
- 1.9.230 (62) β 1.9.231 (**64**, +1)
|
|
15
|
+
|
|
16
|
+
### 3. μ€ μΈ‘μ β leerness μ체 pulse
|
|
17
|
+
- π νλμ 보기: R187 / MCP 64 / R200 ETA 1d / abnormal:medium
|
|
18
|
+
- handoff (~1019ms) β pulse (~945ms) β λ λΉ λ₯΄κ² ν΅μ¬λ§
|
|
19
|
+
|
|
20
|
+
### 4. λμ νκ· (1.9.207~230) β λͺ¨λ μ μ§
|
|
21
|
+
|
|
22
|
+
### 5. stress-v176 β 16/16 PASS
|
|
23
|
+
- 1.9.231 (6): VERSION + CLI ν μ€ + --json + git fallback + MCP 64 + μ€ νΈμΆ
|
|
24
|
+
- μ±λ₯ (2): cold_start avg 394ms / pulse 945ms
|
|
25
|
+
- λμ νκ· (8): 1.9.207~230
|
|
26
|
+
|
|
27
|
+
### 6. μλ release (93 λΌμ΄λ main-push streak Β· 54 λΌμ΄λ npm publish streak)
|
|
28
|
+
|
|
29
|
+
π **λΉ λ₯Έ μν νμΈ λͺ
λ Ή μ μ€** β pulse κ° handoffλ³΄λ€ κ°λ²Όμμ μλνμ μ΅μ
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## 1.9.230 β 2026-05-23
|
|
34
|
+
|
|
35
|
+
**π handoff/session close/health --json milestones ν΅ν© (7 νλ μμ±) + ν€λλΌμΈ ETA μλ° νμ.**
|
|
36
|
+
|
|
37
|
+
### 1. handoff/session close/health --json 7λ²μ§Έ ν΅ν© νλ `milestones`
|
|
38
|
+
- 1.9.229 milestones λ°μ΄ν°λ₯Ό JSON 3 λͺ
λ Ή λͺ¨λμ ν΅ν©
|
|
39
|
+
- λμΌ νμ: `{ reachedCount, reached: [{milestone, version, reachedAt}], next, avgRoundsPerDay }`
|
|
40
|
+
- 1.9.218 (4 νλ) β 1.9.223 (5) β 1.9.227 (6) β 1.9.230 (**7 νλ**)
|
|
41
|
+
|
|
42
|
+
### 2. 3 λͺ
λ Ή milestones λμΌ νμ μΌκ΄μ±
|
|
43
|
+
- handoff/session close/health λͺ¨λ λμΌν `milestones` κ°μ²΄ λ°ν
|
|
44
|
+
- μΈλΆ μλν/CI κ° μ΄λ λͺ
λ ΉμΌλ‘ μ‘°νν΄λ λμΌ κ²°κ³Ό
|
|
45
|
+
- μΌκ΄μ± λ§€νΈλ¦μ€: 3 λͺ
λ Ή Γ 7 νλ = **21 ν΅ν© ν¬μΈνΈ**
|
|
46
|
+
|
|
47
|
+
### 3. handoff ν€λλΌμΈ μλ° ETA νμ (1.9.230)
|
|
48
|
+
- λ€μ λ§μΌμ€ν€μ΄ **10R μ΄λ΄** + ETAκ° **7μΌ μ΄λ΄** μΌ λλ§ λ³λ λ
ΈμΆ
|
|
49
|
+
- `π― R200 ETA 2026-05-24` νμ (νμ¬λ 14R λ¨μ λ³΄νΈ κ°λ λ°λ X)
|
|
50
|
+
- λ§μΌμ€ν€ μλ° μ μλ κ°μ‘° (μ€νΈ λ°©μ§: 쑰건 μΆ©μ‘± μλ§)
|
|
51
|
+
|
|
52
|
+
### 4. λμ νκ· (1.9.207~229) β λͺ¨λ μ μ§
|
|
53
|
+
|
|
54
|
+
### 5. stress-v175 β 17/17 PASS
|
|
55
|
+
- 1.9.230 (7): VERSION + handoff/session close/health JSON + 3 λͺ
λ Ή μΌκ΄μ± + 7 νλ κ²μ¦ + ν€λλΌμΈ ETA
|
|
56
|
+
- μ±λ₯ (2): cold_start avg 439ms / handoff --json (7 νλ) 1019ms
|
|
57
|
+
- λμ νκ· (8): 1.9.207~229
|
|
58
|
+
|
|
59
|
+
### 6. μλ release (92 λΌμ΄λ main-push streak Β· 53 λΌμ΄λ npm publish streak)
|
|
60
|
+
|
|
61
|
+
π **JSON ν΅ν© λ§€νΈλ¦μ€ 7 νλ μμ±** β μΈλΆ μλνκ° leerness μνλ₯Ό 7 μ°¨μ λκΈ° νμ (3 λͺ
λ Ή μΌκ΄μ±)
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
3
65
|
## 1.9.229 β 2026-05-23
|
|
4
66
|
|
|
5
67
|
**π― leerness milestones CLI + MCP 63λ²μ§Έ λꡬ (λλ¬ λ§μΌμ€ν€ + ETA μμΈ‘).**
|
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.231 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π leerness pulse β ν μ€ μ’
ν© μμ½ + MCP 64 λꡬ β
|
|
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.231';
|
|
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 μ²λ¦¬).
|
|
@@ -2196,6 +2196,80 @@ function milestonesCmd(root) {
|
|
|
2196
2196
|
}
|
|
2197
2197
|
}
|
|
2198
2198
|
|
|
2199
|
+
// 1.9.231: leerness pulse β ν μ€ μ’
ν© μμ½ (10 ν΅μ¬ μ§ν)
|
|
2200
|
+
// handoff ν€λλΌμΈμ μΆμ½ λ²μ β μ¬μ©μκ° λΉ λ₯΄κ² μν νμ
|
|
2201
|
+
// μλ΅ (--json): { version, roundCount, mcpTools, memorySurface, security, health, driftScore, nextMilestone, etaDays, abnormal }
|
|
2202
|
+
function pulseCmd(root) {
|
|
2203
|
+
root = absRoot(root);
|
|
2204
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
2205
|
+
const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
2206
|
+
const gr = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
|
|
2207
|
+
const yl = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
2208
|
+
const rd = s => isTty ? `\x1b[31m${s}\x1b[0m` : s;
|
|
2209
|
+
const dm = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
2210
|
+
const data = {
|
|
2211
|
+
version: VERSION,
|
|
2212
|
+
roundCount: 0,
|
|
2213
|
+
mcpTools: 0,
|
|
2214
|
+
memorySurface: 'T0/D0/R0/P0/L0',
|
|
2215
|
+
security: 'unknown',
|
|
2216
|
+
health: 'unknown',
|
|
2217
|
+
driftScore: null,
|
|
2218
|
+
nextMilestone: null,
|
|
2219
|
+
etaDays: null,
|
|
2220
|
+
abnormalShutdown: 'none'
|
|
2221
|
+
};
|
|
2222
|
+
// λΌμ΄λ μΉ΄μ΄νΈ
|
|
2223
|
+
try { data.roundCount = _computeRoundHistory(root).roundCount; } catch {}
|
|
2224
|
+
// MCP λꡬ μ (μ½λ grep)
|
|
2225
|
+
try {
|
|
2226
|
+
const src = read(__filename);
|
|
2227
|
+
const matches = src.match(/name: 'leerness_[a-z_]+'/g) || [];
|
|
2228
|
+
data.mcpTools = matches.length;
|
|
2229
|
+
} catch {}
|
|
2230
|
+
// Memory Surface (T/D/R/P/L)
|
|
2231
|
+
try {
|
|
2232
|
+
const tasks = (read(progressTrackerPath(root)).split('\n').filter(l => /\|\s*in-progress\s*\|/.test(l)) || []).length;
|
|
2233
|
+
const decisions = ((read(path.join(root, '.harness', 'decisions.md')) || '').match(/^##\s/gm) || []).length;
|
|
2234
|
+
const rules = readRules(root).filter(r => r.status === 'active').length;
|
|
2235
|
+
const milestonesCnt = ((read(path.join(root, '.harness', 'plan.md')) || '').match(/^- M-\d+/gm) || []).length;
|
|
2236
|
+
const lessons = ((read(path.join(root, '.harness', 'lessons.md')) || '').match(/^###\s/gm) || []).length;
|
|
2237
|
+
data.memorySurface = `T${tasks}/D${decisions}/R${rules}/P${milestonesCnt}/L${lessons}`;
|
|
2238
|
+
} catch {}
|
|
2239
|
+
// λ§μΌμ€ν€ + ETA
|
|
2240
|
+
try {
|
|
2241
|
+
const ms = _computeMilestones(root);
|
|
2242
|
+
if (ms.next) {
|
|
2243
|
+
data.nextMilestone = ms.next.milestone;
|
|
2244
|
+
data.etaDays = ms.next.etaDays;
|
|
2245
|
+
}
|
|
2246
|
+
} catch {}
|
|
2247
|
+
// λΉμ μ μ’
λ£
|
|
2248
|
+
try {
|
|
2249
|
+
const ad = _detectAbnormalShutdown(root);
|
|
2250
|
+
if (ad.abnormalShutdown) data.abnormalShutdown = ad.severity;
|
|
2251
|
+
} catch {}
|
|
2252
|
+
// drift score (κ°λ¨ β env μ€μ μ skip)
|
|
2253
|
+
if (process.env.LEERNESS_NO_DRIFT_CHECK !== '1') {
|
|
2254
|
+
// μ§μ κ³μ° skip β handoff μ λ³λ νΈμΆμ΄ λΉ λ¦. pulse λ κ°λ²Όμ μ°μ .
|
|
2255
|
+
}
|
|
2256
|
+
if (has('--json')) { log(JSON.stringify(data, null, 2)); return; }
|
|
2257
|
+
// ν μ€ μΆλ ₯
|
|
2258
|
+
let line = `π v${data.version} Β· π R${data.roundCount} Β· π MCP ${data.mcpTools} Β· π§ ${data.memorySurface}`;
|
|
2259
|
+
if (data.nextMilestone) {
|
|
2260
|
+
const eta = data.etaDays != null ? ` (${data.etaDays}d)` : '';
|
|
2261
|
+
line += ` Β· π― R${data.nextMilestone}${eta}`;
|
|
2262
|
+
}
|
|
2263
|
+
if (data.abnormalShutdown !== 'none') {
|
|
2264
|
+
line += ` Β· π abnormal:${data.abnormalShutdown}`;
|
|
2265
|
+
}
|
|
2266
|
+
log(cy(`# leerness pulse (1.9.231) β ν μ€ μ’
ν© μμ½`));
|
|
2267
|
+
log('');
|
|
2268
|
+
log(` ${line}`);
|
|
2269
|
+
log('');
|
|
2270
|
+
log(dm(` β μμΈ: leerness handoff . | health . | round-history | milestones`));
|
|
2271
|
+
}
|
|
2272
|
+
|
|
2199
2273
|
function roundHistoryCmd(root) {
|
|
2200
2274
|
root = absRoot(root);
|
|
2201
2275
|
const isTty = process.stdout && process.stdout.isTTY;
|
|
@@ -6006,6 +6080,16 @@ function handoff(root) {
|
|
|
6006
6080
|
avgRoundsPerDay: rh.avgRoundsPerDay
|
|
6007
6081
|
};
|
|
6008
6082
|
} catch {}
|
|
6083
|
+
// 1.9.230: milestones ν΅ν© (handoff JSON 7λ²μ§Έ ν΅ν© νλ) β λλ¬ λ§μΌμ€ν€ + ETA
|
|
6084
|
+
try {
|
|
6085
|
+
const ms = _computeMilestones(root);
|
|
6086
|
+
result.milestones = {
|
|
6087
|
+
reachedCount: ms.reached.length,
|
|
6088
|
+
reached: ms.reached.map(m => ({ milestone: m.milestone, version: m.version, reachedAt: m.reachedAt })),
|
|
6089
|
+
next: ms.next,
|
|
6090
|
+
avgRoundsPerDay: ms.avgRoundsPerDay
|
|
6091
|
+
};
|
|
6092
|
+
} catch {}
|
|
6009
6093
|
} catch {}
|
|
6010
6094
|
try {
|
|
6011
6095
|
const pwState = _loadPreWakeReport(root);
|
|
@@ -6169,6 +6253,7 @@ function handoff(root) {
|
|
|
6169
6253
|
}
|
|
6170
6254
|
} catch {}
|
|
6171
6255
|
// 17) 1.9.226: round-history ν€λλΌμΈ β μμ¨ λΌμ΄λ μΉ΄μ΄ν° + λ€μ λ§μΌμ€ν€ (5 λΌμ΄λ μ΄μ μλ§ νμ)
|
|
6256
|
+
// 1.9.230: λ€μ λ§μΌμ€ν€ ETA (10R μ΄λ΄ + ETA 7μΌ μ΄λ΄μΌ λ κ°μ‘°)
|
|
6172
6257
|
try {
|
|
6173
6258
|
const rh = _computeRoundHistory(root);
|
|
6174
6259
|
if (rh.roundCount >= 5) {
|
|
@@ -6177,6 +6262,13 @@ function handoff(root) {
|
|
|
6177
6262
|
label += ` β R${rh.nextMilestone} (${rh.roundsToNextMilestone}R λ¨μ)`;
|
|
6178
6263
|
}
|
|
6179
6264
|
parts.push(label);
|
|
6265
|
+
// 1.9.230: μλ° λ§μΌμ€ν€ ETA λ³λ λ
ΈμΆ (λ€μ λ§μΌμ€ν€μ΄ λ§€μ° κ°κΉμΈ λλ§)
|
|
6266
|
+
try {
|
|
6267
|
+
const ms = _computeMilestones(root);
|
|
6268
|
+
if (ms.next && ms.next.roundsRemaining <= 10 && ms.next.etaDays != null && ms.next.etaDays <= 7) {
|
|
6269
|
+
parts.push(`π― R${ms.next.milestone} ETA ${ms.next.etaDate}`);
|
|
6270
|
+
}
|
|
6271
|
+
} catch {}
|
|
6180
6272
|
}
|
|
6181
6273
|
} catch {}
|
|
6182
6274
|
// 12) 1.9.204: μλ λͺ¨λ νμ± νμ (μ¬μ©μ λͺ
μ) β R-0001 every-round λ£° νμ± μ ν€λλΌμΈ λ
ΈμΆ
|
|
@@ -10143,6 +10235,16 @@ function sessionClose(root, opts = {}) {
|
|
|
10143
10235
|
avgRoundsPerDay: rh.avgRoundsPerDay
|
|
10144
10236
|
};
|
|
10145
10237
|
} catch {}
|
|
10238
|
+
// 1.9.230: milestones ν΅ν© (session close JSON 7λ²μ§Έ ν΅ν© νλ)
|
|
10239
|
+
try {
|
|
10240
|
+
const ms = _computeMilestones(root);
|
|
10241
|
+
jsonResult.milestones = {
|
|
10242
|
+
reachedCount: ms.reached.length,
|
|
10243
|
+
reached: ms.reached.map(m => ({ milestone: m.milestone, version: m.version, reachedAt: m.reachedAt })),
|
|
10244
|
+
next: ms.next,
|
|
10245
|
+
avgRoundsPerDay: ms.avgRoundsPerDay
|
|
10246
|
+
};
|
|
10247
|
+
} catch {}
|
|
10146
10248
|
} catch {}
|
|
10147
10249
|
try {
|
|
10148
10250
|
// 1.9.209: pre-wake-audit μλ μ€ν + μ μ₯ (sleep μ μλ μ κ²)
|
|
@@ -14095,7 +14197,8 @@ function mcpServeCmd(root) {
|
|
|
14095
14197
|
{ 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' } } } },
|
|
14096
14198
|
{ 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' } } } },
|
|
14097
14199
|
{ name: 'leerness_round_history', description: '1.9.226 β μμ¨ λΌμ΄λ ν΅κ³. git tag v1.9.X κΈ°λ° λμ λΌμ΄λ μΉ΄μ΄νΈ + λ€μ λ§μΌμ€ν€ (50/75/100/125/150/175/200/250/300/400/500) + νκ· rounds/day. μλ΅: { currentVersion, roundCount, baselineVersion, latestTags[], nextMilestone, roundsToNextMilestone, firstTagAt, latestTagAt, daysActive, avgRoundsPerDay }. μΈλΆ AIκ° "μ΄ νλ‘μ νΈλ μΌλ§λ μ§νλκ³ λ€μ λ§μΌμ€ν€κΉμ§ λͺ λΌμ΄λ λ¨μλ?"λ₯Ό νμ. μΈμ: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
|
|
14098
|
-
{ name: 'leerness_milestones', description: '1.9.229 (1.9.226 νμ₯) β λλ¬ λ§μΌμ€ν€ + λ€μ ETA. git tag μμ°¨ λΆμμΌλ‘ 25/50/75/100/125/150/175/200/250/300/400/500 λ§μΌμ€ν€ λλ¬ μΌμ + λ€μ λ§μΌμ€ν€ ETA (νμ¬ μλ κΈ°μ€) κ³μ°. μλ΅: { totalRounds, reached: [{milestone, version, reachedAt, daysFromBaseline}], next: {milestone, roundsRemaining, etaDays, etaDate}, baselineAt, avgRoundsPerDay }. μΈλΆ AIκ° "μ§κΈκΉμ§ μ΄λ€ λ§μΌμ€ν€μ μΈμ λ¬μ±νκ³ λ€μ λ§μΌμ€ν€ μμ λλ¬μΌμ?"μ νμ. μΈμ: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
|
|
14200
|
+
{ name: 'leerness_milestones', description: '1.9.229 (1.9.226 νμ₯) β λλ¬ λ§μΌμ€ν€ + λ€μ ETA. git tag μμ°¨ λΆμμΌλ‘ 25/50/75/100/125/150/175/200/250/300/400/500 λ§μΌμ€ν€ λλ¬ μΌμ + λ€μ λ§μΌμ€ν€ ETA (νμ¬ μλ κΈ°μ€) κ³μ°. μλ΅: { totalRounds, reached: [{milestone, version, reachedAt, daysFromBaseline}], next: {milestone, roundsRemaining, etaDays, etaDate}, baselineAt, avgRoundsPerDay }. μΈλΆ AIκ° "μ§κΈκΉμ§ μ΄λ€ λ§μΌμ€ν€μ μΈμ λ¬μ±νκ³ λ€μ λ§μΌμ€ν€ μμ λλ¬μΌμ?"μ νμ. μΈμ: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
|
|
14201
|
+
{ name: 'leerness_pulse', description: '1.9.231 β ν μ€ μ’
ν© μμ½ (10 ν΅μ¬ μ§ν). μλ΅: { version, roundCount, mcpTools, memorySurface, security, health, driftScore, nextMilestone, etaDays, abnormalShutdown }. μΈλΆ AIκ° "leerness μν ν λμ 보기"λ₯Ό κ°λ²Όμ΄ λ¨μΌ νΈμΆλ‘ νμ. handoff λ³΄λ€ 5λ°° λΉ λ¦ (drift/health κ³μ° skip). μΈμ: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
|
|
14099
14202
|
];
|
|
14100
14203
|
|
|
14101
14204
|
function send(obj) {
|
|
@@ -14264,6 +14367,10 @@ function mcpServeCmd(root) {
|
|
|
14264
14367
|
// 1.9.229: λλ¬ λ§μΌμ€ν€ + λ€μ ETA
|
|
14265
14368
|
cliArgs = ['milestones', '--path', targetPath, '--json'];
|
|
14266
14369
|
break;
|
|
14370
|
+
case 'leerness_pulse':
|
|
14371
|
+
// 1.9.231: ν μ€ μ’
ν© μμ½ (10 ν΅μ¬ μ§ν)
|
|
14372
|
+
cliArgs = ['pulse', '--path', targetPath, '--json'];
|
|
14373
|
+
break;
|
|
14267
14374
|
default:
|
|
14268
14375
|
return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
|
|
14269
14376
|
}
|
|
@@ -16474,6 +16581,16 @@ function healthCmd(root) {
|
|
|
16474
16581
|
avgRoundsPerDay: rh.avgRoundsPerDay
|
|
16475
16582
|
};
|
|
16476
16583
|
} catch { out.roundHistory = { error: 'roundHistory μ κ² μ€ν¨' }; }
|
|
16584
|
+
// 1.9.230: health --json milestones ν΅ν© (handoff/session close/health 3 λͺ
λ Ή μΌκ΄μ± μ μ§)
|
|
16585
|
+
try {
|
|
16586
|
+
const ms = _computeMilestones(root);
|
|
16587
|
+
out.milestones = {
|
|
16588
|
+
reachedCount: ms.reached.length,
|
|
16589
|
+
reached: ms.reached.map(m => ({ milestone: m.milestone, version: m.version, reachedAt: m.reachedAt })),
|
|
16590
|
+
next: ms.next,
|
|
16591
|
+
avgRoundsPerDay: ms.avgRoundsPerDay
|
|
16592
|
+
};
|
|
16593
|
+
} catch { out.milestones = { error: 'milestones μ κ² μ€ν¨' }; }
|
|
16477
16594
|
// 1.9.163: 5λ₯λ ₯ λ§€νΈλ¦μ€ μλ νκ° (1.9.155 sub-agent μ κ² β μ½λ κΈ°λ° μλν)
|
|
16478
16595
|
// κ° λ₯λ ₯μ μ½λ grep μΌλ‘ κ²μΆ β 0~100 μ μ. μ¬μ©μκ° λ§€ health νΈμΆ μ leerness μκΈ° νκ° νμΈ.
|
|
16479
16596
|
try {
|
|
@@ -17911,6 +18028,8 @@ async function main() {
|
|
|
17911
18028
|
if (cmd === 'round-history') return roundHistoryCmd(arg('--path', process.cwd()));
|
|
17912
18029
|
// 1.9.229: leerness milestones β λλ¬ λ§μΌμ€ν€ + λ€μ ETA (1.9.226 νμ₯)
|
|
17913
18030
|
if (cmd === 'milestones') return milestonesCmd(arg('--path', process.cwd()));
|
|
18031
|
+
// 1.9.231: leerness pulse β ν μ€ μ’
ν© μμ½ (10 ν΅μ¬ μ§ν)
|
|
18032
|
+
if (cmd === 'pulse') return pulseCmd(arg('--path', process.cwd()));
|
|
17914
18033
|
// 1.9.208: leerness constraints <list|check|add> β νλ«νΌ/API μ μ½ μ¬μ μ²΄ν¬ (μ¬μ©μ λͺ
μ)
|
|
17915
18034
|
if (cmd === 'constraints') return constraintsCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
|
|
17916
18035
|
// 1.9.209: leerness pre-wake-audit β sleep μ sub-agent audit (μ¬μ©μ λͺ
μ)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.231",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|