leerness 1.9.201 β 1.9.202
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 +44 -0
- package/README.md +3 -3
- package/bin/harness.js +80 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,49 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.202 β 2026-05-22
|
|
4
|
+
|
|
5
|
+
**π CμΆ (곡μ νμ€ μ€ν¬ μλ νμ©) 9.0/10 β 9.5/10 λ³΄κ° β matched skill μ€μΉ μν νμ + leerness skill install-top.**
|
|
6
|
+
|
|
7
|
+
μμ¨ λͺ¨λ 132 λΌμ΄λ. 100% λ§€νΈλ¦μ€ λμ β CμΆ λ§μ§λ§ 0.5 λ³΄κ° (97 β 97.5).
|
|
8
|
+
|
|
9
|
+
### 1. install μ΄λ ₯ κΈ°λ‘ + μ€μΉ μν νμ
|
|
10
|
+
- `.harness/skill-installed-log.json` (λΉμν¬λ¦Ώ, 체ν¬μΈ κ°λ₯)
|
|
11
|
+
- ν¨μ: `_loadSkillInstalledLog` / `_appendSkillInstalledLog` / `_isSkillInstalled`
|
|
12
|
+
- handoff matched entry μ `β μ€μΉλ¨` λλ `π` νκ·Έ μλ νμ
|
|
13
|
+
|
|
14
|
+
### 2. `leerness skill install-top` μ κ· CLI
|
|
15
|
+
- handoff 컨ν
μ€νΈ (in-progress task) μ keyword λ‘ official skill λ§€μΉ
|
|
16
|
+
- top 1 (μ΄λ―Έ μ€μΉλ κ² μλ skip) μ¦μ download + install
|
|
17
|
+
- μ€μΉ ν μλ μ΄λ ₯ κΈ°λ‘ β μ€λ³΅ install λ°©μ§
|
|
18
|
+
- `--force`: μ΄λ―Έ μ€μΉλ κ² κ°μ μ¬μ€μΉ
|
|
19
|
+
|
|
20
|
+
### 3. handoff body ν΅ν©
|
|
21
|
+
```
|
|
22
|
+
## π 곡μ organization μ€ν¬ μλ λ§€μΉ (1.9.192/193) β ν€μλ "X"
|
|
23
|
+
β μ€μΉλ¨ [vercel] skill-A β ...
|
|
24
|
+
π [anthropic] skill-B β ...
|
|
25
|
+
β 1κ° μ¦μ: leerness skill install-top (1.9.202)
|
|
26
|
+
β μ 체 μ€μΉ: leerness skill auto-install --yes
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### 4. λμ νκ· (1.9.196~201) β λͺ¨λ μ μ§
|
|
30
|
+
|
|
31
|
+
### 5. stress-v147 β 15/15 PASS
|
|
32
|
+
- μ€μΉ μ΄λ ₯ (6) + μ±λ₯ (2) + λμ νκ· (7)
|
|
33
|
+
- μ±λ₯: --version cold start avg **457 ms** Β· MCP 54 λꡬ **468 ms**
|
|
34
|
+
|
|
35
|
+
### 6. 5μΆ λ§€νΈλ¦μ€
|
|
36
|
+
| μΆ | 1.9.201 | 1.9.202 | μν |
|
|
37
|
+
|---|---|---|---|
|
|
38
|
+
| C. 곡μ νμ€ μ€ν¬ μλ νμ© | 9.0 | **9.5** | +0.5 (μ€μΉ μν + install-top) |
|
|
39
|
+
| **μ’
ν©** | 48.5/50 (97%) | **49/50 (98%)** | **+1%** |
|
|
40
|
+
|
|
41
|
+
### 7. μλ release
|
|
42
|
+
- main μλ push **64 λΌμ΄λ μ°μ** (1.9.140~202)
|
|
43
|
+
- npm publish μλ (1.9.178~)
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
3
47
|
## 1.9.201 β 2026-05-22
|
|
4
48
|
|
|
5
49
|
**π― EμΆ (κ²μΌλ¦ λ°©μ§) 9.5/10 β 10/10 λ³΄κ° β next-action queue + leerness next-action take λͺ
λ Ή.**
|
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.202 AI Agent Reliability Harness + Sandbox β
|
|
16
16
|
β verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β
|
|
17
|
-
β
|
|
17
|
+
β π skill install-top + μ€μΉ μν Β· λ§€νΈλ¦μ€ 98/100 Β· AΒ·DΒ·E 10/10 β
|
|
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.202';
|
|
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 μ²λ¦¬).
|
|
@@ -1556,6 +1556,77 @@ async function skillDiscoverCmd(root) {
|
|
|
1556
1556
|
log(`π‘ μ€μΉ: leerness skill install <url>`);
|
|
1557
1557
|
}
|
|
1558
1558
|
|
|
1559
|
+
// 1.9.202: CμΆ (곡μ νμ€ μ€ν¬ μλ νμ©) 9.0β9.5 λ³΄κ° β install μ΄λ ₯ κΈ°λ‘ + μ€μΉ μν νμ
|
|
1560
|
+
// 1.9.192 official catalog λ§€μΉ μ "μ΄λ―Έ μ€μΉλ¨" / "μ κ·" κ΅¬λΆ β μ€λ³΅ install λ°©μ§ + μ¬μ©μ μΈμ§ λμ
|
|
1561
|
+
// νμΌ: .harness/skill-installed-log.json (λΉμν¬λ¦Ώ)
|
|
1562
|
+
function _skillInstalledLogPath(root) { return path.join(root, '.harness', 'skill-installed-log.json'); }
|
|
1563
|
+
function _loadSkillInstalledLog(root) {
|
|
1564
|
+
try {
|
|
1565
|
+
const fp = _skillInstalledLogPath(root);
|
|
1566
|
+
if (!exists(fp)) return { installed: [] };
|
|
1567
|
+
const j = JSON.parse(read(fp));
|
|
1568
|
+
return { installed: Array.isArray(j.installed) ? j.installed : [] };
|
|
1569
|
+
} catch { return { installed: [] }; }
|
|
1570
|
+
}
|
|
1571
|
+
function _appendSkillInstalledLog(root, entry) {
|
|
1572
|
+
try {
|
|
1573
|
+
const state = _loadSkillInstalledLog(root);
|
|
1574
|
+
const e = { name: entry.name, source: entry.source || entry.preset || '?', url: entry.url || '', at: new Date().toISOString() };
|
|
1575
|
+
// μ€λ³΅ (κ°μ name + source) μ κ±° ν append
|
|
1576
|
+
state.installed = state.installed.filter(x => !(x.name === e.name && x.source === e.source));
|
|
1577
|
+
state.installed.push(e);
|
|
1578
|
+
mkdirp(path.join(root, '.harness'));
|
|
1579
|
+
writeUtf8(_skillInstalledLogPath(root), JSON.stringify({ installed: state.installed }, null, 2));
|
|
1580
|
+
return true;
|
|
1581
|
+
} catch { return false; }
|
|
1582
|
+
}
|
|
1583
|
+
function _isSkillInstalled(root, entry) {
|
|
1584
|
+
try {
|
|
1585
|
+
const state = _loadSkillInstalledLog(root);
|
|
1586
|
+
const src = entry.source || entry.preset || '?';
|
|
1587
|
+
return state.installed.some(x => x.name === entry.name && x.source === src);
|
|
1588
|
+
} catch { return false; }
|
|
1589
|
+
}
|
|
1590
|
+
|
|
1591
|
+
// 1.9.202: leerness skill install-top β handoff matched μ top 1 entry λ₯Ό μ¦μ install
|
|
1592
|
+
async function skillInstallTopCmd(root) {
|
|
1593
|
+
root = absRoot(root);
|
|
1594
|
+
// handoff context μ keyword μΆμΆ
|
|
1595
|
+
const rows = readProgressRows(root);
|
|
1596
|
+
const active = rows.find(r => r.status === 'in-progress' || r.status === '[μ§ν]') || rows[rows.length - 1];
|
|
1597
|
+
if (!active || !active.request) { fail('in-progress task μμ β leerness handoff . λ¨Όμ '); return process.exit(1); }
|
|
1598
|
+
const m = _matchOfficialSkillsFromCache(root, active.request, 3);
|
|
1599
|
+
if (m.entries.length === 0) {
|
|
1600
|
+
fail(`λ§€μΉλ official skill μμ (keyword: "${(active.request || '').slice(0, 40)}", cache total: ${m.cacheTotal || 0})`);
|
|
1601
|
+
return process.exit(1);
|
|
1602
|
+
}
|
|
1603
|
+
// μ΄λ―Έ μ€μΉλ κ² skip
|
|
1604
|
+
const candidates = m.entries.filter(e => !_isSkillInstalled(root, e));
|
|
1605
|
+
if (candidates.length === 0) {
|
|
1606
|
+
log(`β λͺ¨λ λ§€μΉλ skill μ΄λ―Έ μ€μΉλ¨ (1.9.202 log κΈ°μ€):`);
|
|
1607
|
+
for (const e of m.entries) log(` β’ ${e.name} (${e.preset || e.source}) β μ΄λ―Έ μ€μΉ`);
|
|
1608
|
+
log(` β leerness skill install-top --force λ‘ μ¬μ€μΉ`);
|
|
1609
|
+
return;
|
|
1610
|
+
}
|
|
1611
|
+
const top = has('--force') ? m.entries[0] : candidates[0];
|
|
1612
|
+
log(`# leerness skill install-top (1.9.202 CμΆ λ³΄κ°)`);
|
|
1613
|
+
log(` task: ${(active.request || '').slice(0, 80)}`);
|
|
1614
|
+
log(` λ§€μΉ: ${m.total}/${m.cacheTotal}건 Β· top 1 β ${top.name} (${top.preset || top.source})`);
|
|
1615
|
+
log(` URL: ${top.url || '(none)'}`);
|
|
1616
|
+
log('');
|
|
1617
|
+
if (!top.url) { fail(`top entry url λΆμ¬ β install λΆκ°`); return process.exit(1); }
|
|
1618
|
+
try {
|
|
1619
|
+
log(`π₯ install μμ...`);
|
|
1620
|
+
await skillInstallCmd(root, top.url);
|
|
1621
|
+
_appendSkillInstalledLog(root, top);
|
|
1622
|
+
log('');
|
|
1623
|
+
log(`β μ€μΉ + μ΄λ ₯ κΈ°λ‘ μλ£ (.harness/skill-installed-log.json)`);
|
|
1624
|
+
} catch (e) {
|
|
1625
|
+
fail(`install μ€ν¨: ${e.message}`);
|
|
1626
|
+
return process.exit(1);
|
|
1627
|
+
}
|
|
1628
|
+
}
|
|
1629
|
+
|
|
1559
1630
|
// 1.9.182: skill auto-install β 곡μ organization catalog μλ νμ β skill match β μλ install.
|
|
1560
1631
|
// μ¬μ©μ λͺ
μ: "μ€ν¬μ μ¬μ©νκ±°λ μ μ©ν΄λλ©΄ μ’μ λΆλΆλ€μ μμμ μΉμμ 곡μ μ‘°μ§μ μ€ν¬ λͺ¨μμ νμν΄μ λ€μ΄λ‘λ λ°μμ μ¬μ©"
|
|
1561
1632
|
// μ μ±
: LEERNESS_SKILL_AUTO_INSTALL=1 μΌ λλ§ μ€μ install (보μ opt-in). λ―Έμ€μ μ dry-run (μΆμ²λ§).
|
|
@@ -3835,10 +3906,14 @@ function handoff(root) {
|
|
|
3835
3906
|
log(cyan(`## π 곡μ organization μ€ν¬ μλ λ§€μΉ (1.9.192/193) β ν€μλ "${keyword}"`));
|
|
3836
3907
|
const ageLabel = veryStale ? yel(`${cacheAge} β 7μΌ+`) : (ofm.expired ? yel(`${cacheAge} β λ§λ£`) : `${cacheAge} β`);
|
|
3837
3908
|
log(dim(` vercel-labs/anthropics λ± catalog μΊμ ${ageLabel} Β· ${ofm.total}/${ofm.cacheTotal}건 λ§€μΉ`));
|
|
3909
|
+
// 1.9.202: κ° entry μ μ€μΉ μν νμ (installed/new)
|
|
3838
3910
|
for (const e of ofm.entries) {
|
|
3839
|
-
|
|
3911
|
+
const installed = _isSkillInstalled(root, e);
|
|
3912
|
+
const tag = installed ? 'β μ€μΉλ¨' : 'π';
|
|
3913
|
+
log(dim(` ${tag} [${e.preset || e.source || '?'}] ${e.name} β ${(e.description || '').slice(0, 65)}`));
|
|
3840
3914
|
}
|
|
3841
|
-
log(dim(` β
|
|
3915
|
+
log(dim(` β 1κ° μ¦μ: leerness skill install-top (1.9.202)`));
|
|
3916
|
+
log(dim(` β μ 체 μ€μΉ: leerness skill auto-install --yes`));
|
|
3842
3917
|
if (ofm.expired || veryStale) log(yel(` β κ°±μ κΆμ₯: leerness skill auto-cache refresh (1.9.193 ${veryStale ? '7μΌ+ stale' : '24h+ expired'})`));
|
|
3843
3918
|
log('');
|
|
3844
3919
|
} else if (ofm.cacheTotal === 0) {
|
|
@@ -14875,6 +14950,8 @@ async function main() {
|
|
|
14875
14950
|
if (cmd === 'skill' && args[1] === 'suggest') return skillSuggestCmd(absRoot(arg('--path', process.cwd())));
|
|
14876
14951
|
// 1.9.182: leerness skill auto-install β 곡μ catalog μλ νμ + skill match λ§€μΉ μ μλ install (μ¬μ©μ λͺ
μ)
|
|
14877
14952
|
if (cmd === 'skill' && args[1] === 'auto-install') return await skillAutoInstallCmd(absRoot(arg('--path', process.cwd())));
|
|
14953
|
+
// 1.9.202: leerness skill install-top β handoff matched top 1 μ¦μ install (CμΆ 9β9.5 보κ°)
|
|
14954
|
+
if (cmd === 'skill' && args[1] === 'install-top') return await skillInstallTopCmd(absRoot(arg('--path', process.cwd())));
|
|
14878
14955
|
// 1.9.192: skill auto-cache β 곡μ organization catalog 24h μΊμ κ΄λ¦¬ (CμΆ λ³΄κ°)
|
|
14879
14956
|
if (cmd === 'skill' && args[1] === 'auto-cache') return await skillAutoCacheCmd(absRoot(arg('--path', process.cwd())), args[2] || 'status');
|
|
14880
14957
|
if (cmd === 'mcp' && args[1] === 'serve') return mcpServeCmd(absRoot(arg('--path', process.cwd())));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.202",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|