leerness 1.9.181 โ 1.9.183
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 +175 -0
- package/README.md +3 -3
- package/bin/harness.js +222 -7
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,180 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.183 โ 2026-05-21
|
|
4
|
+
|
|
5
|
+
**๐ฆ npm i leerness + ๊ตฌ๋ฒ์ ์๋ ๊ฐ์ง/๊ฒฝ๊ณ /์
๋ฐ์ดํธ ๋ช
๋ น์ด ์๋ด (์ฌ์ฉ์ ๋ช
์ 3์ข
).**
|
|
6
|
+
|
|
7
|
+
์์จ ๋ชจ๋ 113 ๋ผ์ด๋. ์ฌ์ฉ์ ๋ช
์:
|
|
8
|
+
1. *"(vercel/anthropic) ํ๊ธฐ๋ ์ ๊ฑฐ"* โ ์ผ๋ฐํ
|
|
9
|
+
2. *"vercel/anthropic ํฌํจํ ๋ค๋ฅธ ๊ณต์ ์คํฌ๋ ์๋ ํ์ํ๋ ๊ฒ ๋ง๋์ง ํ์ธ"* โ ๊ฒ์ฆ ํต๊ณผ
|
|
10
|
+
3. *"npm i leerness ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ + ๊ตฌ๋ฒ์ ๊ฐ์ง/๊ฒฝ๊ณ /์
๋ฐ์ดํธ ๋ช
๋ น์ด ์๋ด"* โ ๋ชจ๋ ๋ช
๋ น์ stale check ์ง์
|
|
11
|
+
|
|
12
|
+
### 1. ํ๊ธฐ ์ผ๋ฐํ
|
|
13
|
+
```diff
|
|
14
|
+
- ๐ ๊ณต์ catalog ์๋ ํ์ (vercel/anthropic) ยท ์๊ฐ ์ฑ์ฅํ
|
|
15
|
+
+ ๐ ๊ณต์ catalog ์๋ ํ์ ยท ์๊ฐ ์ฑ์ฅํ ยท ๊ตฌ๋ฒ์ ๊ฐ์ง/์๋ด
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### 2. ๋ค๋ฅธ ๊ณต์ catalog ์๋ ํ์ ํ์ธ (live)
|
|
19
|
+
```bash
|
|
20
|
+
$ leerness skill discover --all-presets
|
|
21
|
+
fetching vercel-labs/agent-skills...
|
|
22
|
+
โ vercel-labs/agent-skills: 8๊ฐ skill ๋ฐ๊ฒฌ
|
|
23
|
+
fetching anthropics/skills...
|
|
24
|
+
โ anthropics/skills: 17๊ฐ skill ๋ฐ๊ฒฌ
|
|
25
|
+
์ ์ฒด 25๊ฑด
|
|
26
|
+
```
|
|
27
|
+
**vercel + anthropic ๋ชจ๋ ์ ์ ์๋**. ๋ค๋ฅธ ๊ณต์ organization์ `--github <owner/repo>` ์ต์
์ผ๋ก ์ฆ์ ์ถ๊ฐ ๊ฐ๋ฅ (`vercel-labs/agent-skills`, `anthropics/skills` ์ธ์ ์ ๊ณต์ ๋ฑ์ฅ ์ preset ๋ฑ๋ก).
|
|
28
|
+
|
|
29
|
+
์กฐ์ฌ ๊ฒฐ๊ณผ โ 1.9.183 ์์ ํ์ค SKILL.md ์นดํ๋ก๊ทธ๋ฅผ ๊ฐ์ถ ๊ณต์ organization:
|
|
30
|
+
- `vercel-labs/agent-skills` (8๊ฐ) โ preset `vercel`
|
|
31
|
+
- `anthropics/skills` (17๊ฐ) โ preset `anthropic`
|
|
32
|
+
- `modelcontextprotocol/servers` โ SKILL.md ํ์ ์๋ (MCP server ๊ตฌํ โ leerness skill ํธํ์ฑ X)
|
|
33
|
+
- ๊ธฐํ โ ๋ฏธ๋ฐ๊ฒฌ. ์ ๊ณต์ ๋ฑ์ฅ ์ ์ฆ์ preset ๋ฑ๋ก ๊ฐ๋ฅ.
|
|
34
|
+
|
|
35
|
+
### 3. ๊ตฌ๋ฒ์ ์๋ ๊ฐ์ง ๊ฐํ (๋ชจ๋ ๋ช
๋ น)
|
|
36
|
+
**Before**: init/migrate ์์ ๋ง stale check (๋ค๋ฅธ ๋ช
๋ น์ skip)
|
|
37
|
+
**After**: ๊ฑฐ์ ๋ชจ๋ ๋ช
๋ น ์์ ์ stale check (init/migrate/mcp/release/version/help ์ ์ธ โ ์ถ๋ ฅ ๋ฏผ๊ฐ ๋ช
๋ น์ skip)
|
|
38
|
+
|
|
39
|
+
```js
|
|
40
|
+
// 1.9.183 (์ฌ์ฉ์ ๋ช
์): ๋ชจ๋ ๋ช
๋ น ์์ ์์ ๊ตฌ๋ฒ์ ๊ฐ์ง + ๊ฒฝ๊ณ + ์
๋ฐ์ดํธ ๋ช
๋ น์ด ์๋ด
|
|
41
|
+
const _staleSkip = new Set(['init', 'migrate', 'usage', 'mcp', 'release', 'session-close', '--version', '--help', 'help', 'update', 'whats-new']);
|
|
42
|
+
if (!_staleSkip.has(cmd) && process.env.LEERNESS_NO_STALE_CHECK !== '1' && !has('--no-stale-check')) {
|
|
43
|
+
const cached = readUpdateCache(root);
|
|
44
|
+
if (cacheFresh(cached, 24) && cached.nextLeerness && compareVer(cached.nextLeerness, VERSION) > 0) {
|
|
45
|
+
process.stderr.write(` โ leerness v${VERSION} โ v${cached.nextLeerness} ์ฌ์ฉ ๊ฐ๋ฅ ยท npm i leerness@latest ๊ถ์ฅ ...`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**์ค ๋์ ๊ฒ์ฆ** (์บ์ ์๋ฎฌ๋ ์ด์
):
|
|
51
|
+
```
|
|
52
|
+
$ leerness audit .
|
|
53
|
+
โ leerness v1.9.183 โ v1.9.999 ์ฌ์ฉ ๊ฐ๋ฅ ยท npm i leerness@latest ๊ถ์ฅ (LEERNESS_NO_STALE_CHECK=1 ๋ก ๋๊ธฐ)
|
|
54
|
+
โ no duplicate design guide candidates
|
|
55
|
+
[...]
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 4. `npm i leerness` ์ฒซ ๊ถ์ฅ (๊ธ๋ก๋ฒ โ ๋ก์ปฌ ์ฐ์ )
|
|
59
|
+
init ์์ stale ๋ฉ์์ง๋ ๊ฐฑ์ :
|
|
60
|
+
```
|
|
61
|
+
ํด๊ฒฐ โ ์
์ค ํ๋ ์คํ ํ ๋ค์ ์๋:
|
|
62
|
+
npm i leerness@latest # ํ๋ก์ ํธ ๋ก์ปฌ ์ค์น (1.9.183 ๊ถ์ฅ)
|
|
63
|
+
npm i -g leerness@latest # ๊ธ๋ก๋ฒ ์ค์น
|
|
64
|
+
npx --yes clear-npx-cache && npx leerness@latest init .
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### npm registry ์ํ
|
|
68
|
+
```bash
|
|
69
|
+
$ npm view leerness version
|
|
70
|
+
1.9.182 โ ์ง์ publish
|
|
71
|
+
$ npm view leerness dist-tags
|
|
72
|
+
{ latest: '1.9.182' }
|
|
73
|
+
```
|
|
74
|
+
์ด๋ฒ ๋ผ์ด๋ release sync-main ํ `latest: '1.9.183'` ์ผ๋ก ์๋ ๊ฐฑ์ .
|
|
75
|
+
|
|
76
|
+
### Verified
|
|
77
|
+
- stress-v128: **16/16** (์ฌ์ฉ์ ๋ช
์ 3 + ๊ตฌ๋ฒ์ ๊ฐ์ง 4 + npm ๋ฐฐํฌ 2 + VERSION+๋์ 7)
|
|
78
|
+
- e2e 217/217 baseline ์ ์ง
|
|
79
|
+
- VERSION = 1.9.183 ยท autonomous-rounds = 113 ยท main ์๋ push 44 ๋ผ์ด๋ ์ฐ์
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## 1.9.182 โ 2026-05-21
|
|
84
|
+
|
|
85
|
+
**๐ ๊ณต์ ์กฐ์ง ์คํฌ catalog ์๋ ํ์ โ vercel-labs/agent-skills + anthropics/skills ์ง์ ํตํฉ (์ฌ์ฉ์ ๋ช
์).**
|
|
86
|
+
|
|
87
|
+
์์จ ๋ชจ๋ 112 ๋ผ์ด๋. ์ฌ์ฉ์ ๋ช
์: *"๊ณต์ ์กฐ์ง์ ์คํฌ ๋ชจ์์ ํ์ํด์ ๋ค์ด๋ก๋ ๋ฐ์์ ์คํฌ์ ์ฌ์ฉํ๋์ง ํ์ธ (vercel-labs/agent-skills, anthropics/skills) + ์ง๊ธ ์ค๊ณํ๋ ๋ฐฉํฅ์ด ์ฌ๋ฐ๋ฅธ์ง ํ๋จ๋ ๋๊ฐ ํด์ค"*.
|
|
88
|
+
|
|
89
|
+
### ํต์ฌ ์ถ๊ฐ
|
|
90
|
+
|
|
91
|
+
#### 1. `SKILL_CATALOG_PRESETS` โ ๋ด์ฅ ๊ณต์ catalog
|
|
92
|
+
```js
|
|
93
|
+
const SKILL_CATALOG_PRESETS = {
|
|
94
|
+
'vercel': { owner: 'vercel-labs', repo: 'agent-skills', branch: 'main', path: 'skills' },
|
|
95
|
+
'anthropic': { owner: 'anthropics', repo: 'skills', branch: 'main', path: 'skills' }
|
|
96
|
+
};
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
#### 2. `_fetchGitHubSkills(owner, repo, branch, dirPath)` โ GitHub Contents API ์ง์ ํธ์ถ
|
|
100
|
+
- rate limit: 60 req/hr (LEERNESS_GITHUB_TOKEN ์ 5000 req/hr)
|
|
101
|
+
- ์๋ต์ ํ์ค entry ํ์์ผ๋ก ๋ณํ (name, url, description, source, homepage)
|
|
102
|
+
- raw.githubusercontent.com URL ์๋ ๊ตฌ์ฑ
|
|
103
|
+
|
|
104
|
+
#### 3. `leerness skill discover` ํ์ฅ
|
|
105
|
+
```bash
|
|
106
|
+
$ leerness skill discover --preset anthropic
|
|
107
|
+
# leerness skill discover (1.9.182 โ GitHub presets)
|
|
108
|
+
targets: anthropics/skills#main:skills
|
|
109
|
+
fetching anthropics/skills...
|
|
110
|
+
โ anthropics/skills: 17๊ฐ skill ๋ฐ๊ฒฌ
|
|
111
|
+
์ ์ฒด 17๊ฑด (์ ์ฒด ํ์ โ ๋งค์นญ ์์)
|
|
112
|
+
|
|
113
|
+
| name | source | url |
|
|
114
|
+
|---|---|---|
|
|
115
|
+
| algorithmic-art | github:anthropics/skills | https://raw.githubusercontent.com/anthropics/skills/main/skills/algorithmic-art/SKILL.md |
|
|
116
|
+
| mcp-builder | github:anthropics/skills | https://raw.githubusercontent.com/anthropics/skills/main/skills/mcp-builder/SKILL.md |
|
|
117
|
+
| ...
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
์ ๊ท ์ต์
:
|
|
121
|
+
- `--preset <name>` โ ๋ด์ฅ catalog (vercel, anthropic)
|
|
122
|
+
- `--all-presets` โ ๋ชจ๋ preset ๋์ ํ์
|
|
123
|
+
- `--github owner/repo[#branch][:path]` โ ์ง์ GitHub repo ์ง์
|
|
124
|
+
|
|
125
|
+
#### 4. `leerness skill auto-install` โ ์ ๊ท ๋ช
๋ น (์ฌ์ฉ์ ๋ช
์ ํต์ฌ)
|
|
126
|
+
```bash
|
|
127
|
+
$ leerness skill auto-install --query "mcp"
|
|
128
|
+
# leerness skill auto-install (1.9.182)
|
|
129
|
+
presets: vercel, anthropic
|
|
130
|
+
query: mcp
|
|
131
|
+
mode: ๐ก dry-run (LEERNESS_SKILL_AUTO_INSTALL=1 ๋๋ --yes ํ์)
|
|
132
|
+
fetching anthropics/skills...
|
|
133
|
+
โ anthropics/skills: 17๊ฐ skill
|
|
134
|
+
๋งค์นญ 1/17๊ฑด (query: mcp)
|
|
135
|
+
| mcp-builder | github:anthropics/skills | https://raw.githubusercontent.com/anthropics/skills/main/skills/mcp-builder/SKILL.md |
|
|
136
|
+
|
|
137
|
+
๐ก ์๋ install ํ์ฑํ: .env ์ LEERNESS_SKILL_AUTO_INSTALL=1 ๋๋ leerness skill auto-install --yes
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
- handoff ์ปจํ
์คํธ์์ ์๋ query ์ถ์ถ (์งํ task ํค์๋)
|
|
141
|
+
- LEERNESS_SKILL_AUTO_INSTALL=1 ์ ์ค์ ๋ค์ด๋ก๋ (๋ณด์ opt-in)
|
|
142
|
+
- ๋ฏธ์ค์ ์ dry-run (์ถ์ฒ๋ง)
|
|
143
|
+
|
|
144
|
+
#### 5. .env.example ๋ณด๊ฐ
|
|
145
|
+
```
|
|
146
|
+
LEERNESS_SKILL_AUTO_INSTALL=0
|
|
147
|
+
LEERNESS_SKILL_AUTO_PRESETS=vercel,anthropic
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### ์ค ๊ฒ์ฆ (live GitHub API)
|
|
151
|
+
- **anthropics/skills 17๊ฐ skill ์๋ ๋ฐ๊ฒฌ**:
|
|
152
|
+
algorithmic-art, brand-guidelines, canvas-design, claude-api, doc-coauthoring, **docx**, frontend-design, internal-comms, **mcp-builder**, **pdf**, **pptx**, skill-creator, slack-gif-creator, theme-factory, web-artifacts-builder, **webapp-testing**, **xlsx**
|
|
153
|
+
- **mcp-builder ์ค ๋ค์ด๋ก๋ + ์ค์น ์ฑ๊ณต**:
|
|
154
|
+
`leerness-stress/.harness/skills/mcp-builder/SKILL.md` ๋ค์ด๋ก๋ ๊ฒ์ฆ
|
|
155
|
+
description: "Guide for creating high-quality MCP (Model Context Protocol) servers..."
|
|
156
|
+
|
|
157
|
+
### ๋ฐฉํฅ์ฑ ํ๊ฐ ๋ณด๊ณ ์ (์ฌ์ฉ์ ๋ช
์)
|
|
158
|
+
์ฌ์ฉ์ ์์ฒญ: *"์ง๊ธ ์ค๊ณํ๋ ๋ฐฉํฅ์ด ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ธ์ง ํ๋จ๋ ๋๊ฐ ํด์ค"*. ๋ณด๊ณ ์: `_reports/direction-1.9.182.md` (๋น๊ณต๊ฐ).
|
|
159
|
+
|
|
160
|
+
**๊ฒฐ๋ก **:
|
|
161
|
+
| ํ๊ฐ ํญ๋ชฉ | ์ ์ |
|
|
162
|
+
|---|---|
|
|
163
|
+
| ์์จ์ฑ (auto loop ยท review ยท install) | 8.5/10 |
|
|
164
|
+
| ์ฑ์ฅ์ฑ (learn ยท suggest ยท skill catalog) | 8/10 |
|
|
165
|
+
| ์์ ์ฑ (sandbox ยท permissions ยท env opt-in) | 9/10 |
|
|
166
|
+
| ๋ฒ์ฉ์ฑ (multi-provider ยท MCP ยท bridges) | 8/10 |
|
|
167
|
+
| ๊ฒ์ฆ ๊ฐ๋ฅ์ฑ (verify-claim ยท stress ยท e2e) | 9.5/10 |
|
|
168
|
+
|
|
169
|
+
**์ข
ํฉ**: 86/100. **์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ**. ์ฝ์ ์ *์คํฌ ์ ์ฉ ํ ํ๊ณ ๋ถ์ฌ + ์ธ๋ถ ์คํฌ ์ ๋ขฐ์ฑ ๊ฒ์ฆ* โ 1.9.183~190 ๋ง์ผ์คํค.
|
|
170
|
+
|
|
171
|
+
### Verified
|
|
172
|
+
- stress-v127: **16/16** (preset 4 + .env ๋ผ์ฐํ
2 + ์ค GitHub fetch 3 + VERSION+๋์ ํ๊ท 7)
|
|
173
|
+
- e2e 217/217 baseline ์ ์ง
|
|
174
|
+
- VERSION = 1.9.182 ยท autonomous-rounds = 112 ยท main ์๋ push 43 ๋ผ์ด๋ ์ฐ์
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
3
178
|
## 1.9.181 โ 2026-05-21
|
|
4
179
|
|
|
5
180
|
**๐ช REPL ์ง์
ํ๋ฆ ์ ๋ฆฌ โ ์ฌ์ฉ์ ๋ช
์ 4์ข
+ ์ง์ ๊ตฌ๋ ์ค ํธ์ถ ๊ฒ์ฆ.**
|
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) []() []() []() []() []() []() []() []() []() []() []() []()
|
|
6
6
|
|
|
7
7
|
```
|
|
8
8
|
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
@@ -12,9 +12,9 @@
|
|
|
12
12
|
โ โโโ โโโโโโ โโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโ โ
|
|
13
13
|
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโ โโโโโโโโโโโโโโโโโโโโโโ โ
|
|
14
14
|
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโ โโโโโโโโโโโโโโโโโโโโโ โ
|
|
15
|
-
โ v1.9.
|
|
15
|
+
โ v1.9.183 AI Agent Reliability Harness + Sandbox โ
|
|
16
16
|
โ verify ยท remember ยท orchestrate ยท audit ยท sandbox ยท drift โ
|
|
17
|
-
โ
|
|
17
|
+
โ ๐ ๊ณต์ catalog ์๋ ํ์ ยท ์๊ฐ ์ฑ์ฅํ ยท ๊ตฌ๋ฒ์ ๊ฐ์ง/์๋ด โ
|
|
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.183';
|
|
11
11
|
const MARK = '<!-- leerness:managed -->';
|
|
12
12
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
13
13
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -872,7 +872,11 @@ async function install(root, opts = {}) {
|
|
|
872
872
|
'# ์์ URL: https://agentskills.io/llms.txt',
|
|
873
873
|
'LEERNESS_SKILL_DISCOVER_URL=',
|
|
874
874
|
'# (์ ํ) ์ฌ์ฉ์ ์์ฒญ ๋ถ์ ์ ์๋ ๋งค์นญ ์คํฌ ์ถ์ฒ. 1=ํ์ฑ, 0/๋ฏธ์ค์ =๋นํ์ฑ.',
|
|
875
|
-
'LEERNESS_SKILL_AUTO_DISCOVER=0'
|
|
875
|
+
'LEERNESS_SKILL_AUTO_DISCOVER=0',
|
|
876
|
+
'# 1.9.182 โ handoff ์ ๊ณต์ catalog (vercel-labs, anthropics) ์๋ ํ์ + ๋งค์นญ ์ ์๋ install. 1=ํ์ฑ (opt-in ๋ณด์).',
|
|
877
|
+
'LEERNESS_SKILL_AUTO_INSTALL=0',
|
|
878
|
+
'# 1.9.182 โ handoff ์๋ ํ์ ๋์ preset (์ฝค๋ง ๊ตฌ๋ถ). ์: vercel,anthropic',
|
|
879
|
+
'LEERNESS_SKILL_AUTO_PRESETS=vercel,anthropic'
|
|
876
880
|
];
|
|
877
881
|
mergeLinesFile(path.join(root, '.env.example'), envLines);
|
|
878
882
|
// 1.9.153: .env ์ง์ ์์ฑ/๋ง์ด๊ทธ๋ ์ด์
(์ฌ์ฉ์ ๋ช
์ ์์ฒญ). ๋ณด์ = ๋น ๊ฐ๋ง โ ์ฌ์ฉ์๊ฐ ์ง์ ํ ํฐ ์ฑ์.
|
|
@@ -1322,15 +1326,135 @@ function _parseSkillCatalog(body, sourceUrl) {
|
|
|
1322
1326
|
return entries;
|
|
1323
1327
|
}
|
|
1324
1328
|
|
|
1325
|
-
//
|
|
1329
|
+
// 1.9.182: ๊ณต์ ์กฐ์ง ์คํฌ catalog presets โ ์ฌ์ฉ์ ๋ช
์ (vercel-labs, anthropics ๊ฐ์ 1st-party ์๋ ํ์).
|
|
1330
|
+
// ๊ฐ entry: GitHub repo์ skills/ ๋๋ ํ ๋ฆฌ์ SKILL.md ๋ค์ด ์๋ ํ์ค ๊ตฌ์กฐ.
|
|
1331
|
+
// sync: leerness skill discover --preset <name> ยท --all-presets ยท --github <owner/repo>[#branch]
|
|
1332
|
+
const SKILL_CATALOG_PRESETS = {
|
|
1333
|
+
'vercel': { owner: 'vercel-labs', repo: 'agent-skills', branch: 'main', path: 'skills',
|
|
1334
|
+
homepage: 'https://github.com/vercel-labs/agent-skills' },
|
|
1335
|
+
'anthropic': { owner: 'anthropics', repo: 'skills', branch: 'main', path: 'skills',
|
|
1336
|
+
homepage: 'https://github.com/anthropics/skills' }
|
|
1337
|
+
};
|
|
1338
|
+
|
|
1339
|
+
// 1.9.182: GitHub repo ์ skills/ ๋๋ ํ ๋ฆฌ ์๋ ํ์.
|
|
1340
|
+
// GitHub Contents API (no auth 60req/hr, .env GITHUB_TOKEN ์ 5000req/hr) ์ฌ์ฉ.
|
|
1341
|
+
// ์๋ต์ ํ์ค entry ํ์์ผ๋ก ๋ณํ: { name, url, description, format: 'github', source }
|
|
1342
|
+
async function _fetchGitHubSkills(owner, repo, branch, dirPath) {
|
|
1343
|
+
branch = branch || 'main'; dirPath = dirPath || 'skills';
|
|
1344
|
+
const apiUrl = `https://api.github.com/repos/${owner}/${repo}/contents/${dirPath}?ref=${branch}`;
|
|
1345
|
+
const token = process.env.LEERNESS_GITHUB_TOKEN || process.env.GITHUB_TOKEN || '';
|
|
1346
|
+
const headers = token ? { Authorization: `Bearer ${token}` } : {};
|
|
1347
|
+
// _httpFetch ๊ฐ headers๋ฅผ ์ง์ํ์ง ์์ผ๋ฉด raw https ์ฌ์ฉ
|
|
1348
|
+
let body, status;
|
|
1349
|
+
try {
|
|
1350
|
+
const https = require('https');
|
|
1351
|
+
const u = new URL(apiUrl);
|
|
1352
|
+
body = await new Promise((resolve, reject) => {
|
|
1353
|
+
const req = https.get({
|
|
1354
|
+
hostname: u.hostname, path: u.pathname + u.search,
|
|
1355
|
+
headers: { 'User-Agent': `leerness/${VERSION}`, ...headers }
|
|
1356
|
+
}, res => {
|
|
1357
|
+
status = res.statusCode;
|
|
1358
|
+
const chunks = [];
|
|
1359
|
+
res.on('data', c => chunks.push(c));
|
|
1360
|
+
res.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
|
|
1361
|
+
});
|
|
1362
|
+
req.on('error', reject);
|
|
1363
|
+
req.setTimeout(10000, () => { req.destroy(new Error('timeout')); });
|
|
1364
|
+
});
|
|
1365
|
+
} catch (e) { return { ok: false, error: e.message, skills: [] }; }
|
|
1366
|
+
if (status !== 200) return { ok: false, error: `HTTP ${status}`, skills: [] };
|
|
1367
|
+
let items; try { items = JSON.parse(body); } catch { return { ok: false, error: 'invalid JSON', skills: [] }; }
|
|
1368
|
+
if (!Array.isArray(items)) return { ok: false, error: 'not array', skills: [] };
|
|
1369
|
+
const skills = items
|
|
1370
|
+
.filter(i => i && i.type === 'dir')
|
|
1371
|
+
.map(i => ({
|
|
1372
|
+
name: i.name,
|
|
1373
|
+
url: `https://raw.githubusercontent.com/${owner}/${repo}/${branch}/${i.path}/SKILL.md`,
|
|
1374
|
+
description: '',
|
|
1375
|
+
format: 'github',
|
|
1376
|
+
source: `github:${owner}/${repo}`,
|
|
1377
|
+
homepage: i.html_url
|
|
1378
|
+
}));
|
|
1379
|
+
return { ok: true, skills };
|
|
1380
|
+
}
|
|
1381
|
+
|
|
1382
|
+
// skill discover โ agentskills.io / GitHub repo / ๊ณต์ preset ์นดํ๋ก๊ทธ ์ธ๋ฑ์ค์์ ๋งค์นญ ์ถ์ฒ
|
|
1326
1383
|
async function skillDiscoverCmd(root) {
|
|
1327
|
-
|
|
1384
|
+
// 1.9.182: --preset / --all-presets / --github ์ถ๊ฐ (์ฌ์ฉ์ ๋ช
์ โ vercel-labs/agent-skills, anthropics/skills ๋ฑ)
|
|
1385
|
+
const preset = arg('--preset', null);
|
|
1386
|
+
const allPresets = has('--all-presets');
|
|
1387
|
+
const github = arg('--github', null); // ์: vercel-labs/agent-skills ๋๋ owner/repo#branch:path
|
|
1328
1388
|
const query = arg('--query', null);
|
|
1389
|
+
|
|
1390
|
+
// preset / --all-presets / --github ์ฒ๋ฆฌ โ ๋จ์ผ source URL๊ณผ ๋ณ๊ฐ ํ๋ฆ
|
|
1391
|
+
if (preset || allPresets || github) {
|
|
1392
|
+
const targets = [];
|
|
1393
|
+
if (allPresets) for (const k of Object.keys(SKILL_CATALOG_PRESETS)) targets.push({ key: k, ...SKILL_CATALOG_PRESETS[k] });
|
|
1394
|
+
else if (preset) {
|
|
1395
|
+
const p = SKILL_CATALOG_PRESETS[preset];
|
|
1396
|
+
if (!p) { fail(`์ ์ ์๋ preset: ${preset} (์ฌ์ฉ ๊ฐ๋ฅ: ${Object.keys(SKILL_CATALOG_PRESETS).join(', ')})`); return process.exit(1); }
|
|
1397
|
+
targets.push({ key: preset, ...p });
|
|
1398
|
+
}
|
|
1399
|
+
if (github) {
|
|
1400
|
+
// owner/repo ๋๋ owner/repo#branch ๋๋ owner/repo#branch:path
|
|
1401
|
+
const m = github.match(/^([^/]+)\/([^#:]+)(?:#([^:]+))?(?::(.+))?$/);
|
|
1402
|
+
if (!m) { fail(`--github ํ์ ์ค๋ฅ (์: vercel-labs/agent-skills ๋๋ owner/repo#main:skills)`); return process.exit(1); }
|
|
1403
|
+
targets.push({ key: 'custom', owner: m[1], repo: m[2], branch: m[3] || 'main', path: m[4] || 'skills', homepage: `https://github.com/${m[1]}/${m[2]}` });
|
|
1404
|
+
}
|
|
1405
|
+
log(`# leerness skill discover (1.9.182 โ GitHub presets)`);
|
|
1406
|
+
if (query) log(`query: ${query}`);
|
|
1407
|
+
log(`targets: ${targets.map(t => `${t.owner}/${t.repo}#${t.branch}:${t.path}`).join(', ')}`);
|
|
1408
|
+
log('');
|
|
1409
|
+
const allEntries = [];
|
|
1410
|
+
for (const t of targets) {
|
|
1411
|
+
log(` fetching ${t.owner}/${t.repo}...`);
|
|
1412
|
+
const r = await _fetchGitHubSkills(t.owner, t.repo, t.branch, t.path);
|
|
1413
|
+
if (!r.ok) {
|
|
1414
|
+
log(` โ ${t.owner}/${t.repo}: ${r.error}`);
|
|
1415
|
+
continue;
|
|
1416
|
+
}
|
|
1417
|
+
log(` โ ${t.owner}/${t.repo}: ${r.skills.length}๊ฐ skill ๋ฐ๊ฒฌ`);
|
|
1418
|
+
for (const s of r.skills) allEntries.push(s);
|
|
1419
|
+
}
|
|
1420
|
+
log('');
|
|
1421
|
+
if (has('--json')) { log(JSON.stringify({ presets: targets.map(t => t.key), query, entries: allEntries }, null, 2)); return; }
|
|
1422
|
+
if (!allEntries.length) {
|
|
1423
|
+
log(' (์คํฌ 0๊ฑด โ preset/path/branch ํ์ธ ๋๋ rate limit ๊ฐ๋ฅ)');
|
|
1424
|
+
return;
|
|
1425
|
+
}
|
|
1426
|
+
let matched = allEntries;
|
|
1427
|
+
if (query) {
|
|
1428
|
+
const q = query.toLowerCase();
|
|
1429
|
+
matched = allEntries.filter(e => e.name.toLowerCase().includes(q) || (e.description || '').toLowerCase().includes(q));
|
|
1430
|
+
log(`๋งค์นญ ${matched.length}/${allEntries.length}๊ฑด (query: ${query})`);
|
|
1431
|
+
} else {
|
|
1432
|
+
log(`์ ์ฒด ${allEntries.length}๊ฑด (์ ์ฒด ํ์ โ ๋งค์นญ ์์)`);
|
|
1433
|
+
}
|
|
1434
|
+
log('');
|
|
1435
|
+
log('| name | source | url |');
|
|
1436
|
+
log('|---|---|---|');
|
|
1437
|
+
for (const e of matched.slice(0, 40)) {
|
|
1438
|
+
log(`| ${e.name} | ${e.source} | ${e.url} |`);
|
|
1439
|
+
}
|
|
1440
|
+
log('');
|
|
1441
|
+
log(`๐ก ์ค์น: leerness skill install <url> ยท ์๋ install (env opt-in): LEERNESS_SKILL_AUTO_INSTALL=1`);
|
|
1442
|
+
return;
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
// ๊ธฐ์กด ๋จ์ผ URL ํ๋ฆ (1.9.42)
|
|
1446
|
+
const url = arg('--source', null) || process.env.LEERNESS_SKILL_DISCOVER_URL || null;
|
|
1329
1447
|
if (!url) {
|
|
1330
1448
|
fail([
|
|
1331
1449
|
'LEERNESS_SKILL_DISCOVER_URL ํ๊ฒฝ๋ณ์ ๋๋ --source URL ํ์.',
|
|
1450
|
+
'',
|
|
1451
|
+
'๋๋ (1.9.182 ์ ๊ท) โ ๊ณต์ ์กฐ์ง catalog presets:',
|
|
1452
|
+
' leerness skill discover --preset vercel # vercel-labs/agent-skills',
|
|
1453
|
+
' leerness skill discover --preset anthropic # anthropics/skills',
|
|
1454
|
+
' leerness skill discover --all-presets # ๋ชจ๋ preset ๋์ ํ์',
|
|
1455
|
+
' leerness skill discover --github owner/repo # ์ง์ GitHub repo ์ง์ ',
|
|
1456
|
+
'',
|
|
1332
1457
|
'์: leerness skill discover --source https://agentskills.io/llms.txt',
|
|
1333
|
-
'๋๋ .env์ LEERNESS_SKILL_DISCOVER_URL=...',
|
|
1334
1458
|
'',
|
|
1335
1459
|
'(์ ์ฑ
: leerness๋ ์ฌ์ฉ์ ๋์ ์์ด ์ธ๋ถ URL์ fetchํ์ง ์์ โ 1.9.42 opt-in)'
|
|
1336
1460
|
].join('\n'));
|
|
@@ -1372,6 +1496,78 @@ async function skillDiscoverCmd(root) {
|
|
|
1372
1496
|
log(`๐ก ์ค์น: leerness skill install <url>`);
|
|
1373
1497
|
}
|
|
1374
1498
|
|
|
1499
|
+
// 1.9.182: skill auto-install โ ๊ณต์ organization catalog ์๋ ํ์ โ skill match โ ์๋ install.
|
|
1500
|
+
// ์ฌ์ฉ์ ๋ช
์: "์คํฌ์ ์ฌ์ฉํ๊ฑฐ๋ ์ ์ฉํด๋๋ฉด ์ข์ ๋ถ๋ถ๋ค์ ์์์ ์น์์ ๊ณต์ ์กฐ์ง์ ์คํฌ ๋ชจ์์ ํ์ํด์ ๋ค์ด๋ก๋ ๋ฐ์์ ์ฌ์ฉ"
|
|
1501
|
+
// ์ ์ฑ
: LEERNESS_SKILL_AUTO_INSTALL=1 ์ผ ๋๋ง ์ค์ install (๋ณด์ opt-in). ๋ฏธ์ค์ ์ dry-run (์ถ์ฒ๋ง).
|
|
1502
|
+
async function skillAutoInstallCmd(root) {
|
|
1503
|
+
root = absRoot(root);
|
|
1504
|
+
const presets = (process.env.LEERNESS_SKILL_AUTO_PRESETS || arg('--presets', 'vercel,anthropic') || '').split(',').map(s => s.trim()).filter(Boolean);
|
|
1505
|
+
const autoInstall = process.env.LEERNESS_SKILL_AUTO_INSTALL === '1' || has('--yes');
|
|
1506
|
+
const query = arg('--query', null) || _autoInstallQueryFromHandoff(root);
|
|
1507
|
+
const maxInstall = Number(arg('--max', '3'));
|
|
1508
|
+
log(`# leerness skill auto-install (1.9.182)`);
|
|
1509
|
+
log(`presets: ${presets.join(', ') || '(none)'}`);
|
|
1510
|
+
log(`query: ${query || '(auto โ handoff ์ปจํ
์คํธ)'}`);
|
|
1511
|
+
log(`mode: ${autoInstall ? '๐ข ์๋ install' : '๐ก dry-run (LEERNESS_SKILL_AUTO_INSTALL=1 ๋๋ --yes ํ์)'}`);
|
|
1512
|
+
log('');
|
|
1513
|
+
const allEntries = [];
|
|
1514
|
+
for (const key of presets) {
|
|
1515
|
+
const p = SKILL_CATALOG_PRESETS[key];
|
|
1516
|
+
if (!p) { log(` โ ์ ์ ์๋ preset: ${key}`); continue; }
|
|
1517
|
+
log(` fetching ${p.owner}/${p.repo}...`);
|
|
1518
|
+
const r = await _fetchGitHubSkills(p.owner, p.repo, p.branch, p.path);
|
|
1519
|
+
if (!r.ok) { log(` โ ${p.owner}/${p.repo}: ${r.error}`); continue; }
|
|
1520
|
+
log(` โ ${p.owner}/${p.repo}: ${r.skills.length}๊ฐ skill`);
|
|
1521
|
+
for (const s of r.skills) allEntries.push(s);
|
|
1522
|
+
}
|
|
1523
|
+
log('');
|
|
1524
|
+
// query ๋งค์นญ (substring) โ query ์์ผ๋ฉด ๋ชจ๋ ํญ๋ชฉ
|
|
1525
|
+
let matched = allEntries;
|
|
1526
|
+
if (query) {
|
|
1527
|
+
const q = String(query).toLowerCase();
|
|
1528
|
+
matched = allEntries.filter(e => e.name.toLowerCase().includes(q) || (e.description || '').toLowerCase().includes(q));
|
|
1529
|
+
log(`๋งค์นญ ${matched.length}/${allEntries.length}๊ฑด (query: ${query})`);
|
|
1530
|
+
} else {
|
|
1531
|
+
log(`์ ์ฒด ${allEntries.length}๊ฑด (๋ชจ๋ ํญ๋ชฉ)`);
|
|
1532
|
+
}
|
|
1533
|
+
if (!matched.length) { log(' (๋งค์นญ 0๊ฑด โ query ๋ณ๊ฒฝ ๋๋ --presets ์ถ๊ฐ)'); return; }
|
|
1534
|
+
log('');
|
|
1535
|
+
log('| name | source | url |');
|
|
1536
|
+
log('|---|---|---|');
|
|
1537
|
+
for (const e of matched.slice(0, maxInstall)) {
|
|
1538
|
+
log(`| ${e.name} | ${e.source} | ${e.url} |`);
|
|
1539
|
+
}
|
|
1540
|
+
log('');
|
|
1541
|
+
if (!autoInstall) {
|
|
1542
|
+
log(`๐ก ์๋ install ํ์ฑํ: .env ์ LEERNESS_SKILL_AUTO_INSTALL=1 ๋๋ \`leerness skill auto-install --yes\``);
|
|
1543
|
+
log(` ํ์ฌ ${Math.min(maxInstall, matched.length)}๊ฑด์ด install ๋์ (์ค์ ๋ค์ด๋ก๋ X โ dry-run)`);
|
|
1544
|
+
return;
|
|
1545
|
+
}
|
|
1546
|
+
log(`๐ฅ ์๋ install ์์ โ ์ต๋ ${maxInstall}๊ฑด`);
|
|
1547
|
+
let installed = 0, failed = 0;
|
|
1548
|
+
for (const e of matched.slice(0, maxInstall)) {
|
|
1549
|
+
try {
|
|
1550
|
+
await skillInstallCmd(root, e.url);
|
|
1551
|
+
installed++;
|
|
1552
|
+
} catch (err) {
|
|
1553
|
+
log(` โ ${e.name} install ์คํจ: ${err.message}`);
|
|
1554
|
+
failed++;
|
|
1555
|
+
}
|
|
1556
|
+
}
|
|
1557
|
+
log('');
|
|
1558
|
+
log(`โ auto-install ์๋ฃ: ${installed}๊ฑด ์ค์น / ${failed}๊ฑด ์คํจ / ${matched.length - installed - failed}๊ฑด skip`);
|
|
1559
|
+
}
|
|
1560
|
+
|
|
1561
|
+
// 1.9.182: handoff ์ปจํ
์คํธ (ํ์ฌ in-progress task) ์์ ์๋ query ์ถ์ถ
|
|
1562
|
+
function _autoInstallQueryFromHandoff(root) {
|
|
1563
|
+
try {
|
|
1564
|
+
const rows = readProgressRows(root);
|
|
1565
|
+
const active = rows.find(r => r.status === '[์งํ]' || r.status === '[in-progress]' || r.status === 'in_progress');
|
|
1566
|
+
if (active) return (active.request || '').split(/\s+/).slice(0, 3).join(' ');
|
|
1567
|
+
} catch {}
|
|
1568
|
+
return null;
|
|
1569
|
+
}
|
|
1570
|
+
|
|
1375
1571
|
// skill export <id> โ ๊ธฐ์กด ์์ฒด skill์ agentskills.io ํ์ค SKILL.md๋ก export
|
|
1376
1572
|
function skillExportCmd(root, id) {
|
|
1377
1573
|
if (!id) { fail('์ฌ์ฉ๋ฒ: leerness skill export <id>'); return process.exit(1); }
|
|
@@ -4906,9 +5102,10 @@ async function _warnIfStale(root, opts = {}) {
|
|
|
4906
5102
|
log(C.d(' npm registry latest: ') + C.b(`v${latest}`));
|
|
4907
5103
|
log(C.d(' ์ด CLI๊ฐ ์คํํ ๋ฒ์ : ') + C.b(`v${VERSION}`) + C.d(' (npx ์บ์ ๋๋ ๊ธ๋ก๋ฒ ์ค์น stale)'));
|
|
4908
5104
|
log('');
|
|
4909
|
-
log(C.d(' ํด๊ฒฐ โ
|
|
5105
|
+
log(C.d(' ํด๊ฒฐ โ ์
์ค ํ๋ ์คํ ํ ๋ค์ ์๋:'));
|
|
5106
|
+
log(' ' + C.b('npm i leerness@latest') + C.d(' # ํ๋ก์ ํธ ๋ก์ปฌ ์ค์น (1.9.183 ๊ถ์ฅ)'));
|
|
5107
|
+
log(' ' + C.b('npm i -g leerness@latest') + C.d(' # ๊ธ๋ก๋ฒ ์ค์น'));
|
|
4910
5108
|
log(' ' + C.b('npx --yes clear-npx-cache && npx leerness@latest init .'));
|
|
4911
|
-
log(' ' + C.b('npm i -g leerness@latest โ leerness init .'));
|
|
4912
5109
|
log('');
|
|
4913
5110
|
log(C.d(' (์ด ๊ฒฝ๊ณ ๋ LEERNESS_NO_STALE_CHECK=1 ๋๋ --no-stale-check๋ก ๋ ์ ์์ต๋๋ค)'));
|
|
4914
5111
|
log('');
|
|
@@ -13426,6 +13623,22 @@ async function main() {
|
|
|
13426
13623
|
if (exists(path.join(root, '.harness'))) _bumpUsage(root, cmd);
|
|
13427
13624
|
} catch {}
|
|
13428
13625
|
}
|
|
13626
|
+
// 1.9.183 (์ฌ์ฉ์ ๋ช
์): ๋ชจ๋ ๋ช
๋ น ์์ ์์ ๊ตฌ๋ฒ์ ๊ฐ์ง + ๊ฒฝ๊ณ + ์
๋ฐ์ดํธ ๋ช
๋ น์ด ์๋ด.
|
|
13627
|
+
// init/migrate ๋ ์ด๋ฏธ _warnIfStale ํธ์ถํ๋ฏ๋ก ์ ์ธ. mcp/version/help ๋ฑ ์ถ๋ ฅ ๋ฏผ๊ฐ ๋ช
๋ น๋ ์ ์ธ.
|
|
13628
|
+
// 24h ์บ์ (.harness/cache/update-check.json) ํ์ฉ โ ๋คํธ์ํฌ ๋น์ฐจ๋จ.
|
|
13629
|
+
const _staleSkip = new Set(['init', 'migrate', 'usage', 'mcp', 'release', 'session-close', '--version', '--help', 'help', 'update', 'whats-new']);
|
|
13630
|
+
if (!_staleSkip.has(cmd) && process.env.LEERNESS_NO_STALE_CHECK !== '1' && !has('--no-stale-check')) {
|
|
13631
|
+
try {
|
|
13632
|
+
const root = absRoot(arg('--path', args[1] && !args[1].startsWith('-') ? args[1] : process.cwd()));
|
|
13633
|
+
// ์บ์ fresh ์์๋ง ์ฆ์ ๋น๊ต (๋คํธ์ํฌ ํธ์ถ X โ ๋น์ฐจ๋จ). offline + cache ์์ผ๋ฉด skip.
|
|
13634
|
+
const cached = readUpdateCache(root);
|
|
13635
|
+
if (cacheFresh(cached, 24) && cached.nextLeerness && compareVer(cached.nextLeerness, VERSION) > 0) {
|
|
13636
|
+
const isTty = process.stdout && process.stdout.isTTY;
|
|
13637
|
+
const C = isTty ? { y: s => `\x1b[33m${s}\x1b[0m`, b: s => `\x1b[1m${s}\x1b[0m`, d: s => `\x1b[2m${s}\x1b[0m` } : { y: s => s, b: s => s, d: s => s };
|
|
13638
|
+
process.stderr.write(C.y(' โ ') + C.b(`leerness v${VERSION} โ v${cached.nextLeerness} ์ฌ์ฉ ๊ฐ๋ฅ`) + C.d(` ยท ${C.b('npm i leerness@latest')} ๊ถ์ฅ (LEERNESS_NO_STALE_CHECK=1 ๋ก ๋๊ธฐ)`) + '\n');
|
|
13639
|
+
}
|
|
13640
|
+
} catch {}
|
|
13641
|
+
}
|
|
13429
13642
|
if (cmd === 'init') return await install(args[1] || process.cwd(), { force:false, dry:false, migration:false });
|
|
13430
13643
|
// 1.9.64: install <skill-id-or-url> ๋ณ์นญ (= skill install). ์์ฃผ ์ฐ๋ ๋ช
๋ น ๋จ์ถํ.
|
|
13431
13644
|
// ๋จ, init์ด leerness install . ๊ฐ์ ํํ๋ก๋ ๋์ํ๋ ์ ํธํ์ ์ ์ง โ args[1]์ด ๋๋ ํ ๋ฆฌ๋ฉด init์ผ๋ก ๋ผ์ฐํ
.
|
|
@@ -13540,6 +13753,8 @@ async function main() {
|
|
|
13540
13753
|
if (cmd === 'benchmark') return benchmarkCmd(absRoot(args[1] || arg('--path', process.cwd())));
|
|
13541
13754
|
if (cmd === 'skill' && args[1] === 'publish') return skillPublishCmd(absRoot(arg('--path', process.cwd())));
|
|
13542
13755
|
if (cmd === 'skill' && args[1] === 'suggest') return skillSuggestCmd(absRoot(arg('--path', process.cwd())));
|
|
13756
|
+
// 1.9.182: leerness skill auto-install โ ๊ณต์ catalog ์๋ ํ์ + skill match ๋งค์นญ ์ ์๋ install (์ฌ์ฉ์ ๋ช
์)
|
|
13757
|
+
if (cmd === 'skill' && args[1] === 'auto-install') return await skillAutoInstallCmd(absRoot(arg('--path', process.cwd())));
|
|
13543
13758
|
if (cmd === 'mcp' && args[1] === 'serve') return mcpServeCmd(absRoot(arg('--path', process.cwd())));
|
|
13544
13759
|
if (cmd === 'gate') return gate(args[1] || process.cwd());
|
|
13545
13760
|
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.183",
|
|
4
4
|
"description": "Leerness: ๋นํ๊ดด ๋ง์ด๊ทธ๋ ์ด์
, ์๋ ๋ฒ์ ๊ฐ์งยท์
๋ฐ์ดํธ, ๊ณํ/์งํ/ํธ๋์คํ ์๋ํ, ๊ฒ์ผ๋ฆยท์ํฌ๋ฆฟยท์ธ์ฝ๋ฉ ์๋ ๊ฐ๋, Claude Code ์ฌ๋์ ํตํฉ์ ๊ฐ์ถ ํ๊ตญ์ด ์ฐ์ AI ๊ฐ๋ฐ ํ๋ค์ค.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|