leerness 1.9.191 โ 1.9.193
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 +121 -0
- package/README.md +3 -3
- package/bin/harness.js +168 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,126 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.193 โ 2026-05-21
|
|
4
|
+
|
|
5
|
+
**๐ค B์ถ (๋ฉํฐ Sub-Agent ์ค์ผ์คํธ๋ผ) ๋ณด๊ฐ โ agents multi consensus ๊ฒฐ๊ณผ ์๋ lessons.md ์ ์ฅ + ์บ์ 7์ผ stale hint.**
|
|
6
|
+
|
|
7
|
+
์์จ ๋ชจ๋ 123 ๋ผ์ด๋. 1.9.192 C์ถ ๋ณด๊ฐ์ ์ด์ด, 5์ถ ๋งคํธ๋ฆญ์ค์์ ๋ ๋ฒ์งธ๋ก ์ ์๊ฐ ๋ฎ์๋ **B์ถ (8.5/10 โ ๋ชฉํ 9/10)** ๋ณด๊ฐ.
|
|
8
|
+
|
|
9
|
+
### ์ฌ์ฉ์ ์๋ ์ ๋ ฌ (1.9.191 verbatim)
|
|
10
|
+
> *"๋ฉํฐ ์๋ธ ์์ด์ ํธ ์ค์ผ์คํธ๋ผ ... ์ต๊ณ ์ ๋๊ตฌ"*
|
|
11
|
+
|
|
12
|
+
### 1. agents multi --execute โ lessons.md ์๋ ์ ์ฅ (B์ถ ํต์ฌ)
|
|
13
|
+
- ๋งค `agents multi --execute` ํธ์ถ ์ consensus best agent + score ๊ฐ `.harness/lessons.md`์ ๊ธฐ๋ก
|
|
14
|
+
- ๊ฐ์ keyword ์ฌ๋ฐ ์ handoff lessons auto-recall (1.9.56)๊ฐ ์๋ ๋งค์นญ โ ๊ณผ๊ฑฐ best agent ์ฐ์ ์๋
|
|
15
|
+
- ๋๊ธฐ: `LEERNESS_NO_MULTIAGENT_LESSON=1`
|
|
16
|
+
|
|
17
|
+
**lesson ๋ธ๋ก ํฌ๋งท:**
|
|
18
|
+
```markdown
|
|
19
|
+
### 2026-05-21 multi-agent consensus โ best=claude (1.9.193)
|
|
20
|
+
- task: ...
|
|
21
|
+
- agents: claude, codex, gemini (3/3 success)
|
|
22
|
+
- best agent: claude, score=0.873
|
|
23
|
+
- others: codex=0.71, gemini=0.65
|
|
24
|
+
- lesson: ๊ฐ์ keyword ์ฌ๋ฐ ์ claude ์ฐ์ ์๋ (multi-signal consensus ์
์ฆ)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### 2. skill auto-cache age 7์ผ stale ๊ฐ์กฐ (1.9.192 ํ์)
|
|
28
|
+
- handoff body์์ ์บ์ age โฅ 7์ผ (veryStale) ์ `โ 7์ผ+` ํ์
|
|
29
|
+
- ๊ฐฑ์ ๊ถ์ฅ hint: `1.9.193 7์ผ+ stale` ๋๋ `24h+ expired` ๋ช
์
|
|
30
|
+
- ์ฌ์ฉ์๊ฐ "์ค๋๋ catalog ์์ ์ธ์ง" โ ์๋ ๊ฒ์ผ๋ฆ ๋ฐฉ์ง
|
|
31
|
+
|
|
32
|
+
### 3. ๋์ ํ๊ท (1.9.187~192) โ ๋ชจ๋ ์ ์ง
|
|
33
|
+
- [1.9.192] _loadOfficialSkillCache + 24h ์บ์
|
|
34
|
+
- [1.9.191] ๊ตฌ์กฐ ์ต์ ํ ๋ณด๊ณ ์ 88/100
|
|
35
|
+
- [1.9.190] _selectOne/_selectMany Ctrl+C ์ฆ์ ์ข
๋ฃ
|
|
36
|
+
- [1.9.189] _showSlashCommandList + Tab cycle ํ ์ค ๊ฐฑ์
|
|
37
|
+
- [1.9.188] stdin prompt ์ ๋ฌ (useStdinForPrompt)
|
|
38
|
+
- [1.9.187] _loadLeernessConfig (.harness/leerness-config.json)
|
|
39
|
+
|
|
40
|
+
### 4. stress-v138 โ 16/16 PASS
|
|
41
|
+
- consensus auto-lessons (3) + cache age hint (2) + 1.9.192 ์์กด (2)
|
|
42
|
+
- ์ฑ๋ฅ: --version cold start avg **396 ms** (376/382/430) ยท MCP 54 ๋๊ตฌ **369 ms**
|
|
43
|
+
- ๋์ ํ๊ท 1.9.187~192 (7)
|
|
44
|
+
|
|
45
|
+
### 5. 5์ถ ๋งคํธ๋ฆญ์ค ๋ณ๋
|
|
46
|
+
| ์ถ | 1.9.192 | 1.9.193 | ฮ |
|
|
47
|
+
|---|---|---|---|
|
|
48
|
+
| B. ๋ฉํฐ Sub-Agent ์ค์ผ์คํธ๋ผ | 8.5/10 | **9/10** | +0.5 (consensus ์๋ lessons โ ํ์ต ์ฌ์ดํด ์์ฑ) |
|
|
49
|
+
| C. ๊ณต์ ํ์ค ์คํฌ ์๋ ํ์ฉ | 9/10 | 9/10 | (์ ์ง) |
|
|
50
|
+
| ์ข
ํฉ | 45/50 (90%) | **45.5/50 (91%)** | +1% |
|
|
51
|
+
|
|
52
|
+
### 6. ์๋ release ํ๋ฆ
|
|
53
|
+
- main ์๋ push **55 ๋ผ์ด๋ ์ฐ์** (1.9.140~193)
|
|
54
|
+
- npm publish ์๋ (1.9.178~)
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## 1.9.192 โ 2026-05-21
|
|
59
|
+
|
|
60
|
+
**๐ C์ถ (๊ณต์ ํ์ค ์คํฌ ์๋ ํ์ฉ) ๋ณด๊ฐ โ handoff์ ๊ณต์ organization catalog ์๋ ๋
ธ์ถ + 24h ์บ์.**
|
|
61
|
+
|
|
62
|
+
์์จ ๋ชจ๋ 122 ๋ผ์ด๋. 1.9.191 5์ถ ๋งคํธ๋ฆญ์ค์์ ๊ฐ์ฅ ์ ์๊ฐ ๋ฎ์๋ **C์ถ (8/10 โ ๋ชฉํ 9/10)** ๋ณด๊ฐ.
|
|
63
|
+
|
|
64
|
+
### ์ฌ์ฉ์ ์๋ (1.9.191 verbatim)
|
|
65
|
+
> *"๊ณต์ ํ์คํ๋ ์คํฌ์ ์ ์ฌ์ ์๋ก ์๋ ํ์ฉ ... ์ต๊ณ ์ ๋๊ตฌ๋ก ๊ฐ๋ฐํ๋๊ฒ ๋ชฉํ"*
|
|
66
|
+
|
|
67
|
+
### 1. ๊ณต์ organization skill catalog 24h ์บ์ (์ ๊ท)
|
|
68
|
+
- ํ์ผ: `.harness/skill-auto-cache.json` (๋น์ํฌ๋ฆฟ โ ์ฒดํฌ์ธ ๊ฐ๋ฅ)
|
|
69
|
+
- TTL 24h โ `_OFFICIAL_SKILL_CACHE_TTL_MS` ์์
|
|
70
|
+
- presets: `vercel-labs/agent-skills` + `anthropics/skills`
|
|
71
|
+
- ํจ์: `_loadOfficialSkillCache` / `_writeOfficialSkillCache` / `_refreshOfficialSkillCache` / `_matchOfficialSkillsFromCache`
|
|
72
|
+
|
|
73
|
+
### 2. handoff ์๋ ๋
ธ์ถ (์ฌ์ฉ์ ์๋ ์ ๋ ฌ)
|
|
74
|
+
**ํค๋๋ผ์ธ 10๋ฒ์งธ ์์** (1.9.81/93/113/152/162/192):
|
|
75
|
+
```
|
|
76
|
+
๐ ํค๋๋ผ์ธ ...ยท ๐ official 25/25 (0hโ)
|
|
77
|
+
```
|
|
78
|
+
- `official {๋งค์นญ์}/{์ ์ฒด์} ({์บ์๋์ด}{๋ง๋ฃ์ฌ๋ถ})`
|
|
79
|
+
- ์บ์ ๋ง๋ฃ (24h+) ์ `โ ` ํ์
|
|
80
|
+
|
|
81
|
+
**body ์น์
** โ in-progress task keyword ๊ธฐ๋ฐ ๋งค์นญ top 3:
|
|
82
|
+
```
|
|
83
|
+
## ๐ ๊ณต์ organization ์คํฌ ์๋ ๋งค์นญ (1.9.192) โ ํค์๋ "..."
|
|
84
|
+
vercel-labs/anthropics ๋ฑ catalog ์บ์ 0h โ ยท 3/25๊ฑด ๋งค์นญ
|
|
85
|
+
โข [vercel] skill-name โ description ...
|
|
86
|
+
โข [anthropic] another-skill โ ...
|
|
87
|
+
โ ์ค์น: leerness skill auto-install --yes
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
๋๊ธฐ: `--no-official-skills` ๋๋ `LEERNESS_NO_OFFICIAL_SKILLS=1`.
|
|
91
|
+
|
|
92
|
+
### 3. CLI: `leerness skill auto-cache <sub>`
|
|
93
|
+
- `status` (default) โ ์บ์ ๋์ด / ๋ง๋ฃ / preset / entry ์ + ์ํ 3๊ฑด
|
|
94
|
+
- `refresh` โ vercel-labs + anthropics ๋๊ธฐํ (์ค์ธก 25 entries / 612ms)
|
|
95
|
+
- `clear` โ ์บ์ ์ญ์
|
|
96
|
+
|
|
97
|
+
### 4. ๋์ ํ๊ท (1.9.186~191)
|
|
98
|
+
| ๋ฒ์ | ํต์ฌ ๊ฒ์ฆ ํญ๋ชฉ | ์ ์ง |
|
|
99
|
+
|---|---|---|
|
|
100
|
+
| 1.9.191 | ๊ตฌ์กฐ ์ต์ ํ ๋ณด๊ณ ์ 88/100 | โ |
|
|
101
|
+
| 1.9.190 | _selectOne/_selectMany Ctrl+C ์ฆ์ ์ข
๋ฃ | โ |
|
|
102
|
+
| 1.9.189 | _showSlashCommandList + Tab cycle ํ ์ค ๊ฐฑ์ | โ |
|
|
103
|
+
| 1.9.188 | stdin prompt ์ ๋ฌ (useStdinForPrompt) | โ |
|
|
104
|
+
| 1.9.187 | _loadLeernessConfig (.harness/leerness-config.json) | โ |
|
|
105
|
+
| 1.9.186 | _cliChatStream shell:true (Windows .cmd) | โ |
|
|
106
|
+
|
|
107
|
+
### 5. stress-v137 โ 17/17 PASS
|
|
108
|
+
- ๋ณด๊ณ ์ + ํจ์ + ํค๋๋ผ์ธ + body + CLI + ํค๋๋ผ์ธ ๋
ธ์ถ (8)
|
|
109
|
+
- ์ฑ๋ฅ hot path: --version cold start avg **398 ms** (3 samples: 417/395/381) ยท MCP 54 ๋๊ตฌ **387 ms** (2)
|
|
110
|
+
- ๋์ ํ๊ท 1.9.186~191 (7)
|
|
111
|
+
|
|
112
|
+
### 6. 5์ถ ๋งคํธ๋ฆญ์ค ๋ณ๋ (๋ชฉํ)
|
|
113
|
+
| ์ถ | 1.9.191 | 1.9.192 | ฮ |
|
|
114
|
+
|---|---|---|---|
|
|
115
|
+
| C. ๊ณต์ ํ์ค ์คํฌ ์๋ ํ์ฉ | 8/10 | **9/10** | +1 (handoff ์๋ ๋
ธ์ถ + 24h ์บ์) |
|
|
116
|
+
| ์ข
ํฉ | 44/50 (88%) | **45/50 (90%)** | +2% |
|
|
117
|
+
|
|
118
|
+
### 7. ์๋ release ํ๋ฆ ์ ์ง
|
|
119
|
+
- main ์๋ push **54 ๋ผ์ด๋** ์ฐ์ (1.9.140~192)
|
|
120
|
+
- npm publish ์๋ (1.9.178~)
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
3
124
|
## 1.9.191 โ 2026-05-21
|
|
4
125
|
|
|
5
126
|
**๐ ๊ตฌ์กฐ ์ต์ ํ ์ค ์ธก์ + ๋ชฉ์ ๋งคํธ๋ฆญ์ค 88/100 + ScheduleWakeup ์์ ํ (์ฌ์ฉ์ ๋ช
์ 3์ข
).**
|
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.193 AI Agent Reliability Harness + Sandbox โ
|
|
16
16
|
โ verify ยท remember ยท orchestrate ยท audit ยท sandbox ยท drift โ
|
|
17
|
-
โ
|
|
17
|
+
โ ๐ค multi-agent consensus lessons ์๋ ยท 91/100 ยท 123 ๋ผ์ด๋ โ
|
|
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.193';
|
|
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 ์ฒ๋ฆฌ).
|
|
@@ -1618,6 +1618,50 @@ async function skillAutoInstallCmd(root) {
|
|
|
1618
1618
|
log(`โ auto-install ์๋ฃ: ${installed}๊ฑด ์ค์น / ${failed}๊ฑด ์คํจ / ${matched.length - installed - failed}๊ฑด skip`);
|
|
1619
1619
|
}
|
|
1620
1620
|
|
|
1621
|
+
// 1.9.192: skill auto-cache CLI โ refresh|status|clear (C์ถ ๋ณด๊ฐ ์ฌ์ฉ์ ๋ช
์)
|
|
1622
|
+
async function skillAutoCacheCmd(root, sub) {
|
|
1623
|
+
root = absRoot(root);
|
|
1624
|
+
const fp = _officialSkillCachePath(root);
|
|
1625
|
+
if (sub === 'refresh') {
|
|
1626
|
+
log(`# leerness skill auto-cache refresh (1.9.192)`);
|
|
1627
|
+
log(` presets: ${Object.keys(SKILL_CATALOG_PRESETS).join(', ')}`);
|
|
1628
|
+
log(` fetching...`);
|
|
1629
|
+
const t0 = Date.now();
|
|
1630
|
+
const entries = await _refreshOfficialSkillCache(root);
|
|
1631
|
+
const dt = Date.now() - t0;
|
|
1632
|
+
if (entries.length > 0) {
|
|
1633
|
+
log(`โ ์บ์ ๊ฐฑ์ ์๋ฃ: ${entries.length}๊ฐ entry / ${dt}ms`);
|
|
1634
|
+
log(` โ ${rel(root, fp)}`);
|
|
1635
|
+
} else {
|
|
1636
|
+
log(`โ ์บ์ ๊ฐฑ์ ์คํจ (network/offline?) โ 0 entries`);
|
|
1637
|
+
}
|
|
1638
|
+
return;
|
|
1639
|
+
}
|
|
1640
|
+
if (sub === 'clear') {
|
|
1641
|
+
if (exists(fp)) { fs.unlinkSync(fp); log(`โ ์บ์ ์ญ์ : ${rel(root, fp)}`); }
|
|
1642
|
+
else log(`(์บ์ ์์)`);
|
|
1643
|
+
return;
|
|
1644
|
+
}
|
|
1645
|
+
// status (default)
|
|
1646
|
+
log(`# leerness skill auto-cache status (1.9.192)`);
|
|
1647
|
+
const c = _loadOfficialSkillCache(root);
|
|
1648
|
+
if (!c) {
|
|
1649
|
+
log(` โ ์บ์ ์์ โ \`leerness skill auto-cache refresh\` ๋ก ์์ฑ`);
|
|
1650
|
+
return;
|
|
1651
|
+
}
|
|
1652
|
+
const ageH = Math.floor(c.ageMs / 3600000);
|
|
1653
|
+
log(` ํ์ผ: ${rel(root, fp)}`);
|
|
1654
|
+
log(` ์์ฑ: ${c.at} (${ageH}h ago)${c.expired ? ' โ ๋ง๋ฃ (24h+)' : ' โ'}`);
|
|
1655
|
+
log(` presets: ${(c.presets || []).join(', ')}`);
|
|
1656
|
+
log(` entries: ${c.entries.length}๊ฑด`);
|
|
1657
|
+
log('');
|
|
1658
|
+
log(` ์ํ 3๊ฑด:`);
|
|
1659
|
+
for (const e of c.entries.slice(0, 3)) {
|
|
1660
|
+
log(` โข [${e.preset || e.source || '?'}] ${e.name} โ ${(e.description || '').slice(0, 60)}`);
|
|
1661
|
+
}
|
|
1662
|
+
if (c.expired) log(` โ ๊ฐฑ์ : leerness skill auto-cache refresh`);
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1621
1665
|
// 1.9.182: handoff ์ปจํ
์คํธ (ํ์ฌ in-progress task) ์์ ์๋ query ์ถ์ถ
|
|
1622
1666
|
function _autoInstallQueryFromHandoff(root) {
|
|
1623
1667
|
try {
|
|
@@ -1628,6 +1672,67 @@ function _autoInstallQueryFromHandoff(root) {
|
|
|
1628
1672
|
return null;
|
|
1629
1673
|
}
|
|
1630
1674
|
|
|
1675
|
+
// 1.9.192: ๊ณต์ organization skill catalog 24h ์บ์ โ C์ถ (๊ณต์ ํ์ค ์คํฌ ์๋ ํ์ฉ) ๋ณด๊ฐ
|
|
1676
|
+
// ์ฌ์ฉ์ ๋ช
์ (1.9.191): "๊ณต์ ํ์คํ๋ ์คํฌ์ ์ ์ฌ์ ์๋ก ์๋ ํ์ฉ ... ๊ฒ์ผ๋ฆ ๋ฐฉ์ง๋ฑ๋ฑ ์ต๊ณ ์ ๋๊ตฌ"
|
|
1677
|
+
// handoff ๋ง๋ค GitHub Contents API ํธ์ถํ์ง ์๋๋ก 24h TTL โ offline / rate-limit ํํผ
|
|
1678
|
+
// ์บ์ ์์น: .harness/skill-auto-cache.json (์ฒดํฌ์ธ ๊ฐ๋ฅ โ ๋น์ํฌ๋ฆฟ)
|
|
1679
|
+
const _OFFICIAL_SKILL_CACHE_TTL_MS = 24 * 3600 * 1000;
|
|
1680
|
+
function _officialSkillCachePath(root) { return path.join(root, '.harness', 'skill-auto-cache.json'); }
|
|
1681
|
+
function _loadOfficialSkillCache(root) {
|
|
1682
|
+
try {
|
|
1683
|
+
const fp = _officialSkillCachePath(root);
|
|
1684
|
+
if (!exists(fp)) return null;
|
|
1685
|
+
const j = JSON.parse(read(fp));
|
|
1686
|
+
if (!j.at || !Array.isArray(j.entries)) return null;
|
|
1687
|
+
const ageMs = Date.now() - new Date(j.at).getTime();
|
|
1688
|
+
return { ...j, ageMs, expired: ageMs > _OFFICIAL_SKILL_CACHE_TTL_MS };
|
|
1689
|
+
} catch { return null; }
|
|
1690
|
+
}
|
|
1691
|
+
function _writeOfficialSkillCache(root, entries, presets) {
|
|
1692
|
+
try {
|
|
1693
|
+
mkdirp(path.join(root, '.harness'));
|
|
1694
|
+
writeUtf8(_officialSkillCachePath(root), JSON.stringify({ at: new Date().toISOString(), presets, entries }, null, 2));
|
|
1695
|
+
return true;
|
|
1696
|
+
} catch { return false; }
|
|
1697
|
+
}
|
|
1698
|
+
async function _refreshOfficialSkillCache(root) {
|
|
1699
|
+
const presets = Object.keys(SKILL_CATALOG_PRESETS);
|
|
1700
|
+
const allEntries = [];
|
|
1701
|
+
for (const key of presets) {
|
|
1702
|
+
const p = SKILL_CATALOG_PRESETS[key];
|
|
1703
|
+
if (!p) continue;
|
|
1704
|
+
try {
|
|
1705
|
+
const r = await _fetchGitHubSkills(p.owner, p.repo, p.branch, p.path);
|
|
1706
|
+
if (r.ok) {
|
|
1707
|
+
for (const s of r.skills) allEntries.push({ ...s, preset: key });
|
|
1708
|
+
}
|
|
1709
|
+
} catch {}
|
|
1710
|
+
}
|
|
1711
|
+
if (allEntries.length > 0) _writeOfficialSkillCache(root, allEntries, presets);
|
|
1712
|
+
return allEntries;
|
|
1713
|
+
}
|
|
1714
|
+
// query (in-progress task keyword) ์ ๋งค์นญ๋๋ entries ์ถ์ถ
|
|
1715
|
+
function _matchOfficialSkillsFromCache(root, query, max) {
|
|
1716
|
+
max = max || 3;
|
|
1717
|
+
const cache = _loadOfficialSkillCache(root);
|
|
1718
|
+
if (!cache || !cache.entries || cache.entries.length === 0) return { entries: [], total: 0, ageHours: null, expired: false, cacheTotal: 0 };
|
|
1719
|
+
const q = String(query || '').toLowerCase().split(/\s+/).filter(Boolean);
|
|
1720
|
+
let matched = cache.entries;
|
|
1721
|
+
if (q.length > 0) {
|
|
1722
|
+
matched = cache.entries.filter(e => {
|
|
1723
|
+
const hay = ((e.name || '') + ' ' + (e.description || '')).toLowerCase();
|
|
1724
|
+
return q.some(token => token.length >= 2 && hay.includes(token));
|
|
1725
|
+
});
|
|
1726
|
+
}
|
|
1727
|
+
return {
|
|
1728
|
+
entries: matched.slice(0, max),
|
|
1729
|
+
total: matched.length,
|
|
1730
|
+
ageHours: Math.floor(cache.ageMs / 3600000),
|
|
1731
|
+
expired: cache.expired,
|
|
1732
|
+
cacheTotal: cache.entries.length
|
|
1733
|
+
};
|
|
1734
|
+
}
|
|
1735
|
+
|
|
1631
1736
|
// skill export <id> โ ๊ธฐ์กด ์์ฒด skill์ agentskills.io ํ์ค SKILL.md๋ก export
|
|
1632
1737
|
function skillExportCmd(root, id) {
|
|
1633
1738
|
if (!id) { fail('์ฌ์ฉ๋ฒ: leerness skill export <id>'); return process.exit(1); }
|
|
@@ -3265,10 +3370,21 @@ function handoff(root) {
|
|
|
3265
3370
|
if (slashCount > 0) parts.push(`๐ช slash 24h ${slashCount}ํ`);
|
|
3266
3371
|
}
|
|
3267
3372
|
} catch {}
|
|
3373
|
+
// 10) 1.9.192: ๊ณต์ organization skill catalog ์บ์ ๋งค์นญ (C์ถ ๋ณด๊ฐ โ ์ฌ์ฉ์ ๋ช
์)
|
|
3374
|
+
// handoff ๋ง๋ค GitHub API ํธ์ถ X (24h TTL ์บ์) โ in-progress task keyword ์ ๋งค์นญ๋๋ ๊ณต์ ์คํฌ ์ ๋
ธ์ถ
|
|
3375
|
+
try {
|
|
3376
|
+
const q = _autoInstallQueryFromHandoff(root);
|
|
3377
|
+
const m = _matchOfficialSkillsFromCache(root, q, 3);
|
|
3378
|
+
if (m.cacheTotal > 0) {
|
|
3379
|
+
const ageStr = m.ageHours != null ? (m.ageHours < 24 ? `${m.ageHours}h` : `${Math.floor(m.ageHours/24)}d`) : '?';
|
|
3380
|
+
const status = m.expired ? 'โ ' : 'โ';
|
|
3381
|
+
parts.push(`๐ official ${m.total}/${m.cacheTotal} (${ageStr}${status})`);
|
|
3382
|
+
}
|
|
3383
|
+
} catch {}
|
|
3268
3384
|
if (parts.length) {
|
|
3269
3385
|
const isTty = process.stdout && process.stdout.isTTY;
|
|
3270
3386
|
const cy = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
3271
|
-
log(cy(`๐ ํค๋๋ผ์ธ (1.9.81/93/113/152/162): ${parts.join(' ยท ')}`));
|
|
3387
|
+
log(cy(`๐ ํค๋๋ผ์ธ (1.9.81/93/113/152/162/192): ${parts.join(' ยท ')}`));
|
|
3272
3388
|
}
|
|
3273
3389
|
} catch {}
|
|
3274
3390
|
}
|
|
@@ -3405,6 +3521,39 @@ function handoff(root) {
|
|
|
3405
3521
|
}
|
|
3406
3522
|
} catch {}
|
|
3407
3523
|
}
|
|
3524
|
+
// 1.9.192: ๊ณต์ organization skill catalog ์๋ ๋งค์นญ (C์ถ ๋ณด๊ฐ โ ์ฌ์ฉ์ ์๋)
|
|
3525
|
+
// "๊ณต์ ํ์คํ๋ ์คํฌ์ ์ ์ฌ์ ์๋ก ์๋ ํ์ฉ ... ์ต๊ณ ์ ๋๊ตฌ" โ handoff ์ keyword ๊ธฐ๋ฐ ์๋ ์ถ์ฒ
|
|
3526
|
+
// ์บ์ (.harness/skill-auto-cache.json, 24h TTL) ์ฌ์ฉ โ GitHub API ๋ถ๋ด X
|
|
3527
|
+
// 1.9.193: cache age > 7์ผ โ ์๋ refresh ๊ถ์ฅ hint ๊ฐํ
|
|
3528
|
+
// ๋๊ธฐ: --no-official-skills ๋๋ LEERNESS_NO_OFFICIAL_SKILLS=1
|
|
3529
|
+
if (!has('--no-official-skills') && !has('--quiet') && process.env.LEERNESS_NO_OFFICIAL_SKILLS !== '1') {
|
|
3530
|
+
try {
|
|
3531
|
+
const ofm = _matchOfficialSkillsFromCache(root, latestRow.request, 3);
|
|
3532
|
+
if (ofm.entries.length > 0) {
|
|
3533
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
3534
|
+
const cyan = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
3535
|
+
const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
3536
|
+
const yel = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
3537
|
+
const cacheAge = ofm.ageHours != null ? (ofm.ageHours < 24 ? `${ofm.ageHours}h` : `${Math.floor(ofm.ageHours/24)}d`) : '?';
|
|
3538
|
+
// 1.9.193: cache age 7์ผ ์ด์์ด๋ฉด ๊ฐ์กฐ ํ์ (week stale)
|
|
3539
|
+
const veryStale = ofm.ageHours != null && ofm.ageHours >= 24 * 7;
|
|
3540
|
+
log(cyan(`## ๐ ๊ณต์ organization ์คํฌ ์๋ ๋งค์นญ (1.9.192/193) โ ํค์๋ "${keyword}"`));
|
|
3541
|
+
const ageLabel = veryStale ? yel(`${cacheAge} โ 7์ผ+`) : (ofm.expired ? yel(`${cacheAge} โ ๋ง๋ฃ`) : `${cacheAge} โ`);
|
|
3542
|
+
log(dim(` vercel-labs/anthropics ๋ฑ catalog ์บ์ ${ageLabel} ยท ${ofm.total}/${ofm.cacheTotal}๊ฑด ๋งค์นญ`));
|
|
3543
|
+
for (const e of ofm.entries) {
|
|
3544
|
+
log(dim(` โข [${e.preset || e.source || '?'}] ${e.name} โ ${(e.description || '').slice(0, 70)}`));
|
|
3545
|
+
}
|
|
3546
|
+
log(dim(` โ ์ค์น: leerness skill auto-install --yes`));
|
|
3547
|
+
if (ofm.expired || veryStale) log(yel(` โ ๊ฐฑ์ ๊ถ์ฅ: leerness skill auto-cache refresh (1.9.193 ${veryStale ? '7์ผ+ stale' : '24h+ expired'})`));
|
|
3548
|
+
log('');
|
|
3549
|
+
} else if (ofm.cacheTotal === 0) {
|
|
3550
|
+
// ์บ์ ์์ โ ์ฒซ ์ฌ์ฉ ์๋ด
|
|
3551
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
3552
|
+
const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
3553
|
+
log(dim(` ๐ก ๊ณต์ ์คํฌ catalog ์บ์ ์์ โ \`leerness skill auto-cache refresh\` ๋ก vercel-labs/anthropics ์บ์ ์์ฑ (1.9.192)`));
|
|
3554
|
+
}
|
|
3555
|
+
} catch {}
|
|
3556
|
+
}
|
|
3408
3557
|
}
|
|
3409
3558
|
} catch {}
|
|
3410
3559
|
}
|
|
@@ -5903,6 +6052,21 @@ function agentsCmd(root, sub, ...args) {
|
|
|
5903
6052
|
const block = `\n## ${today()} agents multi --execute (1.9.156)\n- task: ${task.slice(0, 200)}\n- agents: ${ready.map(x => x.def.id).join(', ')}\n- success: ${ok.length}/${ready.length}\n- best: ${best.agent} (score=${best.score.toFixed(3)})\n`;
|
|
5904
6053
|
append(tlp, block);
|
|
5905
6054
|
} catch {}
|
|
6055
|
+
// 1.9.193: B์ถ (๋ฉํฐ Sub-Agent ์ค์ผ์คํธ๋ผ) ๋ณด๊ฐ โ consensus ๊ฒฐ๊ณผ๋ฅผ lessons.md ์ ์๋ ๊ธฐ๋ก
|
|
6056
|
+
// ๊ฐ์ task ์ฌ์๋ ์ ๊ณผ๊ฑฐ best agent + score ๊ฐ handoff lessons auto-recall ์์ ๋งค์นญ
|
|
6057
|
+
// ๋๊ธฐ: LEERNESS_NO_MULTIAGENT_LESSON=1
|
|
6058
|
+
if (process.env.LEERNESS_NO_MULTIAGENT_LESSON !== '1') {
|
|
6059
|
+
try {
|
|
6060
|
+
const lp = lessonsPath(root);
|
|
6061
|
+
const lessonBlock = `\n### ${today()} multi-agent consensus โ best=${best.agent} (1.9.193)\n`
|
|
6062
|
+
+ `- task: ${task.slice(0, 200)}\n`
|
|
6063
|
+
+ `- agents: ${ready.map(x => x.def.id).join(', ')} (${ok.length}/${ready.length} success)\n`
|
|
6064
|
+
+ `- best agent: ${best.agent}, score=${best.score.toFixed(3)}\n`
|
|
6065
|
+
+ (scored.length > 1 ? `- others: ${scored.slice(1, 4).map(s => `${s.agent}=${s.score.toFixed(2)}`).join(', ')}\n` : '')
|
|
6066
|
+
+ `- lesson: ๊ฐ์ keyword ์ฌ๋ฐ ์ ${best.agent} ์ฐ์ ์๋ (multi-signal consensus ์
์ฆ)\n`;
|
|
6067
|
+
append(lp, lessonBlock);
|
|
6068
|
+
} catch {}
|
|
6069
|
+
}
|
|
5906
6070
|
}
|
|
5907
6071
|
if (failures.length && !best) {
|
|
5908
6072
|
process.exitCode = 1;
|
|
@@ -14105,6 +14269,8 @@ async function main() {
|
|
|
14105
14269
|
if (cmd === 'skill' && args[1] === 'suggest') return skillSuggestCmd(absRoot(arg('--path', process.cwd())));
|
|
14106
14270
|
// 1.9.182: leerness skill auto-install โ ๊ณต์ catalog ์๋ ํ์ + skill match ๋งค์นญ ์ ์๋ install (์ฌ์ฉ์ ๋ช
์)
|
|
14107
14271
|
if (cmd === 'skill' && args[1] === 'auto-install') return await skillAutoInstallCmd(absRoot(arg('--path', process.cwd())));
|
|
14272
|
+
// 1.9.192: skill auto-cache โ ๊ณต์ organization catalog 24h ์บ์ ๊ด๋ฆฌ (C์ถ ๋ณด๊ฐ)
|
|
14273
|
+
if (cmd === 'skill' && args[1] === 'auto-cache') return await skillAutoCacheCmd(absRoot(arg('--path', process.cwd())), args[2] || 'status');
|
|
14108
14274
|
if (cmd === 'mcp' && args[1] === 'serve') return mcpServeCmd(absRoot(arg('--path', process.cwd())));
|
|
14109
14275
|
if (cmd === 'gate') return gate(args[1] || process.cwd());
|
|
14110
14276
|
if (cmd === 'verify-code') return verifyCodeCmd(args[1] || process.cwd());
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.193",
|
|
4
4
|
"description": "Leerness: ๋นํ๊ดด ๋ง์ด๊ทธ๋ ์ด์
, ์๋ ๋ฒ์ ๊ฐ์งยท์
๋ฐ์ดํธ, ๊ณํ/์งํ/ํธ๋์คํ ์๋ํ, ๊ฒ์ผ๋ฆยท์ํฌ๋ฆฟยท์ธ์ฝ๋ฉ ์๋ ๊ฐ๋, Claude Code ์ฌ๋์ ํตํฉ์ ๊ฐ์ถ ํ๊ตญ์ด ์ฐ์ AI ๊ฐ๋ฐ ํ๋ค์ค.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|