leerness 1.9.230 β 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 +30 -0
- package/README.md +3 -3
- package/bin/harness.js +83 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
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
|
+
|
|
3
33
|
## 1.9.230 β 2026-05-23
|
|
4
34
|
|
|
5
35
|
**π handoff/session close/health --json milestones ν΅ν© (7 νλ μμ±) + ν€λλΌμΈ 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;
|
|
@@ -14123,7 +14197,8 @@ function mcpServeCmd(root) {
|
|
|
14123
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' } } } },
|
|
14124
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' } } } },
|
|
14125
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' } } } },
|
|
14126
|
-
{ 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' } } } }
|
|
14127
14202
|
];
|
|
14128
14203
|
|
|
14129
14204
|
function send(obj) {
|
|
@@ -14292,6 +14367,10 @@ function mcpServeCmd(root) {
|
|
|
14292
14367
|
// 1.9.229: λλ¬ λ§μΌμ€ν€ + λ€μ ETA
|
|
14293
14368
|
cliArgs = ['milestones', '--path', targetPath, '--json'];
|
|
14294
14369
|
break;
|
|
14370
|
+
case 'leerness_pulse':
|
|
14371
|
+
// 1.9.231: ν μ€ μ’
ν© μμ½ (10 ν΅μ¬ μ§ν)
|
|
14372
|
+
cliArgs = ['pulse', '--path', targetPath, '--json'];
|
|
14373
|
+
break;
|
|
14295
14374
|
default:
|
|
14296
14375
|
return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
|
|
14297
14376
|
}
|
|
@@ -17949,6 +18028,8 @@ async function main() {
|
|
|
17949
18028
|
if (cmd === 'round-history') return roundHistoryCmd(arg('--path', process.cwd()));
|
|
17950
18029
|
// 1.9.229: leerness milestones β λλ¬ λ§μΌμ€ν€ + λ€μ ETA (1.9.226 νμ₯)
|
|
17951
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()));
|
|
17952
18033
|
// 1.9.208: leerness constraints <list|check|add> β νλ«νΌ/API μ μ½ μ¬μ μ²΄ν¬ (μ¬μ©μ λͺ
μ)
|
|
17953
18034
|
if (cmd === 'constraints') return constraintsCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
|
|
17954
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",
|