leerness 1.9.192 โ 1.9.194
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 +108 -0
- package/README.md +3 -3
- package/bin/harness.js +175 -4
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,113 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.194 โ 2026-05-21
|
|
4
|
+
|
|
5
|
+
**๐ฏ E์ถ (๊ฒ์ผ๋ฆ ๋ฐฉ์ง) ๋ณด๊ฐ โ handoff ๋ค์ ๋จ๊ณ ์๋ ์ ์ + 24h+ ๋ฌด์ง์ฒ lazy ๊ฐ์ง.**
|
|
6
|
+
|
|
7
|
+
์์จ ๋ชจ๋ 124 ๋ผ์ด๋. 1.9.192 C์ถ / 1.9.193 B์ถ ๋ณด๊ฐ์ ์ด์ด **E์ถ (9/10 โ ๋ชฉํ 9.5/10)** ๋ณด๊ฐ.
|
|
8
|
+
|
|
9
|
+
### ์ฌ์ฉ์ ์๋ ์ ๋ ฌ (1.9.191 verbatim)
|
|
10
|
+
> *"๊ฒ์ผ๋ฆ ๋ฐฉ์ง๋ฑ๋ฑ ์ต๊ณ ์ ๋๊ตฌ"*
|
|
11
|
+
|
|
12
|
+
### 1. handoff ๋ค์ ๋จ๊ณ ์๋ ์ ์ (E์ถ ํต์ฌ)
|
|
13
|
+
- ํ์ฌ in-progress task description + Memory Surface (decisions/lessons/plan) ์กฐํฉ โ ๋ค์ ๋จ๊ณ 1-3๊ฐ ์ ์
|
|
14
|
+
- ์ฌ์ฉ์/AI ๊ฐ "Next Exact Step" ์ ์ง์ ์ฑ์ฐ์ง ์์๋ ์ฆ์ ๋
ธ์ถ
|
|
15
|
+
- **7๊ฐ ํด๋ฆฌ์คํฑ**:
|
|
16
|
+
1. lessons.md ์คํจ ๋งค์นญ โ ํํผ ์ ๋ต ์ ์ฉ (`leerness lessons --auto`)
|
|
17
|
+
2. plan.md milestone ๋งค์นญ โ milestone ๊ฒ์ฆ (`leerness plan list`)
|
|
18
|
+
3. decisions.md ๊ฒฐ์ ๋งค์นญ โ ์ํฅ ํ์ธ (`leerness decision list`)
|
|
19
|
+
4. review-evidence.md ๋ถ์ฌ โ e2e ์คํ (`node ./scripts/e2e.js`)
|
|
20
|
+
5. 24h+ ์ ์ฒด โ task status ๊ฐฑ์ (`leerness task update`)
|
|
21
|
+
6. ๋ฒ์ ๋ณ๋ task โ CHANGELOG/README ๊ฐฑ์ ํ์ธ (`leerness whats-new`)
|
|
22
|
+
7. stress test ๋๋ฝ โ ์ stress ์์ฑ ๊ถ์ฅ
|
|
23
|
+
- ๋๊ธฐ: `--no-next-actions` ๋๋ `LEERNESS_NO_NEXT_ACTIONS=1`
|
|
24
|
+
|
|
25
|
+
### 2. 24h+ ๋ฌด ์ง์ฒ lazy ๊ฐ์ง
|
|
26
|
+
- progress-tracker.md mtime โฅ 24h โ `## โ ์ง์ฒ ์ ์ฒด ๊ฐ์ง` ์๋ ์ถ๋ ฅ
|
|
27
|
+
- ํ์ฌ in-progress task ID + request ์์ฝ ํ์
|
|
28
|
+
- ๊ถ์ฅ ๋ช
๋ น: `leerness task update <id> --status` / `leerness lazy detect --json`
|
|
29
|
+
- ๋๊ธฐ: `--no-lazy-warn` ๋๋ `LEERNESS_NO_LAZY_WARN=1`
|
|
30
|
+
|
|
31
|
+
### 3. ๋์ ํ๊ท (1.9.188~193) โ ๋ชจ๋ ์ ์ง
|
|
32
|
+
- [1.9.193] agents multi consensus โ lessons.md ์๋
|
|
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 ์ ๋ฌ
|
|
38
|
+
|
|
39
|
+
### 4. stress-v139 โ 15/15 PASS
|
|
40
|
+
- E์ถ ๋ณด๊ฐ (6: ํจ์ + ์น์
+ ์์ ์ํฌ์คํ์ด์ค ํตํฉ) + ์ฑ๋ฅ (2) + ๋์ ํ๊ท (7)
|
|
41
|
+
- ์์ ์ํฌ์คํ์ด์ค mtime 25h ๊ฐ์ โ โ ์ง์ฒ ์ ์ฒด ๊ฐ์ง โ
|
|
42
|
+
- ์ฑ๋ฅ: --version cold start avg **479 ms** ยท MCP 54 ๋๊ตฌ **416 ms**
|
|
43
|
+
|
|
44
|
+
### 5. 5์ถ ๋งคํธ๋ฆญ์ค ๋ณ๋
|
|
45
|
+
| ์ถ | 1.9.193 | 1.9.194 | ฮ |
|
|
46
|
+
|---|---|---|---|
|
|
47
|
+
| E. ๊ฒ์ผ๋ฆ ๋ฐฉ์ง | 9/10 | **9.5/10** | +0.5 (๋ค์ ๋จ๊ณ ์๋ ์ ์ + lazy ๊ฐ์ง) |
|
|
48
|
+
| ์ข
ํฉ | 45.5/50 (91%) | **46/50 (92%)** | +1% |
|
|
49
|
+
|
|
50
|
+
### 6. ์๋ release ํ๋ฆ
|
|
51
|
+
- main ์๋ push **56 ๋ผ์ด๋ ์ฐ์** (1.9.140~194)
|
|
52
|
+
- npm publish ์๋ (1.9.178~)
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 1.9.193 โ 2026-05-21
|
|
57
|
+
|
|
58
|
+
**๐ค B์ถ (๋ฉํฐ Sub-Agent ์ค์ผ์คํธ๋ผ) ๋ณด๊ฐ โ agents multi consensus ๊ฒฐ๊ณผ ์๋ lessons.md ์ ์ฅ + ์บ์ 7์ผ stale hint.**
|
|
59
|
+
|
|
60
|
+
์์จ ๋ชจ๋ 123 ๋ผ์ด๋. 1.9.192 C์ถ ๋ณด๊ฐ์ ์ด์ด, 5์ถ ๋งคํธ๋ฆญ์ค์์ ๋ ๋ฒ์งธ๋ก ์ ์๊ฐ ๋ฎ์๋ **B์ถ (8.5/10 โ ๋ชฉํ 9/10)** ๋ณด๊ฐ.
|
|
61
|
+
|
|
62
|
+
### ์ฌ์ฉ์ ์๋ ์ ๋ ฌ (1.9.191 verbatim)
|
|
63
|
+
> *"๋ฉํฐ ์๋ธ ์์ด์ ํธ ์ค์ผ์คํธ๋ผ ... ์ต๊ณ ์ ๋๊ตฌ"*
|
|
64
|
+
|
|
65
|
+
### 1. agents multi --execute โ lessons.md ์๋ ์ ์ฅ (B์ถ ํต์ฌ)
|
|
66
|
+
- ๋งค `agents multi --execute` ํธ์ถ ์ consensus best agent + score ๊ฐ `.harness/lessons.md`์ ๊ธฐ๋ก
|
|
67
|
+
- ๊ฐ์ keyword ์ฌ๋ฐ ์ handoff lessons auto-recall (1.9.56)๊ฐ ์๋ ๋งค์นญ โ ๊ณผ๊ฑฐ best agent ์ฐ์ ์๋
|
|
68
|
+
- ๋๊ธฐ: `LEERNESS_NO_MULTIAGENT_LESSON=1`
|
|
69
|
+
|
|
70
|
+
**lesson ๋ธ๋ก ํฌ๋งท:**
|
|
71
|
+
```markdown
|
|
72
|
+
### 2026-05-21 multi-agent consensus โ best=claude (1.9.193)
|
|
73
|
+
- task: ...
|
|
74
|
+
- agents: claude, codex, gemini (3/3 success)
|
|
75
|
+
- best agent: claude, score=0.873
|
|
76
|
+
- others: codex=0.71, gemini=0.65
|
|
77
|
+
- lesson: ๊ฐ์ keyword ์ฌ๋ฐ ์ claude ์ฐ์ ์๋ (multi-signal consensus ์
์ฆ)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 2. skill auto-cache age 7์ผ stale ๊ฐ์กฐ (1.9.192 ํ์)
|
|
81
|
+
- handoff body์์ ์บ์ age โฅ 7์ผ (veryStale) ์ `โ 7์ผ+` ํ์
|
|
82
|
+
- ๊ฐฑ์ ๊ถ์ฅ hint: `1.9.193 7์ผ+ stale` ๋๋ `24h+ expired` ๋ช
์
|
|
83
|
+
- ์ฌ์ฉ์๊ฐ "์ค๋๋ catalog ์์ ์ธ์ง" โ ์๋ ๊ฒ์ผ๋ฆ ๋ฐฉ์ง
|
|
84
|
+
|
|
85
|
+
### 3. ๋์ ํ๊ท (1.9.187~192) โ ๋ชจ๋ ์ ์ง
|
|
86
|
+
- [1.9.192] _loadOfficialSkillCache + 24h ์บ์
|
|
87
|
+
- [1.9.191] ๊ตฌ์กฐ ์ต์ ํ ๋ณด๊ณ ์ 88/100
|
|
88
|
+
- [1.9.190] _selectOne/_selectMany Ctrl+C ์ฆ์ ์ข
๋ฃ
|
|
89
|
+
- [1.9.189] _showSlashCommandList + Tab cycle ํ ์ค ๊ฐฑ์
|
|
90
|
+
- [1.9.188] stdin prompt ์ ๋ฌ (useStdinForPrompt)
|
|
91
|
+
- [1.9.187] _loadLeernessConfig (.harness/leerness-config.json)
|
|
92
|
+
|
|
93
|
+
### 4. stress-v138 โ 16/16 PASS
|
|
94
|
+
- consensus auto-lessons (3) + cache age hint (2) + 1.9.192 ์์กด (2)
|
|
95
|
+
- ์ฑ๋ฅ: --version cold start avg **396 ms** (376/382/430) ยท MCP 54 ๋๊ตฌ **369 ms**
|
|
96
|
+
- ๋์ ํ๊ท 1.9.187~192 (7)
|
|
97
|
+
|
|
98
|
+
### 5. 5์ถ ๋งคํธ๋ฆญ์ค ๋ณ๋
|
|
99
|
+
| ์ถ | 1.9.192 | 1.9.193 | ฮ |
|
|
100
|
+
|---|---|---|---|
|
|
101
|
+
| B. ๋ฉํฐ Sub-Agent ์ค์ผ์คํธ๋ผ | 8.5/10 | **9/10** | +0.5 (consensus ์๋ lessons โ ํ์ต ์ฌ์ดํด ์์ฑ) |
|
|
102
|
+
| C. ๊ณต์ ํ์ค ์คํฌ ์๋ ํ์ฉ | 9/10 | 9/10 | (์ ์ง) |
|
|
103
|
+
| ์ข
ํฉ | 45/50 (90%) | **45.5/50 (91%)** | +1% |
|
|
104
|
+
|
|
105
|
+
### 6. ์๋ release ํ๋ฆ
|
|
106
|
+
- main ์๋ push **55 ๋ผ์ด๋ ์ฐ์** (1.9.140~193)
|
|
107
|
+
- npm publish ์๋ (1.9.178~)
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
3
111
|
## 1.9.192 โ 2026-05-21
|
|
4
112
|
|
|
5
113
|
**๐ C์ถ (๊ณต์ ํ์ค ์คํฌ ์๋ ํ์ฉ) ๋ณด๊ฐ โ handoff์ ๊ณต์ organization catalog ์๋ ๋
ธ์ถ + 24h ์บ์.**
|
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.194 AI Agent Reliability Harness + Sandbox โ
|
|
16
16
|
โ verify ยท remember ยท orchestrate ยท audit ยท sandbox ยท drift โ
|
|
17
|
-
โ
|
|
17
|
+
โ ๐ฏ handoff next-actions ์๋ ์ ์ ยท 92/100 ยท 124 ๋ผ์ด๋ โ
|
|
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.194';
|
|
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 ์ฒ๋ฆฌ).
|
|
@@ -1662,6 +1662,112 @@ async function skillAutoCacheCmd(root, sub) {
|
|
|
1662
1662
|
if (c.expired) log(` โ ๊ฐฑ์ : leerness skill auto-cache refresh`);
|
|
1663
1663
|
}
|
|
1664
1664
|
|
|
1665
|
+
// 1.9.194: E์ถ (๊ฒ์ผ๋ฆ ๋ฐฉ์ง) โ handoff ์์ ๋ค์ ๋จ๊ณ 1-3๊ฐ ์๋ ์ ์
|
|
1666
|
+
// ํ์ฌ in-progress task description + Memory Surface (decisions/lessons/plan) ์กฐํฉ โ
|
|
1667
|
+
// "๋ค์ ๋จ๊ณ๋ก ๋ฌด์์ ํ ์ง" ์ถ๋ก (์ฌ์ฉ์/AI ์ง์ ์
๋ ฅ ์์ด ์ฆ์ ๋
ธ์ถ)
|
|
1668
|
+
// ์๊ณ ๋ฆฌ์ฆ:
|
|
1669
|
+
// 1) lessons.md ์ keyword ๋งค์นญ + ์คํจ/๋กค๋ฐฑ ํค์๋ โ "ํํผ ์ ๋ต ์ ์ฉ"
|
|
1670
|
+
// 2) plan.md ์ keyword ๋งค์นญ + M-XXXX โ "๊ณํ milestone ๊ฒ์ฆ"
|
|
1671
|
+
// 3) decisions.md ์ keyword ๋งค์นญ โ "๊ฒฐ์ N ์ํฅ ํ์ธ"
|
|
1672
|
+
// 4) review-evidence.md ๋ถ์ฌ โ "verify-code ๋๋ e2e ์คํ"
|
|
1673
|
+
// 5) progress-tracker.md 24h+ ์ ์ฒด โ "task status ๊ฐฑ์ "
|
|
1674
|
+
// 6) CHANGELOG ๋ณด๊ฐ ๋ถ์ฌ โ "๋ฒ์ ๋ณ๊ฒฝ ์ CHANGELOG ๊ฐฑ์ "
|
|
1675
|
+
// 7) stress-vXXX ๋๋ฝ โ "stress test ์์ฑ"
|
|
1676
|
+
// 1.9.116 brainstorm ํ์์ ๋ค๋ฅธ ์ : brainstorm ์ "๊ด๋ จ hits ํ์" / next-actions ๋ "๋ค์ ์คํ ๋ช
๋ น ์ ์"
|
|
1677
|
+
function _suggestNextActions(root, latestRow, keyword) {
|
|
1678
|
+
const actions = [];
|
|
1679
|
+
const taskText = String(latestRow.request || '').toLowerCase();
|
|
1680
|
+
const fuzzyRe = keyword ? new RegExp(escapeRegex(keyword.slice(0, Math.max(4, Math.floor(keyword.length * 0.7)))), 'i') : null;
|
|
1681
|
+
|
|
1682
|
+
// 1) lessons.md ์คํจ ๋งค์นญ โ ํํผ ์ ๋ต
|
|
1683
|
+
try {
|
|
1684
|
+
if (fuzzyRe && exists(lessonsPath(root))) {
|
|
1685
|
+
const lt = read(lessonsPath(root));
|
|
1686
|
+
const blocks = lt.split(/\n### /);
|
|
1687
|
+
const hits = blocks.filter(b => fuzzyRe.test(b) && /(์คํจ|fail|๋กค๋ฐฑ|๋ฒ๊ทธ|incomplete)/i.test(b));
|
|
1688
|
+
if (hits.length > 0) {
|
|
1689
|
+
actions.push({ icon: '๐ก', title: `๊ณผ๊ฑฐ ์คํจ ํํผ โ lessons.md ์ "${keyword}" ๊ด๋ จ ${hits.length}๊ฑด`, command: `leerness lessons --auto --path .` });
|
|
1690
|
+
}
|
|
1691
|
+
}
|
|
1692
|
+
} catch {}
|
|
1693
|
+
|
|
1694
|
+
// 2) plan.md milestone ๋งค์นญ โ milestone ๊ฒ์ฆ
|
|
1695
|
+
try {
|
|
1696
|
+
if (fuzzyRe && exists(planPath(root))) {
|
|
1697
|
+
const pt = read(planPath(root));
|
|
1698
|
+
const milestones = (pt.match(/^### (M-\d{4})\..*$/gm) || []).filter(l => fuzzyRe.test(l));
|
|
1699
|
+
if (milestones.length > 0) {
|
|
1700
|
+
const m = milestones[0].match(/M-\d{4}/);
|
|
1701
|
+
if (m) actions.push({ icon: '๐ฏ', title: `plan.md milestone ${m[0]} ๊ฒ์ฆ โ "${keyword}" ๊ด๋ จ`, command: `leerness plan list --filter "${keyword}"` });
|
|
1702
|
+
}
|
|
1703
|
+
}
|
|
1704
|
+
} catch {}
|
|
1705
|
+
|
|
1706
|
+
// 3) decisions.md ๊ฒฐ์ ๋งค์นญ
|
|
1707
|
+
try {
|
|
1708
|
+
if (fuzzyRe && exists(decisionsPath(root))) {
|
|
1709
|
+
const dt = read(decisionsPath(root));
|
|
1710
|
+
const blocks = _extractDecisionBlocks(dt);
|
|
1711
|
+
const hits = blocks.filter(b => fuzzyRe.test(b));
|
|
1712
|
+
if (hits.length > 0) {
|
|
1713
|
+
actions.push({ icon: '๐ญ', title: `decisions.md "${keyword}" ๊ด๋ จ ๊ฒฐ์ ${hits.length}๊ฑด ์ํฅ ํ์ธ`, command: `leerness decision list --filter "${keyword}"` });
|
|
1714
|
+
}
|
|
1715
|
+
}
|
|
1716
|
+
} catch {}
|
|
1717
|
+
|
|
1718
|
+
// 4) review-evidence.md ๋ถ์ฌ โ e2e
|
|
1719
|
+
try {
|
|
1720
|
+
if (!exists(evidencePath(root)) || fs.statSync(evidencePath(root)).size < 100) {
|
|
1721
|
+
actions.push({ icon: '๐งช', title: `review-evidence.md ๋น์ด์์ โ e2e ๋๋ verify-code ์คํ`, command: `node ./scripts/e2e.js` });
|
|
1722
|
+
}
|
|
1723
|
+
} catch {}
|
|
1724
|
+
|
|
1725
|
+
// 5) 24h+ ์ ์ฒด โ task status ๊ฐฑ์ (handoff lazy-warn ๊ณผ ๋ณ๊ฐ โ ๋ค์ ๋จ๊ณ ๋ช
๋ น)
|
|
1726
|
+
try {
|
|
1727
|
+
const pp = progressPath(root);
|
|
1728
|
+
if (exists(pp)) {
|
|
1729
|
+
const ageHours = Math.floor((Date.now() - fs.statSync(pp).mtimeMs) / 3600000);
|
|
1730
|
+
if (ageHours >= 24 && latestRow.id) {
|
|
1731
|
+
actions.push({ icon: '๐', title: `progress-tracker ${ageHours}h ์ ์ฒด โ task ${latestRow.id} status ๊ฐฑ์ `, command: `leerness task update ${latestRow.id} --status completed` });
|
|
1732
|
+
}
|
|
1733
|
+
}
|
|
1734
|
+
} catch {}
|
|
1735
|
+
|
|
1736
|
+
// 6) CHANGELOG / README ๋ฒ์ ์ผ์น ํ์ธ (1.9.X bump ํ ์์ฃผ ๋๋ฝ๋๋ ๋จ๊ณ)
|
|
1737
|
+
try {
|
|
1738
|
+
if (/(\d\.\d\.\d+)/.test(taskText) || /(bump|version|release)/i.test(taskText)) {
|
|
1739
|
+
actions.push({ icon: '๐', title: `๋ฒ์ ๋ณ๋ task โ CHANGELOG.md / README.md ๊ฐฑ์ ํ์ธ`, command: `node ./bin/harness.js whats-new .` });
|
|
1740
|
+
}
|
|
1741
|
+
} catch {}
|
|
1742
|
+
|
|
1743
|
+
// 7) stress test ๋๋ฝ (์์จ ๋ผ์ด๋ ์์ฃผ ๋๋ฝ)
|
|
1744
|
+
try {
|
|
1745
|
+
const stressDir = path.resolve(root, '..', '_apps', 'leerness-stress', 'bin');
|
|
1746
|
+
if (exists(stressDir)) {
|
|
1747
|
+
const files = fs.readdirSync(stressDir).filter(f => /^stress-v\d+\.js$/.test(f));
|
|
1748
|
+
if (files.length > 0) {
|
|
1749
|
+
const versions = files.map(f => Number(f.match(/v(\d+)/)[1])).sort((a, b) => b - a);
|
|
1750
|
+
const latest = versions[0];
|
|
1751
|
+
// ํ์ฌ ๋ผ์ด๋ = 1.9.X ์์ stress-v(X-55) ์ ๋? ๋จ์ํ ์ต์ stress ๊ฐ 7์ผ+ ์ค๋๋๋ฉด ๊ถ์ฅ
|
|
1752
|
+
const latestFile = path.join(stressDir, `stress-v${latest}.js`);
|
|
1753
|
+
const ageHours = Math.floor((Date.now() - fs.statSync(latestFile).mtimeMs) / 3600000);
|
|
1754
|
+
if (ageHours >= 24 && /(bump|version|๋ณด๊ฐ|์ถ๊ฐ|๊ธฐ๋ฅ)/.test(taskText)) {
|
|
1755
|
+
actions.push({ icon: '๐งฌ', title: `stress-v${latest} ๋ง์ง๋ง ๊ฐฑ์ ${ageHours}h ์ โ ์ stress test ์์ฑ ๊ถ์ฅ`, command: `node _apps/leerness-stress/bin/stress-v${latest+1}.js` });
|
|
1756
|
+
}
|
|
1757
|
+
}
|
|
1758
|
+
}
|
|
1759
|
+
} catch {}
|
|
1760
|
+
|
|
1761
|
+
// ์ค๋ณต ์ ๊ฑฐ (icon+title ๊ธฐ์ค) + top 3
|
|
1762
|
+
const seen = new Set();
|
|
1763
|
+
return actions.filter(a => {
|
|
1764
|
+
const key = a.icon + a.title.slice(0, 30);
|
|
1765
|
+
if (seen.has(key)) return false;
|
|
1766
|
+
seen.add(key);
|
|
1767
|
+
return true;
|
|
1768
|
+
}).slice(0, 3);
|
|
1769
|
+
}
|
|
1770
|
+
|
|
1665
1771
|
// 1.9.182: handoff ์ปจํ
์คํธ (ํ์ฌ in-progress task) ์์ ์๋ query ์ถ์ถ
|
|
1666
1772
|
function _autoInstallQueryFromHandoff(root) {
|
|
1667
1773
|
try {
|
|
@@ -3524,6 +3630,7 @@ function handoff(root) {
|
|
|
3524
3630
|
// 1.9.192: ๊ณต์ organization skill catalog ์๋ ๋งค์นญ (C์ถ ๋ณด๊ฐ โ ์ฌ์ฉ์ ์๋)
|
|
3525
3631
|
// "๊ณต์ ํ์คํ๋ ์คํฌ์ ์ ์ฌ์ ์๋ก ์๋ ํ์ฉ ... ์ต๊ณ ์ ๋๊ตฌ" โ handoff ์ keyword ๊ธฐ๋ฐ ์๋ ์ถ์ฒ
|
|
3526
3632
|
// ์บ์ (.harness/skill-auto-cache.json, 24h TTL) ์ฌ์ฉ โ GitHub API ๋ถ๋ด X
|
|
3633
|
+
// 1.9.193: cache age > 7์ผ โ ์๋ refresh ๊ถ์ฅ hint ๊ฐํ
|
|
3527
3634
|
// ๋๊ธฐ: --no-official-skills ๋๋ LEERNESS_NO_OFFICIAL_SKILLS=1
|
|
3528
3635
|
if (!has('--no-official-skills') && !has('--quiet') && process.env.LEERNESS_NO_OFFICIAL_SKILLS !== '1') {
|
|
3529
3636
|
try {
|
|
@@ -3532,14 +3639,18 @@ function handoff(root) {
|
|
|
3532
3639
|
const isTty = process.stdout && process.stdout.isTTY;
|
|
3533
3640
|
const cyan = s => isTty ? `\x1b[36m${s}\x1b[0m` : s;
|
|
3534
3641
|
const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
3642
|
+
const yel = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
3535
3643
|
const cacheAge = ofm.ageHours != null ? (ofm.ageHours < 24 ? `${ofm.ageHours}h` : `${Math.floor(ofm.ageHours/24)}d`) : '?';
|
|
3536
|
-
|
|
3537
|
-
|
|
3644
|
+
// 1.9.193: cache age 7์ผ ์ด์์ด๋ฉด ๊ฐ์กฐ ํ์ (week stale)
|
|
3645
|
+
const veryStale = ofm.ageHours != null && ofm.ageHours >= 24 * 7;
|
|
3646
|
+
log(cyan(`## ๐ ๊ณต์ organization ์คํฌ ์๋ ๋งค์นญ (1.9.192/193) โ ํค์๋ "${keyword}"`));
|
|
3647
|
+
const ageLabel = veryStale ? yel(`${cacheAge} โ 7์ผ+`) : (ofm.expired ? yel(`${cacheAge} โ ๋ง๋ฃ`) : `${cacheAge} โ`);
|
|
3648
|
+
log(dim(` vercel-labs/anthropics ๋ฑ catalog ์บ์ ${ageLabel} ยท ${ofm.total}/${ofm.cacheTotal}๊ฑด ๋งค์นญ`));
|
|
3538
3649
|
for (const e of ofm.entries) {
|
|
3539
3650
|
log(dim(` โข [${e.preset || e.source || '?'}] ${e.name} โ ${(e.description || '').slice(0, 70)}`));
|
|
3540
3651
|
}
|
|
3541
3652
|
log(dim(` โ ์ค์น: leerness skill auto-install --yes`));
|
|
3542
|
-
if (ofm.expired) log(
|
|
3653
|
+
if (ofm.expired || veryStale) log(yel(` โ ๊ฐฑ์ ๊ถ์ฅ: leerness skill auto-cache refresh (1.9.193 ${veryStale ? '7์ผ+ stale' : '24h+ expired'})`));
|
|
3543
3654
|
log('');
|
|
3544
3655
|
} else if (ofm.cacheTotal === 0) {
|
|
3545
3656
|
// ์บ์ ์์ โ ์ฒซ ์ฌ์ฉ ์๋ด
|
|
@@ -3552,6 +3663,51 @@ function handoff(root) {
|
|
|
3552
3663
|
}
|
|
3553
3664
|
} catch {}
|
|
3554
3665
|
}
|
|
3666
|
+
// 1.9.194: E์ถ (๊ฒ์ผ๋ฆ ๋ฐฉ์ง) ๋ณด๊ฐ โ handoff ๋ค์ ๋จ๊ณ 1-3๊ฐ ์๋ ์ ์
|
|
3667
|
+
// ํ์ฌ in-progress task description + Memory Surface (decisions/lessons/plan) ์กฐํฉ โ
|
|
3668
|
+
// "๋ค์ ๋จ๊ณ๋ก ๋ฌด์์ ํ ์ง" 3๊ฐ๋ฅผ ์ฆ์ ์ ์ (์ฌ์ฉ์๊ฐ ์ง์ ์ฑ์ฐ์ง ์์๋ AI์๊ฒ ๋
ธ์ถ๋จ)
|
|
3669
|
+
// skill installed ์ฌ๋ถ์ ๋ฌด๊ด โ keyword ๋ง ์์ผ๋ฉด ๋์ (๊ฒ์ผ๋ฆ ๋ฐฉ์ง๋ ๋ชจ๋ ์ํฌ์คํ์ด์ค ํ์)
|
|
3670
|
+
// ๋๊ธฐ: --no-next-actions ๋๋ LEERNESS_NO_NEXT_ACTIONS=1
|
|
3671
|
+
if (!has('--no-next-actions') && !has('--quiet') && process.env.LEERNESS_NO_NEXT_ACTIONS !== '1') {
|
|
3672
|
+
try {
|
|
3673
|
+
const actions = _suggestNextActions(root, latestRow, keyword);
|
|
3674
|
+
if (actions.length > 0) {
|
|
3675
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
3676
|
+
const grn = s => isTty ? `\x1b[32m${s}\x1b[0m` : s;
|
|
3677
|
+
const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
3678
|
+
log(grn(`## ๐ฏ ๋ค์ ๋จ๊ณ ์๋ ์ ์ (1.9.194 E์ถ โ ๊ฒ์ผ๋ฆ ๋ฐฉ์ง) โ ํค์๋ "${keyword}"`));
|
|
3679
|
+
for (const a of actions) {
|
|
3680
|
+
log(dim(` ${a.icon} ${a.title}`));
|
|
3681
|
+
if (a.command) log(dim(` \`${a.command}\``));
|
|
3682
|
+
}
|
|
3683
|
+
log(dim(` โ ์ง์ ์
๋ ฅ: leerness next-action add "<text>"`));
|
|
3684
|
+
log('');
|
|
3685
|
+
}
|
|
3686
|
+
} catch {}
|
|
3687
|
+
}
|
|
3688
|
+
// 1.9.194: 24h+ ๋ฌด ์ง์ฒ lazy ๊ฐ์ง โ progress-tracker mtime ๊ธฐ๋ฐ
|
|
3689
|
+
// ํ์ฌ in-progress task ๊ฐ 24h ์ด์ ๋ณ๋ ์์ผ๋ฉด "lazy ์์ฌ" hint
|
|
3690
|
+
// ๋๊ธฐ: --no-lazy-warn ๋๋ LEERNESS_NO_LAZY_WARN=1
|
|
3691
|
+
if (!has('--no-lazy-warn') && !has('--quiet') && process.env.LEERNESS_NO_LAZY_WARN !== '1') {
|
|
3692
|
+
try {
|
|
3693
|
+
const pp = progressPath(root);
|
|
3694
|
+
if (exists(pp)) {
|
|
3695
|
+
const ageMs = Date.now() - fs.statSync(pp).mtimeMs;
|
|
3696
|
+
const ageHours = Math.floor(ageMs / 3600000);
|
|
3697
|
+
if (ageHours >= 24) {
|
|
3698
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
3699
|
+
const yel = s => isTty ? `\x1b[33m${s}\x1b[0m` : s;
|
|
3700
|
+
const dim = s => isTty ? `\x1b[2m${s}\x1b[0m` : s;
|
|
3701
|
+
const ageLabel = ageHours < 48 ? `${ageHours}h` : `${Math.floor(ageHours/24)}d`;
|
|
3702
|
+
log(yel(`## โ ์ง์ฒ ์ ์ฒด ๊ฐ์ง (1.9.194 E์ถ) โ progress-tracker ๋ง์ง๋ง ๋ณ๋ ${ageLabel} ์ `));
|
|
3703
|
+
log(dim(` ํ์ฌ in-progress task: ${latestRow.id} ${(latestRow.request || '').slice(0, 60)}`));
|
|
3704
|
+
log(dim(` โ ๋ณ๊ฒฝ: leerness task update ${latestRow.id} --status in-progress ๋๋ --status completed`));
|
|
3705
|
+
log(dim(` โ ํ๊ณ : leerness lazy detect --json`));
|
|
3706
|
+
log('');
|
|
3707
|
+
}
|
|
3708
|
+
}
|
|
3709
|
+
} catch {}
|
|
3710
|
+
}
|
|
3555
3711
|
}
|
|
3556
3712
|
}
|
|
3557
3713
|
} catch {}
|
|
@@ -6047,6 +6203,21 @@ function agentsCmd(root, sub, ...args) {
|
|
|
6047
6203
|
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`;
|
|
6048
6204
|
append(tlp, block);
|
|
6049
6205
|
} catch {}
|
|
6206
|
+
// 1.9.193: B์ถ (๋ฉํฐ Sub-Agent ์ค์ผ์คํธ๋ผ) ๋ณด๊ฐ โ consensus ๊ฒฐ๊ณผ๋ฅผ lessons.md ์ ์๋ ๊ธฐ๋ก
|
|
6207
|
+
// ๊ฐ์ task ์ฌ์๋ ์ ๊ณผ๊ฑฐ best agent + score ๊ฐ handoff lessons auto-recall ์์ ๋งค์นญ
|
|
6208
|
+
// ๋๊ธฐ: LEERNESS_NO_MULTIAGENT_LESSON=1
|
|
6209
|
+
if (process.env.LEERNESS_NO_MULTIAGENT_LESSON !== '1') {
|
|
6210
|
+
try {
|
|
6211
|
+
const lp = lessonsPath(root);
|
|
6212
|
+
const lessonBlock = `\n### ${today()} multi-agent consensus โ best=${best.agent} (1.9.193)\n`
|
|
6213
|
+
+ `- task: ${task.slice(0, 200)}\n`
|
|
6214
|
+
+ `- agents: ${ready.map(x => x.def.id).join(', ')} (${ok.length}/${ready.length} success)\n`
|
|
6215
|
+
+ `- best agent: ${best.agent}, score=${best.score.toFixed(3)}\n`
|
|
6216
|
+
+ (scored.length > 1 ? `- others: ${scored.slice(1, 4).map(s => `${s.agent}=${s.score.toFixed(2)}`).join(', ')}\n` : '')
|
|
6217
|
+
+ `- lesson: ๊ฐ์ keyword ์ฌ๋ฐ ์ ${best.agent} ์ฐ์ ์๋ (multi-signal consensus ์
์ฆ)\n`;
|
|
6218
|
+
append(lp, lessonBlock);
|
|
6219
|
+
} catch {}
|
|
6220
|
+
}
|
|
6050
6221
|
}
|
|
6051
6222
|
if (failures.length && !best) {
|
|
6052
6223
|
process.exitCode = 1;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.194",
|
|
4
4
|
"description": "Leerness: ๋นํ๊ดด ๋ง์ด๊ทธ๋ ์ด์
, ์๋ ๋ฒ์ ๊ฐ์งยท์
๋ฐ์ดํธ, ๊ณํ/์งํ/ํธ๋์คํ ์๋ํ, ๊ฒ์ผ๋ฆยท์ํฌ๋ฆฟยท์ธ์ฝ๋ฉ ์๋ ๊ฐ๋, Claude Code ์ฌ๋์ ํตํฉ์ ๊ฐ์ถ ํ๊ตญ์ด ์ฐ์ AI ๊ฐ๋ฐ ํ๋ค์ค.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|