leerness 1.9.224 β 1.9.226
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 +74 -0
- package/README.md +3 -3
- package/bin/harness.js +137 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,79 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.226 β 2026-05-23
|
|
4
|
+
|
|
5
|
+
**π round-history CLI + handoff ν€λλΌμΈ λΌμ΄λ μΉ΄μ΄ν° + MCP 62λ²μ§Έ λꡬ.**
|
|
6
|
+
|
|
7
|
+
### 1. `leerness round-history` μ λͺ
λ Ή β μμ¨ λΌμ΄λ ν΅κ³
|
|
8
|
+
- git tag `v1.9.X` κΈ°λ° λμ λΌμ΄λ μΉ΄μ΄νΈ (graceful fallback: git μμΌλ©΄ 0)
|
|
9
|
+
- μλ΅: `{ currentVersion, roundCount, baselineVersion, latestTags[], nextMilestone, roundsToNextMilestone, firstTagAt, latestTagAt, daysActive, avgRoundsPerDay }`
|
|
10
|
+
- λ§μΌμ€ν€ μλ κ°μ§: 50/75/100/125/150/175/200/250/300/400/500
|
|
11
|
+
- `--json` μ΅μ
(μΈλΆ μλν)
|
|
12
|
+
|
|
13
|
+
### 2. handoff ν€λλΌμΈ 17λ²μ§Έ μμ
|
|
14
|
+
- 5 λΌμ΄λ μ΄μ λμ μ `π R<N>` μλ λ
ΈμΆ
|
|
15
|
+
- λ€μ λ§μΌμ€ν€μ΄ 20 λΌμ΄λ μ΄λ΄μΌ λ: `π R182 β R200 (18R λ¨μ)` κ°μ‘°
|
|
16
|
+
- μμ¨ λͺ¨λ μ§νλ νλμ
|
|
17
|
+
|
|
18
|
+
### 3. MCP 62λ²μ§Έ λꡬ β `leerness_round_history`
|
|
19
|
+
- μΈλΆ AIκ° "μ΄ νλ‘μ νΈλ μΌλ§λ μ§νλκ³ λ€μ λ§μΌμ€ν€κΉμ§ λͺ λΌμ΄λ λ¨μλ?"λ₯Ό νμ
|
|
20
|
+
- MCP 61 β 62 (+1)
|
|
21
|
+
|
|
22
|
+
### 4. μ€ μΈ‘μ (leerness μ체 νλ‘μ νΈ)
|
|
23
|
+
- λμ λΌμ΄λ: **182R** (baseline v1.9.6 β v1.9.225)
|
|
24
|
+
- νλ κΈ°κ°: 14μΌ / νκ· **13 rounds/day**
|
|
25
|
+
- λ€μ λ§μΌμ€ν€: **R200 (18 λΌμ΄λ λ¨μ)**
|
|
26
|
+
|
|
27
|
+
### 5. λμ νκ· (1.9.207~225) β λͺ¨λ μ μ§
|
|
28
|
+
|
|
29
|
+
### 6. stress-v171 β 16/16 PASS
|
|
30
|
+
- 1.9.226 (7): VERSION + round-history CLI + --json + git μλ fallback + handoff ν€λλΌμΈ + MCP 62 λ±λ‘ + MCP μ€ νΈμΆ
|
|
31
|
+
- μ±λ₯ (2): cold_start avg 336ms / round-history 535ms
|
|
32
|
+
- λμ νκ· (7): 1.9.207~225
|
|
33
|
+
|
|
34
|
+
### 7. μλ release (88 λΌμ΄λ main-push streak Β· 49 λΌμ΄λ npm publish streak)
|
|
35
|
+
|
|
36
|
+
π **μμ¨ λΌμ΄λ μ§νλ κ°μν** β handoff ν μ€μμ λ§μΌμ€ν€ μμΈ‘ κ°λ₯
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## 1.9.225 β 2026-05-22
|
|
41
|
+
|
|
42
|
+
**π§ drift check --auto-fix delivered ν΅ν© + LEERNESS_AUTO_APPLY_DELIVERED env opt-in.**
|
|
43
|
+
|
|
44
|
+
### 1. `drift check --auto-fix` delivered ν¨ν΄ μλ μ μ© (1.9.82 ν¨ν΄ νμ₯)
|
|
45
|
+
- 1.9.82 보μ μ νΈ β audit --fix μλ νΈμΆ ν¨ν΄μ delivered μμ€ν
μλ μ μ©
|
|
46
|
+
- `--auto-fix` νλκ·Έ μ¬μ© μ `_detectDeliveredRequests` β ν보 μλ μλ£
|
|
47
|
+
- `autoCompleteReason: 'drift-auto-fix-1.9.225'` μΆμ
|
|
48
|
+
- drift score κ°μ€μΉ κ°μ§ λ―Έλ΅ μ νΈ μ κ±° β drift ν볡 μμ±λ ν₯μ
|
|
49
|
+
|
|
50
|
+
### 2. `LEERNESS_AUTO_APPLY_DELIVERED=1` env opt-in (μμ¨ λͺ¨λμ©)
|
|
51
|
+
- handoff 첫 νΈμΆ μ μλ μ μ© (`autoCompleteReason: 'env-auto-apply-1.9.225'`)
|
|
52
|
+
- μμ¨ λͺ¨λμμ λ§€ λΌμ΄λλ§λ€ μλ μ 리 β AIκ° μ κ²½ μΈ νμ X
|
|
53
|
+
- env λ―Έμ€μ μ κΈ°μ‘΄ λμ (μλ΄λ§)
|
|
54
|
+
|
|
55
|
+
### 3. handoff λ³Έλ¬Έ κ°μ΄λ μΆκ°
|
|
56
|
+
- 1.9.224 λ³Έλ¬Έ μΉμ
μ `β μμ¨ λͺ¨λ μλ μ μ©: export LEERNESS_AUTO_APPLY_DELIVERED=1` μλ΄
|
|
57
|
+
- μ¬μ©μκ° μμ¨ λͺ¨λ opt-in λ°κ²¬νκΈ° μ½κ²
|
|
58
|
+
|
|
59
|
+
### 4. μ¬μ©μ μμ² μλ μλ£ μμ€ν
β 4 λΌμ΄λ λμ μμ±
|
|
60
|
+
- 1.9.223 CLI auto-complete (μλ νΈμΆ)
|
|
61
|
+
- 1.9.224 MCP 61 + handoff λ³Έλ¬Έ + session close μλ μ μ©
|
|
62
|
+
- 1.9.225 drift --auto-fix ν΅ν© + env opt-in μλν
|
|
63
|
+
|
|
64
|
+
### 5. λμ νκ· (1.9.207~224) β λͺ¨λ μ μ§
|
|
65
|
+
|
|
66
|
+
### 6. stress-v170 β 14/14 PASS
|
|
67
|
+
- 1.9.225 (5): VERSION + drift auto-fix ν΅ν© + drift κΈ°λ³Έ 보쑴 + env auto-apply + env μμΌλ©΄ λ―Έμ μ©
|
|
68
|
+
- μ±λ₯ (2): cold_start avg 367ms / drift auto-fix 383ms
|
|
69
|
+
- λμ νκ· (7): 1.9.207~224
|
|
70
|
+
|
|
71
|
+
### 7. μλ release (87 λΌμ΄λ main-push streak Β· 48 λΌμ΄λ npm publish streak)
|
|
72
|
+
|
|
73
|
+
π§ **drift ν볡 μμ€ν
λμ κ°ν** (1.9.39/82/225 β 3 λΌμ΄λ)
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
3
77
|
## 1.9.224 β 2026-05-22
|
|
4
78
|
|
|
5
79
|
**π MCP 61 λꡬ (leerness_requests_auto_complete) + handoff λ³Έλ¬Έ + session close --auto-apply-delivered.**
|
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.226 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π round-history CLI + handoff R182 β R200 λ§μΌμ€ν€ β
|
|
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.226';
|
|
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 μ²λ¦¬).
|
|
@@ -2054,6 +2054,84 @@ function _compareSemver(a, b) {
|
|
|
2054
2054
|
return 0;
|
|
2055
2055
|
}
|
|
2056
2056
|
|
|
2057
|
+
// 1.9.226: round-history β git tag v1.9.X κΈ°λ° μμ¨ λΌμ΄λ ν΅κ³ + λ€μ λ§μΌμ€ν€
|
|
2058
|
+
// gitμ΄ μκ±°λ tagκ° μμΌλ©΄ graceful fallback (current version + 0 history)
|
|
2059
|
+
// μλ΅: { currentVersion, roundCount, baselineVersion, latestTags[], nextMilestone, roundsToNextMilestone, firstTagAt, latestTagAt, daysActive, avgRoundsPerDay }
|
|
2060
|
+
function _computeRoundHistory(root) {
|
|
2061
|
+
const result = {
|
|
2062
|
+
currentVersion: VERSION,
|
|
2063
|
+
roundCount: 0,
|
|
2064
|
+
baselineVersion: null,
|
|
2065
|
+
latestTags: [],
|
|
2066
|
+
nextMilestone: null,
|
|
2067
|
+
roundsToNextMilestone: null,
|
|
2068
|
+
firstTagAt: null,
|
|
2069
|
+
latestTagAt: null,
|
|
2070
|
+
daysActive: 0,
|
|
2071
|
+
avgRoundsPerDay: 0
|
|
2072
|
+
};
|
|
2073
|
+
try {
|
|
2074
|
+
// git tag --list 'v1.9.*' --sort=creatordate (μκ°μ)
|
|
2075
|
+
const r = cp.spawnSync('git', ['tag', '--list', 'v1.9.*', '--sort=creatordate', '--format=%(refname:short)|%(creatordate:iso8601)'], {
|
|
2076
|
+
cwd: root, encoding: 'utf8', timeout: 5000
|
|
2077
|
+
});
|
|
2078
|
+
if (r.status !== 0 || !r.stdout) return result;
|
|
2079
|
+
const lines = r.stdout.split('\n').filter(l => l.trim() && /^v\d+\.\d+\.\d+\|/.test(l));
|
|
2080
|
+
if (lines.length === 0) return result;
|
|
2081
|
+
const tags = lines.map(l => {
|
|
2082
|
+
const [name, date] = l.split('|');
|
|
2083
|
+
return { name: name.trim(), version: name.replace(/^v/, '').trim(), date: date.trim() };
|
|
2084
|
+
});
|
|
2085
|
+
result.roundCount = tags.length;
|
|
2086
|
+
result.baselineVersion = tags[0].version;
|
|
2087
|
+
result.firstTagAt = tags[0].date;
|
|
2088
|
+
result.latestTagAt = tags[tags.length - 1].date;
|
|
2089
|
+
// μ΅κ·Ό 10κ°
|
|
2090
|
+
result.latestTags = tags.slice(-10).reverse().map(t => ({ version: t.version, date: t.date.split('T')[0] }));
|
|
2091
|
+
// λ€μ λ§μΌμ€ν€ (50/100/150/200/300/...)
|
|
2092
|
+
const milestones = [50, 75, 100, 125, 150, 175, 200, 250, 300, 400, 500];
|
|
2093
|
+
const next = milestones.find(m => m > result.roundCount);
|
|
2094
|
+
if (next != null) {
|
|
2095
|
+
result.nextMilestone = next;
|
|
2096
|
+
result.roundsToNextMilestone = next - result.roundCount;
|
|
2097
|
+
}
|
|
2098
|
+
// μΌμΌ νκ·
|
|
2099
|
+
const first = new Date(result.firstTagAt).getTime();
|
|
2100
|
+
const last = new Date(result.latestTagAt).getTime();
|
|
2101
|
+
const days = Math.max(1, Math.floor((last - first) / 86400000));
|
|
2102
|
+
result.daysActive = days;
|
|
2103
|
+
result.avgRoundsPerDay = Math.round((result.roundCount / days) * 100) / 100;
|
|
2104
|
+
} catch {}
|
|
2105
|
+
return result;
|
|
2106
|
+
}
|
|
2107
|
+
|
|
2108
|
+
function roundHistoryCmd(root) {
|
|
2109
|
+
root = absRoot(root);
|
|
2110
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
2111
|
+
const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
2112
|
+
const gr = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
|
|
2113
|
+
const yl = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
2114
|
+
const dm = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
2115
|
+
const data = _computeRoundHistory(root);
|
|
2116
|
+
if (has('--json')) { log(JSON.stringify(data, null, 2)); return; }
|
|
2117
|
+
log(cy(`# leerness round-history (1.9.226) β μμ¨ λΌμ΄λ ν΅κ³`));
|
|
2118
|
+
log('');
|
|
2119
|
+
log(` π¦ νμ¬ λ²μ : ${gr(data.currentVersion)}`);
|
|
2120
|
+
log(` π λμ λΌμ΄λ: ${gr(String(data.roundCount))}`);
|
|
2121
|
+
if (data.baselineVersion) log(` π baseline: v${data.baselineVersion} (${(data.firstTagAt || '').split('T')[0]})`);
|
|
2122
|
+
if (data.latestTagAt) log(` β° μ΅κ·Ό tag: ${(data.latestTagAt || '').split('T')[0]}`);
|
|
2123
|
+
if (data.daysActive > 0) log(` π νλ: ${data.daysActive}μΌ / νκ· ${gr(data.avgRoundsPerDay + ' rounds/day')}`);
|
|
2124
|
+
log('');
|
|
2125
|
+
if (data.nextMilestone != null) {
|
|
2126
|
+
log(yl(` π― λ€μ λ§μΌμ€ν€: R${data.nextMilestone} (${data.roundsToNextMilestone} λΌμ΄λ λ¨μ)`));
|
|
2127
|
+
} else {
|
|
2128
|
+
log(gr(` π λͺ¨λ λ§μΌμ€ν€ λ¬μ± (500+)`));
|
|
2129
|
+
}
|
|
2130
|
+
log('');
|
|
2131
|
+
log(` μ΅κ·Ό 10 tags:`);
|
|
2132
|
+
data.latestTags.forEach(t => log(` β’ v${t.version} (${t.date})`));
|
|
2133
|
+
}
|
|
2134
|
+
|
|
2057
2135
|
// 1.9.208: νλ«νΌ/API μ μ½ μ¬μ μ²΄ν¬ (μ¬μ©μ λͺ
μ)
|
|
2058
2136
|
// "μ¬μ©μμ λͺ
λ Ήμ λ°μΌλ©΄, κ³ λ €ν΄μΌνλ λΆλΆμ λ¨Όμ νμΈνκ³ μ§ννκ² νλ©΄ μ΄λ¨μ§"
|
|
2059
2137
|
// "νΉμ νλ«νΌμ API ... νΈμΆμλκ° μ΄λΉ 5ν μ΄νλ‘λ§ ν΄μΌνλ€λ κ·μ μ λ¨Όμ νμΈ"
|
|
@@ -5987,6 +6065,17 @@ function handoff(root) {
|
|
|
5987
6065
|
parts.push(`π official ${m.total}/${m.cacheTotal} (${ageStr}${status})`);
|
|
5988
6066
|
}
|
|
5989
6067
|
} catch {}
|
|
6068
|
+
// 17) 1.9.226: round-history ν€λλΌμΈ β μμ¨ λΌμ΄λ μΉ΄μ΄ν° + λ€μ λ§μΌμ€ν€ (5 λΌμ΄λ μ΄μ μλ§ νμ)
|
|
6069
|
+
try {
|
|
6070
|
+
const rh = _computeRoundHistory(root);
|
|
6071
|
+
if (rh.roundCount >= 5) {
|
|
6072
|
+
let label = `π R${rh.roundCount}`;
|
|
6073
|
+
if (rh.nextMilestone != null && rh.roundsToNextMilestone <= 20) {
|
|
6074
|
+
label += ` β R${rh.nextMilestone} (${rh.roundsToNextMilestone}R λ¨μ)`;
|
|
6075
|
+
}
|
|
6076
|
+
parts.push(label);
|
|
6077
|
+
}
|
|
6078
|
+
} catch {}
|
|
5990
6079
|
// 12) 1.9.204: μλ λͺ¨λ νμ± νμ (μ¬μ©μ λͺ
μ) β R-0001 every-round λ£° νμ± μ ν€λλΌμΈ λ
ΈμΆ
|
|
5991
6080
|
try {
|
|
5992
6081
|
const autoRule = _getAutoLoopRule(root);
|
|
@@ -6141,8 +6230,25 @@ function handoff(root) {
|
|
|
6141
6230
|
|
|
6142
6231
|
// 1.9.224: handoff λ³Έλ¬Έ μλ λ
ΈμΆ β delivered ν¨ν΄ ν보 β₯ 1건 μ (1.9.223 νμ₯)
|
|
6143
6232
|
// "Round X.Y.Z β ꡬν μλ£" ν¨ν΄μ΄ λμ λλ©΄ λ³Έλ¬Έ μΉμ
μΌλ‘ μλ μλ΄ (ν€λλΌμΈλ§μΌλ‘λ λμΉκΈ° μ¬μ)
|
|
6233
|
+
// 1.9.225: LEERNESS_AUTO_APPLY_DELIVERED=1 env νμ± μ handoff 첫 νΈμΆμμ μλ μ μ© (μμ¨ λͺ¨λμ© opt-in)
|
|
6144
6234
|
try {
|
|
6145
|
-
|
|
6235
|
+
let delivered = _detectDeliveredRequests(root);
|
|
6236
|
+
const envAutoApply = process.env.LEERNESS_AUTO_APPLY_DELIVERED === '1';
|
|
6237
|
+
if (envAutoApply && delivered.candidates && delivered.candidates.length > 0) {
|
|
6238
|
+
let appliedCnt = 0;
|
|
6239
|
+
for (const c of delivered.candidates) {
|
|
6240
|
+
const u = _updateUserRequest(root, c.id, { status: 'completed', autoCompletedAt: new Date().toISOString(), autoCompleteReason: 'env-auto-apply-1.9.225' });
|
|
6241
|
+
if (u) appliedCnt++;
|
|
6242
|
+
}
|
|
6243
|
+
if (appliedCnt > 0) {
|
|
6244
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
6245
|
+
const gr5 = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
|
|
6246
|
+
log('');
|
|
6247
|
+
log(gr5(`## π₯ μ¬μ©μ μμ² μλ μλ£ (1.9.225, env LEERNESS_AUTO_APPLY_DELIVERED=1, ${appliedCnt}건)`));
|
|
6248
|
+
// μ μ© ν μ¬μ‘°ν
|
|
6249
|
+
delivered = _detectDeliveredRequests(root);
|
|
6250
|
+
}
|
|
6251
|
+
}
|
|
6146
6252
|
if (delivered.candidates && delivered.candidates.length > 0) {
|
|
6147
6253
|
const isTty = process.stdout && process.stdout.isTTY;
|
|
6148
6254
|
const cy4 = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
@@ -6158,6 +6264,7 @@ function handoff(root) {
|
|
|
6158
6264
|
}
|
|
6159
6265
|
log(dm4(` β κ²ν : leerness requests auto-complete`));
|
|
6160
6266
|
log(dm4(` β μ μ©: leerness requests auto-complete --apply (μμ μ 리)`));
|
|
6267
|
+
log(dm4(` β μμ¨ λͺ¨λ μλ μ μ©: export LEERNESS_AUTO_APPLY_DELIVERED=1 (1.9.225)`));
|
|
6161
6268
|
}
|
|
6162
6269
|
} catch {}
|
|
6163
6270
|
|
|
@@ -12867,6 +12974,26 @@ function driftCheckCmd(root, opts = {}) {
|
|
|
12867
12974
|
log(`β auto-fix 보μ ν볡 μ€λ₯: ${e.message}`);
|
|
12868
12975
|
}
|
|
12869
12976
|
}
|
|
12977
|
+
// 1.9.225: drift check --auto-fix μ delivered ν¨ν΄ μλ μ μ© ν΅ν© (1.9.223/224 μμ€ν
νμ)
|
|
12978
|
+
// μ¬μ©μ μμ²μ "ꡬν μλ£" ν¨ν΄μ΄ λμ λλ©΄ κ°μ§ λ―Έλ΅ μ νΈκ° drift score λ₯Ό κ°μ€μν¬ μ μμ β μλ μ 리.
|
|
12979
|
+
// 1.9.82 audit --fix ν¨ν΄κ³Ό λμΌ: --auto-fix μ μ¦μ μ μ©, μ μ© ν μ¬κ²μ¬.
|
|
12980
|
+
if (autoFix) {
|
|
12981
|
+
try {
|
|
12982
|
+
const delivered = _detectDeliveredRequests(root);
|
|
12983
|
+
if (delivered.candidates && delivered.candidates.length > 0) {
|
|
12984
|
+
log('');
|
|
12985
|
+
log(`π₯ --auto-fix νμ± (1.9.225) β delivered ν¨ν΄ ${delivered.candidates.length}건 μλ μλ£ μ€...`);
|
|
12986
|
+
let ok = 0;
|
|
12987
|
+
for (const c of delivered.candidates) {
|
|
12988
|
+
const u = _updateUserRequest(root, c.id, { status: 'completed', autoCompletedAt: new Date().toISOString(), autoCompleteReason: 'drift-auto-fix-1.9.225' });
|
|
12989
|
+
if (u) ok++;
|
|
12990
|
+
}
|
|
12991
|
+
log(`β delivered μλ μλ£ ${ok}/${delivered.candidates.length}건`);
|
|
12992
|
+
}
|
|
12993
|
+
} catch (e) {
|
|
12994
|
+
log(`β delivered auto-apply μ€λ₯ (1.9.225): ${e.message}`);
|
|
12995
|
+
}
|
|
12996
|
+
}
|
|
12870
12997
|
if (autoFix && level === 'π΄ critical' && !hasSecurityFired) {
|
|
12871
12998
|
log('');
|
|
12872
12999
|
log(`π§ --auto-fix νμ± β session close μλ μ€ν μ€...`);
|
|
@@ -13851,7 +13978,8 @@ function mcpServeCmd(root) {
|
|
|
13851
13978
|
{ 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'] } },
|
|
13852
13979
|
{ 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' } } } },
|
|
13853
13980
|
{ 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' } } } }
|
|
13981
|
+
{ 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' } } } },
|
|
13982
|
+
{ 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' } } } }
|
|
13855
13983
|
];
|
|
13856
13984
|
|
|
13857
13985
|
function send(obj) {
|
|
@@ -14012,6 +14140,10 @@ function mcpServeCmd(root) {
|
|
|
14012
14140
|
cliArgs = ['requests', 'auto-complete', '--path', targetPath, '--json'];
|
|
14013
14141
|
if (args.apply === true) cliArgs.push('--apply');
|
|
14014
14142
|
break;
|
|
14143
|
+
case 'leerness_round_history':
|
|
14144
|
+
// 1.9.226: μμ¨ λΌμ΄λ ν΅κ³ + λ€μ λ§μΌμ€ν€
|
|
14145
|
+
cliArgs = ['round-history', '--path', targetPath, '--json'];
|
|
14146
|
+
break;
|
|
14015
14147
|
default:
|
|
14016
14148
|
return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
|
|
14017
14149
|
}
|
|
@@ -17643,6 +17775,8 @@ async function main() {
|
|
|
17643
17775
|
if (cmd === 'requests') return requestsCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
|
|
17644
17776
|
// 1.9.220: leerness session-resume β λΉμ μ μ’
λ£ κ°μ§ + μμ¨ μ¬κ° κ°μ΄λ (μ¬μ©μ λͺ
μ)
|
|
17645
17777
|
if (cmd === 'session-resume') return sessionResumeCmd(arg('--path', process.cwd()));
|
|
17778
|
+
// 1.9.226: leerness round-history β μμ¨ λΌμ΄λ ν΅κ³ + λ€μ λ§μΌμ€ν€
|
|
17779
|
+
if (cmd === 'round-history') return roundHistoryCmd(arg('--path', process.cwd()));
|
|
17646
17780
|
// 1.9.208: leerness constraints <list|check|add> β νλ«νΌ/API μ μ½ μ¬μ μ²΄ν¬ (μ¬μ©μ λͺ
μ)
|
|
17647
17781
|
if (cmd === 'constraints') return constraintsCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
|
|
17648
17782
|
// 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.226",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|