leerness 1.9.174 β†’ 1.9.175

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,66 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.9.175 β€” 2026-05-21
4
+
5
+ **πŸŒ‰ REPL Bridge Slash 3μ’… β€” `:web` / `:pc` / `:lsp` μ¦‰μ‹œ 호좜.**
6
+
7
+ 자율 λͺ¨λ“œ 105 λΌμš΄λ“œ. 1.9.165~167 Bridge 3쒅이 1.9.168 MCP둜 μ™ΈλΆ€ AI 직접 호좜 κ°€λŠ₯. **1.9.175: REPL μ•ˆμ—μ„œλ„ 직접 호좜 κ°€λŠ₯** β€” μ‚¬μš©μž + AI κ°€ 같은 REPL μ„Έμ…˜μ—μ„œ μ½”λ“œ 뢄석/μ›Ή/PC μžλ™ν™” μ¦‰μ‹œ μ‚¬μš©.
8
+
9
+ ### μ‚¬μš© μ˜ˆμ‹œ
10
+ ```
11
+ agent[claude/actor/β–Ά]> :lsp symbols src/api.ts
12
+ β†’ leerness lsp symbols src/api.ts
13
+ # leerness lsp symbols (1.9.173 λ‹€κ΅­μ–΄)
14
+ file: src/api.ts Β· lang: javascript
15
+ mode: typescript-compiler Β· 24 symbols Β· 12ms
16
+ 3:function parseRequest
17
+ 8:class User
18
+ ...
19
+ βœ“ :lsp symbols μ™„λ£Œ (132ms)
20
+
21
+ agent[claude/actor/β–Ά]> :web screenshot https://example.com --out shot.png
22
+ β†’ leerness web screenshot https://example.com --out shot.png
23
+ βœ“ screenshot saved: shot.png Β· 1842ms
24
+ βœ“ :web screenshot μ™„λ£Œ (2014ms)
25
+
26
+ agent[claude/actor/β–Ά]> :pc click 800 400
27
+ ⚠ :pc click 은 permissions=full ν•„μš” (ν˜„μž¬: basic)
28
+ :permissions full 둜 μ¦‰μ‹œ λ³€κ²½ κ°€λŠ₯ (1.9.174)
29
+
30
+ agent[claude/actor/β–Ά]> :permissions full
31
+ βœ“ κΆŒν•œ λͺ¨λ“œ λ³€κ²½: full
32
+ agent[claude/actor/β–Ά]> :pc click 800 400
33
+ βœ“ click (800, 400) β€” 23ms
34
+ βœ“ :pc click μ™„λ£Œ (35ms)
35
+ ```
36
+
37
+ ### 톡합 흐름 β€” μ‚¬μš©μž λͺ…μ‹œ 4 λΌμš΄λ“œ λˆ„μ 
38
+ | λΌμš΄λ“œ | κ°•ν™” |
39
+ |---|---|
40
+ | 1.9.170 | Tab/Shift+Tab cycle + μ‹€μ‹œκ°„ 슀트리밍 |
41
+ | 1.9.172 | 슀트리밍 spinner + tool_use + diff 색깔 |
42
+ | 1.9.174 | install κΆŒν•œ prompt 제거 + REPL `:permissions` λ³€κ²½ |
43
+ | **1.9.175** | **REPL `:web` / `:pc` / `:lsp` slash 3μ’… μ¦‰μ‹œ 호좜** |
44
+
45
+ β†’ **REPL μ•ˆμ—μ„œ leerness 의 λͺ¨λ“  capability μ‚¬μš© κ°€λŠ₯** (AI λŒ€ν™” + μ½”λ“œ 뢄석 + μ›Ή + PC + κΆŒν•œ λ³€κ²½, ν•œ μ„Έμ…˜).
46
+
47
+ ### μœ„ν—˜ sub 사전 κΆŒν•œ 검사
48
+ `:pc click/type/screenshot` μ‹œ `permissions !== 'full'` 이면 μ¦‰μ‹œ κ²½κ³  + λ³€κ²½ μ•ˆλ‚΄ (1.9.174 `:permissions full` 연동).
49
+
50
+ ### κ΅¬ν˜„
51
+ - `op === 'web' || op === 'pc' || op === 'lsp'` ν•Έλ“€λŸ¬ μΆ”κ°€ (Memory slash λΆ„κΈ° 직전)
52
+ - `subParts = rest.length ? rest : ['check']` (인자 μ—†μœΌλ©΄ check κΈ°λ³Έ)
53
+ - `runCommandSafe(process.execPath, [__filename, ...cliArgs, '--path', root], ...)` 톡합 호좜
54
+ - observability: `kind: 'agent_repl_slash'`, `label: 'repl-<op>'`
55
+ - stdout 50쀄 κΉŒμ§€ ν‘œμ‹œ (Memory slash 30쀄보닀 ν™•μž₯ β€” symbol/diff 좜λ ₯ μš©λ„)
56
+
57
+ ### Verified
58
+ - e2e 217/217 baseline μœ μ§€
59
+ - stress-v120: **17/17** (slash ν•Έλ“€λŸ¬ 4 + :pc κΆŒν•œ 사전 검사 2 + :help/ν™˜μ˜ 5 + λˆ„μ  νšŒκ·€ 6)
60
+ - VERSION = 1.9.175 / autonomous-rounds = 105 / main μžλ™ push 36 λΌμš΄λ“œ 연속
61
+
62
+ ---
63
+
3
64
  ## 1.9.174 β€” 2026-05-21
4
65
 
5
66
  **πŸ” μ‚¬μš©μž λͺ…μ‹œ β€” install κΆŒν•œ prompt 제거 + REPL `:permissions` μ¦‰μ‹œ λ³€κ²½.**
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.174-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v119-20%2F20-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-53-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-104-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-35_rounds-success)]() [![repl-perm](https://img.shields.io/badge/REPL_:permissions-μ¦‰μ‹œ_λ³€κ²½_κ°€λŠ₯-success)]() [![lsp-multi](https://img.shields.io/badge/LSP_λ‹€κ΅­μ–΄-JS%2FPython%2FGo%2FRust%2FJava-success)]() [![mcp-bridge](https://img.shields.io/badge/MCP_bridge-web%2Fpc%2Flsp_λ…ΈμΆœ-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.175-green)]() [![tests](https://img.shields.io/badge/e2e-217%2F217-success)]() [![stress](https://img.shields.io/badge/stress--v120-17%2F17-success)]() [![mcp](https://img.shields.io/badge/MCP--tools-53-brightgreen)]() [![rounds](https://img.shields.io/badge/autonomous--rounds-105-blueviolet)]() [![main-push](https://img.shields.io/badge/release--main--push-36_rounds-success)]() [![repl-slash](https://img.shields.io/badge/REPL_slash-:web%2F:pc%2F:lsp_μ¦‰μ‹œ_호좜-success)]() [![repl-perm](https://img.shields.io/badge/REPL_:permissions-μ¦‰μ‹œ_λ³€κ²½-success)]() [![lsp-multi](https://img.shields.io/badge/LSP_λ‹€κ΅­μ–΄-JS%2FPython%2FGo%2FRust%2FJava-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.174 AI Agent Reliability Harness + Sandbox β•‘
15
+ β•‘ v1.9.175 AI Agent Reliability Harness + Sandbox β•‘
16
16
  β•‘ verify Β· remember Β· orchestrate Β· audit Β· sandbox Β· drift β•‘
17
- β•‘ πŸ” install κΆŒν•œ prompt 제거 Β· REPL :permissions μ¦‰μ‹œ λ³€κ²½ β•‘
17
+ β•‘ πŸŒ‰ REPL :web/:pc/:lsp slash β€” Bridge 3μ’… μ¦‰μ‹œ 호좜 β•‘
18
18
  β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•
19
19
  ```
20
20
 
package/bin/harness.js CHANGED
@@ -6,7 +6,7 @@ const path = require('path');
6
6
  const cp = require('child_process');
7
7
  const readline = require('readline');
8
8
 
9
- const VERSION = '1.9.174';
9
+ const VERSION = '1.9.175';
10
10
  const MARK = '<!-- leerness:managed -->';
11
11
  const README_START = '<!-- leerness:project-readme:start -->';
12
12
  const README_END = '<!-- leerness:project-readme:end -->';
@@ -11006,6 +11006,7 @@ async function _agentRepl(root, opts) {
11006
11006
  log(C.dim(' Memory Slash (1.9.161): :lessons | :brainstorm <topic> | :tasks | :plan'));
11007
11007
  log(C.dim(' πŸ†• 1.9.170 β€” Tab=provider cycle, Shift+Tab=model cycle, :stream on|off (μ‹€μ‹œκ°„ 좜λ ₯)'));
11008
11008
  log(C.dim(' πŸ†• 1.9.174 β€” :permissions [basic|extended|full] 둜 μ¦‰μ‹œ κΆŒν•œ λ³€κ²½ (default: basic μ•ˆμ „)'));
11009
+ log(C.dim(' πŸ†• 1.9.175 β€” :web / :pc / :lsp 으둜 Bridge 3μ’… REPL μ•ˆμ—μ„œ μ¦‰μ‹œ 호좜 (μ½”λ“œ 뢄석/μ›Ή/PC)'));
11009
11010
  log(C.dim(` ν˜„μž¬ β€” provider=${state.provider} model=${state.model || '(κΈ°λ³Έ)'} role=${state.role} permissions=${_readPermissions(root).mode}`));
11010
11011
  // 1.9.155: REPL μ§„μž… μ‹œ handoff μ»¨ν…μŠ€νŠΈ μžλ™ λ…ΈμΆœ (UX κ°œμ„  β€” μ‚¬μš©μžκ°€ 맀번 :handoff μ•ˆ 해도 μ»¨ν…μŠ€νŠΈ 인지)
11011
11012
  try {
@@ -11126,6 +11127,17 @@ async function _agentRepl(root, opts) {
11126
11127
  log(' :brainstorm <topic> β€” leerness brainstorm "topic" (κ΄€λ ¨ μ»¨ν…μŠ€νŠΈ 회수)');
11127
11128
  log(' :tasks β€” leerness task list (ν˜„μž¬ task μƒνƒœ)');
11128
11129
  log(' :plan β€” leerness plan show (ν˜„μž¬ milestone)');
11130
+ log(C.bold('\n πŸ†• Bridge Slash (1.9.175) β€” REPL μ•ˆμ—μ„œ μ¦‰μ‹œ Bridge 호좜:'));
11131
+ log(' :web check β€” playwright μ„€μΉ˜ 확인 (opt-in)');
11132
+ log(' :web screenshot <url> [--out f.png] β€” URL β†’ PNG');
11133
+ log(' :web extract <url> --selector "css" β€” DOM ν…μŠ€νŠΈ μΆ”μΆœ');
11134
+ log(' :pc check β€” robotjs/nut-tree μ„€μΉ˜ 확인 (⚠ full κΆŒν•œ)');
11135
+ log(' :pc click <x> <y> β€” μ’Œν‘œ 클릭');
11136
+ log(' :pc type "<text>" β€” ν‚€λ³΄λ“œ μž…λ ₯');
11137
+ log(' :pc screenshot --out shot.png β€” PC ν™”λ©΄ 캑처');
11138
+ log(' :lsp check β€” typescript μ„€μΉ˜ + λ‹€κ΅­μ–΄ fallback');
11139
+ log(' :lsp symbols <file> β€” 심볼 μΆ”μΆœ (JS/TS/Py/Go/Rust/Java)');
11140
+ log(' :lsp references <name> [--in <dir>] β€” 심볼 μ°Έμ‘° 검색');
11129
11141
  return false;
11130
11142
  }
11131
11143
  if (op === 'model') {
@@ -11272,6 +11284,39 @@ async function _agentRepl(root, opts) {
11272
11284
  log('');
11273
11285
  return false;
11274
11286
  }
11287
+ // 1.9.175: Bridge 3μ’… slash β€” :web / :pc / :lsp (REPL μ•ˆμ—μ„œ μ¦‰μ‹œ Bridge 호좜)
11288
+ // μ‚¬μš© 예:
11289
+ // :web check β€” playwright μ„€μΉ˜ 확인
11290
+ // :web screenshot https://example.com β€” URL β†’ PNG
11291
+ // :pc check β€” robotjs μ„€μΉ˜ 확인
11292
+ // :pc click 800 400 β€” μ’Œν‘œ 클릭 (full κΆŒν•œ ν•„μš”)
11293
+ // :lsp symbols src/api.ts β€” 파일 심볼 μΆ”μΆœ
11294
+ // :lsp references myFunc --in src β€” 심볼 μ°Έμ‘° 검색
11295
+ if (op === 'web' || op === 'pc' || op === 'lsp') {
11296
+ const subParts = rest.length ? rest : ['check']; // 인자 μ—†μœΌλ©΄ check κΈ°λ³Έ
11297
+ const cliArgs = [op, ...subParts];
11298
+ // permissions 사전 μ•ˆλ‚΄ (full λͺ¨λ“œ ν•„μš”ν•œ sub 만)
11299
+ if (op === 'pc' && ['click', 'type', 'screenshot'].includes(subParts[0])) {
11300
+ const p = _readPermissions(root);
11301
+ if (p.mode !== 'full') {
11302
+ log(C.yel(` ⚠ :pc ${subParts[0]} 은 permissions=full ν•„μš” (ν˜„μž¬: ${p.mode})`));
11303
+ log(C.dim(` :permissions full 둜 μ¦‰μ‹œ λ³€κ²½ κ°€λŠ₯ (1.9.174)`));
11304
+ return false;
11305
+ }
11306
+ }
11307
+ log(C.dim(` β†’ leerness ${cliArgs.join(' ')}`));
11308
+ const t0 = Date.now();
11309
+ const r = runCommandSafe(process.execPath, [__filename, ...cliArgs, '--path', root], {
11310
+ cwd: root, root, timeout: 60000, kind: 'agent_repl_slash', label: `repl-${op}`,
11311
+ env: { LEERNESS_NO_BANNER: '1', LEERNESS_NO_PROMPT: '1', LEERNESS_NO_DRIFT_CHECK: '1' }
11312
+ });
11313
+ const dt = Date.now() - t0;
11314
+ if (r.stdout) log(r.stdout.trim().split('\n').slice(0, 50).join('\n'));
11315
+ if (r.status === 0) log(C.green(` βœ“ :${op} ${subParts[0] || ''} μ™„λ£Œ (${dt}ms)`));
11316
+ else log(C.yel(` ⚠ :${op} μ‹€νŒ¨ (exit ${r.status}, ${dt}ms)`));
11317
+ return false;
11318
+ }
11319
+
11275
11320
  // 1.9.150: leerness λ‚΄λΆ€ λͺ…λ Ή slash-commands β€” :verify / :audit / :handoff / :health
11276
11321
  // 1.9.161: Memory Surface 쑰회 slash μΆ”κ°€ β€” :lessons / :brainstorm / :tasks / :plan
11277
11322
  if (op === 'verify' || op === 'audit' || op === 'handoff' || op === 'health'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "leerness",
3
- "version": "1.9.174",
3
+ "version": "1.9.175",
4
4
  "description": "Leerness: λΉ„νŒŒκ΄΄ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜, μžλ™ 버전 κ°μ§€Β·μ—…λ°μ΄νŠΈ, κ³„νš/μ§„ν–‰/ν•Έλ“œμ˜€ν”„ μžλ™ν™”, κ²ŒμœΌλ¦„Β·μ‹œν¬λ¦ΏΒ·μΈμ½”λ”© μžλ™ κ°€λ“œ, Claude Code μŠ¬λž˜μ‹œ 톡합을 κ°–μΆ˜ ν•œκ΅­μ–΄ μš°μ„  AI 개발 ν•˜λ„€μŠ€.",
5
5
  "keywords": [
6
6
  "leerness",