leerness 1.9.233 β 1.9.235
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 +65 -0
- package/README.md +3 -3
- package/bin/harness.js +135 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,70 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.235 β 2026-05-23
|
|
4
|
+
|
|
5
|
+
**π leerness release cleanup CLI β local release/* branches μ 리 + --keep BUG fix.**
|
|
6
|
+
|
|
7
|
+
### 1. `leerness release cleanup` μ λͺ
λ Ή
|
|
8
|
+
- local `release/*` branches μ€ main μ mergeλ κ² μλ μ 리
|
|
9
|
+
- κΈ°λ³Έ dry-run (λͺ©λ‘λ§), `--apply` λͺ
μ μ μ€ μμ
|
|
10
|
+
- `--keep N` (default 5) β μ΅κ·Ό Nκ° μ μ§
|
|
11
|
+
- μμ κ°λ: merged λ§ μμ , unmerged 보νΈ, νμ¬ branch 보νΈ
|
|
12
|
+
- `--json` μ΅μ
|
|
13
|
+
|
|
14
|
+
### 2. μ€ μΈ‘μ β leerness μ체 λμ 191κ°
|
|
15
|
+
- merged: 191κ° / unmerged: 0κ°
|
|
16
|
+
- keep 5 β μμ ν보 186κ° (1.9.6~229)
|
|
17
|
+
- μ μ§: 1.9.234, 1.9.233, 1.9.232, 1.9.231, 1.9.230 (top 5 μ΅μ )
|
|
18
|
+
- handoff abnormal-shutdown `release-branch-pending` μ νΈ κ°μ€μΉ ν΄μ κ°λ₯
|
|
19
|
+
|
|
20
|
+
### 3. π `--keep` νλκ·Έ nonFlagArgs λ±λ‘ (BUG fix)
|
|
21
|
+
- κΈ°μ‘΄: `--keep 10`μ `10`μ΄ non-flag arg λ‘ μλͺ» λΆλ₯ β root μΈμ λ¨
|
|
22
|
+
- 1.9.235 fix: `withValue.Set` μ `--keep` μΆκ° β μ μ μΈμ
|
|
23
|
+
|
|
24
|
+
### 4. λμ νκ· (1.9.207~234) β λͺ¨λ μ μ§
|
|
25
|
+
|
|
26
|
+
### 5. stress-v180 β 16/16 PASS
|
|
27
|
+
- 1.9.235 (7): VERSION + dry-run + --keep + μ λ ¬ + μμ κ°λ + git fallback + human μΆλ ₯
|
|
28
|
+
- μ±λ₯ (2): cold_start avg 353ms / release cleanup 701ms
|
|
29
|
+
- λμ νκ· (7): 1.9.207~234
|
|
30
|
+
|
|
31
|
+
### 6. μλ release (97 λΌμ΄λ main-push streak Β· 58 λΌμ΄λ npm publish streak)
|
|
32
|
+
|
|
33
|
+
π **μ΄μ λμ μ 리 μμ€ν
** β 191 branches λμ β 5κ° μ μ§ κ°λ₯ (handoff μ νΈ ν΄μ)
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## 1.9.234 β 2026-05-23
|
|
38
|
+
|
|
39
|
+
**π handoff/session close/health --json recentChanges ν΅ν© (8 νλ μμ±) β μΈλΆ AI μ΅κ·Ό 5 λΌμ΄λ μ¦μ μΈμ§.**
|
|
40
|
+
|
|
41
|
+
### 1. handoff/session close/health --json 8λ²μ§Έ ν΅ν© νλ `recentChanges`
|
|
42
|
+
- git tag κΈ°λ° μ΅κ·Ό 5 λΌμ΄λμ ν΅μ¬ λ³κ²½ μλ νμ
|
|
43
|
+
- νμ: `[{ version, date, subject }]` (κ°μ₯ μ΅κ·ΌλΆν°)
|
|
44
|
+
- AI κ° "μ΅κ·Ό 무μμ΄ λ°λμλ?"λ₯Ό λ¨μΌ νΈμΆλ‘ μΈμ§ β 컨ν
μ€νΈ μ μ½
|
|
45
|
+
- 1.9.218 (4 νλ) β 1.9.223 (5) β 1.9.227 (6) β 1.9.230 (7) β 1.9.234 (**8 νλ**)
|
|
46
|
+
|
|
47
|
+
### 2. 3 λͺ
λ Ή μΌκ΄μ± λ§€νΈλ¦μ€ β 3 Γ 8 = 24 ν΅ν© ν¬μΈνΈ
|
|
48
|
+
- handoff/session close/health λμΌ νμ + λμΌ κ²°κ³Ό
|
|
49
|
+
- μΈλΆ μλν/CI μ΄λ λͺ
λ ΉμΌλ‘ μ‘°νν΄λ λμΌ μλ΅
|
|
50
|
+
|
|
51
|
+
### 3. AI μΈμ§ λΉμ© μ κ°
|
|
52
|
+
- κΈ°μ‘΄: AI κ° CHANGELOG.md μ½κΈ° β ν ν° λ€λ μλΉ
|
|
53
|
+
- 1.9.234: handoff --json ν λ²μ μ΅κ·Ό 5 λΌμ΄λ μλ νμ β ~500 ν ν° μ μ½
|
|
54
|
+
|
|
55
|
+
### 4. λμ νκ· (1.9.207~233) β λͺ¨λ μ μ§
|
|
56
|
+
|
|
57
|
+
### 5. stress-v179 β 17/17 PASS
|
|
58
|
+
- 1.9.234 (7): VERSION + handoff/session close/health JSON + 3 λͺ
λ Ή μΌκ΄μ± + 8 νλ κ²μ¦ + νν κ²μ¦
|
|
59
|
+
- μ±λ₯ (2): cold_start avg 376ms / handoff --json (8 νλ) 1109ms
|
|
60
|
+
- λμ νκ· (8): 1.9.207~233
|
|
61
|
+
|
|
62
|
+
### 6. μλ release (96 λΌμ΄λ main-push streak Β· 57 λΌμ΄λ npm publish streak)
|
|
63
|
+
|
|
64
|
+
π **JSON ν΅ν© λ§€νΈλ¦μ€ 8 νλ μμ±** β μΈλΆ AI κ° leerness μν + μ΅κ·Ό λ³κ²½ λͺ¨λ ν λ²μ νμ
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
3
68
|
## 1.9.233 β 2026-05-23
|
|
4
69
|
|
|
5
70
|
**π leerness commands μ λͺ
λ Ή (9 μΉ΄ν
κ³ λ¦¬ 51 CLI) + MCP 65λ²μ§Έ λꡬ.**
|
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.235 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π release cleanup Β· 191 branches λμ μ 리 + BUG fix β
|
|
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.235';
|
|
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];
|
|
@@ -2196,6 +2196,36 @@ function milestonesCmd(root) {
|
|
|
2196
2196
|
}
|
|
2197
2197
|
}
|
|
2198
2198
|
|
|
2199
|
+
// 1.9.234: recentChanges β μ΅κ·Ό N λΌμ΄λμ ν΅μ¬ λ³κ²½ μμ½ (git tag commit subject)
|
|
2200
|
+
// μλ΅: [{ version, date, subject }] (κ°μ₯ μ΅κ·ΌλΆν°)
|
|
2201
|
+
function _computeRecentChanges(root, limit = 5) {
|
|
2202
|
+
const items = [];
|
|
2203
|
+
try {
|
|
2204
|
+
const r = cp.spawnSync('git', ['log', '--tags', '--simplify-by-decoration', '--pretty=format:%H|%D|%ad|%s', '--date=short', '-n', String(limit * 3)], {
|
|
2205
|
+
cwd: root, encoding: 'utf8', timeout: 5000
|
|
2206
|
+
});
|
|
2207
|
+
if (r.status !== 0 || !r.stdout) return items;
|
|
2208
|
+
const lines = r.stdout.split('\n').filter(l => l.trim());
|
|
2209
|
+
for (const line of lines) {
|
|
2210
|
+
const idx1 = line.indexOf('|');
|
|
2211
|
+
if (idx1 < 0) continue;
|
|
2212
|
+
const idx2 = line.indexOf('|', idx1 + 1);
|
|
2213
|
+
const idx3 = line.indexOf('|', idx2 + 1);
|
|
2214
|
+
if (idx2 < 0 || idx3 < 0) continue;
|
|
2215
|
+
const refs = line.slice(idx1 + 1, idx2);
|
|
2216
|
+
const date = line.slice(idx2 + 1, idx3);
|
|
2217
|
+
const subject = line.slice(idx3 + 1);
|
|
2218
|
+
const m = refs.match(/tag: v(\d+\.\d+\.\d+)/);
|
|
2219
|
+
if (!m) continue;
|
|
2220
|
+
const version = m[1];
|
|
2221
|
+
const cleanSubject = subject.replace(/^\d+\.\d+\.\d+\s*[β-]\s*/, '').trim();
|
|
2222
|
+
items.push({ version, date, subject: cleanSubject.slice(0, 100) });
|
|
2223
|
+
if (items.length >= limit) break;
|
|
2224
|
+
}
|
|
2225
|
+
} catch {}
|
|
2226
|
+
return items;
|
|
2227
|
+
}
|
|
2228
|
+
|
|
2199
2229
|
// 1.9.231: leerness pulse β ν μ€ μ’
ν© μμ½ (10 ν΅μ¬ μ§ν)
|
|
2200
2230
|
// handoff ν€λλΌμΈμ μΆμ½ λ²μ β μ¬μ©μκ° λΉ λ₯΄κ² μν νμ
|
|
2201
2231
|
// μλ΅ (--json): { version, roundCount, mcpTools, memorySurface, security, health, driftScore, nextMilestone, etaDays, abnormal }
|
|
@@ -6206,6 +6236,10 @@ function handoff(root) {
|
|
|
6206
6236
|
avgRoundsPerDay: ms.avgRoundsPerDay
|
|
6207
6237
|
};
|
|
6208
6238
|
} catch {}
|
|
6239
|
+
// 1.9.234: recentChanges ν΅ν© (handoff JSON 8λ²μ§Έ ν΅ν© νλ) β μ΅κ·Ό 5 λΌμ΄λ λ³κ²½ μμ½
|
|
6240
|
+
try {
|
|
6241
|
+
result.recentChanges = _computeRecentChanges(root, 5);
|
|
6242
|
+
} catch {}
|
|
6209
6243
|
} catch {}
|
|
6210
6244
|
try {
|
|
6211
6245
|
const pwState = _loadPreWakeReport(root);
|
|
@@ -10365,6 +10399,10 @@ function sessionClose(root, opts = {}) {
|
|
|
10365
10399
|
avgRoundsPerDay: ms.avgRoundsPerDay
|
|
10366
10400
|
};
|
|
10367
10401
|
} catch {}
|
|
10402
|
+
// 1.9.234: recentChanges ν΅ν© (session close JSON 8λ²μ§Έ ν΅ν© νλ) β μ΅κ·Ό 5 λΌμ΄λ λ³κ²½
|
|
10403
|
+
try {
|
|
10404
|
+
jsonResult.recentChanges = _computeRecentChanges(root, 5);
|
|
10405
|
+
} catch {}
|
|
10368
10406
|
} catch {}
|
|
10369
10407
|
try {
|
|
10370
10408
|
// 1.9.209: pre-wake-audit μλ μ€ν + μ μ₯ (sleep μ μλ μ κ²)
|
|
@@ -12118,6 +12156,95 @@ function releaseSyncMainCmd(root) {
|
|
|
12118
12156
|
}
|
|
12119
12157
|
}
|
|
12120
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
|
+
|
|
12121
12248
|
// 1.9.178: NPM μλ λ°°ν¬ (μ¬μ©μ λͺ
μ β release sync-main ν μλ trigger).
|
|
12122
12249
|
// 보μ:
|
|
12123
12250
|
// - NPM_TOKEN λλ LEERNESS_NPM_TOKEN νκ²½λ³μμμλ§ μ½μ (κ° μ λ λ‘κ·Έ X)
|
|
@@ -16738,6 +16865,10 @@ function healthCmd(root) {
|
|
|
16738
16865
|
avgRoundsPerDay: ms.avgRoundsPerDay
|
|
16739
16866
|
};
|
|
16740
16867
|
} catch { out.milestones = { error: 'milestones μ κ² μ€ν¨' }; }
|
|
16868
|
+
// 1.9.234: health --json recentChanges ν΅ν© (3 λͺ
λ Ή 8 νλ μΌκ΄μ±)
|
|
16869
|
+
try {
|
|
16870
|
+
out.recentChanges = _computeRecentChanges(root, 5);
|
|
16871
|
+
} catch { out.recentChanges = { error: 'recentChanges μ κ² μ€ν¨' }; }
|
|
16741
16872
|
// 1.9.163: 5λ₯λ ₯ λ§€νΈλ¦μ€ μλ νκ° (1.9.155 sub-agent μ κ² β μ½λ κΈ°λ° μλν)
|
|
16742
16873
|
// κ° λ₯λ ₯μ μ½λ grep μΌλ‘ κ²μΆ β 0~100 μ μ. μ¬μ©μκ° λ§€ health νΈμΆ μ leerness μκΈ° νκ° νμΈ.
|
|
16743
16874
|
try {
|
|
@@ -18206,6 +18337,8 @@ async function main() {
|
|
|
18206
18337
|
if (cmd === 'release' && args[1] === 'publish') return releasePublish(args[2] || arg('--path', process.cwd()));
|
|
18207
18338
|
if (cmd === 'release' && args[1] === 'pack') return await releasePackCmd(args[2] || arg('--path', process.cwd()));
|
|
18208
18339
|
if (cmd === 'release' && args[1] === 'sync-main') return releaseSyncMainCmd(args[2] || arg('--path', process.cwd()));
|
|
18340
|
+
// 1.9.235: leerness release cleanup β local release/* branches μ 리 (merged λ§, --apply μ μ€ μμ )
|
|
18341
|
+
if (cmd === 'release' && args[1] === 'cleanup') return releaseCleanupCmd((args[2] && !args[2].startsWith('-')) ? args[2] : arg('--path', process.cwd()));
|
|
18209
18342
|
// 1.9.141: feature causality graph
|
|
18210
18343
|
if (cmd === 'feature' && args[1] === 'add') return featureAddCmd(arg('--path', process.cwd()), args.slice(2).filter(x => !x.startsWith('--')).join(' '));
|
|
18211
18344
|
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.235",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|