leerness 1.9.234 β 1.9.236
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 +70 -0
- package/README.md +3 -3
- package/bin/harness.js +137 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,75 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.236 β 2026-05-24
|
|
4
|
+
|
|
5
|
+
**π MCP 66λ²μ§Έ λꡬ (release_cleanup) + drift check --auto-fix ν΅ν© (50+ branches μλ μ 리).**
|
|
6
|
+
|
|
7
|
+
### 1. MCP 66λ²μ§Έ λꡬ β `leerness_release_cleanup`
|
|
8
|
+
- 1.9.235 release cleanup CLI λ₯Ό μΈλΆ AI μ λ
ΈμΆ
|
|
9
|
+
- μΈμ: `{ path?, apply? (default false), keep? (default 5) }`
|
|
10
|
+
- μλ΅: `{ apply, keep, total, merged, unmerged, deleteCount, toDelete[], recent[], unmergedSample[] }`
|
|
11
|
+
- MCP 65 β **66** (+1)
|
|
12
|
+
|
|
13
|
+
### 2. `drift check --auto-fix` release cleanup ν΅ν© (1.9.82/225 ν¨ν΄ νμ₯)
|
|
14
|
+
- merged `release/*` branches 50κ° μ΄κ³Ό μ μλ μ 리
|
|
15
|
+
- μμ : keep 10 (μ΅κ·Ό 10κ° μ μ§), merged λ§ μμ (unmerged 보νΈ)
|
|
16
|
+
- 1.9.82 audit --fix β 1.9.225 delivered β 1.9.236 release cleanup (3 λΌμ΄λ λμ )
|
|
17
|
+
|
|
18
|
+
### 3. drift ν볡 μμ€ν
νμ₯ λ§€νΈλ¦μ€ (4 μλ ν볡 ν΅ν©)
|
|
19
|
+
| λΌμ΄λ | μ νΈ | μλ ν볡 |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| 1.9.39 | critical | session close μλ |
|
|
22
|
+
| 1.9.82 | 보μ | audit --fix |
|
|
23
|
+
| 1.9.225 | delivered | requests μλ μλ£ |
|
|
24
|
+
| **1.9.236** | **release-branch** | **release cleanup --keep 10** β |
|
|
25
|
+
|
|
26
|
+
### 4. λμ νκ· (1.9.207~235) β λͺ¨λ μ μ§
|
|
27
|
+
|
|
28
|
+
### 5. stress-v181 β 15/15 PASS
|
|
29
|
+
- 1.9.236 (5): VERSION + MCP 66 λ±λ‘ + μ€ νΈμΆ + keep νλΌλ―Έν° + drift ν΅ν© μ½λ
|
|
30
|
+
- μ±λ₯ (2): cold_start avg 389ms / MCP 66 tools/list 363ms
|
|
31
|
+
- λμ νκ· (8): 1.9.207~235
|
|
32
|
+
|
|
33
|
+
### 6. μλ release (98 λΌμ΄λ main-push streak Β· 59 λΌμ΄λ npm publish streak)
|
|
34
|
+
|
|
35
|
+
π **drift μλ ν볡 4 ν΅ν©** β leerness κ° μ€μ€λ‘ λμ νκΈ°λ¬Ό μ 리
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## 1.9.235 β 2026-05-23
|
|
40
|
+
|
|
41
|
+
**π leerness release cleanup CLI β local release/* branches μ 리 + --keep BUG fix.**
|
|
42
|
+
|
|
43
|
+
### 1. `leerness release cleanup` μ λͺ
λ Ή
|
|
44
|
+
- local `release/*` branches μ€ main μ mergeλ κ² μλ μ 리
|
|
45
|
+
- κΈ°λ³Έ dry-run (λͺ©λ‘λ§), `--apply` λͺ
μ μ μ€ μμ
|
|
46
|
+
- `--keep N` (default 5) β μ΅κ·Ό Nκ° μ μ§
|
|
47
|
+
- μμ κ°λ: merged λ§ μμ , unmerged 보νΈ, νμ¬ branch 보νΈ
|
|
48
|
+
- `--json` μ΅μ
|
|
49
|
+
|
|
50
|
+
### 2. μ€ μΈ‘μ β leerness μ체 λμ 191κ°
|
|
51
|
+
- merged: 191κ° / unmerged: 0κ°
|
|
52
|
+
- keep 5 β μμ ν보 186κ° (1.9.6~229)
|
|
53
|
+
- μ μ§: 1.9.234, 1.9.233, 1.9.232, 1.9.231, 1.9.230 (top 5 μ΅μ )
|
|
54
|
+
- handoff abnormal-shutdown `release-branch-pending` μ νΈ κ°μ€μΉ ν΄μ κ°λ₯
|
|
55
|
+
|
|
56
|
+
### 3. π `--keep` νλκ·Έ nonFlagArgs λ±λ‘ (BUG fix)
|
|
57
|
+
- κΈ°μ‘΄: `--keep 10`μ `10`μ΄ non-flag arg λ‘ μλͺ» λΆλ₯ β root μΈμ λ¨
|
|
58
|
+
- 1.9.235 fix: `withValue.Set` μ `--keep` μΆκ° β μ μ μΈμ
|
|
59
|
+
|
|
60
|
+
### 4. λμ νκ· (1.9.207~234) β λͺ¨λ μ μ§
|
|
61
|
+
|
|
62
|
+
### 5. stress-v180 β 16/16 PASS
|
|
63
|
+
- 1.9.235 (7): VERSION + dry-run + --keep + μ λ ¬ + μμ κ°λ + git fallback + human μΆλ ₯
|
|
64
|
+
- μ±λ₯ (2): cold_start avg 353ms / release cleanup 701ms
|
|
65
|
+
- λμ νκ· (7): 1.9.207~234
|
|
66
|
+
|
|
67
|
+
### 6. μλ release (97 λΌμ΄λ main-push streak Β· 58 λΌμ΄λ npm publish streak)
|
|
68
|
+
|
|
69
|
+
π **μ΄μ λμ μ 리 μμ€ν
** β 191 branches λμ β 5κ° μ μ§ κ°λ₯ (handoff μ νΈ ν΄μ)
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
3
73
|
## 1.9.234 β 2026-05-23
|
|
4
74
|
|
|
5
75
|
**π handoff/session close/health --json recentChanges ν΅ν© (8 νλ μμ±) β μΈλΆ AI μ΅κ·Ό 5 λΌμ΄λ μ¦μ μΈμ§.**
|
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.236 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π MCP 66 Β· drift --auto-fix 4 ν΅ν© (release cleanup) β
|
|
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.236';
|
|
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 μ²λ¦¬).
|
|
@@ -180,7 +180,7 @@ function arg(name, def = null) { const i = process.argv.indexOf(name); return i
|
|
|
180
180
|
function has(name) { return process.argv.includes(name); }
|
|
181
181
|
function nonFlagArgs() {
|
|
182
182
|
const out = [];
|
|
183
|
-
const withValue = new Set(['--language','--skills','--path','--status','--progress','--goal','--reason','--next','--target','--token-env','--package','--out','--from','--repo','--id','--note','--evidence','--query','--limit','--action','--agent','--tool','--doc','--command','--capability','--before','--after','--display','--threshold','--trigger','--check','--set','--min-score','--include','--days','--gh-pages-src','--roadmap','--since','--agents','--model','--timeout','--retry-on-fail','--label','--score','--tokens','--alternatives','--impact','--tag','--surface','--depends-on','--affects','--co-changes-with','--files','--branch','--remote','--task-add','--next-action','--role','--provider','--env-var','--deploy','--token-lifetime-hours','--port','--secret']);
|
|
183
|
+
const withValue = new Set(['--language','--skills','--path','--status','--progress','--goal','--reason','--next','--target','--token-env','--package','--out','--from','--repo','--id','--note','--evidence','--query','--limit','--action','--agent','--tool','--doc','--command','--capability','--before','--after','--display','--threshold','--trigger','--check','--set','--min-score','--include','--days','--gh-pages-src','--roadmap','--since','--agents','--model','--timeout','--retry-on-fail','--label','--score','--tokens','--alternatives','--impact','--tag','--surface','--depends-on','--affects','--co-changes-with','--files','--branch','--remote','--task-add','--next-action','--role','--provider','--env-var','--deploy','--token-lifetime-hours','--port','--secret','--keep']);
|
|
184
184
|
const a = process.argv.slice(2);
|
|
185
185
|
for (let i = 0; i < a.length; i++) {
|
|
186
186
|
const x = a[i];
|
|
@@ -12156,6 +12156,95 @@ function releaseSyncMainCmd(root) {
|
|
|
12156
12156
|
}
|
|
12157
12157
|
}
|
|
12158
12158
|
|
|
12159
|
+
// 1.9.235: leerness release cleanup β local release/* branches μ 리 (main μ mergeλ κ²)
|
|
12160
|
+
// λ¬Έμ : λ§€ λΌμ΄λ release/X.Y.Z κ° λμ β handoff abnormal-shutdown release-branch-pending μ νΈ κ°μ€
|
|
12161
|
+
// κΈ°λ³Έ: dry-run (μμ ν보 νμ) Β· --apply λͺ
μ μ μ€ μμ Β· --keep N (μ΅κ·Ό Nκ° μ μ§, default 5)
|
|
12162
|
+
// μμ : main μ mergeλμ§ μμ branch λ μ λ μμ X Β· νμ¬ branch λ 보νΈ
|
|
12163
|
+
function releaseCleanupCmd(root) {
|
|
12164
|
+
root = absRoot(root || process.cwd());
|
|
12165
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
12166
|
+
const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
12167
|
+
const gr = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
|
|
12168
|
+
const yl = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
12169
|
+
const rd = s => isTty ? `\x1b[31m${s}\x1b[0m` : s;
|
|
12170
|
+
const dm = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
12171
|
+
const apply = has('--apply');
|
|
12172
|
+
const keep = parseInt(arg('--keep', '5'), 10) || 5;
|
|
12173
|
+
// 1) git μ μ₯μ νμΈ
|
|
12174
|
+
const headR = cp.spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: root, encoding: 'utf8' });
|
|
12175
|
+
if (headR.status !== 0) {
|
|
12176
|
+
log(rd('# leerness release cleanup (1.9.235) β git μ μ₯μ μλ'));
|
|
12177
|
+
return;
|
|
12178
|
+
}
|
|
12179
|
+
const currentBranch = (headR.stdout || '').trim();
|
|
12180
|
+
// 2) local release/* branches + merged μν νμ
|
|
12181
|
+
const branchR = cp.spawnSync('git', ['branch', '--merged', 'main', '--list', 'release/*'], { cwd: root, encoding: 'utf8' });
|
|
12182
|
+
const mergedBranches = (branchR.stdout || '').split('\n')
|
|
12183
|
+
.map(l => l.replace(/^\*?\s+/, '').trim())
|
|
12184
|
+
.filter(l => l && /^release\/\d+\.\d+\.\d+$/.test(l));
|
|
12185
|
+
// 3) λͺ¨λ release/* λ νμ (unmerged λΆμμ©)
|
|
12186
|
+
const allR = cp.spawnSync('git', ['branch', '--list', 'release/*'], { cwd: root, encoding: 'utf8' });
|
|
12187
|
+
const allBranches = (allR.stdout || '').split('\n')
|
|
12188
|
+
.map(l => l.replace(/^\*?\s+/, '').trim())
|
|
12189
|
+
.filter(l => l && /^release\/\d+\.\d+\.\d+$/.test(l));
|
|
12190
|
+
const unmergedBranches = allBranches.filter(b => !mergedBranches.includes(b));
|
|
12191
|
+
// 4) μ λ ¬ (semver desc) + keep N + νμ¬ branch μ μΈ
|
|
12192
|
+
mergedBranches.sort((a, b) => {
|
|
12193
|
+
const va = a.replace('release/', '').split('.').map(n => parseInt(n, 10) || 0);
|
|
12194
|
+
const vb = b.replace('release/', '').split('.').map(n => parseInt(n, 10) || 0);
|
|
12195
|
+
for (let i = 0; i < 3; i++) if (va[i] !== vb[i]) return vb[i] - va[i];
|
|
12196
|
+
return 0;
|
|
12197
|
+
});
|
|
12198
|
+
const recent = mergedBranches.slice(0, keep);
|
|
12199
|
+
const toDelete = mergedBranches.slice(keep).filter(b => b !== currentBranch);
|
|
12200
|
+
// 5) JSON
|
|
12201
|
+
if (has('--json')) {
|
|
12202
|
+
log(JSON.stringify({
|
|
12203
|
+
apply, keep, total: allBranches.length, merged: mergedBranches.length,
|
|
12204
|
+
unmerged: unmergedBranches.length, deleteCount: toDelete.length,
|
|
12205
|
+
toDelete, recent: recent.slice(0, keep), unmergedSample: unmergedBranches.slice(0, 5)
|
|
12206
|
+
}, null, 2));
|
|
12207
|
+
return;
|
|
12208
|
+
}
|
|
12209
|
+
// 6) Human μΆλ ₯
|
|
12210
|
+
log(cy(`# leerness release cleanup (1.9.235) β local release/* branches μ 리`));
|
|
12211
|
+
log('');
|
|
12212
|
+
log(` π μ΄ ${allBranches.length}κ° Β· merged ${mergedBranches.length}κ° Β· unmerged ${unmergedBranches.length}κ°`);
|
|
12213
|
+
log(` π νμ¬ branch: ${currentBranch}${currentBranch.startsWith('release/') ? yl(' (보νΈ)') : ''}`);
|
|
12214
|
+
log(` π‘ keep μ΅κ·Ό ${keep}κ° μ μ§`);
|
|
12215
|
+
log('');
|
|
12216
|
+
if (toDelete.length === 0) {
|
|
12217
|
+
log(gr(` β μ 리 λμ μμ (merged ${mergedBranches.length} β€ keep ${keep})`));
|
|
12218
|
+
if (unmergedBranches.length > 0) {
|
|
12219
|
+
log('');
|
|
12220
|
+
log(yl(` β unmerged ${unmergedBranches.length}κ° β sync-main λ―Έμ§ν. μ 리 λμ μλ:`));
|
|
12221
|
+
unmergedBranches.slice(0, 5).forEach(b => log(` β’ ${b}`));
|
|
12222
|
+
if (unmergedBranches.length > 5) log(dm(` ... +${unmergedBranches.length - 5}κ°`));
|
|
12223
|
+
}
|
|
12224
|
+
return;
|
|
12225
|
+
}
|
|
12226
|
+
log(yl(` π μμ ν보 ${toDelete.length}κ° (merged + keep λ²μ μΈ):`));
|
|
12227
|
+
toDelete.slice(0, 10).forEach(b => log(` β’ ${b}`));
|
|
12228
|
+
if (toDelete.length > 10) log(dm(` ... +${toDelete.length - 10}κ°`));
|
|
12229
|
+
log('');
|
|
12230
|
+
log(` π μ μ§ ${recent.length}κ°:`);
|
|
12231
|
+
recent.slice(0, 5).forEach(b => log(` β ${b}`));
|
|
12232
|
+
if (recent.length > 5) log(dm(` ... +${recent.length - 5}κ°`));
|
|
12233
|
+
log('');
|
|
12234
|
+
if (apply) {
|
|
12235
|
+
let ok = 0, fail = 0;
|
|
12236
|
+
for (const b of toDelete) {
|
|
12237
|
+
const r = cp.spawnSync('git', ['branch', '-d', b], { cwd: root, encoding: 'utf8' });
|
|
12238
|
+
if (r.status === 0) ok++;
|
|
12239
|
+
else fail++;
|
|
12240
|
+
}
|
|
12241
|
+
log(gr(` β μμ μλ£: ${ok}/${toDelete.length}건`) + (fail > 0 ? rd(` Β· μ€ν¨ ${fail}`) : ''));
|
|
12242
|
+
} else {
|
|
12243
|
+
log(dm(` β μ μ©: leerness release cleanup --apply (μμ : mergedλ§ μμ , νμ¬ branch 보νΈ)`));
|
|
12244
|
+
log(dm(` β --keep N: μ΅κ·Ό Nκ° μ μ§ (default 5)`));
|
|
12245
|
+
}
|
|
12246
|
+
}
|
|
12247
|
+
|
|
12159
12248
|
// 1.9.178: NPM μλ λ°°ν¬ (μ¬μ©μ λͺ
μ β release sync-main ν μλ trigger).
|
|
12160
12249
|
// 보μ:
|
|
12161
12250
|
// - NPM_TOKEN λλ LEERNESS_NPM_TOKEN νκ²½λ³μμμλ§ μ½μ (κ° μ λ λ‘κ·Έ X)
|
|
@@ -13391,6 +13480,42 @@ function driftCheckCmd(root, opts = {}) {
|
|
|
13391
13480
|
log(`β delivered auto-apply μ€λ₯ (1.9.225): ${e.message}`);
|
|
13392
13481
|
}
|
|
13393
13482
|
}
|
|
13483
|
+
// 1.9.236: drift check --auto-fix μ release cleanup ν΅ν© (1.9.235 νμ)
|
|
13484
|
+
// λμ λ 50κ°+ release/* branches β abnormal-shutdown release-branch-pending μ νΈ κ°μ€
|
|
13485
|
+
// μμ : keep 10 (μ΅κ·Ό 10κ° μ μ§), merged λ§ μμ (1.9.235 μμ κ°λ)
|
|
13486
|
+
// μκ³: 50κ° μ΄κ³Ό μλ§ μλ μ 리 (μλ λμ μ μ μ μ΄μ)
|
|
13487
|
+
if (autoFix) {
|
|
13488
|
+
try {
|
|
13489
|
+
const branchR = cp.spawnSync('git', ['branch', '--merged', 'main', '--list', 'release/*'], { cwd: root, encoding: 'utf8' });
|
|
13490
|
+
if (branchR.status === 0) {
|
|
13491
|
+
const merged = (branchR.stdout || '').split('\n')
|
|
13492
|
+
.map(l => l.replace(/^\*?\s+/, '').trim())
|
|
13493
|
+
.filter(l => l && /^release\/\d+\.\d+\.\d+$/.test(l));
|
|
13494
|
+
if (merged.length > 50) {
|
|
13495
|
+
log('');
|
|
13496
|
+
log(`π --auto-fix νμ± (1.9.236) β release/* merged ${merged.length}κ° (50+) μλ μ 리 (keep 10)...`);
|
|
13497
|
+
// μ λ ¬ (semver desc)
|
|
13498
|
+
merged.sort((a, b) => {
|
|
13499
|
+
const va = a.replace('release/', '').split('.').map(n => parseInt(n, 10) || 0);
|
|
13500
|
+
const vb = b.replace('release/', '').split('.').map(n => parseInt(n, 10) || 0);
|
|
13501
|
+
for (let i = 0; i < 3; i++) if (va[i] !== vb[i]) return vb[i] - va[i];
|
|
13502
|
+
return 0;
|
|
13503
|
+
});
|
|
13504
|
+
const currentBranchR = cp.spawnSync('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd: root, encoding: 'utf8' });
|
|
13505
|
+
const currentBranch = (currentBranchR.stdout || '').trim();
|
|
13506
|
+
const toDelete = merged.slice(10).filter(b => b !== currentBranch);
|
|
13507
|
+
let ok = 0;
|
|
13508
|
+
for (const b of toDelete) {
|
|
13509
|
+
const r = cp.spawnSync('git', ['branch', '-d', b], { cwd: root, encoding: 'utf8' });
|
|
13510
|
+
if (r.status === 0) ok++;
|
|
13511
|
+
}
|
|
13512
|
+
log(`β release cleanup μλ μλ£ ${ok}/${toDelete.length}건 (keep 10)`);
|
|
13513
|
+
}
|
|
13514
|
+
}
|
|
13515
|
+
} catch (e) {
|
|
13516
|
+
log(`β release cleanup auto-fix μ€λ₯ (1.9.236): ${e.message}`);
|
|
13517
|
+
}
|
|
13518
|
+
}
|
|
13394
13519
|
if (autoFix && level === 'π΄ critical' && !hasSecurityFired) {
|
|
13395
13520
|
log('');
|
|
13396
13521
|
log(`π§ --auto-fix νμ± β session close μλ μ€ν μ€...`);
|
|
@@ -14379,7 +14504,8 @@ function mcpServeCmd(root) {
|
|
|
14379
14504
|
{ 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' } } } },
|
|
14380
14505
|
{ 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' } } } },
|
|
14381
14506
|
{ 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' } } } },
|
|
14382
|
-
{ name: 'leerness_commands', description: '1.9.233 β μΉ΄ν
κ³ λ¦¬νλ μ 체 CLI λͺ
λ Ή λͺ©λ‘ (9 μΉ΄ν
κ³ λ¦¬). μλ΅: { version, totalCommands, categories: { status, task, memory, audit, workflow, release, skill, bridge, config } }. μΈλΆ AIκ° "leerness κ° μ 곡νλ λͺ
λ Ήμ΄ λκ° μλ"λ₯Ό μ§μ νμ. λ§€λ΄μΌ/λμλ§ λμ μμ±. μΈμ: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } }
|
|
14507
|
+
{ name: 'leerness_commands', description: '1.9.233 β μΉ΄ν
κ³ λ¦¬νλ μ 체 CLI λͺ
λ Ή λͺ©λ‘ (9 μΉ΄ν
κ³ λ¦¬). μλ΅: { version, totalCommands, categories: { status, task, memory, audit, workflow, release, skill, bridge, config } }. μΈλΆ AIκ° "leerness κ° μ 곡νλ λͺ
λ Ήμ΄ λκ° μλ"λ₯Ό μ§μ νμ. λ§€λ΄μΌ/λμλ§ λμ μμ±. μΈμ: { path? }', inputSchema: { type: 'object', properties: { path: { type: 'string' } } } },
|
|
14508
|
+
{ name: 'leerness_release_cleanup', description: '1.9.236 (1.9.235 μλ νμ) β local release/* branches μ 리. main μ mergeλ κ²λ§ ν보 (unmerged 보νΈ, νμ¬ branch 보νΈ). μλ΅: { apply, keep, total, merged, unmerged, deleteCount, toDelete[], recent[], unmergedSample[] }. μΈλΆ AIκ° "μ΄μ λμ release branches μ 리 κ°λ₯?"μ νμ. κΈ°λ³Έ dry-run, apply: true μμλ§ μ€ μμ . μΈμ: { path?, apply? (default false), keep? (default 5) }', inputSchema: { type: 'object', properties: { path: { type: 'string' }, apply: { type: 'boolean' }, keep: { type: 'number' } } } }
|
|
14383
14509
|
];
|
|
14384
14510
|
|
|
14385
14511
|
function send(obj) {
|
|
@@ -14556,6 +14682,12 @@ function mcpServeCmd(root) {
|
|
|
14556
14682
|
// 1.9.233: μΉ΄ν
κ³ λ¦¬νλ μ 체 CLI λͺ
λ Ή λͺ©λ‘
|
|
14557
14683
|
cliArgs = ['commands', '--json'];
|
|
14558
14684
|
break;
|
|
14685
|
+
case 'leerness_release_cleanup':
|
|
14686
|
+
// 1.9.236 (1.9.235): local release/* branches μ 리
|
|
14687
|
+
cliArgs = ['release', 'cleanup', '--json'];
|
|
14688
|
+
if (args.apply === true) cliArgs.push('--apply');
|
|
14689
|
+
if (typeof args.keep === 'number') cliArgs.push('--keep', String(args.keep));
|
|
14690
|
+
break;
|
|
14559
14691
|
default:
|
|
14560
14692
|
return send({ jsonrpc: '2.0', id, error: { code: -32601, message: `Unknown tool: ${name}` } });
|
|
14561
14693
|
}
|
|
@@ -18248,6 +18380,8 @@ async function main() {
|
|
|
18248
18380
|
if (cmd === 'release' && args[1] === 'publish') return releasePublish(args[2] || arg('--path', process.cwd()));
|
|
18249
18381
|
if (cmd === 'release' && args[1] === 'pack') return await releasePackCmd(args[2] || arg('--path', process.cwd()));
|
|
18250
18382
|
if (cmd === 'release' && args[1] === 'sync-main') return releaseSyncMainCmd(args[2] || arg('--path', process.cwd()));
|
|
18383
|
+
// 1.9.235: leerness release cleanup β local release/* branches μ 리 (merged λ§, --apply μ μ€ μμ )
|
|
18384
|
+
if (cmd === 'release' && args[1] === 'cleanup') return releaseCleanupCmd((args[2] && !args[2].startsWith('-')) ? args[2] : arg('--path', process.cwd()));
|
|
18251
18385
|
// 1.9.141: feature causality graph
|
|
18252
18386
|
if (cmd === 'feature' && args[1] === 'add') return featureAddCmd(arg('--path', process.cwd()), args.slice(2).filter(x => !x.startsWith('--')).join(' '));
|
|
18253
18387
|
if (cmd === 'feature' && args[1] === 'link') return featureLinkCmd(arg('--path', process.cwd()), args[2]);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.236",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|