leerness 1.9.177 โ 1.9.179
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 +119 -0
- package/README.md +3 -3
- package/bin/harness.js +151 -14
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,124 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.9.179 โ 2026-05-21
|
|
4
|
+
|
|
5
|
+
**๐จ REPL ํ์ ํ๋ฉด ์ฌ๋์์ธ โ Hermes/Claude/Codex/Gemini CLI ์คํ์ผ (์ฌ์ฉ์ ๋ช
์).**
|
|
6
|
+
|
|
7
|
+
์์จ ๋ชจ๋ 109 ๋ผ์ด๋. ์ฌ์ฉ์ ๋ช
์: ์ฒจ๋ถ ์ด๋ฏธ์ง (Hermes Agent v0.7.0 / Claude Code v2.1.126 / OpenAI Codex v0.132.0 / Gemini CLI v0.42.0) ์ฒ๋ผ ๊ตฌ์กฐํ๋ ํ์ ํ๋ฉด.
|
|
8
|
+
|
|
9
|
+
### ๋์์ธ ๊ตฌ์ฑ โ 5 ์น์
|
|
10
|
+
```
|
|
11
|
+
โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ
|
|
12
|
+
โ Leerness Agent v1.9.179 (2026-05-21) ยท ๊ฒ์ยท๊ธฐ์ตยท์๋๋ฐ์ค ํตํฉ AI โ
|
|
13
|
+
โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ
|
|
14
|
+
|
|
15
|
+
โธ Welcome back ยท leerness (.)
|
|
16
|
+
โธ Session: sess-2026-05-21T13-41-23
|
|
17
|
+
|
|
18
|
+
โโ Tips for getting started โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
19
|
+
โ Tab / Shift+Tab โ provider / model ์ ํ (1.9.170) โ
|
|
20
|
+
โ :review "<req>" โ ๋ฌด์กฐ๊ฑด ๊ตฌํ ์ ์ฌ์ ๊ฒํ (1.9.176) โ
|
|
21
|
+
โ :permissions <m> โ ์ฆ์ ๊ถํ ๋ณ๊ฒฝ basic|extended|full (1.9.174) โ
|
|
22
|
+
โ :stream on|off โ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ํ ๊ธ (default ON, 1.9.170/172) โ
|
|
23
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
24
|
+
|
|
25
|
+
โโ What's new (1.9.170~178) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
26
|
+
โ โข REPL Tab cycle + ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ (spinner / tool_use / diff ์๊น) โ
|
|
27
|
+
โ โข Bridge slash :web/:pc/:lsp REPL ์ฆ์ ํธ์ถ + LSP ๋ค๊ตญ์ด 5์ข
โ
|
|
28
|
+
โ โข review-request ์ฌ์ ๊ฒํ + task add ์๋ trigger โ
|
|
29
|
+
โ โข release sync-main ์๋ npm publish (.env NPM_TOKEN) โ
|
|
30
|
+
โ โข 6 ๋ฅ๋ ฅ ๋งคํธ๋ฆญ์ค 72% production-ready ยท MCP 54 ๋๊ตฌ โ
|
|
31
|
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
32
|
+
|
|
33
|
+
Available Slash (5 ๊ทธ๋ฃน)
|
|
34
|
+
โข meta: :help :model :role :provider :status :stream :clear :quit
|
|
35
|
+
โข internal: :verify :audit :handoff :health
|
|
36
|
+
โข memory: :lessons :brainstorm :tasks :plan
|
|
37
|
+
โข bridge: :web :pc :lsp (๊ฐ sub: check/symbols/click/screenshot/...)
|
|
38
|
+
โข review: :review "<request>" ยท :permissions [basic|extended|full]
|
|
39
|
+
|
|
40
|
+
โจ Tab=provider cycle ยท Shift+Tab=model ยท Ctrl+C=quit
|
|
41
|
+
|
|
42
|
+
โก provider=ollama ยท model=llama3 ยท role=actor ยท perms=basic ยท โถ stream=on
|
|
43
|
+
|
|
44
|
+
agent[ollama/actor/โถ]> _
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### ๋์์ธ ๊ฒฐ์
|
|
48
|
+
- **๋ฅ๊ทผ ๋ชจ์๋ฆฌ** (`โญ โฐ`) ํค๋ ๋ฐ์ค โ ์น๊ทผํ ์ธ์
|
|
49
|
+
- **์ฌ๊ฐ ๋ชจ์๋ฆฌ** (`โ โ`) Tips/What's new ๋ฐ์ค โ ์ ๋ณด ๋ฐ์ค ๊ตฌ๋ถ
|
|
50
|
+
- **์๊น ํ ํฐ**: cy(ํค๋), yel(Tips), green(What's new), mag(model), bold(์ค์ ๋ผ๋ฒจ)
|
|
51
|
+
- **5 ๊ทธ๋ฃน Slash ์นดํ๋ก๊ทธ**: Hermes-style "Available Tools / Skills" ์๊ฐ
|
|
52
|
+
- **์ํ๋ฐ โก**: provider/model/role/perms/stream 5์์ + ์๊น ๊ตฌ๋ถ
|
|
53
|
+
- **ํค๋ณด๋ ๋จ์ถํค โจ**: Tab/Shift+Tab/Ctrl+C ๋ช
์
|
|
54
|
+
|
|
55
|
+
### ์ฒจ๋ถ ์ด๋ฏธ์ง ์ฐธ๊ณ spirit (์ ํํ ๋ณต์ X)
|
|
56
|
+
| ์ด๋ฏธ์ง | ์ ์ฉ๋ ์์ |
|
|
57
|
+
|---|---|
|
|
58
|
+
| Hermes Agent v0.7.0 | "Available ..." ์นดํ๋ก๊ทธ 5 ๊ทธ๋ฃน |
|
|
59
|
+
| Claude Code v2.1.126 | "Welcome back" + "Tips/What's new" ๋ฐ์ค |
|
|
60
|
+
| OpenAI Codex v0.132.0 | ๋ชจ๋ธ/๋๋ ํ ๋ฆฌ ๋ฐ์ค + Tips |
|
|
61
|
+
| Gemini CLI v0.42.0 | ์ํ๋ฐ (sandbox/model/quota โ provider/model/perms/stream) |
|
|
62
|
+
|
|
63
|
+
### Verified
|
|
64
|
+
- e2e 217/217 baseline ์ ์ง
|
|
65
|
+
- stress-v124: **19/19** (ํค๋ ๋ฐ์ค 4 + Slash 5๊ทธ๋ฃน 3 + ์ํ๋ฐ 3 + 1.9.179 ์ฃผ์ 2 + ๋์ ํ๊ท 7)
|
|
66
|
+
- VERSION = 1.9.179 ยท autonomous-rounds = 109 ยท main ์๋ push 40 ๋ผ์ด๋ ์ฐ์
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 1.9.178 โ 2026-05-21
|
|
71
|
+
|
|
72
|
+
**๐ฆ ์ฌ์ฉ์ ๋ช
์: `release sync-main` ์๋ npm publish โ .env NPM_TOKEN ์ฌ์ฉ.**
|
|
73
|
+
|
|
74
|
+
์์จ ๋ชจ๋ 108 ๋ผ์ด๋. ์ฌ์ฉ์ ๋ช
์: *"NPM ์ก์ธ์ค ํ ํฐ .env์ ์
๋ ฅํด๋์. ์
๋ฐ์ดํธ๋ ๋๋ง๋ค ๊นํ๋ธ์ฒ๋ผ NPM์๋ ์๋ ๋ฐฐํฌ"*.
|
|
75
|
+
|
|
76
|
+
### ํตํฉ ํ๋ฆ
|
|
77
|
+
```bash
|
|
78
|
+
$ leerness release sync-main .
|
|
79
|
+
# leerness release sync-main (1.9.140)
|
|
80
|
+
from: release/1.9.178 โ main
|
|
81
|
+
โ main merged: release/1.9.178
|
|
82
|
+
โ main pushed โ origin/main
|
|
83
|
+
|
|
84
|
+
๐ฆ npm publish ์๋ trigger (1.9.178)
|
|
85
|
+
leerness@1.9.178
|
|
86
|
+
npm publish ์๋ ์ค...
|
|
87
|
+
โ npm publish ์๋ฃ: leerness@1.9.178
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
โ git push ํ NPM ์๋ publish โ git ์ํฌํ๋ก์ NPM ์ํฌํ๋ก ์์ ํตํฉ.
|
|
91
|
+
|
|
92
|
+
### ๋ณด์ ์ค๊ณ (3์ค ์์ ๋ง)
|
|
93
|
+
1. **ํ ํฐ ํ๊ฒฝ๋ณ์๋ง ์ฌ์ฉ**: `process.env.LEERNESS_NPM_TOKEN || process.env.NPM_TOKEN` (๊ฐ ์ ๋ ๋ก๊ทธ X)
|
|
94
|
+
2. **์์ `.npmrc` ๊ฒฉ๋ฆฌ**: `mkdtempSync` โ `.npmrc` (mode 0o600 ์์ ์๋ง ์ฝ๊ธฐ) โ publish โ **finally ์ฆ์ ์ญ์ **
|
|
95
|
+
3. **`.env` ์๋ ๋ณดํธ**: 1.9.75+ audit์ด `.gitignore`์ `.env` ๋ฑ๋ก ๊ฐ์ (์ํฌ๋ฆฟ ๋๋ฝ ๊ฐ์ง)
|
|
96
|
+
|
|
97
|
+
### ์ค๋ณต publish ์ฐจ๋จ
|
|
98
|
+
- `npm view <pkg>@<version> version` ์ฌ์ ํธ์ถ
|
|
99
|
+
- ์ด๋ฏธ publish๋ ๋ฒ์ ์ด๋ฉด skip + ์๋ฆผ (race condition๋ ํ์ ์ฒ๋ฆฌ)
|
|
100
|
+
|
|
101
|
+
### ์น์ ํ ์๋ฌ ์๋ด
|
|
102
|
+
- `EPUBLISHCONFLICT` โ "์ด๋ฏธ publish๋จ โ skip"
|
|
103
|
+
- `EAUTH / 401 / 403` โ "ํ ํฐ ๊ถํ ๋ถ์กฑ ๋๋ ๋ง๋ฃ โ .env NPM_TOKEN ์ฌ๋ฐ๊ธ ํ์"
|
|
104
|
+
- `ENEEDAUTH` โ "์ธ์ฆ ๋ฏธ์๋ โ ํ ํฐ ํ์ ํ์ธ (npm_xxxxx)"
|
|
105
|
+
- ๊ธฐํ โ ๋ง์ง๋ง 3์ค stderr ๋
ธ์ถ
|
|
106
|
+
|
|
107
|
+
### Opt-out (3๊ฐ์ง)
|
|
108
|
+
1. `--no-npm` ํ๋๊ทธ
|
|
109
|
+
2. `LEERNESS_NO_NPM_PUBLISH=1` ํ๊ฒฝ๋ณ์
|
|
110
|
+
3. `--dry-run-npm` ํ๋๊ทธ (dry-run mode)
|
|
111
|
+
|
|
112
|
+
### Observability
|
|
113
|
+
`_recordRun(kind: 'npm_publish')` โ ๋ชจ๋ publish ์๋ (์ฑ๊ณต/์คํจ) ์๋ ๊ธฐ๋ก.
|
|
114
|
+
|
|
115
|
+
### Verified
|
|
116
|
+
- e2e 217/217 baseline ์ ์ง (LEERNESS_NO_NPM_PUBLISH=1 ํ๊ฒฝ)
|
|
117
|
+
- stress-v123: **22/22** (ํจ์ ์ ์ 6 + ์ค๋ณต ์ฐจ๋จ 4 + release ํตํฉ 3 + ์น์ ํ ์๋ด 3 + ๋์ ํ๊ท 6)
|
|
118
|
+
- VERSION = 1.9.178 / autonomous-rounds = 108 / main ์๋ push 39 ๋ผ์ด๋ ์ฐ์ + **NPM ์๋ publish 1 ๋ผ์ด๋ ์์**
|
|
119
|
+
|
|
120
|
+
---
|
|
121
|
+
|
|
3
122
|
## 1.9.177 โ 2026-05-21
|
|
4
123
|
|
|
5
124
|
**๐ `task add` ์๋ review-request trigger โ ์ฌ์ฉ์ ๋ช
์ 1.9.176 ์๋ํ.**
|
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.179 AI Agent Reliability Harness + Sandbox โ
|
|
16
16
|
โ verify ยท remember ยท orchestrate ยท audit ยท sandbox ยท drift โ
|
|
17
|
-
โ
|
|
17
|
+
โ ๐จ REPL ํ์ ํ๋ฉด ์ฌ๋์์ธ (Hermes/Claude/Codex ์คํ์ผ) โ
|
|
18
18
|
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
|
19
19
|
```
|
|
20
20
|
|
package/bin/harness.js
CHANGED
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
const fs = require('fs');
|
|
5
5
|
const path = require('path');
|
|
6
6
|
const cp = require('child_process');
|
|
7
|
+
const os = require('os'); // 1.9.178: _publishToNpm ์์ os.tmpdir() ์ฌ์ฉ (์ ์ญ import)
|
|
7
8
|
const readline = require('readline');
|
|
8
9
|
|
|
9
|
-
const VERSION = '1.9.
|
|
10
|
+
const VERSION = '1.9.179';
|
|
10
11
|
const MARK = '<!-- leerness:managed -->';
|
|
11
12
|
const README_START = '<!-- leerness:project-readme:start -->';
|
|
12
13
|
const README_END = '<!-- leerness:project-readme:end -->';
|
|
@@ -7806,6 +7807,113 @@ function releaseSyncMainCmd(root) {
|
|
|
7806
7807
|
else ok(`main pushed โ ${remoteName}/main`);
|
|
7807
7808
|
// 5) return to source branch (release ์์
ํ๋ฆ ๋ณด์กด)
|
|
7808
7809
|
cp.spawnSync('git', ['checkout', fromBranch], { cwd: root, encoding: 'utf8' });
|
|
7810
|
+
|
|
7811
|
+
// 1.9.178: ์๋ npm publish (์ฌ์ฉ์ ๋ช
์ โ .env NPM_TOKEN ์์ผ๋ฉด ์๋ ๋ฐฐํฌ).
|
|
7812
|
+
// opt-out: --no-npm ๋๋ LEERNESS_NO_NPM_PUBLISH=1
|
|
7813
|
+
// ํ ํฐ ๋ฏธ์ค์ ์ ์น์ ํ ์๋ด ํ skip (์คํจ X).
|
|
7814
|
+
if (!has('--no-npm') && process.env.LEERNESS_NO_NPM_PUBLISH !== '1') {
|
|
7815
|
+
try { _publishToNpm(root, { dryRun: has('--dry-run-npm') }); } catch (e) { warn('npm publish ์๋ ์คํจ (๊ณ์): ' + e.message); }
|
|
7816
|
+
}
|
|
7817
|
+
}
|
|
7818
|
+
|
|
7819
|
+
// 1.9.178: NPM ์๋ ๋ฐฐํฌ (์ฌ์ฉ์ ๋ช
์ โ release sync-main ํ ์๋ trigger).
|
|
7820
|
+
// ๋ณด์:
|
|
7821
|
+
// - NPM_TOKEN ๋๋ LEERNESS_NPM_TOKEN ํ๊ฒฝ๋ณ์์์๋ง ์ฝ์ (๊ฐ ์ ๋ ๋ก๊ทธ X)
|
|
7822
|
+
// - ์์ .npmrc ํ์ผ (mkdtempSync) ์์ฑ โ publish โ ์ฆ์ ์ญ์ (finally)
|
|
7823
|
+
// - ์ด๋ฏธ publish๋ ๋ฒ์ ์๋ detect โ skip (์ค๋ณต publish ์ฐจ๋จ)
|
|
7824
|
+
function _publishToNpm(root, opts = {}) {
|
|
7825
|
+
root = absRoot(root || process.cwd());
|
|
7826
|
+
// .env ์๋ ๋ก๋ โ root + ์์ 3๋จ๊ณ๊น์ง ํ์ (์ํฌ์คํ์ด์ค root ์ .env ๋ ์ธ์).
|
|
7827
|
+
// ์: leerness-pkg/ ์์ sync-main ํธ์ถ ์ ../leerness/.env ๋ ์๋ ํ์.
|
|
7828
|
+
{
|
|
7829
|
+
let dir = root;
|
|
7830
|
+
for (let i = 0; i < 4; i++) {
|
|
7831
|
+
try { _loadEnvFile(dir); } catch {}
|
|
7832
|
+
if (process.env.LEERNESS_NPM_TOKEN || process.env.NPM_TOKEN) break;
|
|
7833
|
+
const parent = path.resolve(dir, '..');
|
|
7834
|
+
if (parent === dir) break; // ๋ฃจํธ ๋๋ฌ
|
|
7835
|
+
dir = parent;
|
|
7836
|
+
}
|
|
7837
|
+
}
|
|
7838
|
+
const token = process.env.LEERNESS_NPM_TOKEN || process.env.NPM_TOKEN;
|
|
7839
|
+
if (!token) {
|
|
7840
|
+
log(` โ npm ์๋ ๋ฐฐํฌ ์คํต: NPM_TOKEN ๋ฏธ์ค์ (.env ์ NPM_TOKEN=npm_xxxxx ์ถ๊ฐ)`);
|
|
7841
|
+
return;
|
|
7842
|
+
}
|
|
7843
|
+
// package.json ํ์ธ
|
|
7844
|
+
const pkgPath = path.join(root, 'package.json');
|
|
7845
|
+
if (!exists(pkgPath)) {
|
|
7846
|
+
log(` โ npm ์๋ ๋ฐฐํฌ ์คํต: package.json ์์ (${rel(root, pkgPath)})`);
|
|
7847
|
+
return;
|
|
7848
|
+
}
|
|
7849
|
+
let pkg;
|
|
7850
|
+
try { pkg = JSON.parse(read(pkgPath)); } catch (e) { warn(`package.json ํ์ฑ ์คํจ: ${e.message}`); return; }
|
|
7851
|
+
if (!pkg.name || !pkg.version) {
|
|
7852
|
+
log(` โ npm ์๋ ๋ฐฐํฌ ์คํต: name/version ๋๋ฝ`);
|
|
7853
|
+
return;
|
|
7854
|
+
}
|
|
7855
|
+
const pkgName = pkg.name;
|
|
7856
|
+
const pkgVersion = pkg.version;
|
|
7857
|
+
log('');
|
|
7858
|
+
log(`๐ฆ npm publish ์๋ trigger (1.9.178)`);
|
|
7859
|
+
log(` ${pkgName}@${pkgVersion}`);
|
|
7860
|
+
|
|
7861
|
+
// 1) ์ด๋ฏธ publish๋ ๋ฒ์ ์ธ์ง ํ์ธ (npm view <pkg>@<version> version)
|
|
7862
|
+
try {
|
|
7863
|
+
const viewR = cp.spawnSync('npm', ['view', `${pkgName}@${pkgVersion}`, 'version'], {
|
|
7864
|
+
cwd: root, encoding: 'utf8', shell: true, timeout: 15000
|
|
7865
|
+
});
|
|
7866
|
+
if (viewR.status === 0 && (viewR.stdout || '').trim() === pkgVersion) {
|
|
7867
|
+
log(` โ ์ด๋ฏธ npm registry์ publish๋จ โ skip`);
|
|
7868
|
+
return;
|
|
7869
|
+
}
|
|
7870
|
+
} catch {} // ๋คํธ์ํฌ ์คํจ ์ ๊ทธ๋ฅ publish ์๋
|
|
7871
|
+
|
|
7872
|
+
// 2) ์์ .npmrc ์์ฑ (ํ ํฐ ๋
ธ์ถ ๋ฐฉ์ง)
|
|
7873
|
+
let tmpDir;
|
|
7874
|
+
try {
|
|
7875
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'leerness-npmrc-'));
|
|
7876
|
+
const tmpNpmrc = path.join(tmpDir, '.npmrc');
|
|
7877
|
+
fs.writeFileSync(tmpNpmrc, `//registry.npmjs.org/:_authToken=${token}\n`, { mode: 0o600 });
|
|
7878
|
+
// 3) npm publish (--userconfig ๋ก ์์ .npmrc ์ฌ์ฉ, --access public)
|
|
7879
|
+
// 1.9.178+: 2FA OTP ์ง์ โ LEERNESS_NPM_OTP ํ๊ฒฝ๋ณ์ ๋๋ --npm-otp ์ธ์
|
|
7880
|
+
const otp = process.env.LEERNESS_NPM_OTP || arg('--npm-otp', null) || opts.otp;
|
|
7881
|
+
const baseArgs = ['publish', '--userconfig', tmpNpmrc, '--access', 'public'];
|
|
7882
|
+
if (otp) baseArgs.push(`--otp=${otp}`);
|
|
7883
|
+
const args = opts.dryRun ? [...baseArgs, '--dry-run'] : baseArgs;
|
|
7884
|
+
log(` ${opts.dryRun ? '(dry-run) ' : ''}npm publish ์๋ ์ค...`);
|
|
7885
|
+
const pubR = cp.spawnSync('npm', args, {
|
|
7886
|
+
cwd: root, encoding: 'utf8', shell: true, timeout: 60000,
|
|
7887
|
+
env: { ...process.env, npm_config_loglevel: 'warn' }
|
|
7888
|
+
});
|
|
7889
|
+
if (pubR.status === 0) {
|
|
7890
|
+
ok(`npm publish ์๋ฃ: ${pkgName}@${pkgVersion}`);
|
|
7891
|
+
try { _recordRun(root, { kind: 'npm_publish', package: pkgName, version: pkgVersion, dryRun: !!opts.dryRun, ok: true }); } catch {}
|
|
7892
|
+
} else {
|
|
7893
|
+
const errOut = (pubR.stderr || pubR.stdout || '').slice(-400);
|
|
7894
|
+
if (/EPUBLISHCONFLICT|already exists|cannot publish over/i.test(errOut)) {
|
|
7895
|
+
log(` โ ์ด๋ฏธ publish๋จ (race condition) โ skip`);
|
|
7896
|
+
} else if (/EOTP|one-time password|--otp=/i.test(errOut)) {
|
|
7897
|
+
// 1.9.178+: 2FA ํ์ฑํ๋ ๊ณ์ โ Automation ํ ํฐ ๋๋ OTP ํ์
|
|
7898
|
+
warn(`npm publish ์คํจ: 2FA OTP ํ์ (NPM ๊ณ์ ์ 2FA ํ์ฑํ๋จ).`);
|
|
7899
|
+
log(` ํด๊ฒฐ 1: LEERNESS_NPM_OTP=<6์๋ฆฌ์ฝ๋> ๋๋ --npm-otp <code> ์ต์
์ฌ์ฉ`);
|
|
7900
|
+
log(` ํด๊ฒฐ 2: Automation ํ ํฐ ๋ฐ๊ธ โ npm token create --read-only=false (2FA bypass)`);
|
|
7901
|
+
log(` ๋ฐ๊ธ ํ .env ์ NPM_TOKEN ์ ์ ํ ํฐ์ผ๋ก ๊ต์ฒด`);
|
|
7902
|
+
} else if (/EAUTH|forbidden|401|403/i.test(errOut)) {
|
|
7903
|
+
warn(`npm publish ์คํจ: ํ ํฐ ๊ถํ ๋ถ์กฑ ๋๋ ๋ง๋ฃ โ .env NPM_TOKEN ์ฌ๋ฐ๊ธ ํ์`);
|
|
7904
|
+
} else if (/ENEEDAUTH/i.test(errOut)) {
|
|
7905
|
+
warn(`npm publish ์คํจ: ์ธ์ฆ ๋ฏธ์๋ โ ํ ํฐ ํ์ ํ์ธ (npm_xxxxx)`);
|
|
7906
|
+
} else {
|
|
7907
|
+
warn(`npm publish ์คํจ (exit ${pubR.status}): ${errOut.split('\n').slice(0, 3).join(' ')}`);
|
|
7908
|
+
}
|
|
7909
|
+
try { _recordRun(root, { kind: 'npm_publish', package: pkgName, version: pkgVersion, ok: false, error: errOut.slice(0, 200) }); } catch {}
|
|
7910
|
+
}
|
|
7911
|
+
} finally {
|
|
7912
|
+
// 4) ์์ .npmrc ์ฆ์ ์ญ์ (ํ ํฐ ์์กด ๋ฐฉ์ง)
|
|
7913
|
+
if (tmpDir) {
|
|
7914
|
+
try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch {}
|
|
7915
|
+
}
|
|
7916
|
+
}
|
|
7809
7917
|
}
|
|
7810
7918
|
|
|
7811
7919
|
// 1.9.40: release pack โ ๊ฐ๋ฒผ์ด ํตํฉ ๋ช
๋ น (npm pack + self-host migrate + auto task + close + readme sync)
|
|
@@ -10991,12 +11099,17 @@ async function _agentRepl(root, opts) {
|
|
|
10991
11099
|
writeUtf8(sessionPath(), lines + '\n');
|
|
10992
11100
|
} catch {}
|
|
10993
11101
|
};
|
|
10994
|
-
// ํ์
|
|
11102
|
+
// 1.9.179: ํ์ ํ๋ฉด ์ฌ๋์์ธ (์ฌ์ฉ์ ๋ช
์ โ Hermes/Claude/Codex/Gemini ์คํ์ผ).
|
|
11103
|
+
// ๊ธฐ์กด ๋จ์ ๋ฐ์ค โ ํค๋ ๋ฐ์ค + Tips / What's new ๋ฐ์ค + Slash ์นดํ๋ก๊ทธ 5 ๊ทธ๋ฃน.
|
|
11104
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
11105
|
+
const wsName = path.basename(absRoot(root));
|
|
11106
|
+
log('');
|
|
11107
|
+
log(C.bold(C.cy(' โญโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฎ')));
|
|
11108
|
+
log(C.bold(C.cy(` โ Leerness Agent v${VERSION} (${today}) ยท ๊ฒ์ยท๊ธฐ์ตยท์๋๋ฐ์ค ํตํฉ AI โ`)));
|
|
11109
|
+
log(C.bold(C.cy(' โฐโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโฏ')));
|
|
10995
11110
|
log('');
|
|
10996
|
-
log(C.
|
|
10997
|
-
log(C.
|
|
10998
|
-
log(C.bold(C.cy(' โ ๊ฒ์ยท๊ธฐ์ตยท์๋๋ฐ์ค ํตํฉ ์์จ AI ์์ด์ ํธ โ')));
|
|
10999
|
-
log(C.bold(C.cy(' โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ')));
|
|
11111
|
+
log(C.dim(` โธ Welcome back ยท ${wsName} (${rel(process.cwd(), absRoot(root))})`));
|
|
11112
|
+
log(C.dim(` โธ Session: ${state.sessionId}`));
|
|
11000
11113
|
log('');
|
|
11001
11114
|
// Ollama ๋ชจ๋ธ ์๋ ๊ฐ์ง โ model์ด ๋ช
์๋์ง ์์์ผ๋ฉด ์ฌ์ฉ์์๊ฒ ์ ํ์ง ์ ๊ณต
|
|
11002
11115
|
if (state.provider === 'ollama' && !state.model) {
|
|
@@ -11041,15 +11154,39 @@ async function _agentRepl(root, opts) {
|
|
|
11041
11154
|
}
|
|
11042
11155
|
}
|
|
11043
11156
|
}
|
|
11157
|
+
// 1.9.179: Tips + What's new ๋ฐ์ค (์ฌ์ฉ์ ๋ช
์ โ ์ฒจ๋ถ ์ด๋ฏธ์ง spirit ๋ฐ์)
|
|
11158
|
+
log('');
|
|
11159
|
+
log(C.bold(C.yel(' โโ Tips for getting started โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ')));
|
|
11160
|
+
log(C.yel(' โ ') + C.dim('Tab / Shift+Tab') + ' ' + C.dim('โ provider / model ์ ํ (1.9.170)') + C.yel(' '.repeat(Math.max(1, 17)) + 'โ'));
|
|
11161
|
+
log(C.yel(' โ ') + C.dim(':review "<req>"') + ' ' + C.dim('โ ๋ฌด์กฐ๊ฑด ๊ตฌํ ์ ์ฌ์ ๊ฒํ (1.9.176)') + C.yel(' '.repeat(Math.max(1, 13)) + 'โ'));
|
|
11162
|
+
log(C.yel(' โ ') + C.dim(':permissions <m>') + ' ' + C.dim('โ ์ฆ์ ๊ถํ ๋ณ๊ฒฝ basic|extended|full (1.9.174)') + C.yel(' โ'));
|
|
11163
|
+
log(C.yel(' โ ') + C.dim(':stream on|off') + ' ' + C.dim('โ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ ํ ๊ธ (default ON, 1.9.170/172)') + C.yel(' โ'));
|
|
11164
|
+
log(C.bold(C.yel(' โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ')));
|
|
11165
|
+
log('');
|
|
11166
|
+
log(C.bold(C.green(' โโ What\'s new (1.9.170~178) โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ')));
|
|
11167
|
+
log(C.green(' โ ') + C.dim('โข REPL Tab cycle + ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐ (spinner / tool_use / diff ์๊น)') + C.green(' โ'));
|
|
11168
|
+
log(C.green(' โ ') + C.dim('โข Bridge slash :web/:pc/:lsp REPL ์ฆ์ ํธ์ถ + LSP ๋ค๊ตญ์ด 5์ข
') + C.green(' โ'));
|
|
11169
|
+
log(C.green(' โ ') + C.dim('โข review-request ์ฌ์ ๊ฒํ + task add ์๋ trigger') + C.green(' โ'));
|
|
11170
|
+
log(C.green(' โ ') + C.dim('โข release sync-main ์๋ npm publish (.env NPM_TOKEN)') + C.green(' โ'));
|
|
11171
|
+
log(C.green(' โ ') + C.dim('โข 6 ๋ฅ๋ ฅ ๋งคํธ๋ฆญ์ค 72% production-ready ยท MCP 54 ๋๊ตฌ') + C.green(' โ'));
|
|
11172
|
+
log(C.bold(C.green(' โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ')));
|
|
11173
|
+
log('');
|
|
11174
|
+
log(C.bold(' Available Slash (5 ๊ทธ๋ฃน)'));
|
|
11175
|
+
log(C.dim(' โข meta: ') + ':help :model :role :provider :status :stream :clear :quit');
|
|
11176
|
+
log(C.dim(' โข internal: ') + ':verify :audit :handoff :health');
|
|
11177
|
+
log(C.dim(' โข memory: ') + ':lessons :brainstorm :tasks :plan');
|
|
11178
|
+
log(C.dim(' โข bridge: ') + ':web :pc :lsp ' + C.dim('(๊ฐ sub: check/symbols/click/screenshot/...)'));
|
|
11179
|
+
log(C.dim(' โข review: ') + ':review "<request>" ยท :permissions [basic|extended|full]');
|
|
11180
|
+
log('');
|
|
11181
|
+
log(C.dim(' โจ Tab=provider cycle ยท Shift+Tab=model ยท Ctrl+C=quit'));
|
|
11044
11182
|
log('');
|
|
11045
|
-
|
|
11046
|
-
|
|
11047
|
-
log(C.
|
|
11048
|
-
|
|
11049
|
-
|
|
11050
|
-
|
|
11051
|
-
|
|
11052
|
-
log(C.dim(` ํ์ฌ โ provider=${state.provider} model=${state.model || '(๊ธฐ๋ณธ)'} role=${state.role} permissions=${_readPermissions(root).mode}`));
|
|
11183
|
+
// 1.9.179: ์ํ๋ฐ ํ ์ค โ ์๊น/๊ตฌ๋ถ์ ๊ฐํ
|
|
11184
|
+
const permMode = _readPermissions(root).mode || 'basic';
|
|
11185
|
+
log(' ' + C.bold('โก ') + C.cy(`provider=${state.provider}`) + ' ยท '
|
|
11186
|
+
+ C.mag(`model=${state.model || '(๊ธฐ๋ณธ)'}`) + ' ยท '
|
|
11187
|
+
+ C.green(`role=${state.role}`) + ' ยท '
|
|
11188
|
+
+ C.yel(`perms=${permMode}`) + ' ยท '
|
|
11189
|
+
+ (state.streamMode ? C.green('โถ stream=on') : C.dim('โก stream=off')));
|
|
11053
11190
|
// 1.9.155: REPL ์ง์
์ handoff ์ปจํ
์คํธ ์๋ ๋
ธ์ถ (UX ๊ฐ์ โ ์ฌ์ฉ์๊ฐ ๋งค๋ฒ :handoff ์ ํด๋ ์ปจํ
์คํธ ์ธ์ง)
|
|
11054
11191
|
try {
|
|
11055
11192
|
const hf = cp.spawnSync(process.execPath, [__filename, 'handoff', root, '--compact', '--no-drift-check', '--no-headline'], {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "leerness",
|
|
3
|
-
"version": "1.9.
|
|
3
|
+
"version": "1.9.179",
|
|
4
4
|
"description": "Leerness: ๋นํ๊ดด ๋ง์ด๊ทธ๋ ์ด์
, ์๋ ๋ฒ์ ๊ฐ์งยท์
๋ฐ์ดํธ, ๊ณํ/์งํ/ํธ๋์คํ ์๋ํ, ๊ฒ์ผ๋ฆยท์ํฌ๋ฆฟยท์ธ์ฝ๋ฉ ์๋ ๊ฐ๋, Claude Code ์ฌ๋์ ํตํฉ์ ๊ฐ์ถ ํ๊ตญ์ด ์ฐ์ AI ๊ฐ๋ฐ ํ๋ค์ค.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"leerness",
|