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 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
- [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.177-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v122-18%2F18-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-54-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-107-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-38_rounds-success)]() [![auto-review](https://img.shields.io/badge/task_add-์ž๋™_review_trigger-success)]() [![review-request](https://img.shields.io/badge/review--request-์‚ฌ์ „_๊ฒ€ํ† _9_์‹ ํ˜ธ-success)]() [![repl-slash](https://img.shields.io/badge/REPL_slash-:web%2F:pc%2F:lsp%2F:review-success)]() [![capability](https://img.shields.io/badge/6_capability-72%25_production--ready-brightgreen)]() [![sandbox](https://img.shields.io/badge/runCommandSafe-cwd_jail%2Benv_scrub-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
5
+ [![npm](https://img.shields.io/badge/npm-leerness-blue)](https://www.npmjs.com/package/leerness) [![version](https://img.shields.io/badge/version-1.9.179-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v124-19%2F19-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-54-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-109-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-40_rounds-success)]() [![repl-design](https://img.shields.io/badge/REPL_ํ™˜์˜-Hermes%2FClaude%2FCodex_์Šคํƒ€์ผ-success)]() [![npm-auto](https://img.shields.io/badge/npm_auto--publish-NPM__TOKEN_ํ†ตํ•ฉ-success)]() [![auto-review](https://img.shields.io/badge/task_add-์ž๋™_review_trigger-success)]() [![capability](https://img.shields.io/badge/6_capability-72%25_production--ready-brightgreen)]() [![sandbox](https://img.shields.io/badge/runCommandSafe-cwd_jail%2Benv_scrub-success)]() [![license](https://img.shields.io/badge/license-MIT-lightgrey)]()
6
6
 
7
7
  ```
8
8
  โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—
@@ -12,9 +12,9 @@
12
12
  โ•‘ โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•”โ•โ•โ• โ–ˆโ–ˆโ•”โ•โ•โ• โ–ˆโ–ˆโ•”โ•โ•โ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ•šโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•”โ•โ•โ• โ•šโ•โ•โ•โ•โ–ˆโ–ˆโ•‘ โ•‘
13
13
  โ•‘ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ•‘ โ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ•‘ โ•šโ–ˆโ–ˆโ–ˆโ–ˆโ•‘โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•—โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ•‘ โ•‘
14
14
  โ•‘ โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ• โ•šโ•โ•โ•šโ•โ• โ•šโ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ•โ•šโ•โ•โ•โ•โ•โ•โ• โ•‘
15
- โ•‘ v1.9.177 AI Agent Reliability Harness + Sandbox โ•‘
15
+ โ•‘ v1.9.179 AI Agent Reliability Harness + Sandbox โ•‘
16
16
  โ•‘ verify ยท remember ยท orchestrate ยท audit ยท sandbox ยท drift โ•‘
17
- โ•‘ ๐Ÿ” task add ์ž๋™ review trigger โ€” default ์‚ฌ์ „ ๊ฒ€ํ†  โ•‘
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.177';
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.bold(C.cy(' โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—')));
10997
- log(C.bold(C.cy(' โ•‘ leerness agent โ€” REPL mode โ•‘')));
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
- log(C.dim(' ๋ฉ”ํƒ€ ๋ช…๋ น: :help | :model <m> | :role <r> | :provider <p> | :status | :clear | :save | :history | :quit'));
11046
- log(C.dim(' Slash ๋ช…๋ น (1.9.150): :verify | :audit | :handoff | :health'));
11047
- log(C.dim(' Memory Slash (1.9.161): :lessons | :brainstorm <topic> | :tasks | :plan'));
11048
- log(C.dim(' ๐Ÿ†• 1.9.170 โ€” Tab=provider cycle, Shift+Tab=model cycle, :stream on|off (์‹ค์‹œ๊ฐ„ ์ถœ๋ ฅ)'));
11049
- log(C.dim(' ๐Ÿ†• 1.9.174 โ€” :permissions [basic|extended|full] ๋กœ ์ฆ‰์‹œ ๊ถŒํ•œ ๋ณ€๊ฒฝ (default: basic ์•ˆ์ „)'));
11050
- log(C.dim(' ๐Ÿ†• 1.9.175 โ€” :web / :pc / :lsp ์œผ๋กœ Bridge 3์ข… REPL ์•ˆ์—์„œ ์ฆ‰์‹œ ํ˜ธ์ถœ (์ฝ”๋“œ ๋ถ„์„/์›น/PC)'));
11051
- log(C.dim(' ๐Ÿ†• 1.9.176 โ€” :review "<์š”์ฒญ>" ์œผ๋กœ ์‚ฌ์šฉ์ž ์š”์ฒญ ์‚ฌ์ „ ๊ฒ€ํ†  (์ถฉ๋Œ/์žฌ์‚ฌ์šฉ/ํšจ์œจ/๊ถŒ์žฅ ๋‹จ๊ณ„)'));
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.177",
3
+ "version": "1.9.179",
4
4
  "description": "Leerness: ๋น„ํŒŒ๊ดด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ์ž๋™ ๋ฒ„์ „ ๊ฐ์ง€ยท์—…๋ฐ์ดํŠธ, ๊ณ„ํš/์ง„ํ–‰/ํ•ธ๋“œ์˜คํ”„ ์ž๋™ํ™”, ๊ฒŒ์œผ๋ฆ„ยท์‹œํฌ๋ฆฟยท์ธ์ฝ”๋”ฉ ์ž๋™ ๊ฐ€๋“œ, Claude Code ์Šฌ๋ž˜์‹œ ํ†ตํ•ฉ์„ ๊ฐ–์ถ˜ ํ•œ๊ตญ์–ด ์šฐ์„  AI ๊ฐœ๋ฐœ ํ•˜๋„ค์Šค.",
5
5
  "keywords": [
6
6
  "leerness",