leerness 1.9.200 β 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 +102 -0
- package/README.md +3 -3
- package/bin/harness.js +191 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,107 @@
|
|
|
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
|
+
|
|
47
|
+
## 1.9.201 β 2026-05-22
|
|
48
|
+
|
|
49
|
+
**π― EμΆ (κ²μΌλ¦ λ°©μ§) 9.5/10 β 10/10 λ³΄κ° β next-action queue + leerness next-action take λͺ
λ Ή.**
|
|
50
|
+
|
|
51
|
+
μμ¨ λͺ¨λ 131 λΌμ΄λ. 200 λ§μΌμ€ν€ νμ β 100% λ§€νΈλ¦μ€λ₯Ό ν₯ν λ€μ λ¨κ³.
|
|
52
|
+
|
|
53
|
+
### μ¬μ©μ μλ μ λ ¬ (1.9.191 verbatim)
|
|
54
|
+
> *"κ²μΌλ¦ λ°©μ§λ±λ± μ΅κ³ μ λꡬ"*
|
|
55
|
+
|
|
56
|
+
### 1. handoff next-action μλ νμ (EμΆ ν΅μ¬)
|
|
57
|
+
- `_suggestNextActions` (1.9.194) κ° μ μν νλͺ©μ `.harness/next-action-queue.json` μ μλ μ μ₯
|
|
58
|
+
- μ€λ³΅ λ°©μ§ (μ΄λ―Έ μλ title skip), μ΅κ·Ό 20κ°λ§ μ μ§
|
|
59
|
+
- ν¨μ: `_enqueueNextActions(root, actions)` / `_loadNextActionQueue(root)` / `_writeNextActionQueue(root, queue)`
|
|
60
|
+
|
|
61
|
+
### 2. `leerness next-action` μ κ· CLI
|
|
62
|
+
- `next-action list [--json]` β ν μ 체 (default sub)
|
|
63
|
+
- `next-action take [N]` β νμμ κ°μ Έμμ `leerness task add` μλ νΈμΆ (N μλ΅ μ μ΅μ )
|
|
64
|
+
- `next-action add "<text>"` β μλ μΆκ°
|
|
65
|
+
- `next-action clear` β ν μ΄κΈ°ν
|
|
66
|
+
|
|
67
|
+
### 3. 1-step κ²μΌλ¦ λ°©μ§ νλ¦
|
|
68
|
+
```
|
|
69
|
+
$ leerness handoff .
|
|
70
|
+
## π― λ€μ λ¨κ³ μλ μ μ (1.9.194 EμΆ) β ν€μλ "X"
|
|
71
|
+
π‘ κ³Όκ±° μ€ν¨ ννΌ β lessons.md "X" κ΄λ ¨ N건
|
|
72
|
+
`leerness lessons --auto --path .`
|
|
73
|
+
β μ¦μ task add: leerness next-action take (ν +1건 μ μ₯λ¨, 1.9.201)
|
|
74
|
+
|
|
75
|
+
$ leerness next-action take
|
|
76
|
+
β task μΆκ°: T-0042 β "κ³Όκ±° μ€ν¨ ννΌ β lessons.md..."
|
|
77
|
+
π‘ μ€ν λͺ
λ Ή: leerness lessons --auto --path .
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 4. λμ νκ· (1.9.195~200) β λͺ¨λ μ μ§
|
|
81
|
+
|
|
82
|
+
### 5. stress-v146 β 16/16 PASS
|
|
83
|
+
- next-action CLI (7) + μμ μν¬μ€νμ΄μ€ ν΅ν© (1) + μ±λ₯ (2) + λμ νκ· (7)
|
|
84
|
+
- μ±λ₯: --version cold start avg **436 ms** Β· MCP 54 λꡬ **442 ms**
|
|
85
|
+
|
|
86
|
+
### 6. 5μΆ λ§€νΈλ¦μ€ λ³λ
|
|
87
|
+
| μΆ | 1.9.200 | 1.9.201 | Ξ |
|
|
88
|
+
|---|---|---|---|
|
|
89
|
+
| E. κ²μΌλ¦ λ°©μ§ | 9.5/10 | **10/10** β | +0.5 (next-action 1-step μλ task add) |
|
|
90
|
+
| **μ’
ν©** | 48/50 (96%) | **48.5/50 (97%)** | +1% |
|
|
91
|
+
|
|
92
|
+
### 7. 5μΆ λͺ¨λ 9 μ΄μ + 3μΆ 10/10
|
|
93
|
+
- A 10/10 β (1.9.197)
|
|
94
|
+
- D 10/10 β (1.9.196)
|
|
95
|
+
- E 10/10 β (1.9.201) β μ κ·
|
|
96
|
+
- B 9.5/10 (1.9.198)
|
|
97
|
+
- C 9.0/10 (1.9.192)
|
|
98
|
+
|
|
99
|
+
### 8. μλ release νλ¦
|
|
100
|
+
- main μλ push **63 λΌμ΄λ μ°μ** (1.9.140~201)
|
|
101
|
+
- npm publish μλ (1.9.178~)
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
3
105
|
## 1.9.200 β 2026-05-22
|
|
4
106
|
|
|
5
107
|
**π 200 λ§μΌμ€ν€ β 60 λΌμ΄λ μμ¨ λμ + 5μΆ λ§€νΈλ¦μ€ 96/100.**
|
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 (μΆμ²λ§).
|
|
@@ -1733,6 +1804,110 @@ function _loadMultiAgentConsensusHistory(root, keyword) {
|
|
|
1733
1804
|
} catch { return []; }
|
|
1734
1805
|
}
|
|
1735
1806
|
|
|
1807
|
+
// 1.9.201: EμΆ (κ²μΌλ¦ λ°©μ§) 9.5β10 λ³΄κ° β next-action queue μλ μ μ₯ + take λͺ
λ Ή
|
|
1808
|
+
// handoff κ° μ μν next-action top νλͺ©μ .harness/next-action-queue.json μ μ μ₯ β
|
|
1809
|
+
// `leerness next-action take` νΈμΆ μ νμμ pop + leerness task add μλ μ€ν β
|
|
1810
|
+
// AI/μ¬μ©μκ° μ§μ μΆμ /νμ΄ν μμ΄ 1-step μΌλ‘ task μ§μ
|
|
1811
|
+
function _nextActionQueuePath(root) { return path.join(root, '.harness', 'next-action-queue.json'); }
|
|
1812
|
+
function _loadNextActionQueue(root) {
|
|
1813
|
+
try {
|
|
1814
|
+
const fp = _nextActionQueuePath(root);
|
|
1815
|
+
if (!exists(fp)) return { queue: [], at: null };
|
|
1816
|
+
const j = JSON.parse(read(fp));
|
|
1817
|
+
return { queue: Array.isArray(j.queue) ? j.queue : [], at: j.at || null };
|
|
1818
|
+
} catch { return { queue: [], at: null }; }
|
|
1819
|
+
}
|
|
1820
|
+
function _writeNextActionQueue(root, queue) {
|
|
1821
|
+
try {
|
|
1822
|
+
mkdirp(path.join(root, '.harness'));
|
|
1823
|
+
writeUtf8(_nextActionQueuePath(root), JSON.stringify({ queue, at: new Date().toISOString() }, null, 2));
|
|
1824
|
+
return true;
|
|
1825
|
+
} catch { return false; }
|
|
1826
|
+
}
|
|
1827
|
+
// handoff μμ μ μλ next-action λ€μ νμ μλ μ μ₯ (μ€λ³΅ λ°©μ§: μ΄λ―Έ μλ title μ skip)
|
|
1828
|
+
function _enqueueNextActions(root, actions) {
|
|
1829
|
+
if (!Array.isArray(actions) || actions.length === 0) return 0;
|
|
1830
|
+
const state = _loadNextActionQueue(root);
|
|
1831
|
+
const existingTitles = new Set(state.queue.map(a => a.title));
|
|
1832
|
+
let added = 0;
|
|
1833
|
+
for (const a of actions) {
|
|
1834
|
+
if (existingTitles.has(a.title)) continue;
|
|
1835
|
+
state.queue.push({ ...a, addedAt: new Date().toISOString() });
|
|
1836
|
+
existingTitles.add(a.title);
|
|
1837
|
+
added++;
|
|
1838
|
+
}
|
|
1839
|
+
// μ΅κ·Ό 20κ°λ§ μ μ§
|
|
1840
|
+
if (state.queue.length > 20) state.queue = state.queue.slice(-20);
|
|
1841
|
+
if (added > 0) _writeNextActionQueue(root, state.queue);
|
|
1842
|
+
return added;
|
|
1843
|
+
}
|
|
1844
|
+
|
|
1845
|
+
// 1.9.201: next-action CLI λͺ
λ Ή β handoff κ° μ μ₯ν queue μμ take/list/clear
|
|
1846
|
+
async function nextActionCmd(root, sub, ...rest) {
|
|
1847
|
+
root = absRoot(root);
|
|
1848
|
+
const state = _loadNextActionQueue(root);
|
|
1849
|
+
if (!sub || sub === 'list') {
|
|
1850
|
+
if (has('--json')) { log(JSON.stringify(state, null, 2)); return; }
|
|
1851
|
+
log(`# leerness next-action list (1.9.201)`);
|
|
1852
|
+
if (state.queue.length === 0) {
|
|
1853
|
+
log(' (ν λΉμ΄μμ)');
|
|
1854
|
+
log(` β handoff κ° μλμΌλ‘ νμ μ μ₯ν©λλ€. \`leerness handoff .\` ν λ€μ νμΈ.`);
|
|
1855
|
+
return;
|
|
1856
|
+
}
|
|
1857
|
+
log(` ν ${state.queue.length}건 (μμ±: ${state.at || '?'})`);
|
|
1858
|
+
log('');
|
|
1859
|
+
for (let i = 0; i < state.queue.length; i++) {
|
|
1860
|
+
const a = state.queue[i];
|
|
1861
|
+
log(` [${i}] ${a.icon || 'β’'} ${a.title}`);
|
|
1862
|
+
if (a.command) log(` \`${a.command}\``);
|
|
1863
|
+
}
|
|
1864
|
+
log('');
|
|
1865
|
+
log(` β κ°μ Έμ€κΈ°: leerness next-action take [N] (N μλ΅ μ μ΅μ [${state.queue.length - 1}])`);
|
|
1866
|
+
return;
|
|
1867
|
+
}
|
|
1868
|
+
if (sub === 'take') {
|
|
1869
|
+
const n = rest[0] !== undefined ? Number(rest[0]) : state.queue.length - 1;
|
|
1870
|
+
if (state.queue.length === 0) { fail('ν λΉμ΄μμ β handoff λ¨Όμ μ€ν'); return process.exit(1); }
|
|
1871
|
+
if (isNaN(n) || n < 0 || n >= state.queue.length) { fail(`μλͺ»λ index: ${n} (0~${state.queue.length - 1})`); return process.exit(1); }
|
|
1872
|
+
const action = state.queue[n];
|
|
1873
|
+
log(`# leerness next-action take [${n}] (1.9.201)`);
|
|
1874
|
+
log(` ${action.icon || 'β’'} ${action.title}`);
|
|
1875
|
+
if (action.command) log(` \`${action.command}\``);
|
|
1876
|
+
// task add μλ νΈμΆ
|
|
1877
|
+
try {
|
|
1878
|
+
const taskTitle = action.title.replace(/^[^\wκ°-ν£]+/, '').slice(0, 100);
|
|
1879
|
+
// νμμ μ κ±° β write
|
|
1880
|
+
state.queue.splice(n, 1);
|
|
1881
|
+
_writeNextActionQueue(root, state.queue);
|
|
1882
|
+
// leerness task add νΈμΆ
|
|
1883
|
+
const taskResult = cp.spawnSync(process.execPath, [__filename, 'task', 'add', taskTitle, '--path', root], { encoding: 'utf8', timeout: 8000 });
|
|
1884
|
+
if (taskResult.status === 0) {
|
|
1885
|
+
const m = (taskResult.stdout || '').match(/T-\d{4}/);
|
|
1886
|
+
log(` β task μΆκ°: ${m ? m[0] : '?'} β "${taskTitle}"`);
|
|
1887
|
+
if (action.command) log(` π‘ μ€ν λͺ
λ Ή: ${action.command}`);
|
|
1888
|
+
} else {
|
|
1889
|
+
log(` β task add μ€ν¨ (exit ${taskResult.status}) β μλ: leerness task add "${taskTitle}"`);
|
|
1890
|
+
}
|
|
1891
|
+
} catch (e) {
|
|
1892
|
+
log(` β μ²λ¦¬ μ€ν¨: ${e.message}`);
|
|
1893
|
+
}
|
|
1894
|
+
return;
|
|
1895
|
+
}
|
|
1896
|
+
if (sub === 'clear') {
|
|
1897
|
+
_writeNextActionQueue(root, []);
|
|
1898
|
+
ok(`next-action ν μ΄κΈ°ν (${state.queue.length}건 μ κ±°)`);
|
|
1899
|
+
return;
|
|
1900
|
+
}
|
|
1901
|
+
if (sub === 'add') {
|
|
1902
|
+
const title = rest.filter(x => !x.startsWith('-')).join(' ').trim();
|
|
1903
|
+
if (!title) return fail('μ¬μ©λ²: leerness next-action add "<text>"');
|
|
1904
|
+
_enqueueNextActions(root, [{ icon: 'π', title, command: null }]);
|
|
1905
|
+
ok(`next-action μΆκ°: ${title}`);
|
|
1906
|
+
return;
|
|
1907
|
+
}
|
|
1908
|
+
fail(`μ μ μλ sub: ${sub} (list / take / clear / add)`);
|
|
1909
|
+
}
|
|
1910
|
+
|
|
1736
1911
|
// 1.9.194: EμΆ (κ²μΌλ¦ λ°©μ§) β handoff μμ λ€μ λ¨κ³ 1-3κ° μλ μ μ
|
|
1737
1912
|
// νμ¬ in-progress task description + Memory Surface (decisions/lessons/plan) μ‘°ν© β
|
|
1738
1913
|
// "λ€μ λ¨κ³λ‘ 무μμ ν μ§" μΆλ‘ (μ¬μ©μ/AI μ§μ μ
λ ₯ μμ΄ μ¦μ λ
ΈμΆ)
|
|
@@ -3731,10 +3906,14 @@ function handoff(root) {
|
|
|
3731
3906
|
log(cyan(`## π 곡μ organization μ€ν¬ μλ λ§€μΉ (1.9.192/193) β ν€μλ "${keyword}"`));
|
|
3732
3907
|
const ageLabel = veryStale ? yel(`${cacheAge} β 7μΌ+`) : (ofm.expired ? yel(`${cacheAge} β λ§λ£`) : `${cacheAge} β`);
|
|
3733
3908
|
log(dim(` vercel-labs/anthropics λ± catalog μΊμ ${ageLabel} Β· ${ofm.total}/${ofm.cacheTotal}건 λ§€μΉ`));
|
|
3909
|
+
// 1.9.202: κ° entry μ μ€μΉ μν νμ (installed/new)
|
|
3734
3910
|
for (const e of ofm.entries) {
|
|
3735
|
-
|
|
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)}`));
|
|
3736
3914
|
}
|
|
3737
|
-
log(dim(` β
|
|
3915
|
+
log(dim(` β 1κ° μ¦μ: leerness skill install-top (1.9.202)`));
|
|
3916
|
+
log(dim(` β μ 체 μ€μΉ: leerness skill auto-install --yes`));
|
|
3738
3917
|
if (ofm.expired || veryStale) log(yel(` β κ°±μ κΆμ₯: leerness skill auto-cache refresh (1.9.193 ${veryStale ? '7μΌ+ stale' : '24h+ expired'})`));
|
|
3739
3918
|
log('');
|
|
3740
3919
|
} else if (ofm.cacheTotal === 0) {
|
|
@@ -3765,6 +3944,11 @@ function handoff(root) {
|
|
|
3765
3944
|
log(dim(` ${a.icon} ${a.title}`));
|
|
3766
3945
|
if (a.command) log(dim(` \`${a.command}\``));
|
|
3767
3946
|
}
|
|
3947
|
+
// 1.9.201: queue μλ μ μ₯ β `leerness next-action take` λ‘ μ¦μ task add κ°λ₯
|
|
3948
|
+
try {
|
|
3949
|
+
const added = _enqueueNextActions(root, actions);
|
|
3950
|
+
if (added > 0) log(dim(` β μ¦μ task add: leerness next-action take (ν +${added}건 μ μ₯λ¨, 1.9.201)`));
|
|
3951
|
+
} catch {}
|
|
3768
3952
|
log(dim(` β μ§μ μ
λ ₯: leerness next-action add "<text>"`));
|
|
3769
3953
|
log('');
|
|
3770
3954
|
}
|
|
@@ -14766,6 +14950,8 @@ async function main() {
|
|
|
14766
14950
|
if (cmd === 'skill' && args[1] === 'suggest') return skillSuggestCmd(absRoot(arg('--path', process.cwd())));
|
|
14767
14951
|
// 1.9.182: leerness skill auto-install β 곡μ catalog μλ νμ + skill match λ§€μΉ μ μλ install (μ¬μ©μ λͺ
μ)
|
|
14768
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())));
|
|
14769
14955
|
// 1.9.192: skill auto-cache β 곡μ organization catalog 24h μΊμ κ΄λ¦¬ (CμΆ λ³΄κ°)
|
|
14770
14956
|
if (cmd === 'skill' && args[1] === 'auto-cache') return await skillAutoCacheCmd(absRoot(arg('--path', process.cwd())), args[2] || 'status');
|
|
14771
14957
|
if (cmd === 'mcp' && args[1] === 'serve') return mcpServeCmd(absRoot(arg('--path', process.cwd())));
|
|
@@ -14777,6 +14963,8 @@ async function main() {
|
|
|
14777
14963
|
if (cmd === 'brainstorm') return brainstormCmd(arg('--path', process.cwd()), args.slice(1).filter(x => !x.startsWith('-')).join(' '));
|
|
14778
14964
|
if (cmd === 'roadmap' && args[1] === 'auto') return roadmapAutoCmd(arg('--path', process.cwd()), args[2]);
|
|
14779
14965
|
if (cmd === 'roadmap') return roadmapCmd(args[1] || process.cwd());
|
|
14966
|
+
// 1.9.201: next-action queue CLI (EμΆ 9.5β10)
|
|
14967
|
+
if (cmd === 'next-action') return nextActionCmd(arg('--path', process.cwd()), args[1], ...args.slice(2));
|
|
14780
14968
|
if (cmd === 'rule' && args[1] === 'add') return ruleAdd(arg('--path', process.cwd()), args.slice(2).filter(x => !x.startsWith('-')).join(' '));
|
|
14781
14969
|
if (cmd === 'rule' && args[1] === 'list') return ruleList(arg('--path', process.cwd()));
|
|
14782
14970
|
if (cmd === 'rule' && args[1] === 'remove') return ruleRemove(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.202",
|
|
4
4
|
"description": "Leerness: λΉνκ΄΄ λ§μ΄κ·Έλ μ΄μ
, μλ λ²μ κ°μ§Β·μ
λ°μ΄νΈ, κ³ν/μ§ν/νΈλμ€ν μλν, κ²μΌλ¦Β·μν¬λ¦ΏΒ·μΈμ½λ© μλ κ°λ, Claude Code μ¬λμ ν΅ν©μ κ°μΆ νκ΅μ΄ μ°μ AI κ°λ° νλ€μ€.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|