leerness 1.9.178 โ†’ 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,72 @@
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
+
3
70
  ## 1.9.178 โ€” 2026-05-21
4
71
 
5
72
  **๐Ÿ“ฆ ์‚ฌ์šฉ์ž ๋ช…์‹œ: `release sync-main` ์ž๋™ npm publish โ€” .env NPM_TOKEN ์‚ฌ์šฉ.**
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.178-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v123-22%2F22-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-54-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-108-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-39_rounds-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)]() [![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.178 AI Agent Reliability Harness + Sandbox โ•‘
15
+ โ•‘ v1.9.179 AI Agent Reliability Harness + Sandbox โ•‘
16
16
  โ•‘ verify ยท remember ยท orchestrate ยท audit ยท sandbox ยท drift โ•‘
17
- โ•‘ ๐Ÿ“ฆ release sync-main ์ž๋™ npm publish (NPM_TOKEN .env ํ†ตํ•ฉ) โ•‘
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.178';
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 -->';
@@ -7822,8 +7823,18 @@ function releaseSyncMainCmd(root) {
7822
7823
  // - ์ด๋ฏธ publish๋œ ๋ฒ„์ „ ์ž๋™ detect โ†’ skip (์ค‘๋ณต publish ์ฐจ๋‹จ)
7823
7824
  function _publishToNpm(root, opts = {}) {
7824
7825
  root = absRoot(root || process.cwd());
7825
- // .env ์ž๋™ ๋กœ๋“œ (์‚ฌ์šฉ์ž ๋ช…์‹œ ํŒจํ„ด โ€” 1.9.153)
7826
- try { _loadEnvFile(root); } catch {}
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
+ }
7827
7838
  const token = process.env.LEERNESS_NPM_TOKEN || process.env.NPM_TOKEN;
7828
7839
  if (!token) {
7829
7840
  log(` โš  npm ์ž๋™ ๋ฐฐํฌ ์Šคํ‚ต: NPM_TOKEN ๋ฏธ์„ค์ • (.env ์— NPM_TOKEN=npm_xxxxx ์ถ”๊ฐ€)`);
@@ -7865,8 +7876,11 @@ function _publishToNpm(root, opts = {}) {
7865
7876
  const tmpNpmrc = path.join(tmpDir, '.npmrc');
7866
7877
  fs.writeFileSync(tmpNpmrc, `//registry.npmjs.org/:_authToken=${token}\n`, { mode: 0o600 });
7867
7878
  // 3) npm publish (--userconfig ๋กœ ์ž„์‹œ .npmrc ์‚ฌ์šฉ, --access public)
7868
- const args = opts.dryRun ? ['publish', '--userconfig', tmpNpmrc, '--access', 'public', '--dry-run'] :
7869
- ['publish', '--userconfig', tmpNpmrc, '--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;
7870
7884
  log(` ${opts.dryRun ? '(dry-run) ' : ''}npm publish ์‹œ๋„ ์ค‘...`);
7871
7885
  const pubR = cp.spawnSync('npm', args, {
7872
7886
  cwd: root, encoding: 'utf8', shell: true, timeout: 60000,
@@ -7879,6 +7893,12 @@ function _publishToNpm(root, opts = {}) {
7879
7893
  const errOut = (pubR.stderr || pubR.stdout || '').slice(-400);
7880
7894
  if (/EPUBLISHCONFLICT|already exists|cannot publish over/i.test(errOut)) {
7881
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 ์„ ์ƒˆ ํ† ํฐ์œผ๋กœ ๊ต์ฒด`);
7882
7902
  } else if (/EAUTH|forbidden|401|403/i.test(errOut)) {
7883
7903
  warn(`npm publish ์‹คํŒจ: ํ† ํฐ ๊ถŒํ•œ ๋ถ€์กฑ ๋˜๋Š” ๋งŒ๋ฃŒ โ€” .env NPM_TOKEN ์žฌ๋ฐœ๊ธ‰ ํ•„์š”`);
7884
7904
  } else if (/ENEEDAUTH/i.test(errOut)) {
@@ -11079,12 +11099,17 @@ async function _agentRepl(root, opts) {
11079
11099
  writeUtf8(sessionPath(), lines + '\n');
11080
11100
  } catch {}
11081
11101
  };
11082
- // ํ™˜์˜ ๋ฉ”์‹œ์ง€ + ๋ชจ๋ธ ์„ ํƒ
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(' โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ')));
11083
11110
  log('');
11084
- log(C.bold(C.cy(' โ•”โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•—')));
11085
- log(C.bold(C.cy(' โ•‘ leerness agent โ€” REPL mode โ•‘')));
11086
- log(C.bold(C.cy(' โ•‘ ๊ฒ€์ˆ˜ยท๊ธฐ์–ตยท์ƒŒ๋“œ๋ฐ•์Šค ํ†ตํ•ฉ ์ž์œจ AI ์—์ด์ „ํŠธ โ•‘')));
11087
- log(C.bold(C.cy(' โ•šโ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•')));
11111
+ log(C.dim(` โ–ธ Welcome back ยท ${wsName} (${rel(process.cwd(), absRoot(root))})`));
11112
+ log(C.dim(` โ–ธ Session: ${state.sessionId}`));
11088
11113
  log('');
11089
11114
  // Ollama ๋ชจ๋ธ ์ž๋™ ๊ฐ์ง€ โ€” model์ด ๋ช…์‹œ๋˜์ง€ ์•Š์•˜์œผ๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ์„ ํƒ์ง€ ์ œ๊ณต
11090
11115
  if (state.provider === 'ollama' && !state.model) {
@@ -11129,15 +11154,39 @@ async function _agentRepl(root, opts) {
11129
11154
  }
11130
11155
  }
11131
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'));
11132
11182
  log('');
11133
- log(C.dim(' ๋ฉ”ํƒ€ ๋ช…๋ น: :help | :model <m> | :role <r> | :provider <p> | :status | :clear | :save | :history | :quit'));
11134
- log(C.dim(' Slash ๋ช…๋ น (1.9.150): :verify | :audit | :handoff | :health'));
11135
- log(C.dim(' Memory Slash (1.9.161): :lessons | :brainstorm <topic> | :tasks | :plan'));
11136
- log(C.dim(' ๐Ÿ†• 1.9.170 โ€” Tab=provider cycle, Shift+Tab=model cycle, :stream on|off (์‹ค์‹œ๊ฐ„ ์ถœ๋ ฅ)'));
11137
- log(C.dim(' ๐Ÿ†• 1.9.174 โ€” :permissions [basic|extended|full] ๋กœ ์ฆ‰์‹œ ๊ถŒํ•œ ๋ณ€๊ฒฝ (default: basic ์•ˆ์ „)'));
11138
- log(C.dim(' ๐Ÿ†• 1.9.175 โ€” :web / :pc / :lsp ์œผ๋กœ Bridge 3์ข… REPL ์•ˆ์—์„œ ์ฆ‰์‹œ ํ˜ธ์ถœ (์ฝ”๋“œ ๋ถ„์„/์›น/PC)'));
11139
- log(C.dim(' ๐Ÿ†• 1.9.176 โ€” :review "<์š”์ฒญ>" ์œผ๋กœ ์‚ฌ์šฉ์ž ์š”์ฒญ ์‚ฌ์ „ ๊ฒ€ํ†  (์ถฉ๋Œ/์žฌ์‚ฌ์šฉ/ํšจ์œจ/๊ถŒ์žฅ ๋‹จ๊ณ„)'));
11140
- 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')));
11141
11190
  // 1.9.155: REPL ์ง„์ž… ์‹œ handoff ์ปจํ…์ŠคํŠธ ์ž๋™ ๋…ธ์ถœ (UX ๊ฐœ์„  โ€” ์‚ฌ์šฉ์ž๊ฐ€ ๋งค๋ฒˆ :handoff ์•ˆ ํ•ด๋„ ์ปจํ…์ŠคํŠธ ์ธ์ง€)
11142
11191
  try {
11143
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.178",
3
+ "version": "1.9.179",
4
4
  "description": "Leerness: ๋น„ํŒŒ๊ดด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, ์ž๋™ ๋ฒ„์ „ ๊ฐ์ง€ยท์—…๋ฐ์ดํŠธ, ๊ณ„ํš/์ง„ํ–‰/ํ•ธ๋“œ์˜คํ”„ ์ž๋™ํ™”, ๊ฒŒ์œผ๋ฆ„ยท์‹œํฌ๋ฆฟยท์ธ์ฝ”๋”ฉ ์ž๋™ ๊ฐ€๋“œ, Claude Code ์Šฌ๋ž˜์‹œ ํ†ตํ•ฉ์„ ๊ฐ–์ถ˜ ํ•œ๊ตญ์–ด ์šฐ์„  AI ๊ฐœ๋ฐœ ํ•˜๋„ค์Šค.",
5
5
  "keywords": [
6
6
  "leerness",